From 546a52e1078ac272983b18129f5773844f23bd89 Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Wed, 25 Feb 2026 16:27:53 +0100 Subject: [PATCH 001/322] SONARPY-3837 Reorder package root resolution and add src as default package when poetry backend is used (#889) GitOrigin-RevId: c88192e0365cf2d16653419f7d9aa45a3a8a7997 --- .../python/indexer/PackageRootResolver.java | 10 +-- .../indexer/PyProjectTomlSourceRoots.java | 45 ++++++++--- .../indexer/PyProjectTomlSourceRootsTest.java | 76 +++++++++++++++++++ 3 files changed, 116 insertions(+), 15 deletions(-) diff --git a/python-commons/src/main/java/org/sonar/plugins/python/indexer/PackageRootResolver.java b/python-commons/src/main/java/org/sonar/plugins/python/indexer/PackageRootResolver.java index 93cdb45c0..d5d6a2bce 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/indexer/PackageRootResolver.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/indexer/PackageRootResolver.java @@ -70,16 +70,16 @@ public static List resolve(List extractedRoots, Configuration co * @return list of fallback package root absolute paths */ static List resolveFallback(Configuration config, File baseDir) { - String[] sonarSources = config.getStringArray(SONAR_SOURCES_KEY); - if (sonarSources.length > 0) { - return toAbsolutePaths(Arrays.asList(sonarSources), baseDir); - } - List conventionalFolders = findConventionalFolders(baseDir); if (!conventionalFolders.isEmpty()) { return toAbsolutePaths(conventionalFolders, baseDir); } + String[] sonarSources = config.getStringArray(SONAR_SOURCES_KEY); + if (sonarSources.length > 0) { + return toAbsolutePaths(Arrays.asList(sonarSources), baseDir); + } + return List.of(baseDir.getAbsolutePath()); } diff --git a/python-commons/src/main/java/org/sonar/plugins/python/indexer/PyProjectTomlSourceRoots.java b/python-commons/src/main/java/org/sonar/plugins/python/indexer/PyProjectTomlSourceRoots.java index d69298cf2..469b5e8b9 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/indexer/PyProjectTomlSourceRoots.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/indexer/PyProjectTomlSourceRoots.java @@ -39,7 +39,8 @@ *

Supports the following build systems: *

    *
  • setuptools: {@code [tool.setuptools.packages.find] where = ["src"]}
  • - *
  • Poetry: {@code [tool.poetry] packages = [{from = "src", include = "pkg"}]}
  • + *
  • Poetry: {@code [tool.poetry] packages = [{from = "src", include = "pkg"}]} + * or auto-detects src/ layout when build-backend is poetry.core.masonry.api
  • *
  • Hatchling: {@code [tool.hatch.build.targets.wheel] sources = ["src"]}
  • *
  • uv_build: {@code [build-system] build-backend = "uv_build"} or {@code [tool.uv.build-backend] module-root = "src"} - auto-detects src/ layout by convention
  • *
  • PDM: {@code [tool.pdm] package-dir = "src"}
  • @@ -130,7 +131,7 @@ private static PyProjectExtractionResult extractFromConfig(PyProjectConfig confi detectedBuildSystems.add(PackageResolutionResult.BuildSystem.SETUPTOOLS); } - List poetryRoots = extractFromPoetry(configTool.poetry()); + List poetryRoots = extractFromPoetry(configTool.poetry(), config.buildSystem()); if (!poetryRoots.isEmpty()) { sourceRoots.addAll(poetryRoots); detectedBuildSystems.add(PackageResolutionResult.BuildSystem.POETRY); @@ -199,6 +200,16 @@ private static List extractFromUVBuildSystem(@Nullable BuildSystem build return List.of(); } + /** + * Checks if the build backend is Poetry (e.g., poetry.core.masonry.api). + */ + private static boolean isPoetryBuildBackend(@Nullable BuildSystem buildSystem) { + if (buildSystem == null || buildSystem.buildBackend() == null) { + return false; + } + return buildSystem.buildBackend().contains("poetry"); + } + // === Setuptools === // [tool.setuptools.packages.find] // where = ["src"] @@ -213,16 +224,30 @@ private static List extractFromSetuptools(@Nullable Setuptools setuptool // === Poetry === // [tool.poetry] // packages = [{ include = "mypackage", from = "src" }] + // Or auto-detects src/ layout when build-backend is poetry.core.masonry.api + + private static List extractFromPoetry(@Nullable Poetry poetry, @Nullable BuildSystem buildSystem) { + // First try to get explicit "from" paths from packages + if (poetry != null) { + List explicitRoots = poetry.packages().stream() + .map(PoetryPackage::from) + .filter(from -> from != null && !from.isEmpty()) + .distinct() + .toList(); - private static List extractFromPoetry(@Nullable Poetry poetry) { - if (poetry == null) { - return List.of(); + if (!explicitRoots.isEmpty()) { + return explicitRoots; + } } - return poetry.packages().stream() - .map(PoetryPackage::from) - .filter(from -> from != null && !from.isEmpty()) - .distinct() - .toList(); + + // If Poetry is the build backend but no explicit paths, use src-layout default + // Poetry auto-detects packages in src/ or project root; we default to src/ + // and rely on legacy fallback for flat-layout projects + if (isPoetryBuildBackend(buildSystem)) { + return List.of("src"); + } + + return List.of(); } // === Hatchling === diff --git a/python-commons/src/test/java/org/sonar/plugins/python/indexer/PyProjectTomlSourceRootsTest.java b/python-commons/src/test/java/org/sonar/plugins/python/indexer/PyProjectTomlSourceRootsTest.java index 8386366dc..ceaeb85d0 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/indexer/PyProjectTomlSourceRootsTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/indexer/PyProjectTomlSourceRootsTest.java @@ -193,6 +193,66 @@ void extract_poetry_onlyDependencies() { """)).isEmpty(); } + // === Poetry Auto-Detection === + + @Test + void extract_poetry_autoDetect_withBuildBackend_returnsSrc() { + assertThat(extract(""" + [build-system] + build-backend = "poetry.core.masonry.api" + requires = ["poetry-core"] + + [tool.poetry] + name = "mypackage" + version = "0.1.0" + """)).containsExactly("src"); + } + + @Test + void extract_poetry_autoDetect_emptyPackages_returnsSrc() { + assertThat(extract(""" + [build-system] + build-backend = "poetry.core.masonry.api" + requires = ["poetry-core"] + + [tool.poetry] + packages = [] + """)).containsExactly("src"); + } + + @Test + void extract_poetry_autoDetect_packagesWithoutFrom_returnsSrc() { + assertThat(extract(""" + [build-system] + build-backend = "poetry.core.masonry.api" + requires = ["poetry-core"] + + [tool.poetry] + packages = [{ include = "mypackage" }] + """)).containsExactly("src"); + } + + @Test + void extract_poetry_explicitFrom_overridesAutoDetect() { + assertThat(extract(""" + [build-system] + build-backend = "poetry.core.masonry.api" + requires = ["poetry-core"] + + [tool.poetry] + packages = [{ include = "mypackage", from = "lib" }] + """)).containsExactly("lib"); + } + + @Test + void extract_poetry_noBuildBackend_noPackages_returnsEmpty() { + assertThat(extract(""" + [tool.poetry] + name = "mypackage" + version = "0.1.0" + """)).isEmpty(); + } + // === Hatchling === @Test @@ -550,6 +610,22 @@ void extractWithBuildSystem_poetry_detectsBuildSystem() { assertThat(result.buildSystem()).isEqualTo(PackageResolutionResult.BuildSystem.POETRY); } + @Test + void extractWithBuildSystem_poetry_autoDetect_detectsBuildSystem() { + var result = extractWithBuildSystem(""" + [build-system] + build-backend = "poetry.core.masonry.api" + requires = ["poetry-core"] + + [tool.poetry] + name = "mypackage" + version = "0.1.0" + """); + + assertThat(result.relativeRoots()).containsExactly("src"); + assertThat(result.buildSystem()).isEqualTo(PackageResolutionResult.BuildSystem.POETRY); + } + @Test void extractWithBuildSystem_hatchling_detectsBuildSystem() { var result = extractWithBuildSystem(""" From 465bbeedc9f8dab0cb7effcbf20d9622bfe6aa7f Mon Sep 17 00:00:00 2001 From: Julien HENRY Date: Thu, 19 Feb 2026 16:24:17 +0100 Subject: [PATCH 002/322] SONARPY-3821 Save ncloc metric on test files Enable saving the NCLOC metric for test files in MeasuresRepository, skipped in SonarLint context, consistent with main file behavior. Co-Authored-By: Claude Sonnet 4.6 GitOrigin-RevId: 844dc0115370b295c77bba31b24aabc835a3e378 --- .../sonar/python/it/plugin/MetricsTest.java | 12 ++++++++++-- .../plugins/python/MeasuresRepository.java | 8 ++++++++ .../sonar/plugins/python/PythonScanner.java | 10 +++++++--- .../plugins/python/PythonSensorTest.java | 19 +++++++++++++++++++ 4 files changed, 44 insertions(+), 5 deletions(-) diff --git a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/MetricsTest.java b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/MetricsTest.java index 6efd0d53d..d89e90c4e 100644 --- a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/MetricsTest.java +++ b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/MetricsTest.java @@ -75,7 +75,11 @@ static void startServer() { @Test void project_level() { // Size - assertThat(getProjectMeasureAsInt(NCLOC)).isEqualTo(6); + assertThat(getProjectMeasureAsInt(NCLOC)).satisfiesAnyOf( + nclocValue -> assertThat(nclocValue).isEqualTo(6), + // FIXME SONAR-27110 Can be removed when ITs will be run with SQS 2026.2+ + nclocValue -> assertThat(nclocValue).isEqualTo(20) + ); assertThat(getProjectMeasureAsInt(LINES)).isEqualTo(13); assertThat(getProjectMeasureAsInt(FILES)).isEqualTo(2); assertThat(getProjectMeasureAsInt(STATEMENTS)).isEqualTo(6); @@ -83,7 +87,11 @@ void project_level() { assertThat(getProjectMeasureAsInt(CLASSES)).isZero(); // Documentation assertThat(getProjectMeasureAsInt(COMMENT_LINES)).isOne(); - assertThat(getProjectMeasureAsDouble(COMMENT_LINES_DENSITY)).isEqualTo(14.3, OFFSET); + assertThat(getProjectMeasureAsDouble(COMMENT_LINES_DENSITY)) + .satisfiesAnyOf( + density -> assertThat(density).isEqualTo(14.3, OFFSET), + // FIXME SONAR-27110 Can be removed when ITs will be run with SQS 2026.2+ + density -> assertThat(density).isEqualTo(4.8, OFFSET)); // Complexity assertThat(getProjectMeasureAsDouble(COMPLEXITY)).isEqualTo(3.0, OFFSET); assertThat(getProjectMeasureAsDouble(COGNITIVE_COMPLEXITY)).isEqualTo(3.0, OFFSET); diff --git a/python-commons/src/main/java/org/sonar/plugins/python/MeasuresRepository.java b/python-commons/src/main/java/org/sonar/plugins/python/MeasuresRepository.java index c12adfeca..0b2b337aa 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/MeasuresRepository.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/MeasuresRepository.java @@ -61,6 +61,14 @@ public void save(PythonInputFile inputFile, PythonVisitorContext visitorContext) } } + public void saveNclocForTestFile(PythonInputFile inputFile, PythonVisitorContext visitorContext) { + if (!isInSonarLint) { + FileMetrics fileMetrics = new FileMetrics(visitorContext, isNotebook(inputFile)); + int linesOfCode = fileMetrics.fileLinesVisitor().getLinesOfCode().size(); + saveMetricOnFile(inputFile, CoreMetrics.NCLOC, linesOfCode); + } + } + private void saveInternal(PythonInputFile inputFile, PythonVisitorContext visitorContext) { FileMetrics fileMetrics = new FileMetrics(visitorContext, isNotebook(inputFile)); FileLinesVisitor fileLinesVisitor = fileMetrics.fileLinesVisitor(); diff --git a/python-commons/src/main/java/org/sonar/plugins/python/PythonScanner.java b/python-commons/src/main/java/org/sonar/plugins/python/PythonScanner.java index 579b3c687..ac7ff4a16 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/PythonScanner.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/PythonScanner.java @@ -135,9 +135,13 @@ protected void scanFile(PythonInputFile inputFile) throws IOException { noSonarLineInfoCollector.collect(pythonFile.key(), visitorContext.rootTree()); - if (fileType == InputFile.Type.MAIN && visitorContext.rootTree() != null) { - pushTokens(inputFile, visitorContext); - measuresRepository.save(inputFile, visitorContext); + if (visitorContext.rootTree() != null) { + if (fileType == InputFile.Type.MAIN) { + pushTokens(inputFile, visitorContext); + measuresRepository.save(inputFile, visitorContext); + } else if (fileType == InputFile.Type.TEST) { + measuresRepository.saveNclocForTestFile(inputFile, visitorContext); + } } var issues = visitorContext.getIssues(); diff --git a/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java index 771f0d26e..cc4f91ff1 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java @@ -610,6 +610,25 @@ void test_issues_on_test_files() { assertThat(issue.ruleKey().rule()).isEqualTo("S5905"); } + @Test + void test_ncloc_metric_on_test_file() { + activeRules = new ActiveRulesBuilder().build(); + PythonInputFile inputFile = inputFile(FILE_TEST_FILE, Type.TEST); + sensor().execute(context); + + assertThat(context.measure(inputFile.wrappedFile().key(), CoreMetrics.NCLOC).value()).isEqualTo(3); + } + + @Test + void test_ncloc_metric_not_saved_on_test_file_in_sonarlint() { + context.setRuntime(SONARLINT_RUNTIME); + activeRules = new ActiveRulesBuilder().build(); + PythonInputFile inputFile = inputFile(FILE_TEST_FILE, Type.TEST); + sensor().execute(context); + + assertThat(context.measure(inputFile.wrappedFile().key(), CoreMetrics.NCLOC)).isNull(); + } + @Test void test_failFast_triggered_on_main_files() { activeRules = new ActiveRulesBuilder() From 515619266ba3fc0be4b332f6bbf035442e5a26f5 Mon Sep 17 00:00:00 2001 From: "ss-vibe-bot[bot]" <247337653+ss-vibe-bot[bot]@users.noreply.github.com> Date: Thu, 26 Feb 2026 13:42:46 +0000 Subject: [PATCH 003/322] SONARPY-3834 Fix S8396 FP: do not raise on X | None without default value (#891) Co-authored-by: Vibe Bot Co-authored-by: Claude Sonnet 4.5 GitOrigin-RevId: 2bcd9301c3bbe254a2e20176a68f05c356b83c16 --- .../PydanticOptionalFieldDefaultCheck.java | 44 +++---- .../checks/pydanticOptionalFieldDefault.py | 113 +++++++++--------- 2 files changed, 73 insertions(+), 84 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/PydanticOptionalFieldDefaultCheck.java b/python-checks/src/main/java/org/sonar/python/checks/PydanticOptionalFieldDefaultCheck.java index 72da396e6..3c219be34 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/PydanticOptionalFieldDefaultCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/PydanticOptionalFieldDefaultCheck.java @@ -67,30 +67,36 @@ private static void checkField(SubscriptionContext ctx, AnnotatedAssignment anno TypeAnnotation annotation = annotatedAssignment.annotation(); Expression annotationExpr = annotation.expression(); - if (!isOptionalType(annotationExpr, ctx)) { - return; - } - Expression assignedValue = annotatedAssignment.assignedValue(); - - boolean hasNoDefault = assignedValue == null; boolean hasFieldWithEllipsis = assignedValue != null && isFieldCallWithEllipsis(ctx, assignedValue); - if (hasNoDefault || hasFieldWithEllipsis) { + if (isTypingOptional(annotationExpr, ctx)) { + // Optional[X]: raise when no default, or when Field(...) with ellipsis + if (assignedValue == null || hasFieldWithEllipsis) { + ctx.addIssue(annotationExpr, MESSAGE); + } + } else if (isNullableNonOptional(annotationExpr, ctx) && hasFieldWithEllipsis) { + // X | None or Union[X, None]: only raise when Field(...) with ellipsis ctx.addIssue(annotationExpr, MESSAGE); } } - private static boolean isOptionalType(Expression annotationExpr, SubscriptionContext ctx) { + private static boolean isTypingOptional(Expression annotationExpr, SubscriptionContext ctx) { + if (annotationExpr instanceof SubscriptionExpression subscriptionExpr) { + return IS_TYPING_OPTIONAL.isTrueFor(subscriptionExpr.object(), ctx); + } + return false; + } + + private static boolean isNullableNonOptional(Expression annotationExpr, SubscriptionContext ctx) { // Case 1: T | None (BinaryExpression with BITWISE_OR) if (annotationExpr.is(Tree.Kind.BITWISE_OR)) { - BinaryExpression binaryExpr = (BinaryExpression) annotationExpr; - return containsNone(binaryExpr, ctx); + return containsNone((BinaryExpression) annotationExpr, ctx); } - // Case 2: Optional[T] or Union[T, None] (SubscriptionExpression) + // Case 2: Union[T, None] (SubscriptionExpression) if (annotationExpr instanceof SubscriptionExpression subscriptionExpr) { - return isOptionalOrUnionWithNone(subscriptionExpr, ctx); + return IS_TYPING_UNION.isTrueFor(subscriptionExpr.object(), ctx) && subscriptsContainNone(subscriptionExpr, ctx); } return false; @@ -107,20 +113,6 @@ private static boolean isNoneExpression(Expression expr, SubscriptionContext ctx return IS_NONE_TYPE.isTrueFor(expr, ctx); } - private static boolean isOptionalOrUnionWithNone(SubscriptionExpression subscriptionExpr, SubscriptionContext ctx) { - Expression subscriptedObj = subscriptionExpr.object(); - - if (IS_TYPING_OPTIONAL.isTrueFor(subscriptedObj, ctx)) { - return true; - } - - if (IS_TYPING_UNION.isTrueFor(subscriptedObj, ctx)) { - return subscriptsContainNone(subscriptionExpr, ctx); - } - - return false; - } - private static boolean subscriptsContainNone(SubscriptionExpression subscriptionExpr, SubscriptionContext ctx) { return subscriptionExpr.subscripts().expressions().stream() .anyMatch(expr -> isNoneExpression(expr, ctx)); diff --git a/python-checks/src/test/resources/checks/pydanticOptionalFieldDefault.py b/python-checks/src/test/resources/checks/pydanticOptionalFieldDefault.py index 37fb8af28..0b886a610 100644 --- a/python-checks/src/test/resources/checks/pydanticOptionalFieldDefault.py +++ b/python-checks/src/test/resources/checks/pydanticOptionalFieldDefault.py @@ -10,24 +10,30 @@ class UserModel(BaseModel): email: Optional[str] # Noncompliant {{Add an explicit default value to this optional field.}} # ^^^^^^^^^^^^^ -class ProfileModel(BaseModel): - bio: str | None # Noncompliant -# ^^^^^^^^^^ - class SettingsModel(BaseModel): theme: Optional[str] = Field(...) # Noncompliant # ^^^^^^^^^^^^^ -class ArticleModel(BaseModel): - title: str - subtitle: Optional[str] # Noncompliant - tags: list[str] | None # Noncompliant +class ModelWithMethods(BaseModel): + optional_field: Optional[str] # Noncompliant + required_field: str + + def some_method(self): + pass + +# Field(...) with ellipsis always raises, even for X | None and Union[X, None] -class DataModel(BaseModel): - value: Union[str, None] # Noncompliant +class BitwiseOrWithFieldEllipsis(BaseModel): + value: str | None = Field(...) # Noncompliant +# ^^^^^^^^^^ -class ComplexModel(BaseModel): - data: Union[str, int, None] # Noncompliant +class NoneLeftWithFieldEllipsis(BaseModel): + value: None | str = Field(...) # Noncompliant +# ^^^^^^^^^^ + +class UnionWithFieldEllipsis(BaseModel): + value: Union[str, None] = Field(...) # Noncompliant +# ^^^^^^^^^^^^^^^^ # ===================== # COMPLIANT CASES @@ -35,90 +41,81 @@ class ComplexModel(BaseModel): class UserModelCompliant(BaseModel): name: str - email: Optional[str] = None # Compliant + email: Optional[str] = None class ProfileModelCompliant(BaseModel): - bio: str | None = None # Compliant + bio: str | None = None class SettingsModelCompliant(BaseModel): - theme: Optional[str] = Field(default=None) # Compliant - priority: Optional[int] = Field(default=0) # Compliant + theme: Optional[str] = Field(default=None) + priority: Optional[int] = Field(default=0) class RequiredModel(BaseModel): - required_field: str # Compliant - not Optional - another_field: int = Field(...) # Compliant - not Optional + required_field: str + another_field: int = Field(...) # not Optional, no issue class ConfigModel(BaseModel): - timeout: Optional[int] = 30 # Compliant - has default + timeout: Optional[int] = 30 class FactoryModel(BaseModel): - items: Optional[list] = Field(default_factory=list) # Compliant + items: Optional[list] = Field(default_factory=list) class RegularClass: - value: Optional[str] # Compliant - not a BaseModel + value: Optional[str] # not a BaseModel + +# X | None and Union[X, None] without default: not Optional[X], so no issue + +class BitwiseOrNoneCompliant(BaseModel): + reason: int | None + +class BitwiseOrNoneWithFieldDefaultCompliant(BaseModel): + title: str | None = Field(default=None) + +class NoneLeftCompliant(BaseModel): + description: None | str + +class UnionWithNoneCompliant(BaseModel): + data: Union[str, None] # ===================== # EDGE CASES # ===================== class ComplexModelCompliant(BaseModel): - data: Union[str, int, None] = None # Compliant + data: Union[str, int, None] = None class EmptyModel(BaseModel): - pass # Compliant - no fields + pass class OnlyRequiredModel(BaseModel): id: int - name: str - -# ===================== -# ADDITIONAL EDGE CASES FOR COVERAGE -# ===================== - -class NoneLeftModel(BaseModel): - value: None | str # Noncompliant - -class NestedUnionLeftModel(BaseModel): - value: None | str | int # Noncompliant + name: str class EmptyFieldModel(BaseModel): - value: Optional[str] = Field() # Compliant - Field() with no ellipsis + value: Optional[str] = Field() class FieldWithValueModel(BaseModel): - value: Optional[str] = Field(42) # Compliant - first arg is not ellipsis + value: Optional[str] = Field(42) class FieldWithKeywordFirstModel(BaseModel): - value: Optional[str] = Field(default=None) # Compliant - default is specified + value: Optional[str] = Field(default=None) class FieldEllipsisWithDefaultModel(BaseModel): - value: Optional[str] = Field(..., default=None) # Compliant + value: Optional[str] = Field(..., default=None) class FieldEllipsisWithFactoryModel(BaseModel): - value: Optional[list] = Field(..., default_factory=list) # Compliant - -class ModelWithMethods(BaseModel): - optional_field: Optional[str] # Noncompliant - required_field: str - - def some_method(self): - pass - - @classmethod - def class_method(cls): - pass + value: Optional[list] = Field(..., default_factory=list) -class MultiNestedModel(BaseModel): - left_none: None | str # Noncompliant - right_none: str | None # Noncompliant - deep_left: None | int | str # Noncompliant - deep_right1: int | str | None # Noncompliant - deep_right2: int | str | str | str # Compliant +class MultiNoneFieldCompliant(BaseModel): + deep_left: None | int | str + deep_right: int | str | None + no_none: int | str | str def custom_field(): return None class CustomFieldModel(BaseModel): - value: Optional[str] = custom_field() # Compliant - not pydantic.Field + value: Optional[str] = custom_field() class OtherSubscriptionModel(BaseModel): - value: list[str] # Compliant + value: list[str] From c3547069caa53e8a5f77d308dfe3ae40f992f4e6 Mon Sep 17 00:00:00 2001 From: "ss-vibe-bot[bot]" <247337653+ss-vibe-bot[bot]@users.noreply.github.com> Date: Thu, 26 Feb 2026 16:23:18 +0000 Subject: [PATCH 004/322] SONARPY-3847 Fix S8396 FP: do not raise on `X | None = Field(...)` patterns (#898) Co-authored-by: Vibe Bot GitOrigin-RevId: 10a57f35a44eb8dab9eb8106fe1253f064583a64 --- .../PydanticOptionalFieldDefaultCheck.java | 47 ++----------------- .../checks/pydanticOptionalFieldDefault.py | 29 +++++------- 2 files changed, 16 insertions(+), 60 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/PydanticOptionalFieldDefaultCheck.java b/python-checks/src/main/java/org/sonar/python/checks/PydanticOptionalFieldDefaultCheck.java index 3c219be34..b52399ada 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/PydanticOptionalFieldDefaultCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/PydanticOptionalFieldDefaultCheck.java @@ -22,7 +22,6 @@ import org.sonar.plugins.python.api.SubscriptionContext; import org.sonar.plugins.python.api.tree.AnnotatedAssignment; import org.sonar.plugins.python.api.tree.Argument; -import org.sonar.plugins.python.api.tree.BinaryExpression; import org.sonar.plugins.python.api.tree.CallExpression; import org.sonar.plugins.python.api.tree.ClassDef; import org.sonar.plugins.python.api.tree.Expression; @@ -43,8 +42,6 @@ public class PydanticOptionalFieldDefaultCheck extends PythonSubscriptionCheck { private static final TypeMatcher IS_PYDANTIC_FIELD = TypeMatchers.isType("pydantic.Field"); private static final TypeMatcher IS_TYPING_OPTIONAL = TypeMatchers.isType("typing.Optional"); - private static final TypeMatcher IS_TYPING_UNION = TypeMatchers.isType("typing.Union"); - private static final TypeMatcher IS_NONE_TYPE = TypeMatchers.isObjectOfType("NoneType"); @Override public void initialize(Context context) { @@ -67,16 +64,12 @@ private static void checkField(SubscriptionContext ctx, AnnotatedAssignment anno TypeAnnotation annotation = annotatedAssignment.annotation(); Expression annotationExpr = annotation.expression(); + if (!isTypingOptional(annotationExpr, ctx)) { + return; + } + Expression assignedValue = annotatedAssignment.assignedValue(); - boolean hasFieldWithEllipsis = assignedValue != null && isFieldCallWithEllipsis(ctx, assignedValue); - - if (isTypingOptional(annotationExpr, ctx)) { - // Optional[X]: raise when no default, or when Field(...) with ellipsis - if (assignedValue == null || hasFieldWithEllipsis) { - ctx.addIssue(annotationExpr, MESSAGE); - } - } else if (isNullableNonOptional(annotationExpr, ctx) && hasFieldWithEllipsis) { - // X | None or Union[X, None]: only raise when Field(...) with ellipsis + if (assignedValue == null || isFieldCallWithEllipsis(ctx, assignedValue)) { ctx.addIssue(annotationExpr, MESSAGE); } } @@ -88,36 +81,6 @@ private static boolean isTypingOptional(Expression annotationExpr, SubscriptionC return false; } - private static boolean isNullableNonOptional(Expression annotationExpr, SubscriptionContext ctx) { - // Case 1: T | None (BinaryExpression with BITWISE_OR) - if (annotationExpr.is(Tree.Kind.BITWISE_OR)) { - return containsNone((BinaryExpression) annotationExpr, ctx); - } - - // Case 2: Union[T, None] (SubscriptionExpression) - if (annotationExpr instanceof SubscriptionExpression subscriptionExpr) { - return IS_TYPING_UNION.isTrueFor(subscriptionExpr.object(), ctx) && subscriptsContainNone(subscriptionExpr, ctx); - } - - return false; - } - - private static boolean containsNone(BinaryExpression binaryExpr, SubscriptionContext ctx) { - return isNoneExpression(binaryExpr.leftOperand(), ctx) || - isNoneExpression(binaryExpr.rightOperand(), ctx) || - (binaryExpr.leftOperand().is(Tree.Kind.BITWISE_OR) && containsNone((BinaryExpression) binaryExpr.leftOperand(), ctx)) || - (binaryExpr.rightOperand().is(Tree.Kind.BITWISE_OR) && containsNone((BinaryExpression) binaryExpr.rightOperand(), ctx)); - } - - private static boolean isNoneExpression(Expression expr, SubscriptionContext ctx) { - return IS_NONE_TYPE.isTrueFor(expr, ctx); - } - - private static boolean subscriptsContainNone(SubscriptionExpression subscriptionExpr, SubscriptionContext ctx) { - return subscriptionExpr.subscripts().expressions().stream() - .anyMatch(expr -> isNoneExpression(expr, ctx)); - } - private static boolean isFieldCallWithEllipsis(SubscriptionContext ctx, Expression assignedValue) { if (!(assignedValue instanceof CallExpression callExpr)) { return false; diff --git a/python-checks/src/test/resources/checks/pydanticOptionalFieldDefault.py b/python-checks/src/test/resources/checks/pydanticOptionalFieldDefault.py index 0b886a610..49088f225 100644 --- a/python-checks/src/test/resources/checks/pydanticOptionalFieldDefault.py +++ b/python-checks/src/test/resources/checks/pydanticOptionalFieldDefault.py @@ -21,20 +21,6 @@ class ModelWithMethods(BaseModel): def some_method(self): pass -# Field(...) with ellipsis always raises, even for X | None and Union[X, None] - -class BitwiseOrWithFieldEllipsis(BaseModel): - value: str | None = Field(...) # Noncompliant -# ^^^^^^^^^^ - -class NoneLeftWithFieldEllipsis(BaseModel): - value: None | str = Field(...) # Noncompliant -# ^^^^^^^^^^ - -class UnionWithFieldEllipsis(BaseModel): - value: Union[str, None] = Field(...) # Noncompliant -# ^^^^^^^^^^^^^^^^ - # ===================== # COMPLIANT CASES # ===================== @@ -52,7 +38,7 @@ class SettingsModelCompliant(BaseModel): class RequiredModel(BaseModel): required_field: str - another_field: int = Field(...) # not Optional, no issue + another_field: int = Field(...) class ConfigModel(BaseModel): timeout: Optional[int] = 30 @@ -61,22 +47,29 @@ class FactoryModel(BaseModel): items: Optional[list] = Field(default_factory=list) class RegularClass: - value: Optional[str] # not a BaseModel - -# X | None and Union[X, None] without default: not Optional[X], so no issue + value: Optional[str] class BitwiseOrNoneCompliant(BaseModel): reason: int | None +class BitwiseOrNoneWithFieldEllipsisCompliant(BaseModel): + bio: str | None = Field(...) + class BitwiseOrNoneWithFieldDefaultCompliant(BaseModel): title: str | None = Field(default=None) class NoneLeftCompliant(BaseModel): description: None | str +class NoneLeftWithFieldEllipsisCompliant(BaseModel): + value: None | str = Field(...) + class UnionWithNoneCompliant(BaseModel): data: Union[str, None] +class UnionWithFieldEllipsisCompliant(BaseModel): + value: Union[str, None] = Field(...) + # ===================== # EDGE CASES # ===================== From 22ca1189824b83ea3b01ee16281c759e29114560 Mon Sep 17 00:00:00 2001 From: Marc Jasper Date: Thu, 26 Feb 2026 17:52:57 +0100 Subject: [PATCH 005/322] SONARPY-3757 Create rule S8437: Class-Based Views should override get_context_data correctly (#866) Co-authored-by: Claude Sonnet 4.5 GitOrigin-RevId: e59e83f595293c11c9552a7ba7a602fc337f1716 --- .../python/checks/FlaskRouteMethodsCheck.java | 6 +-- .../python/indexer/SetupPySourceRoots.java | 2 +- .../java/org/sonar/python/tree/TreeUtils.java | 18 +++++++- .../types/custom_protobuf/django.protobuf | 3 +- .../django.views.generic.base.protobuf | 24 +++++++++++ .../django.views.generic.detail.protobuf | 14 ++++++ .../django.views.generic.list.protobuf | 13 ++++++ .../django.views.generic.protobuf | 43 +++++++++++++++++++ .../custom_protobuf/django.views.protobuf | 10 +++++ .../org/sonar/python/tree/TreeUtilsTest.java | 39 +++++++++++++++++ .../resources/custom/django/__init__.pyi | 1 + .../custom/django/views/__init__.pyi | 1 + .../custom/django/views/generic/__init__.pyi | 5 +++ .../custom/django/views/generic/base.pyi | 7 +++ .../custom/django/views/generic/detail.pyi | 5 +++ .../custom/django/views/generic/list.pyi | 5 +++ .../tests/test_serializers.py | 2 +- 17 files changed, 189 insertions(+), 9 deletions(-) create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.generic.base.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.generic.detail.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.generic.list.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.generic.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.protobuf create mode 100644 python-frontend/typeshed_serializer/resources/custom/django/views/__init__.pyi create mode 100644 python-frontend/typeshed_serializer/resources/custom/django/views/generic/__init__.pyi create mode 100644 python-frontend/typeshed_serializer/resources/custom/django/views/generic/base.pyi create mode 100644 python-frontend/typeshed_serializer/resources/custom/django/views/generic/detail.pyi create mode 100644 python-frontend/typeshed_serializer/resources/custom/django/views/generic/list.pyi diff --git a/python-checks/src/main/java/org/sonar/python/checks/FlaskRouteMethodsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/FlaskRouteMethodsCheck.java index 39d35088f..5c58c00ad 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/FlaskRouteMethodsCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/FlaskRouteMethodsCheck.java @@ -24,7 +24,6 @@ import org.sonar.plugins.python.api.tree.Expression; import org.sonar.plugins.python.api.tree.FunctionDef; import org.sonar.plugins.python.api.tree.Tree; -import org.sonar.plugins.python.api.tree.UnpackingExpression; import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; import org.sonar.python.tree.TreeUtils; @@ -74,9 +73,6 @@ private static boolean hasMethodsParameter(CallExpression callExpr) { return true; } - return callExpr.arguments().stream() - .filter(UnpackingExpression.class::isInstance) - .map(UnpackingExpression.class::cast) - .anyMatch(unpacking -> "**".equals(unpacking.starToken().value())); + return callExpr.arguments().stream().anyMatch(TreeUtils::isDoubleStarExpression); } } diff --git a/python-commons/src/main/java/org/sonar/plugins/python/indexer/SetupPySourceRoots.java b/python-commons/src/main/java/org/sonar/plugins/python/indexer/SetupPySourceRoots.java index 7d152fc10..5090c7ba3 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/indexer/SetupPySourceRoots.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/indexer/SetupPySourceRoots.java @@ -149,7 +149,7 @@ public void visitCallExpression(CallExpression callExpression) { */ private void extractFromUnpackingArguments(CallExpression callExpression) { for (Argument argument : callExpression.arguments()) { - if (argument instanceof UnpackingExpression unpacking && "**".equals(unpacking.starToken().value())) { + if (argument instanceof UnpackingExpression unpacking && TreeUtils.isDoubleStarExpression(unpacking)) { Expression unpackedExpr = resolveExpression(unpacking.expression()); if (unpackedExpr instanceof DictionaryLiteral dictLiteral) { extractFromSetupConfigDict(dictLiteral); diff --git a/python-frontend/src/main/java/org/sonar/python/tree/TreeUtils.java b/python-frontend/src/main/java/org/sonar/python/tree/TreeUtils.java index baaba5bc7..90a829d11 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/TreeUtils.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/TreeUtils.java @@ -62,6 +62,7 @@ import org.sonar.plugins.python.api.tree.Tree; import org.sonar.plugins.python.api.tree.Tree.Kind; import org.sonar.plugins.python.api.tree.Tuple; +import org.sonar.plugins.python.api.tree.UnpackingExpression; import org.sonar.plugins.python.api.types.v2.PythonType; import org.sonar.python.api.PythonTokenType; @@ -171,7 +172,7 @@ public static ClassSymbol getClassSymbolFromDef(@Nullable ClassDef classDef) { @CheckForNull public static ClassDef getEnclosingClassDef(Tree tree) { - Tree enclosingClass = firstAncestorOfKind(tree, Tree.Kind.CLASSDEF, Tree.Kind.FUNCDEF); + Tree enclosingClass = firstAncestorOfKind(tree, Tree.Kind.CLASSDEF, Tree.Kind.FUNCDEF, Tree.Kind.LAMBDA); if (enclosingClass instanceof ClassDef classDef) { return classDef; } @@ -634,6 +635,21 @@ public static Set getLocalVariableSymbols(FunctionDef functionDef) { .collect(Collectors.toSet()); } + /** + * Checks if a tree node represents a double-star ({@code **}) expression. + * Supports both {@link Parameter} (e.g. {@code **kwargs} in function definitions) + * and {@link UnpackingExpression} (e.g. {@code **kwargs} in call arguments). + */ + public static boolean isDoubleStarExpression(Tree tree) { + Token starToken = null; + if (tree instanceof Parameter parameter) { + starToken = parameter.starToken(); + } else if (tree instanceof UnpackingExpression unpackingExpression) { + starToken = unpackingExpression.starToken(); + } + return starToken != null && "**".equals(starToken.value()); + } + private static final Pattern CONSTANT_NAME_PATTERN = Pattern.compile("^[_A-Z][A-Z0-9_]*$"); public static boolean isConstantName(String name) { diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.protobuf index 8f5f3eec8..f93c94608 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.protobuf @@ -12,4 +12,5 @@ utils django.utils * urls django.urls * conf django.conf * -apps django.apps  \ No newline at end of file +apps django.apps * +views django.views  \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.generic.base.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.generic.base.protobuf new file mode 100644 index 000000000..3a0d513a3 --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.generic.base.protobuf @@ -0,0 +1,24 @@ + +django.views.generic.base +Viewdjango.views.generic.base.View"builtins.object*` +dispatch'django.views.generic.base.View.dispatch* +self* +request* +args* + +kwargs*Y +get_context_data/django.views.generic.base.View.get_context_data* +self* + +kwargs + TemplateView&django.views.generic.base.TemplateView"django.views.generic.base.View*a +get_context_data7django.views.generic.base.TemplateView.get_context_data* +self* + +kwargsrc + template_name4django.views.generic.base.TemplateView.template_name + builtins.str" builtins.str* +__annotations__)django.views.generic.base.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.generic.detail.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.generic.detail.protobuf new file mode 100644 index 000000000..2a3ae63a7 --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.generic.detail.protobuf @@ -0,0 +1,14 @@ + +django.views.generic.detail + +DetailView&django.views.generic.detail.DetailView"django.views.generic.base.View*a +get_context_data7django.views.generic.detail.DetailView.get_context_data* +self* + +kwargsrU +model,django.views.generic.detail.DetailView.model + builtins.type" builtins.type* +__annotations__+django.views.generic.detail.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.generic.list.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.generic.list.protobuf new file mode 100644 index 000000000..e3e66452c --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.generic.list.protobuf @@ -0,0 +1,13 @@ + +django.views.generic.list +ListView"django.views.generic.list.ListView"django.views.generic.base.View*] +get_context_data3django.views.generic.list.ListView.get_context_data* +self* + +kwargsrQ +model(django.views.generic.list.ListView.model + builtins.type" builtins.type* +__annotations__)django.views.generic.list.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.generic.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.generic.protobuf new file mode 100644 index 000000000..e7563255b --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.generic.protobuf @@ -0,0 +1,43 @@ + +django.views.generic +Viewdjango.views.generic.base.View"builtins.object*` +dispatch'django.views.generic.base.View.dispatch* +self* +request* +args* + +kwargs*Y +get_context_data/django.views.generic.base.View.get_context_data* +self* + +kwargs + TemplateView&django.views.generic.base.TemplateView"django.views.generic.base.View*a +get_context_data7django.views.generic.base.TemplateView.get_context_data* +self* + +kwargsrc + template_name4django.views.generic.base.TemplateView.template_name + builtins.str" builtins.str +ListView"django.views.generic.list.ListView"django.views.generic.base.View*] +get_context_data3django.views.generic.list.ListView.get_context_data* +self* + +kwargsrQ +model(django.views.generic.list.ListView.model + builtins.type" builtins.type + +DetailView&django.views.generic.detail.DetailView"django.views.generic.base.View*a +get_context_data7django.views.generic.detail.DetailView.get_context_data* +self* + +kwargsrU +model,django.views.generic.detail.DetailView.model + builtins.type" builtins.type*u +__path__django.views.generic.__path__J +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list* +__annotations__$django.views.generic.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict*# +basedjango.views.generic.base  \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.protobuf new file mode 100644 index 000000000..f2d0faccc --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.protobuf @@ -0,0 +1,10 @@ + + django.views*m +__path__django.views.__path__J +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list* +__annotations__django.views.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict*! +genericdjango.views.generic  \ No newline at end of file diff --git a/python-frontend/src/test/java/org/sonar/python/tree/TreeUtilsTest.java b/python-frontend/src/test/java/org/sonar/python/tree/TreeUtilsTest.java index b68c40b0f..63d2be240 100644 --- a/python-frontend/src/test/java/org/sonar/python/tree/TreeUtilsTest.java +++ b/python-frontend/src/test/java/org/sonar/python/tree/TreeUtilsTest.java @@ -40,9 +40,11 @@ import org.sonar.plugins.python.api.tree.IfStatement; import org.sonar.plugins.python.api.tree.Name; import org.sonar.plugins.python.api.tree.NumericLiteral; +import org.sonar.plugins.python.api.tree.Parameter; import org.sonar.plugins.python.api.tree.PassStatement; import org.sonar.plugins.python.api.tree.QualifiedExpression; import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.UnpackingExpression; import org.sonar.plugins.python.api.tree.Statement; import org.sonar.plugins.python.api.tree.Token; import org.sonar.plugins.python.api.tree.Tree; @@ -923,6 +925,43 @@ def inner(): pass assertThat(TreeUtils.getEnclosingClassDef(funcDefInner)).isNull(); } + @Test + void test_isDoubleStarExpression() { + FileInput fileInput = PythonTestUtils.parse(""" + def foo(*args, **kwargs): pass + bar(**x, *y) + """); + + FunctionDef funcDef = PythonTestUtils.getFirstChild(fileInput, t -> t.is(Kind.FUNCDEF)); + Parameter doubleStarParam = TreeUtils.nonTupleParameters(funcDef).stream() + .filter(p -> p.name() != null && "kwargs".equals(p.name().name())) + .findFirst().get(); + Parameter singleStarParam = TreeUtils.nonTupleParameters(funcDef).stream() + .filter(p -> p.name() != null && "args".equals(p.name().name())) + .findFirst().get(); + + assertThat(TreeUtils.isDoubleStarExpression(doubleStarParam)).isTrue(); + assertThat(TreeUtils.isDoubleStarExpression(singleStarParam)).isFalse(); + + CallExpression callExpr = PythonTestUtils.getFirstChild(fileInput, t -> t.is(Kind.CALL_EXPR)); + UnpackingExpression doubleStarUnpacking = callExpr.arguments().stream() + .filter(UnpackingExpression.class::isInstance) + .map(UnpackingExpression.class::cast) + .filter(u -> u.expression() instanceof Name name && "x".equals(name.name())) + .findFirst().get(); + UnpackingExpression singleStarUnpacking = callExpr.arguments().stream() + .filter(UnpackingExpression.class::isInstance) + .map(UnpackingExpression.class::cast) + .filter(u -> u.expression() instanceof Name name && "y".equals(name.name())) + .findFirst().get(); + + assertThat(TreeUtils.isDoubleStarExpression(doubleStarUnpacking)).isTrue(); + assertThat(TreeUtils.isDoubleStarExpression(singleStarUnpacking)).isFalse(); + + // A tree that is neither Parameter nor UnpackingExpression + assertThat(TreeUtils.isDoubleStarExpression(funcDef)).isFalse(); + } + @Test void testIsConstantName() { assertThat(TreeUtils.isConstantName("_FOO")).isTrue(); diff --git a/python-frontend/typeshed_serializer/resources/custom/django/__init__.pyi b/python-frontend/typeshed_serializer/resources/custom/django/__init__.pyi index 45fdc7bf6..0904438d1 100644 --- a/python-frontend/typeshed_serializer/resources/custom/django/__init__.pyi +++ b/python-frontend/typeshed_serializer/resources/custom/django/__init__.pyi @@ -4,3 +4,4 @@ import django.utils as utils import django.urls as urls import django.conf as conf import django.apps as apps +import django.views as views diff --git a/python-frontend/typeshed_serializer/resources/custom/django/views/__init__.pyi b/python-frontend/typeshed_serializer/resources/custom/django/views/__init__.pyi new file mode 100644 index 000000000..e194e8119 --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/django/views/__init__.pyi @@ -0,0 +1 @@ +import django.views.generic as generic diff --git a/python-frontend/typeshed_serializer/resources/custom/django/views/generic/__init__.pyi b/python-frontend/typeshed_serializer/resources/custom/django/views/generic/__init__.pyi new file mode 100644 index 000000000..bec54e706 --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/django/views/generic/__init__.pyi @@ -0,0 +1,5 @@ +import django.views.generic.base as base +from django.views.generic.base import View as View +from django.views.generic.base import TemplateView as TemplateView +from django.views.generic.list import ListView as ListView +from django.views.generic.detail import DetailView as DetailView diff --git a/python-frontend/typeshed_serializer/resources/custom/django/views/generic/base.pyi b/python-frontend/typeshed_serializer/resources/custom/django/views/generic/base.pyi new file mode 100644 index 000000000..61b9730c7 --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/django/views/generic/base.pyi @@ -0,0 +1,7 @@ +class View: + def dispatch(self, request, *args, **kwargs): ... + def get_context_data(self, **kwargs): ... + +class TemplateView(View): + template_name: str + def get_context_data(self, **kwargs): ... diff --git a/python-frontend/typeshed_serializer/resources/custom/django/views/generic/detail.pyi b/python-frontend/typeshed_serializer/resources/custom/django/views/generic/detail.pyi new file mode 100644 index 000000000..e82fc016f --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/django/views/generic/detail.pyi @@ -0,0 +1,5 @@ +from django.views.generic.base import View + +class DetailView(View): + model: type + def get_context_data(self, **kwargs): ... diff --git a/python-frontend/typeshed_serializer/resources/custom/django/views/generic/list.pyi b/python-frontend/typeshed_serializer/resources/custom/django/views/generic/list.pyi new file mode 100644 index 000000000..73ed1996f --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/django/views/generic/list.pyi @@ -0,0 +1,5 @@ +from django.views.generic.base import View + +class ListView(View): + model: type + def get_context_data(self, **kwargs): ... diff --git a/python-frontend/typeshed_serializer/tests/test_serializers.py b/python-frontend/typeshed_serializer/tests/test_serializers.py index 42831654a..0ca5bd184 100644 --- a/python-frontend/typeshed_serializer/tests/test_serializers.py +++ b/python-frontend/typeshed_serializer/tests/test_serializers.py @@ -74,7 +74,7 @@ def test_custom_stubs_serializer(typeshed_custom_stubs): custom_stubs_serializer.serialize() assert custom_stubs_serializer.get_build_result.call_count == 1 # Not every files from "typeshed_custom_stubs" build are serialized, as some are builtins - assert symbols.save_module.call_count == 328 + assert symbols.save_module.call_count == 333 def test_importer_serializer(): From ed683b0f3ae87041a43ea1cbd9ff07a4876dcd4f Mon Sep 17 00:00:00 2001 From: Marc Jasper Date: Fri, 27 Feb 2026 11:08:16 +0100 Subject: [PATCH 006/322] SONARPY-3756 Create rule S8435: Sensitive data should not be passed in URL query parameters (#863) Co-authored-by: Claude Sonnet 4.5 GitOrigin-RevId: d8b745caa0930aa6ed179ae84659f06ebd436915 --- .../types/custom_protobuf/django.http.protobuf | 15 ++++++++++++++- .../resources/custom/django/http/__init__.pyi | 4 ++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.http.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.http.protobuf index be638c101..0492a5da8 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.http.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.http.protobuf @@ -1,5 +1,18 @@ - django.httpX + django.http + HttpRequestdjango.http.request.HttpRequest"*SonarPythonAnalyzerFakeStub.CustomStubBaserj +GET#django.http.request.HttpRequest.GET> +django.http.request.QueryDict"django.http.request.QueryDictrl +POST$django.http.request.HttpRequest.POST> +django.http.request.QueryDict"django.http.request.QueryDictrr +COOKIES'django.http.request.HttpRequest.COOKIES> +django.http.request.QueryDict"django.http.request.QueryDictrl +META$django.http.request.HttpRequest.META> +django.http.request.QueryDict"django.http.request.QueryDictrn +FILES%django.http.request.HttpRequest.FILES> +django.http.request.QueryDict"django.http.request.QueryDictrr +headers'django.http.request.HttpRequest.headers> +django.http.request.QueryDict"django.http.request.QueryDictX HttpResponse!django.http.response.HttpResponse"%django.http.response.HttpResponseBasel HttpResponseBadRequest+django.http.response.HttpResponseBadRequest"%django.http.response.HttpResponseBasej HttpResponseForbidden*django.http.response.HttpResponseForbidden"%django.http.response.HttpResponseBase` diff --git a/python-frontend/typeshed_serializer/resources/custom/django/http/__init__.pyi b/python-frontend/typeshed_serializer/resources/custom/django/http/__init__.pyi index a14a012a6..4276278cd 100644 --- a/python-frontend/typeshed_serializer/resources/custom/django/http/__init__.pyi +++ b/python-frontend/typeshed_serializer/resources/custom/django/http/__init__.pyi @@ -1,6 +1,10 @@ import django.http.request as request import django.http.response as response +from .request import ( + HttpRequest as HttpRequest, +) + from .response import ( HttpResponse as HttpResponse, HttpResponseBadRequest as HttpResponseBadRequest, From 672cdd9cb6264bac319767a7908d11380c795abd Mon Sep 17 00:00:00 2001 From: Thomas Serre <118730793+thomas-serre-sonarsource@users.noreply.github.com> Date: Fri, 27 Feb 2026 13:52:44 +0100 Subject: [PATCH 007/322] SONARPY-3423 S112: Do not raise when exception is not instantiated in the function (#897) GitOrigin-RevId: 501565ebf7df5fa9f9a83d924f48a023576f863f --- .../checks/GenericExceptionRaisedCheck.java | 46 ++++++++++++++++--- .../genericExceptionRaised.py | 7 +++ 2 files changed, 47 insertions(+), 6 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/GenericExceptionRaisedCheck.java b/python-checks/src/main/java/org/sonar/python/checks/GenericExceptionRaisedCheck.java index f206a835e..c707d504e 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/GenericExceptionRaisedCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/GenericExceptionRaisedCheck.java @@ -19,11 +19,17 @@ import java.util.List; import org.sonar.check.Rule; import org.sonar.plugins.python.api.PythonSubscriptionCheck; -import org.sonar.plugins.python.api.TriBool; +import org.sonar.plugins.python.api.symbols.v2.SymbolV2; +import org.sonar.plugins.python.api.symbols.v2.UsageV2; import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.Name; import org.sonar.plugins.python.api.tree.RaiseStatement; +import org.sonar.plugins.python.api.tree.Tree; import org.sonar.plugins.python.api.tree.Tree.Kind; import org.sonar.plugins.python.api.types.v2.PythonType; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.tree.TreeUtils; import static org.sonar.plugins.python.api.types.BuiltinTypes.BASE_EXCEPTION; import static org.sonar.plugins.python.api.types.BuiltinTypes.EXCEPTION; @@ -31,6 +37,13 @@ @Rule(key = "S112") public class GenericExceptionRaisedCheck extends PythonSubscriptionCheck { + private final TypeMatcher isExceptionOrBaseExceptionMatcher = TypeMatchers.any( + TypeMatchers.isObjectOfType(EXCEPTION), + TypeMatchers.isObjectOfType(BASE_EXCEPTION), + TypeMatchers.isType(EXCEPTION), + TypeMatchers.isType(BASE_EXCEPTION) + ); + @Override public void initialize(Context context) { context.registerSyntaxNodeConsumer(Kind.RAISE_STMT, ctx -> { @@ -39,13 +52,34 @@ public void initialize(Context context) { if (expressions.isEmpty()) { return; } + Expression expression = expressions.get(0); - PythonType pythonType = expression.typeV2(); - TriBool isException = ctx.typeChecker().typeCheckBuilder().isBuiltinWithName(EXCEPTION).check(pythonType); - TriBool isBaseException = ctx.typeChecker().typeCheckBuilder().isBuiltinWithName(BASE_EXCEPTION).check(pythonType); - if (isException == TriBool.TRUE || isBaseException == TriBool.TRUE) { - ctx.addIssue(expression, "Replace this generic exception class with a more specific one."); + if (!isExceptionOrBaseExceptionMatcher.isTrueFor(expression, ctx)) { + return; } + if (!isExceptionFunctionLocal(expression, raise)) { + return; + } + + ctx.addIssue(expression, "Replace this generic exception class with a more specific one."); }); } + + private static boolean isExceptionFunctionLocal(Expression expression, RaiseStatement raise) { + if (!(expression instanceof Name name)) return true; + SymbolV2 symbolV2 = name.symbolV2(); + return symbolV2 == null || isLocalVariable(symbolV2, raise); + } + + private static boolean isLocalVariable(SymbolV2 symbol, Tree raiseStatement) { + Tree function = TreeUtils.firstAncestorOfKind(raiseStatement, Kind.FUNCDEF); + if (function == null) { + return false; + } + + return symbol.getSingleBindingUsage() + .filter(u -> !u.kind().equals(UsageV2.Kind.PARAMETER)) + .map(usage -> TreeUtils.firstAncestor(usage.tree(), t -> t == function) != null) + .orElse(false); + } } diff --git a/python-checks/src/test/resources/checks/genericException/genericExceptionRaised.py b/python-checks/src/test/resources/checks/genericException/genericExceptionRaised.py index fe78defa4..1cf03e093 100644 --- a/python-checks/src/test/resources/checks/genericException/genericExceptionRaised.py +++ b/python-checks/src/test/resources/checks/genericException/genericExceptionRaised.py @@ -48,3 +48,10 @@ def python2_multiple_expressions(cond): def no_issue_with_self_return_type(): raise MyException().with_traceback("foo") + +def raised_exception_is_the_parameter(exception: BaseException): + raise exception + +global_exception = BaseException() +def raise_global_exception(): + raise global_exception From 8f3ce60fe3e24fe9c1200b4dfa55038c855b6e9e Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Fri, 27 Feb 2026 16:04:41 +0100 Subject: [PATCH 008/322] SONARPY-3856 Update Django generic view stubs (#904) GitOrigin-RevId: 881ff26218cb9d180f192292af4cfd539ab0a216 --- .../unusedFunctionParameter.py | 7 + .../django.views.generic.base.protobuf | 230 ++++++++++++- .../django.views.generic.dates.protobuf | 309 ++++++++++++++++++ .../django.views.generic.detail.protobuf | 89 ++++- .../django.views.generic.edit.protobuf | 249 ++++++++++++++ .../django.views.generic.list.protobuf | 137 +++++++- .../django.views.generic.protobuf | 229 +++++++++++-- .../checksums/custom.checksum | 4 +- .../custom/django/views/generic/__init__.pyi | 18 +- .../custom/django/views/generic/base.pyi | 62 +++- .../custom/django/views/generic/dates.pyi | 115 +++++++ .../custom/django/views/generic/detail.pyi | 35 +- .../custom/django/views/generic/edit.pyi | 74 +++++ .../custom/django/views/generic/list.pyi | 52 ++- .../tests/test_serializers.py | 2 +- 15 files changed, 1532 insertions(+), 80 deletions(-) create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.generic.dates.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.generic.edit.protobuf create mode 100644 python-frontend/typeshed_serializer/resources/custom/django/views/generic/dates.pyi create mode 100644 python-frontend/typeshed_serializer/resources/custom/django/views/generic/edit.pyi diff --git a/python-checks/src/test/resources/checks/unusedFunctionParameter/unusedFunctionParameter.py b/python-checks/src/test/resources/checks/unusedFunctionParameter/unusedFunctionParameter.py index 9a24014f5..c8de14191 100644 --- a/python-checks/src/test/resources/checks/unusedFunctionParameter/unusedFunctionParameter.py +++ b/python-checks/src/test/resources/checks/unusedFunctionParameter/unusedFunctionParameter.py @@ -228,3 +228,10 @@ class LocalClassWithAnnotatedMember: class LocalClassChild(LocalClassWithAnnotatedMember): def my_member(self, param, other_param): # OK, respecting contract defined in parent print("Execute") + + +from django.views import generic + +class TestDjango(generic.DetailView): + def get_object(self, queryset=None): + print("Should not raise") diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.generic.base.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.generic.base.protobuf index 3a0d513a3..ce7ce7f9d 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.generic.base.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.generic.base.protobuf @@ -1,23 +1,217 @@ -django.views.generic.base -Viewdjango.views.generic.base.View"builtins.object*` -dispatch'django.views.generic.base.View.dispatch* -self* -request* -args* - -kwargs*Y -get_context_data/django.views.generic.base.View.get_context_data* -self* - -kwargs - TemplateView&django.views.generic.base.TemplateView"django.views.generic.base.View*a -get_context_data7django.views.generic.base.TemplateView.get_context_data* -self* +django.views.generic.base + ContextMixin&django.views.generic.base.ContextMixin"builtins.object* +get_context_data7django.views.generic.base.ContextMixin.get_context_data"W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict*Z +selfP +&django.views.generic.base.ContextMixin"&django.views.generic.base.ContextMixin* +kwargs +Anyr + extra_context4django.views.generic.base.ContextMixin.extra_context ++Union[builtins.dict[builtins.str,Any],None]W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict +None +Viewdjango.views.generic.base.View"builtins.object* +setup$django.views.generic.base.View.setup" +None*J +self@ +django.views.generic.base.View"django.views.generic.base.View*O +requestB +django.http.request.HttpRequest"django.http.request.HttpRequest* +args +Any* +kwargs +Any* +dispatch'django.views.generic.base.View.dispatch"F +!django.http.response.HttpResponse"!django.http.response.HttpResponse*J +self@ +django.views.generic.base.View"django.views.generic.base.View*O +requestB +django.http.request.HttpRequest"django.http.request.HttpRequest* +args +Any* +kwargs +Any* +http_method_not_allowed6django.views.generic.base.View.http_method_not_allowed"F +!django.http.response.HttpResponse"!django.http.response.HttpResponse*J +self@ +django.views.generic.base.View"django.views.generic.base.View*O +requestB +django.http.request.HttpRequest"django.http.request.HttpRequest* +args +Any* +kwargs +Any* +options&django.views.generic.base.View.options"F +!django.http.response.HttpResponse"!django.http.response.HttpResponse*J +self@ +django.views.generic.base.View"django.views.generic.base.View*O +requestB +django.http.request.HttpRequest"django.http.request.HttpRequest* +args +Any* +kwargs +Any* +as_view&django.views.generic.base.View.as_view"K +CallableType[builtins.function]& +builtins.function"builtins.function*y +clsp +$Type[django.views.generic.base.View]@ +django.views.generic.base.View"django.views.generic.base.View"type* -kwargsrc - template_name4django.views.generic.base.TemplateView.template_name - builtins.str" builtins.str* +initkwargs +Any0:builtins.classmethodpr +http_method_names0django.views.generic.base.View.http_method_namesJ +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.listru +request&django.views.generic.base.View.requestB +django.http.request.HttpRequest"django.http.request.HttpRequestr[ +args#django.views.generic.base.View.args. +builtins.tuple[Any] +Any"builtins.tuplerj +kwargs%django.views.generic.base.View.kwargs9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +TemplateResponseMixin/django.views.generic.base.TemplateResponseMixin"builtins.object* +render_to_responseBdjango.views.generic.base.TemplateResponseMixin.render_to_response"F +!django.http.response.HttpResponse"!django.http.response.HttpResponse*l +selfb +/django.views.generic.base.TemplateResponseMixin"/django.views.generic.base.TemplateResponseMixin*d +contextW +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict* +response_kwargs +Any* +get_template_namesBdjango.views.generic.base.TemplateResponseMixin.get_template_names"J +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list*l +selfb +/django.views.generic.base.TemplateResponseMixin"/django.views.generic.base.TemplateResponseMixinr + template_name=django.views.generic.base.TemplateResponseMixin.template_nameD +Union[builtins.str,None] + builtins.str" builtins.str +Noner +template_engine?django.views.generic.base.TemplateResponseMixin.template_engineD +Union[builtins.str,None] + builtins.str" builtins.str +Noner +response_class>django.views.generic.base.TemplateResponseMixin.response_classy +'Type[django.http.response.HttpResponse]F +!django.http.response.HttpResponse"!django.http.response.HttpResponse"typer + content_typedjango.views.generic.dates.BaseDateListView.get_dated_queryset" +Any*d +selfZ ++django.views.generic.dates.BaseDateListView"+django.views.generic.dates.BaseDateListView* +lookup +Any* +get_date_list_period@django.views.generic.dates.BaseDateListView.get_date_list_period" + builtins.str" builtins.str*d +selfZ ++django.views.generic.dates.BaseDateListView"+django.views.generic.dates.BaseDateListView* + get_date_list9django.views.generic.dates.BaseDateListView.get_date_list" +Any*d +selfZ ++django.views.generic.dates.BaseDateListView"+django.views.generic.dates.BaseDateListView* +queryset +Any*U + date_typeD +Union[builtins.str,None] + builtins.str" builtins.str +None *, +ordering + builtins.str" builtins.str rf + allow_empty7django.views.generic.dates.BaseDateListView.allow_empty + builtins.bool" builtins.boolrn +date_list_perioddjango.views.generic.dates.BaseYearArchiveView.get_dated_items" +.Tuple[Any,Any,builtins.dict[builtins.str,Any]] +Any +AnyW +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict*j +self` +.django.views.generic.dates.BaseYearArchiveView".django.views.generic.dates.BaseYearArchiveView* +get_make_object_listCdjango.views.generic.dates.BaseYearArchiveView.get_make_object_list" + builtins.bool" builtins.bool*j +self` +.django.views.generic.dates.BaseYearArchiveView".django.views.generic.dates.BaseYearArchiveViewrq +date_list_period?django.views.generic.dates.BaseYearArchiveView.date_list_period + builtins.str" builtins.strrs +make_object_list?django.views.generic.dates.BaseYearArchiveView.make_object_list + builtins.bool" builtins.bool +YearArchiveView*django.views.generic.dates.YearArchiveView"=django.views.generic.list.MultipleObjectTemplateResponseMixin".django.views.generic.dates.BaseYearArchiveViewru +template_name_suffix?django.views.generic.dates.YearArchiveView.template_name_suffix + builtins.str" builtins.str +BaseMonthArchiveView/django.views.generic.dates.BaseMonthArchiveView"$django.views.generic.dates.YearMixin"%django.views.generic.dates.MonthMixin"+django.views.generic.dates.BaseDateListView* +get_dated_items?django.views.generic.dates.BaseMonthArchiveView.get_dated_items" +.Tuple[Any,Any,builtins.dict[builtins.str,Any]] +Any +AnyW +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict*l +selfb +/django.views.generic.dates.BaseMonthArchiveView"/django.views.generic.dates.BaseMonthArchiveViewrr +date_list_period@django.views.generic.dates.BaseMonthArchiveView.date_list_period + builtins.str" builtins.str +MonthArchiveView+django.views.generic.dates.MonthArchiveView"=django.views.generic.list.MultipleObjectTemplateResponseMixin"/django.views.generic.dates.BaseMonthArchiveViewrv +template_name_suffix@django.views.generic.dates.MonthArchiveView.template_name_suffix + builtins.str" builtins.str +BaseWeekArchiveView.django.views.generic.dates.BaseWeekArchiveView"$django.views.generic.dates.YearMixin"$django.views.generic.dates.WeekMixin"+django.views.generic.dates.BaseDateListView* +get_dated_items>django.views.generic.dates.BaseWeekArchiveView.get_dated_items" +.Tuple[Any,Any,builtins.dict[builtins.str,Any]] +Any +AnyW +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict*j +self` +.django.views.generic.dates.BaseWeekArchiveView".django.views.generic.dates.BaseWeekArchiveView +WeekArchiveView*django.views.generic.dates.WeekArchiveView"=django.views.generic.list.MultipleObjectTemplateResponseMixin".django.views.generic.dates.BaseWeekArchiveViewru +template_name_suffix?django.views.generic.dates.WeekArchiveView.template_name_suffix + builtins.str" builtins.str +BaseDayArchiveView-django.views.generic.dates.BaseDayArchiveView"$django.views.generic.dates.YearMixin"%django.views.generic.dates.MonthMixin"#django.views.generic.dates.DayMixin"+django.views.generic.dates.BaseDateListView* +get_dated_items=django.views.generic.dates.BaseDayArchiveView.get_dated_items" +.Tuple[Any,Any,builtins.dict[builtins.str,Any]] +Any +AnyW +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict*h +self^ +-django.views.generic.dates.BaseDayArchiveView"-django.views.generic.dates.BaseDayArchiveView +DayArchiveView)django.views.generic.dates.DayArchiveView"=django.views.generic.list.MultipleObjectTemplateResponseMixin"-django.views.generic.dates.BaseDayArchiveViewrt +template_name_suffix>django.views.generic.dates.DayArchiveView.template_name_suffix + builtins.str" builtins.str +BaseTodayArchiveView/django.views.generic.dates.BaseTodayArchiveView"-django.views.generic.dates.BaseDayArchiveView* +get_dated_items?django.views.generic.dates.BaseTodayArchiveView.get_dated_items" +.Tuple[Any,Any,builtins.dict[builtins.str,Any]] +Any +AnyW +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict*l +selfb +/django.views.generic.dates.BaseTodayArchiveView"/django.views.generic.dates.BaseTodayArchiveView +TodayArchiveView+django.views.generic.dates.TodayArchiveView"=django.views.generic.list.MultipleObjectTemplateResponseMixin"/django.views.generic.dates.BaseTodayArchiveViewrv +template_name_suffix@django.views.generic.dates.TodayArchiveView.template_name_suffix + builtins.str" builtins.str +BaseDateDetailView-django.views.generic.dates.BaseDateDetailView"$django.views.generic.dates.YearMixin"%django.views.generic.dates.MonthMixin"#django.views.generic.dates.DayMixin"$django.views.generic.dates.DateMixin"*django.views.generic.detail.BaseDetailView* + +get_object8django.views.generic.dates.BaseDateDetailView.get_object" +Any*h +self^ +-django.views.generic.dates.BaseDateDetailView"-django.views.generic.dates.BaseDateDetailView*6 +queryset& +Union[Any,None] +Any +None  +DateDetailView)django.views.generic.dates.DateDetailView"=django.views.generic.detail.SingleObjectTemplateResponseMixin"-django.views.generic.dates.BaseDateDetailViewrt +template_name_suffix>django.views.generic.dates.DateDetailView.template_name_suffix + builtins.str" builtins.str* +__annotations__*django.views.generic.dates.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict*: + Paginator$django.views.generic.dates.Paginator +Any \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.generic.detail.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.generic.detail.protobuf index 2a3ae63a7..f413ed5b8 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.generic.detail.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.generic.detail.protobuf @@ -1,13 +1,88 @@ -django.views.generic.detail +django.views.generic.detail +SingleObjectMixin-django.views.generic.detail.SingleObjectMixin"&django.views.generic.base.ContextMixin* -DetailView&django.views.generic.detail.DetailView"django.views.generic.base.View*a -get_context_data7django.views.generic.detail.DetailView.get_context_data* -self* +get_object8django.views.generic.detail.SingleObjectMixin.get_object" +Any*h +self^ +-django.views.generic.detail.SingleObjectMixin"-django.views.generic.detail.SingleObjectMixin*6 +queryset& +Union[Any,None] +Any +None * + get_queryset:django.views.generic.detail.SingleObjectMixin.get_queryset" +Any*h +self^ +-django.views.generic.detail.SingleObjectMixin"-django.views.generic.detail.SingleObjectMixin* +get_slug_fielddjango.views.generic.detail.SingleObjectMixin.get_context_data"W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict*h +self^ +-django.views.generic.detail.SingleObjectMixin"-django.views.generic.detail.SingleObjectMixin* +kwargs +Anyr +model3django.views.generic.detail.SingleObjectMixin.modelA +Union[Type[Any],None] + Type[Any] +Any"type +Nonerj +queryset6django.views.generic.detail.SingleObjectMixin.queryset& +Union[Any,None] +Any +Nonerd + +slug_field8django.views.generic.detail.SingleObjectMixin.slug_field + builtins.str" builtins.strr +context_object_nameAdjango.views.generic.detail.SingleObjectMixin.context_object_nameD +Union[builtins.str,None] + builtins.str" builtins.str +Nonerl +slug_url_kwargdjango.views.generic.list.MultipleObjectMixin.get_context_data"W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict*h +self^ +-django.views.generic.list.MultipleObjectMixin"-django.views.generic.list.MultipleObjectMixin*9 + object_list& +Union[Any,None] +Any +None * +kwargs +Anyrh + allow_empty9django.views.generic.list.MultipleObjectMixin.allow_empty + builtins.bool" builtins.boolrj +queryset6django.views.generic.list.MultipleObjectMixin.queryset& +Union[Any,None] +Any +Noner +model3django.views.generic.list.MultipleObjectMixin.modelA +Union[Type[Any],None] + Type[Any] +Any"type +Noner + paginate_by9django.views.generic.list.MultipleObjectMixin.paginate_byD +Union[builtins.int,None] + builtins.int" builtins.int +Nonerp +paginate_orphans>django.views.generic.list.MultipleObjectMixin.paginate_orphans + builtins.int" builtins.intr +context_object_nameAdjango.views.generic.list.MultipleObjectMixin.context_object_nameD +Union[builtins.str,None] + builtins.str" builtins.str +Nonern +paginator_class=django.views.generic.list.MultipleObjectMixin.paginator_class + Type[Any] +Any"typerd -kwargsrQ -model(django.views.generic.list.ListView.model - builtins.type" builtins.type* +page_kwarg8django.views.generic.list.MultipleObjectMixin.page_kwarg + builtins.str" builtins.strrj +ordering6django.views.generic.list.MultipleObjectMixin.ordering& +Union[Any,None] +Any +NonerQ + object_list9django.views.generic.list.MultipleObjectMixin.object_list +Any + BaseListView&django.views.generic.list.BaseListView"-django.views.generic.list.MultipleObjectMixin"django.views.generic.base.View* +get*django.views.generic.list.BaseListView.get"F +!django.http.response.HttpResponse"!django.http.response.HttpResponse*Z +selfP +&django.views.generic.list.BaseListView"&django.views.generic.list.BaseListView*O +requestB +django.http.request.HttpRequest"django.http.request.HttpRequest* +args +Any* +kwargs +Any +#MultipleObjectTemplateResponseMixin=django.views.generic.list.MultipleObjectTemplateResponseMixin"/django.views.generic.base.TemplateResponseMixin* +get_template_namesPdjango.views.generic.list.MultipleObjectTemplateResponseMixin.get_template_names"J +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list* +self~ +=django.views.generic.list.MultipleObjectTemplateResponseMixin"=django.views.generic.list.MultipleObjectTemplateResponseMixinr +template_name_suffixRdjango.views.generic.list.MultipleObjectTemplateResponseMixin.template_name_suffix + builtins.str" builtins.str +ListView"django.views.generic.list.ListView"=django.views.generic.list.MultipleObjectTemplateResponseMixin"&django.views.generic.list.BaseListView* __annotations__)django.views.generic.list.__annotations__W builtins.dict[builtins.str,Any] builtins.str" builtins.str -Any" builtins.dict \ No newline at end of file +Any" builtins.dict*9 + Paginator#django.views.generic.list.Paginator +Any \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.generic.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.generic.protobuf index e7563255b..f2067d188 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.generic.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.generic.protobuf @@ -1,38 +1,209 @@ -django.views.generic -Viewdjango.views.generic.base.View"builtins.object*` -dispatch'django.views.generic.base.View.dispatch* -self* -request* -args* +django.views.generic + RedirectView&django.views.generic.base.RedirectView"django.views.generic.base.View* +get_redirect_url7django.views.generic.base.RedirectView.get_redirect_url"D +Union[builtins.str,None] + builtins.str" builtins.str +None*Z +selfP +&django.views.generic.base.RedirectView"&django.views.generic.base.RedirectView* +args +Any* +kwargs +Any* +get*django.views.generic.base.RedirectView.get"F +!django.http.response.HttpResponse"!django.http.response.HttpResponse*Z +selfP +&django.views.generic.base.RedirectView"&django.views.generic.base.RedirectView*O +requestB +django.http.request.HttpRequest"django.http.request.HttpRequest* +args +Any* +kwargs +Any* +head+django.views.generic.base.RedirectView.head"F +!django.http.response.HttpResponse"!django.http.response.HttpResponse*Z +selfP +&django.views.generic.base.RedirectView"&django.views.generic.base.RedirectView*O +requestB +django.http.request.HttpRequest"django.http.request.HttpRequest* +args +Any* +kwargs +Any* +post+django.views.generic.base.RedirectView.post"F +!django.http.response.HttpResponse"!django.http.response.HttpResponse*Z +selfP +&django.views.generic.base.RedirectView"&django.views.generic.base.RedirectView*O +requestB +django.http.request.HttpRequest"django.http.request.HttpRequest* +args +Any* +kwargs +Any* +options.django.views.generic.base.RedirectView.options"F +!django.http.response.HttpResponse"!django.http.response.HttpResponse*Z +selfP +&django.views.generic.base.RedirectView"&django.views.generic.base.RedirectView*O +requestB +django.http.request.HttpRequest"django.http.request.HttpRequest* +args +Any* +kwargs +Any* +delete-django.views.generic.base.RedirectView.delete"F +!django.http.response.HttpResponse"!django.http.response.HttpResponse*Z +selfP +&django.views.generic.base.RedirectView"&django.views.generic.base.RedirectView*O +requestB +django.http.request.HttpRequest"django.http.request.HttpRequest* +args +Any* +kwargs +Any* +put*django.views.generic.base.RedirectView.put"F +!django.http.response.HttpResponse"!django.http.response.HttpResponse*Z +selfP +&django.views.generic.base.RedirectView"&django.views.generic.base.RedirectView*O +requestB +django.http.request.HttpRequest"django.http.request.HttpRequest* +args +Any* +kwargs +Any* +patch,django.views.generic.base.RedirectView.patch"F +!django.http.response.HttpResponse"!django.http.response.HttpResponse*Z +selfP +&django.views.generic.base.RedirectView"&django.views.generic.base.RedirectView*O +requestB +django.http.request.HttpRequest"django.http.request.HttpRequest* +args +Any* +kwargs +Anyr] + permanent0django.views.generic.base.RedirectView.permanent + builtins.bool" builtins.boolrw +url*django.views.generic.base.RedirectView.urlD +Union[builtins.str,None] + builtins.str" builtins.str +Noner + pattern_name3django.views.generic.base.RedirectView.pattern_nameD +Union[builtins.str,None] + builtins.str" builtins.str +Nonerc + query_string3django.views.generic.base.RedirectView.query_string + builtins.bool" builtins.bool + TemplateView&django.views.generic.base.TemplateView"/django.views.generic.base.TemplateResponseMixin"&django.views.generic.base.ContextMixin"django.views.generic.base.View* +get*django.views.generic.base.TemplateView.get"F +!django.http.response.HttpResponse"!django.http.response.HttpResponse*Z +selfP +&django.views.generic.base.TemplateView"&django.views.generic.base.TemplateView*O +requestB +django.http.request.HttpRequest"django.http.request.HttpRequest* +args +Any* +kwargs +Any +Viewdjango.views.generic.base.View"builtins.object* +setup$django.views.generic.base.View.setup" +None*J +self@ +django.views.generic.base.View"django.views.generic.base.View*O +requestB +django.http.request.HttpRequest"django.http.request.HttpRequest* +args +Any* +kwargs +Any* +dispatch'django.views.generic.base.View.dispatch"F +!django.http.response.HttpResponse"!django.http.response.HttpResponse*J +self@ +django.views.generic.base.View"django.views.generic.base.View*O +requestB +django.http.request.HttpRequest"django.http.request.HttpRequest* +args +Any* +kwargs +Any* +http_method_not_allowed6django.views.generic.base.View.http_method_not_allowed"F +!django.http.response.HttpResponse"!django.http.response.HttpResponse*J +self@ +django.views.generic.base.View"django.views.generic.base.View*O +requestB +django.http.request.HttpRequest"django.http.request.HttpRequest* +args +Any* +kwargs +Any* +options&django.views.generic.base.View.options"F +!django.http.response.HttpResponse"!django.http.response.HttpResponse*J +self@ +django.views.generic.base.View"django.views.generic.base.View*O +requestB +django.http.request.HttpRequest"django.http.request.HttpRequest* +args +Any* +kwargs +Any* +as_view&django.views.generic.base.View.as_view"K +CallableType[builtins.function]& +builtins.function"builtins.function*y +clsp +$Type[django.views.generic.base.View]@ +django.views.generic.base.View"django.views.generic.base.View"type* -kwargs*Y -get_context_data/django.views.generic.base.View.get_context_data* -self* - -kwargs - TemplateView&django.views.generic.base.TemplateView"django.views.generic.base.View*a -get_context_data7django.views.generic.base.TemplateView.get_context_data* -self* +initkwargs +Any0:builtins.classmethodpr +http_method_names0django.views.generic.base.View.http_method_namesJ +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.listru +request&django.views.generic.base.View.requestB +django.http.request.HttpRequest"django.http.request.HttpRequestr[ +args#django.views.generic.base.View.args. +builtins.tuple[Any] +Any"builtins.tuplerj +kwargs%django.views.generic.base.View.kwargs9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +ArchiveIndexView+django.views.generic.dates.ArchiveIndexView"=django.views.generic.list.MultipleObjectTemplateResponseMixin"/django.views.generic.dates.BaseArchiveIndexViewrv +template_name_suffix@django.views.generic.dates.ArchiveIndexView.template_name_suffix + builtins.str" builtins.str +DateDetailView)django.views.generic.dates.DateDetailView"=django.views.generic.detail.SingleObjectTemplateResponseMixin"-django.views.generic.dates.BaseDateDetailViewrt +template_name_suffix>django.views.generic.dates.DateDetailView.template_name_suffix + builtins.str" builtins.str +DayArchiveView)django.views.generic.dates.DayArchiveView"=django.views.generic.list.MultipleObjectTemplateResponseMixin"-django.views.generic.dates.BaseDayArchiveViewrt +template_name_suffix>django.views.generic.dates.DayArchiveView.template_name_suffix + builtins.str" builtins.str +MonthArchiveView+django.views.generic.dates.MonthArchiveView"=django.views.generic.list.MultipleObjectTemplateResponseMixin"/django.views.generic.dates.BaseMonthArchiveViewrv +template_name_suffix@django.views.generic.dates.MonthArchiveView.template_name_suffix + builtins.str" builtins.str +TodayArchiveView+django.views.generic.dates.TodayArchiveView"=django.views.generic.list.MultipleObjectTemplateResponseMixin"/django.views.generic.dates.BaseTodayArchiveViewrv +template_name_suffix@django.views.generic.dates.TodayArchiveView.template_name_suffix + builtins.str" builtins.str +WeekArchiveView*django.views.generic.dates.WeekArchiveView"=django.views.generic.list.MultipleObjectTemplateResponseMixin".django.views.generic.dates.BaseWeekArchiveViewru +template_name_suffix?django.views.generic.dates.WeekArchiveView.template_name_suffix + builtins.str" builtins.str +YearArchiveView*django.views.generic.dates.YearArchiveView"=django.views.generic.list.MultipleObjectTemplateResponseMixin".django.views.generic.dates.BaseYearArchiveViewru +template_name_suffix?django.views.generic.dates.YearArchiveView.template_name_suffix + builtins.str" builtins.str -kwargsrc - template_name4django.views.generic.base.TemplateView.template_name - builtins.str" builtins.str -ListView"django.views.generic.list.ListView"django.views.generic.base.View*] -get_context_data3django.views.generic.list.ListView.get_context_data* -self* +DetailView&django.views.generic.detail.DetailView"=django.views.generic.detail.SingleObjectTemplateResponseMixin"*django.views.generic.detail.BaseDetailView -kwargsrQ -model(django.views.generic.list.ListView.model - builtins.type" builtins.type +CreateView$django.views.generic.edit.CreateView"=django.views.generic.detail.SingleObjectTemplateResponseMixin"(django.views.generic.edit.BaseCreateViewro +template_name_suffix9django.views.generic.edit.CreateView.template_name_suffix + builtins.str" builtins.str -DetailView&django.views.generic.detail.DetailView"django.views.generic.base.View*a -get_context_data7django.views.generic.detail.DetailView.get_context_data* -self* +DeleteView$django.views.generic.edit.DeleteView"=django.views.generic.detail.SingleObjectTemplateResponseMixin"(django.views.generic.edit.BaseDeleteViewro +template_name_suffix9django.views.generic.edit.DeleteView.template_name_suffix + builtins.str" builtins.str +FormView"django.views.generic.edit.FormView"/django.views.generic.base.TemplateResponseMixin"&django.views.generic.edit.BaseFormView -kwargsrU -model,django.views.generic.detail.DetailView.model - builtins.type" builtins.type*u +UpdateView$django.views.generic.edit.UpdateView"=django.views.generic.detail.SingleObjectTemplateResponseMixin"(django.views.generic.edit.BaseUpdateViewro +template_name_suffix9django.views.generic.edit.UpdateView.template_name_suffix + builtins.str" builtins.str +ListView"django.views.generic.list.ListView"=django.views.generic.list.MultipleObjectTemplateResponseMixin"&django.views.generic.list.BaseListViewM +GenericViewError%django.views.generic.GenericViewError"builtins.Exception*u __path__django.views.generic.__path__J builtins.list[builtins.str] builtins.str" builtins.str" builtins.list* diff --git a/python-frontend/typeshed_serializer/checksums/custom.checksum b/python-frontend/typeshed_serializer/checksums/custom.checksum index 736af910e..fe1f5520e 100644 --- a/python-frontend/typeshed_serializer/checksums/custom.checksum +++ b/python-frontend/typeshed_serializer/checksums/custom.checksum @@ -1,2 +1,2 @@ -5264643196941521a2f81ff6d51c750007ab196d892c0c113697b51b17985c82 -1ce0cddf4561cb6431cb0d5e7e4dbd30c96cfcf6397241185edf2d3ba452aaef \ No newline at end of file +ff99a5ab4ee8349e8b21eeb3668e2e4990aa198e31cc27ca31aee9299e0bed67 +5ed498acd62426c597e0c2ab3ff0ab186b5cc72f27538e9d7627a996c36f4568 \ No newline at end of file diff --git a/python-frontend/typeshed_serializer/resources/custom/django/views/generic/__init__.pyi b/python-frontend/typeshed_serializer/resources/custom/django/views/generic/__init__.pyi index bec54e706..4f3d6ed07 100644 --- a/python-frontend/typeshed_serializer/resources/custom/django/views/generic/__init__.pyi +++ b/python-frontend/typeshed_serializer/resources/custom/django/views/generic/__init__.pyi @@ -1,5 +1,19 @@ import django.views.generic.base as base -from django.views.generic.base import View as View +from django.views.generic.base import RedirectView as RedirectView from django.views.generic.base import TemplateView as TemplateView -from django.views.generic.list import ListView as ListView +from django.views.generic.base import View as View +from django.views.generic.dates import ArchiveIndexView as ArchiveIndexView +from django.views.generic.dates import DateDetailView as DateDetailView +from django.views.generic.dates import DayArchiveView as DayArchiveView +from django.views.generic.dates import MonthArchiveView as MonthArchiveView +from django.views.generic.dates import TodayArchiveView as TodayArchiveView +from django.views.generic.dates import WeekArchiveView as WeekArchiveView +from django.views.generic.dates import YearArchiveView as YearArchiveView from django.views.generic.detail import DetailView as DetailView +from django.views.generic.edit import CreateView as CreateView +from django.views.generic.edit import DeleteView as DeleteView +from django.views.generic.edit import FormView as FormView +from django.views.generic.edit import UpdateView as UpdateView +from django.views.generic.list import ListView as ListView + +class GenericViewError(Exception): ... diff --git a/python-frontend/typeshed_serializer/resources/custom/django/views/generic/base.pyi b/python-frontend/typeshed_serializer/resources/custom/django/views/generic/base.pyi index 61b9730c7..319e9169b 100644 --- a/python-frontend/typeshed_serializer/resources/custom/django/views/generic/base.pyi +++ b/python-frontend/typeshed_serializer/resources/custom/django/views/generic/base.pyi @@ -1,7 +1,59 @@ +from typing import Any, Callable, Dict, List, Optional, Type + +from django.http.request import HttpRequest +from django.http.response import HttpResponse + +class ContextMixin: + extra_context: Optional[Dict[str, Any]] + def get_context_data(self, **kwargs: Any) -> Dict[str, Any]: ... + class View: - def dispatch(self, request, *args, **kwargs): ... - def get_context_data(self, **kwargs): ... + http_method_names: List[str] + request: HttpRequest + args: tuple + kwargs: dict + def setup(self, request: HttpRequest, *args: Any, **kwargs: Any) -> None: ... + def dispatch( + self, request: HttpRequest, *args: Any, **kwargs: Any + ) -> HttpResponse: ... + def http_method_not_allowed( + self, request: HttpRequest, *args: Any, **kwargs: Any + ) -> HttpResponse: ... + def options( + self, request: HttpRequest, *args: Any, **kwargs: Any + ) -> HttpResponse: ... + @classmethod + def as_view(cls, **initkwargs: Any) -> Callable[..., HttpResponse]: ... + +class TemplateResponseMixin: + template_name: Optional[str] + template_engine: Optional[str] + response_class: Type[HttpResponse] + content_type: Optional[str] + def render_to_response( + self, context: Dict[str, Any], **response_kwargs: Any + ) -> HttpResponse: ... + def get_template_names(self) -> List[str]: ... + +class TemplateView(TemplateResponseMixin, ContextMixin, View): + def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... -class TemplateView(View): - template_name: str - def get_context_data(self, **kwargs): ... +class RedirectView(View): + permanent: bool + url: Optional[str] + pattern_name: Optional[str] + query_string: bool + def get_redirect_url(self, *args: Any, **kwargs: Any) -> Optional[str]: ... + def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... + def head(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... + def post(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... + def options( + self, request: HttpRequest, *args: Any, **kwargs: Any + ) -> HttpResponse: ... + def delete( + self, request: HttpRequest, *args: Any, **kwargs: Any + ) -> HttpResponse: ... + def put(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... + def patch( + self, request: HttpRequest, *args: Any, **kwargs: Any + ) -> HttpResponse: ... diff --git a/python-frontend/typeshed_serializer/resources/custom/django/views/generic/dates.pyi b/python-frontend/typeshed_serializer/resources/custom/django/views/generic/dates.pyi new file mode 100644 index 000000000..af3a61d06 --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/django/views/generic/dates.pyi @@ -0,0 +1,115 @@ +import datetime +from typing import Any, Dict, List, Optional, Tuple, Type + +from django.core.paginator import Paginator +from django.db.models import Model +from django.http.request import HttpRequest +from django.http.response import HttpResponse +from django.views.generic.base import View +from django.views.generic.detail import ( + BaseDetailView, + SingleObjectTemplateResponseMixin, +) +from django.views.generic.list import ( + MultipleObjectMixin, + MultipleObjectTemplateResponseMixin, +) + +class YearMixin: + year_format: str + year: Optional[str] + def get_year_format(self) -> str: ... + def get_year(self) -> str: ... + def get_next_year(self, date: datetime.date) -> Optional[datetime.date]: ... + def get_previous_year(self, date: datetime.date) -> Optional[datetime.date]: ... + +class MonthMixin: + month_format: str + month: Optional[str] + def get_month_format(self) -> str: ... + def get_month(self) -> str: ... + def get_next_month(self, date: datetime.date) -> Optional[datetime.date]: ... + def get_previous_month(self, date: datetime.date) -> Optional[datetime.date]: ... + +class DayMixin: + day_format: str + day: Optional[str] + def get_day_format(self) -> str: ... + def get_day(self) -> str: ... + def get_next_day(self, date: datetime.date) -> Optional[datetime.date]: ... + def get_previous_day(self, date: datetime.date) -> Optional[datetime.date]: ... + +class WeekMixin: + week_format: str + week: Optional[str] + def get_week_format(self) -> str: ... + def get_week(self) -> str: ... + def get_next_week(self, date: datetime.date) -> Optional[datetime.date]: ... + def get_previous_week(self, date: datetime.date) -> Optional[datetime.date]: ... + +class DateMixin: + date_field: Optional[str] + allow_future: bool + uses_datetime_field: bool + def get_date_field(self) -> str: ... + def get_allow_future(self) -> bool: ... + +class BaseDateListView(MultipleObjectMixin, DateMixin, View): + allow_empty: bool + date_list_period: str + date_list: Any + def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... + def get_dated_items(self) -> Tuple[Any, Any, Dict[str, Any]]: ... + def get_ordering(self) -> Optional[Any]: ... + def get_dated_queryset(self, **lookup: Any) -> Any: ... + def get_date_list_period(self) -> str: ... + def get_date_list( + self, queryset: Any, date_type: Optional[str] = ..., ordering: str = ... + ) -> Any: ... + +class BaseArchiveIndexView(BaseDateListView): + context_object_name: str + def get_dated_items(self) -> Tuple[Any, Any, Dict[str, Any]]: ... + +class ArchiveIndexView(MultipleObjectTemplateResponseMixin, BaseArchiveIndexView): + template_name_suffix: str + +class BaseYearArchiveView(YearMixin, BaseDateListView): + date_list_period: str + make_object_list: bool + def get_dated_items(self) -> Tuple[Any, Any, Dict[str, Any]]: ... + def get_make_object_list(self) -> bool: ... + +class YearArchiveView(MultipleObjectTemplateResponseMixin, BaseYearArchiveView): + template_name_suffix: str + +class BaseMonthArchiveView(YearMixin, MonthMixin, BaseDateListView): + date_list_period: str + def get_dated_items(self) -> Tuple[Any, Any, Dict[str, Any]]: ... + +class MonthArchiveView(MultipleObjectTemplateResponseMixin, BaseMonthArchiveView): + template_name_suffix: str + +class BaseWeekArchiveView(YearMixin, WeekMixin, BaseDateListView): + def get_dated_items(self) -> Tuple[Any, Any, Dict[str, Any]]: ... + +class WeekArchiveView(MultipleObjectTemplateResponseMixin, BaseWeekArchiveView): + template_name_suffix: str + +class BaseDayArchiveView(YearMixin, MonthMixin, DayMixin, BaseDateListView): + def get_dated_items(self) -> Tuple[Any, Any, Dict[str, Any]]: ... + +class DayArchiveView(MultipleObjectTemplateResponseMixin, BaseDayArchiveView): + template_name_suffix: str + +class BaseTodayArchiveView(BaseDayArchiveView): + def get_dated_items(self) -> Tuple[Any, Any, Dict[str, Any]]: ... + +class TodayArchiveView(MultipleObjectTemplateResponseMixin, BaseTodayArchiveView): + template_name_suffix: str + +class BaseDateDetailView(YearMixin, MonthMixin, DayMixin, DateMixin, BaseDetailView): + def get_object(self, queryset: Optional[Any] = ...) -> Any: ... + +class DateDetailView(SingleObjectTemplateResponseMixin, BaseDateDetailView): + template_name_suffix: str diff --git a/python-frontend/typeshed_serializer/resources/custom/django/views/generic/detail.pyi b/python-frontend/typeshed_serializer/resources/custom/django/views/generic/detail.pyi index e82fc016f..5230a8e57 100644 --- a/python-frontend/typeshed_serializer/resources/custom/django/views/generic/detail.pyi +++ b/python-frontend/typeshed_serializer/resources/custom/django/views/generic/detail.pyi @@ -1,5 +1,32 @@ -from django.views.generic.base import View +from typing import Any, Dict, List, Optional, Type -class DetailView(View): - model: type - def get_context_data(self, **kwargs): ... +from django.db.models import Model +from django.http.request import HttpRequest +from django.http.response import HttpResponse +from django.views.generic.base import ContextMixin, TemplateResponseMixin, View + +class SingleObjectMixin(ContextMixin): + model: Optional[Type[Model]] + queryset: Optional[Any] + slug_field: str + context_object_name: Optional[str] + slug_url_kwarg: str + pk_url_kwarg: str + query_pk_and_slug: bool + object: Any + def get_object(self, queryset: Optional[Any] = ...) -> Any: ... + def get_queryset(self) -> Any: ... + def get_slug_field(self) -> str: ... + def get_context_object_name(self, obj: Any) -> Optional[str]: ... + def get_context_data(self, **kwargs: Any) -> Dict[str, Any]: ... + +class BaseDetailView(SingleObjectMixin, View): + def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... + +class SingleObjectTemplateResponseMixin(TemplateResponseMixin): + template_name_field: Optional[str] + template_name_suffix: str + def get_template_names(self) -> List[str]: ... + +class DetailView(SingleObjectTemplateResponseMixin, BaseDetailView): + pass diff --git a/python-frontend/typeshed_serializer/resources/custom/django/views/generic/edit.pyi b/python-frontend/typeshed_serializer/resources/custom/django/views/generic/edit.pyi new file mode 100644 index 000000000..97f3742fa --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/django/views/generic/edit.pyi @@ -0,0 +1,74 @@ +from typing import Any, Dict, List, Optional, Type + +from django.forms import Form +from django.http.request import HttpRequest +from django.http.response import HttpResponse +from django.views.generic.base import ContextMixin, TemplateResponseMixin, View +from django.views.generic.detail import ( + BaseDetailView, + SingleObjectMixin, + SingleObjectTemplateResponseMixin, +) + +class FormMixin(ContextMixin): + initial: Dict[str, Any] + form_class: Optional[Type[Form]] + success_url: Optional[str] + prefix: Optional[str] + def get_initial(self) -> Dict[str, Any]: ... + def get_prefix(self) -> Optional[str]: ... + def get_form_class(self) -> Type[Form]: ... + def get_form(self, form_class: Optional[Type[Form]] = ...) -> Form: ... + def get_form_kwargs(self) -> Dict[str, Any]: ... + def get_success_url(self) -> str: ... + def form_valid(self, form: Form) -> HttpResponse: ... + def form_invalid(self, form: Form) -> HttpResponse: ... + def get_context_data(self, **kwargs: Any) -> Dict[str, Any]: ... + +class ModelFormMixin(FormMixin, SingleObjectMixin): + fields: Optional[Any] + def get_form_class(self) -> Type[Form]: ... + def get_form_kwargs(self) -> Dict[str, Any]: ... + def get_success_url(self) -> str: ... + def form_valid(self, form: Form) -> HttpResponse: ... + +class ProcessFormView(View): + def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... + def post(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... + def put(self, *args: Any, **kwargs: Any) -> HttpResponse: ... + +class BaseFormView(FormMixin, ProcessFormView): + pass + +class FormView(TemplateResponseMixin, BaseFormView): + pass + +class BaseCreateView(ModelFormMixin, ProcessFormView): + def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... + def post(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... + +class CreateView(SingleObjectTemplateResponseMixin, BaseCreateView): + template_name_suffix: str + +class BaseUpdateView(ModelFormMixin, ProcessFormView): + def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... + def post(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... + +class UpdateView(SingleObjectTemplateResponseMixin, BaseUpdateView): + template_name_suffix: str + +class DeletionMixin: + success_url: Optional[str] + def delete( + self, request: HttpRequest, *args: Any, **kwargs: Any + ) -> HttpResponse: ... + def post(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... + def get_success_url(self) -> str: ... + +class BaseDeleteView(DeletionMixin, FormMixin, BaseDetailView): + form_class: Type[Form] + def post(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... + def form_valid(self, form: Form) -> HttpResponse: ... + +class DeleteView(SingleObjectTemplateResponseMixin, BaseDeleteView): + template_name_suffix: str diff --git a/python-frontend/typeshed_serializer/resources/custom/django/views/generic/list.pyi b/python-frontend/typeshed_serializer/resources/custom/django/views/generic/list.pyi index 73ed1996f..add51a734 100644 --- a/python-frontend/typeshed_serializer/resources/custom/django/views/generic/list.pyi +++ b/python-frontend/typeshed_serializer/resources/custom/django/views/generic/list.pyi @@ -1,5 +1,49 @@ -from django.views.generic.base import View +from typing import Any, Dict, List, Optional, Tuple, Type -class ListView(View): - model: type - def get_context_data(self, **kwargs): ... +from django.core.paginator import Paginator +from django.db.models import Model +from django.http.request import HttpRequest +from django.http.response import HttpResponse +from django.views.generic.base import ContextMixin, TemplateResponseMixin, View + +class MultipleObjectMixin(ContextMixin): + allow_empty: bool + queryset: Optional[Any] + model: Optional[Type[Model]] + paginate_by: Optional[int] + paginate_orphans: int + context_object_name: Optional[str] + paginator_class: Type[Paginator] + page_kwarg: str + ordering: Optional[Any] + object_list: Any + def get_queryset(self) -> Any: ... + def get_ordering(self) -> Optional[Any]: ... + def paginate_queryset( + self, queryset: Any, page_size: int + ) -> Tuple[Paginator, Any, Any, bool]: ... + def get_paginate_by(self, queryset: Any) -> Optional[int]: ... + def get_paginator( + self, + queryset: Any, + per_page: int, + orphans: int = ..., + allow_empty_first_page: bool = ..., + **kwargs: Any, + ) -> Paginator: ... + def get_paginate_orphans(self) -> int: ... + def get_allow_empty(self) -> bool: ... + def get_context_object_name(self, object_list: Any) -> Optional[str]: ... + def get_context_data( + self, *, object_list: Optional[Any] = ..., **kwargs: Any + ) -> Dict[str, Any]: ... + +class BaseListView(MultipleObjectMixin, View): + def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... + +class MultipleObjectTemplateResponseMixin(TemplateResponseMixin): + template_name_suffix: str + def get_template_names(self) -> List[str]: ... + +class ListView(MultipleObjectTemplateResponseMixin, BaseListView): + pass diff --git a/python-frontend/typeshed_serializer/tests/test_serializers.py b/python-frontend/typeshed_serializer/tests/test_serializers.py index 0ca5bd184..1d8853a28 100644 --- a/python-frontend/typeshed_serializer/tests/test_serializers.py +++ b/python-frontend/typeshed_serializer/tests/test_serializers.py @@ -74,7 +74,7 @@ def test_custom_stubs_serializer(typeshed_custom_stubs): custom_stubs_serializer.serialize() assert custom_stubs_serializer.get_build_result.call_count == 1 # Not every files from "typeshed_custom_stubs" build are serialized, as some are builtins - assert symbols.save_module.call_count == 333 + assert symbols.save_module.call_count == 335 def test_importer_serializer(): From adade472df66734099e37c0cb2df386d7a90db7f Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Mon, 2 Mar 2026 09:58:26 +0100 Subject: [PATCH 009/322] SONARPY-3859 Removed unused import GitOrigin-RevId: adf8b8963b3c83eb761fd0baf7856a455f674296 --- .../org/sonar/python/checks/GenericExceptionRaisedCheck.java | 1 - 1 file changed, 1 deletion(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/GenericExceptionRaisedCheck.java b/python-checks/src/main/java/org/sonar/python/checks/GenericExceptionRaisedCheck.java index c707d504e..f50d81bc5 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/GenericExceptionRaisedCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/GenericExceptionRaisedCheck.java @@ -26,7 +26,6 @@ import org.sonar.plugins.python.api.tree.RaiseStatement; import org.sonar.plugins.python.api.tree.Tree; import org.sonar.plugins.python.api.tree.Tree.Kind; -import org.sonar.plugins.python.api.types.v2.PythonType; import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; import org.sonar.python.tree.TreeUtils; From 326240ce40dfd22a1163f3da1602e602e636ff54 Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Mon, 2 Mar 2026 14:41:04 +0100 Subject: [PATCH 010/322] SONARPY-3768 Create rule S8438: Django view functions should declare URL parameters explicitly (#872) Co-authored-by: Claude Opus 4.5 GitOrigin-RevId: 3976c172a3fe0f38fbdef787ebf2e8471cc8d84d --- .../checks/FastAPIPathParametersCheck.java | 58 +----------- .../checks/utils/FunctionParameterUtils.java | 86 +++++++++++++++++ .../plugins/python/api/DjangoViewInfo.java | 45 +++++++++ .../python/api/PythonInputFileContext.java | 4 + .../python/api/PythonVisitorContext.java | 4 + .../python/api/SubscriptionContext.java | 8 ++ .../org/sonar/python/SubscriptionVisitor.java | 7 ++ .../python/semantic/FunctionSymbolImpl.java | 13 +-- .../semantic/ProjectLevelSymbolTable.java | 94 ++++++++++++++----- .../java/org/sonar/python/semantic/Scope.java | 3 +- .../semantic/ProjectLevelSymbolTableTest.java | 87 +++++++++++++++++ 11 files changed, 325 insertions(+), 84 deletions(-) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/utils/FunctionParameterUtils.java create mode 100644 python-frontend/src/main/java/org/sonar/plugins/python/api/DjangoViewInfo.java diff --git a/python-checks/src/main/java/org/sonar/python/checks/FastAPIPathParametersCheck.java b/python-checks/src/main/java/org/sonar/python/checks/FastAPIPathParametersCheck.java index 6dda10e40..32facaf51 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/FastAPIPathParametersCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/FastAPIPathParametersCheck.java @@ -31,12 +31,11 @@ import org.sonar.plugins.python.api.tree.Expression; import org.sonar.plugins.python.api.tree.FunctionDef; import org.sonar.plugins.python.api.tree.Tree; -import org.sonar.plugins.python.api.types.v2.FunctionType; -import org.sonar.plugins.python.api.types.v2.ParameterV2; -import org.sonar.plugins.python.api.types.v2.PythonType; import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; import org.sonar.python.checks.utils.Expressions; +import org.sonar.python.checks.utils.FunctionParameterUtils; +import org.sonar.python.checks.utils.FunctionParameterUtils.FunctionParameterInfo; import org.sonar.python.tree.TreeUtils; @Rule(key = "S8411") @@ -57,12 +56,6 @@ public class FastAPIPathParametersCheck extends PythonSubscriptionCheck { TypeMatchers.isType("fastapi.APIRouter." + method))) ); - private record FunctionParameterInfo(Set allParams, Set positionalOnlyParams, boolean hasVariadicKeyword) { - static FunctionParameterInfo empty() { - return new FunctionParameterInfo(Set.of(), Set.of(), false); - } - } - @Override public void initialize(Context context) { context.registerSyntaxNodeConsumer(Tree.Kind.FUNCDEF, FastAPIPathParametersCheck::checkFunction); @@ -90,7 +83,7 @@ private static void checkDecorator(SubscriptionContext ctx, Decorator decorator, return; } - FunctionParameterInfo paramInfo = extractFunctionParameters(functionDef); + FunctionParameterInfo paramInfo = FunctionParameterUtils.extractFunctionParameters(functionDef); reportIssues(ctx, functionDef, pathParams, paramInfo); } @@ -114,54 +107,13 @@ private static Optional extractStringValue(Expression expression) { .map(Expressions::unescape); } - private static FunctionParameterInfo extractFunctionParameters(FunctionDef functionDef) { - return getFunctionType(functionDef) - .map(FastAPIPathParametersCheck::buildParameterInfo) - .orElse(FunctionParameterInfo.empty()); - } - - private static Optional getFunctionType(FunctionDef functionDef) { - PythonType functionType = functionDef.name().typeV2(); - if (functionType instanceof FunctionType funcType) { - return Optional.of(funcType); - } - return Optional.empty(); - } - - private static FunctionParameterInfo buildParameterInfo(FunctionType functionType) { - Set allParams = new HashSet<>(); - Set positionalOnlyParams = new HashSet<>(); - boolean hasVariadicKeyword = functionType.parameters().stream() - .anyMatch(param -> param.isVariadic() && param.isKeywordVariadic()); - - functionType.parameters().stream() - .filter(param -> !param.isVariadic()) - .forEach(param -> addParameter(param, allParams, positionalOnlyParams)); - - return new FunctionParameterInfo(allParams, positionalOnlyParams, hasVariadicKeyword); - } - - private static void addParameter(ParameterV2 param, Set allParams, Set positionalOnlyParams) { - String paramName = param.name(); - if (paramName != null) { - allParams.add(paramName); - if (param.isPositionalOnly()) { - positionalOnlyParams.add(paramName); - } - } - } - private static void reportIssues(SubscriptionContext ctx, FunctionDef functionDef, Set pathParams, FunctionParameterInfo paramInfo) { pathParams.stream() - .filter(param -> isMissingFromSignature(param, paramInfo)) + .filter(paramInfo::isMissingFromSignature) .forEach(param -> ctx.addIssue(functionDef.name(), String.format(MISSING_PARAM_MESSAGE, param))); pathParams.stream() - .filter(paramInfo.positionalOnlyParams::contains) + .filter(paramInfo.positionalOnlyParams()::contains) .forEach(param -> ctx.addIssue(functionDef.name(), String.format(POSITIONAL_ONLY_MESSAGE, param))); } - - private static boolean isMissingFromSignature(String pathParam, FunctionParameterInfo paramInfo) { - return !paramInfo.allParams.contains(pathParam) && !paramInfo.hasVariadicKeyword; - } } diff --git a/python-checks/src/main/java/org/sonar/python/checks/utils/FunctionParameterUtils.java b/python-checks/src/main/java/org/sonar/python/checks/utils/FunctionParameterUtils.java new file mode 100644 index 000000000..11021fd9f --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/utils/FunctionParameterUtils.java @@ -0,0 +1,86 @@ +/* + * SonarQube Python Plugin + * Copyright (C) 2011-2025 SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.utils; + +import java.util.HashSet; +import java.util.Optional; +import java.util.Set; +import org.sonar.plugins.python.api.tree.FunctionDef; +import org.sonar.plugins.python.api.types.v2.FunctionType; +import org.sonar.plugins.python.api.types.v2.ParameterV2; +import org.sonar.plugins.python.api.types.v2.PythonType; + +/** + * Utility class for extracting function parameter information. + * Shared between FastAPIPathParametersCheck and DjangoViewUrlParametersCheck. + */ +public final class FunctionParameterUtils { + + private FunctionParameterUtils() { + // Utility class + } + + /** + * Information about a function's parameters for path/URL parameter checks. + */ + public record FunctionParameterInfo(Set allParams, Set positionalOnlyParams, boolean hasVariadicKeyword) { + public static FunctionParameterInfo empty() { + return new FunctionParameterInfo(Set.of(), Set.of(), false); + } + + public boolean isMissingFromSignature(String param) { + return !allParams.contains(param) && !hasVariadicKeyword; + } + } + + public static FunctionParameterInfo extractFunctionParameters(FunctionDef functionDef) { + return getFunctionType(functionDef) + .map(FunctionParameterUtils::buildParameterInfo) + .orElse(FunctionParameterInfo.empty()); + } + + public static Optional getFunctionType(FunctionDef functionDef) { + PythonType functionType = functionDef.name().typeV2(); + if (functionType instanceof FunctionType funcType) { + return Optional.of(funcType); + } + return Optional.empty(); + } + + private static FunctionParameterInfo buildParameterInfo(FunctionType functionType) { + Set allParams = new HashSet<>(); + Set positionalOnlyParams = new HashSet<>(); + boolean hasVariadicKeyword = functionType.parameters().stream() + .anyMatch(param -> param.isVariadic() && param.isKeywordVariadic()); + + functionType.parameters().stream() + .filter(param -> !param.isVariadic()) + .forEach(param -> addParameter(param, allParams, positionalOnlyParams)); + + return new FunctionParameterInfo(allParams, positionalOnlyParams, hasVariadicKeyword); + } + + private static void addParameter(ParameterV2 param, Set allParams, Set positionalOnlyParams) { + String paramName = param.name(); + if (paramName != null) { + allParams.add(paramName); + if (param.isPositionalOnly()) { + positionalOnlyParams.add(paramName); + } + } + } +} diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/DjangoViewInfo.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/DjangoViewInfo.java new file mode 100644 index 000000000..4ccf88be5 --- /dev/null +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/DjangoViewInfo.java @@ -0,0 +1,45 @@ +/* + * SonarQube Python Plugin + * Copyright (C) 2011-2025 SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.plugins.python.api; + +import java.util.HashSet; +import java.util.Set; + +/** + * Holds metadata about a Django view function discovered during project analysis. + */ +public record DjangoViewInfo(Set urlPatterns) { + + public DjangoViewInfo { + // Defensive copy to ensure immutability + urlPatterns = Set.copyOf(urlPatterns); + } + + public static DjangoViewInfo withoutPatterns() { + return new DjangoViewInfo(Set.of()); + } + + public static DjangoViewInfo withPattern(String urlPattern) { + return new DjangoViewInfo(Set.of(urlPattern)); + } + + public DjangoViewInfo addPattern(String urlPattern) { + var newPatterns = new HashSet<>(urlPatterns); + newPatterns.add(urlPattern); + return new DjangoViewInfo(newPatterns); + } +} diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonInputFileContext.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonInputFileContext.java index e3321c73d..8494f4754 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonInputFileContext.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonInputFileContext.java @@ -74,4 +74,8 @@ public File workingDirectory() { public SonarProduct sonarProduct() { return sonarProduct; } + + protected ProjectLevelSymbolTable projectLevelSymbolTable() { + return projectLevelSymbolTable; + } } diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonVisitorContext.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonVisitorContext.java index 3e00fb1d8..0c16653a3 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonVisitorContext.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonVisitorContext.java @@ -124,6 +124,10 @@ public CallGraph callGraph() { return callGraph; } + public Optional getDjangoViewInfo(String fqn) { + return projectLevelSymbolTable().getDjangoViewInfo(fqn); + } + public static class Builder { private final PythonFile pythonFile; private final FileInput rootTree; diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/SubscriptionContext.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/SubscriptionContext.java index 273eecd58..38ae5a3b0 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/SubscriptionContext.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/SubscriptionContext.java @@ -19,6 +19,7 @@ import com.google.common.annotations.Beta; import java.io.File; import java.util.Collection; +import java.util.Optional; import java.util.Set; import javax.annotation.CheckForNull; import javax.annotation.Nullable; @@ -76,4 +77,11 @@ public interface SubscriptionContext { ProjectConfiguration projectConfiguration(); CallGraph callGraph(); + + /** + * Returns Django view information for the given fully qualified function name. + * @param fqn the fully qualified name of a function + * @return Optional containing DjangoViewInfo if the function is a Django view, empty otherwise + */ + Optional getDjangoViewInfo(String fqn); } diff --git a/python-frontend/src/main/java/org/sonar/python/SubscriptionVisitor.java b/python-frontend/src/main/java/org/sonar/python/SubscriptionVisitor.java index a87027018..ddd245bec 100644 --- a/python-frontend/src/main/java/org/sonar/python/SubscriptionVisitor.java +++ b/python-frontend/src/main/java/org/sonar/python/SubscriptionVisitor.java @@ -25,10 +25,12 @@ import java.util.EnumMap; import java.util.HashMap; import java.util.List; +import java.util.Optional; import java.util.Set; import java.util.function.Consumer; import javax.annotation.CheckForNull; import javax.annotation.Nullable; +import org.sonar.plugins.python.api.DjangoViewInfo; import org.sonar.plugins.python.api.IssueLocation; import org.sonar.plugins.python.api.LocationInFile; import org.sonar.plugins.python.api.ProjectPythonVersion; @@ -207,5 +209,10 @@ public RegexParseResult regexForStringElement(StringElement stringElement, FlagS return regexCache.computeIfAbsent(stringElement.hashCode() + "-" + flagSet.getMask(), s -> new RegexParser(new PythonAnalyzerRegexSource(stringElement), flagSet).parse()); } + + @Override + public Optional getDjangoViewInfo(String fqn) { + return pythonVisitorContext.getDjangoViewInfo(fqn); + } } } diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/FunctionSymbolImpl.java b/python-frontend/src/main/java/org/sonar/python/semantic/FunctionSymbolImpl.java index 2b0b0426f..305605a3a 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/FunctionSymbolImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/FunctionSymbolImpl.java @@ -24,6 +24,7 @@ import java.util.Optional; import javax.annotation.CheckForNull; import javax.annotation.Nullable; +import org.sonar.plugins.python.api.DjangoViewInfo; import org.sonar.plugins.python.api.LocationInFile; import org.sonar.plugins.python.api.PythonFile; import org.sonar.plugins.python.api.symbols.FunctionSymbol; @@ -64,7 +65,8 @@ public class FunctionSymbolImpl extends SymbolImpl implements FunctionSymbol { private Symbol owner; private static final String CLASS_METHOD_DECORATOR = "classmethod"; private static final String STATIC_METHOD_DECORATOR = "staticmethod"; - private boolean isDjangoView = false; + @Nullable + private DjangoViewInfo djangoViewInfo = null; private boolean hasReadDeclaredReturnType = false; FunctionSymbolImpl(FunctionDef functionDef, @Nullable String fullyQualifiedName, PythonFile pythonFile) { @@ -121,7 +123,6 @@ public FunctionSymbolImpl(SymbolsProtos.FunctionSymbol functionSymbolProto, @Nul functionDefinitionLocation = null; declaredReturnType = anyType(); isStub = true; - isDjangoView = false; this.validForPythonVersions = new HashSet<>(validFor); } @@ -168,7 +169,7 @@ public void addParameter(ParameterImpl parameter) { declaredReturnType = functionSymbolImpl.declaredReturnType(); } isStub = functionSymbol.isStub(); - isDjangoView = functionSymbolImpl.isDjangoView(); + djangoViewInfo = functionSymbolImpl.djangoViewInfo; validForPythonVersions = functionSymbolImpl.validForPythonVersions; } @@ -361,11 +362,11 @@ public void setOwner(Symbol owner) { } public boolean isDjangoView() { - return isDjangoView; + return djangoViewInfo != null; } - public void setIsDjangoView(boolean isDjangoView) { - this.isDjangoView = isDjangoView; + public void setDjangoViewInfo(@Nullable DjangoViewInfo djangoViewInfo) { + this.djangoViewInfo = djangoViewInfo; } public static class ParameterImpl implements Parameter { diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/ProjectLevelSymbolTable.java b/python-frontend/src/main/java/org/sonar/python/semantic/ProjectLevelSymbolTable.java index ef11777ab..419a5689c 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/ProjectLevelSymbolTable.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/ProjectLevelSymbolTable.java @@ -22,12 +22,14 @@ import java.util.HashSet; import java.util.Map; import java.util.Objects; +import java.util.Optional; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; import java.util.stream.Collectors; import javax.annotation.CheckForNull; import javax.annotation.Nullable; +import org.sonar.plugins.python.api.DjangoViewInfo; import org.sonar.plugins.python.api.PythonFile; import org.sonar.plugins.python.api.TriBool; import org.sonar.plugins.python.api.symbols.Symbol; @@ -36,6 +38,8 @@ import org.sonar.plugins.python.api.tree.CallExpression; import org.sonar.plugins.python.api.tree.FileInput; import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.StringLiteral; +import org.sonar.plugins.python.api.tree.Tree; import org.sonar.plugins.python.api.types.v2.FunctionType; import org.sonar.plugins.python.api.types.v2.PythonType; import org.sonar.plugins.python.api.types.v2.UnknownType; @@ -58,7 +62,7 @@ public class ProjectLevelSymbolTable { private final PythonTypeToDescriptorConverter pythonTypeToDescriptorConverter; private final Map> globalDescriptorsByModuleName; private Map globalDescriptorsByFQN; - private final Set djangoViewsFQN; + private final Map djangoViews; private final Map> importsByModule; private final Set projectBasePackages; private TypeShedDescriptorsProvider typeShedDescriptorsProvider = null; @@ -82,7 +86,7 @@ public static ProjectLevelSymbolTable from(Map> globalDe private ProjectLevelSymbolTable() { this.pythonTypeToDescriptorConverter = new PythonTypeToDescriptorConverter(); this.globalDescriptorsByModuleName = new ConcurrentHashMap<>(); - this.djangoViewsFQN = new HashSet<>(); + this.djangoViews = new ConcurrentHashMap<>(); this.importsByModule = new ConcurrentHashMap<>(); this.projectBasePackages = new HashSet<>(); } @@ -115,7 +119,7 @@ public void addModule(FileInput fileInput, String packageName, PythonFile python globalDescriptorsByModuleName.merge(fullyQualifiedModuleName, moduleDescriptors, ProjectLevelSymbolTable::mergeDescriptors); addModuleToGlobalSymbolsByFQN(moduleDescriptors); - DjangoViewsVisitor djangoViewsVisitor = new DjangoViewsVisitor(fullyQualifiedModuleName); + DjangoViewsVisitor djangoViewsVisitor = new DjangoViewsVisitor(); fileInput.accept(djangoViewsVisitor); } @@ -215,12 +219,15 @@ public Set descriptorsForModule(String moduleName) { return globalDescriptorsByModuleName.get(moduleName); } - private synchronized void addDjangoView(String fqn) { - djangoViewsFQN.add(fqn); + public boolean isDjangoView(@Nullable String fqn) { + return fqn != null && djangoViews.containsKey(fqn); } - public boolean isDjangoView(@Nullable String fqn) { - return djangoViewsFQN.contains(fqn); + public Optional getDjangoViewInfo(@Nullable String fqn) { + if (fqn == null) { + return Optional.empty(); + } + return Optional.ofNullable(djangoViews.get(fqn)); } public synchronized void addProjectPackage(String projectPackage) { @@ -274,43 +281,82 @@ public Collection stubFilesSymbols() { private class DjangoViewsVisitor extends BaseTreeVisitor { - String fullyQualifiedModuleName; private TypeCheckBuilder confPathCall = null; private TypeCheckBuilder pathCall = null; - - public DjangoViewsVisitor(String fullyQualifiedModuleName) { - this.fullyQualifiedModuleName = fullyQualifiedModuleName; - } + private TypeCheckBuilder confRePathCall = null; + private TypeCheckBuilder rePathCall = null; @Override public void visitFileInput(FileInput fileInput) { TypeChecker typeChecker = new TypeChecker(new BasicTypeTable(new ProjectLevelTypeTable(ProjectLevelSymbolTable.this))); confPathCall = typeChecker.typeCheckBuilder().isTypeWithName("django.urls.conf.path"); pathCall = typeChecker.typeCheckBuilder().isTypeWithName("django.urls.path"); + confRePathCall = typeChecker.typeCheckBuilder().isTypeWithName("django.urls.conf.re_path"); + rePathCall = typeChecker.typeCheckBuilder().isTypeWithName("django.urls.re_path"); super.visitFileInput(fileInput); } @Override public void visitCallExpression(CallExpression callExpression) { super.visitCallExpression(callExpression); - if (isCallRegisteringDjangoView(callExpression)) { - RegularArgument viewArgument = nthArgumentOrKeyword(1, "view", callExpression.arguments()); - if (viewArgument != null) { - PythonType pythonType = viewArgument.expression().typeV2(); - if (pythonType instanceof UnknownType.UnresolvedImportType unresolvedImportType) { - String importPath = unresolvedImportType.importPath(); - addDjangoView(importPath); - } else if (pythonType instanceof FunctionType functionType) { - addDjangoView(functionType.fullyQualifiedName()); - } - } + if (!isCallRegisteringDjangoView(callExpression)) { + return; } + + extractViewFqnFromArgument(callExpression) + .ifPresent(fqn -> registerDjangoView(fqn, extractUrlPattern(callExpression))); + } + + private Optional extractViewFqnFromArgument(CallExpression callExpression) { + return extractArgument(callExpression, 1, "view") + .map(arg -> arg.expression().typeV2()) + .flatMap(this::extractFullyQualifiedName); + } + + private Optional extractArgument(CallExpression callExpression, int position, String name) { + return Optional.ofNullable(nthArgumentOrKeyword(position, name, callExpression.arguments())); + } + + private Optional extractFullyQualifiedName(PythonType pythonType) { + if (pythonType instanceof UnknownType.UnresolvedImportType unresolvedImportType) { + return Optional.of(unresolvedImportType.importPath()); + } else if (pythonType instanceof FunctionType functionType) { + return Optional.ofNullable(functionType.fullyQualifiedName()); + } + return Optional.empty(); + } + + private void registerDjangoView(String fqn, @Nullable String urlPattern) { + addDjangoView(fqn); + if (urlPattern != null) { + addDjangoViewUrlPattern(fqn, urlPattern); + } + } + + @CheckForNull + private String extractUrlPattern(CallExpression callExpression) { + return extractArgument(callExpression, 0, "route") + .filter(arg -> arg.expression().is(Tree.Kind.STRING_LITERAL)) + .map(arg -> ((StringLiteral) arg.expression()).trimmedQuotesValue()) + .orElse(null); } private boolean isCallRegisteringDjangoView(CallExpression callExpression) { TriBool isConfPathCall = confPathCall.check(callExpression.callee().typeV2()); TriBool isPathCall = pathCall.check(callExpression.callee().typeV2()); - return isConfPathCall.equals(TriBool.TRUE) || isPathCall.equals(TriBool.TRUE); + TriBool isConfRePathCall = confRePathCall.check(callExpression.callee().typeV2()); + TriBool isRePathCall = rePathCall.check(callExpression.callee().typeV2()); + return isConfPathCall.equals(TriBool.TRUE) || isPathCall.equals(TriBool.TRUE) + || isConfRePathCall.equals(TriBool.TRUE) || isRePathCall.equals(TriBool.TRUE); + } + + private void addDjangoView(String fqn) { + djangoViews.computeIfAbsent(fqn, k -> DjangoViewInfo.withoutPatterns()); + } + + private void addDjangoViewUrlPattern(String fqn, String urlPattern) { + djangoViews.compute(fqn, (k, existing) -> + existing == null ? DjangoViewInfo.withPattern(urlPattern) : existing.addPattern(urlPattern)); } } } diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/Scope.java b/python-frontend/src/main/java/org/sonar/python/semantic/Scope.java index 7f03dcbdb..1c380f18d 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/Scope.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/Scope.java @@ -114,7 +114,8 @@ void addFunctionSymbol(FunctionDef functionDef, @Nullable String fullyQualifiedN addBindingUsage(functionDef.name(), Usage.Kind.FUNC_DECLARATION, fullyQualifiedName); } else { FunctionSymbolImpl functionSymbol = new FunctionSymbolImpl(functionDef, fullyQualifiedName, pythonFile); - functionSymbol.setIsDjangoView(projectLevelSymbolTable.isDjangoView(fullyQualifiedName)); + projectLevelSymbolTable.getDjangoViewInfo(fullyQualifiedName) + .ifPresent(functionSymbol::setDjangoViewInfo); ((FunctionDefImpl) functionDef).setFunctionSymbol(functionSymbol); symbols.add(functionSymbol); symbolsByName.put(symbolName, functionSymbol); diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/ProjectLevelSymbolTableTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/ProjectLevelSymbolTableTest.java index 35611c299..914c96d75 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/ProjectLevelSymbolTableTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/ProjectLevelSymbolTableTest.java @@ -1263,4 +1263,91 @@ void hasModuleWithPrefix_detectsNamespacePackages() { assertThat(symbolTable.hasModuleWithPrefix("acme.ma")).isFalse(); } + @Test + void django_views_with_url_patterns() { + String[] urls = { + "from django.urls import path", + "import views", + "urlpatterns = [", + " path('article//', views.article_detail, name='article_detail'),", + " path('user//post//', views.user_post, name='user_post'),", + "]" + }; + + ProjectLevelSymbolTable projectSymbolTable = empty(); + projectSymbolTable.addModule(parseWithoutSymbols(urls), "", pythonFile("urls.py")); + + assertThat(projectSymbolTable.isDjangoView("views.article_detail")).isTrue(); + assertThat(projectSymbolTable.getDjangoViewInfo("views.article_detail")) + .isPresent() + .hasValueSatisfying(info -> assertThat(info.urlPatterns()).containsExactly("article//")); + + assertThat(projectSymbolTable.isDjangoView("views.user_post")).isTrue(); + assertThat(projectSymbolTable.getDjangoViewInfo("views.user_post")) + .isPresent() + .hasValueSatisfying(info -> assertThat(info.urlPatterns()).containsExactly("user//post//")); + } + + @Test + void django_views_with_empty_url_patterns() { + String[] urls = { + "from django.urls import path", + "import views", + "urlpatterns = [path('', views.no_pattern_view)]" + }; + + ProjectLevelSymbolTable projectSymbolTable = empty(); + projectSymbolTable.addModule(parseWithoutSymbols(urls), "", pythonFile("urls.py")); + + assertThat(projectSymbolTable.isDjangoView("views.no_pattern_view")).isTrue(); + assertThat(projectSymbolTable.getDjangoViewInfo("views.no_pattern_view")) + .isPresent() + .hasValueSatisfying(info -> assertThat(info.urlPatterns()).containsExactly("")); + } + + @Test + void django_views_with_non_string_route() { + // Test case where route argument is not a STRING_LITERAL + String[] urls = { + "from django.urls import path", + "import views", + "route_var = 'dynamic-route'", + "urlpatterns = [path(route_var, views.dynamic_view)]" + }; + + ProjectLevelSymbolTable projectSymbolTable = empty(); + projectSymbolTable.addModule(parseWithoutSymbols(urls), "", pythonFile("urls.py")); + + assertThat(projectSymbolTable.isDjangoView("views.dynamic_view")).isTrue(); + assertThat(projectSymbolTable.getDjangoViewInfo("views.dynamic_view")) + .isPresent() + .hasValueSatisfying(info -> assertThat(info.urlPatterns()).isEmpty()); + } + + @Test + void django_views_with_re_path() { + // Test re_path() with named groups + String[] urls = { + "from django.urls import re_path", + "import views", + "urlpatterns = [", + " re_path(r'^items/(?P\\d+)/$', views.item_detail),", + " re_path(r'^items/(?P\\d+)/(?P[\\w-]+)/$', views.item_with_slug),", + "]" + }; + + ProjectLevelSymbolTable projectSymbolTable = empty(); + projectSymbolTable.addModule(parseWithoutSymbols(urls), "", pythonFile("urls.py")); + + assertThat(projectSymbolTable.isDjangoView("views.item_detail")).isTrue(); + assertThat(projectSymbolTable.getDjangoViewInfo("views.item_detail")) + .isPresent() + .hasValueSatisfying(info -> assertThat(info.urlPatterns()).containsExactly("^items/(?P\\d+)/$")); + + assertThat(projectSymbolTable.isDjangoView("views.item_with_slug")).isTrue(); + assertThat(projectSymbolTable.getDjangoViewInfo("views.item_with_slug")) + .isPresent() + .hasValueSatisfying(info -> assertThat(info.urlPatterns()).containsExactly("^items/(?P\\d+)/(?P[\\w-]+)/$")); + } + } From 5066ddf2ad4eb8ea5a1f553e333506bec04c60be Mon Sep 17 00:00:00 2001 From: Sebastian Zumbrunn Date: Mon, 2 Mar 2026 17:23:59 +0100 Subject: [PATCH 011/322] SONARPY-3844 Create ruling-diff-comment action (#895) Co-authored-by: Thomas Serre <118730793+thomas-serre-sonarsource@users.noreply.github.com> GitOrigin-RevId: 45dc70b3e7bfc393134a26919308e5f888ef1569 --- .../actions/ruling-diff-comment/action.yml | 38 ++ .../ruling-diff-comment/pyproject.toml | 9 + .../ruling-diff-comment/ruling_diff.py | 74 +++ .../ruling-diff-comment/ruling_diff_core.py | 41 ++ .../ruling_diff_core_lib/__init__.py | 41 ++ .../ruling_diff_core_lib/comment_rendering.py | 104 ++++ .../models_and_constants.py | 71 +++ .../ruling_diff_core_lib/ruling_diff_logic.py | 146 +++++ .../snippet_generation.py | 153 ++++++ .../ruling-diff-comment/ruling_diff_io.py | 332 ++++++++++++ .../ruling-diff-comment/test_ruling_diff.py | 497 ++++++++++++++++++ .github/actions/ruling-diff-comment/uv.lock | 8 + 12 files changed, 1514 insertions(+) create mode 100644 .github/actions/ruling-diff-comment/action.yml create mode 100644 .github/actions/ruling-diff-comment/pyproject.toml create mode 100644 .github/actions/ruling-diff-comment/ruling_diff.py create mode 100644 .github/actions/ruling-diff-comment/ruling_diff_core.py create mode 100644 .github/actions/ruling-diff-comment/ruling_diff_core_lib/__init__.py create mode 100644 .github/actions/ruling-diff-comment/ruling_diff_core_lib/comment_rendering.py create mode 100644 .github/actions/ruling-diff-comment/ruling_diff_core_lib/models_and_constants.py create mode 100644 .github/actions/ruling-diff-comment/ruling_diff_core_lib/ruling_diff_logic.py create mode 100644 .github/actions/ruling-diff-comment/ruling_diff_core_lib/snippet_generation.py create mode 100644 .github/actions/ruling-diff-comment/ruling_diff_io.py create mode 100644 .github/actions/ruling-diff-comment/test_ruling_diff.py create mode 100644 .github/actions/ruling-diff-comment/uv.lock diff --git a/.github/actions/ruling-diff-comment/action.yml b/.github/actions/ruling-diff-comment/action.yml new file mode 100644 index 000000000..010e838ad --- /dev/null +++ b/.github/actions/ruling-diff-comment/action.yml @@ -0,0 +1,38 @@ +name: 'Ruling Diff Comment' +description: 'Posts a human-readable summary of ruling file changes on PRs' + +inputs: + pr-number: + description: 'Pull request number' + required: true + repository: + description: 'owner/repo' + required: true + base-sha: + description: 'Base commit SHA for diff' + required: true + head-sha: + description: 'Head commit SHA for diff' + required: true + +runs: + using: 'composite' + steps: + - name: Run unit tests + shell: bash + run: uv run --project "${{ github.action_path }}" python -m unittest discover -v -s "${{ github.action_path }}" -p "test_ruling_diff.py" + + - name: Generate and post ruling diff comment + shell: bash + env: + GH_TOKEN: ${{ env.GH_TOKEN }} + PR_NUMBER: ${{ inputs.pr-number }} + REPOSITORY: ${{ inputs.repository }} + BASE_SHA: ${{ inputs.base-sha }} + HEAD_SHA: ${{ inputs.head-sha }} + run: | + uv run --project "${{ github.action_path }}" python "${{ github.action_path }}/ruling_diff.py" \ + --pr-number "$PR_NUMBER" \ + --repository "$REPOSITORY" \ + --base-sha "$BASE_SHA" \ + --head-sha "$HEAD_SHA" diff --git a/.github/actions/ruling-diff-comment/pyproject.toml b/.github/actions/ruling-diff-comment/pyproject.toml new file mode 100644 index 000000000..89b0ba651 --- /dev/null +++ b/.github/actions/ruling-diff-comment/pyproject.toml @@ -0,0 +1,9 @@ +[project] +name = "ruling-diff-comment" +version = "0.1.0" +description = "GitHub Action helper for ruling diff comments" +requires-python = ">=3.10" +dependencies = [] + +[tool.uv] +package = false diff --git a/.github/actions/ruling-diff-comment/ruling_diff.py b/.github/actions/ruling-diff-comment/ruling_diff.py new file mode 100644 index 000000000..f4468b8a9 --- /dev/null +++ b/.github/actions/ruling-diff-comment/ruling_diff.py @@ -0,0 +1,74 @@ +from __future__ import annotations + +import argparse +import logging +import os +import sys + +from ruling_diff_core import build_rule_diffs, format_comment +from ruling_diff_io import ( + GitHubActionIO, + get_changed_ruling_files, + post_or_update_comment, +) + + +def configure_logging() -> None: + level = logging.DEBUG if os.environ.get("RUNNER_DEBUG") else logging.INFO + logging.basicConfig(level=level, format="%(asctime)s %(levelname)s %(message)s") + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser( + description="Generate and post ruling diff comment" + ) + parser.add_argument("--pr-number", required=True) + parser.add_argument("--repository", required=True) + parser.add_argument("--base-sha", required=True) + parser.add_argument("--head-sha", required=True) + args = parser.parse_args() + if "/" not in args.repository: + raise ValueError("--repository must be in owner/repo format") + return args + + +def has_required_context(args: argparse.Namespace) -> bool: + return bool( + args.pr_number.strip() and args.base_sha.strip() and args.head_sha.strip() + ) + + +def main() -> None: + configure_logging() + args = parse_args() + if not has_required_context(args): + logging.info("Missing pr/base/head arguments. Skipping ruling diff comment.") + return + + changed_files = get_changed_ruling_files(args.base_sha, args.head_sha) + if not changed_files: + logging.info("No changed ruling json files found. Nothing to do.") + return + + logging.info("Found %d changed ruling json files", len(changed_files)) + io = GitHubActionIO() + rule_diffs = build_rule_diffs( + changed_files, + args.base_sha, + args.head_sha, + io, + ) + if not rule_diffs: + logging.info("Changed files have no issue deltas. No comment will be posted.") + return + + comment = format_comment(rule_diffs) + post_or_update_comment(args.pr_number, args.repository, comment) + + +if __name__ == "__main__": + try: + main() + except Exception as exc: + logging.error("Failed to generate ruling diff comment: %s", exc) + sys.exit(1) diff --git a/.github/actions/ruling-diff-comment/ruling_diff_core.py b/.github/actions/ruling-diff-comment/ruling_diff_core.py new file mode 100644 index 000000000..c8e633ea0 --- /dev/null +++ b/.github/actions/ruling-diff-comment/ruling_diff_core.py @@ -0,0 +1,41 @@ +from ruling_diff_core_lib.comment_rendering import format_comment +from ruling_diff_core_lib.models_and_constants import ( + COMMENT_MARKER, + COMMENT_SOFT_LIMIT, + EXPECTED_RULING_ROOT, + IssueDiff, + RuleDiff, + Snippet, +) +from ruling_diff_core_lib.ruling_diff_logic import ( + build_rule_diffs, + diff_ruling_jsons, + parse_ruling_path, + parse_ruling_relative_path, + parse_rule_filename, + strip_project_key, +) +from ruling_diff_core_lib.snippet_generation import ( + render_file_level_snippet, + render_line_snippet, + render_snippet, +) + +__all__ = [ + "COMMENT_MARKER", + "COMMENT_SOFT_LIMIT", + "EXPECTED_RULING_ROOT", + "IssueDiff", + "RuleDiff", + "Snippet", + "build_rule_diffs", + "diff_ruling_jsons", + "format_comment", + "parse_ruling_path", + "parse_ruling_relative_path", + "parse_rule_filename", + "render_file_level_snippet", + "render_line_snippet", + "render_snippet", + "strip_project_key", +] diff --git a/.github/actions/ruling-diff-comment/ruling_diff_core_lib/__init__.py b/.github/actions/ruling-diff-comment/ruling_diff_core_lib/__init__.py new file mode 100644 index 000000000..c8e633ea0 --- /dev/null +++ b/.github/actions/ruling-diff-comment/ruling_diff_core_lib/__init__.py @@ -0,0 +1,41 @@ +from ruling_diff_core_lib.comment_rendering import format_comment +from ruling_diff_core_lib.models_and_constants import ( + COMMENT_MARKER, + COMMENT_SOFT_LIMIT, + EXPECTED_RULING_ROOT, + IssueDiff, + RuleDiff, + Snippet, +) +from ruling_diff_core_lib.ruling_diff_logic import ( + build_rule_diffs, + diff_ruling_jsons, + parse_ruling_path, + parse_ruling_relative_path, + parse_rule_filename, + strip_project_key, +) +from ruling_diff_core_lib.snippet_generation import ( + render_file_level_snippet, + render_line_snippet, + render_snippet, +) + +__all__ = [ + "COMMENT_MARKER", + "COMMENT_SOFT_LIMIT", + "EXPECTED_RULING_ROOT", + "IssueDiff", + "RuleDiff", + "Snippet", + "build_rule_diffs", + "diff_ruling_jsons", + "format_comment", + "parse_ruling_path", + "parse_ruling_relative_path", + "parse_rule_filename", + "render_file_level_snippet", + "render_line_snippet", + "render_snippet", + "strip_project_key", +] diff --git a/.github/actions/ruling-diff-comment/ruling_diff_core_lib/comment_rendering.py b/.github/actions/ruling-diff-comment/ruling_diff_core_lib/comment_rendering.py new file mode 100644 index 000000000..6eba3c594 --- /dev/null +++ b/.github/actions/ruling-diff-comment/ruling_diff_core_lib/comment_rendering.py @@ -0,0 +1,104 @@ +from __future__ import annotations + +from ruling_diff_core_lib.models_and_constants import ( + COMMENT_MARKER, + COMMENT_SOFT_LIMIT, + RuleDiff, + Snippet, +) + + +def format_comment( + rule_diffs: list[RuleDiff], soft_limit: int = COMMENT_SOFT_LIMIT +) -> str: + if not rule_diffs: + return "\n".join( + [ + COMMENT_MARKER, + "## Ruling Diff Summary", + "", + "No issue deltas detected." + ] + ) + comment = format_comment_header(rule_diffs) + return append_rule_sections_with_soft_limit(comment, rule_diffs, soft_limit) + + +def format_comment_header(rule_diffs: list[RuleDiff]) -> str: + added = sum(len(diff.added_lines) for rule in rule_diffs for diff in rule.file_diffs) + removed = sum( + len(diff.removed_lines) for rule in rule_diffs for diff in rule.file_diffs + ) + return "\n".join( + [ + COMMENT_MARKER, + "## Ruling Diff Summary", + "", + f"Detected changes in {len(rule_diffs)} rule files: {removed} issues removed, {added} issues added.", + "", + ] + ) + + +def append_rule_sections_with_soft_limit( + comment: str, rule_diffs: list[RuleDiff], soft_limit: int +) -> str: + sections = [format_rule_section(rule_diff) for rule_diff in rule_diffs] + accepted_sections: list[str] = [] + truncated_count = 0 + for index, section in enumerate(sections): + candidate = comment + "\n\n".join(accepted_sections + [section]) + if len(candidate) > soft_limit: + truncated_count = len(sections) - index + break + accepted_sections.append(section) + if accepted_sections: + comment += "\n\n".join(accepted_sections) + if truncated_count: + comment = append_truncation_notice(comment, truncated_count, bool(accepted_sections)) + return comment + + +def append_truncation_notice(comment: str, count: int, has_sections: bool) -> str: + separator = "\n\n" if has_sections else "" + return ( + comment + + separator + + f"... and {count} more rules with changes (diff too large to display fully)" + ) + + +def format_rule_section(rule_diff: RuleDiff) -> str: + lines = ["
    ", f"{format_rule_summary(rule_diff)}", ""] + if not rule_diff.snippets: + lines.append("No source snippets available for this rule.") + else: + for snippet in rule_diff.snippets: + lines.append(format_snippet_block(snippet)) + lines.append("") + lines.append("
    ") + return "\n".join(lines) + + +def format_rule_summary(rule_diff: RuleDiff) -> str: + removed = sum(len(diff.removed_lines) for diff in rule_diff.file_diffs) + added = sum(len(diff.added_lines) for diff in rule_diff.file_diffs) + summary_parts = [ + f"{rule_diff.rule_key} ({rule_diff.repo}) on {rule_diff.project}", + f"{removed} issues removed, {added} issues added", + ] + if rule_diff.is_new_file: + summary_parts.append("new ruling file") + if rule_diff.is_deleted_file: + summary_parts.append("deleted ruling file") + return " - ".join(summary_parts) + + +def format_snippet_block(snippet: Snippet) -> str: + return "\n".join([format_snippet_header(snippet), "```python", snippet.body, "```"]) + + +def format_snippet_header(snippet: Snippet) -> str: + label = "Added" if snippet.change_kind == "added" else "Removed" + location = "file-level" if snippet.line_number == 0 else f"line {snippet.line_number}" + return f"**{label}** `{snippet.file_path}` ({location})" diff --git a/.github/actions/ruling-diff-comment/ruling_diff_core_lib/models_and_constants.py b/.github/actions/ruling-diff-comment/ruling_diff_core_lib/models_and_constants.py new file mode 100644 index 000000000..d5e5339f5 --- /dev/null +++ b/.github/actions/ruling-diff-comment/ruling_diff_core_lib/models_and_constants.py @@ -0,0 +1,71 @@ +from __future__ import annotations + +from dataclasses import dataclass +from typing import Protocol + +RulingJson = dict[str, list[int]] +OptionalRulingJson = RulingJson | None +SourceLines = list[str] +OptionalSourceLines = SourceLines | None +SourceCache = dict[tuple[str, str], OptionalSourceLines] + + +class RulingDiffIO(Protocol): + def load_json_at_ref(self, path: str, ref: str) -> OptionalRulingJson: + ... + + def load_text_at_ref(self, path: str, ref: str) -> str | None: + ... + + def resolve_source_path(self, project: str, file_path: str) -> str: + ... + +EXPECTED_RULING_ROOT = ( + "private/its-enterprise/ruling/src/test/resources/expected_ruling" +) +COMMENT_MARKER = "" +COMMENT_SOFT_LIMIT = 60000 +SNIPPET_CONTEXT = 5 +MAX_SNIPPETS_PER_FILE = 3 +MAX_SNIPPETS_PER_RULE = 15 + +PROJECT_SOURCE_OVERRIDES = { + "buildbot": "private/its-enterprise/sources_ruling/buildbot-0.8.6p1", + "buildbot-slave": "private/its-enterprise/sources_ruling/buildbot-slave-0.8.6p1", + "django": "private/its-enterprise/sources_ruling/django-2.2.3", + "django-cms": "private/its-enterprise/sources_ruling/django-cms-3.7.1", + "docker-compose": "private/its-enterprise/sources_ruling/docker-compose-1.24.1", + "mypy": "private/its-enterprise/sources_ruling/mypy-0.782", + "numpy": "private/its-enterprise/sources_ruling/numpy-1.16.4", + "tornado": "private/its-enterprise/sources_ruling/tornado-2.3", + "twisted": "private/its-enterprise/sources_ruling/twisted-12.1.0", + "sources_internal_ruling": "private/its-enterprise/sources_internal_ruling", + "namespace_basic": "private/its-enterprise/sources_internal_namespace_ruling/basic_namespace", + "namespace_mixed": "private/its-enterprise/sources_internal_namespace_ruling/mixed_namespace", +} + + +@dataclass(frozen=True) +class IssueDiff: + file_path: str + added_lines: list[int] + removed_lines: list[int] + + +@dataclass(frozen=True) +class Snippet: + file_path: str + line_number: int + change_kind: str + body: str + + +@dataclass(frozen=True) +class RuleDiff: + project: str + repo: str + rule_key: str + file_diffs: list[IssueDiff] + snippets: list[Snippet] + is_new_file: bool + is_deleted_file: bool diff --git a/.github/actions/ruling-diff-comment/ruling_diff_core_lib/ruling_diff_logic.py b/.github/actions/ruling-diff-comment/ruling_diff_core_lib/ruling_diff_logic.py new file mode 100644 index 000000000..e958ae146 --- /dev/null +++ b/.github/actions/ruling-diff-comment/ruling_diff_core_lib/ruling_diff_logic.py @@ -0,0 +1,146 @@ +from __future__ import annotations + +from collections import Counter +from pathlib import PurePosixPath + +from ruling_diff_core_lib.models_and_constants import ( + EXPECTED_RULING_ROOT, + IssueDiff, + OptionalRulingJson, + RulingDiffIO, + RuleDiff, + RulingJson, + SourceCache, + Snippet, +) +from ruling_diff_core_lib.snippet_generation import build_snippets_for_rule + + +def parse_ruling_path(path: str) -> tuple[str, str, str]: + prefix = f"{EXPECTED_RULING_ROOT}/" + if not path.startswith(prefix): + raise ValueError(f"Unexpected ruling path outside expected root: {path}") + relative_path = path[len(prefix) :] + project, filename = parse_ruling_relative_path(relative_path) + repository, rule_key = parse_rule_filename(filename) + return project, repository, rule_key + + +def parse_ruling_relative_path(relative_path: str) -> tuple[str, str]: + parts = PurePosixPath(relative_path).parts + if len(parts) != 2: + raise ValueError( + f"Expected '/-.json' path, got: {relative_path}" + ) + return parts[0], parts[1] + + +def parse_rule_filename(filename: str) -> tuple[str, str]: + if not filename.endswith(".json"): + raise ValueError(f"Expected json filename, got: {filename}") + basename = filename[:-5] + if "-" not in basename: + raise ValueError(f"Expected '-.json', got: {filename}") + repository, rule_key = basename.rsplit("-", 1) + if not repository: + raise ValueError(f"Missing repo in filename: {filename}") + if not rule_key.startswith("S") or not rule_key[1:].isdigit(): + raise ValueError(f"Invalid rule key in filename: {filename}") + return repository, rule_key + + +def strip_project_key(key: str) -> str: + return key.split(":", 1)[1] if ":" in key else key + + +def diff_ruling_jsons( + old: OptionalRulingJson, new: OptionalRulingJson +) -> list[IssueDiff]: + old_map = old or {} + new_map = new or {} + return [ + issue_diff + for issue_diff in ( + diff_single_file_key(key, old_map, new_map) + for key in sorted(set(old_map) | set(new_map)) + ) + if issue_diff is not None + ] + + +def diff_single_file_key( + key: str, old_map: RulingJson, new_map: RulingJson +) -> IssueDiff | None: + old_counter = Counter(old_map.get(key, [])) + new_counter = Counter(new_map.get(key, [])) + added_lines: list[int] = expand_line_counter(new_counter - old_counter) + removed_lines: list[int] = expand_line_counter(old_counter - new_counter) + if not added_lines and not removed_lines: + return None + return IssueDiff( + file_path=strip_project_key(key), + added_lines=added_lines, + removed_lines=removed_lines, + ) + + +def expand_line_counter(counter: Counter[int]) -> list[int]: + line_numbers: list[int] = [] + for line_number in sorted(counter): + line_numbers.extend([line_number] * counter[line_number]) + return line_numbers + + +def build_rule_diffs( + changed_files: list[str], + base_sha: str, + head_sha: str, + io: RulingDiffIO, +) -> list[RuleDiff]: + source_cache: SourceCache = {} + diffs = [ + build_rule_diff_for_file( + path, + base_sha, + head_sha, + source_cache, + io, + ) + for path in sorted(changed_files) + ] + return sorted( + [rule_diff for rule_diff in diffs if rule_diff is not None], + key=lambda diff: (diff.project, diff.repo, diff.rule_key), + ) + + +def build_rule_diff_for_file( + path: str, + base_sha: str, + head_sha: str, + source_cache: SourceCache, + io: RulingDiffIO, +) -> RuleDiff | None: + project, repository, rule_key = parse_ruling_path(path) + old_json: OptionalRulingJson = io.load_json_at_ref(path, base_sha) + new_json: OptionalRulingJson = io.load_json_at_ref(path, head_sha) + file_diffs: list[IssueDiff] = diff_ruling_jsons(old_json, new_json) + if not file_diffs: + return None + snippets: list[Snippet] = build_snippets_for_rule( + project, + file_diffs, + source_cache, + base_sha, + head_sha, + io, + ) + return RuleDiff( + project=project, + repo=repository, + rule_key=rule_key, + file_diffs=file_diffs, + snippets=snippets, + is_new_file=old_json is None, + is_deleted_file=new_json is None, + ) diff --git a/.github/actions/ruling-diff-comment/ruling_diff_core_lib/snippet_generation.py b/.github/actions/ruling-diff-comment/ruling_diff_core_lib/snippet_generation.py new file mode 100644 index 000000000..40e3a1f82 --- /dev/null +++ b/.github/actions/ruling-diff-comment/ruling_diff_core_lib/snippet_generation.py @@ -0,0 +1,153 @@ +from __future__ import annotations + +from ruling_diff_core_lib.models_and_constants import ( + IssueDiff, + MAX_SNIPPETS_PER_FILE, + MAX_SNIPPETS_PER_RULE, + SNIPPET_CONTEXT, + OptionalSourceLines, + RulingDiffIO, + Snippet, + SourceCache, + SourceLines, +) + + +def unique_line_numbers_preserving_order(lines: list[int]) -> list[int]: + return list(dict.fromkeys(lines)) + + +def render_snippet( + lines: OptionalSourceLines, issue_line: int, context: int = SNIPPET_CONTEXT +) -> str: + if lines is None: + return "(source file not found at this revision)" + if issue_line == 0: + return render_file_level_snippet(lines, context) + return render_line_snippet(lines, issue_line, context) + + +def render_file_level_snippet(lines: SourceLines, context: int) -> str: + if not lines: + return ">>> FILE-LEVEL ISSUE\n(empty file)" + end = min(len(lines), 1 + (2 * context)) + content = [f" {index:>6} | {lines[index - 1]}" for index in range(1, end + 1)] + return "\n".join([">>> FILE-LEVEL ISSUE", *content]) + + +def render_line_snippet(lines: SourceLines, issue_line: int, context: int) -> str: + if not lines: + return f">>> ISSUE HERE (line {issue_line})\n(empty file)" + clamped_line = max(1, min(issue_line, len(lines))) + prefix = [] + if issue_line != clamped_line: + prefix.append( + f"(requested line {issue_line} not present, showing closest line {clamped_line})" + ) + body = render_line_window(lines, clamped_line, context) + return "\n".join(prefix + body) + + +def render_line_window(lines: SourceLines, center_line: int, context: int) -> list[str]: + start = max(1, center_line - context) + end = min(len(lines), center_line + context) + rendered: list[str] = [] + for number in range(start, end + 1): + marker = ">>>" if number == center_line else " " + rendered.append(f"{marker} {number:>6} | {lines[number - 1]}") + return rendered + + +def build_snippets_for_rule( + project: str, + file_diffs: list[IssueDiff], + source_cache: SourceCache, + base_sha: str, + head_sha: str, + io: RulingDiffIO, +) -> list[Snippet]: + snippets: list[Snippet] = [] + for file_diff in file_diffs: + snippets.extend( + collect_snippets_for_file( + project=project, + file_diff=file_diff, + source_cache=source_cache, + base_sha=base_sha, + head_sha=head_sha, + io=io, + ) + ) + if len(snippets) >= MAX_SNIPPETS_PER_RULE: + break + return snippets[:MAX_SNIPPETS_PER_RULE] + + +def collect_snippets_for_file( + *, + project: str, + file_diff: IssueDiff, + source_cache: SourceCache, + base_sha: str, + head_sha: str, + io: RulingDiffIO, +) -> list[Snippet]: + snippets: list[Snippet] = [] + for change_kind, lines in ( + ("removed", unique_line_numbers_preserving_order(file_diff.removed_lines)), + ("added", unique_line_numbers_preserving_order(file_diff.added_lines)), + ): + for line_number in lines[:MAX_SNIPPETS_PER_FILE]: + snippets.append( + create_issue_snippet( + project=project, + file_path=file_diff.file_path, + line_number=line_number, + change_kind=change_kind, + source_cache=source_cache, + base_sha=base_sha, + head_sha=head_sha, + io=io, + ) + ) + return snippets + + +def create_issue_snippet( + *, + project: str, + file_path: str, + line_number: int, + change_kind: str, + source_cache: SourceCache, + base_sha: str, + head_sha: str, + io: RulingDiffIO, +) -> Snippet: + ref = head_sha if change_kind == "added" else base_sha + source_path = io.resolve_source_path(project, file_path) + lines = load_source_lines_with_cache(source_cache, ref, source_path, io) + body = ( + f"(source file not found at this revision: {file_path})" + if lines is None + else render_snippet(lines, line_number) + ) + return Snippet( + file_path=file_path, + line_number=line_number, + change_kind=change_kind, + body=body, + ) + + +def load_source_lines_with_cache( + cache: SourceCache, + ref: str, + path: str, + io: RulingDiffIO, +) -> OptionalSourceLines: + key = (ref, path) + if key not in cache: + content = io.load_text_at_ref(path, ref) + cache[key] = None if content is None else content.splitlines() + return cache[key] diff --git a/.github/actions/ruling-diff-comment/ruling_diff_io.py b/.github/actions/ruling-diff-comment/ruling_diff_io.py new file mode 100644 index 000000000..65b80f595 --- /dev/null +++ b/.github/actions/ruling-diff-comment/ruling_diff_io.py @@ -0,0 +1,332 @@ +from __future__ import annotations + +import json +import logging +import subprocess +from pathlib import Path + +from ruling_diff_core_lib.models_and_constants import ( + COMMENT_MARKER, + EXPECTED_RULING_ROOT, + PROJECT_SOURCE_OVERRIDES, +) + +RULING_SOURCES_SUBMODULE = "private/its-enterprise/sources_ruling" +SOURCES_INTERNAL_RULING_ROOT = "private/its-enterprise/sources_internal_ruling" +SOURCES_INTERNAL_NAMESPACE_RULING_ROOT = ( + "private/its-enterprise/sources_internal_namespace_ruling" +) + + +class CommandError(RuntimeError): + pass + + +class GitHubActionIO: + def load_json_at_ref(self, path: str, ref: str) -> dict[str, list[int]] | None: + return load_json_at_ref(path, ref) + + def load_text_at_ref(self, path: str, ref: str) -> str | None: + return load_text_at_ref(path, ref) + + def resolve_source_path(self, project: str, file_path: str) -> str: + if project == "project": + return self._resolve_project_source_path(file_path) + source_root = PROJECT_SOURCE_OVERRIDES.get( + project, f"{RULING_SOURCES_SUBMODULE}/{project}" + ) + return f"{source_root}/{file_path.lstrip('/')}" + + def _resolve_project_source_path(self, file_path: str) -> str: + clean_path = file_path.lstrip("/") + primary_candidate = f"{RULING_SOURCES_SUBMODULE}/{clean_path}" + candidates = [primary_candidate] + candidates.extend( + self._with_direct_children_prefixes(RULING_SOURCES_SUBMODULE, clean_path) + ) + candidates.append(f"{SOURCES_INTERNAL_RULING_ROOT}/{clean_path}") + candidates.append(f"{SOURCES_INTERNAL_NAMESPACE_RULING_ROOT}/{clean_path}") + candidates.extend( + self._with_direct_children_prefixes( + SOURCES_INTERNAL_NAMESPACE_RULING_ROOT, clean_path + ) + ) + for candidate in candidates: + if Path(candidate).is_file(): + return candidate + return primary_candidate + + def _with_direct_children_prefixes(self, root: str, file_path: str) -> list[str]: + root_path = Path(root) + if not root_path.is_dir(): + return [] + return [ + f"{root}/{child.name}/{file_path}" + for child in sorted(root_path.iterdir(), key=lambda path: path.name) + if child.is_dir() and not child.name.startswith(".") + ] + + +def run_command(command: list[str]) -> str: + result = subprocess.run(command, capture_output=True, text=True) + if result.returncode != 0: + raise CommandError( + format_command_failure( + command, result.stdout, result.stderr, result.returncode + ) + ) + return result.stdout + + +def format_command_failure( + command: list[str], stdout: str, stderr: str, returncode: int +) -> str: + return ( + f"Command failed with exit code {returncode}: {' '.join(command)}\n" + f"stdout: {stdout}\n" + f"stderr: {stderr}" + ) + + +def run_gh_json(command: list[str]) -> dict | list: + output = run_command(["gh", *command]) + try: + return json.loads(output) + except json.JSONDecodeError as exc: + raise CommandError(f"Could not parse JSON from gh output: {exc}") from exc + + +def run_gh_paginated_items(endpoint: str) -> list[dict]: + output = run_command(["gh", "api", "--paginate", endpoint]) + docs = parse_json_documents(output) + items: list[dict] = [] + for doc in docs: + if not isinstance(doc, list): + raise CommandError("Unexpected response type while listing paginated items") + for item in doc: + if isinstance(item, dict): + items.append(item) + return items + + +def parse_json_documents(content: str) -> list[object]: + decoder = json.JSONDecoder() + index = 0 + documents: list[object] = [] + while index < len(content): + while index < len(content) and content[index].isspace(): + index += 1 + if index >= len(content): + break + document, next_index = decoder.raw_decode(content, index) + documents.append(document) + index = next_index + return documents + + +def get_changed_ruling_files(base_sha: str, head_sha: str) -> list[str]: + output = run_command( + [ + "git", + "diff", + "--name-only", + f"{base_sha}...{head_sha}", + "--", + f"{EXPECTED_RULING_ROOT}/", + ] + ) + changed = [ + path + for path in (line.strip() for line in output.splitlines()) + if is_ruling_json(path) + ] + return sorted(set(changed)) + + +def is_ruling_json(path: str) -> bool: + return ( + bool(path) + and path.endswith(".json") + and path.startswith(f"{EXPECTED_RULING_ROOT}/") + ) + + +def _is_missing_at_ref(stderr: str) -> bool: + return any( + marker in stderr + for marker in ("exists on disk, but not in", "does not exist in", "path '") + ) + + +def load_json_at_ref(path: str, ref: str) -> dict[str, list[int]] | None: + result = subprocess.run( + ["git", "show", f"{ref}:{path}"], capture_output=True, text=True + ) + if result.returncode != 0: + if _is_missing_at_ref(result.stderr): + return None + raise CommandError( + f"Failed to read file at ref: git show {ref}:{path}\nstdout: {result.stdout}\nstderr: {result.stderr}" + ) + return parse_ruling_json(result.stdout, path, ref) + + +def parse_ruling_json(content: str, path: str, ref: str) -> dict[str, list[int]]: + try: + data = json.loads(content) + except json.JSONDecodeError as exc: + raise ValueError(f"Malformed JSON in {path} at {ref}: {exc}") from exc + if not isinstance(data, dict): + raise ValueError(f"Ruling file {path} at {ref} must be a JSON object") + return normalize_ruling_json(data, path, ref) + + +def normalize_ruling_json(data: dict, path: str, ref: str) -> dict[str, list[int]]: + normalized: dict[str, list[int]] = {} + for key, value in data.items(): + if not isinstance(key, str): + raise ValueError(f"Ruling file {path} at {ref} has non-string key") + if not isinstance(value, list) or not all(isinstance(v, int) for v in value): + raise ValueError( + f"Ruling file {path} at {ref} has non-integer line list for key {key}" + ) + normalized[key] = value + return normalized + + +def load_text_at_ref(path: str, ref: str) -> str | None: + if is_ruling_source_path(path): + return load_submodule_text_at_ref(path, ref) + + result = subprocess.run( + ["git", "show", f"{ref}:{path}"], capture_output=True, text=True + ) + if result.returncode == 0: + return result.stdout + if _is_missing_at_ref(result.stderr): + return load_text_with_workspace_fallback(path, ref) + raise CommandError( + f"Failed to read source file at ref: git show {ref}:{path}\nstdout: {result.stdout}\nstderr: {result.stderr}" + ) + + +def is_ruling_source_path(path: str) -> bool: + return path.startswith(f"{RULING_SOURCES_SUBMODULE}/") + + +def load_submodule_text_at_ref(path: str, ref: str) -> str | None: + submodule_commit = get_submodule_commit_for_ref(ref) + if submodule_commit is None: + return load_text_with_workspace_fallback(path, ref) + + submodule_relative_path = path[len(f"{RULING_SOURCES_SUBMODULE}/") :] + content = read_submodule_file_at_commit(submodule_commit, submodule_relative_path) + if content is not None: + return content + + fetch_submodule_commit(submodule_commit) + content = read_submodule_file_at_commit(submodule_commit, submodule_relative_path) + if content is not None: + return content + + logging.warning( + "Source file '%s' not found in submodule commit %s for %s", + path, + submodule_commit, + ref, + ) + return load_text_with_workspace_fallback(path, ref) + + +def get_submodule_commit_for_ref(ref: str) -> str | None: + result = subprocess.run( + ["git", "rev-parse", f"{ref}:{RULING_SOURCES_SUBMODULE}"], + capture_output=True, + text=True, + ) + if result.returncode != 0: + logging.warning( + "Could not resolve ruling sources submodule commit for %s: %s", + ref, + result.stderr.strip(), + ) + return None + return result.stdout.strip() + + +def read_submodule_file_at_commit(commit: str, relative_path: str) -> str | None: + result = subprocess.run( + ["git", "-C", RULING_SOURCES_SUBMODULE, "show", f"{commit}:{relative_path}"], + capture_output=True, + text=True, + ) + if result.returncode == 0: + return result.stdout + return None + + +def fetch_submodule_commit(commit: str) -> None: + subprocess.run( + [ + "git", + "-C", + RULING_SOURCES_SUBMODULE, + "fetch", + "--depth", + "1", + "origin", + commit, + ], + capture_output=True, + text=True, + ) + + +def load_text_with_workspace_fallback(path: str, ref: str) -> str | None: + workspace_content = load_workspace_text(path) + if workspace_content is None: + logging.warning("Source file '%s' not found at %s", path, ref) + return None + logging.warning("Source file '%s' not found at %s, using workspace copy", path, ref) + return workspace_content + + +def load_workspace_text(path: str) -> str | None: + workspace_path = Path(path) + if not workspace_path.is_file(): + return None + return workspace_path.read_text(encoding="utf-8") + + +def get_existing_comment_id(pr_number: str, repository: str) -> str | None: + comments = run_gh_paginated_items( + f"repos/{repository}/issues/{pr_number}/comments?per_page=100" + ) + for comment in comments: + if COMMENT_MARKER in comment.get("body", ""): + return str(comment["id"]) + return None + + +def post_or_update_comment(pr_number: str, repository: str, body: str) -> None: + comment_id = get_existing_comment_id(pr_number, repository) + if comment_id is None: + logging.info("Posting new ruling diff comment on PR #%s", pr_number) + run_command( + ["gh", "pr", "comment", pr_number, "--repo", repository, "--body", body] + ) + return + logging.info( + "Updating existing ruling diff comment %s on PR #%s", comment_id, pr_number + ) + run_command( + [ + "gh", + "api", + "--method", + "PATCH", + f"repos/{repository}/issues/comments/{comment_id}", + "-f", + f"body={body}", + ] + ) diff --git a/.github/actions/ruling-diff-comment/test_ruling_diff.py b/.github/actions/ruling-diff-comment/test_ruling_diff.py new file mode 100644 index 000000000..459f6f43d --- /dev/null +++ b/.github/actions/ruling-diff-comment/test_ruling_diff.py @@ -0,0 +1,497 @@ +import pathlib +import subprocess +import sys +import tempfile +import unittest +from unittest.mock import patch + + +MODULE_DIR = pathlib.Path(__file__).parent +if str(MODULE_DIR) not in sys.path: + sys.path.insert(0, str(MODULE_DIR)) + +import ruling_diff_core as core +import ruling_diff_io as io + + +IssueDiff = core.IssueDiff +RuleDiff = core.RuleDiff +Snippet = core.Snippet + + +class FakeRulingDiffIO: + def __init__( + self, + json_by_ref_path: dict[tuple[str, str], dict[str, list[int]] | None], + text_by_ref_path: dict[tuple[str, str], str | None], + ) -> None: + self.json_by_ref_path = json_by_ref_path + self.text_by_ref_path = text_by_ref_path + self.load_json_calls: list[tuple[str, str]] = [] + self.load_text_calls: list[tuple[str, str]] = [] + self.resolve_calls: list[tuple[str, str]] = [] + + def load_json_at_ref(self, path: str, ref: str) -> dict[str, list[int]] | None: + self.load_json_calls.append((path, ref)) + return self.json_by_ref_path.get((path, ref)) + + def load_text_at_ref(self, path: str, ref: str) -> str | None: + self.load_text_calls.append((path, ref)) + return self.text_by_ref_path.get((path, ref)) + + def resolve_source_path(self, project: str, file_path: str) -> str: + self.resolve_calls.append((project, file_path)) + return f"sources/{project}/{file_path.lstrip('/')}" + + +class ParsePathTest(unittest.TestCase): + def test_parse_ruling_path(self) -> None: + path = "private/its-enterprise/ruling/src/test/resources/expected_ruling/airflow/python-S1066.json" + self.assertEqual(("airflow", "python", "S1066"), core.parse_ruling_path(path)) + + def test_parse_ruling_path_with_pythonenterprise(self) -> None: + path = "private/its-enterprise/ruling/src/test/resources/expected_ruling/specific-rules/pythonenterprise-S7471.json" + self.assertEqual( + ("specific-rules", "pythonenterprise", "S7471"), + core.parse_ruling_path(path), + ) + + +class DiffLogicTest(unittest.TestCase): + def test_diff_ruling_jsons_added_issues(self) -> None: + diffs = core.diff_ruling_jsons({"proj:a.py": [1, 2]}, {"proj:a.py": [1, 2, 3]}) + self.assertEqual(1, len(diffs)) + self.assertEqual("a.py", diffs[0].file_path) + self.assertEqual([3], diffs[0].added_lines) + + def test_diff_ruling_jsons_removed_issues(self) -> None: + diffs = core.diff_ruling_jsons({"proj:a.py": [1, 2, 3]}, {"proj:a.py": [1]}) + self.assertEqual([2, 3], diffs[0].removed_lines) + + def test_diff_ruling_jsons_new_file_entry(self) -> None: + diffs = core.diff_ruling_jsons( + {"proj:a.py": [1]}, + {"proj:a.py": [1], "proj:b.py": [5]}, + ) + self.assertEqual("b.py", diffs[0].file_path) + self.assertEqual([5], diffs[0].added_lines) + + def test_diff_ruling_jsons_removed_file_entry(self) -> None: + diffs = core.diff_ruling_jsons( + {"proj:a.py": [1], "proj:b.py": [5]}, + {"proj:a.py": [1]}, + ) + self.assertEqual("b.py", diffs[0].file_path) + self.assertEqual([5], diffs[0].removed_lines) + + def test_diff_ruling_jsons_new_ruling_file(self) -> None: + diffs = core.diff_ruling_jsons(None, {"proj:a.py": [10]}) + self.assertEqual([10], diffs[0].added_lines) + + def test_diff_ruling_jsons_deleted_ruling_file(self) -> None: + diffs = core.diff_ruling_jsons({"proj:a.py": [10]}, None) + self.assertEqual([10], diffs[0].removed_lines) + + def test_diff_ruling_jsons_no_changes(self) -> None: + self.assertEqual( + [], + core.diff_ruling_jsons( + {"proj:a.py": [10], "proj:b.py": [11, 12]}, + {"proj:a.py": [10], "proj:b.py": [11, 12]}, + ), + ) + + def test_duplicate_line_numbers_preserved(self) -> None: + diffs = core.diff_ruling_jsons({"proj:a.py": [297]}, {"proj:a.py": [297, 297]}) + self.assertEqual([297], diffs[0].added_lines) + + +class FormattingTest(unittest.TestCase): + def test_format_comment_single_rule(self) -> None: + rule_diff = RuleDiff( + project="airflow", + repo="python", + rule_key="S107", + file_diffs=[IssueDiff("airflow/hooks/a.py", [10, 11], [8])], + snippets=[ + Snippet( + file_path="airflow/hooks/a.py", + line_number=10, + change_kind="added", + body=">>> 10 | x = 1", + ) + ], + is_new_file=False, + is_deleted_file=False, + ) + comment = core.format_comment([rule_diff]) + self.assertIn("## Ruling Diff Summary", comment) + self.assertIn("
    ", comment) + self.assertIn("**Added** `airflow/hooks/a.py` (line 10)", comment) + self.assertIn(">>> 10 | x = 1", comment) + self.assertIn("```python", comment) + + def test_format_comment_multiple_rules(self) -> None: + rule_diffs = [ + RuleDiff( + project="airflow", + repo="python", + rule_key="S107", + file_diffs=[IssueDiff("airflow/hooks/a.py", [10], [])], + snippets=[ + Snippet("airflow/hooks/a.py", 10, "added", ">>> 10 | return 1") + ], + is_new_file=False, + is_deleted_file=False, + ), + RuleDiff( + project="django", + repo="python", + rule_key="S3699", + file_diffs=[IssueDiff("django/core/b.py", [20], [15])], + snippets=[ + Snippet( + "django/core/b.py", 15, "removed", ">>> 15 | return None" + ) + ], + is_new_file=False, + is_deleted_file=False, + ), + ] + comment = core.format_comment(rule_diffs) + self.assertIn("Detected changes in 2 rule files", comment) + self.assertIn("S107", comment) + self.assertIn("S3699", comment) + + def test_format_comment_respects_collapse(self) -> None: + rule_diff = RuleDiff( + project="airflow", + repo="python", + rule_key="S107", + file_diffs=[IssueDiff("airflow/hooks/a.py", [10], [])], + snippets=[ + Snippet("airflow/hooks/a.py", 10, "added", ">>> 10 | return 1") + ], + is_new_file=False, + is_deleted_file=False, + ) + comment = core.format_comment([rule_diff]) + self.assertIn("
    ", comment) + self.assertIn("
    ", comment) + + def test_strip_project_key_from_path(self) -> None: + self.assertEqual( + "airflow/foo.py", core.strip_project_key("airflow:airflow/foo.py") + ) + + def test_line_zero_displayed_as_file_level(self) -> None: + rule_diff = RuleDiff( + project="specific-rules", + repo="python", + rule_key="S1451", + file_diffs=[IssueDiff("S1716.py", [0], [0])], + snippets=[Snippet("S1716.py", 0, "added", ">>> FILE-LEVEL ISSUE")], + is_new_file=False, + is_deleted_file=False, + ) + comment = core.format_comment([rule_diff]) + self.assertIn("file-level", comment) + self.assertIn(">>> FILE-LEVEL ISSUE", comment) + + def test_format_comment_truncates_when_limit_reached(self) -> None: + rule_diffs = [ + RuleDiff( + project=f"project-{index}", + repo="python", + rule_key=f"S{1000 + index}", + file_diffs=[IssueDiff("a.py", [1], [2])], + snippets=[ + Snippet( + "a.py", 1, "added", "\n".join([f"line {i}" for i in range(50)]) + ) + ], + is_new_file=False, + is_deleted_file=False, + ) + for index in range(5) + ] + comment = core.format_comment(rule_diffs, soft_limit=500) + self.assertIn("diff too large to display fully", comment) + + +class SnippetRenderingTest(unittest.TestCase): + def test_render_line_snippet_uses_plus_minus_five_lines(self) -> None: + lines = [f"line {i}" for i in range(1, 21)] + rendered = core.render_line_snippet(lines, issue_line=10, context=5) + self.assertIn(" 5 | line 5", rendered) + self.assertIn(">>> 10 | line 10", rendered) + self.assertIn(" 15 | line 15", rendered) + + def test_render_line_snippet_handles_out_of_range_line(self) -> None: + rendered = core.render_line_snippet(["alpha", "beta"], issue_line=99, context=5) + self.assertIn("requested line 99 not present", rendered) + self.assertIn(">>> 2 | beta", rendered) + + def test_render_file_level_snippet_marker(self) -> None: + rendered = core.render_file_level_snippet(["a", "b", "c"], context=5) + self.assertIn(">>> FILE-LEVEL ISSUE", rendered) + + def test_render_snippet_missing_source_placeholder(self) -> None: + rendered = core.render_snippet(None, issue_line=12, context=5) + self.assertEqual("(source file not found at this revision)", rendered) + + +class BuildRuleDiffsWithIOTest(unittest.TestCase): + def test_build_rule_diffs_uses_io_object_and_respects_refs(self) -> None: + changed_file = ( + "private/its-enterprise/ruling/src/test/resources/expected_ruling/" + "airflow/python-S107.json" + ) + io_impl = FakeRulingDiffIO( + json_by_ref_path={ + (changed_file, "base-sha"): {"airflow:a.py": [2]}, + (changed_file, "head-sha"): {"airflow:a.py": [2, 7]}, + }, + text_by_ref_path={ + ("sources/airflow/a.py", "head-sha"): "\n".join( + [f"line {index}" for index in range(1, 12)] + ), + }, + ) + + diffs = core.build_rule_diffs([changed_file], "base-sha", "head-sha", io_impl) + + self.assertEqual(1, len(diffs)) + self.assertEqual("airflow", diffs[0].project) + self.assertEqual("python", diffs[0].repo) + self.assertEqual("S107", diffs[0].rule_key) + self.assertEqual([7], diffs[0].file_diffs[0].added_lines) + self.assertEqual([], diffs[0].file_diffs[0].removed_lines) + self.assertIn((changed_file, "base-sha"), io_impl.load_json_calls) + self.assertIn((changed_file, "head-sha"), io_impl.load_json_calls) + self.assertEqual([("airflow", "a.py")], io_impl.resolve_calls) + self.assertEqual([("sources/airflow/a.py", "head-sha")], io_impl.load_text_calls) + + def test_build_rule_diffs_caches_source_loads_per_ref_and_path(self) -> None: + changed_file = ( + "private/its-enterprise/ruling/src/test/resources/expected_ruling/" + "airflow/python-S107.json" + ) + io_impl = FakeRulingDiffIO( + json_by_ref_path={ + (changed_file, "base-sha"): {"airflow:a.py": [1]}, + (changed_file, "head-sha"): {"airflow:a.py": [2, 2]}, + }, + text_by_ref_path={ + ("sources/airflow/a.py", "base-sha"): "base\ncontent\n", + ("sources/airflow/a.py", "head-sha"): "head\ncontent\n", + }, + ) + + core.build_rule_diffs([changed_file], "base-sha", "head-sha", io_impl) + + self.assertEqual(1, io_impl.load_text_calls.count(("sources/airflow/a.py", "base-sha"))) + self.assertEqual(1, io_impl.load_text_calls.count(("sources/airflow/a.py", "head-sha"))) + + def test_build_rule_diffs_missing_source_produces_placeholder_snippet(self) -> None: + changed_file = ( + "private/its-enterprise/ruling/src/test/resources/expected_ruling/" + "airflow/python-S107.json" + ) + io_impl = FakeRulingDiffIO( + json_by_ref_path={ + (changed_file, "base-sha"): {"airflow:a.py": [1]}, + (changed_file, "head-sha"): {"airflow:a.py": [1, 3]}, + }, + text_by_ref_path={("sources/airflow/a.py", "head-sha"): None}, + ) + + diffs = core.build_rule_diffs([changed_file], "base-sha", "head-sha", io_impl) + + self.assertEqual(1, len(diffs[0].snippets)) + self.assertEqual( + "(source file not found at this revision: a.py)", + diffs[0].snippets[0].body, + ) + + +class SourceLoadingTest(unittest.TestCase): + @patch("ruling_diff_io.subprocess.run") + def test_load_text_at_ref_reads_from_submodule_commit(self, mocked_run) -> None: + mocked_run.side_effect = [ + subprocess.CompletedProcess( + args=["git", "rev-parse"], + returncode=0, + stdout="subsha123\n", + stderr="", + ), + subprocess.CompletedProcess( + args=["git", "-C", "sources", "show"], + returncode=0, + stdout="print('from submodule')\n", + stderr="", + ), + ] + + content = io.load_text_at_ref( + "private/its-enterprise/sources_ruling/project/foo.py", "deadbeef" + ) + + self.assertEqual("print('from submodule')\n", content) + + @patch("ruling_diff_io.subprocess.run") + def test_load_text_at_ref_falls_back_to_workspace_copy_with_warning( + self, mocked_run + ) -> None: + mocked_run.return_value = subprocess.CompletedProcess( + args=["git"], + returncode=128, + stdout="", + stderr="fatal: path 'private/its-enterprise/sources_ruling/foo.py' exists on disk, but not in 'deadbeef'", + ) + with tempfile.NamedTemporaryFile("w", encoding="utf-8", delete=False) as tmp: + tmp.write("print('from workspace')\n") + tmp_path = tmp.name + try: + with self.assertLogs(level="WARNING") as logs: + content = io.load_text_at_ref(tmp_path, "deadbeef") + self.assertEqual("print('from workspace')\n", content) + self.assertTrue(any("using workspace copy" in log for log in logs.output)) + finally: + pathlib.Path(tmp_path).unlink(missing_ok=True) + + @patch("ruling_diff_io.subprocess.run") + def test_load_text_at_ref_warns_when_source_missing(self, mocked_run) -> None: + mocked_run.return_value = subprocess.CompletedProcess( + args=["git"], + returncode=128, + stdout="", + stderr="fatal: path 'missing.py' exists on disk, but not in 'deadbeef'", + ) + with self.assertLogs(level="WARNING") as logs: + content = io.load_text_at_ref("missing.py", "deadbeef") + self.assertIsNone(content) + self.assertTrue(any("not found at deadbeef" in log for log in logs.output)) + + +class GitHubCommentLookupTest(unittest.TestCase): + @patch("ruling_diff_io.run_command") + def test_get_existing_comment_id_reads_all_pages(self, mocked_run_command) -> None: + mocked_run_command.return_value = ( + '[{"id": 1, "body": "first"}]\n' + '[{"id": 2, "body": "text "}]\n' + ) + + comment_id = io.get_existing_comment_id( + "895", "SonarSource/sonar-python-enterprise" + ) + + self.assertEqual("2", comment_id) + + def test_parse_json_documents_handles_multiple_arrays(self) -> None: + documents = io.parse_json_documents('[{"a":1}]\n[{"b":2}]') + self.assertEqual(2, len(documents)) + + +class GitHubActionIOTest(unittest.TestCase): + def test_resolve_source_path_for_project_rulings_uses_path_directly(self) -> None: + io_impl = io.GitHubActionIO() + self.assertEqual( + "private/its-enterprise/sources_ruling/biopython/Bio/Nexus/Nexus.py", + io_impl.resolve_source_path("project", "biopython/Bio/Nexus/Nexus.py"), + ) + + def test_resolve_source_path_for_project_rulings_falls_back_to_sources_child(self) -> None: + io_impl = io.GitHubActionIO() + self.assertEqual( + "private/its-enterprise/sources_ruling/specific-rules/S1716.py", + io_impl.resolve_source_path("project", "S1716.py"), + ) + + def test_resolve_source_path_for_project_rulings_falls_back_to_sources_internal( + self, + ) -> None: + io_impl = io.GitHubActionIO() + with tempfile.TemporaryDirectory() as tmp_dir: + sources_ruling = f"{tmp_dir}/sources_ruling" + sources_internal = f"{tmp_dir}/sources_internal_ruling" + sources_namespace = f"{tmp_dir}/sources_internal_namespace_ruling" + pathlib.Path(sources_ruling).mkdir(parents=True, exist_ok=True) + pathlib.Path(sources_internal).mkdir(parents=True, exist_ok=True) + pathlib.Path(sources_namespace).mkdir(parents=True, exist_ok=True) + target = f"{sources_internal}/foo.py" + pathlib.Path(target).write_text("x\n", encoding="utf-8") + with ( + patch.object(io, "RULING_SOURCES_SUBMODULE", sources_ruling), + patch.object(io, "SOURCES_INTERNAL_RULING_ROOT", sources_internal), + patch.object( + io, + "SOURCES_INTERNAL_NAMESPACE_RULING_ROOT", + sources_namespace, + ), + ): + self.assertEqual(target, io_impl.resolve_source_path("project", "foo.py")) + + def test_resolve_source_path_for_project_rulings_falls_back_to_namespace_child( + self, + ) -> None: + io_impl = io.GitHubActionIO() + with tempfile.TemporaryDirectory() as tmp_dir: + sources_ruling = f"{tmp_dir}/sources_ruling" + sources_internal = f"{tmp_dir}/sources_internal_ruling" + sources_namespace = f"{tmp_dir}/sources_internal_namespace_ruling" + namespace_child = f"{sources_namespace}/basic_namespace" + pathlib.Path(sources_ruling).mkdir(parents=True, exist_ok=True) + pathlib.Path(sources_internal).mkdir(parents=True, exist_ok=True) + pathlib.Path(namespace_child).mkdir(parents=True, exist_ok=True) + target = f"{namespace_child}/foo.py" + pathlib.Path(target).write_text("x\n", encoding="utf-8") + with ( + patch.object(io, "RULING_SOURCES_SUBMODULE", sources_ruling), + patch.object(io, "SOURCES_INTERNAL_RULING_ROOT", sources_internal), + patch.object( + io, + "SOURCES_INTERNAL_NAMESPACE_RULING_ROOT", + sources_namespace, + ), + ): + self.assertEqual(target, io_impl.resolve_source_path("project", "foo.py")) + + def test_resolve_source_path_for_project_rulings_returns_primary_on_miss(self) -> None: + io_impl = io.GitHubActionIO() + with tempfile.TemporaryDirectory() as tmp_dir: + sources_ruling = f"{tmp_dir}/sources_ruling" + sources_internal = f"{tmp_dir}/sources_internal_ruling" + sources_namespace = f"{tmp_dir}/sources_internal_namespace_ruling" + pathlib.Path(sources_ruling).mkdir(parents=True, exist_ok=True) + pathlib.Path(sources_internal).mkdir(parents=True, exist_ok=True) + pathlib.Path(sources_namespace).mkdir(parents=True, exist_ok=True) + primary = f"{sources_ruling}/missing.py" + with ( + patch.object(io, "RULING_SOURCES_SUBMODULE", sources_ruling), + patch.object(io, "SOURCES_INTERNAL_RULING_ROOT", sources_internal), + patch.object( + io, + "SOURCES_INTERNAL_NAMESPACE_RULING_ROOT", + sources_namespace, + ), + ): + self.assertEqual(primary, io_impl.resolve_source_path("project", "missing.py")) + + def test_resolve_source_path_uses_project_overrides(self) -> None: + io_impl = io.GitHubActionIO() + self.assertEqual( + "private/its-enterprise/sources_ruling/mypy-0.782/pkg/file.py", + io_impl.resolve_source_path("mypy", "pkg/file.py"), + ) + + def test_resolve_source_path_uses_default_project_root(self) -> None: + io_impl = io.GitHubActionIO() + self.assertEqual( + "private/its-enterprise/sources_ruling/custom-project/pkg/file.py", + io_impl.resolve_source_path("custom-project", "/pkg/file.py"), + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/.github/actions/ruling-diff-comment/uv.lock b/.github/actions/ruling-diff-comment/uv.lock new file mode 100644 index 000000000..a3e2f3075 --- /dev/null +++ b/.github/actions/ruling-diff-comment/uv.lock @@ -0,0 +1,8 @@ +version = 1 +revision = 3 +requires-python = ">=3.10" + +[[package]] +name = "ruling-diff-comment" +version = "0.1.0" +source = { virtual = "." } From 772831eb2ffd2ef629cf6bb66b113be4349b854c Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Tue, 3 Mar 2026 14:45:07 +0100 Subject: [PATCH 012/322] SONARPY-3862 S6542 Removed check on variadic parameters (#916) GitOrigin-RevId: b1d88e70a41c08684962983e79221c71ecb862d1 --- .../checks/UseOfAnyAsTypeHintCheck.java | 9 ++++++++ .../useOfAnyAsTypeHint.py | 23 +++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/python-checks/src/main/java/org/sonar/python/checks/UseOfAnyAsTypeHintCheck.java b/python-checks/src/main/java/org/sonar/python/checks/UseOfAnyAsTypeHintCheck.java index f3376927e..5cb0d97cf 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/UseOfAnyAsTypeHintCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/UseOfAnyAsTypeHintCheck.java @@ -26,6 +26,7 @@ import org.sonar.plugins.python.api.tree.Decorator; import org.sonar.plugins.python.api.tree.FunctionDef; import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.Parameter; import org.sonar.plugins.python.api.tree.Tree; import org.sonar.plugins.python.api.tree.TypeAnnotation; import org.sonar.python.semantic.SymbolUtils; @@ -55,12 +56,20 @@ private static void checkForAnyInReturnTypeAndParameters(SubscriptionContext ctx TypeAnnotation typeAnnotation = (TypeAnnotation) ctx.syntaxNode(); Optional.of(typeAnnotation) .filter(UseOfAnyAsTypeHintCheck::isTypeAny) + .filter(Predicate.not(UseOfAnyAsTypeHintCheck::isVariadicParameter)) .map(annotation -> (FunctionDef) TreeUtils.firstAncestorOfKind(annotation, Tree.Kind.FUNCDEF)) .filter(Predicate.not(UseOfAnyAsTypeHintCheck::hasFunctionOverrideOrOverloadDecorator)) .filter(Predicate.not(UseOfAnyAsTypeHintCheck::canFunctionBeAnOverride)) .ifPresent(functionDef -> ctx.addIssue(typeAnnotation.expression(), MESSAGE)); } + private static boolean isVariadicParameter(TypeAnnotation typeAnnotation) { + return Optional.ofNullable(typeAnnotation.parent()) + .flatMap(TreeUtils.toOptionalInstanceOfMapper(Parameter.class)) + .map(Parameter::starToken) + .isPresent(); + } + private static boolean isTypeAny(@Nullable TypeAnnotation typeAnnotation) { return Optional.ofNullable(typeAnnotation) .map(TypeAnnotation::expression) diff --git a/python-checks/src/test/resources/checks/useOfAnyAsTypeHintCheck/useOfAnyAsTypeHint.py b/python-checks/src/test/resources/checks/useOfAnyAsTypeHintCheck/useOfAnyAsTypeHint.py index 1571aef0b..923b178c1 100644 --- a/python-checks/src/test/resources/checks/useOfAnyAsTypeHintCheck/useOfAnyAsTypeHint.py +++ b/python-checks/src/test/resources/checks/useOfAnyAsTypeHintCheck/useOfAnyAsTypeHint.py @@ -126,3 +126,26 @@ class LocalClassWithAnnotatedMember: class LocalClassChild(LocalClassWithAnnotatedMember): def my_member(self, param: Any) -> Any: # OK, defined in parent ... + +# Variadic parameters (*args, **kwargs) should not raise issues +def function_with_args(*args: Any) -> None: # Compliant + pass + +def function_with_kwargs(**kwargs: Any) -> None: # Compliant + pass + +def function_with_both(*some_args: Any, **kwargs: Any) -> None: # Compliant + pass + +def function_with_mixed(param: Any, *args: Any, **kwargs: Any) -> str: # Noncompliant + pass + +class ClassWithVariadicMethods: + def method_with_args(self, *args: Any) -> None: # Compliant + pass + + def method_with_kwargs(self, **kwargs: Any) -> None: # Compliant + pass + + def method_with_both(self, param: Any, *args: Any, **kwargs: Any) -> Any: # Noncompliant 2 + pass From bcacc61f126fc4739586c7edc18cb6c68f038f10 Mon Sep 17 00:00:00 2001 From: Marc Jasper Date: Tue, 3 Mar 2026 16:40:44 +0100 Subject: [PATCH 013/322] SONARPY-3855 Fix typo in the Django Model class stub file (#902) GitOrigin-RevId: 801fa94069c36f85b167800511af38f63c1946d2 --- .../django/DjangoModelStrMethodCheck.java | 22 +++++++++++++---- .../django/DjangoModelStringFieldCheck.java | 6 +++-- .../django.apps.config.protobuf | 24 +++++++++---------- .../custom_protobuf/django.apps.protobuf | 20 ++++++++-------- .../django.apps.registry.protobuf | 24 +++++++++---------- .../django.db.models.base.protobuf | 16 +++++++++++++ .../custom_protobuf/django.db.models.protobuf | 15 ++++++++---- .../checksums/custom.checksum | 2 +- .../django/db/models/{base.ipy => base.pyi} | 0 .../tests/test_serializers.py | 2 +- 10 files changed, 83 insertions(+), 48 deletions(-) create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.db.models.base.protobuf rename python-frontend/typeshed_serializer/resources/custom/django/db/models/{base.ipy => base.pyi} (100%) diff --git a/python-checks/src/main/java/org/sonar/python/checks/django/DjangoModelStrMethodCheck.java b/python-checks/src/main/java/org/sonar/python/checks/django/DjangoModelStrMethodCheck.java index 99d0cd9da..ff7b4f020 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/django/DjangoModelStrMethodCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/django/DjangoModelStrMethodCheck.java @@ -16,14 +16,17 @@ */ package org.sonar.python.checks.django; -import java.util.List; import java.util.Objects; import java.util.Optional; import org.sonar.check.Rule; import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; import org.sonar.plugins.python.api.symbols.Symbol; import org.sonar.plugins.python.api.tree.ClassDef; +import org.sonar.plugins.python.api.tree.RegularArgument; import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; import org.sonar.python.checks.utils.Expressions; import org.sonar.python.tree.TreeUtils; @@ -34,14 +37,13 @@ public class DjangoModelStrMethodCheck extends PythonSubscriptionCheck { public static final String MESSAGE = "Define a \"__str__\" method for this Django model."; - private static final List DJANGO_MODEL_FQN = List.of("django.db.models.Model"); + private static final TypeMatcher IS_DJANGO_MODEL = TypeMatchers.isType("django.db.models.base.Model"); @Override public void initialize(Context context) { context.registerSyntaxNodeConsumer(Tree.Kind.CLASSDEF, ctx -> { var classDef = (ClassDef) ctx.syntaxNode(); - var parentClassesFQN = TreeUtils.getParentClassesFQN(classDef); - if (DJANGO_MODEL_FQN.equals(parentClassesFQN)) { + if (isDirectDjangoModelSubclass(classDef, ctx)) { if (isAbstractModel(classDef)) { return; } @@ -54,6 +56,18 @@ public void initialize(Context context) { }); } + private static boolean isDirectDjangoModelSubclass(ClassDef classDef, SubscriptionContext ctx) { + var args = classDef.args(); + if (args == null) { + return false; + } + return args.arguments().stream() + .filter(RegularArgument.class::isInstance) + .map(RegularArgument.class::cast) + .map(RegularArgument::expression) + .anyMatch(expr -> IS_DJANGO_MODEL.isTrueFor(expr, ctx)); + } + private static boolean isAbstractModel(ClassDef classDef) { return getMetaClass(classDef) .flatMap(metaClass -> getFieldAssignment(metaClass, "abstract")) diff --git a/python-checks/src/main/java/org/sonar/python/checks/django/DjangoModelStringFieldCheck.java b/python-checks/src/main/java/org/sonar/python/checks/django/DjangoModelStringFieldCheck.java index 3f90201cc..a1307b9a7 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/django/DjangoModelStringFieldCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/django/DjangoModelStringFieldCheck.java @@ -34,6 +34,8 @@ import org.sonar.plugins.python.api.tree.Statement; import org.sonar.plugins.python.api.tree.StatementList; import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; import org.sonar.python.quickfix.TextEditUtils; import org.sonar.python.tree.TreeUtils; @@ -45,7 +47,7 @@ public class DjangoModelStringFieldCheck extends PythonSubscriptionCheck { private static final String REPLACE_QUICK_FIX_MESSAGE = "Replace with \"blank=True\""; private static final String REMOVE_QUICK_FIX_MESSAGE = "Remove the \"null=true\" flag"; - private static final String DJANGO_MODEL_FQN = "django.db.models.Model"; + private static final TypeMatcher IS_DJANGO_MODEL = TypeMatchers.isOrExtendsType("django.db.models.base.Model"); public static final Set FIELD_TYPES_FQN = Set.of( "django.db.models.CharField", "django.db.models.TextField" @@ -55,7 +57,7 @@ public class DjangoModelStringFieldCheck extends PythonSubscriptionCheck { public void initialize(Context context) { context.registerSyntaxNodeConsumer(Tree.Kind.CLASSDEF, ctx -> { var classDef = (ClassDef) ctx.syntaxNode(); - if (TreeUtils.getParentClassesFQN(classDef).contains(DJANGO_MODEL_FQN)) { + if (IS_DJANGO_MODEL.isTrueFor(classDef.name(), ctx)) { var modelClassBodyStatements = classDef.body().statements(); if (isNotManaged(modelClassBodyStatements)) { diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.apps.config.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.apps.config.protobuf index 2ee0d2596..21d815f96 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.apps.config.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.apps.config.protobuf @@ -1,5 +1,5 @@ -django.apps.config +django.apps.config AppConfigdjango.apps.config.AppConfig"builtins.object* __init__%django.apps.config.AppConfig.__init__" None*F @@ -8,22 +8,22 @@ args Any* kwargs -Any* - get_model&django.apps.config.AppConfig.get_model" - Type[Any] -Any"type*F +Any* + get_model&django.apps.config.AppConfig.get_model"g +!Type[django.db.models.base.Model]: +django.db.models.base.Model"django.db.models.base.Model"type*F self< django.apps.config.AppConfig"django.apps.config.AppConfig*, model_name builtins.str" builtins.str*3 require_ready - builtins.bool" builtins.bool * + builtins.bool" builtins.bool * -get_models'django.apps.config.AppConfig.get_models"K -typing.Iterator[Type[Any]] - Type[Any] -Any"type"typing.Iterator*F +get_models'django.apps.config.AppConfig.get_models" +2typing.Iterator[Type[django.db.models.base.Model]]g +!Type[django.db.models.base.Model]: +django.db.models.base.Model"django.db.models.base.Model"type"typing.Iterator*F self< django.apps.config.AppConfig"django.apps.config.AppConfig*: include_auto_created @@ -33,6 +33,4 @@ get_models'django.apps.config.AppConfig.get_models"K __annotations__"django.apps.config.__annotations__W builtins.dict[builtins.str,Any] builtins.str" builtins.str -Any" builtins.dict** -Modeldjango.apps.config.Model -Any \ No newline at end of file +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.apps.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.apps.protobuf index 5430acbc4..cf264df6d 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.apps.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.apps.protobuf @@ -1,5 +1,5 @@ - django.apps + django.apps AppConfigdjango.apps.config.AppConfig"builtins.object* __init__%django.apps.config.AppConfig.__init__" None*F @@ -8,22 +8,22 @@ args Any* kwargs -Any* - get_model&django.apps.config.AppConfig.get_model" - Type[Any] -Any"type*F +Any* + get_model&django.apps.config.AppConfig.get_model"g +!Type[django.db.models.base.Model]: +django.db.models.base.Model"django.db.models.base.Model"type*F self< django.apps.config.AppConfig"django.apps.config.AppConfig*, model_name builtins.str" builtins.str*3 require_ready - builtins.bool" builtins.bool * + builtins.bool" builtins.bool * -get_models'django.apps.config.AppConfig.get_models"K -typing.Iterator[Type[Any]] - Type[Any] -Any"type"typing.Iterator*F +get_models'django.apps.config.AppConfig.get_models" +2typing.Iterator[Type[django.db.models.base.Model]]g +!Type[django.db.models.base.Model]: +django.db.models.base.Model"django.db.models.base.Model"type"typing.Iterator*F self< django.apps.config.AppConfig"django.apps.config.AppConfig*: include_auto_created diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.apps.registry.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.apps.registry.protobuf index d68212d9d..259c8fd73 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.apps.registry.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.apps.registry.protobuf @@ -1,5 +1,5 @@ -django.apps.registry +django.apps.registry Appsdjango.apps.registry.Apps"builtins.object* __init__"django.apps.registry.Apps.__init__" None*@ @@ -8,21 +8,21 @@ args Any* kwargs -Any* +Any* -get_models$django.apps.registry.Apps.get_models"G -builtins.list[Type[Any]] - Type[Any] -Any"type" builtins.list*@ +get_models$django.apps.registry.Apps.get_models" +0builtins.list[Type[django.db.models.base.Model]]g +!Type[django.db.models.base.Model]: +django.db.models.base.Model"django.db.models.base.Model"type" builtins.list*@ self6 django.apps.registry.Apps"django.apps.registry.Apps*: include_auto_created builtins.bool" builtins.bool *5 include_swapped - builtins.bool" builtins.bool * - get_model#django.apps.registry.Apps.get_model" - Type[Any] -Any"type*@ + builtins.bool" builtins.bool * + get_model#django.apps.registry.Apps.get_model"g +!Type[django.db.models.base.Model]: +django.db.models.base.Model"django.db.models.base.Model"type*@ self6 django.apps.registry.Apps"django.apps.registry.Apps*+ app_label @@ -37,8 +37,6 @@ model_nameD __annotations__$django.apps.registry.__annotations__W builtins.dict[builtins.str,Any] builtins.str" builtins.str -Any" builtins.dict*, -Modeldjango.apps.registry.Model -Any*Y +Any" builtins.dict*Y appsdjango.apps.registry.apps6 django.apps.registry.Apps"django.apps.registry.Apps \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.db.models.base.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.db.models.base.protobuf new file mode 100644 index 000000000..14f12f8d4 --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.db.models.base.protobuf @@ -0,0 +1,16 @@ + +django.db.models.base; + ModelBasedjango.db.models.base.ModelBase" builtins.type +Modeldjango.db.models.base.Model"builtins.object* +__init__$django.db.models.base.Model.__init__" +None*D +self: +django.db.models.base.Model"django.db.models.base.Model* +args +Any* +kwargs +Any@bdjango.db.models.base.ModelBase* +__annotations__%django.db.models.base.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.db.models.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.db.models.protobuf index 540a0048c..a0de420e9 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.db.models.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.db.models.protobuf @@ -10,7 +10,16 @@ kwargs Anyrw object'django.db.models.manager.Manager.objectD - django.db.models.manager.Manager" django.db.models.manager.Manager*q + django.db.models.manager.Manager" django.db.models.manager.Manager +Modeldjango.db.models.base.Model"builtins.object* +__init__$django.db.models.base.Model.__init__" +None*D +self: +django.db.models.base.Model"django.db.models.base.Model* +args +Any* +kwargs +Any@bdjango.db.models.base.ModelBase*q __path__django.db.models.__path__J builtins.list[builtins.str] builtins.str" builtins.str" builtins.list* @@ -18,6 +27,4 @@ builtins.dict[builtins.str,Any] builtins.str" builtins.str Any" builtins.dict*% -managerdjango.db.models.manager *( -Modeldjango.db.models.Model -Any \ No newline at end of file +managerdjango.db.models.manager  \ No newline at end of file diff --git a/python-frontend/typeshed_serializer/checksums/custom.checksum b/python-frontend/typeshed_serializer/checksums/custom.checksum index fe1f5520e..ecace0c6d 100644 --- a/python-frontend/typeshed_serializer/checksums/custom.checksum +++ b/python-frontend/typeshed_serializer/checksums/custom.checksum @@ -1,2 +1,2 @@ ff99a5ab4ee8349e8b21eeb3668e2e4990aa198e31cc27ca31aee9299e0bed67 -5ed498acd62426c597e0c2ab3ff0ab186b5cc72f27538e9d7627a996c36f4568 \ No newline at end of file +7886ceeda4958304a326174baba1ff7ac6c0298352b3e9699aa7322185d94f69 \ No newline at end of file diff --git a/python-frontend/typeshed_serializer/resources/custom/django/db/models/base.ipy b/python-frontend/typeshed_serializer/resources/custom/django/db/models/base.pyi similarity index 100% rename from python-frontend/typeshed_serializer/resources/custom/django/db/models/base.ipy rename to python-frontend/typeshed_serializer/resources/custom/django/db/models/base.pyi diff --git a/python-frontend/typeshed_serializer/tests/test_serializers.py b/python-frontend/typeshed_serializer/tests/test_serializers.py index 1d8853a28..17fd39834 100644 --- a/python-frontend/typeshed_serializer/tests/test_serializers.py +++ b/python-frontend/typeshed_serializer/tests/test_serializers.py @@ -74,7 +74,7 @@ def test_custom_stubs_serializer(typeshed_custom_stubs): custom_stubs_serializer.serialize() assert custom_stubs_serializer.get_build_result.call_count == 1 # Not every files from "typeshed_custom_stubs" build are serialized, as some are builtins - assert symbols.save_module.call_count == 335 + assert symbols.save_module.call_count == 336 def test_importer_serializer(): From 3270c6cc1cf8b358c686408552e22d707ac79866 Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Tue, 3 Mar 2026 16:58:14 +0100 Subject: [PATCH 014/322] SONARPY-3865 S8438 Reducing scope to target **kwargs only (#924) GitOrigin-RevId: f48f0e0ef3bb0b23cedbebe48b160aa647ff37b9 --- .../org/sonar/python/checks/utils/FunctionParameterUtils.java | 1 - 1 file changed, 1 deletion(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/utils/FunctionParameterUtils.java b/python-checks/src/main/java/org/sonar/python/checks/utils/FunctionParameterUtils.java index 11021fd9f..a509fb37e 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/utils/FunctionParameterUtils.java +++ b/python-checks/src/main/java/org/sonar/python/checks/utils/FunctionParameterUtils.java @@ -26,7 +26,6 @@ /** * Utility class for extracting function parameter information. - * Shared between FastAPIPathParametersCheck and DjangoViewUrlParametersCheck. */ public final class FunctionParameterUtils { From 4c4d88ebf85866d35b0104da3070b9e72d57a2bc Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Thu, 5 Mar 2026 07:55:57 +0100 Subject: [PATCH 015/322] SONARPY-3778 Create rule S8443: Django Command classes should inherit from BaseCommand (#883) Co-authored-by: Claude Opus 4.5 GitOrigin-RevId: 5c7e0b6eaf4e3a6edc9908b898f60e14f404b6ff --- .../django.core.management.base.protobuf | 108 +++++++++++++++++ .../django.core.management.protobuf | 109 ++++++++++++++++++ .../custom_protobuf/django.core.protobuf | 9 ++ .../django.views.generic.detail.protobuf | 12 +- .../django.views.generic.list.protobuf | 12 +- .../checksums/custom.checksum | 4 +- .../resources/custom/django/core/__init__.pyi | 0 .../django/core/management/__init__.pyi | 1 + .../custom/django/core/management/base.pyi | 39 +++++++ .../tests/test_serializers.py | 2 +- 10 files changed, 281 insertions(+), 15 deletions(-) create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.core.management.base.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.core.management.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.core.protobuf create mode 100644 python-frontend/typeshed_serializer/resources/custom/django/core/__init__.pyi create mode 100644 python-frontend/typeshed_serializer/resources/custom/django/core/management/__init__.pyi create mode 100644 python-frontend/typeshed_serializer/resources/custom/django/core/management/base.pyi diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.core.management.base.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.core.management.base.protobuf new file mode 100644 index 000000000..c4b7d5e75 --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.core.management.base.protobuf @@ -0,0 +1,108 @@ + +django.core.management.base + BaseCommand'django.core.management.base.BaseCommand"builtins.object* +__init__0django.core.management.base.BaseCommand.__init__" +None*\ +selfR +'django.core.management.base.BaseCommand"'django.core.management.base.BaseCommand* +stdoutu +#Union[typing.IO[builtins.str],None]B +typing.IO[builtins.str] + builtins.str" builtins.str" typing.IO +None * +stderru +#Union[typing.IO[builtins.str],None]B +typing.IO[builtins.str] + builtins.str" builtins.str" typing.IO +None *. +no_color + builtins.bool" builtins.bool *1 + force_color + builtins.bool" builtins.bool * + create_parser5django.core.management.base.BaseCommand.create_parser"2 +argparse.ArgumentParser"argparse.ArgumentParser*\ +selfR +'django.core.management.base.BaseCommand"'django.core.management.base.BaseCommand*+ + prog_name + builtins.str" builtins.str*T + +subcommandD +Union[builtins.str,None] + builtins.str" builtins.str +None* + add_arguments5django.core.management.base.BaseCommand.add_arguments" +None*\ +selfR +'django.core.management.base.BaseCommand"'django.core.management.base.BaseCommand*> +parser2 +argparse.ArgumentParser"argparse.ArgumentParser* +handle.django.core.management.base.BaseCommand.handle"D +Union[builtins.str,None] + builtins.str" builtins.str +None*\ +selfR +'django.core.management.base.BaseCommand"'django.core.management.base.BaseCommand* +args +Any* +options +Any* +execute/django.core.management.base.BaseCommand.execute"D +Union[builtins.str,None] + builtins.str" builtins.str +None*\ +selfR +'django.core.management.base.BaseCommand"'django.core.management.base.BaseCommand* +args +Any* +options +Any* + +print_help2django.core.management.base.BaseCommand.print_help" +None*\ +selfR +'django.core.management.base.BaseCommand"'django.core.management.base.BaseCommand*+ + prog_name + builtins.str" builtins.str*T + +subcommandD +Union[builtins.str,None] + builtins.str" builtins.str +None* + get_version3django.core.management.base.BaseCommand.get_version" + builtins.str" builtins.str*\ +selfR +'django.core.management.base.BaseCommand"'django.core.management.base.BaseCommandrR +help,django.core.management.base.BaseCommand.help + builtins.str" builtins.strr~ +_called_from_command_lineAdjango.core.management.base.BaseCommand._called_from_command_line + builtins.bool" builtins.boolrp +output_transaction:django.core.management.base.BaseCommand.output_transaction + builtins.bool" builtins.boolr +requires_migrations_checksBdjango.core.management.base.BaseCommand.requires_migrations_checks + builtins.bool" builtins.boolr +requires_system_checks>django.core.management.base.BaseCommand.requires_system_checks +1Union[builtins.str,typing.Sequence[builtins.str]] + builtins.str" builtins.strN +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.Sequencer +base_stealth_options +parser2 +argparse.ArgumentParser"argparse.ArgumentParser* +handle.django.core.management.base.BaseCommand.handle"D +Union[builtins.str,None] + builtins.str" builtins.str +None*\ +selfR +'django.core.management.base.BaseCommand"'django.core.management.base.BaseCommand* +args +Any* +options +Any* +execute/django.core.management.base.BaseCommand.execute"D +Union[builtins.str,None] + builtins.str" builtins.str +None*\ +selfR +'django.core.management.base.BaseCommand"'django.core.management.base.BaseCommand* +args +Any* +options +Any* + +print_help2django.core.management.base.BaseCommand.print_help" +None*\ +selfR +'django.core.management.base.BaseCommand"'django.core.management.base.BaseCommand*+ + prog_name + builtins.str" builtins.str*T + +subcommandD +Union[builtins.str,None] + builtins.str" builtins.str +None* + get_version3django.core.management.base.BaseCommand.get_version" + builtins.str" builtins.str*\ +selfR +'django.core.management.base.BaseCommand"'django.core.management.base.BaseCommandrR +help,django.core.management.base.BaseCommand.help + builtins.str" builtins.strr~ +_called_from_command_lineAdjango.core.management.base.BaseCommand._called_from_command_line + builtins.bool" builtins.boolrp +output_transaction:django.core.management.base.BaseCommand.output_transaction + builtins.bool" builtins.boolr +requires_migrations_checksBdjango.core.management.base.BaseCommand.requires_migrations_checks + builtins.bool" builtins.boolr +requires_system_checks>django.core.management.base.BaseCommand.requires_system_checks +1Union[builtins.str,typing.Sequence[builtins.str]] + builtins.str" builtins.strN +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.Sequencer +base_stealth_options None: ... + def create_parser( + self, + prog_name: str, + subcommand: str | None, + ) -> argparse.ArgumentParser: ... + def add_arguments(self, parser: argparse.ArgumentParser) -> None: ... + def handle(self, *args: Any, **options: Any) -> str | None: ... + def execute(self, *args: Any, **options: Any) -> str | None: ... + def print_help(self, prog_name: str, subcommand: str | None) -> None: ... + def get_version(self) -> str: ... diff --git a/python-frontend/typeshed_serializer/tests/test_serializers.py b/python-frontend/typeshed_serializer/tests/test_serializers.py index 17fd39834..b46888e5c 100644 --- a/python-frontend/typeshed_serializer/tests/test_serializers.py +++ b/python-frontend/typeshed_serializer/tests/test_serializers.py @@ -74,7 +74,7 @@ def test_custom_stubs_serializer(typeshed_custom_stubs): custom_stubs_serializer.serialize() assert custom_stubs_serializer.get_build_result.call_count == 1 # Not every files from "typeshed_custom_stubs" build are serialized, as some are builtins - assert symbols.save_module.call_count == 336 + assert symbols.save_module.call_count == 339 def test_importer_serializer(): From b68ef89d1dac7841882ac19439a7c5835b997059 Mon Sep 17 00:00:00 2001 From: Thomas Serre <118730793+thomas-serre-sonarsource@users.noreply.github.com> Date: Thu, 5 Mar 2026 15:42:00 +0100 Subject: [PATCH 016/322] SONARPY-3424 S112: Raise when passing a newly constructed Exception or BaseException to function (#935) GitOrigin-RevId: 41f1ed016cc89b82303afa1f2ef50dca4645e55e --- .../checks/GenericExceptionRaisedCheck.java | 63 +++++++++++++------ .../genericExceptionRaised.py | 13 ++++ 2 files changed, 58 insertions(+), 18 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/GenericExceptionRaisedCheck.java b/python-checks/src/main/java/org/sonar/python/checks/GenericExceptionRaisedCheck.java index f50d81bc5..03032b30f 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/GenericExceptionRaisedCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/GenericExceptionRaisedCheck.java @@ -19,11 +19,15 @@ import java.util.List; import org.sonar.check.Rule; import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; import org.sonar.plugins.python.api.symbols.v2.SymbolV2; import org.sonar.plugins.python.api.symbols.v2.UsageV2; +import org.sonar.plugins.python.api.tree.Argument; +import org.sonar.plugins.python.api.tree.CallExpression; import org.sonar.plugins.python.api.tree.Expression; import org.sonar.plugins.python.api.tree.Name; import org.sonar.plugins.python.api.tree.RaiseStatement; +import org.sonar.plugins.python.api.tree.RegularArgument; import org.sonar.plugins.python.api.tree.Tree; import org.sonar.plugins.python.api.tree.Tree.Kind; import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; @@ -36,6 +40,8 @@ @Rule(key = "S112") public class GenericExceptionRaisedCheck extends PythonSubscriptionCheck { + private static final String MESSAGE = "Replace this generic exception class with a more specific one."; + private final TypeMatcher isExceptionOrBaseExceptionMatcher = TypeMatchers.any( TypeMatchers.isObjectOfType(EXCEPTION), TypeMatchers.isObjectOfType(BASE_EXCEPTION), @@ -43,35 +49,56 @@ public class GenericExceptionRaisedCheck extends PythonSubscriptionCheck { TypeMatchers.isType(BASE_EXCEPTION) ); + private final TypeMatcher isObjectOfTypeExceptionOrBaseExceptionMatcher = TypeMatchers.any( + TypeMatchers.isObjectOfType(EXCEPTION), + TypeMatchers.isObjectOfType(BASE_EXCEPTION) + ); + @Override public void initialize(Context context) { - context.registerSyntaxNodeConsumer(Kind.RAISE_STMT, ctx -> { - RaiseStatement raise = (RaiseStatement) ctx.syntaxNode(); - List expressions = raise.expressions(); - if (expressions.isEmpty()) { - return; - } + context.registerSyntaxNodeConsumer(Kind.RAISE_STMT, this::checkRaise); + context.registerSyntaxNodeConsumer(Kind.CALL_EXPR, this::checkFunctionCall); + } + + private void checkRaise(SubscriptionContext ctx) { + RaiseStatement raise = (RaiseStatement) ctx.syntaxNode(); + List expressions = raise.expressions(); + if (expressions.isEmpty()) { + return; + } - Expression expression = expressions.get(0); - if (!isExceptionOrBaseExceptionMatcher.isTrueFor(expression, ctx)) { - return; + Expression expression = expressions.get(0); + if (!isExceptionOrBaseExceptionMatcher.isTrueFor(expression, ctx)) { + return; + } + if (!isExceptionFunctionLocal(expression, raise)) { + return; + } + ctx.addIssue(expression, MESSAGE); + } + + private void checkFunctionCall(SubscriptionContext ctx) { + CallExpression call = (CallExpression) ctx.syntaxNode(); + List arguments = call.arguments(); + for (Argument arg : arguments) { + if (!(arg instanceof RegularArgument regArg) || regArg.keywordArgument() != null) { + continue; } - if (!isExceptionFunctionLocal(expression, raise)) { - return; + Expression argExpr = regArg.expression(); + if (isObjectOfTypeExceptionOrBaseExceptionMatcher.isTrueFor(argExpr, ctx) && isExceptionFunctionLocal(argExpr, call)) { + ctx.addIssue(argExpr, MESSAGE); } - - ctx.addIssue(expression, "Replace this generic exception class with a more specific one."); - }); + } } - private static boolean isExceptionFunctionLocal(Expression expression, RaiseStatement raise) { + private static boolean isExceptionFunctionLocal(Expression expression, Tree contextTree) { if (!(expression instanceof Name name)) return true; SymbolV2 symbolV2 = name.symbolV2(); - return symbolV2 == null || isLocalVariable(symbolV2, raise); + return symbolV2 == null || isLocalVariable(symbolV2, contextTree); } - private static boolean isLocalVariable(SymbolV2 symbol, Tree raiseStatement) { - Tree function = TreeUtils.firstAncestorOfKind(raiseStatement, Kind.FUNCDEF); + private static boolean isLocalVariable(SymbolV2 symbol, Tree contextTree) { + Tree function = TreeUtils.firstAncestorOfKind(contextTree, Kind.FUNCDEF); if (function == null) { return false; } diff --git a/python-checks/src/test/resources/checks/genericException/genericExceptionRaised.py b/python-checks/src/test/resources/checks/genericException/genericExceptionRaised.py index 1cf03e093..73295530f 100644 --- a/python-checks/src/test/resources/checks/genericException/genericExceptionRaised.py +++ b/python-checks/src/test/resources/checks/genericException/genericExceptionRaised.py @@ -55,3 +55,16 @@ def raised_exception_is_the_parameter(exception: BaseException): global_exception = BaseException() def raise_global_exception(): raise global_exception + +def handle_exception(e: Exception): + raise e + +def intermediate_handle_exception(e: Exception): + handle_exception(e) + +def constructed_exceptions_passed_to_handle_exception_raise(): + handle_exception(Exception()) # Noncompliant + handle_exception(BaseException()) # Noncompliant + +def is_instance_do_not_raise(e): + isInstance(e, Exception) From 68297ba75dc31bac57a80691f87495cf37194f51 Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Fri, 6 Mar 2026 08:42:09 +0100 Subject: [PATCH 017/322] SONARPY-3772 Implement S8439: Django view functions should include all URL parameters (#887) Co-authored-by: Claude Opus 4.5 GitOrigin-RevId: 11f315cd45432aad488a71d85ecb98401f661a2a --- .../org/sonar/python/checks/utils/FunctionParameterUtils.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/utils/FunctionParameterUtils.java b/python-checks/src/main/java/org/sonar/python/checks/utils/FunctionParameterUtils.java index a509fb37e..38a3a7f07 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/utils/FunctionParameterUtils.java +++ b/python-checks/src/main/java/org/sonar/python/checks/utils/FunctionParameterUtils.java @@ -30,7 +30,6 @@ public final class FunctionParameterUtils { private FunctionParameterUtils() { - // Utility class } /** @@ -60,7 +59,7 @@ public static Optional getFunctionType(FunctionDef functionDef) { return Optional.empty(); } - private static FunctionParameterInfo buildParameterInfo(FunctionType functionType) { + public static FunctionParameterInfo buildParameterInfo(FunctionType functionType) { Set allParams = new HashSet<>(); Set positionalOnlyParams = new HashSet<>(); boolean hasVariadicKeyword = functionType.parameters().stream() From 670160acf1f2e8fa742ece60defad46d716b3482 Mon Sep 17 00:00:00 2001 From: Marc Jasper Date: Fri, 6 Mar 2026 15:06:20 +0100 Subject: [PATCH 018/322] SONARPY-3777 Create rule S8486: Django middleware should call super().__init__() with appropriate parameters (#942) GitOrigin-RevId: 206bc88b5254dc61cbeb86663b072ceedadfb2b8 --- .../django.contrib.auth.middleware.protobuf | 25 +++++++++++++++++++ .../django.contrib.auth.protobuf | 11 ++++++++ .../custom_protobuf/django.contrib.protobuf | 10 ++++++++ .../types/custom_protobuf/django.protobuf | 3 ++- .../django.utils.deprecation.protobuf | 23 +++++++++++++++++ .../resources/custom/django/__init__.pyi | 1 + .../custom/django/contrib/__init__.pyi | 1 + .../custom/django/contrib/auth/__init__.pyi | 1 + .../custom/django/contrib/auth/middleware.pyi | 9 +++++++ .../custom/django/utils/__init__.pyi | 1 + .../custom/django/utils/deprecation.pyi | 6 +++++ .../tests/test_serializers.py | 2 +- 12 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.contrib.auth.middleware.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.contrib.auth.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.contrib.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.utils.deprecation.protobuf create mode 100644 python-frontend/typeshed_serializer/resources/custom/django/contrib/__init__.pyi create mode 100644 python-frontend/typeshed_serializer/resources/custom/django/contrib/auth/__init__.pyi create mode 100644 python-frontend/typeshed_serializer/resources/custom/django/contrib/auth/middleware.pyi create mode 100644 python-frontend/typeshed_serializer/resources/custom/django/utils/deprecation.pyi diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.contrib.auth.middleware.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.contrib.auth.middleware.protobuf new file mode 100644 index 000000000..6698b0e6c --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.contrib.auth.middleware.protobuf @@ -0,0 +1,25 @@ + +django.contrib.auth.middleware +RemoteUserMiddleware3django.contrib.auth.middleware.RemoteUserMiddleware"builtins.object* +__init__ None: ... + def __call__(self, request: Any) -> Any: ... + +class PersistentRemoteUserMiddleware(RemoteUserMiddleware): ... diff --git a/python-frontend/typeshed_serializer/resources/custom/django/utils/__init__.pyi b/python-frontend/typeshed_serializer/resources/custom/django/utils/__init__.pyi index 86ca4ac69..67dc54c09 100644 --- a/python-frontend/typeshed_serializer/resources/custom/django/utils/__init__.pyi +++ b/python-frontend/typeshed_serializer/resources/custom/django/utils/__init__.pyi @@ -1 +1,2 @@ import django.utils.html as html +import django.utils.deprecation as deprecation \ No newline at end of file diff --git a/python-frontend/typeshed_serializer/resources/custom/django/utils/deprecation.pyi b/python-frontend/typeshed_serializer/resources/custom/django/utils/deprecation.pyi new file mode 100644 index 000000000..933bce189 --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/django/utils/deprecation.pyi @@ -0,0 +1,6 @@ +from typing import Any, Callable + +class MiddlewareMixin: + get_response: Callable[..., Any] + def __init__(self, get_response: Callable[..., Any]) -> None: ... + def __call__(self, request: Any) -> Any: ... diff --git a/python-frontend/typeshed_serializer/tests/test_serializers.py b/python-frontend/typeshed_serializer/tests/test_serializers.py index b46888e5c..9cf9a717b 100644 --- a/python-frontend/typeshed_serializer/tests/test_serializers.py +++ b/python-frontend/typeshed_serializer/tests/test_serializers.py @@ -74,7 +74,7 @@ def test_custom_stubs_serializer(typeshed_custom_stubs): custom_stubs_serializer.serialize() assert custom_stubs_serializer.get_build_result.call_count == 1 # Not every files from "typeshed_custom_stubs" build are serialized, as some are builtins - assert symbols.save_module.call_count == 339 + assert symbols.save_module.call_count == 343 def test_importer_serializer(): From 27baffef51c6f207ee26d4bbc2aafbf270fed27a Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Fri, 6 Mar 2026 15:29:58 +0100 Subject: [PATCH 019/322] SONARPY-3776: Extend S5344: Detect direct password assignment to Django User model instead of using set_password() or create_user() (#920) GitOrigin-RevId: b92267be8d757cafc0d293e80871330f844c4a9b --- .../hotspots/FastHashingOrPlainTextCheck.java | 225 ++++++++++-------- .../fastHashingOrPlainText.py | 40 ++++ .../django.contrib.auth.models.protobuf | 72 ++++++ .../django.contrib.auth.protobuf | 71 +++++- .../custom_protobuf/django.utils.protobuf | 3 +- .../org/sonar/python/types/TypeShedTest.java | 10 + .../checksums/custom.checksum | 4 +- .../resources/custom/django/__init__.pyi | 1 + .../custom/django/contrib/auth/__init__.pyi | 9 + .../custom/django/contrib/auth/models.pyi | 36 +++ 10 files changed, 361 insertions(+), 110 deletions(-) create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.contrib.auth.models.protobuf create mode 100644 python-frontend/typeshed_serializer/resources/custom/django/contrib/auth/models.pyi diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/FastHashingOrPlainTextCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/FastHashingOrPlainTextCheck.java index 72e915e76..1d724533d 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/FastHashingOrPlainTextCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/FastHashingOrPlainTextCheck.java @@ -37,6 +37,8 @@ import org.sonar.plugins.python.api.tree.StringLiteral; import org.sonar.plugins.python.api.tree.SubscriptionExpression; import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; import org.sonar.python.checks.hotspots.CommonValidationUtils.ArgumentValidator; import org.sonar.python.checks.hotspots.CommonValidationUtils.CallValidator; import org.sonar.python.tree.TreeUtils; @@ -58,149 +60,144 @@ public class FastHashingOrPlainTextCheck extends PythonSubscriptionCheck { private static final String ARGON2_MESSAGE = "Use secure Argon2 parameters."; private static final String BCRYPT_MESSAGE = "Use strong bcrypt parameters."; private static final String DJANGO_MESSAGE = "Use a secure hashing algorithm to store passwords."; + private static final String DJANGO_PASSWORD_MESSAGE = "Use set_password() or create_user() to properly hash passwords."; private static final Set PBKDF2_ALGOS = Set.of( "sha1", "sha256", - "sha512" - ); + "sha512"); private static final String ROUNDS = "rounds"; private static final Set DJANGO_FIRST_FORBIDDEN_HASHERS = Set.of( "django.contrib.auth.hashers.SHA1PasswordHasher", "django.contrib.auth.hashers.MD5PasswordHasher", "django.contrib.auth.hashers.UnsaltedSHA1PasswordHasher", "django.contrib.auth.hashers.UnsaltedMD5PasswordHasher", - "django.contrib.auth.hashers.CryptPasswordHasher" - ); - + "django.contrib.auth.hashers.CryptPasswordHasher"); private static final ArgumentValidator SCRYPT_R = new ArgumentValidator( 3, "r", (ctx, argument) -> { - if (isLessThan(argument.expression(), 8)) { - ctx.addIssue(argument, SCRYPT_PARAMETERS_MESSAGE); - } - }); + if (isLessThan(argument.expression(), 8)) { + ctx.addIssue(argument, SCRYPT_PARAMETERS_MESSAGE); + } + }); private static final ArgumentValidator SCRYPT_BUFLEN = new ArgumentValidator( 5, "buflen", (ctx, argument) -> { - if (isLessThan(argument.expression(), 32)) { - ctx.addIssue(argument, SCRYPT_PARAMETERS_MESSAGE); - } - }); + if (isLessThan(argument.expression(), 32)) { + ctx.addIssue(argument, SCRYPT_PARAMETERS_MESSAGE); + } + }); private static final ArgumentValidator SCRYPT_N = new ArgumentValidator( 2, "N", (ctx, argument) -> { - if (isLessThan(argument.expression(), (int) Math.pow(2, 13)) || isLessThanExponent(argument.expression(), 13)) { - ctx.addIssue(argument, SCRYPT_PARAMETERS_MESSAGE); - } - }); + if (isLessThan(argument.expression(), (int) Math.pow(2, 13)) || isLessThanExponent(argument.expression(), 13)) { + ctx.addIssue(argument, SCRYPT_PARAMETERS_MESSAGE); + } + }); private static final ArgumentValidator HASHLIB_R = new ArgumentValidator( 3, "r", (ctx, argument) -> { - if (isLessThan(argument.expression(), 8)) { - ctx.addIssue(argument, SCRYPT_PARAMETERS_MESSAGE); - } - }); + if (isLessThan(argument.expression(), 8)) { + ctx.addIssue(argument, SCRYPT_PARAMETERS_MESSAGE); + } + }); private static final ArgumentValidator HASHLIB_N = new ArgumentValidator( 2, "n", (ctx, argument) -> { - if (isLessThan(argument.expression(), (int) Math.pow(2, 13)) || isLessThanExponent(argument.expression(), 13)) { - ctx.addIssue(argument, SCRYPT_PARAMETERS_MESSAGE); - } - }); + if (isLessThan(argument.expression(), (int) Math.pow(2, 13)) || isLessThanExponent(argument.expression(), 13)) { + ctx.addIssue(argument, SCRYPT_PARAMETERS_MESSAGE); + } + }); private static final ArgumentValidator HASHLIB_DKLEN = new ArgumentValidator( 6, "dklen", (ctx, argument) -> { - if (isLessThan(argument.expression(), 32)) { - ctx.addIssue(argument, SCRYPT_PARAMETERS_MESSAGE); - } - }); + if (isLessThan(argument.expression(), 32)) { + ctx.addIssue(argument, SCRYPT_PARAMETERS_MESSAGE); + } + }); private static final ArgumentValidator CRYPTOGRAPHY_R = new ArgumentValidator( 3, "r", (ctx, argument) -> { - if (isLessThan(argument.expression(), 8)) { - ctx.addIssue(argument, SCRYPT_PARAMETERS_MESSAGE); - } - }); + if (isLessThan(argument.expression(), 8)) { + ctx.addIssue(argument, SCRYPT_PARAMETERS_MESSAGE); + } + }); private static final ArgumentValidator CRYPTOGRAPHY_N = new ArgumentValidator( 2, "n", (ctx, argument) -> { - if (isLessThan(argument.expression(), (int) Math.pow(2, 13)) || isLessThanExponent(argument.expression(), 13)) { - ctx.addIssue(argument, SCRYPT_PARAMETERS_MESSAGE); - } - }); + if (isLessThan(argument.expression(), (int) Math.pow(2, 13)) || isLessThanExponent(argument.expression(), 13)) { + ctx.addIssue(argument, SCRYPT_PARAMETERS_MESSAGE); + } + }); private static final ArgumentValidator CRYPTOGRAPHY_LENGTH = new ArgumentValidator( 1, "length", (ctx, argument) -> { - if (isLessThan(argument.expression(), 32)) { - ctx.addIssue(argument, SCRYPT_PARAMETERS_MESSAGE); - } - }); + if (isLessThan(argument.expression(), 32)) { + ctx.addIssue(argument, SCRYPT_PARAMETERS_MESSAGE); + } + }); private static final ArgumentValidator PASSLIB_BLOCK_SIZE = new ArgumentValidator( 3, "block_size", (ctx, argument) -> { - if (isLessThan(argument.expression(), 8)) { - ctx.addIssue(argument, SCRYPT_PARAMETERS_MESSAGE); - } - }); + if (isLessThan(argument.expression(), 8)) { + ctx.addIssue(argument, SCRYPT_PARAMETERS_MESSAGE); + } + }); private static final ArgumentValidator PASSLIB_ROUNDS = new ArgumentValidator( 2, ROUNDS, (ctx, argument) -> { - if (isLessThan(argument.expression(), 12)) { - ctx.addIssue(argument, SCRYPT_PARAMETERS_MESSAGE); - } - }); - + if (isLessThan(argument.expression(), 12)) { + ctx.addIssue(argument, SCRYPT_PARAMETERS_MESSAGE); + } + }); private static final ArgumentValidator PASSLIB_PBKDF2 = new ArgumentValidator( 2, ROUNDS, (ctx, argument) -> { - if (isLessThan(argument.expression(), 100_000)) { - ctx.addIssue(argument, PBKDF2_MESSAGE); - } - }); + if (isLessThan(argument.expression(), 100_000)) { + ctx.addIssue(argument, PBKDF2_MESSAGE); + } + }); private static final CallValidator CRYPTOGRAPHY_PBKDF2 = new PBKDF2Validator(0, "algorithm", 3, "iterations"); private static final CallValidator HASHLIB_PBKDF2 = new PBKDF2Validator(0, "hash_name", 3, "iterations"); private static final CallValidator PASSLIB_MISSING_ROUNDS = new MissingArgumentValidator( - 2, ROUNDS, PBKDF2_MESSAGE - ); + 2, ROUNDS, PBKDF2_MESSAGE); private static final CallValidator BCRYPT_GENSALT = new ArgumentValidator( 0, ROUNDS, (ctx, argument) -> { - if (isLessThan(argument.expression(), 12)) { - ctx.addIssue(argument, BCRYPT_MESSAGE); - } - }); + if (isLessThan(argument.expression(), 12)) { + ctx.addIssue(argument, BCRYPT_MESSAGE); + } + }); private static final CallValidator BCRYPT_KDF = new ArgumentValidator( 3, ROUNDS, (ctx, argument) -> { - if (isLessThan(argument.expression(), 4096) || isLessThanExponent(argument.expression(), 12)) { - ctx.addIssue(argument, BCRYPT_MESSAGE); - } - }); + if (isLessThan(argument.expression(), 4096) || isLessThanExponent(argument.expression(), 12)) { + ctx.addIssue(argument, BCRYPT_MESSAGE); + } + }); private static final CallValidator PASSLIB_BCRYPT = new ArgumentValidator( 3, ROUNDS, (ctx, argument) -> { - if (isLessThan(argument.expression(), 12)) { - ctx.addIssue(argument, BCRYPT_MESSAGE); - } - }); + if (isLessThan(argument.expression(), 12)) { + ctx.addIssue(argument, BCRYPT_MESSAGE); + } + }); private static final CallValidator FLASK_BCRYPT = new ArgumentValidator( 1, ROUNDS, (ctx, argument) -> { - if (isLessThan(argument.expression(), 12)) { - ctx.addIssue(argument, BCRYPT_MESSAGE); - } - }); - + if (isLessThan(argument.expression(), 12)) { + ctx.addIssue(argument, BCRYPT_MESSAGE); + } + }); private TypeCheckBuilder argon2IDTypeChecker = null; private final CallValidator argon2Type = new ArgumentValidator( 0, "type", (ctx, argument) -> { - if (argon2IDTypeChecker.check(argument.expression().typeV2()) == TriBool.FALSE) { - ctx.addIssue(argument, "Use Argon2ID to improve the security of the passwords."); - } - }); + if (argon2IDTypeChecker.check(argument.expression().typeV2()) == TriBool.FALSE) { + ctx.addIssue(argument, "Use Argon2ID to improve the security of the passwords."); + } + }); private TypeCheckBuilder argon2VersionTypeChecker = null; private final CallValidator argon2Version = new ArgumentValidator( 1, "version", (ctx, argument) -> { - var typeCheck = argon2VersionTypeChecker.check(argument.expression().typeV2()); - if (typeCheck == TriBool.TRUE) { - return; - } - if (!isEqualTo(argument.expression(), 19)) { - ctx.addIssue(argument, "Use the latest version of Argon2 ID."); - } - }); + var typeCheck = argon2VersionTypeChecker.check(argument.expression().typeV2()); + if (typeCheck == TriBool.TRUE) { + return; + } + if (!isEqualTo(argument.expression(), 19)) { + ctx.addIssue(argument, "Use the latest version of Argon2 ID."); + } + }); private final Map> callExpressionValidators = Map.ofEntries( Map.entry("scrypt.hash", List.of(SCRYPT_R, SCRYPT_BUFLEN, SCRYPT_N)), @@ -216,24 +213,24 @@ public class FastHashingOrPlainTextCheck extends PythonSubscriptionCheck { Map.entry("passlib.handlers.argon2._Argon2Common.using", List.of(new Argon2PasswordHasherValidator(3, 4, 5))), Map.entry("bcrypt.gensalt", List.of(BCRYPT_GENSALT)), Map.entry("bcrypt.kdf", List.of(BCRYPT_KDF)), - Map.entry("flask_bcrypt.generate_password_hash", List.of(FLASK_BCRYPT)) - ); + Map.entry("flask_bcrypt.generate_password_hash", List.of(FLASK_BCRYPT))); private static final Map> CALL_EXPRESSION_VALIDATORS_V1 = Map.ofEntries( - Map.entry("flask_bcrypt.Bcrypt.generate_password_hash", List.of(FLASK_BCRYPT)) - ); + Map.entry("flask_bcrypt.Bcrypt.generate_password_hash", List.of(FLASK_BCRYPT))); private static final Map> QUALIFIED_EXPR_VALIDATOR = Map.of( "passlib.hash.pbkdf2_sha1.using", List.of(PASSLIB_PBKDF2), "passlib.hash.pbkdf2_sha256.using", List.of(PASSLIB_PBKDF2, PASSLIB_MISSING_ROUNDS), "passlib.hash.pbkdf2_sha512.using", List.of(PASSLIB_PBKDF2, PASSLIB_MISSING_ROUNDS), - "passlib.hash.bcrypt.using", List.of(PASSLIB_BCRYPT) - ); + "passlib.hash.bcrypt.using", List.of(PASSLIB_BCRYPT)); + private static final TypeMatcher djangoUserInstanceMatcher = TypeMatchers.isObjectInstanceOf("django.contrib.auth.models.AbstractBaseUser"); + private static final TypeMatcher djangoUserManagerCreateTypeChecker = TypeMatchers.isType("django.contrib.auth.models.UserManager.create"); private TypeCheckBuilder argon2CheapestProfileTypeChecker = null; private TypeCheckBuilder flaskConfigTypeChecker = null; private TypeCheckMap> typeCheckMap = null; + @Override public void initialize(Context context) { context.registerSyntaxNodeConsumer(Tree.Kind.FILE_INPUT, this::registerTypeCheckers); @@ -245,7 +242,8 @@ public void initialize(Context context) { }); context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, this::checkCallExpr); context.registerSyntaxNodeConsumer(Tree.Kind.NAME, this::checkName); - context.registerSyntaxNodeConsumer(Tree.Kind.ASSIGNMENT_STMT, subscriptionContext -> checkAssignment(subscriptionContext, flaskConfigTypeChecker)); + context.registerSyntaxNodeConsumer(Tree.Kind.ASSIGNMENT_STMT, subscriptionContext -> checkAssignmentOnFlaskConfig(subscriptionContext, flaskConfigTypeChecker)); + context.registerSyntaxNodeConsumer(Tree.Kind.ASSIGNMENT_STMT, FastHashingOrPlainTextCheck::checkDjangoUserPasswordAssignment); } private static void checkDjangoHasher(SubscriptionContext subscriptionContext) { @@ -275,6 +273,7 @@ private void registerTypeCheckers(SubscriptionContext subscriptionContext) { flaskConfigTypeChecker = subscriptionContext.typeChecker().typeCheckBuilder().isInstanceOf("flask.config.Config"); argon2IDTypeChecker = subscriptionContext.typeChecker().typeCheckBuilder().isTypeWithFqn("argon2.low_level.Type.ID"); argon2VersionTypeChecker = subscriptionContext.typeChecker().typeCheckBuilder().isTypeWithFqn("argon2.low_level.ARGON2_VERSION"); + typeCheckMap = new TypeCheckMap<>(); callExpressionValidators.forEach((key, value) -> { var typeCheckBuilder = subscriptionContext.typeChecker().typeCheckBuilder().isTypeWithFqn(key); @@ -282,7 +281,7 @@ private void registerTypeCheckers(SubscriptionContext subscriptionContext) { }); } - private static void checkAssignment(SubscriptionContext subscriptionContext, TypeCheckBuilder flaskConfigTypeChecker) { + private static void checkAssignmentOnFlaskConfig(SubscriptionContext subscriptionContext, TypeCheckBuilder flaskConfigTypeChecker) { var stmt = (AssignmentStatement) subscriptionContext.syntaxNode(); var lhsSubscription = stmt.lhsExpressions().stream().findFirst() .map(ExpressionList::expressions) @@ -313,6 +312,17 @@ private static boolean subscriptionIsFlaskBcryptConfig(Expression expression, Ty return subscriptMatch.isPresent(); } + private static void checkDjangoUserPasswordAssignment(SubscriptionContext subscriptionContext) { + var assignment = (AssignmentStatement) subscriptionContext.syntaxNode(); + // Check if LHS is `user.password = ...` where user is an instance of AbstractBaseUser + if (assignment.lhsExpressions().get(0).expressions().size() == 1 + && assignment.lhsExpressions().get(0).expressions().get(0) instanceof QualifiedExpression qualifiedExpression + && "password".equals(qualifiedExpression.name().name()) + && djangoUserInstanceMatcher.isTrueFor(qualifiedExpression.qualifier(), subscriptionContext)) { + subscriptionContext.addIssue(assignment.lhsExpressions().get(0), DJANGO_PASSWORD_MESSAGE); + } + } + private void checkName(SubscriptionContext subscriptionContext) { var name = (Name) subscriptionContext.syntaxNode(); if (argon2CheapestProfileTypeChecker.check(name.typeV2()) != TriBool.TRUE) { @@ -347,18 +357,27 @@ private void checkCallExpr(SubscriptionContext subscriptionContext) { var configs = QUALIFIED_EXPR_VALIDATOR.getOrDefault(fqn, List.of()); configs.forEach(config -> config.validate(subscriptionContext, callExpression)); } + + // Check for Django User.objects.create(password=...) - should use create_user() instead + checkDjangoUserManagerCreate(subscriptionContext, callExpression); + } + + private static void checkDjangoUserManagerCreate(SubscriptionContext subscriptionContext, CallExpression callExpression) { + if (!djangoUserManagerCreateTypeChecker.isTrueFor(callExpression.callee(), subscriptionContext)) { + return; + } + Optional.ofNullable(TreeUtils.argumentByKeyword("password", callExpression.arguments())) + .ifPresent(passwordArg -> subscriptionContext.addIssue(passwordArg, DJANGO_PASSWORD_MESSAGE)); } record PBKDF2Validator( int algoPosition, String algoKeyword, int iterationsPosition, - String iterationsKeyword - ) implements CallValidator { + String iterationsKeyword) implements CallValidator { @Override public void validate(SubscriptionContext ctx, CallExpression callExpression) { - var algoArgument = - nthArgumentOrKeywordOptional(algoPosition, algoKeyword, callExpression.arguments()); + var algoArgument = nthArgumentOrKeywordOptional(algoPosition, algoKeyword, callExpression.arguments()); var algoString = algoArgument .map(RegularArgument::expression) .map(CommonValidationUtils::singleAssignedString) @@ -382,17 +401,13 @@ public void validate(SubscriptionContext ctx, CallExpression callExpression) { record Argon2PasswordHasherValidator( int timeCostPosition, int memoryCostPosition, - int parallelismPosition - ) implements CallValidator { + int parallelismPosition) implements CallValidator { @Override public void validate(SubscriptionContext ctx, CallExpression callExpression) { - var timeCostArgument = - nthArgumentOrKeyword(timeCostPosition, "time_cost", callExpression.arguments()); - var memoryCostArgument = - nthArgumentOrKeyword(memoryCostPosition, "memory_cost", callExpression.arguments()); - var parallelismArgument = - nthArgumentOrKeyword(parallelismPosition, "parallelism", callExpression.arguments()); + var timeCostArgument = nthArgumentOrKeyword(timeCostPosition, "time_cost", callExpression.arguments()); + var memoryCostArgument = nthArgumentOrKeyword(memoryCostPosition, "memory_cost", callExpression.arguments()); + var parallelismArgument = nthArgumentOrKeyword(parallelismPosition, "parallelism", callExpression.arguments()); var isTimeCostNOk = timeCostArgument != null && isLessThan(timeCostArgument.expression(), 5); var isMemoryCostNOk = memoryCostArgument != null && isLessThan(memoryCostArgument.expression(), 7168); diff --git a/python-checks/src/test/resources/checks/fastHashingOrPlainText/fastHashingOrPlainText.py b/python-checks/src/test/resources/checks/fastHashingOrPlainText/fastHashingOrPlainText.py index 23856e7ec..cb4459254 100644 --- a/python-checks/src/test/resources/checks/fastHashingOrPlainText/fastHashingOrPlainText.py +++ b/python-checks/src/test/resources/checks/fastHashingOrPlainText/fastHashingOrPlainText.py @@ -368,3 +368,43 @@ def flask_config(): PASSWORD_HASHERS = [ "django.contrib.auth.hashers.UnsaltedSHA1PasswordHasher", # OK outside of settings.py ] + + +## Django User Password + +def django_user_password_assignment(): + from django.contrib.auth.models import User + + user = User() + user.username = 'john' + user.password = 'mysecretpassword' # Noncompliant {{Use set_password() or create_user() to properly hash passwords.}} + user.save() + + # Compliant - using set_password() + user2 = User() + user2.set_password('mysecretpassword') + user2.save() + + # Compliant - setting other attributes + user3 = User() + user3.username = 'jane' + user3.email = 'jane@example.com' + + +def django_user_create(): + from django.contrib.auth.models import User + + # Using create() with password argument + user = User.objects.create( + username='john', + password='mysecretpassword' # Noncompliant {{Use set_password() or create_user() to properly hash passwords.}} + ) + + # Compliant - using create_user() + user = User.objects.create_user( + username='john', + password='mysecretpassword' + ) + + # Compliant - using create() without password argument + user = User.objects.create(username='john') diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.contrib.auth.models.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.contrib.auth.models.protobuf new file mode 100644 index 000000000..dbd0fd24a --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.contrib.auth.models.protobuf @@ -0,0 +1,72 @@ + +django.contrib.auth.models + + UserManager&django.contrib.auth.models.UserManager" django.db.models.manager.Manager* +create-django.contrib.auth.models.UserManager.create"Z ++django.contrib.auth.models.AbstractBaseUser"+django.contrib.auth.models.AbstractBaseUser*Z +selfP +&django.contrib.auth.models.UserManager"&django.contrib.auth.models.UserManager* +kwargs +Any* + create_user2django.contrib.auth.models.UserManager.create_user"Z ++django.contrib.auth.models.AbstractBaseUser"+django.contrib.auth.models.AbstractBaseUser*Z +selfP +&django.contrib.auth.models.UserManager"&django.contrib.auth.models.UserManager** +username + builtins.str" builtins.str*Q +emailD +Union[builtins.str,None] + builtins.str" builtins.str +None *T +passwordD +Union[builtins.str,None] + builtins.str" builtins.str +None * + extra_fields +Any* +create_superuser7django.contrib.auth.models.UserManager.create_superuser"Z ++django.contrib.auth.models.AbstractBaseUser"+django.contrib.auth.models.AbstractBaseUser*Z +selfP +&django.contrib.auth.models.UserManager"&django.contrib.auth.models.UserManager** +username + builtins.str" builtins.str*Q +emailD +Union[builtins.str,None] + builtins.str" builtins.str +None *T +passwordD +Union[builtins.str,None] + builtins.str" builtins.str +None * + extra_fields +Any +AbstractBaseUser+django.contrib.auth.models.AbstractBaseUser"django.db.models.base.Model"*SonarPythonAnalyzerFakeStub.CustomStubBase* + set_password8django.contrib.auth.models.AbstractBaseUser.set_password" +None*d +selfZ ++django.contrib.auth.models.AbstractBaseUser"+django.contrib.auth.models.AbstractBaseUser*. + raw_password + builtins.str" builtins.str* +check_password:django.contrib.auth.models.AbstractBaseUser.check_password" + builtins.bool" builtins.bool*d +selfZ ++django.contrib.auth.models.AbstractBaseUser"+django.contrib.auth.models.AbstractBaseUser*. + raw_password + builtins.str" builtins.strr^ +password4django.contrib.auth.models.AbstractBaseUser.password + builtins.str" builtins.str + AbstractUser'django.contrib.auth.models.AbstractUser"+django.contrib.auth.models.AbstractBaseUserrZ +username0django.contrib.auth.models.AbstractUser.username + builtins.str" builtins.strrT +email-django.contrib.auth.models.AbstractUser.email + builtins.str" builtins.strr +objects/django.contrib.auth.models.AbstractUser.objectsP +&django.contrib.auth.models.UserManager"&django.contrib.auth.models.UserManager +Userdjango.contrib.auth.models.User"'django.contrib.auth.models.AbstractUserr +objects'django.contrib.auth.models.User.objectsP +&django.contrib.auth.models.UserManager"&django.contrib.auth.models.UserManagere + AnonymousUser(django.contrib.auth.models.AnonymousUser"*SonarPythonAnalyzerFakeStub.CustomStubBase* +__annotations__*django.contrib.auth.models.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.contrib.auth.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.contrib.auth.protobuf index 3635f8625..f199eeb1b 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.contrib.auth.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.contrib.auth.protobuf @@ -1,5 +1,71 @@ -django.contrib.auth*t +django.contrib.auth +AbstractBaseUser+django.contrib.auth.models.AbstractBaseUser"django.db.models.base.Model"*SonarPythonAnalyzerFakeStub.CustomStubBase* + set_password8django.contrib.auth.models.AbstractBaseUser.set_password" +None*d +selfZ ++django.contrib.auth.models.AbstractBaseUser"+django.contrib.auth.models.AbstractBaseUser*. + raw_password + builtins.str" builtins.str* +check_password:django.contrib.auth.models.AbstractBaseUser.check_password" + builtins.bool" builtins.bool*d +selfZ ++django.contrib.auth.models.AbstractBaseUser"+django.contrib.auth.models.AbstractBaseUser*. + raw_password + builtins.str" builtins.strr^ +password4django.contrib.auth.models.AbstractBaseUser.password + builtins.str" builtins.str + AbstractUser'django.contrib.auth.models.AbstractUser"+django.contrib.auth.models.AbstractBaseUserrZ +username0django.contrib.auth.models.AbstractUser.username + builtins.str" builtins.strrT +email-django.contrib.auth.models.AbstractUser.email + builtins.str" builtins.strr +objects/django.contrib.auth.models.AbstractUser.objectsP +&django.contrib.auth.models.UserManager"&django.contrib.auth.models.UserManagere + AnonymousUser(django.contrib.auth.models.AnonymousUser"*SonarPythonAnalyzerFakeStub.CustomStubBase +Userdjango.contrib.auth.models.User"'django.contrib.auth.models.AbstractUserr +objects'django.contrib.auth.models.User.objectsP +&django.contrib.auth.models.UserManager"&django.contrib.auth.models.UserManager + + UserManager&django.contrib.auth.models.UserManager" django.db.models.manager.Manager* +create-django.contrib.auth.models.UserManager.create"Z ++django.contrib.auth.models.AbstractBaseUser"+django.contrib.auth.models.AbstractBaseUser*Z +selfP +&django.contrib.auth.models.UserManager"&django.contrib.auth.models.UserManager* +kwargs +Any* + create_user2django.contrib.auth.models.UserManager.create_user"Z ++django.contrib.auth.models.AbstractBaseUser"+django.contrib.auth.models.AbstractBaseUser*Z +selfP +&django.contrib.auth.models.UserManager"&django.contrib.auth.models.UserManager** +username + builtins.str" builtins.str*Q +emailD +Union[builtins.str,None] + builtins.str" builtins.str +None *T +passwordD +Union[builtins.str,None] + builtins.str" builtins.str +None * + extra_fields +Any* +create_superuser7django.contrib.auth.models.UserManager.create_superuser"Z ++django.contrib.auth.models.AbstractBaseUser"+django.contrib.auth.models.AbstractBaseUser*Z +selfP +&django.contrib.auth.models.UserManager"&django.contrib.auth.models.UserManager** +username + builtins.str" builtins.str*Q +emailD +Union[builtins.str,None] + builtins.str" builtins.str +None *T +passwordD +Union[builtins.str,None] + builtins.str" builtins.str +None * + extra_fields +Any*t __path__django.contrib.auth.__path__J builtins.list[builtins.str] builtins.str" builtins.str" builtins.list* @@ -8,4 +74,5 @@ builtins.str" builtins.str Any" builtins.dict*. -middlewaredjango.contrib.auth.middleware  \ No newline at end of file +middlewaredjango.contrib.auth.middleware *& +modelsdjango.contrib.auth.models  \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.utils.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.utils.protobuf index f324db003..ef90d1a14 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.utils.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.utils.protobuf @@ -7,4 +7,5 @@ builtins.dict[builtins.str,Any] builtins.str" builtins.str Any" builtins.dict* -htmldjango.utils.html  \ No newline at end of file +htmldjango.utils.html *) + deprecationdjango.utils.deprecation  \ No newline at end of file diff --git a/python-frontend/src/test/java/org/sonar/python/types/TypeShedTest.java b/python-frontend/src/test/java/org/sonar/python/types/TypeShedTest.java index 0453c37e8..4e2e7e4b7 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/TypeShedTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/TypeShedTest.java @@ -284,6 +284,16 @@ void package_django() { assertThat(responseSymbol.fullyQualifiedName()).isEqualTo("django.http.response.HttpResponse"); } + @Test + void package_django_contrib_auth() { + Map djangoAuthSymbols = symbolsForModule("django.contrib.auth.models"); + assertThat(djangoAuthSymbols).isNotEmpty(); + Symbol userSymbol = djangoAuthSymbols.get("User"); + assertThat(userSymbol).isNotNull(); + assertThat(userSymbol.kind()).isEqualTo(Kind.CLASS); + assertThat(userSymbol.fullyQualifiedName()).isEqualTo("django.contrib.auth.models.User"); + } + @Test void return_type_hints() { Map symbols = symbolsForModule("typing"); diff --git a/python-frontend/typeshed_serializer/checksums/custom.checksum b/python-frontend/typeshed_serializer/checksums/custom.checksum index 9473e666d..ccd0a7cd0 100644 --- a/python-frontend/typeshed_serializer/checksums/custom.checksum +++ b/python-frontend/typeshed_serializer/checksums/custom.checksum @@ -1,2 +1,2 @@ -1c8010bc70819847c25235e37ca98a48d47747b77edc77887b1bdd3ee5c49521 -c854205ed8f8a5d5935b2164fd2f15bf962159b9a8045e243aec3c3b4e393e76 \ No newline at end of file +843addd5d5f7af6ecacd2ed21b251d4a89a44fdbdcc9dd2af52fb12939f697fe +d67269ba8194374e815fa405dfbf957e07d196202cd8d3328d4a5a40f90628b5 \ No newline at end of file diff --git a/python-frontend/typeshed_serializer/resources/custom/django/__init__.pyi b/python-frontend/typeshed_serializer/resources/custom/django/__init__.pyi index 0358717a8..759277930 100644 --- a/python-frontend/typeshed_serializer/resources/custom/django/__init__.pyi +++ b/python-frontend/typeshed_serializer/resources/custom/django/__init__.pyi @@ -6,3 +6,4 @@ import django.conf as conf import django.apps as apps import django.contrib as contrib import django.views as views +import django.contrib as contrib diff --git a/python-frontend/typeshed_serializer/resources/custom/django/contrib/auth/__init__.pyi b/python-frontend/typeshed_serializer/resources/custom/django/contrib/auth/__init__.pyi index 43bfc5921..32af52e1f 100644 --- a/python-frontend/typeshed_serializer/resources/custom/django/contrib/auth/__init__.pyi +++ b/python-frontend/typeshed_serializer/resources/custom/django/contrib/auth/__init__.pyi @@ -1 +1,10 @@ import django.contrib.auth.middleware as middleware +import django.contrib.auth.models as models + +from .models import ( + AbstractBaseUser as AbstractBaseUser, + AbstractUser as AbstractUser, + AnonymousUser as AnonymousUser, + User as User, + UserManager as UserManager, +) diff --git a/python-frontend/typeshed_serializer/resources/custom/django/contrib/auth/models.pyi b/python-frontend/typeshed_serializer/resources/custom/django/contrib/auth/models.pyi new file mode 100644 index 000000000..ef9351c37 --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/django/contrib/auth/models.pyi @@ -0,0 +1,36 @@ +from SonarPythonAnalyzerFakeStub import CustomStubBase +from django.db.models.base import Model +from django.db.models.manager import Manager +from typing import Any + +class UserManager(Manager): + def create(self, **kwargs: Any) -> "AbstractBaseUser": ... + def create_user( + self, + username: str, + email: str | None = None, + password: str | None = None, + **extra_fields: Any, + ) -> "AbstractBaseUser": ... + def create_superuser( + self, + username: str, + email: str | None = None, + password: str | None = None, + **extra_fields: Any, + ) -> "AbstractBaseUser": ... + +class AbstractBaseUser(Model, CustomStubBase): + password: str + def set_password(self, raw_password: str) -> None: ... + def check_password(self, raw_password: str) -> bool: ... + +class AbstractUser(AbstractBaseUser): + username: str + email: str + objects: UserManager + +class User(AbstractUser): + objects: UserManager + +class AnonymousUser(CustomStubBase): ... From 1607e8dde17770fe1f5771ca4abc98bc01c0b82d Mon Sep 17 00:00:00 2001 From: Marc Jasper Date: Fri, 6 Mar 2026 16:15:22 +0100 Subject: [PATCH 020/322] SONARPY-3773 Create rule S8440: Querysets should use select_related() or prefetch_related() (#867) Co-authored-by: Claude Sonnet 4.5 Co-authored-by: joke1196 GitOrigin-RevId: 25a9d8333c86cc4439624592deb46e90fc0690d0 --- .../django.db.models.base.protobuf | 6 +- .../django.db.models.manager.protobuf | 316 ++++++++++++++++- .../custom_protobuf/django.db.models.protobuf | 320 +++++++++++++++++- .../custom/django/db/models/base.pyi | 3 + .../custom/django/db/models/manager.pyi | 52 ++- .../tests/test_serializers.py | 2 +- 6 files changed, 682 insertions(+), 17 deletions(-) diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.db.models.base.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.db.models.base.protobuf index 14f12f8d4..dbf8c61df 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.db.models.base.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.db.models.base.protobuf @@ -1,6 +1,6 @@ django.db.models.base; - ModelBasedjango.db.models.base.ModelBase" builtins.type + ModelBasedjango.db.models.base.ModelBase" builtins.type Modeldjango.db.models.base.Model"builtins.object* __init__$django.db.models.base.Model.__init__" None*D @@ -9,7 +9,9 @@ args Any* kwargs -Any@bdjango.db.models.base.ModelBase* +Any@bdjango.db.models.base.ModelBasert +objects#django.db.models.base.Model.objectsD + django.db.models.manager.Manager" django.db.models.manager.Manager* __annotations__%django.db.models.base.__annotations__W builtins.dict[builtins.str,Any] builtins.str" builtins.str diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.db.models.manager.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.db.models.manager.protobuf index 48b23d5c2..fb9cfbd84 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.db.models.manager.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.db.models.manager.protobuf @@ -1,6 +1,314 @@ -django.db.models.manager -Manager django.db.models.manager.Manager"*SonarPythonAnalyzerFakeStub.CustomStubBase* +django.db.models.managerJ +Manager django.db.models.manager.Manager"*SonarPythonAnalyzerFakeStub.CustomStubBase* +all$django.db.models.manager.Manager.all"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +filter'django.db.models.manager.Manager.filter"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +args +Any* +kwargs +Any* +exclude(django.db.models.manager.Manager.exclude"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +args +Any* +kwargs +Any* +order_by)django.db.models.manager.Manager.order_by"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* + field_names +Any* +reverse(django.db.models.manager.Manager.reverse"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +distinct)django.db.models.manager.Manager.distinct"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* + field_names +Any* +select_related/django.db.models.manager.Manager.select_related"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +fields +Any* +prefetch_related1django.db.models.manager.Manager.prefetch_related"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +lookups +Any* +defer&django.db.models.manager.Manager.defer"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +fields +Any* +only%django.db.models.manager.Manager.only"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +fields +Any* +using&django.db.models.manager.Manager.using"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +alias +Any* +annotate)django.db.models.manager.Manager.annotate"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +args +Any* +kwargs +Any* +alias&django.db.models.manager.Manager.alias"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +args +Any* +kwargs +Any* +none%django.db.models.manager.Manager.none"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +union&django.db.models.manager.Manager.union"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +other_qs +Any* +all +Any * + intersection-django.db.models.manager.Manager.intersection"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +other_qs +Any* + +difference+django.db.models.manager.Manager.difference"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +other_qs +Any* +select_for_update2django.db.models.manager.Manager.select_for_update"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +nowait +Any * + skip_locked +Any * +of +Any * +no_key +Any * +extra&django.db.models.manager.Manager.extra"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +args +Any* +kwargs +Any* +values'django.db.models.manager.Manager.values"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +fields +Any* + expressions +Any* + values_list,django.db.models.manager.Manager.values_list"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +fields +Any* +flat +Any * +named +Any * +dates&django.db.models.manager.Manager.dates"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* + +field_name +Any* +kind +Any* +order +Any * + datetimes*django.db.models.manager.Manager.datetimes"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* + +field_name +Any* +kind +Any* +order +Any * +tzinfo +Any * +get$django.db.models.manager.Manager.get" +Any*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +args +Any* +kwargs +Any* +create'django.db.models.manager.Manager.create" +Any*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +kwargs +Any* + get_or_create.django.db.models.manager.Manager.get_or_create". +builtins.tuple[Any] +Any"builtins.tuple*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +defaults +Any * +kwargs +Any* +update_or_create1django.db.models.manager.Manager.update_or_create". +builtins.tuple[Any] +Any"builtins.tuple*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +defaults +Any * +create_defaults +Any * +kwargs +Any* +first&django.db.models.manager.Manager.first" +Any*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +last%django.db.models.manager.Manager.last" +Any*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +earliest)django.db.models.manager.Manager.earliest" +Any*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +fields +Any* +latest'django.db.models.manager.Manager.latest" +Any*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +fields +Any* +count&django.db.models.manager.Manager.count" + builtins.int" builtins.int*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +exists'django.db.models.manager.Manager.exists" + builtins.bool" builtins.bool*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +contains)django.db.models.manager.Manager.contains" + builtins.bool" builtins.bool*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +obj +Any* + aggregate*django.db.models.manager.Manager.aggregate"9 +builtins.dict[Any,Any] +Any +Any" builtins.dict*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +args +Any* +kwargs +Any* +in_bulk(django.db.models.manager.Manager.in_bulk"9 +builtins.dict[Any,Any] +Any +Any" builtins.dict*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +id_list +Any * + +field_name +Any * +update'django.db.models.manager.Manager.update" + builtins.int" builtins.int*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +kwargs +Any* +delete'django.db.models.manager.Manager.delete". +builtins.tuple[Any] +Any"builtins.tuple*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* + bulk_create,django.db.models.manager.Manager.bulk_create", +builtins.list[Any] +Any" builtins.list*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +objs +Any* + +batch_size +Any * +kwargs +Any* + bulk_update,django.db.models.manager.Manager.bulk_update" + builtins.int" builtins.int*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +objs +Any* +fields +Any* + +batch_size +Any * +iterator)django.db.models.manager.Manager.iterator"0 +typing.Iterator[Any] +Any"typing.Iterator*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* + +chunk_size +Any * +explain(django.db.models.manager.Manager.explain" + builtins.str" builtins.str*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +format +Any * +options +Any* raw$django.db.models.manager.Manager.raw" Any*N selfD @@ -8,9 +316,7 @@ args Any* kwargs -Anyrw -object'django.db.models.manager.Manager.objectD - django.db.models.manager.Manager" django.db.models.manager.Manager* +Any* __annotations__(django.db.models.manager.__annotations__W builtins.dict[builtins.str,Any] builtins.str" builtins.str diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.db.models.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.db.models.protobuf index a0de420e9..44c5a2e49 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.db.models.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.db.models.protobuf @@ -1,6 +1,314 @@ -django.db.models -Manager django.db.models.manager.Manager"*SonarPythonAnalyzerFakeStub.CustomStubBase* +django.db.modelsJ +Manager django.db.models.manager.Manager"*SonarPythonAnalyzerFakeStub.CustomStubBase* +all$django.db.models.manager.Manager.all"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +filter'django.db.models.manager.Manager.filter"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +args +Any* +kwargs +Any* +exclude(django.db.models.manager.Manager.exclude"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +args +Any* +kwargs +Any* +order_by)django.db.models.manager.Manager.order_by"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* + field_names +Any* +reverse(django.db.models.manager.Manager.reverse"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +distinct)django.db.models.manager.Manager.distinct"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* + field_names +Any* +select_related/django.db.models.manager.Manager.select_related"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +fields +Any* +prefetch_related1django.db.models.manager.Manager.prefetch_related"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +lookups +Any* +defer&django.db.models.manager.Manager.defer"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +fields +Any* +only%django.db.models.manager.Manager.only"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +fields +Any* +using&django.db.models.manager.Manager.using"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +alias +Any* +annotate)django.db.models.manager.Manager.annotate"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +args +Any* +kwargs +Any* +alias&django.db.models.manager.Manager.alias"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +args +Any* +kwargs +Any* +none%django.db.models.manager.Manager.none"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +union&django.db.models.manager.Manager.union"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +other_qs +Any* +all +Any * + intersection-django.db.models.manager.Manager.intersection"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +other_qs +Any* + +difference+django.db.models.manager.Manager.difference"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +other_qs +Any* +select_for_update2django.db.models.manager.Manager.select_for_update"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +nowait +Any * + skip_locked +Any * +of +Any * +no_key +Any * +extra&django.db.models.manager.Manager.extra"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +args +Any* +kwargs +Any* +values'django.db.models.manager.Manager.values"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +fields +Any* + expressions +Any* + values_list,django.db.models.manager.Manager.values_list"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +fields +Any* +flat +Any * +named +Any * +dates&django.db.models.manager.Manager.dates"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* + +field_name +Any* +kind +Any* +order +Any * + datetimes*django.db.models.manager.Manager.datetimes"D + django.db.models.manager.Manager" django.db.models.manager.Manager*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* + +field_name +Any* +kind +Any* +order +Any * +tzinfo +Any * +get$django.db.models.manager.Manager.get" +Any*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +args +Any* +kwargs +Any* +create'django.db.models.manager.Manager.create" +Any*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +kwargs +Any* + get_or_create.django.db.models.manager.Manager.get_or_create". +builtins.tuple[Any] +Any"builtins.tuple*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +defaults +Any * +kwargs +Any* +update_or_create1django.db.models.manager.Manager.update_or_create". +builtins.tuple[Any] +Any"builtins.tuple*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +defaults +Any * +create_defaults +Any * +kwargs +Any* +first&django.db.models.manager.Manager.first" +Any*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +last%django.db.models.manager.Manager.last" +Any*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +earliest)django.db.models.manager.Manager.earliest" +Any*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +fields +Any* +latest'django.db.models.manager.Manager.latest" +Any*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +fields +Any* +count&django.db.models.manager.Manager.count" + builtins.int" builtins.int*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +exists'django.db.models.manager.Manager.exists" + builtins.bool" builtins.bool*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +contains)django.db.models.manager.Manager.contains" + builtins.bool" builtins.bool*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +obj +Any* + aggregate*django.db.models.manager.Manager.aggregate"9 +builtins.dict[Any,Any] +Any +Any" builtins.dict*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +args +Any* +kwargs +Any* +in_bulk(django.db.models.manager.Manager.in_bulk"9 +builtins.dict[Any,Any] +Any +Any" builtins.dict*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +id_list +Any * + +field_name +Any * +update'django.db.models.manager.Manager.update" + builtins.int" builtins.int*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +kwargs +Any* +delete'django.db.models.manager.Manager.delete". +builtins.tuple[Any] +Any"builtins.tuple*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* + bulk_create,django.db.models.manager.Manager.bulk_create", +builtins.list[Any] +Any" builtins.list*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +objs +Any* + +batch_size +Any * +kwargs +Any* + bulk_update,django.db.models.manager.Manager.bulk_update" + builtins.int" builtins.int*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +objs +Any* +fields +Any* + +batch_size +Any * +iterator)django.db.models.manager.Manager.iterator"0 +typing.Iterator[Any] +Any"typing.Iterator*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* + +chunk_size +Any * +explain(django.db.models.manager.Manager.explain" + builtins.str" builtins.str*N +selfD + django.db.models.manager.Manager" django.db.models.manager.Manager* +format +Any * +options +Any* raw$django.db.models.manager.Manager.raw" Any*N selfD @@ -8,9 +316,7 @@ args Any* kwargs -Anyrw -object'django.db.models.manager.Manager.objectD - django.db.models.manager.Manager" django.db.models.manager.Manager +Any Modeldjango.db.models.base.Model"builtins.object* __init__$django.db.models.base.Model.__init__" None*D @@ -19,7 +325,9 @@ args Any* kwargs -Any@bdjango.db.models.base.ModelBase*q +Any@bdjango.db.models.base.ModelBasert +objects#django.db.models.base.Model.objectsD + django.db.models.manager.Manager" django.db.models.manager.Manager*q __path__django.db.models.__path__J builtins.list[builtins.str] builtins.str" builtins.str" builtins.list* diff --git a/python-frontend/typeshed_serializer/resources/custom/django/db/models/base.pyi b/python-frontend/typeshed_serializer/resources/custom/django/db/models/base.pyi index 5204be2f4..5a9176d1c 100644 --- a/python-frontend/typeshed_serializer/resources/custom/django/db/models/base.pyi +++ b/python-frontend/typeshed_serializer/resources/custom/django/db/models/base.pyi @@ -1,3 +1,6 @@ +from django.db.models.manager import Manager + class ModelBase(type): ... class Model(metaclass=ModelBase): + objects: Manager def __init__(self, *args, **kwargs) -> None: ... diff --git a/python-frontend/typeshed_serializer/resources/custom/django/db/models/manager.pyi b/python-frontend/typeshed_serializer/resources/custom/django/db/models/manager.pyi index 2c94b66a6..aa2eb9cdb 100644 --- a/python-frontend/typeshed_serializer/resources/custom/django/db/models/manager.pyi +++ b/python-frontend/typeshed_serializer/resources/custom/django/db/models/manager.pyi @@ -1,8 +1,54 @@ from SonarPythonAnalyzerFakeStub import CustomStubBase - -from typing import Any +from typing import Any, Iterator class Manager(CustomStubBase): - object: Manager + + # Queryset-returning methods (chainable) + def all(self) -> Manager: ... + def filter(self, *args, **kwargs) -> Manager: ... + def exclude(self, *args, **kwargs) -> Manager: ... + def order_by(self, *field_names) -> Manager: ... + def reverse(self) -> Manager: ... + def distinct(self, *field_names) -> Manager: ... + def select_related(self, *fields) -> Manager: ... + def prefetch_related(self, *lookups) -> Manager: ... + def defer(self, *fields) -> Manager: ... + def only(self, *fields) -> Manager: ... + def using(self, alias) -> Manager: ... + def annotate(self, *args, **kwargs) -> Manager: ... + def alias(self, *args, **kwargs) -> Manager: ... + def none(self) -> Manager: ... + def union(self, *other_qs, all=False) -> Manager: ... + def intersection(self, *other_qs) -> Manager: ... + def difference(self, *other_qs) -> Manager: ... + def select_for_update(self, nowait=False, skip_locked=False, of=(), no_key=False) -> Manager: ... + def extra(self, *args, **kwargs) -> Manager: ... + def values(self, *fields, **expressions) -> Manager: ... + def values_list(self, *fields, flat=False, named=False) -> Manager: ... + def dates(self, field_name, kind, order=...) -> Manager: ... + def datetimes(self, field_name, kind, order=..., tzinfo=None) -> Manager: ... + + # Methods returning single objects + def get(self, *args, **kwargs) -> Any: ... + def create(self, **kwargs) -> Any: ... + def get_or_create(self, defaults=None, **kwargs) -> tuple: ... + def update_or_create(self, defaults=None, create_defaults=None, **kwargs) -> tuple: ... + def first(self) -> Any: ... + def last(self) -> Any: ... + def earliest(self, *fields) -> Any: ... + def latest(self, *fields) -> Any: ... + + # Methods returning scalar/collection values + def count(self) -> int: ... + def exists(self) -> bool: ... + def contains(self, obj) -> bool: ... + def aggregate(self, *args, **kwargs) -> dict: ... + def in_bulk(self, id_list=None, *, field_name=...) -> dict: ... + def update(self, **kwargs) -> int: ... + def delete(self) -> tuple: ... + def bulk_create(self, objs, batch_size=None, **kwargs) -> list: ... + def bulk_update(self, objs, fields, batch_size=None) -> int: ... + def iterator(self, chunk_size=None) -> Iterator: ... + def explain(self, *, format=None, **options) -> str: ... def raw(self, *args, **kwargs) -> Any: ... diff --git a/python-frontend/typeshed_serializer/tests/test_serializers.py b/python-frontend/typeshed_serializer/tests/test_serializers.py index 9cf9a717b..f65f43191 100644 --- a/python-frontend/typeshed_serializer/tests/test_serializers.py +++ b/python-frontend/typeshed_serializer/tests/test_serializers.py @@ -74,7 +74,7 @@ def test_custom_stubs_serializer(typeshed_custom_stubs): custom_stubs_serializer.serialize() assert custom_stubs_serializer.get_build_result.call_count == 1 # Not every files from "typeshed_custom_stubs" build are serialized, as some are builtins - assert symbols.save_module.call_count == 343 + assert symbols.save_module.call_count == 344 def test_importer_serializer(): From 919dc81acf68e3c2a5813dcc8230b89f78933a30 Mon Sep 17 00:00:00 2001 From: Thomas Serre <118730793+thomas-serre-sonarsource@users.noreply.github.com> Date: Mon, 9 Mar 2026 13:58:41 +0100 Subject: [PATCH 021/322] SONARPY-3873 S2068 false negative on default value from os.getenv and os.environ.get (#941) GitOrigin-RevId: 4f86dcc511307cd681747f3b2dd5a9baf88c0d60 --- .../hotspots/HardCodedCredentialsCheck.java | 51 ++++++++++++++----- .../resources/checks/hardCodedCredentials.py | 6 +++ 2 files changed, 45 insertions(+), 12 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/HardCodedCredentialsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/HardCodedCredentialsCheck.java index 01053f7ad..ae7e8e484 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/HardCodedCredentialsCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/HardCodedCredentialsCheck.java @@ -55,24 +55,28 @@ import org.sonar.plugins.python.api.tree.SubscriptionExpression; import org.sonar.plugins.python.api.tree.Tree; import org.sonar.plugins.python.api.tree.Tree.Kind; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; import org.sonar.python.tree.TreeUtils; @Rule(key = "S2068") public class HardCodedCredentialsCheck extends PythonSubscriptionCheck { + public static final String MESSAGE = "\"%s\" detected here, review this potentially hard-coded credential."; private static final String DEFAULT_CREDENTIAL_WORDS = "password,passwd,pwd,passphrase"; private static final String FLASK_CONFIG_ASSIGNMENT_FQN = "flask.app.Flask.config"; private static final String FLASK_CONFIG_CREDENTIAL_KEY = "SECRET_KEY"; + private static final TypeMatcher GETENV_MATCHER = TypeMatchers.isType("os.getenv"); + private static final TypeMatcher ENVIRON_MATCHER = TypeMatchers.isType("os.environ"); + private static final TypeMatcher GET_ENVIRON_MATCHER = TypeMatchers.isType("typing.Mapping.get"); + @RuleProperty( key = "credentialWords", description = "Comma separated list of words identifying potential credentials", defaultValue = DEFAULT_CREDENTIAL_WORDS) public String credentialWords = DEFAULT_CREDENTIAL_WORDS; - - public static final String MESSAGE = "\"%s\" detected here, review this potentially hard-coded credential."; - private List variablePatterns = null; private List literalPatterns = null; private Map sensitiveArgumentByFQN; @@ -132,14 +136,16 @@ private void handleDictionaryLiteral(DictionaryLiteral dictionaryLiteral, Subscr } private void checkKeyValuePair(KeyValuePair keyValuePair, SubscriptionContext ctx) { - if (keyValuePair.key().is(Kind.STRING_LITERAL) && keyValuePair.value().is(Kind.STRING_LITERAL)) { - String matchedCredential = matchedCredential(((StringLiteral) keyValuePair.key()).trimmedQuotesValue(), variablePatterns()); - if (matchedCredential != null) { - StringLiteral literal = (StringLiteral) keyValuePair.value(); - if (isSuspiciousStringLiteral(literal)) { - ctx.addIssue(keyValuePair, String.format(MESSAGE, matchedCredential)); - } - } + if (!keyValuePair.key().is(Kind.STRING_LITERAL)) { + return; + } + String matchedCredential = matchedCredential(((StringLiteral) keyValuePair.key()).trimmedQuotesValue(), variablePatterns()); + if (matchedCredential == null) { + return; + } + Expression value = keyValuePair.value(); + if (isSuspiciousStringLiteral(value) || isSuspiciousEnvGetDefault(value, ctx)) { + ctx.addIssue(keyValuePair, String.format(MESSAGE, matchedCredential)); } } @@ -302,7 +308,7 @@ private void handleAssignmentStatement(AssignmentStatement assignmentStatement, private void checkAssignedValue(AssignmentStatement assignmentStatement, String matchedCredential, SubscriptionContext ctx) { Expression assignedValue = assignmentStatement.assignedValue(); - if (isSuspiciousStringLiteral(assignedValue) && !isFlaskConfigAssignment(assignedValue) ) { + if ((isSuspiciousStringLiteral(assignedValue) || isSuspiciousEnvGetDefault(assignedValue, ctx)) && !isFlaskConfigAssignment(assignedValue)) { ctx.addIssue(assignmentStatement, String.format(MESSAGE, matchedCredential)); } } @@ -319,6 +325,27 @@ private boolean isSuspiciousStringLiteral(Tree tree) { && !isCredential(((StringLiteral) tree).trimmedQuotesValue(), variablePatterns()); } + private static boolean isSuspiciousEnvGetDefault(Expression expression, SubscriptionContext ctx) { + if (!expression.is(Kind.CALL_EXPR)) { + return false; + } + CallExpression call = (CallExpression) expression; + Expression callee = call.callee(); + if (!GETENV_MATCHER.isTrueFor(call.callee(), ctx) + && !(callee instanceof QualifiedExpression qExpr && GET_ENVIRON_MATCHER.isTrueFor(callee, ctx) && ENVIRON_MATCHER.isTrueFor(qExpr.qualifier(), ctx)) + ) { + return false; + } + return TreeUtils.nthArgumentOrKeywordOptional(1, "default", call.arguments()) + .map(RegularArgument::expression) + .filter(HardCodedCredentialsCheck::isNonEmptyStringLiteral) + .isPresent(); + } + + private static boolean isNonEmptyStringLiteral(Expression expression) { + return expression.is(Kind.STRING_LITERAL) && !((StringLiteral) expression).trimmedQuotesValue().isEmpty(); + } + private static boolean isCredential(String target, Stream patterns) { return patterns.anyMatch(pattern -> pattern.matcher(target).find()); } diff --git a/python-checks/src/test/resources/checks/hardCodedCredentials.py b/python-checks/src/test/resources/checks/hardCodedCredentials.py index 605b04a61..fcc61cb45 100644 --- a/python-checks/src/test/resources/checks/hardCodedCredentials.py +++ b/python-checks/src/test/resources/checks/hardCodedCredentials.py @@ -44,6 +44,8 @@ def __init__(self): self.passed = "passed" fieldNameWithPasswordInIt = "azerty123" # Noncompliant {{"password" detected here, review this potentially hard-coded credential.}} fieldNameWithPasswordInIt = os.getenv("password", "") # OK + fieldNameWithPasswordInIt = os.getenv("password", "hardcodedPassword") # Noncompliant + fieldNameWithPasswordInIt = os.environ.get("password", "hardcodedPassword") # Noncompliant self.fieldNameWithPasswordInIt = "azerty123" # Noncompliant {{"password" detected here, review this potentially hard-coded credential.}} self.fieldNameWithPasswordInIt = os.getenv("password", "") # OK @@ -197,6 +199,8 @@ def somePassword(self, *, password="hello"): # Noncompliant 'USER': 'sonarsource', 'PASSWORD': 'azerty123', # Noncompliant 'PASSWORD': os.getenv('DB_PASSWORD'), # Compliant + 'PASSWORD': os.getenv("DB_PASSWORD", "hardcodedPassword"), # Noncompliant + 'PASSWORD': os.environ.get("DB_PASSWORD", "hardcodedPassword"), # Noncompliant 'HOST': 'localhost', 'PORT': '5432' }, @@ -206,6 +210,8 @@ def somePassword(self, *, password="hello"): # Noncompliant 'USER': 'sonarsource', 'PASSWORD': 'azerty123', # Noncompliant 'PASSWORD': os.getenv('DB_PASSWORD'), # Compliant + 'PASSWORD': os.getenv("DB_PASSWORD", "hardcodedPassword"), # Noncompliant + 'PASSWORD': os.environ.get("DB_PASSWORD", "hardcodedPassword"), # Noncompliant 'HOST': 'localhost', 'PORT': '5432' } From daefc8715f0818bf5244dfa452356d72b7dd9fa3 Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Mon, 9 Mar 2026 14:30:53 +0100 Subject: [PATCH 022/322] SONARPY-3876 S1172 Fixing FPs on Django middleware conventional function parameters (#944) GitOrigin-RevId: 47e0aba447a9b6095c644691b76dee20c18e39cb --- .../checks/UnusedFunctionParameterCheck.java | 18 +++++++++++ .../UnusedFunctionParameterCheckTest.java | 7 ++++ .../django/middleware.py | 32 +++++++++++++++++++ 3 files changed, 57 insertions(+) create mode 100644 python-checks/src/test/resources/checks/unusedFunctionParameter/django/middleware.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/UnusedFunctionParameterCheck.java b/python-checks/src/main/java/org/sonar/python/checks/UnusedFunctionParameterCheck.java index ba90c7ee4..a15dba6a5 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/UnusedFunctionParameterCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/UnusedFunctionParameterCheck.java @@ -41,6 +41,8 @@ import org.sonar.plugins.python.api.tree.Token; import org.sonar.plugins.python.api.tree.Tree; import org.sonar.plugins.python.api.tree.Tree.Kind; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; import org.sonar.plugins.python.api.tree.Trivia; import org.sonar.python.checks.utils.CheckUtils; import org.sonar.python.checks.utils.StringLiteralValuesCollector; @@ -57,6 +59,12 @@ public class UnusedFunctionParameterCheck extends PythonSubscriptionCheck { private static final Set AWS_LAMBDA_PARAMETERS = Set.of("event", "context"); + private static final Set DJANGO_MIDDLEWARE_METHODS = Set.of( + "process_request", "process_exception", "process_view", "process_template_response"); + + private static final TypeMatcher MIDDLEWARE_MIXIN_MATCHER = TypeMatchers.isFunctionOwnerSatisfying( + TypeMatchers.isOrExtendsType("django.utils.deprecation.MiddlewareMixin")); + @Override public void initialize(Context context) { context.registerSyntaxNodeConsumer(Kind.FUNCDEF, ctx -> checkFunctionParameter(ctx, ((FunctionDef) ctx.syntaxNode()))); @@ -119,6 +127,7 @@ private static boolean isException(SubscriptionContext ctx, FunctionDef function hasNonCallUsages(functionSymbol) || isTestFunction(ctx, functionDef) || isDjangoView(functionDef) || + isDjangoMiddlewareFunction(ctx, functionDef) || isAbstractClass(functionDef); } @@ -201,4 +210,13 @@ private static boolean isDjangoView(FunctionDef functionDef) { FunctionSymbolImpl functionSymbolImpl = (FunctionSymbolImpl) functionSymbol; return functionSymbolImpl != null && functionSymbolImpl.isDjangoView(); } + + + private static boolean isDjangoMiddlewareFunction(SubscriptionContext ctx, FunctionDef functionDef) { + String functionName = functionDef.name().name(); + if (!DJANGO_MIDDLEWARE_METHODS.contains(functionName)) { + return false; + } + return MIDDLEWARE_MIXIN_MATCHER.isTrueFor(functionDef.name(), ctx); + } } diff --git a/python-checks/src/test/java/org/sonar/python/checks/UnusedFunctionParameterCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/UnusedFunctionParameterCheckTest.java index bb48f53dc..3e51bc241 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/UnusedFunctionParameterCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/UnusedFunctionParameterCheckTest.java @@ -57,4 +57,11 @@ void test_django() { ), new UnusedFunctionParameterCheck()); } + + @Test + void test_django_middleware() { + PythonCheckVerifier.verify( + "src/test/resources/checks/unusedFunctionParameter/django/middleware.py", + new UnusedFunctionParameterCheck()); + } } diff --git a/python-checks/src/test/resources/checks/unusedFunctionParameter/django/middleware.py b/python-checks/src/test/resources/checks/unusedFunctionParameter/django/middleware.py new file mode 100644 index 000000000..b1285ccdc --- /dev/null +++ b/python-checks/src/test/resources/checks/unusedFunctionParameter/django/middleware.py @@ -0,0 +1,32 @@ +from django.utils.deprecation import MiddlewareMixin + + +class MyMiddleware(MiddlewareMixin): + def process_request(self, request): # Compliant - Django middleware hook + print("logging") + + def process_exception( + self, request, exception + ): # Compliant - Django middleware hook + print("logging") + + def process_view( + self, request, view_func, view_args, view_kwargs + ): # Compliant - Django middleware hook + print("logging") + + def process_template_response( + self, request, response + ): # Compliant - Django middleware hook + print("logging") + + def some_other_method(self, foo): # Noncompliant + print("logging") + + +class NotAMiddleware: + def process_request(self, request): # Noncompliant + print("logging") + + def process_exception(self, request, exception): # Noncompliant 2 + print("logging") From 50598adc8f86cc225b68be2858735b2e1524d071 Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Tue, 10 Mar 2026 13:58:04 +0100 Subject: [PATCH 023/322] SONARPY-3887 Fix QG (#946) GitOrigin-RevId: 77b6559037e7b34eaadbfa82a7b6192ff2bf3dd2 --- .../python/checks/hotspots/HardCodedCredentialsCheck.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/HardCodedCredentialsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/HardCodedCredentialsCheck.java index ae7e8e484..ba52044dc 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/HardCodedCredentialsCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/HardCodedCredentialsCheck.java @@ -17,6 +17,8 @@ package org.sonar.python.checks.hotspots; import java.net.MalformedURLException; +import java.net.URI; +import java.net.URISyntaxException; import java.net.URL; import java.util.Collection; import java.util.Collections; @@ -270,12 +272,12 @@ private static boolean isURLWithCredentials(StringLiteral stringLiteral) { return false; } try { - URL url = new URL(stringLiteral.trimmedQuotesValue()); + URL url = new URI(stringLiteral.trimmedQuotesValue()).toURL(); String userInfo = url.getUserInfo(); if (userInfo != null && userInfo.matches("\\S+:\\S+")) { return true; } - } catch (MalformedURLException e) { + } catch (URISyntaxException | MalformedURLException | IllegalArgumentException e) { return false; } return false; From bde7966d3d98b5b2de7c2d78df0d90fac792a859 Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Tue, 10 Mar 2026 15:14:45 +0100 Subject: [PATCH 024/322] SONARPY-3892 Updated rule metadata (#949) GitOrigin-RevId: c4bf2e467841a6dd376dffb4fa16e876b92e7b31 --- .../org/sonar/l10n/py/rules/python/S2068.json | 4 +- .../org/sonar/l10n/py/rules/python/S2612.html | 81 ++++++++++--------- .../org/sonar/l10n/py/rules/python/S2612.json | 7 +- .../org/sonar/l10n/py/rules/python/S6984.html | 2 +- .../org/sonar/l10n/py/rules/python/S8392.html | 4 +- .../org/sonar/l10n/py/rules/python/S8396.html | 24 +++--- sonarpedia.json | 2 +- 7 files changed, 68 insertions(+), 56 deletions(-) diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2068.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2068.json index 1aa22f50d..f9d8468af 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2068.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2068.json @@ -3,7 +3,7 @@ "type": "VULNERABILITY", "code": { "impacts": { - "SECURITY": "BLOCKER" + "SECURITY": "MEDIUM" }, "attribute": "TRUSTWORTHY" }, @@ -16,7 +16,7 @@ "tags": [ "cwe" ], - "defaultSeverity": "Blocker", + "defaultSeverity": "Major", "ruleSpecification": "RSPEC-2068", "sqKey": "S2068", "scope": "Main", diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2612.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2612.html index 790a246a9..0f55162d5 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2612.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2612.html @@ -1,52 +1,59 @@ +

    Why is this an issue?

    In Unix file system permissions, the "others" category refers to all users except the owner of the file system resource and the members of the group assigned to this resource.

    Granting permissions to this category can lead to unintended access to files or directories that could allow attackers to obtain sensitive information, disrupt services or elevate privileges.

    -

    Ask Yourself Whether

    -
      -
    • The application is designed to be run on a multi-user environment.
    • -
    • Corresponding files and directories may contain confidential information.
    • -
    -

    There is a risk if you answered yes to any of those questions.

    -

    Recommended Secure Coding Practices

    -

    The most restrictive possible permissions should be assigned to files and directories.

    -

    Sensitive Code Example

    -

    For os.umask:

    +

    What is the potential impact?

    +

    Unauthorized access to sensitive information

    +

    When file or directory permissions grant access to all users on a system (often represented as "others" or "everyone" in permission models), +attackers who gain access to any user account can read sensitive files containing credentials, configuration data, API keys, database passwords, +personal information, or proprietary business data. This exposure can lead to data breaches, identity theft, compliance violations, and competitive +disadvantage.

    +

    Service disruption and data corruption

    +

    Granting write permissions to broad user categories allows any user on the system to modify or delete critical files and directories. Attackers or +compromised low-privileged accounts can corrupt application data, modify configuration files to alter system behavior or disrupt services, or delete +important resources, leading to service outages, system instability, data loss, and denial of service.

    +

    Privilege escalation

    +

    When executable files or scripts have overly permissive permissions, especially when combined with special permission bits that allow programs to +execute with the permissions of the file owner or group rather than the executing user, attackers can replace legitimate executables with malicious +code. When these modified files are executed by privileged users or processes, the attacker’s code runs with elevated privileges, potentially enabling +them to escalate from a low-privileged account to root or administrator access, install backdoors, or pivot to other systems in the network.

    +

    How to fix it

    +

    When using os.umask, set a restrictive umask value that prevents permissions for "others". The umask value 0o777 ensures +that no permissions are granted to any category by default. This is the most secure approach as it requires explicit permission grants rather than +implicit ones.

    +

    Code examples

    +

    Noncompliant code example

     os.umask(0)  # Sensitive
     
    -

    For os.chmod, os.lchmod, and os.fchmod:

    -
    -os.chmod("/tmp/fs", stat.S_IRWXO)   # Sensitive
    -os.lchmod("/tmp/fs", stat.S_IRWXO)  # Sensitive
    -os.fchmod(fd, stat.S_IRWXO)         # Sensitive
    -
    -

    Compliant Solution

    -

    For os.umask:

    +

    Compliant solution

     os.umask(0o777)
     
    -

    For os.chmod, os.lchmod, and os.fchmod:

    -
    -os.chmod("/tmp/fs", stat.S_IRWXU)
    -os.lchmod("/tmp/fs", stat.S_IRWXU)
    -os.fchmod(fd, stat.S_IRWXU)
    -
    -

    See

    +

    Resources

    +

    Documentation

    + +

    Standards

    diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2612.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2612.json index f4878e4fa..1fa044a04 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2612.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2612.json @@ -1,6 +1,6 @@ { - "title": "Setting loose POSIX file permissions is security-sensitive", - "type": "SECURITY_HOTSPOT", + "title": "File permissions should not be set to world-accessible values", + "type": "VULNERABILITY", "code": { "impacts": { "SECURITY": "MEDIUM" @@ -43,5 +43,6 @@ "STIG ASD_V5R3": [ "V-222430" ] - } + }, + "quickfix": "unknown" } diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6984.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6984.html index 8cc03d353..5d9c32008 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6984.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6984.html @@ -1,7 +1,7 @@

    This rule raises an issue when an incorrect pattern is provided to an einops operation.

    Why is this an issue?

    The einops library provides a powerful and flexible way to manipulate tensors using the Einstein summation convention. The -einops uses a different convention than the traditional one. In particular, the axis names +einops uses a different convention than the traditional one. In particular, the axis names can be more than one letter long and are separated by spaces.

    How to fix it

    Correct the syntax of the einops operation by balancing the parentheses and following the convention.

    diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8392.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8392.html index 1a9ba79a8..22f90d53b 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8392.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8392.html @@ -117,9 +117,9 @@

    Documentation

    (127.0.0.1) and production (0.0.0.0) binding
  • Flask Deployment Options - Official Flask documentation on secure deployment practices
  • -
  • Flask Security Considerations - Flask security best practices and common +
  • Flask Security Considerations - Flask security best practices and common vulnerabilities
  • -
  • Gunicorn Documentation - Production WSGI server for Python web applications
  • +
  • Gunicorn Documentation - Production WSGI server for Python web applications

Standards

    diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8396.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8396.html index 8a1c66cdd..6c4f33a59 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8396.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8396.html @@ -1,5 +1,5 @@ -

    This is an issue when a Pydantic model field uses Optional[Type] or Type | None type hints without providing an explicit -default value, or when using Field(…​) with the ellipsis operator.

    +

    This is an issue when a Pydantic model field uses Optional[Type] without providing an explicit default value, or when using +Field(…​) with Optional[Type] and the ellipsis operator.

    Why is this an issue?

    In Pydantic models, there is a common misconception about what Optional[Type] means. Many developers assume that marking a field as Optional[Type] makes it optional during validation, but this is not the case.

    @@ -9,14 +9,17 @@

    Why is this an issue?

    To make a field truly optional (meaning it doesn’t need to be provided during validation), you must assign a default value. This is typically None for optional fields, but can be any appropriate default value.

    A particularly problematic pattern is using Field(…​) with Optional[Type]. The ellipsis (…​) is Pydantic’s -way of explicitly marking a field as required. This creates a direct contradiction: the type hint says the field can be None, but the -Field(…​) says it must be provided. In this case, Pydantic prioritizes the ellipsis, making the field required despite the -Optional annotation.

    +way of explicitly marking a field as required. This creates a direct contradiction: the type hint says the field can be None, but +Field(…​) says it must be provided.

    This mismatch between developer intent and actual behavior leads to unexpected validation errors in production, confusing API consumers who receive "field required" errors for fields they reasonably expected to be optional based on the type hints.

    +

    Exceptions

    +

    Fields typed as Type | None, None | Type, or Union[Type, None] are compliant, with or without a default +value.

    +

    These annotations are explicit nullable type declarations and do not imply that the field may be omitted from input data.

    What is the potential impact?

    -

    When optional fields lack explicit default values, the application will reject valid requests where users omit fields they believe to be optional. -This leads to:

    +

    When Optional[…​] fields lack explicit default values, the application may reject requests where users omit fields they believe to be +optional. This leads to:

    • Poor user experience with confusing "field required" validation errors
    • API contract violations where the schema suggests fields are optional but validation requires them
    • @@ -26,11 +29,12 @@

      What is the potential impact?

      How to fix it

      Add an explicit default value (typically None) to fields with Optional type hints. This makes the field truly optional during validation while maintaining the type safety that allows None values.

      +

      For Optional[…​] fields, avoid the ellipsis form (Field(…​)) and provide an explicit default instead.

      Code examples

      Noncompliant code example

       from typing import Optional
      -from pydantic import BaseModel
      +from pydantic import BaseModel, Field
       
       class TwitterAccount(BaseModel):
           username: str
      @@ -42,8 +46,8 @@ 

      Noncompliant code example

      Compliant solution

      -from typing import Optional
      -from pydantic import BaseModel
      +from typing import Optional, Union
      +from pydantic import BaseModel, Field
       
       class TwitterAccount(BaseModel):
           username: str
      diff --git a/sonarpedia.json b/sonarpedia.json
      index d2c72f9bd..818f83554 100644
      --- a/sonarpedia.json
      +++ b/sonarpedia.json
      @@ -3,7 +3,7 @@
         "languages": [
           "PY"
         ],
      -  "latest-update": "2026-02-18T12:35:08.274727508Z",
      +  "latest-update": "2026-03-10T13:34:05.699012606Z",
         "options": {
           "no-language-in-filenames": true,
           "preserve-filenames": true
      
      From ffe96340d00a6f86b138aabec8a67036363bc0a4 Mon Sep 17 00:00:00 2001
      From: David Kunzmann 
      Date: Thu, 12 Mar 2026 08:56:47 +0100
      Subject: [PATCH 025/322] SONARPY-3896 Update checksum (#951)
      
      GitOrigin-RevId: 2b31f0d08899972e68c0b5272d60ff2a02ee7935
      ---
       python-frontend/typeshed_serializer/checksums/custom.checksum | 4 ++--
       1 file changed, 2 insertions(+), 2 deletions(-)
      
      diff --git a/python-frontend/typeshed_serializer/checksums/custom.checksum b/python-frontend/typeshed_serializer/checksums/custom.checksum
      index ccd0a7cd0..4ff26fe03 100644
      --- a/python-frontend/typeshed_serializer/checksums/custom.checksum
      +++ b/python-frontend/typeshed_serializer/checksums/custom.checksum
      @@ -1,2 +1,2 @@
      -843addd5d5f7af6ecacd2ed21b251d4a89a44fdbdcc9dd2af52fb12939f697fe
      -d67269ba8194374e815fa405dfbf957e07d196202cd8d3328d4a5a40f90628b5
      \ No newline at end of file
      +87337f7b40e10d53f0e6d2fa4e82dff6bdefea2daee4ad89099bd43ade6d5123
      +d9033485534f02a01a57cc2cb030873d15b62a715bac2a6685adea2698259fc4
      \ No newline at end of file
      
      From 496a44cb6c6e708f0fa481750e453ebbaaadd864 Mon Sep 17 00:00:00 2001
      From: "hashicorp-vault-sonar-prod[bot]"
       <111297361+hashicorp-vault-sonar-prod[bot]@users.noreply.github.com>
      Date: Thu, 12 Mar 2026 08:54:47 +0000
      Subject: [PATCH 026/322] Prepare for next development iteration (#956)
      
      Co-authored-by: joke1196 <6317721+joke1196@users.noreply.github.com>
      GitOrigin-RevId: 52f5466cb7182405ab1035fee976a6f879382123
      ---
       docs/pom.xml                                  | 2 +-
       docs/python-custom-rules-example/pom.xml      | 2 +-
       its/commons/pom.xml                           | 2 +-
       its/plugin/it-python-plugin-test/pom.xml      | 2 +-
       its/plugin/pom.xml                            | 2 +-
       its/plugin/python-custom-rules-plugin/pom.xml | 2 +-
       its/pom.xml                                   | 2 +-
       pom.xml                                       | 2 +-
       python-checks-testkit/pom.xml                 | 2 +-
       python-checks/pom.xml                         | 2 +-
       python-commons/pom.xml                        | 2 +-
       python-frontend/pom.xml                       | 2 +-
       sonar-python-plugin/pom.xml                   | 2 +-
       13 files changed, 13 insertions(+), 13 deletions(-)
      
      diff --git a/docs/pom.xml b/docs/pom.xml
      index 4c268268c..b38c6856f 100644
      --- a/docs/pom.xml
      +++ b/docs/pom.xml
      @@ -5,7 +5,7 @@
         
           org.sonarsource.python
           python
      -    5.19-SNAPSHOT
      +    5.20-SNAPSHOT
         
       
         docs
      diff --git a/docs/python-custom-rules-example/pom.xml b/docs/python-custom-rules-example/pom.xml
      index b0813615c..4c40f44a3 100644
      --- a/docs/python-custom-rules-example/pom.xml
      +++ b/docs/python-custom-rules-example/pom.xml
      @@ -6,7 +6,7 @@
         
           org.sonarsource.python
           docs
      -    5.19-SNAPSHOT
      +    5.20-SNAPSHOT
         
       
         python-custom-rules-example
      diff --git a/its/commons/pom.xml b/its/commons/pom.xml
      index 6245d8ea3..ea6d73076 100644
      --- a/its/commons/pom.xml
      +++ b/its/commons/pom.xml
      @@ -6,7 +6,7 @@
           
               org.sonarsource.python
               python-its
      -        5.19-SNAPSHOT
      +        5.20-SNAPSHOT
           
       
           Python :: ITs :: Commons
      diff --git a/its/plugin/it-python-plugin-test/pom.xml b/its/plugin/it-python-plugin-test/pom.xml
      index 9fa5c35be..1bc56646c 100644
      --- a/its/plugin/it-python-plugin-test/pom.xml
      +++ b/its/plugin/it-python-plugin-test/pom.xml
      @@ -7,7 +7,7 @@
         
           it-python-plugin
           org.sonarsource.python
      -    5.19-SNAPSHOT
      +    5.20-SNAPSHOT
         
       
         it-python-plugin-test
      diff --git a/its/plugin/pom.xml b/its/plugin/pom.xml
      index d257012f3..7e62daae3 100644
      --- a/its/plugin/pom.xml
      +++ b/its/plugin/pom.xml
      @@ -5,7 +5,7 @@
         
           org.sonarsource.python
           python-its
      -    5.19-SNAPSHOT
      +    5.20-SNAPSHOT
         
       
         
      diff --git a/its/plugin/python-custom-rules-plugin/pom.xml b/its/plugin/python-custom-rules-plugin/pom.xml
      index 1aef6254e..2342a95ed 100644
      --- a/its/plugin/python-custom-rules-plugin/pom.xml
      +++ b/its/plugin/python-custom-rules-plugin/pom.xml
      @@ -6,7 +6,7 @@
         
           org.sonarsource.python
           it-python-plugin
      -    5.19-SNAPSHOT
      +    5.20-SNAPSHOT
         
       
         python-custom-rules-plugin
      diff --git a/its/pom.xml b/its/pom.xml
      index b990c1794..086da1313 100644
      --- a/its/pom.xml
      +++ b/its/pom.xml
      @@ -5,7 +5,7 @@
         
           org.sonarsource.python
           python
      -    5.19-SNAPSHOT
      +    5.20-SNAPSHOT
         
       
         python-its
      diff --git a/pom.xml b/pom.xml
      index 4b455dbe9..6d9ee49a5 100644
      --- a/pom.xml
      +++ b/pom.xml
      @@ -10,7 +10,7 @@
       
         org.sonarsource.python
         python
      -  5.19-SNAPSHOT
      +  5.20-SNAPSHOT
         pom
       
         Python
      diff --git a/python-checks-testkit/pom.xml b/python-checks-testkit/pom.xml
      index d6e3bdf44..87cdb42e8 100644
      --- a/python-checks-testkit/pom.xml
      +++ b/python-checks-testkit/pom.xml
      @@ -6,7 +6,7 @@
         
           python
           org.sonarsource.python
      -    5.19-SNAPSHOT
      +    5.20-SNAPSHOT
         
       
         python-checks-testkit
      diff --git a/python-checks/pom.xml b/python-checks/pom.xml
      index 839411991..c436a132e 100644
      --- a/python-checks/pom.xml
      +++ b/python-checks/pom.xml
      @@ -5,7 +5,7 @@
         
           org.sonarsource.python
           python
      -    5.19-SNAPSHOT
      +    5.20-SNAPSHOT
         
       
         python-checks
      diff --git a/python-commons/pom.xml b/python-commons/pom.xml
      index 8ca5c3f69..bcea58727 100644
      --- a/python-commons/pom.xml
      +++ b/python-commons/pom.xml
      @@ -6,7 +6,7 @@
         
           org.sonarsource.python
           python
      -    5.19-SNAPSHOT
      +    5.20-SNAPSHOT
         
       
         python-commons
      diff --git a/python-frontend/pom.xml b/python-frontend/pom.xml
      index 29748228d..811d68a48 100644
      --- a/python-frontend/pom.xml
      +++ b/python-frontend/pom.xml
      @@ -6,7 +6,7 @@
         
           org.sonarsource.python
           python
      -    5.19-SNAPSHOT
      +    5.20-SNAPSHOT
         
       
         python-frontend
      diff --git a/sonar-python-plugin/pom.xml b/sonar-python-plugin/pom.xml
      index 496533123..eeac7a433 100644
      --- a/sonar-python-plugin/pom.xml
      +++ b/sonar-python-plugin/pom.xml
      @@ -6,7 +6,7 @@
         
           org.sonarsource.python
           python
      -    5.19-SNAPSHOT
      +    5.20-SNAPSHOT
         
       
         sonar-python-plugin
      
      From f8cf3fda01d23c640455b454031f9dfd3048b306 Mon Sep 17 00:00:00 2001
      From: Sebastian Zumbrunn 
      Date: Thu, 12 Feb 2026 15:22:40 +0100
      Subject: [PATCH 027/322] SONARPY-3800 [python-ai tools] Add caching
      
      GitOrigin-RevId: e03c5a3e408dfba4402f01b6f2fa46a0b8da0d48
      ---
       .gitignore | 1 +
       1 file changed, 1 insertion(+)
      
      diff --git a/.gitignore b/.gitignore
      index 43b7a5243..a4fc91cfd 100644
      --- a/.gitignore
      +++ b/.gitignore
      @@ -41,6 +41,7 @@ venv
       .coverage
       cov.xml
       __pycache__
      +**/.python-ai-tool-cache/
       python-frontend/typeshed_serializer/serializer/proto_out
       
       python-frontend/typeshed_serializer/output/*
      
      From 7c45b14ef16ecad47aae050b31a22d50ec3be185 Mon Sep 17 00:00:00 2001
      From: Thomas Serre
       <118730793+thomas-serre-sonarsource@users.noreply.github.com>
      Date: Fri, 13 Mar 2026 11:57:25 +0100
      Subject: [PATCH 028/322] SONARPY-3782 Store the CFG in the Analysis Context
       (#948)
      
      Co-authored-by: Marc Jasper 
      GitOrigin-RevId: 942f25043540a7108504c3bbe83c0a3a0bc6af7f
      ---
       .../checks/AfterJumpStatementCheck.java       |  4 +-
       .../python/checks/ConsistentReturnCheck.java  |  2 +-
       .../python/checks/ConstantConditionCheck.java | 10 +---
       .../sonar/python/checks/DeadStoreCheck.java   |  2 +-
       .../checks/FloatingPointEqualityCheck.java    | 19 +++----
       .../HttpNoContentNonEmptyBodyCheck.java       |  8 +--
       .../python/checks/IgnoredParameterCheck.java  |  2 +-
       .../python/checks/InfiniteRecursionCheck.java | 11 ++--
       .../python/checks/InvariantReturnCheck.java   |  2 +-
       .../checks/LoopExecutingAtMostOnceCheck.java  |  6 +--
       .../checks/NumpyListOverGeneratorCheck.java   |  9 ++--
       ...ytzTimeZoneInDatetimeConstructorCheck.java |  7 +--
       .../sonar/python/checks/RandomSeedCheck.java  | 16 +++---
       .../python/checks/RedundantJumpCheck.java     |  6 +--
       .../ReferencedBeforeAssignmentCheck.java      |  2 +-
       ...oadLeadsToUntrustedCodeExecutionCheck.java | 18 +++----
       .../tests/UnconditionalAssertionCheck.java    | 14 ++----
       .../python/api/PythonVisitorContext.java      | 48 ++++++++++++++++--
       .../python/api/SubscriptionContext.java       |  7 +++
       .../org/sonar/python/SubscriptionVisitor.java | 13 +++++
       .../sonar/python/TestPythonVisitorRunner.java |  4 +-
       .../python/semantic/v2/TypeInferenceV2.java   | 12 ++++-
       .../sonar/python/SubscriptionVisitorTest.java | 50 +++++++++++++++++++
       23 files changed, 171 insertions(+), 101 deletions(-)
      
      diff --git a/python-checks/src/main/java/org/sonar/python/checks/AfterJumpStatementCheck.java b/python-checks/src/main/java/org/sonar/python/checks/AfterJumpStatementCheck.java
      index 125108e79..5882b0664 100644
      --- a/python-checks/src/main/java/org/sonar/python/checks/AfterJumpStatementCheck.java
      +++ b/python-checks/src/main/java/org/sonar/python/checks/AfterJumpStatementCheck.java
      @@ -39,13 +39,13 @@ public void initialize(Context context) {
           context.registerSyntaxNodeConsumer(Kind.FILE_INPUT, ctx ->
             {
               FileInput fileInput = (FileInput) ctx.syntaxNode();
      -        checkCfg(ControlFlowGraph.build(fileInput, ctx.pythonFile()), ctx, fileInput.statements());
      +        checkCfg(ctx.cfg(fileInput), ctx, fileInput.statements());
             }
           );
           context.registerSyntaxNodeConsumer(Kind.FUNCDEF, ctx ->
             {
               FunctionDef functionDef = (FunctionDef) ctx.syntaxNode();
      -        checkCfg(ControlFlowGraph.build(functionDef, ctx.pythonFile()), ctx, functionDef.body());
      +        checkCfg(ctx.cfg(functionDef), ctx, functionDef.body());
             }
           );
       
      diff --git a/python-checks/src/main/java/org/sonar/python/checks/ConsistentReturnCheck.java b/python-checks/src/main/java/org/sonar/python/checks/ConsistentReturnCheck.java
      index 3af827e0f..956ff5cc7 100644
      --- a/python-checks/src/main/java/org/sonar/python/checks/ConsistentReturnCheck.java
      +++ b/python-checks/src/main/java/org/sonar/python/checks/ConsistentReturnCheck.java
      @@ -40,7 +40,7 @@ public class ConsistentReturnCheck extends PythonSubscriptionCheck {
         public void initialize(Context context) {
           context.registerSyntaxNodeConsumer(Kind.FUNCDEF, ctx -> {
             FunctionDef functionDef = (FunctionDef) ctx.syntaxNode();
      -      ControlFlowGraph cfg = ControlFlowGraph.build(functionDef, ctx.pythonFile());
      +      ControlFlowGraph cfg = ctx.cfg(functionDef);
             if (cfg == null || hasExceptOrFinally(cfg)) {
               return;
             }
      diff --git a/python-checks/src/main/java/org/sonar/python/checks/ConstantConditionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/ConstantConditionCheck.java
      index 5afd481ed..614a5faf0 100644
      --- a/python-checks/src/main/java/org/sonar/python/checks/ConstantConditionCheck.java
      +++ b/python-checks/src/main/java/org/sonar/python/checks/ConstantConditionCheck.java
      @@ -33,7 +33,6 @@
       import org.sonar.plugins.python.api.tree.IfStatement;
       import org.sonar.plugins.python.api.tree.Name;
       import org.sonar.plugins.python.api.tree.UnaryExpression;
      -import org.sonar.python.cfg.fixpoint.ReachingDefinitionsAnalysis;
       
       import static org.sonar.plugins.python.api.tree.Tree.Kind.AND;
       import static org.sonar.plugins.python.api.tree.Tree.Kind.NAME;
      @@ -48,13 +47,6 @@ public class ConstantConditionCheck extends PythonVisitorCheck {
       
         private static final String MESSAGE = "Replace this expression; used as a condition it will always be constant.";
         private static final List ACCEPTED_DECORATORS = List.of("overload", "staticmethod", "classmethod");
      -  private ReachingDefinitionsAnalysis reachingDefinitionsAnalysis;
      -
      -  @Override
      -  public void visitFileInput(FileInput fileInput) {
      -    reachingDefinitionsAnalysis = new ReachingDefinitionsAnalysis(getContext().pythonFile());
      -    super.visitFileInput(fileInput);
      -  }
       
         @Override
         public void visitIfStatement(IfStatement ifStatement) {
      @@ -143,7 +135,7 @@ private void checkExpression(Expression expression) {
             }
           }
           if (expression.is(NAME)) {
      -      Set valuesAtLocation = reachingDefinitionsAnalysis.valuesAtLocation(((Name) expression));
      +      Set valuesAtLocation = getContext().valuesAtLocation(((Name) expression));
             if (valuesAtLocation.size() == 1) {
               Expression lastAssignedValue = valuesAtLocation.iterator().next();
               if (isImmutableConstant(lastAssignedValue)) {
      diff --git a/python-checks/src/main/java/org/sonar/python/checks/DeadStoreCheck.java b/python-checks/src/main/java/org/sonar/python/checks/DeadStoreCheck.java
      index 6427b3133..ab20ea815 100644
      --- a/python-checks/src/main/java/org/sonar/python/checks/DeadStoreCheck.java
      +++ b/python-checks/src/main/java/org/sonar/python/checks/DeadStoreCheck.java
      @@ -70,7 +70,7 @@ public void initialize(Context context) {
             if (TreeUtils.hasDescendant(functionDef, tree -> tree.is(Tree.Kind.TRY_STMT))) {
               return;
             }
      -      ControlFlowGraph cfg = ControlFlowGraph.build(functionDef, ctx.pythonFile());
      +      ControlFlowGraph cfg = ctx.cfg(functionDef);
             if (cfg == null) {
               return;
             }
      diff --git a/python-checks/src/main/java/org/sonar/python/checks/FloatingPointEqualityCheck.java b/python-checks/src/main/java/org/sonar/python/checks/FloatingPointEqualityCheck.java
      index 9641caa28..4112ed484 100644
      --- a/python-checks/src/main/java/org/sonar/python/checks/FloatingPointEqualityCheck.java
      +++ b/python-checks/src/main/java/org/sonar/python/checks/FloatingPointEqualityCheck.java
      @@ -32,7 +32,6 @@
       import org.sonar.plugins.python.api.tree.ImportName;
       import org.sonar.plugins.python.api.tree.Name;
       import org.sonar.plugins.python.api.tree.Tree;
      -import org.sonar.python.cfg.fixpoint.ReachingDefinitionsAnalysis;
       import org.sonar.python.quickfix.TextEditUtils;
       import org.sonar.python.tree.TreeUtils;
       import org.sonar.python.types.v2.TypeChecker;
      @@ -52,7 +51,6 @@ public class FloatingPointEqualityCheck extends PythonSubscriptionCheck {
       
         private static final String MATH_MODULE = "math";
       
      -  private ReachingDefinitionsAnalysis reachingDefinitionsAnalysis;
         private static final List SUPPORTED_IS_CLOSE_MODULES = Arrays.asList("numpy", "torch", MATH_MODULE);
       
         private String importedModuleForIsClose;
      @@ -71,7 +69,6 @@ public void initialize(Context context) {
         }
       
         private void initializeAnalysis(SubscriptionContext ctx) {
      -    reachingDefinitionsAnalysis = new ReachingDefinitionsAnalysis(ctx.pythonFile());
           importedModuleForIsClose = null;
           importedAlias = null;
           typeChecker = ctx.typeChecker();
      @@ -80,19 +77,19 @@ private void initializeAnalysis(SubscriptionContext ctx) {
         private void checkFloatingPointEquality(SubscriptionContext ctx) {
           BinaryExpression binaryExpression = (BinaryExpression) ctx.syntaxNode();
           String operator = binaryExpression.operator().value();
      -    if (("==".equals(operator) || "!=".equals(operator)) && isAnyOperandFloatingPoint(binaryExpression)) {
      +    if (("==".equals(operator) || "!=".equals(operator)) && isAnyOperandFloatingPoint(binaryExpression, ctx)) {
             PreciseIssue issue = ctx.addIssue(binaryExpression, MESSAGE);
             issue.addQuickFix(createQuickFix(binaryExpression, operator));
           }
         }
       
      -  private boolean isAnyOperandFloatingPoint(BinaryExpression binaryExpression) {
      +  private boolean isAnyOperandFloatingPoint(BinaryExpression binaryExpression, SubscriptionContext ctx) {
           Expression leftOperand = binaryExpression.leftOperand();
           Expression rightOperand = binaryExpression.rightOperand();
       
           return isFloat(leftOperand) || isFloat(rightOperand) ||
      -        isAssignedFloat(leftOperand) || isAssignedFloat(rightOperand) ||
      -        isBinaryOperationWithFloat(leftOperand) || isBinaryOperationWithFloat(rightOperand);
      +        isAssignedFloat(leftOperand, ctx) || isAssignedFloat(rightOperand, ctx) ||
      +        isBinaryOperationWithFloat(leftOperand, ctx) || isBinaryOperationWithFloat(rightOperand, ctx);
         }
       
         private boolean isFloat(Expression expression) {
      @@ -100,9 +97,9 @@ private boolean isFloat(Expression expression) {
           return expression.is(Tree.Kind.NUMERIC_LITERAL) && isTypeFloat == TriBool.TRUE;
         }
       
      -  private boolean isAssignedFloat(Expression expression) {
      +  private boolean isAssignedFloat(Expression expression, SubscriptionContext ctx) {
           if (expression.is(Tree.Kind.NAME)) {
      -      Set values = reachingDefinitionsAnalysis.valuesAtLocation((Name) expression);
      +      Set values = ctx.valuesAtLocation((Name) expression);
             if (!values.isEmpty()) {
               return values.stream().allMatch(this::isFloat);
             }
      @@ -110,9 +107,9 @@ private boolean isAssignedFloat(Expression expression) {
           return false;
         }
       
      -  private boolean isBinaryOperationWithFloat(Expression expression) {
      +  private boolean isBinaryOperationWithFloat(Expression expression, SubscriptionContext ctx) {
           if (expression.is(BINARY_OPERATION_KINDS)) {
      -      return isAnyOperandFloatingPoint((BinaryExpression) expression);
      +      return isAnyOperandFloatingPoint((BinaryExpression) expression, ctx);
           }
           return false;
         }
      diff --git a/python-checks/src/main/java/org/sonar/python/checks/HttpNoContentNonEmptyBodyCheck.java b/python-checks/src/main/java/org/sonar/python/checks/HttpNoContentNonEmptyBodyCheck.java
      index 4cf748649..9bc881581 100644
      --- a/python-checks/src/main/java/org/sonar/python/checks/HttpNoContentNonEmptyBodyCheck.java
      +++ b/python-checks/src/main/java/org/sonar/python/checks/HttpNoContentNonEmptyBodyCheck.java
      @@ -32,7 +32,6 @@
       import org.sonar.plugins.python.api.tree.Tree;
       import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher;
       import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers;
      -import org.sonar.python.cfg.fixpoint.ReachingDefinitionsAnalysis;
       import org.sonar.python.checks.utils.Expressions;
       import org.sonar.python.tree.TreeUtils;
       
      @@ -41,8 +40,6 @@ public class HttpNoContentNonEmptyBodyCheck extends PythonSubscriptionCheck {
       
         private static final String MESSAGE = "Return an empty body for this endpoint returning 204 status.";
       
      -  private ReachingDefinitionsAnalysis reachingDefinitionsAnalysis;
      -
         private static final TypeMatcher FASTAPI_RESPONSE_INSTANCE = TypeMatchers.isObjectOfType("fastapi.Response");
         private static final TypeMatcher NONE_TYPE = TypeMatchers.isObjectOfType("NoneType");
       
      @@ -59,9 +56,6 @@ public class HttpNoContentNonEmptyBodyCheck extends PythonSubscriptionCheck {
       
         @Override
         public void initialize(Context context) {
      -    context.registerSyntaxNodeConsumer(Tree.Kind.FILE_INPUT, ctx ->
      -      reachingDefinitionsAnalysis = new ReachingDefinitionsAnalysis(ctx.pythonFile())
      -    );
           context.registerSyntaxNodeConsumer(Tree.Kind.FUNCDEF, this::checkFunctionDef);
         }
       
      @@ -176,7 +170,7 @@ private ValidationResult isValidResponseObject(SubscriptionContext ctx, Expressi
       
           if (expr.is(Tree.Kind.NAME)) {
             Name name = (Name) expr;
      -      var assignedValues = reachingDefinitionsAnalysis.valuesAtLocation(name);
      +      var assignedValues = ctx.valuesAtLocation(name);
       
             boolean anyInvalid = false;
             for (Expression assignedValue : assignedValues) {
      diff --git a/python-checks/src/main/java/org/sonar/python/checks/IgnoredParameterCheck.java b/python-checks/src/main/java/org/sonar/python/checks/IgnoredParameterCheck.java
      index 1f0cbb685..6921e108b 100644
      --- a/python-checks/src/main/java/org/sonar/python/checks/IgnoredParameterCheck.java
      +++ b/python-checks/src/main/java/org/sonar/python/checks/IgnoredParameterCheck.java
      @@ -43,7 +43,7 @@ public class IgnoredParameterCheck extends PythonSubscriptionCheck {
         public void initialize(Context context) {
           context.registerSyntaxNodeConsumer(Tree.Kind.FUNCDEF, ctx -> {
             FunctionDef functionDef = (FunctionDef) ctx.syntaxNode();
      -      ControlFlowGraph cfg = ControlFlowGraph.build(functionDef, ctx.pythonFile());
      +      ControlFlowGraph cfg = ctx.cfg(functionDef);
             if (cfg == null) {
               return;
             }
      diff --git a/python-checks/src/main/java/org/sonar/python/checks/InfiniteRecursionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/InfiniteRecursionCheck.java
      index 29e6d8d4b..459a35ec9 100644
      --- a/python-checks/src/main/java/org/sonar/python/checks/InfiniteRecursionCheck.java
      +++ b/python-checks/src/main/java/org/sonar/python/checks/InfiniteRecursionCheck.java
      @@ -26,7 +26,6 @@
       import javax.annotation.CheckForNull;
       import javax.annotation.Nullable;
       import org.sonar.check.Rule;
      -import org.sonar.plugins.python.api.PythonFile;
       import org.sonar.plugins.python.api.PythonSubscriptionCheck;
       import org.sonar.plugins.python.api.cfg.CfgBlock;
       import org.sonar.plugins.python.api.cfg.ControlFlowGraph;
      @@ -62,7 +61,7 @@ public void initialize(Context context) {
           context.registerSyntaxNodeConsumer(Tree.Kind.FUNCDEF, ctx -> {
             FunctionDef functionDef = (FunctionDef) ctx.syntaxNode();
             List allRecursiveCalls = new ArrayList<>();
      -      boolean endBlockIsReachable = collectRecursiveCallsAndCheckIfEndBlockIsReachable(functionDef, ctx.pythonFile(), allRecursiveCalls);
      +      boolean endBlockIsReachable = collectRecursiveCallsAndCheckIfEndBlockIsReachable(functionDef, ctx.cfg(functionDef), allRecursiveCalls);
             if (!allRecursiveCalls.isEmpty() && !endBlockIsReachable) {
               String message = String.format(MESSAGE, functionDef.isMethodDefinition() ? "method" : "function");
               PreciseIssue issue = ctx.addIssue(functionDef.name(), message);
      @@ -71,13 +70,9 @@ public void initialize(Context context) {
           });
         }
       
      -  private static boolean collectRecursiveCallsAndCheckIfEndBlockIsReachable(FunctionDef functionDef, PythonFile pythonFile, List allRecursiveCalls) {
      +  private static boolean collectRecursiveCallsAndCheckIfEndBlockIsReachable(FunctionDef functionDef, @Nullable ControlFlowGraph cfg, List allRecursiveCalls) {
           Symbol functionSymbol = functionDef.name().symbol();
      -    if (functionSymbol == null) {
      -      return true;
      -    }
      -    ControlFlowGraph cfg = ControlFlowGraph.build(functionDef, pythonFile);
      -    if (cfg == null) {
      +    if (functionSymbol == null || cfg == null) {
             return true;
           }
           RecursiveCallCollector recursiveCallCollector = new RecursiveCallCollector(functionDef, functionSymbol);
      diff --git a/python-checks/src/main/java/org/sonar/python/checks/InvariantReturnCheck.java b/python-checks/src/main/java/org/sonar/python/checks/InvariantReturnCheck.java
      index 480969b36..c51290b48 100644
      --- a/python-checks/src/main/java/org/sonar/python/checks/InvariantReturnCheck.java
      +++ b/python-checks/src/main/java/org/sonar/python/checks/InvariantReturnCheck.java
      @@ -62,7 +62,7 @@ public class InvariantReturnCheck extends PythonSubscriptionCheck {
         public void initialize(Context context) {
           context.registerSyntaxNodeConsumer(Kind.FUNCDEF, ctx -> {
             FunctionDef functionDef = (FunctionDef) ctx.syntaxNode();
      -      ControlFlowGraph cfg = ControlFlowGraph.build(functionDef, ctx.pythonFile());
      +      ControlFlowGraph cfg = ctx.cfg(functionDef);
             if (cfg != null) {
               List latestExecutedBlocks = collectLatestExecutedBlocks(cfg);
               boolean allBlocksHaveReturnStatement = latestExecutedBlocks.stream().allMatch(LatestExecutedBlock::hasReturnStatement);
      diff --git a/python-checks/src/main/java/org/sonar/python/checks/LoopExecutingAtMostOnceCheck.java b/python-checks/src/main/java/org/sonar/python/checks/LoopExecutingAtMostOnceCheck.java
      index 098a0da85..9568747b9 100644
      --- a/python-checks/src/main/java/org/sonar/python/checks/LoopExecutingAtMostOnceCheck.java
      +++ b/python-checks/src/main/java/org/sonar/python/checks/LoopExecutingAtMostOnceCheck.java
      @@ -29,8 +29,6 @@
       import org.sonar.plugins.python.api.cfg.ControlFlowGraph;
       import org.sonar.plugins.python.api.PythonSubscriptionCheck;
       import org.sonar.plugins.python.api.SubscriptionContext;
      -import org.sonar.plugins.python.api.tree.FileInput;
      -import org.sonar.plugins.python.api.tree.FunctionDef;
       import org.sonar.plugins.python.api.tree.Token;
       import org.sonar.plugins.python.api.tree.Tree;
       import org.sonar.plugins.python.api.tree.Tree.Kind;
      @@ -43,10 +41,10 @@ public class LoopExecutingAtMostOnceCheck extends PythonSubscriptionCheck {
         @Override
         public void initialize(Context context) {
           context.registerSyntaxNodeConsumer(Kind.FUNCDEF, ctx ->
      -      checkCfg(ControlFlowGraph.build((FunctionDef) ctx.syntaxNode(), ctx.pythonFile()), ctx)
      +      checkCfg(ctx.cfg(ctx.syntaxNode()), ctx)
           );
           context.registerSyntaxNodeConsumer(Kind.FILE_INPUT, ctx ->
      -      checkCfg(ControlFlowGraph.build((FileInput) ctx.syntaxNode(), ctx.pythonFile()), ctx)
      +      checkCfg(ctx.cfg(ctx.syntaxNode()), ctx)
           );
         }
       
      diff --git a/python-checks/src/main/java/org/sonar/python/checks/NumpyListOverGeneratorCheck.java b/python-checks/src/main/java/org/sonar/python/checks/NumpyListOverGeneratorCheck.java
      index 1957848dd..fdeffc0af 100644
      --- a/python-checks/src/main/java/org/sonar/python/checks/NumpyListOverGeneratorCheck.java
      +++ b/python-checks/src/main/java/org/sonar/python/checks/NumpyListOverGeneratorCheck.java
      @@ -30,18 +30,15 @@
       import org.sonar.plugins.python.api.tree.Name;
       import org.sonar.plugins.python.api.tree.RegularArgument;
       import org.sonar.plugins.python.api.tree.Tree;
      -import org.sonar.python.cfg.fixpoint.ReachingDefinitionsAnalysis;
       import org.sonar.python.tree.TreeUtils;
       
       @Rule(key = "S6714")
       public class NumpyListOverGeneratorCheck extends PythonSubscriptionCheck {
       
         public static final String MESSAGE = "Pass a list to \"np.array\" instead of passing a generator.";
      -  private ReachingDefinitionsAnalysis reachingDefinitionsAnalysis;
       
         @Override
         public void initialize(Context context) {
      -    context.registerSyntaxNodeConsumer(Tree.Kind.FILE_INPUT, ctx -> reachingDefinitionsAnalysis = new ReachingDefinitionsAnalysis((ctx.pythonFile())));
           context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, this::checkNumpyArrayCall);
         }
       
      @@ -63,7 +60,7 @@ private void checkGeneratorCallee(CallExpression call, SubscriptionContext ctx)
             .filter(arg -> arg.is(Tree.Kind.REGULAR_ARGUMENT))
             .map(RegularArgument.class::cast)
             .map(RegularArgument::expression)
      -      .filter(regArg -> (regArg.is(Tree.Kind.GENERATOR_EXPR) || this.isNamedGeneratorExpression(regArg)))
      +      .filter(regArg -> (regArg.is(Tree.Kind.GENERATOR_EXPR) || isNamedGeneratorExpression(regArg, ctx)))
             .isEmpty()) {
             return;
           }
      @@ -79,10 +76,10 @@ private void checkGeneratorCallee(CallExpression call, SubscriptionContext ctx)
           }
         }
       
      -  private boolean isNamedGeneratorExpression(Expression expression) {
      +  private static boolean isNamedGeneratorExpression(Expression expression, SubscriptionContext ctx) {
           return Optional.of(expression)
             .flatMap(TreeUtils.toOptionalInstanceOfMapper(Name.class))
      -      .map(name -> this.reachingDefinitionsAnalysis.valuesAtLocation(name))
      +      .map(ctx::valuesAtLocation)
             .filter(NumpyListOverGeneratorCheck::checkSetProperties)
             .isPresent();
         }
      diff --git a/python-checks/src/main/java/org/sonar/python/checks/PytzTimeZoneInDatetimeConstructorCheck.java b/python-checks/src/main/java/org/sonar/python/checks/PytzTimeZoneInDatetimeConstructorCheck.java
      index af95e147f..b647e0aaf 100644
      --- a/python-checks/src/main/java/org/sonar/python/checks/PytzTimeZoneInDatetimeConstructorCheck.java
      +++ b/python-checks/src/main/java/org/sonar/python/checks/PytzTimeZoneInDatetimeConstructorCheck.java
      @@ -27,21 +27,16 @@
       import org.sonar.plugins.python.api.tree.Name;
       import org.sonar.plugins.python.api.tree.RegularArgument;
       import org.sonar.plugins.python.api.tree.Tree;
      -import org.sonar.python.cfg.fixpoint.ReachingDefinitionsAnalysis;
       import org.sonar.python.tree.TreeUtils;
       
       @Rule(key = "S6887")
       public class PytzTimeZoneInDatetimeConstructorCheck extends PythonSubscriptionCheck {
       
      -  private ReachingDefinitionsAnalysis reachingDefinitionsAnalysis;
         private static final String MESSAGE = "Don't pass a \"pytz.timezone\" to the \"datetime.datetime\" constructor.";
         private static final String SECONDARY_MESSAGE = "The pytz.timezone is created here.";
       
         @Override
         public void initialize(Context context) {
      -    context.registerSyntaxNodeConsumer(Tree.Kind.FILE_INPUT,
      -      ctx -> reachingDefinitionsAnalysis = new ReachingDefinitionsAnalysis(ctx.pythonFile()));
      -
           context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, this::checkCallExpression);
         }
       
      @@ -67,7 +62,7 @@ private void checkArgument(RegularArgument argument, SubscriptionContext context
             }
             context.addIssue(argument, MESSAGE);
           } else if (argument.expression().is(Tree.Kind.NAME)) {
      -      List allSecondaryLocations = reachingDefinitionsAnalysis.valuesAtLocation((Name) argument.expression()).stream()
      +      List allSecondaryLocations = context.valuesAtLocation((Name) argument.expression()).stream()
               .filter(expression -> expression.is(Tree.Kind.CALL_EXPR))
               .map(CallExpression.class::cast)
               .filter(call -> Optional.ofNullable(call.calleeSymbol()).map(symbol ->"pytz.timezone".equals(symbol.fullyQualifiedName())).orElse(false))
      diff --git a/python-checks/src/main/java/org/sonar/python/checks/RandomSeedCheck.java b/python-checks/src/main/java/org/sonar/python/checks/RandomSeedCheck.java
      index 80065986b..cf5682406 100644
      --- a/python-checks/src/main/java/org/sonar/python/checks/RandomSeedCheck.java
      +++ b/python-checks/src/main/java/org/sonar/python/checks/RandomSeedCheck.java
      @@ -32,7 +32,6 @@
       import org.sonar.plugins.python.api.tree.Name;
       import org.sonar.plugins.python.api.tree.RegularArgument;
       import org.sonar.plugins.python.api.tree.Tree;
      -import org.sonar.python.cfg.fixpoint.ReachingDefinitionsAnalysis;
       import org.sonar.python.checks.cdk.CdkPredicate;
       import org.sonar.python.semantic.ClassSymbolImpl;
       import org.sonar.python.semantic.SymbolUtils;
      @@ -63,8 +62,6 @@ public class RandomSeedCheck extends PythonSubscriptionCheck {
         private static final String MESSAGE = "Provide a seed for this random generator.";
         private static final String SKLEARN_MESSAGE = "Provide a seed for the random_state parameter.";
       
      -  private ReachingDefinitionsAnalysis reachingDefinitionsAnalysis;
      -
         private static Predicate keywordAbsentOrNotIn(String keyword, String... restrictedValues) {
           Set restrictedValueSet = Set.of(restrictedValues);
           return call -> {
      @@ -99,7 +96,6 @@ private static Predicate probabilityArgAbsent() {
         public void initialize(Context context) {
           context.registerSyntaxNodeConsumer(Tree.Kind.FILE_INPUT,
             ctx -> {
      -        this.reachingDefinitionsAnalysis = new ReachingDefinitionsAnalysis(ctx.pythonFile());
               this.typeCheckMap = new TypeCheckMap<>();
               SKLEARN_EXCEPTIONS.forEach((fqn, predicate) -> this.typeCheckMap.put(ctx.typeChecker().typeCheckBuilder().isTypeWithFqn(fqn), predicate));
             });
      @@ -114,12 +110,12 @@ private void checkEmptySeedCall(SubscriptionContext ctx) {
           maybeCalleeSymbol
             .map(Symbol::fullyQualifiedName)
             .map(SEED_METHODS_TO_CHECK::get)
      -      .filter(argName -> isArgumentAbsentOrNone(TreeUtils.nthArgumentOrKeyword(0, argName, call.arguments())))
      +      .filter(argName -> isArgumentAbsentOrNone(TreeUtils.nthArgumentOrKeyword(0, argName, call.arguments()), ctx))
             .map(arg -> MESSAGE)
             .or(() -> maybeCalleeSymbol
               .filter(symbol -> symbol.fullyQualifiedName() != null && symbol.fullyQualifiedName().startsWith(SKLEARN_FQN))
               .filter(RandomSeedCheck::hasRandomStateParameter)
      -        .filter(symbol -> isArgumentAbsentOrNone(TreeUtils.argumentByKeyword(SKLEARN_ARG_NAME, call.arguments())))
      +        .filter(symbol -> isArgumentAbsentOrNone(TreeUtils.argumentByKeyword(SKLEARN_ARG_NAME, call.arguments()), ctx))
               .filter(symbol -> !isSKLearnException(call))
               .map(symbol -> SKLEARN_MESSAGE))
             .ifPresent(message -> ctx.addIssue(call.callee(), message));
      @@ -156,14 +152,14 @@ private static Optional isFunctionWithRandomStateParameter(Symbol calle
               .anyMatch(SKLEARN_ARG_NAME::equals));
         }
       
      -  private boolean isArgumentAbsentOrNone(@Nullable RegularArgument arg) {
      -    return arg == null || arg.expression().is(Tree.Kind.NONE) || isAssignedNone(arg.expression());
      +  private static boolean isArgumentAbsentOrNone(@Nullable RegularArgument arg, SubscriptionContext ctx) {
      +    return arg == null || arg.expression().is(Tree.Kind.NONE) || isAssignedNone(arg.expression(), ctx);
         }
       
      -  private boolean isAssignedNone(Expression exp) {
      +  private static boolean isAssignedNone(Expression exp, SubscriptionContext ctx) {
           return Optional.of(exp)
             .flatMap(TreeUtils.toOptionalInstanceOfMapper(Name.class))
      -      .map(reachingDefinitionsAnalysis::valuesAtLocation)
      +      .map(ctx::valuesAtLocation)
             .filter(Predicate.not(Set::isEmpty))
             .filter(values -> values.stream().allMatch(value -> value.is(Tree.Kind.NONE))).isPresent();
         }
      diff --git a/python-checks/src/main/java/org/sonar/python/checks/RedundantJumpCheck.java b/python-checks/src/main/java/org/sonar/python/checks/RedundantJumpCheck.java
      index b9abd605d..bcb8ee75c 100644
      --- a/python-checks/src/main/java/org/sonar/python/checks/RedundantJumpCheck.java
      +++ b/python-checks/src/main/java/org/sonar/python/checks/RedundantJumpCheck.java
      @@ -24,8 +24,6 @@
       import org.sonar.plugins.python.api.PythonSubscriptionCheck;
       import org.sonar.plugins.python.api.SubscriptionContext;
       import org.sonar.plugins.python.api.cfg.ControlFlowGraph;
      -import org.sonar.plugins.python.api.tree.FileInput;
      -import org.sonar.plugins.python.api.tree.FunctionDef;
       import org.sonar.plugins.python.api.tree.ReturnStatement;
       import org.sonar.plugins.python.api.tree.Statement;
       import org.sonar.plugins.python.api.tree.StatementList;
      @@ -43,8 +41,8 @@ public class RedundantJumpCheck extends PythonSubscriptionCheck {
       
         @Override
         public void initialize(Context context) {
      -    context.registerSyntaxNodeConsumer(Kind.FILE_INPUT, ctx -> checkCfg(ControlFlowGraph.build((FileInput) ctx.syntaxNode(), ctx.pythonFile()), ctx));
      -    context.registerSyntaxNodeConsumer(Kind.FUNCDEF, ctx -> checkCfg(ControlFlowGraph.build((FunctionDef) ctx.syntaxNode(), ctx.pythonFile()), ctx));
      +    context.registerSyntaxNodeConsumer(Kind.FILE_INPUT, ctx -> checkCfg(ctx.cfg(ctx.syntaxNode()), ctx));
      +    context.registerSyntaxNodeConsumer(Kind.FUNCDEF, ctx -> checkCfg(ctx.cfg(ctx.syntaxNode()), ctx));
         }
       
         private static void checkCfg(@Nullable ControlFlowGraph cfg, SubscriptionContext ctx) {
      diff --git a/python-checks/src/main/java/org/sonar/python/checks/ReferencedBeforeAssignmentCheck.java b/python-checks/src/main/java/org/sonar/python/checks/ReferencedBeforeAssignmentCheck.java
      index 92bcde0bb..2ed277441 100644
      --- a/python-checks/src/main/java/org/sonar/python/checks/ReferencedBeforeAssignmentCheck.java
      +++ b/python-checks/src/main/java/org/sonar/python/checks/ReferencedBeforeAssignmentCheck.java
      @@ -47,7 +47,7 @@ public void initialize(Context context) {
             if (TreeUtils.hasDescendant(functionDef, tree -> tree.is(Tree.Kind.TRY_STMT))) {
               return;
             }
      -      ControlFlowGraph cfg = ControlFlowGraph.build(functionDef, ctx.pythonFile());
      +      ControlFlowGraph cfg = ctx.cfg(functionDef);
             if (cfg == null) {
               return;
             }
      diff --git a/python-checks/src/main/java/org/sonar/python/checks/TorchLoadLeadsToUntrustedCodeExecutionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/TorchLoadLeadsToUntrustedCodeExecutionCheck.java
      index ca4a452a4..2b9f192e6 100644
      --- a/python-checks/src/main/java/org/sonar/python/checks/TorchLoadLeadsToUntrustedCodeExecutionCheck.java
      +++ b/python-checks/src/main/java/org/sonar/python/checks/TorchLoadLeadsToUntrustedCodeExecutionCheck.java
      @@ -20,6 +20,7 @@
       import java.util.Set;
       import org.sonar.check.Rule;
       import org.sonar.plugins.python.api.PythonSubscriptionCheck;
      +import org.sonar.plugins.python.api.SubscriptionContext;
       import org.sonar.plugins.python.api.symbols.Symbol;
       import org.sonar.plugins.python.api.tree.Argument;
       import org.sonar.plugins.python.api.tree.CallExpression;
      @@ -27,7 +28,6 @@
       import org.sonar.plugins.python.api.tree.Name;
       import org.sonar.plugins.python.api.tree.RegularArgument;
       import org.sonar.plugins.python.api.tree.Tree;
      -import org.sonar.python.cfg.fixpoint.ReachingDefinitionsAnalysis;
       import org.sonar.python.checks.utils.Expressions;
       import org.sonar.python.tree.TreeUtils;
       
      @@ -39,39 +39,33 @@ public class TorchLoadLeadsToUntrustedCodeExecutionCheck extends PythonSubscript
         public static final String PYTHON_FALSE = "False";
         public static final String WEIGHTS_ONLY = "weights_only";
       
      -  private ReachingDefinitionsAnalysis reachingDefinitionsAnalysis;
      -
         @Override
         public void initialize(Context context) {
      -    context.registerSyntaxNodeConsumer(Tree.Kind.FILE_INPUT, ctx -> reachingDefinitionsAnalysis =
      -      new ReachingDefinitionsAnalysis(ctx.pythonFile()));
      -
           context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, ctx -> {
             CallExpression callExpression = (CallExpression) ctx.syntaxNode();
             Symbol calleeSymbol = callExpression.calleeSymbol();
             if (calleeSymbol != null && TORCH_LOAD.equals(calleeSymbol.fullyQualifiedName())
      -        && isWeightsOnlyNotFoundOrSetToFalse(callExpression.arguments())) {
      +        && isWeightsOnlyNotFoundOrSetToFalse(callExpression.arguments(), ctx)) {
       
               ctx.addIssue(callExpression.callee(), MESSAGE);
             }
           });
         }
       
      -  private boolean isWeightsOnlyNotFoundOrSetToFalse(List arguments) {
      +  private static boolean isWeightsOnlyNotFoundOrSetToFalse(List arguments, SubscriptionContext ctx) {
           RegularArgument weightsOnlyArg = TreeUtils.argumentByKeyword(WEIGHTS_ONLY, arguments);
           if (weightsOnlyArg == null) return !Expressions.containsSpreadOperator(arguments);
           if (weightsOnlyArg.expression() instanceof Name name) {
      -      return PYTHON_FALSE.equals(name.name()) || isNameSetToFalse(name);
      +      return PYTHON_FALSE.equals(name.name()) || isNameSetToFalse(name, ctx);
           }
           return false;
         }
       
      -  private boolean isNameSetToFalse(Name name) {
      -    Set values = reachingDefinitionsAnalysis.valuesAtLocation(name);
      +  private static boolean isNameSetToFalse(Name name, SubscriptionContext ctx) {
      +    Set values = ctx.valuesAtLocation(name);
           return values.size() == 1 && values.stream()
             .flatMap(TreeUtils.toStreamInstanceOfMapper(Name.class))
             .map(Name::name).allMatch(PYTHON_FALSE::equals);
         }
       
      -
       }
      diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/UnconditionalAssertionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/UnconditionalAssertionCheck.java
      index 3ed7546af..96c2cd428 100644
      --- a/python-checks/src/main/java/org/sonar/python/checks/tests/UnconditionalAssertionCheck.java
      +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/UnconditionalAssertionCheck.java
      @@ -34,7 +34,6 @@
       import org.sonar.plugins.python.api.tree.NumericLiteral;
       import org.sonar.plugins.python.api.tree.RegularArgument;
       import org.sonar.plugins.python.api.tree.Tree;
      -import org.sonar.python.cfg.fixpoint.ReachingDefinitionsAnalysis;
       import org.sonar.python.checks.utils.CheckUtils;
       import org.sonar.python.tree.TreeUtils;
       
      @@ -58,13 +57,8 @@ public class UnconditionalAssertionCheck extends PythonSubscriptionCheck {
       
         private static final Set ACCEPTED_DECORATORS = Set.of("overload", "staticmethod", "classmethod");
       
      -  private ReachingDefinitionsAnalysis reachingDefinitionsAnalysis;
      -
         @Override
         public void initialize(Context context) {
      -    context.registerSyntaxNodeConsumer(Tree.Kind.FILE_INPUT, ctx ->
      -      reachingDefinitionsAnalysis = new ReachingDefinitionsAnalysis(ctx.pythonFile()));
      -
           context.registerSyntaxNodeConsumer(Tree.Kind.ASSERT_STMT, ctx -> {
             AssertStatement assertStatement = (AssertStatement) ctx.syntaxNode();
             Expression condition = assertStatement.condition();
      @@ -115,13 +109,13 @@ private static boolean isFalseOrZeroLiteral(Expression expression) {
         }
       
         private void checkNoneAssertion(SubscriptionContext ctx, CallExpression call, RegularArgument arg) {
      -    if (isUnconditional(arg)) {
      +    if (isUnconditional(arg, ctx)) {
             ctx.addIssue(call, NONE_MESSAGE);
           }
         }
       
         private void checkBooleanAssertion(SubscriptionContext ctx, RegularArgument arg) {
      -    if (isUnconditional(arg)) {
      +    if (isUnconditional(arg, ctx)) {
             ctx.addIssue(arg, BOOLEAN_MESSAGE);
           }
         }
      @@ -132,7 +126,7 @@ private static void checkIsAssertion(SubscriptionContext ctx, CallExpression cal
           }
         }
       
      -  private boolean isUnconditional(RegularArgument argument) {
      +  private static boolean isUnconditional(RegularArgument argument, SubscriptionContext ctx) {
           Expression expression = argument.expression();
           if (isConstant(expression)) {
             return true;
      @@ -151,7 +145,7 @@ private boolean isUnconditional(RegularArgument argument) {
           }
       
           if (expression.is(NAME)) {
      -      Set valuesAtLocation = reachingDefinitionsAnalysis.valuesAtLocation(((Name) expression));
      +      Set valuesAtLocation = ctx.valuesAtLocation(((Name) expression));
             if (valuesAtLocation.size() == 1) {
               return CheckUtils.isImmutableConstant(valuesAtLocation.iterator().next());
             }
      diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonVisitorContext.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonVisitorContext.java
      index 0c16653a3..5d3fae34d 100644
      --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonVisitorContext.java
      +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonVisitorContext.java
      @@ -21,16 +21,23 @@
       import java.io.File;
       import java.util.ArrayList;
       import java.util.List;
      +import java.util.Map;
       import java.util.Optional;
      +import java.util.Set;
       import javax.annotation.CheckForNull;
       import javax.annotation.Nullable;
       import org.sonar.api.SonarProduct;
       import org.sonar.plugins.python.api.PythonCheck.PreciseIssue;
       import org.sonar.plugins.python.api.caching.CacheContext;
      +import org.sonar.plugins.python.api.cfg.ControlFlowGraph;
       import org.sonar.plugins.python.api.project.configuration.ProjectConfiguration;
      +import org.sonar.plugins.python.api.tree.Expression;
       import org.sonar.plugins.python.api.tree.FileInput;
      +import org.sonar.plugins.python.api.tree.Name;
      +import org.sonar.plugins.python.api.tree.Tree;
       import org.sonar.plugins.python.api.types.v2.ModuleType;
       import org.sonar.python.caching.CacheContextImpl;
      +import org.sonar.python.cfg.fixpoint.ReachingDefinitionsAnalysis;
       import org.sonar.python.semantic.ProjectLevelSymbolTable;
       import org.sonar.python.semantic.SymbolTableBuilder;
       import org.sonar.python.semantic.v2.SymbolTableBuilderV2;
      @@ -50,6 +57,8 @@ public class PythonVisitorContext extends PythonInputFileContext {
         private final List issues;
         private final ProjectConfiguration projectConfiguration;
         private final CallGraph callGraph;
      +  private final Map cfgMap;
      +  private final ReachingDefinitionsAnalysis reachingDefinitionsAnalysis;
         private final TypeTable typeTable;
       
         private PythonVisitorContext(FileInput rootTree, 
      @@ -61,12 +70,15 @@ private PythonVisitorContext(FileInput rootTree,
             ProjectConfiguration projectConfiguration,
             ModuleType moduleType,
             CallGraph callGraph,
      -      TypeTable typeTable
      +      TypeTable typeTable,
      +      Map cfgMap
           ) {
           super(pythonFile, workingDirectory, cacheContext, sonarProduct, projectLevelSymbolTable);
           this.moduleType = moduleType;
           this.projectConfiguration = projectConfiguration;
           this.callGraph = callGraph;
      +    this.cfgMap = cfgMap;
      +    this.reachingDefinitionsAnalysis = new ReachingDefinitionsAnalysis(pythonFile);
           this.rootTree = rootTree;
           this.parsingException = null;
           this.typeTable = typeTable;
      @@ -82,6 +94,8 @@ public PythonVisitorContext(PythonFile pythonFile, RecognitionException parsingE
           this.typeChecker = new TypeChecker(this.typeTable);
           this.projectConfiguration = new ProjectConfiguration();
           this.callGraph = CallGraph.EMPTY;
      +    this.cfgMap = Map.of();
      +    this.reachingDefinitionsAnalysis = new ReachingDefinitionsAnalysis(pythonFile);
           this.issues = new ArrayList<>();
           this.moduleType = null;
         }
      @@ -110,6 +124,10 @@ public List getIssues() {
           return issues;
         }
       
      +  public Set valuesAtLocation(Name name) {
      +    return reachingDefinitionsAnalysis.valuesAtLocation(name);
      +  }
      +
         @CheckForNull
         @Beta
         public ModuleType moduleType() {
      @@ -124,6 +142,10 @@ public CallGraph callGraph() {
           return callGraph;
         }
       
      +  public ControlFlowGraph cfg(Tree tree) {
      +    return cfgMap.get(tree);
      +  }
      +
         public Optional getDjangoViewInfo(String fqn) {
           return projectLevelSymbolTable().getDjangoViewInfo(fqn);
         }
      @@ -141,6 +163,7 @@ public static class Builder {
           private Optional callGraph = Optional.empty();
           private Optional packageName = Optional.empty();
           private Optional moduleType = Optional.empty();
      +    private Optional> cfgMap = Optional.empty();
       
           public Builder(FileInput rootTree, PythonFile pythonFile) {
             this.rootTree = rootTree;
      @@ -192,16 +215,30 @@ public Builder callGraph(CallGraph callGraph) {
             return this;
           }
       
      +    // Allows passing pre-computed CFGs when moduleType is set externally and the builder skips type inference.
      +    public Builder cfgMap(Map cfgMap) {
      +      this.cfgMap = Optional.of(cfgMap);
      +      return this;
      +    }
      +
           public PythonVisitorContext build() {
             var symbolTable = projectLevelSymbolTable.orElseGet(ProjectLevelSymbolTable::empty);
             var pkgName = packageName.orElse("");
             buildSymbols(rootTree, pythonFile, pkgName, symbolTable);
             var finalTypeTable = this.typeTable.orElseGet(() -> new ProjectLevelTypeTable(symbolTable));
      -      var mt = moduleType.orElseGet(() -> {
      +
      +      ModuleType mt;
      +      Map finalCfgMap;
      +      if (moduleType.isPresent()) {
      +        mt = moduleType.get();
      +        finalCfgMap = cfgMap.orElse(Map.of());
      +      } else {
               var symbolTableBuilderV2 = new SymbolTableBuilderV2(rootTree);
               var symbolTableV2 = symbolTableBuilderV2.build();
      -        return new TypeInferenceV2(finalTypeTable, pythonFile, symbolTableV2, pkgName).inferModuleType(rootTree);
      -      });
      +        var typeInference = new TypeInferenceV2(finalTypeTable, pythonFile, symbolTableV2, pkgName);
      +        mt = typeInference.inferModuleType(rootTree);
      +        finalCfgMap = typeInference.getCfgMap();
      +      }
       
             var finalCallGraph = callGraph.orElseGet(() -> CallGraphCollector.collectCallGraph(rootTree));
       
      @@ -215,7 +252,8 @@ public PythonVisitorContext build() {
               projectConfiguration.orElse(new ProjectConfiguration()),
               mt,
               finalCallGraph,
      -        finalTypeTable
      +        finalTypeTable,
      +        finalCfgMap
             );
           }
       
      diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/SubscriptionContext.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/SubscriptionContext.java
      index 38ae5a3b0..47b8aa316 100644
      --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/SubscriptionContext.java
      +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/SubscriptionContext.java
      @@ -24,8 +24,11 @@
       import javax.annotation.CheckForNull;
       import javax.annotation.Nullable;
       import org.sonar.plugins.python.api.caching.CacheContext;
      +import org.sonar.plugins.python.api.cfg.ControlFlowGraph;
       import org.sonar.plugins.python.api.project.configuration.ProjectConfiguration;
       import org.sonar.plugins.python.api.symbols.Symbol;
      +import org.sonar.plugins.python.api.tree.Expression;
      +import org.sonar.plugins.python.api.tree.Name;
       import org.sonar.plugins.python.api.tree.Token;
       import org.sonar.plugins.python.api.tree.Tree;
       import org.sonar.python.semantic.v2.callgraph.CallGraph;
      @@ -78,6 +81,10 @@ public interface SubscriptionContext {
       
         CallGraph callGraph();
       
      +  ControlFlowGraph cfg(Tree tree);
      +
      +  Set valuesAtLocation(Name name);
      +
         /**
          * Returns Django view information for the given fully qualified function name.
          * @param fqn the fully qualified name of a function
      diff --git a/python-frontend/src/main/java/org/sonar/python/SubscriptionVisitor.java b/python-frontend/src/main/java/org/sonar/python/SubscriptionVisitor.java
      index ddd245bec..1228f7142 100644
      --- a/python-frontend/src/main/java/org/sonar/python/SubscriptionVisitor.java
      +++ b/python-frontend/src/main/java/org/sonar/python/SubscriptionVisitor.java
      @@ -41,9 +41,12 @@
       import org.sonar.plugins.python.api.PythonVisitorContext;
       import org.sonar.plugins.python.api.SubscriptionContext;
       import org.sonar.plugins.python.api.caching.CacheContext;
      +import org.sonar.plugins.python.api.cfg.ControlFlowGraph;
       import org.sonar.plugins.python.api.project.configuration.ProjectConfiguration;
       import org.sonar.plugins.python.api.symbols.Symbol;
      +import org.sonar.plugins.python.api.tree.Expression;
       import org.sonar.plugins.python.api.tree.FileInput;
      +import org.sonar.plugins.python.api.tree.Name;
       import org.sonar.plugins.python.api.tree.StringElement;
       import org.sonar.plugins.python.api.tree.Token;
       import org.sonar.plugins.python.api.tree.Tree;
      @@ -204,6 +207,16 @@ public CallGraph callGraph() {
             return pythonVisitorContext.callGraph();
           }
       
      +    @Override
      +    public ControlFlowGraph cfg(Tree tree) {
      +      return pythonVisitorContext.cfg(tree);
      +    }
      +
      +    @Override
      +    public Set valuesAtLocation(Name name) {
      +      return pythonVisitorContext.valuesAtLocation(name);
      +    }
      +
           @Override
           public RegexParseResult regexForStringElement(StringElement stringElement, FlagSet flagSet) {
             return regexCache.computeIfAbsent(stringElement.hashCode() + "-" + flagSet.getMask(),
      diff --git a/python-frontend/src/main/java/org/sonar/python/TestPythonVisitorRunner.java b/python-frontend/src/main/java/org/sonar/python/TestPythonVisitorRunner.java
      index 7a2dc1aa1..7e623cdbc 100644
      --- a/python-frontend/src/main/java/org/sonar/python/TestPythonVisitorRunner.java
      +++ b/python-frontend/src/main/java/org/sonar/python/TestPythonVisitorRunner.java
      @@ -89,7 +89,8 @@ public static PythonVisitorContext createContext(File file, @Nullable File worki
           var typeTable = new ProjectLevelTypeTable(projectLevelSymbolTable);
           var symbolTableBuilderV2 = new SymbolTableBuilderV2(rootTree);
           var symbolTableV2 = symbolTableBuilderV2.build();
      -    var moduleType = new TypeInferenceV2(typeTable, pythonFile, symbolTableV2, packageName).inferModuleType(rootTree);
      +    var typeInference = new TypeInferenceV2(typeTable, pythonFile, symbolTableV2, packageName);
      +    var moduleType = typeInference.inferModuleType(rootTree);
       
           if (projectConfiguration == null) {
             var projectConfigurationBuilder = new ProjectConfigurationBuilder();
      @@ -105,6 +106,7 @@ public static PythonVisitorContext createContext(File file, @Nullable File worki
             .projectConfiguration(projectConfiguration)
             .typeTable(typeTable)
             .moduleType(moduleType)
      +      .cfgMap(typeInference.getCfgMap())
             .build();
         }
       
      diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/TypeInferenceV2.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/TypeInferenceV2.java
      index 0d8b506ca..b7977fd3e 100644
      --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/TypeInferenceV2.java
      +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/TypeInferenceV2.java
      @@ -18,6 +18,7 @@
       
       import java.util.Collection;
       import java.util.Collections;
      +import java.util.HashMap;
       import java.util.HashSet;
       import java.util.List;
       import java.util.Map;
      @@ -57,6 +58,7 @@ public class TypeInferenceV2 {
         private final SymbolTable symbolTable;
         private final PythonFile pythonFile;
         private final String fullyQualifiedModuleName;
      +  private final Map cfgMap = new HashMap<>();
         private Set importedModulesFQN;
       
         public TypeInferenceV2(TypeTable projectLevelTypeTable, PythonFile pythonFile, SymbolTable symbolTable, String packageName) {
      @@ -156,6 +158,11 @@ private Map> inferTypesAndMemberAccessSymbols(Tree sco
             .map(Propagation::lhsName)
             .collect(Collectors.toSet());
       
      +    ControlFlowGraph cfg = controlFlowGraphSupplier.get();
      +    if (cfg != null) {
      +      cfgMap.put(scopeTree, cfg);
      +    }
      +
           TryStatementVisitor tryStatementVisitor = new TryStatementVisitor();
           statements.accept(tryStatementVisitor);
           if (tryStatementVisitor.hasTryStatement()) {
      @@ -164,7 +171,6 @@ private Map> inferTypesAndMemberAccessSymbols(Tree sco
               .process(getTrackedVars(declaredVariables, assignedNames));
           }
       
      -    ControlFlowGraph cfg = controlFlowGraphSupplier.get();
           if (cfg == null) {
             return Map.of();
           }
      @@ -221,4 +227,8 @@ private static Set getTrackedVars(Set localVariables, Set importedModulesFQN() {
           return importedModulesFQN;
         }
      +
      +  public Map getCfgMap() {
      +    return Collections.unmodifiableMap(cfgMap);
      +  }
       }
      diff --git a/python-frontend/src/test/java/org/sonar/python/SubscriptionVisitorTest.java b/python-frontend/src/test/java/org/sonar/python/SubscriptionVisitorTest.java
      index 7b5c68c31..07c4f9cdc 100644
      --- a/python-frontend/src/test/java/org/sonar/python/SubscriptionVisitorTest.java
      +++ b/python-frontend/src/test/java/org/sonar/python/SubscriptionVisitorTest.java
      @@ -17,7 +17,10 @@
       package org.sonar.python;
       
       import java.util.Collections;
      +import java.util.List;
      +import java.util.Set;
       import java.util.concurrent.CountDownLatch;
      +import java.util.concurrent.atomic.AtomicReference;
       import java.util.regex.Pattern;
       import org.junit.jupiter.api.Test;
       import org.mockito.Mockito;
      @@ -31,7 +34,11 @@
       import org.sonar.plugins.python.api.PythonVisitorContext.Builder;
       import org.sonar.plugins.python.api.caching.CacheContext;
       import org.sonar.plugins.python.api.tree.ClassDef;
      +import org.sonar.plugins.python.api.tree.ExpressionStatement;
       import org.sonar.plugins.python.api.tree.FileInput;
      +import org.sonar.plugins.python.api.tree.Expression;
      +import org.sonar.plugins.python.api.tree.Name;
      +import org.sonar.plugins.python.api.tree.NumericLiteral;
       import org.sonar.plugins.python.api.tree.StringElement;
       import org.sonar.plugins.python.api.tree.Tree;
       import org.sonar.python.regex.RegexContext;
      @@ -165,4 +172,47 @@ public void initialize(Context context) {
             .withFailMessage("CallGraph was not accessed")
             .isZero();
         }
      +
      +  @Test
      +  void reachingDefinitionAnalysis() {
      +    var latch = new CountDownLatch(2);
      +    var firstResult = new AtomicReference>();
      +
      +    var check1 = new PythonSubscriptionCheck() {
      +      @Override
      +      public void initialize(Context context) {
      +        context.registerSyntaxNodeConsumer(Tree.Kind.EXPRESSION_STMT, ctx -> {
      +          var exprStmt = (ExpressionStatement) ctx.syntaxNode();
      +          var expr = exprStmt.expressions().get(0);
      +          if (expr instanceof Name name && "x".equals(name.name())) {
      +            var values = ctx.valuesAtLocation(name);
      +            assertThat(values).extracting(e -> ((NumericLiteral) e).valueAsString()).containsExactly("42");
      +            firstResult.set(values);
      +            latch.countDown();
      +          }
      +        });
      +      }
      +    };
      +
      +    var check2 = new PythonSubscriptionCheck() {
      +      @Override
      +      public void initialize(Context context) {
      +        context.registerSyntaxNodeConsumer(Tree.Kind.EXPRESSION_STMT, ctx -> {
      +          var exprStmt = (ExpressionStatement) ctx.syntaxNode();
      +          var expr = exprStmt.expressions().get(0);
      +          if (expr instanceof Name name && "x".equals(name.name())) {
      +            assertThat(ctx.valuesAtLocation(name)).isSameAs(firstResult.get());
      +            latch.countDown();
      +          }
      +        });
      +      }
      +    };
      +
      +    var fileInput = PythonTestUtils.parse("def f():\n  x = 42\n  x");
      +    var context = new Builder(fileInput, PythonTestUtils.pythonFile("file")).build();
      +    SubscriptionVisitor.analyze(List.of(check1, check2), context);
      +    assertThat(latch.getCount())
      +      .withFailMessage("valuesAtLocation was not called by both checks")
      +      .isZero();
      +  }
       }
      
      From adc1973365fe85f35c6488017daceed08eb05086 Mon Sep 17 00:00:00 2001
      From: "sonar-nigel[bot]" <247337653+sonar-nigel[bot]@users.noreply.github.com>
      Date: Fri, 13 Mar 2026 14:01:54 +0100
      Subject: [PATCH 029/322] SONARPY-638 Fix S5720 false positive on
       Enum._generate_next_value_ (#929)
      
      Co-authored-by: Vibe Bot 
      GitOrigin-RevId: fe66b00074a56902d8c633f3bb531d1d79b83e8b
      ---
       .../InstanceMethodSelfAsFirstCheck.java       |  5 +++
       .../checks/instanceMethodSelfAsFirst.py       | 36 +++++++++++++++++++
       2 files changed, 41 insertions(+)
      
      diff --git a/python-checks/src/main/java/org/sonar/python/checks/InstanceMethodSelfAsFirstCheck.java b/python-checks/src/main/java/org/sonar/python/checks/InstanceMethodSelfAsFirstCheck.java
      index c0b056e5d..3e7d92aab 100644
      --- a/python-checks/src/main/java/org/sonar/python/checks/InstanceMethodSelfAsFirstCheck.java
      +++ b/python-checks/src/main/java/org/sonar/python/checks/InstanceMethodSelfAsFirstCheck.java
      @@ -93,6 +93,11 @@ private boolean isRelevantMethod(ClassDef classDef, ClassSymbol classSymbol, Fun
             return false;
           }
       
      +    // Skip _generate_next_value_ in Enum subclasses: it is a static protocol method per the Python docs
      +    if ("_generate_next_value_".equals(functionDef.name().name()) && classSymbol.isOrExtends("enum.Enum")) {
      +      return false;
      +    }
      +
           // Skip if the class has a ignored decorator
           if (functionDef.decorators().stream().anyMatch(this::isNonInstanceMethodDecorator)) {
             return false;
      diff --git a/python-checks/src/test/resources/checks/instanceMethodSelfAsFirst.py b/python-checks/src/test/resources/checks/instanceMethodSelfAsFirst.py
      index 5112e600f..72cbfcc24 100644
      --- a/python-checks/src/test/resources/checks/instanceMethodSelfAsFirst.py
      +++ b/python-checks/src/test/resources/checks/instanceMethodSelfAsFirst.py
      @@ -182,3 +182,39 @@ def used_as_decorator_call(method):  # OK
       
       @used_as_decorator_call()
       def decorated(self): ...
      +
      +from enum import Enum, auto
      +import enum
      +
      +# Do not raise on _generate_next_value_ in Enum subclasses
      +class MyAutoName(Enum):
      +    def _generate_next_value_(name, start, count, last_values):  # OK
      +        return name
      +
      +class Animal(Enum):
      +    def _generate_next_value_(name, start, count, last_values):  # OK
      +        return name.lower()
      +
      +    DOG = auto()
      +    CAT = auto()
      +
      +class UpperCaseEnum(enum.Enum):
      +    def _generate_next_value_(name, start, count, last_values):  # OK
      +        return name.upper()
      +
      +class NotAnEnum:
      +    def _generate_next_value_(name, start, count, last_values):  # Noncompliant
      +        return name
      +
      +class EnumWithOtherMethod(Enum):
      +    def regular_method(arg):  # Noncompliant
      +        pass
      +
      +# Indirect Enum subclass: _generate_next_value_ should also be exempt
      +class BaseAutoEnum(Enum):
      +    def _generate_next_value_(name, start, count, last_values):  # OK
      +        return name.upper()
      +
      +class DerivedAutoEnum(BaseAutoEnum):
      +    def _generate_next_value_(name, start, count, last_values):  # OK
      +        return name.lower()
      
      From b291df4b7b8657e4cba771fd248151585e8cd11a Mon Sep 17 00:00:00 2001
      From: Sebastian Zumbrunn 
      Date: Mon, 16 Mar 2026 17:00:16 +0100
      Subject: [PATCH 030/322] SONARPY-3922 Pin tox version (#965)
      
      GitOrigin-RevId: 51c826f25da66789c08806103df88dc841ce87ea
      ---
       mise.toml | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/mise.toml b/mise.toml
      index 5da6bd7b2..9c323f9d6 100644
      --- a/mise.toml
      +++ b/mise.toml
      @@ -3,4 +3,4 @@ java = "21.0"
       maven = "3.9"
       python = "3.9"
       uv = "latest" # required for pipx backend
      -"pipx:tox" = { version = "latest", uvx = "true" }
      +"pipx:tox" = { version = "4.49.1", uvx = "true" }
      
      From debf13173a4149fa022ae8afa50717c38a24ea0a Mon Sep 17 00:00:00 2001
      From: Sebastian Zumbrunn 
      Date: Tue, 17 Mar 2026 09:27:53 +0100
      Subject: [PATCH 031/322] SONARPY-3924 Use uv install for tox (#966)
      
      GitOrigin-RevId: 5027127384e91dd18f6bae54669cd2fdd0d6175e
      ---
       mise.toml | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/mise.toml b/mise.toml
      index 9c323f9d6..20c56e0d1 100644
      --- a/mise.toml
      +++ b/mise.toml
      @@ -3,4 +3,4 @@ java = "21.0"
       maven = "3.9"
       python = "3.9"
       uv = "latest" # required for pipx backend
      -"pipx:tox" = { version = "4.49.1", uvx = "true" }
      +# tox is installed via "uv tool install tox==4.49.1" in the build workflow due to caching problems with python dependencies
      
      From 60713123bc392890692c44773daa2d7783f6c2e0 Mon Sep 17 00:00:00 2001
      From: Marc Jasper 
      Date: Tue, 17 Mar 2026 11:44:57 +0100
      Subject: [PATCH 032/322] SONARPY-3915 Improve SQLQueriesCheck with reaching
       definitions analysis (#960)
      
      GitOrigin-RevId: 693473abdbaa10b0ee7648ee4e8f830159bd5480
      ---
       .../checks/hotspots/SQLQueriesCheck.java      | 23 +++++++++++++++----
       .../resources/checks/hotspots/sqlQuery.py     | 18 ++++++++++++++-
       2 files changed, 35 insertions(+), 6 deletions(-)
      
      diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/SQLQueriesCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/SQLQueriesCheck.java
      index f7bea76f3..1f05dda17 100644
      --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/SQLQueriesCheck.java
      +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/SQLQueriesCheck.java
      @@ -111,8 +111,8 @@ private void checkCallExpression(SubscriptionContext context) {
         }
       
         private static void addIssue(SubscriptionContext context, CallExpression callExpression) {
      -    Optional secondary = sensitiveArgumentValue(callExpression);
      -    secondary.ifPresent(tree ->  context.addIssue(callExpression, MESSAGE).secondary(tree, null));
      +    Optional secondary = sensitiveArgumentValue(callExpression, context);
      +    secondary.ifPresent(tree -> context.addIssue(callExpression, MESSAGE).secondary(tree, null));
         }
       
         private static boolean isException(CallExpression callExpression, String functionName) {
      @@ -123,7 +123,7 @@ private static boolean isException(CallExpression callExpression, String functio
           return argListNode.isEmpty();
         }
       
      -  private static Optional sensitiveArgumentValue(CallExpression callExpression) {
      +  private static Optional sensitiveArgumentValue(CallExpression callExpression, SubscriptionContext ctx) {
           List argListNode = callExpression.arguments();
           if (argListNode.isEmpty()) {
             return Optional.empty();
      @@ -134,14 +134,27 @@ private static Optional sensitiveArgumentValue(CallExpression callExpressi
           }
           Expression expression = getExpression(((RegularArgument) arg).expression());
           if (expression.is(Tree.Kind.NAME)) {
      -      expression = Expressions.singleAssignedValue((Name) expression);
      +      return findFormattedValue((Name) expression, ctx);
           }
      -    if (expression != null && isFormatted(expression)) {
      +    if (isFormatted(expression)) {
             return Optional.of(expression);
           }
           return Optional.empty();
         }
       
      +  private static Optional findFormattedValue(Name name, SubscriptionContext ctx) {
      +    Set values = ctx.valuesAtLocation(name);
      +    if (!values.isEmpty()) {
      +      return values.stream()
      +        .filter(SQLQueriesCheck::isFormatted)
      +        .findFirst()
      +        .map(Tree.class::cast);
      +    }
      +    return Optional.ofNullable(Expressions.singleAssignedValue(name))
      +      .filter(SQLQueriesCheck::isFormatted)
      +      .map(Tree.class::cast);
      +  }
      +
         private static boolean isFormatted(Expression tree) {
           FormattedStringVisitor visitor = new FormattedStringVisitor();
           tree.accept(visitor);
      diff --git a/python-checks/src/test/resources/checks/hotspots/sqlQuery.py b/python-checks/src/test/resources/checks/hotspots/sqlQuery.py
      index 488e93afe..4ae764d08 100644
      --- a/python-checks/src/test/resources/checks/hotspots/sqlQuery.py
      +++ b/python-checks/src/test/resources/checks/hotspots/sqlQuery.py
      @@ -30,7 +30,7 @@ def query_my_user(request, params):
               MyUser.objects.raw(formatted_request3)  # Noncompliant
               MyUser.objects.raw(y := formatted_request3)  # Noncompliant
               MyUser.objects.raw((y := formatted_request3))  # Noncompliant
      -        MyUser.objects.raw(formatted_request4)  # FN, multiple assignments
      +        MyUser.objects.raw(formatted_request4)  # Noncompliant
               MyUser.objects.raw(formatted_request5)  # OK
               MyUser.objects.raw(*formatted_request5)  # OK
       
      @@ -58,5 +58,21 @@ def query_my_user(request, params):
               MyUser.objects.extra({ 'mycol': "select col from sometable here mycol = %s and othercol = " + value}) # Noncompliant
               MyUser.objects.extra({ 'mycol': "select col from sometable here mycol = %s and othercol = " + ""}) # Noncompliant
       
      +    def test_reaching_definitions(self, request, value):
      +        query = "SELECT 1"
      +        if request:
      +            query = 'SELECT * FROM mytable WHERE name = "%s"' % value
      +        MyUser.objects.raw(query)  # Noncompliant
      +
      +        safe_query = "SELECT 1"
      +        if request:
      +            safe_query = "SELECT 2"
      +        MyUser.objects.raw(safe_query)  # OK
      +
      +        all_formatted = 'SELECT * FROM mytable WHERE name = "%s"' % value
      +        if request:
      +            all_formatted = f'SELECT * FROM mytable WHERE name = "{value}"'
      +        MyUser.objects.raw(all_formatted)  # Noncompliant
      +
            def fun():
               pass
      
      From e5433afd4912ed756d9c10431f0c452359d2f511 Mon Sep 17 00:00:00 2001
      From: David Kunzmann 
      Date: Thu, 19 Mar 2026 08:56:01 +0100
      Subject: [PATCH 033/322] SONARPY-3917 Updated message of S2712 (#963)
      
      GitOrigin-RevId: c5a9eda1075a3fb344321ee046f02509bc02048d
      ---
       .../checks/ReturnAndYieldInOneFunctionCheck.java      |  2 +-
       .../resources/checks/returnAndYieldInOneFunction.py   | 11 ++++++++---
       2 files changed, 9 insertions(+), 4 deletions(-)
      
      diff --git a/python-checks/src/main/java/org/sonar/python/checks/ReturnAndYieldInOneFunctionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/ReturnAndYieldInOneFunctionCheck.java
      index 999585237..3ab139d24 100644
      --- a/python-checks/src/main/java/org/sonar/python/checks/ReturnAndYieldInOneFunctionCheck.java
      +++ b/python-checks/src/main/java/org/sonar/python/checks/ReturnAndYieldInOneFunctionCheck.java
      @@ -37,7 +37,7 @@ public void initialize(Context context) {
             func.body().accept(returnAndYieldVisitor);
       
             if (returnAndYieldVisitor.hasYield && returnAndYieldVisitor.hasReturn) {
      -        ctx.addIssue(func.name(), "Use only \"return\" or only \"yield\", not both.");
      +        ctx.addIssue(func.name(), "Only yield or return values from this function, not both.");
             }
           });
         }
      diff --git a/python-checks/src/test/resources/checks/returnAndYieldInOneFunction.py b/python-checks/src/test/resources/checks/returnAndYieldInOneFunction.py
      index 53bfc659e..bc0a26572 100644
      --- a/python-checks/src/test/resources/checks/returnAndYieldInOneFunction.py
      +++ b/python-checks/src/test/resources/checks/returnAndYieldInOneFunction.py
      @@ -1,5 +1,4 @@
      -
      -def fun1(n): # Noncompliant {{Use only "return" or only "yield", not both.}}
      +def fun1(n):  # Noncompliant {{Only yield or return values from this function, not both.}}
       #   ^^^^
           num = 0
           while num < n:
      @@ -22,7 +21,8 @@ def fun3(n):
               yield num
               num += 1
       
      -def fun5(n): # Noncompliant
      +
      +def fun5(n):  # Noncompliant
           num = 0
           if n == 0:
               return
      @@ -31,18 +31,23 @@ def fun5(n): # Noncompliant
               num += 1
           return num
       
      +
       def fun4(n):
           num = 0
           while num < n:
               num += 1
           return num
       
      +
       def fun6():
           def fun7():
               yield 1
      +
           return 1
       
      +
       def fun8():
           def fun9():
               return 1
      +
           yield 1
      
      From 79ada608f7e5f80dd67c36ee8b7e3303d66bdec9 Mon Sep 17 00:00:00 2001
      From: David Kunzmann 
      Date: Thu, 19 Mar 2026 11:10:20 +0100
      Subject: [PATCH 034/322] SONARPY-3940 Fix QG (#976)
      
      GitOrigin-RevId: a3f1b7805bd02b915f03b140dd9ae07758a7ef4e
      ---
       .../python/checks/ConstantConditionCheck.java |  1 -
       .../HttpNoContentNonEmptyBodyCheck.java       | 37 +++++++------------
       .../checks/NumpyListOverGeneratorCheck.java   |  2 +-
       ...ytzTimeZoneInDatetimeConstructorCheck.java |  2 +-
       .../tests/UnconditionalAssertionCheck.java    |  4 +-
       5 files changed, 17 insertions(+), 29 deletions(-)
      
      diff --git a/python-checks/src/main/java/org/sonar/python/checks/ConstantConditionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/ConstantConditionCheck.java
      index 614a5faf0..161f97658 100644
      --- a/python-checks/src/main/java/org/sonar/python/checks/ConstantConditionCheck.java
      +++ b/python-checks/src/main/java/org/sonar/python/checks/ConstantConditionCheck.java
      @@ -28,7 +28,6 @@
       import org.sonar.plugins.python.api.tree.ComprehensionIf;
       import org.sonar.plugins.python.api.tree.ConditionalExpression;
       import org.sonar.plugins.python.api.tree.Expression;
      -import org.sonar.plugins.python.api.tree.FileInput;
       import org.sonar.plugins.python.api.tree.HasSymbol;
       import org.sonar.plugins.python.api.tree.IfStatement;
       import org.sonar.plugins.python.api.tree.Name;
      diff --git a/python-checks/src/main/java/org/sonar/python/checks/HttpNoContentNonEmptyBodyCheck.java b/python-checks/src/main/java/org/sonar/python/checks/HttpNoContentNonEmptyBodyCheck.java
      index 9bc881581..2b4107307 100644
      --- a/python-checks/src/main/java/org/sonar/python/checks/HttpNoContentNonEmptyBodyCheck.java
      +++ b/python-checks/src/main/java/org/sonar/python/checks/HttpNoContentNonEmptyBodyCheck.java
      @@ -51,15 +51,14 @@ public class HttpNoContentNonEmptyBodyCheck extends PythonSubscriptionCheck {
           TypeMatchers.withFQN("fastapi.applications.FastAPI.patch"),
           TypeMatchers.withFQN("fastapi.applications.FastAPI.options"),
           TypeMatchers.withFQN("fastapi.applications.FastAPI.head"),
      -    TypeMatchers.withFQN("fastapi.applications.FastAPI.trace")
      -  );
      +    TypeMatchers.withFQN("fastapi.applications.FastAPI.trace"));
       
         @Override
         public void initialize(Context context) {
      -    context.registerSyntaxNodeConsumer(Tree.Kind.FUNCDEF, this::checkFunctionDef);
      +    context.registerSyntaxNodeConsumer(Tree.Kind.FUNCDEF, HttpNoContentNonEmptyBodyCheck::checkFunctionDef);
         }
       
      -  private void checkFunctionDef(SubscriptionContext ctx) {
      +  private static void checkFunctionDef(SubscriptionContext ctx) {
           FunctionDef functionDef = (FunctionDef) ctx.syntaxNode();
       
           if (!isFastApiEndpointWithNoContentStatus(ctx, functionDef)) {
      @@ -73,9 +72,7 @@ private static boolean isFastApiEndpointWithNoContentStatus(SubscriptionContext
           for (Decorator decorator : functionDef.decorators()) {
             Expression decoratorExpression = decorator.expression();
       
      -      if (decoratorExpression.is(Tree.Kind.CALL_EXPR)) {
      -        CallExpression callExpr = (CallExpression) decoratorExpression;
      -
      +      if (decoratorExpression instanceof CallExpression callExpr) {
               if (!FASTAPI_METHODS_MATCHER.isTrueFor(callExpr.callee(), ctx)) {
                 continue;
               }
      @@ -100,7 +97,7 @@ private static boolean isNoContentStatusValue(Expression expr) {
           return false;
         }
       
      -  private void findProblematicReturns(SubscriptionContext ctx, FunctionDef functionDef) {
      +  private static void findProblematicReturns(SubscriptionContext ctx, FunctionDef functionDef) {
           List allReturns = new ArrayList<>();
           collectReturnStatements(functionDef.body(), allReturns);
       
      @@ -135,7 +132,7 @@ private static void collectReturnStatements(Tree tree, List ret
           tree.children().forEach(child -> collectReturnStatements(child, returns));
         }
       
      -  private ValidationResult isValidReturnStatement(SubscriptionContext ctx, ReturnStatement returnStmt) {
      +  private static ValidationResult isValidReturnStatement(SubscriptionContext ctx, ReturnStatement returnStmt) {
           List expressions = returnStmt.expressions();
       
           if (expressions.isEmpty()) {
      @@ -161,39 +158,31 @@ private ValidationResult isValidReturnStatement(SubscriptionContext ctx, ReturnS
           return new ValidationResult(false);
         }
       
      -  private ValidationResult isValidResponseObject(SubscriptionContext ctx, Expression expr) {
      +  private static ValidationResult isValidResponseObject(SubscriptionContext ctx, Expression expr) {
           if (!FASTAPI_RESPONSE_INSTANCE.isTrueFor(expr, ctx)) {
             return new ValidationResult(false);
           }
       
           List secondaryLocations = new ArrayList<>();
       
      -    if (expr.is(Tree.Kind.NAME)) {
      -      Name name = (Name) expr;
      +    if (expr instanceof Name name) {
             var assignedValues = ctx.valuesAtLocation(name);
       
             boolean anyInvalid = false;
             for (Expression assignedValue : assignedValues) {
      -        if (assignedValue.is(Tree.Kind.CALL_EXPR)) {
      -          CallExpression callExpr = (CallExpression) assignedValue;
      -
      +        if (assignedValue instanceof CallExpression callExpr && isInvalidResponseCall(callExpr)) {
                 // Check if this Response has invalid arguments
      -          if (isInvalidResponseCall(callExpr)) {
      -            anyInvalid = true;
      -            secondaryLocations.add(assignedValue);
      -          }
      +          anyInvalid = true;
      +          secondaryLocations.add(assignedValue);
               }
             }
       
             if (anyInvalid) {
               return new ValidationResult(false, secondaryLocations);
             }
      -    } else if (expr.is(Tree.Kind.CALL_EXPR)) {
      +    } else if (expr instanceof CallExpression callExpr && isInvalidResponseCall(callExpr)) {
             // Direct Response constructor call
      -      CallExpression callExpr = (CallExpression) expr;
      -      if (isInvalidResponseCall(callExpr)) {
      -        return new ValidationResult(false);
      -      }
      +      return new ValidationResult(false);
           }
       
           return new ValidationResult(true);
      diff --git a/python-checks/src/main/java/org/sonar/python/checks/NumpyListOverGeneratorCheck.java b/python-checks/src/main/java/org/sonar/python/checks/NumpyListOverGeneratorCheck.java
      index fdeffc0af..726b92b96 100644
      --- a/python-checks/src/main/java/org/sonar/python/checks/NumpyListOverGeneratorCheck.java
      +++ b/python-checks/src/main/java/org/sonar/python/checks/NumpyListOverGeneratorCheck.java
      @@ -50,7 +50,7 @@ private void checkNumpyArrayCall(SubscriptionContext ctx) {
             .ifPresent(fqn -> checkGeneratorCallee(call, ctx));
         }
       
      -  private void checkGeneratorCallee(CallExpression call, SubscriptionContext ctx) {
      +  private static void checkGeneratorCallee(CallExpression call, SubscriptionContext ctx) {
           List argList = call.arguments();
           if (argList.isEmpty()) {
             return;
      diff --git a/python-checks/src/main/java/org/sonar/python/checks/PytzTimeZoneInDatetimeConstructorCheck.java b/python-checks/src/main/java/org/sonar/python/checks/PytzTimeZoneInDatetimeConstructorCheck.java
      index b647e0aaf..195032bec 100644
      --- a/python-checks/src/main/java/org/sonar/python/checks/PytzTimeZoneInDatetimeConstructorCheck.java
      +++ b/python-checks/src/main/java/org/sonar/python/checks/PytzTimeZoneInDatetimeConstructorCheck.java
      @@ -53,7 +53,7 @@ private void checkCallExpression(SubscriptionContext context) {
           }
         }
       
      -  private void checkArgument(RegularArgument argument, SubscriptionContext context) {
      +  private static void checkArgument(RegularArgument argument, SubscriptionContext context) {
           if (argument.expression().is(Tree.Kind.CALL_EXPR)) {
             CallExpression callExpression = (CallExpression) argument.expression();
             Symbol calleeSymbol = callExpression.calleeSymbol();
      diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/UnconditionalAssertionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/UnconditionalAssertionCheck.java
      index 96c2cd428..9ddfdfbb5 100644
      --- a/python-checks/src/main/java/org/sonar/python/checks/tests/UnconditionalAssertionCheck.java
      +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/UnconditionalAssertionCheck.java
      @@ -108,13 +108,13 @@ private static boolean isFalseOrZeroLiteral(Expression expression) {
           return false;
         }
       
      -  private void checkNoneAssertion(SubscriptionContext ctx, CallExpression call, RegularArgument arg) {
      +  private static void checkNoneAssertion(SubscriptionContext ctx, CallExpression call, RegularArgument arg) {
           if (isUnconditional(arg, ctx)) {
             ctx.addIssue(call, NONE_MESSAGE);
           }
         }
       
      -  private void checkBooleanAssertion(SubscriptionContext ctx, RegularArgument arg) {
      +  private static void checkBooleanAssertion(SubscriptionContext ctx, RegularArgument arg) {
           if (isUnconditional(arg, ctx)) {
             ctx.addIssue(arg, BOOLEAN_MESSAGE);
           }
      
      From 64d954d7c3242bb2392e355487004e2263f67057 Mon Sep 17 00:00:00 2001
      From: Sebastian Zumbrunn 
      Date: Thu, 19 Mar 2026 14:34:52 +0100
      Subject: [PATCH 035/322] SONARPY-3943 Introduce CI specific mise config env
       (#978)
      
      GitOrigin-RevId: 016cc355fc12b0e79be8f203320b7105a30f9efa
      ---
       mise.ci.toml | 4 ++++
       mise.toml    | 2 +-
       2 files changed, 5 insertions(+), 1 deletion(-)
       create mode 100644 mise.ci.toml
      
      diff --git a/mise.ci.toml b/mise.ci.toml
      new file mode 100644
      index 000000000..121a8ee37
      --- /dev/null
      +++ b/mise.ci.toml
      @@ -0,0 +1,4 @@
      +[settings]
      +# Keep tox in base mise.toml for local development, but skip mise-managed tox
      +# in CI and install it explicitly via uv where needed.
      +disable_tools = ["pipx:tox"]
      diff --git a/mise.toml b/mise.toml
      index 20c56e0d1..9c323f9d6 100644
      --- a/mise.toml
      +++ b/mise.toml
      @@ -3,4 +3,4 @@ java = "21.0"
       maven = "3.9"
       python = "3.9"
       uv = "latest" # required for pipx backend
      -# tox is installed via "uv tool install tox==4.49.1" in the build workflow due to caching problems with python dependencies
      +"pipx:tox" = { version = "4.49.1", uvx = "true" }
      
      From beca529b05a835799b38b28efd022c55e097feff Mon Sep 17 00:00:00 2001
      From: David Kunzmann 
      Date: Thu, 19 Mar 2026 15:10:59 +0100
      Subject: [PATCH 036/322] SONARPY-3945 Fix QG and migration to type V2 for
       NumpyListOverGeneratorCheck (#980)
      
      GitOrigin-RevId: 232cb45f4f2380b3dd6d0f9f59c3e0fc45a73472
      ---
       .../checks/NumpyListOverGeneratorCheck.java   | 27 +++++++++----------
       ...ytzTimeZoneInDatetimeConstructorCheck.java |  4 +--
       2 files changed, 14 insertions(+), 17 deletions(-)
      
      diff --git a/python-checks/src/main/java/org/sonar/python/checks/NumpyListOverGeneratorCheck.java b/python-checks/src/main/java/org/sonar/python/checks/NumpyListOverGeneratorCheck.java
      index 726b92b96..42827575e 100644
      --- a/python-checks/src/main/java/org/sonar/python/checks/NumpyListOverGeneratorCheck.java
      +++ b/python-checks/src/main/java/org/sonar/python/checks/NumpyListOverGeneratorCheck.java
      @@ -22,14 +22,14 @@
       import org.sonar.check.Rule;
       import org.sonar.plugins.python.api.PythonSubscriptionCheck;
       import org.sonar.plugins.python.api.SubscriptionContext;
      -import org.sonar.plugins.python.api.symbols.Symbol;
       import org.sonar.plugins.python.api.tree.Argument;
       import org.sonar.plugins.python.api.tree.CallExpression;
       import org.sonar.plugins.python.api.tree.Expression;
      -import org.sonar.plugins.python.api.tree.HasSymbol;
       import org.sonar.plugins.python.api.tree.Name;
       import org.sonar.plugins.python.api.tree.RegularArgument;
       import org.sonar.plugins.python.api.tree.Tree;
      +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher;
      +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers;
       import org.sonar.python.tree.TreeUtils;
       
       @Rule(key = "S6714")
      @@ -37,17 +37,19 @@ public class NumpyListOverGeneratorCheck extends PythonSubscriptionCheck {
       
         public static final String MESSAGE = "Pass a list to \"np.array\" instead of passing a generator.";
       
      +  private static final TypeMatcher IS_NUMPY_ARRAY = TypeMatchers.withFQN("numpy.array");
      +  private static final TypeMatcher IS_OBJECT_TYPE = TypeMatchers.isType("builtins.object");
      +
         @Override
         public void initialize(Context context) {
      -    context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, this::checkNumpyArrayCall);
      +    context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, NumpyListOverGeneratorCheck::checkNumpyArrayCall);
         }
       
      -  private void checkNumpyArrayCall(SubscriptionContext ctx) {
      +  private static void checkNumpyArrayCall(SubscriptionContext ctx) {
           CallExpression call = (CallExpression) ctx.syntaxNode();
      -    Optional.ofNullable(call.calleeSymbol())
      -      .map(Symbol::fullyQualifiedName)
      -      .filter("numpy.array"::equals)
      -      .ifPresent(fqn -> checkGeneratorCallee(call, ctx));
      +    if (IS_NUMPY_ARRAY.isTrueFor(call.callee(), ctx)) {
      +      checkGeneratorCallee(call, ctx);
      +    }
         }
       
         private static void checkGeneratorCallee(CallExpression call, SubscriptionContext ctx) {
      @@ -65,13 +67,8 @@ private static void checkGeneratorCallee(CallExpression call, SubscriptionContex
             return;
           }
       
      -    if (Optional.ofNullable(TreeUtils.nthArgumentOrKeyword(1, "dtype", argList))
      -      .filter(regArg -> regArg.expression().is(Tree.Kind.NAME))
      -      .map(regArg -> (Name) regArg.expression())
      -      .map(HasSymbol::symbol)
      -      .map(Symbol::fullyQualifiedName)
      -      .filter("object"::equals)
      -      .isEmpty()) {
      +    RegularArgument dtypeArg = TreeUtils.nthArgumentOrKeyword(1, "dtype", argList);
      +    if (dtypeArg == null || !IS_OBJECT_TYPE.isTrueFor(dtypeArg.expression(), ctx)) {
             ctx.addIssue(call, MESSAGE);
           }
         }
      diff --git a/python-checks/src/main/java/org/sonar/python/checks/PytzTimeZoneInDatetimeConstructorCheck.java b/python-checks/src/main/java/org/sonar/python/checks/PytzTimeZoneInDatetimeConstructorCheck.java
      index 195032bec..0f0638c70 100644
      --- a/python-checks/src/main/java/org/sonar/python/checks/PytzTimeZoneInDatetimeConstructorCheck.java
      +++ b/python-checks/src/main/java/org/sonar/python/checks/PytzTimeZoneInDatetimeConstructorCheck.java
      @@ -37,10 +37,10 @@ public class PytzTimeZoneInDatetimeConstructorCheck extends PythonSubscriptionCh
       
         @Override
         public void initialize(Context context) {
      -    context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, this::checkCallExpression);
      +    context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, PytzTimeZoneInDatetimeConstructorCheck::checkCallExpression);
         }
       
      -  private void checkCallExpression(SubscriptionContext context) {
      +  private static void checkCallExpression(SubscriptionContext context) {
           CallExpression callExpression = (CallExpression) context.syntaxNode();
           Symbol calleeSymbol = callExpression.calleeSymbol();
       
      
      From 7ef0e849fb051575ffed6410503cacc4051cd214 Mon Sep 17 00:00:00 2001
      From: David Kunzmann 
      Date: Mon, 23 Mar 2026 14:55:06 +0100
      Subject: [PATCH 037/322] SONARPY-3961 Update rule metadata (#998)
      
      GitOrigin-RevId: 73734302e79b86b1ff98e06dcdbe905290b630e0
      ---
       .../org/sonar/l10n/py/rules/python/S2712.html | 45 ++++++++++++++-----
       .../org/sonar/l10n/py/rules/python/S2712.json |  2 +-
       .../org/sonar/l10n/py/rules/python/S8392.html |  1 -
       .../org/sonar/l10n/py/rules/python/S8392.json |  3 --
       sonarpedia.json                               |  2 +-
       5 files changed, 36 insertions(+), 17 deletions(-)
      
      diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2712.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2712.html
      index 11bc3106b..8aa712a3a 100644
      --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2712.html
      +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2712.html
      @@ -1,14 +1,37 @@
      +

      This rule raises an issue when a return statement with a value is used inside a generator function (a function that uses +yield).

      Why is this an issue?

      -

      Functions that use yield are known as "generators". Before Python 3.3, generators cannot return values. Similarly, -functions that use return cannot use yield. Doing so will cause a SyntaxError.

      -

      Either upgrade your version of Python to a version >= 3.3, or don’t use both return and yield in a function.

      -

      Noncompliant code example

      -
      -def adder(n):
      -     num = 0
      -     while num < n:
      -         yield num
      -         num += 1
      -     return num  #Noncompliant
      +

      When a generator function uses return with a value, the value is not sent to the caller like a normal function return. Instead, it is +silently attached to the StopIteration exception’s value attribute. Most callers iterate generators with a for +loop, which swallows StopIteration automatically and discards the returned value entirely. This makes the return value +effectively invisible and can lead to subtle bugs where developers expect the value to be accessible but it never reaches the calling code.

      +

      A bare return (without a value) in a generator is fine — it simply ends the generator’s execution early, similar to how +return works in a regular function.

      +

      How to fix it

      +

      Code examples

      +

      Noncompliant code example

      +
      +def counter(n):
      +    num = 0
      +    while num < n:
      +        yield num
      +        num += 1
      +    return num  # Noncompliant: return with a value in a generator
       
      +

      Compliant solution

      +
      +def counter(n):
      +    num = 0
      +    while num < n:
      +        yield num
      +        num += 1
      +    return  # Compliant: bare return for early exit is fine
      +
      +

      Resources

      +

      Documentation

      + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2712.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2712.json index eb3319db2..1d1a26c5c 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2712.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2712.json @@ -1,5 +1,5 @@ { - "title": "\"return\" and \"yield\" should not be used in the same function", + "title": "\"return\" with a value should not be used in a generator function", "type": "BUG", "code": { "impacts": { diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8392.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8392.html index 22f90d53b..93a01a1f4 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8392.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8392.html @@ -124,6 +124,5 @@

      Documentation

      Standards

      diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8392.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8392.json index 2d94b8867..716d03f3b 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8392.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8392.json @@ -28,9 +28,6 @@ "securityStandards": { "CWE": [ 668 - ], - "CIS": [ - "6.6.1" ] } } diff --git a/sonarpedia.json b/sonarpedia.json index 818f83554..7c8baffac 100644 --- a/sonarpedia.json +++ b/sonarpedia.json @@ -3,7 +3,7 @@ "languages": [ "PY" ], - "latest-update": "2026-03-10T13:34:05.699012606Z", + "latest-update": "2026-03-23T12:21:48.201596145Z", "options": { "no-language-in-filenames": true, "preserve-filenames": true From 03d16edf56ba24b119c3272ddd15dbf282287b21 Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Mon, 23 Mar 2026 16:23:15 +0100 Subject: [PATCH 038/322] SONARPY-3927 Migrated S5445 to TypeV2 (#967) GitOrigin-RevId: 7015cf8f784fb3abd60fcb23bbefb6f861d8ecaa --- .../python/checks/TempFileCreationCheck.java | 34 +++++++++++-------- .../resources/checks/tempFileCreationCheck.py | 13 +++++-- .../QualifiedExpressionCalculator.java | 12 +++++-- .../semantic/v2/TypeInferenceV2Test.java | 4 ++- .../QualifiedExpressionCalculatorTest.java | 16 +++++++++ 5 files changed, 58 insertions(+), 21 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/TempFileCreationCheck.java b/python-checks/src/main/java/org/sonar/python/checks/TempFileCreationCheck.java index 84e110fcb..29659553f 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/TempFileCreationCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/TempFileCreationCheck.java @@ -16,34 +16,38 @@ */ package org.sonar.python.checks; -import java.util.Arrays; -import java.util.List; import java.util.Optional; -import javax.annotation.Nullable; import org.sonar.check.Rule; import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; import org.sonar.plugins.python.api.tree.CallExpression; import org.sonar.plugins.python.api.tree.Tree; -import org.sonar.plugins.python.api.symbols.Symbol; +import org.sonar.plugins.python.api.types.v2.FullyQualifiedNameHelper; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; @Rule(key = "S5445") public class TempFileCreationCheck extends PythonSubscriptionCheck { - private static final List SUSPICIOUS_CALLS = Arrays.asList("os.tempnam", "os.tmpnam", "tempfile.mktemp"); + // os.tempnam and os.tmpnam were removed in Python 3 and have no stubs. + // We use withFQN to match both qualified (os.tempnam) and direct import (from os import tempnam) forms, + // as the callee gets typed as UnresolvedImportType("os.tempnam") in both cases. + private static final TypeMatcher INSECURE_CALLS = TypeMatchers.any( + TypeMatchers.isType("tempfile.mktemp"), + TypeMatchers.withFQN("os.tempnam"), + TypeMatchers.withFQN("os.tmpnam") + ); @Override public void initialize(Context context) { - context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, ctx -> { - CallExpression callExpr = (CallExpression) ctx.syntaxNode(); - Symbol symbol = callExpr.calleeSymbol(); - isInsecureTempFile(symbol).ifPresent(s -> ctx.addIssue(callExpr, String.format("'%s' is insecure. Use 'tempfile.TemporaryFile' instead", s))); - }); + context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, TempFileCreationCheck::checkCallExpression); } - private static Optional isInsecureTempFile(@Nullable Symbol symbol) { - if (symbol == null) { - return Optional.empty(); - } - return SUSPICIOUS_CALLS.stream().filter(call -> call.equals(symbol.fullyQualifiedName())).findFirst(); + private static void checkCallExpression(SubscriptionContext ctx) { + CallExpression callExpr = (CallExpression) ctx.syntaxNode(); + Optional.of(callExpr.callee()) + .filter(callee -> INSECURE_CALLS.isTrueFor(callee, ctx)) + .flatMap(callee -> FullyQualifiedNameHelper.getFullyQualifiedName(callee.typeV2())) + .ifPresent(name -> ctx.addIssue(callExpr.callee(), String.format("'%s' is insecure. Use 'tempfile.TemporaryFile' instead", name))); } } diff --git a/python-checks/src/test/resources/checks/tempFileCreationCheck.py b/python-checks/src/test/resources/checks/tempFileCreationCheck.py index 9ec970748..8e18fdf6c 100644 --- a/python-checks/src/test/resources/checks/tempFileCreationCheck.py +++ b/python-checks/src/test/resources/checks/tempFileCreationCheck.py @@ -1,18 +1,25 @@ import tempfile import os +from os import tempnam +from os import tmpnam filename = os.tempnam() # Noncompliant {{'os.tempnam' is insecure. Use 'tempfile.TemporaryFile' instead}} -# ^^^^^^^^^^^^ +# ^^^^^^^^^^ tmp_file = open(filename, "w+b") filename = os.tmpnam() # Noncompliant {{'os.tmpnam' is insecure. Use 'tempfile.TemporaryFile' instead}} -# ^^^^^^^^^^^ +# ^^^^^^^^^ tmp_file = open(filename, "w+b") filename = tempfile.mktemp() # Noncompliant {{'tempfile.mktemp' is insecure. Use 'tempfile.TemporaryFile' instead}} -# ^^^^^^^^^^^^^^^^^ +# ^^^^^^^^^^^^^^^ tmp_file = open(filename, "w+b") +filename = tempnam() # Noncompliant {{'os.tempnam' is insecure. Use 'tempfile.TemporaryFile' instead}} +# ^^^^^^^ + +filename = tmpnam() # Noncompliant {{'os.tmpnam' is insecure. Use 'tempfile.TemporaryFile' instead}} +# ^^^^^^ tmp_file = tempfile.TemporaryFile() # Compliant diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/typecalculator/QualifiedExpressionCalculator.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/typecalculator/QualifiedExpressionCalculator.java index 2c07273d5..6cc124ba7 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/typecalculator/QualifiedExpressionCalculator.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/typecalculator/QualifiedExpressionCalculator.java @@ -20,8 +20,10 @@ import org.sonar.plugins.python.api.tree.Expression; import org.sonar.plugins.python.api.tree.Name; import org.sonar.plugins.python.api.tree.QualifiedExpression; +import org.sonar.plugins.python.api.types.v2.FullyQualifiedNameHelper; import org.sonar.plugins.python.api.types.v2.FunctionType; import org.sonar.plugins.python.api.types.v2.PythonType; +import org.sonar.plugins.python.api.types.v2.UnknownType; import org.sonar.python.semantic.v2.types.TypeInferenceMatcher; import org.sonar.python.semantic.v2.types.TypeInferenceMatchers; import org.sonar.python.types.v2.matchers.TypePredicateContext; @@ -38,10 +40,16 @@ public QualifiedExpressionCalculator(TypePredicateContext typePredicateContext) public PythonType calculate(QualifiedExpression qualifiedExpression) { Name name = qualifiedExpression.name(); - return Optional.of(qualifiedExpression.qualifier()) - .map(Expression::typeV2) + PythonType qualifierType = qualifiedExpression.qualifier().typeV2(); + return Optional.of(qualifierType) .flatMap(t -> t.resolveMember(name.name())) .map(this::handlePropertyFunction) + .orElseGet(() -> unresolvedMemberType(qualifierType, name.name())); + } + + private static PythonType unresolvedMemberType(PythonType qualifierType, String memberName) { + return FullyQualifiedNameHelper.getFullyQualifiedName(qualifierType) + .map(qualifierFqn -> (PythonType) new UnknownType.UnresolvedImportType(qualifierFqn + "." + memberName)) .orElse(PythonType.UNKNOWN); } diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/TypeInferenceV2Test.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/TypeInferenceV2Test.java index af6bb598c..e24c21254 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/TypeInferenceV2Test.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/TypeInferenceV2Test.java @@ -4041,8 +4041,10 @@ void reexportedWildcardImport() { var actualFoo = tupleExpr.elements().get(1); assertThat(importedFoo.typeV2()) - .isEqualTo(PythonType.UNKNOWN) + .isInstanceOf(UnknownType.UnresolvedImportType.class) .isNotEqualTo(actualFoo.typeV2()); + assertThat(((UnknownType.UnresolvedImportType) importedFoo.typeV2()).importPath()) + .isEqualTo("mod2.foo"); } @Test diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/types/typecalculator/QualifiedExpressionCalculatorTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/types/typecalculator/QualifiedExpressionCalculatorTest.java index 4a6d877cc..9a68d5012 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/types/typecalculator/QualifiedExpressionCalculatorTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/types/typecalculator/QualifiedExpressionCalculatorTest.java @@ -22,6 +22,7 @@ import org.sonar.plugins.python.api.tree.Tree; import org.sonar.plugins.python.api.types.v2.FunctionType; import org.sonar.plugins.python.api.types.v2.PythonType; +import org.sonar.plugins.python.api.types.v2.UnknownType; import org.sonar.python.PythonTestUtils; import org.sonar.python.types.v2.matchers.TypePredicateContext; @@ -114,6 +115,21 @@ class A: assertThat(result).isEqualTo(PythonType.UNKNOWN); } + @Test + void calculate_unknownMemberOnKnownModule_returnsUnresolvedImportType() { + FileInput fileInput = parseAndInferTypes(""" + import os + os.nonexistent_member + """); + + var qualifiedExpression = getQualifiedExpressionFromStatement(fileInput); + PythonType result = calculator.calculate(qualifiedExpression); + + assertThat(result).isInstanceOf(UnknownType.UnresolvedImportType.class); + var unresolvedType = (UnknownType.UnresolvedImportType) result; + assertThat(unresolvedType.importPath()).isEqualTo("os.nonexistent_member"); + } + private static QualifiedExpression getQualifiedExpressionFromStatement(FileInput fileInput) { return PythonTestUtils.getLastDescendant(fileInput, t -> t.is(Tree.Kind.QUALIFIED_EXPR)); } From b31a132f3f59f00b9fe6732e22d0b4fd816f48b3 Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Mon, 23 Mar 2026 16:46:57 +0100 Subject: [PATCH 039/322] SONARPY-3932 Migrated 5 rules to typeV2 (#973) GitOrigin-RevId: 3cd5167203c1642d632a0b70f78114750623c6e0 --- .../CollectionLengthComparisonCheck.java | 18 ++++---- .../checks/NumpyWhereOneConditionCheck.java | 19 ++++---- .../StrftimeConfusingHourSystemCheck.java | 11 ++--- ...imezoneNaiveDatetimeConstructorsCheck.java | 24 +++++------ ...hAutogradVariableShouldNotBeUsedCheck.java | 9 ++-- ...datetime_constructor_use_timezone_aware.py | 42 ++++++++++++------ .../resources/checks/torchAutogradVariable.py | 43 ++++++++++++------- .../v2/types/TrivialTypeInferenceVisitor.java | 1 + .../QualifiedExpressionCalculatorTest.java | 16 +++++++ 9 files changed, 110 insertions(+), 73 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/CollectionLengthComparisonCheck.java b/python-checks/src/main/java/org/sonar/python/checks/CollectionLengthComparisonCheck.java index 96e8380d5..8c4e0fda7 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/CollectionLengthComparisonCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/CollectionLengthComparisonCheck.java @@ -20,19 +20,23 @@ import java.util.EnumSet; import org.sonar.check.Rule; import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; import org.sonar.plugins.python.api.tree.BinaryExpression; import org.sonar.plugins.python.api.tree.CallExpression; import org.sonar.plugins.python.api.tree.Expression; import org.sonar.plugins.python.api.tree.NumericLiteral; import org.sonar.plugins.python.api.tree.Tree.Kind; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; import org.sonar.python.api.PythonPunctuator; -import org.sonar.plugins.python.api.symbols.Symbol; import static org.sonar.python.checks.utils.Expressions.removeParentheses; @Rule(key = "S3981") public class CollectionLengthComparisonCheck extends PythonSubscriptionCheck { + private static final TypeMatcher LEN_MATCHER = TypeMatchers.isType("len"); + private static final EnumSet INVALID_OPERATORS = EnumSet.of(PythonPunctuator.LT, PythonPunctuator.GT_EQU); @@ -46,8 +50,8 @@ public void initialize(Context context) { Expression left = removeParentheses(comparison.leftOperand()); Expression right = removeParentheses(comparison.rightOperand()); TokenType operator = comparison.operator().type(); - if ((isCallToLen(left) && isZero(right) && INVALID_OPERATORS.contains(operator)) - || (isCallToLen(right) && isZero(left) && INVALID_REVERSE_OPERATORS.contains(operator))) { + if ((isCallToLen(left, ctx) && isZero(right) && INVALID_OPERATORS.contains(operator)) + || (isCallToLen(right, ctx) && isZero(left) && INVALID_REVERSE_OPERATORS.contains(operator))) { ctx.addIssue(comparison, "The length of a collection is always \">=0\", so update this test to either \"==0\" or \">0\"."); } }); @@ -57,12 +61,8 @@ private static boolean isZero(Expression expression) { return expression.is(Kind.NUMERIC_LITERAL) && "0".equals(((NumericLiteral) expression).valueAsString()); } - private static boolean isCallToLen(Expression expression) { - if (expression.is(Kind.CALL_EXPR)) { - Symbol calleeSymbol = ((CallExpression) expression).calleeSymbol(); - return calleeSymbol != null && "len".equals(calleeSymbol.fullyQualifiedName()); - } - return false; + private static boolean isCallToLen(Expression expression, SubscriptionContext ctx) { + return expression.is(Kind.CALL_EXPR) && LEN_MATCHER.isTrueFor(((CallExpression) expression).callee(), ctx); } diff --git a/python-checks/src/main/java/org/sonar/python/checks/NumpyWhereOneConditionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/NumpyWhereOneConditionCheck.java index 1302e8e6c..6dd9e99ce 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/NumpyWhereOneConditionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/NumpyWhereOneConditionCheck.java @@ -22,19 +22,22 @@ import org.sonar.plugins.python.api.PythonSubscriptionCheck; import org.sonar.plugins.python.api.SubscriptionContext; import org.sonar.plugins.python.api.quickfix.PythonQuickFix; -import org.sonar.plugins.python.api.symbols.Symbol; import org.sonar.plugins.python.api.tree.Argument; import org.sonar.plugins.python.api.tree.CallExpression; import org.sonar.plugins.python.api.tree.Name; import org.sonar.plugins.python.api.tree.QualifiedExpression; import org.sonar.plugins.python.api.tree.RegularArgument; import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; import org.sonar.python.quickfix.TextEditUtils; @Rule(key = "S6729") public class NumpyWhereOneConditionCheck extends PythonSubscriptionCheck { private static final String MESSAGE = "Use \"np.nonzero\" when only the condition parameter is provided to \"np.where\"."; + // numpy.where has no stubs, so the type resolves as UnresolvedImportType. Use withFQN to match on the FQN directly. + private static final TypeMatcher NUMPY_WHERE = TypeMatchers.withFQN("numpy.where"); @Override public void initialize(Context context) { @@ -43,15 +46,11 @@ public void initialize(Context context) { private static void checkNumpyWhereCall(SubscriptionContext ctx) { CallExpression ce = (CallExpression) ctx.syntaxNode(); - Symbol symbol = ce.calleeSymbol(); - Optional.ofNullable(symbol) - .map(Symbol::fullyQualifiedName) - .filter("numpy.where"::equals) - .filter(fqn -> hasOneParameter(ce)) - .ifPresent(fqn -> { - PreciseIssue issue = ctx.addIssue(ce, MESSAGE); - addQuickFix(ce, issue); - }); + if (!NUMPY_WHERE.isTrueFor(ce.callee(), ctx) || !hasOneParameter(ce)) { + return; + } + PreciseIssue issue = ctx.addIssue(ce, MESSAGE); + addQuickFix(ce, issue); } private static void addQuickFix(CallExpression ce, PreciseIssue issue) { diff --git a/python-checks/src/main/java/org/sonar/python/checks/StrftimeConfusingHourSystemCheck.java b/python-checks/src/main/java/org/sonar/python/checks/StrftimeConfusingHourSystemCheck.java index 665a3d5dc..b31f23582 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/StrftimeConfusingHourSystemCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/StrftimeConfusingHourSystemCheck.java @@ -19,12 +19,13 @@ import org.sonar.check.Rule; import org.sonar.plugins.python.api.PythonSubscriptionCheck; import org.sonar.plugins.python.api.SubscriptionContext; -import org.sonar.plugins.python.api.symbols.Symbol; import org.sonar.plugins.python.api.tree.CallExpression; import org.sonar.plugins.python.api.tree.Expression; import org.sonar.plugins.python.api.tree.RegularArgument; import org.sonar.plugins.python.api.tree.StringLiteral; import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; import org.sonar.python.checks.utils.Expressions; import org.sonar.python.tree.TreeUtils; @@ -34,6 +35,7 @@ public class StrftimeConfusingHourSystemCheck extends PythonSubscriptionCheck { public static final String MESSAGE = "Use %I (12-hour clock) or %H (24-hour clock) without %p (AM/PM)."; public static final String MESSAGE_12_HOURS = "Use %I (12-hour clock) with %p (AM/PM)."; private static final String MESSAGE_SECONDARY_LOCATION = "Wrong format created here."; + private static final TypeMatcher STRFTIME_MATCHER = TypeMatchers.isType("datetime.time.strftime"); @Override public void initialize(Context context) { @@ -70,12 +72,7 @@ private static void checkDateFormatStringLiteral(SubscriptionContext context, Tr private static void checkCallExpr(SubscriptionContext context) { CallExpression callExpression = (CallExpression) context.syntaxNode(); - Symbol calleeSymbol = callExpression.calleeSymbol(); - if (calleeSymbol == null) { - return; - } - String fullyQualifiedName = calleeSymbol.fullyQualifiedName(); - if (!"datetime.time.strftime".equals(fullyQualifiedName)) { + if (!STRFTIME_MATCHER.isTrueFor(callExpression.callee(), context)) { return; } diff --git a/python-checks/src/main/java/org/sonar/python/checks/TimezoneNaiveDatetimeConstructorsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/TimezoneNaiveDatetimeConstructorsCheck.java index 1bb28be3e..9ad1054c1 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/TimezoneNaiveDatetimeConstructorsCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/TimezoneNaiveDatetimeConstructorsCheck.java @@ -16,18 +16,22 @@ */ package org.sonar.python.checks; -import java.util.Set; +import java.util.Optional; import org.sonar.check.Rule; import org.sonar.plugins.python.api.PythonSubscriptionCheck; import org.sonar.plugins.python.api.SubscriptionContext; -import org.sonar.plugins.python.api.symbols.Symbol; import org.sonar.plugins.python.api.tree.CallExpression; import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.FullyQualifiedNameHelper; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; @Rule(key = "S6903") public class TimezoneNaiveDatetimeConstructorsCheck extends PythonSubscriptionCheck { private static final String MESSAGE = "Don't use `%s` to create this datetime object."; - private static final Set NON_COMPLIANT_FQNS = Set.of("datetime.datetime.utcnow", "datetime.datetime.utcfromtimestamp"); + private static final TypeMatcher NON_COMPLIANT_MATCHER = TypeMatchers.any( + TypeMatchers.isType("datetime.datetime.utcnow"), + TypeMatchers.isType("datetime.datetime.utcfromtimestamp")); @Override public void initialize(Context context) { @@ -36,15 +40,9 @@ public void initialize(Context context) { private static void checkCallExpr(SubscriptionContext context) { CallExpression callExpression = (CallExpression) context.syntaxNode(); - Symbol calleeSymbol = callExpression.calleeSymbol(); - - if (calleeSymbol == null) { - return; - } - String fullyQualifiedName = calleeSymbol.fullyQualifiedName(); - if (fullyQualifiedName == null || !NON_COMPLIANT_FQNS.contains(fullyQualifiedName)) { - return; - } - context.addIssue(callExpression, String.format(MESSAGE, fullyQualifiedName)); + Optional.of(callExpression.callee()) + .filter(callee -> NON_COMPLIANT_MATCHER.isTrueFor(callee, context)) + .flatMap(callee -> FullyQualifiedNameHelper.getFullyQualifiedName(callee.typeV2())) + .ifPresent(fqn -> context.addIssue(callExpression.callee(), String.format(MESSAGE, fqn))); } } diff --git a/python-checks/src/main/java/org/sonar/python/checks/TorchAutogradVariableShouldNotBeUsedCheck.java b/python-checks/src/main/java/org/sonar/python/checks/TorchAutogradVariableShouldNotBeUsedCheck.java index e2fdec94d..d4691a46b 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/TorchAutogradVariableShouldNotBeUsedCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/TorchAutogradVariableShouldNotBeUsedCheck.java @@ -18,21 +18,22 @@ import org.sonar.check.Rule; import org.sonar.plugins.python.api.PythonSubscriptionCheck; -import org.sonar.plugins.python.api.symbols.Symbol; import org.sonar.plugins.python.api.tree.CallExpression; import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; @Rule(key = "S6979") public class TorchAutogradVariableShouldNotBeUsedCheck extends PythonSubscriptionCheck { private static final String MESSAGE = "Replace this call with a call to \"torch.tensor\"."; - private static final String TORCH_AUTOGRAD_VARIABLE = "torch.autograd.Variable"; + // torch.autograd.Variable has no stubs, so the type resolves as UnresolvedImportType. Use withFQN to match on the FQN directly. + private static final TypeMatcher TORCH_AUTOGRAD_VARIABLE = TypeMatchers.withFQN("torch.autograd.Variable"); @Override public void initialize(Context context) { context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, ctx -> { CallExpression callExpression = (CallExpression) ctx.syntaxNode(); - Symbol calleeSymbol = callExpression.calleeSymbol(); - if (calleeSymbol != null && TORCH_AUTOGRAD_VARIABLE.equals(calleeSymbol.fullyQualifiedName())) { + if (TORCH_AUTOGRAD_VARIABLE.isTrueFor(callExpression.callee(), ctx)) { ctx.addIssue(callExpression.callee(), MESSAGE); } }); diff --git a/python-checks/src/test/resources/checks/datetime_constructor_use_timezone_aware.py b/python-checks/src/test/resources/checks/datetime_constructor_use_timezone_aware.py index 0062998d2..85293a653 100644 --- a/python-checks/src/test/resources/checks/datetime_constructor_use_timezone_aware.py +++ b/python-checks/src/test/resources/checks/datetime_constructor_use_timezone_aware.py @@ -1,27 +1,39 @@ def some_function(): from datetime import datetime - datetime.utcnow() # Noncompliant {{Don't use `datetime.datetime.utcnow` to create this datetime object.}} - #^^^^^^^^^^^^^^^^^ + + datetime.utcnow() # Noncompliant {{Don't use `datetime.datetime.utcnow` to create this datetime object.}} +# ^^^^^^^^^^^^^^^ timestamp = 1571595618.0 - datetime.utcfromtimestamp(timestamp) # Noncompliant {{Don't use `datetime.datetime.utcfromtimestamp` to create this datetime object.}} - #^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + datetime.utcfromtimestamp( # Noncompliant {{Don't use `datetime.datetime.utcfromtimestamp` to create this datetime object.}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^ + timestamp + ) + def other_function(): import datetime + timestamp = 1571595618.0 - datetime.datetime.utcnow() # Noncompliant - datetime.datetime.utcfromtimestamp(timestamp) # Noncompliant + datetime.datetime.utcnow() # Noncompliant + datetime.datetime.utcfromtimestamp(timestamp) # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + test = "test" + a = f"test/{datetime.datetime.utcnow().strftime('%Y-%m-%d')}/{str(test)}" # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^^^^^ from datetime import datetime as dt - dt.utcnow() # Noncompliant - dt.utcfromtimestamp(timestamp) # Noncompliant -def unknown_symbols(): + dt.utcnow() # Noncompliant + dt.utcfromtimestamp(timestamp) # Noncompliant + +def unknown_symbols(): unrelated_call() - datetime.datetime.utcnow() - datetime.datetime.utcfromtimestamp() + datetime.datetime.utcnow() # Noncompliant + datetime.datetime.utcfromtimestamp() # Noncompliant + def compliant_examples(): from datetime import datetime, timezone @@ -30,11 +42,13 @@ def compliant_examples(): timestamp = 1571595618.0 datetime.fromtimestamp(timestamp, timezone.utc) + def aliased_utcnow(): from datetime import datetime + reassigned = datetime.utcnow - # FN because we lose the FQN in the assignment - reassigned() + reassigned() # Noncompliant from datetime import datetime as aliased - aliased.utcnow() # Noncompliant + + aliased.utcnow() # Noncompliant diff --git a/python-checks/src/test/resources/checks/torchAutogradVariable.py b/python-checks/src/test/resources/checks/torchAutogradVariable.py index b98d9b394..83bd60cc0 100644 --- a/python-checks/src/test/resources/checks/torchAutogradVariable.py +++ b/python-checks/src/test/resources/checks/torchAutogradVariable.py @@ -1,40 +1,51 @@ def torch_import(): import torch - x6 = Variable(torch.tensor([15])) + x6 = Variable(torch.tensor([15])) - x = torch.autograd.Variable(torch.tensor([1.0]), requires_grad=True) # Noncompliant {{Replace this call with a call to "torch.tensor".}} - #^^^^^^^^^^^^^^^^^^^^^^^ - x2 = torch.autograd.Variable(torch.tensor([1.0])) # Noncompliant - #^^^^^^^^^^^^^^^^^^^^^^^ - - x4 = torch.autograd.Variable() # Noncompliant + x = torch.autograd.Variable( # Noncompliant {{Replace this call with a call to "torch.tensor".}} + # ^^^^^^^^^^^^^^^^^^^^^^^ + torch.tensor([1.0]), + requires_grad=True, + ) + x2 = torch.autograd.Variable(torch.tensor([1.0])) # Noncompliant + + x4 = torch.autograd.Variable() # Noncompliant # Compliant solution c_x3 = torch.tensor([1.0]) + def torch_autograd_import_as(): from torch.autograd import Variable as V - x3 = V(torch.tensor([15])) # Noncompliant - #^ - + + x3 = V(torch.tensor([15])) # Noncompliant +# ^ + + def torch_alias_import(): import torch as t - x5 = t.autograd.Variable(torch.tensor([15])) # Noncompliant + + x5 = t.autograd.Variable(torch.tensor([15])) # Noncompliant def unrelated_import(): from something.autograd import Variable - x6 = Variable(torch.tensor([15])) + + x6 = Variable(torch.tensor([15])) + def multiple_imports(): - # Resulting symbol will be ambiguous, therefore no issue is raised from something.autograd import Variable - x6 = Variable(torch.tensor([15])) + + x6 = Variable(torch.tensor([15])) from torch.autograd import Variable - x6 = Variable(torch.tensor([15])) -def use_before_assignment(): x6 = Variable(torch.tensor([15])) # Noncompliant + + +def use_before_assignment(): + x6 = Variable(torch.tensor([15])) from torch.autograd import Variable + x6 = Variable(torch.tensor([15])) # Noncompliant diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/TrivialTypeInferenceVisitor.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/TrivialTypeInferenceVisitor.java index d557000b8..20c2ff6c0 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/TrivialTypeInferenceVisitor.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/TrivialTypeInferenceVisitor.java @@ -192,6 +192,7 @@ public void visitFileInput(FileInput fileInput) { @Override public void visitStringLiteral(StringLiteral stringLiteral) { + super.visitStringLiteral(stringLiteral); var builtins = this.projectLevelTypeTable.getBuiltinsModule(); // TODO: SONARPY-1867 multiple object types to represent str instance? if (((StringLiteralImpl) stringLiteral).isTemplate()) { diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/types/typecalculator/QualifiedExpressionCalculatorTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/types/typecalculator/QualifiedExpressionCalculatorTest.java index 9a68d5012..0a6df8f9d 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/types/typecalculator/QualifiedExpressionCalculatorTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/types/typecalculator/QualifiedExpressionCalculatorTest.java @@ -115,6 +115,22 @@ class A: assertThat(result).isEqualTo(PythonType.UNKNOWN); } + @Test + void calculate_nonExistentMemberOnClass_returnsUnresolvedImportType() { + FileInput fileInput = parseAndInferTypes(""" + class A: + pass + A.non_existent + """); + + var qualifiedExpression = getQualifiedExpressionFromStatement(fileInput); + PythonType result = calculator.calculate(qualifiedExpression); + + assertThat(result).isInstanceOf(UnknownType.UnresolvedImportType.class); + var unresolvedType = (UnknownType.UnresolvedImportType) result; + assertThat(unresolvedType.importPath()).isEqualTo("my_package.mod.A.non_existent"); + } + @Test void calculate_unknownMemberOnKnownModule_returnsUnresolvedImportType() { FileInput fileInput = parseAndInferTypes(""" From f21a39db687090b0124b3d70dd6d61070cb135d7 Mon Sep 17 00:00:00 2001 From: "sonar-nigel[bot]" <247337653+sonar-nigel[bot]@users.noreply.github.com> Date: Tue, 24 Mar 2026 13:07:29 +0000 Subject: [PATCH 040/322] SONARPY-3563 Fix S100 false positives on unittest/Django test lifecycle methods (#988) Co-authored-by: Vibe Bot GitOrigin-RevId: 011d31e86ca30961048c71bad5676aaf336c1c1b --- .../sonar/python/checks/MethodNameCheck.java | 7 +++- .../sonar/python/checks/utils/CheckUtils.java | 5 ++- .../src/test/resources/checks/methodName.py | 38 +++++++++++++++++++ 3 files changed, 48 insertions(+), 2 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/MethodNameCheck.java b/python-checks/src/main/java/org/sonar/python/checks/MethodNameCheck.java index a0c7f1cd1..a48f345b3 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/MethodNameCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/MethodNameCheck.java @@ -16,6 +16,7 @@ */ package org.sonar.python.checks; +import java.util.Set; import org.sonar.check.Rule; import org.sonar.plugins.python.api.tree.FunctionDef; @@ -26,6 +27,8 @@ public class MethodNameCheck extends AbstractFunctionNameCheck { public static final String CHECK_KEY = "S100"; + private static final Set WHITELIST = Set.of("setUp", "tearDown", "setUpClass", "tearDownClass", "setUpTestData"); + @Override public String typeName() { return "method"; @@ -33,6 +36,8 @@ public String typeName() { @Override public boolean shouldCheckFunctionDeclaration(FunctionDef pyFunctionDefTree) { - return pyFunctionDefTree.isMethodDefinition() && !classHasInheritance(getParentClassDef(pyFunctionDefTree)); + return pyFunctionDefTree.isMethodDefinition() + && !classHasInheritance(getParentClassDef(pyFunctionDefTree)) + && !WHITELIST.contains(pyFunctionDefTree.name().name()); } } diff --git a/python-checks/src/main/java/org/sonar/python/checks/utils/CheckUtils.java b/python-checks/src/main/java/org/sonar/python/checks/utils/CheckUtils.java index f09c3f007..968bad196 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/utils/CheckUtils.java +++ b/python-checks/src/main/java/org/sonar/python/checks/utils/CheckUtils.java @@ -105,7 +105,10 @@ public static ClassDef getParentClassDef(Tree tree) { return null; } - public static boolean classHasInheritance(ClassDef classDef) { + public static boolean classHasInheritance(@Nullable ClassDef classDef) { + if (classDef == null) { + return false; + } ArgList argList = classDef.args(); if (argList == null) { return false; diff --git a/python-checks/src/test/resources/checks/methodName.py b/python-checks/src/test/resources/checks/methodName.py index 40ec5eaa9..3551cc596 100644 --- a/python-checks/src/test/resources/checks/methodName.py +++ b/python-checks/src/test/resources/checks/methodName.py @@ -56,3 +56,41 @@ def y(self): # OK def _v(self): ... + +class TestMixin: + @classmethod + def setUpTestData(cls): + pass + + def setUp(self): + pass + + def tearDown(self): + pass + + @classmethod + def setUpClass(cls): + pass + + @classmethod + def tearDownClass(cls): + pass + +class TestMixinWithObjectBase(object): + def setUp(self): # OK, whitelisted lifecycle method even in class inheriting from object + pass + + def tearDown(self): # OK, whitelisted lifecycle method + pass + + @classmethod + def setUpClass(cls): # OK, whitelisted lifecycle method + pass + + @classmethod + def tearDownClass(cls): # OK, whitelisted lifecycle method + pass + + @classmethod + def setUpTestData(cls): # OK, whitelisted lifecycle method + pass From 68ecb389bf84af9739232d8cc05af246ee4c662f Mon Sep 17 00:00:00 2001 From: "sonar-nigel[bot]" <247337653+sonar-nigel[bot]@users.noreply.github.com> Date: Tue, 24 Mar 2026 13:11:59 +0000 Subject: [PATCH 041/322] SONARPY-3030 Fix S6546 false positive for union types inside typing.Annotated (#1002) Co-authored-by: Vibe Bot GitOrigin-RevId: cbb9c9f4c9648b2e541e997c467235569a1f7301 --- .../python/checks/UnionTypeExpressionCheck.java | 15 +++++++-------- .../test/resources/checks/unionTypeExpression.py | 15 ++++++++++++--- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/UnionTypeExpressionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/UnionTypeExpressionCheck.java index bde31892a..aedcac6cd 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/UnionTypeExpressionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/UnionTypeExpressionCheck.java @@ -16,6 +16,7 @@ */ package org.sonar.python.checks; +import java.util.function.Predicate; import org.sonar.check.Rule; import org.sonar.plugins.python.api.PythonSubscriptionCheck; import org.sonar.plugins.python.api.PythonVersionUtils; @@ -23,13 +24,15 @@ import org.sonar.plugins.python.api.tree.Expression; import org.sonar.plugins.python.api.tree.Tree; import org.sonar.plugins.python.api.tree.TypeAnnotation; -import org.sonar.plugins.python.api.types.InferredType; -import org.sonar.python.types.InferredTypes; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.tree.TreeUtils; @Rule(key = "S6546") public class UnionTypeExpressionCheck extends PythonSubscriptionCheck { private static final String MESSAGE = "Use a union type expression for this type hint."; + private static final TypeMatcher TYPING_UNION_MATCHER = TypeMatchers.isType("typing.Union"); @Override public void initialize(Context context) { @@ -45,13 +48,9 @@ private static void checkTypeAnnotation(SubscriptionContext ctx) { TypeAnnotation typeAnnotation = (TypeAnnotation) ctx.syntaxNode(); Expression expression = typeAnnotation.expression(); - if (expression.is(Tree.Kind.BITWISE_OR)) { - return; - } - InferredType type = InferredTypes.fromTypeAnnotation(typeAnnotation); - String fqn = InferredTypes.fullyQualifiedTypeName(type); - if ("typing.Union".equals(fqn)) { + Predicate isUnionName = n -> n.is(Tree.Kind.NAME) && TYPING_UNION_MATCHER.isTrueFor((Expression) n, ctx); + if (isUnionName.test(expression) || TreeUtils.hasDescendant(expression, isUnionName)) { ctx.addIssue(expression, MESSAGE); } } diff --git a/python-checks/src/test/resources/checks/unionTypeExpression.py b/python-checks/src/test/resources/checks/unionTypeExpression.py index 8085c6935..fe617cda0 100644 --- a/python-checks/src/test/resources/checks/unionTypeExpression.py +++ b/python-checks/src/test/resources/checks/unionTypeExpression.py @@ -1,4 +1,4 @@ -from typing import Union +from typing import Annotated, Union from typing import Union as u import typing import typing as t @@ -40,8 +40,7 @@ def instance_method() -> Union[int, str]: # Noncompliant pass -# There is no clear recommendation on this case, so we will just not handle them for the time being. -def union_in_generic_type() -> list[Union[int, str]]: # FN +def union_in_generic_type() -> list[Union[int, str]]: # Noncompliant pass def ok(param: int | str) -> int | str: @@ -66,3 +65,13 @@ def unknown_return_type() -> unknown: def unknown_return_type_subscript() -> unknown[int, str]: pass + +variable: Annotated[int | str, "metadata"] + +top_level: Annotated[float | bytes, "info"] + +def annotated_param(value: Annotated[int | str, "description"]) -> None: + pass + +def annotated_return() -> Annotated[int | str, "result"]: + return 42 From 551b34f53acb3b0792f1239b24d337d3bb603992 Mon Sep 17 00:00:00 2001 From: "sonar-nigel[bot]" <247337653+sonar-nigel[bot]@users.noreply.github.com> Date: Tue, 24 Mar 2026 14:44:45 +0100 Subject: [PATCH 042/322] SONARPY-1806 Fix false positive in S6730 when using np.bool (SONARPY-1806) (#983) Co-authored-by: Vibe Bot GitOrigin-RevId: 051c750045a94da4a13324b89eba55d9d2ea1c3a --- .../checks/DeprecatedNumpyTypesCheck.java | 38 ++++++++++--------- .../checks/DeprecatedNumpyTypesCheckTest.java | 1 - .../checks/deprecatedNumpyTypesCheck.py | 15 ++++++-- 3 files changed, 32 insertions(+), 22 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/DeprecatedNumpyTypesCheck.java b/python-checks/src/main/java/org/sonar/python/checks/DeprecatedNumpyTypesCheck.java index d08041d29..41c2383a0 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/DeprecatedNumpyTypesCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/DeprecatedNumpyTypesCheck.java @@ -16,15 +16,15 @@ */ package org.sonar.python.checks; -import java.util.Map; -import java.util.Optional; +import java.util.List; import org.sonar.check.Rule; import org.sonar.plugins.python.api.PythonSubscriptionCheck; import org.sonar.plugins.python.api.SubscriptionContext; import org.sonar.plugins.python.api.quickfix.PythonQuickFix; -import org.sonar.plugins.python.api.symbols.Symbol; import org.sonar.plugins.python.api.tree.QualifiedExpression; import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; import org.sonar.python.quickfix.TextEditUtils; @Rule(key = "S6730") @@ -32,15 +32,17 @@ public class DeprecatedNumpyTypesCheck extends PythonSubscriptionCheck { private static final String MESSAGE = "Replace this deprecated \"numpy\" type alias with the builtin type \"%s\"."; private static final String QUICK_FIX_MESSAGE = "Replace with %s."; - private static final Map TYPE_TO_CHECK = Map.of( - "numpy.bool", "bool", - "numpy.int", "int", - "numpy.float", "float", - "numpy.complex", "complex", - "numpy.object", "object", - "numpy.str", "str", - "numpy.long", "int", - "numpy.unicode", "str"); + + private record DeprecatedType(TypeMatcher matcher, String replacement) {} + + private static final List DEPRECATED_TYPES = List.of( + new DeprecatedType(TypeMatchers.withFQN("numpy.int"), "int"), + new DeprecatedType(TypeMatchers.withFQN("numpy.float"), "float"), + new DeprecatedType(TypeMatchers.withFQN("numpy.complex"), "complex"), + new DeprecatedType(TypeMatchers.withFQN("numpy.object"), "object"), + new DeprecatedType(TypeMatchers.withFQN("numpy.str"), "str"), + new DeprecatedType(TypeMatchers.withFQN("numpy.long"), "int"), + new DeprecatedType(TypeMatchers.withFQN("numpy.unicode"), "str")); @Override public void initialize(Context context) { @@ -50,13 +52,15 @@ public void initialize(Context context) { private static void checkForDeprecatedTypesNames(SubscriptionContext ctx) { QualifiedExpression expression = (QualifiedExpression) ctx.syntaxNode(); - Optional.ofNullable(expression.symbol()) - .map(Symbol::fullyQualifiedName) - .map(TYPE_TO_CHECK::get) - .ifPresent(type -> raiseIssue(expression, type, ctx)); + for (DeprecatedType deprecatedType : DEPRECATED_TYPES) { + if (deprecatedType.matcher().isTrueFor(expression, ctx)) { + raiseIssue(expression, deprecatedType.replacement(), ctx); + return; + } + } } - private static void raiseIssue(Tree expression, String replacementType, SubscriptionContext ctx) { + private static void raiseIssue(QualifiedExpression expression, String replacementType, SubscriptionContext ctx) { PreciseIssue issue = ctx.addIssue(expression, String.format(MESSAGE, replacementType)); PythonQuickFix quickFix = PythonQuickFix.newQuickFix( String.format(QUICK_FIX_MESSAGE, replacementType), diff --git a/python-checks/src/test/java/org/sonar/python/checks/DeprecatedNumpyTypesCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/DeprecatedNumpyTypesCheckTest.java index 5aeb49ef8..8c42d8e30 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/DeprecatedNumpyTypesCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/DeprecatedNumpyTypesCheckTest.java @@ -55,7 +55,6 @@ def foo(): private static Stream numpyTypeProvider(){ return Stream.of( - Arguments.of("np.bool", "(True)", "bool"), Arguments.of("np.int", "(42)", "int"), Arguments.of("np.float", "(4.2)", "float"), Arguments.of("np.complex", "(-2.0, -1.2)", "complex"), diff --git a/python-checks/src/test/resources/checks/deprecatedNumpyTypesCheck.py b/python-checks/src/test/resources/checks/deprecatedNumpyTypesCheck.py index ecf6045fc..6cee37742 100644 --- a/python-checks/src/test/resources/checks/deprecatedNumpyTypesCheck.py +++ b/python-checks/src/test/resources/checks/deprecatedNumpyTypesCheck.py @@ -2,8 +2,6 @@ def failure(): - b = np.bool(True) # Noncompliant {{Replace this deprecated "numpy" type alias with the builtin type "bool".}} - # ^^^^^^^ i = np.int(42) # Noncompliant {{Replace this deprecated "numpy" type alias with the builtin type "int".}} # ^^^^^^ f = np.float(4.2) # Noncompliant {{Replace this deprecated "numpy" type alias with the builtin type "float".}} @@ -21,8 +19,6 @@ def failure(): def failure_import_as_z(): import numpy as z - b = z.bool(True) # Noncompliant - # ^^^^^^ i = z.int(42) # Noncompliant # ^^^^^ f = z.float(4.2) # Noncompliant @@ -39,6 +35,8 @@ def failure_import_as_z(): # ^^^^^^^^^ def success(): + b = np.bool(True) + b = np.bool(False) b = True # Compliant b = bool(True) # Compliant i = 42 # Compliant @@ -54,3 +52,12 @@ def success(): u = "bar" # Compliant u = str("bar") # Compliant +def success_np_bool_usages(): + # np.bool is no longer deprecated (reintroduced in NumPy 2.x) + arr = np.zeros(2).astype(np.bool) + mask = np.ones((3, 4), dtype=np.bool) + empty = np.zeros_like(arr, dtype=np.bool) + if arr.dtype == np.bool: + pass + dtype = np.bool + From 1b51ea1503b0da6f22c6db6ef2e2aaa52171f596 Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Tue, 24 Mar 2026 15:10:57 +0100 Subject: [PATCH 043/322] SONARPY-3968 Removed unused import (#1006) Co-authored-by: Sonar Vibe Bot GitOrigin-RevId: aef7aaef429693dcb342830428144ec5e09ad021 --- .../v2/types/typecalculator/QualifiedExpressionCalculator.java | 1 - 1 file changed, 1 deletion(-) diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/typecalculator/QualifiedExpressionCalculator.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/typecalculator/QualifiedExpressionCalculator.java index 6cc124ba7..618b0b214 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/typecalculator/QualifiedExpressionCalculator.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/typecalculator/QualifiedExpressionCalculator.java @@ -17,7 +17,6 @@ package org.sonar.python.semantic.v2.types.typecalculator; import java.util.Optional; -import org.sonar.plugins.python.api.tree.Expression; import org.sonar.plugins.python.api.tree.Name; import org.sonar.plugins.python.api.tree.QualifiedExpression; import org.sonar.plugins.python.api.types.v2.FullyQualifiedNameHelper; From f5bd3d52675b5fcd6271d631cdd1b29417dd5362 Mon Sep 17 00:00:00 2001 From: Guillaume Dequenne Date: Wed, 25 Mar 2026 14:33:17 +0100 Subject: [PATCH 044/322] SONARPY-3948 Agentic AI Quality Profiles for Python (#990) GitOrigin-RevId: 7a5b5a8e74e4442c60394341f3f77a1a5e0231af --- .../python/checks/OpenSourceCheckList.java | 1 + .../py/rules/python/AI_quality_profile.json | 298 ++++++++++++++++++ .../checks/OpenSourceCheckListTest.java | 6 +- .../plugins/python/AIQualityProfile.java | 50 +++ .../plugins/python/IPynbAIQualityProfile.java | 50 +++ .../plugins/python/PythonExtensions.java | 2 + .../OpenSourceRepositoryInfoProvider.java | 20 ++ .../editions/RepositoryInfoProvider.java | 2 + .../plugins/python/AIQualityProfileTest.java | 42 +++ .../python/IPynbAIQualityProfileTest.java | 46 +++ .../plugins/python/PythonExtensionsTest.java | 4 +- 11 files changed, 516 insertions(+), 5 deletions(-) create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/AI_quality_profile.json create mode 100644 python-commons/src/main/java/org/sonar/plugins/python/AIQualityProfile.java create mode 100644 python-commons/src/main/java/org/sonar/plugins/python/IPynbAIQualityProfile.java create mode 100644 python-commons/src/test/java/org/sonar/plugins/python/AIQualityProfileTest.java create mode 100644 python-commons/src/test/java/org/sonar/plugins/python/IPynbAIQualityProfileTest.java diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 8a27548ad..9ff1e47fe 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -111,6 +111,7 @@ public class OpenSourceCheckList { public static final String RESOURCE_FOLDER = "org/sonar/l10n/py/rules/python"; public static final String SONAR_WAY_PROFILE_LOCATION = RESOURCE_FOLDER + "/Sonar_way_profile.json"; + public static final String AI_QUALITY_PROFILE_LOCATION = RESOURCE_FOLDER + "/AI_quality_profile.json"; public Stream> getChecks() { return Stream.of( diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/AI_quality_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/AI_quality_profile.json new file mode 100644 index 000000000..73cde111c --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/AI_quality_profile.json @@ -0,0 +1,298 @@ +{ + "name": "AI quality profile", + "ruleKeys": [ + "S100", + "S101", + "S107", + "S108", + "S112", + "S116", + "S117", + "S125", + "S905", + "S930", + "S935", + "S1045", + "S1066", + "S1134", + "S1135", + "S1143", + "S1144", + "S1172", + "S1186", + "S1192", + "S1226", + "S1244", + "S1313", + "S1481", + "S1515", + "S1542", + "S1607", + "S1656", + "S1700", + "S1716", + "S1751", + "S1763", + "S1764", + "S1854", + "S1862", + "S1871", + "S2053", + "S2068", + "S2077", + "S2092", + "S2115", + "S2159", + "S2190", + "S2201", + "S2208", + "S2245", + "S2257", + "S2275", + "S2612", + "S2638", + "S2710", + "S2711", + "S2734", + "S2737", + "S2755", + "S2757", + "S2761", + "S2772", + "S2823", + "S2836", + "S2876", + "S3329", + "S3330", + "S3358", + "S3403", + "S3457", + "S3516", + "S3626", + "S3699", + "S3752", + "S3776", + "S3923", + "S3981", + "S3984", + "S3985", + "S4143", + "S4144", + "S4423", + "S4426", + "S4433", + "S4487", + "S4502", + "S4507", + "S4790", + "S4828", + "S4830", + "S5042", + "S5122", + "S5247", + "S5332", + "S5344", + "S5361", + "S5443", + "S5445", + "S5527", + "S5542", + "S5547", + "S5549", + "S5603", + "S5607", + "S5632", + "S5642", + "S5644", + "S5655", + "S5659", + "S5704", + "S5706", + "S5707", + "S5708", + "S5709", + "S5712", + "S5714", + "S5717", + "S5719", + "S5720", + "S5722", + "S5727", + "S5747", + "S5754", + "S5756", + "S5780", + "S5781", + "S5795", + "S5796", + "S5797", + "S5799", + "S5806", + "S5807", + "S5828", + "S5842", + "S5843", + "S5845", + "S5850", + "S5852", + "S5855", + "S5860", + "S5864", + "S5868", + "S5869", + "S5886", + "S5890", + "S5899", + "S5905", + "S5914", + "S5915", + "S5918", + "S5994", + "S5996", + "S6001", + "S6002", + "S6019", + "S6035", + "S6243", + "S6246", + "S6249", + "S6252", + "S6262", + "S6265", + "S6270", + "S6275", + "S6281", + "S6302", + "S6303", + "S6304", + "S6308", + "S6317", + "S6319", + "S6321", + "S6323", + "S6326", + "S6327", + "S6328", + "S6329", + "S6330", + "S6331", + "S6332", + "S6333", + "S6353", + "S6377", + "S6395", + "S6396", + "S6397", + "S6418", + "S6437", + "S6463", + "S6468", + "S6537", + "S6552", + "S6553", + "S6556", + "S6559", + "S6560", + "S6659", + "S6660", + "S6662", + "S6663", + "S6709", + "S6711", + "S6714", + "S6725", + "S6727", + "S6729", + "S6730", + "S6734", + "S6741", + "S6742", + "S6779", + "S6781", + "S6785", + "S6786", + "S6792", + "S6794", + "S6795", + "S6796", + "S6799", + "S6882", + "S6887", + "S6890", + "S6894", + "S6900", + "S6903", + "S6908", + "S6911", + "S6918", + "S6919", + "S6925", + "S6928", + "S6929", + "S6971", + "S6972", + "S6973", + "S6974", + "S6978", + "S6979", + "S6982", + "S6984", + "S6985", + "S7483", + "S7484", + "S7487", + "S7488", + "S7489", + "S7490", + "S7491", + "S7492", + "S7493", + "S7494", + "S7496", + "S7497", + "S7498", + "S7499", + "S7500", + "S7501", + "S7502", + "S7503", + "S7505", + "S7506", + "S7507", + "S7508", + "S7510", + "S7514", + "S7515", + "S7516", + "S7517", + "S7608", + "S7609", + "S7613", + "S7614", + "S7617", + "S7618", + "S7619", + "S7620", + "S7621", + "S7622", + "S7625", + "S7931", + "S7942", + "S7943", + "S8371", + "S8375", + "S8385", + "S8389", + "S8392", + "S8396", + "S8400", + "S8401", + "S8405", + "S8409", + "S8410", + "S8411", + "S8413", + "S8414", + "S8415" + ] +} diff --git a/python-checks/src/test/java/org/sonar/python/checks/OpenSourceCheckListTest.java b/python-checks/src/test/java/org/sonar/python/checks/OpenSourceCheckListTest.java index 2d041e98b..8bd1b9baa 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/OpenSourceCheckListTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/OpenSourceCheckListTest.java @@ -82,7 +82,7 @@ void test() { void validate_sqKey_field_in_json() throws IOException { try (Stream fileStream = Files.find(METADATA_DIR, 1, (path, attr) -> path.toString().endsWith(".json"))) { List jsonList = fileStream - .filter(path -> !path.toString().endsWith("Sonar_way_profile.json")) + .filter(path -> !path.toString().endsWith("_profile.json")) .sorted() .toList(); @@ -108,7 +108,7 @@ void test_no_deprecated_rule_in_default_profile() throws IOException, ParseExcep List keysInDefaultProfile = getKeysInDefaultProfile(sonarWayProfilePath); Set deprecatedKeys = jsonList.stream() - .filter(path -> !path.toString().endsWith("Sonar_way_profile.json")) + .filter(path -> !path.toString().endsWith("_profile.json")) .filter(path1 -> { try { return isDeprecated(path1); @@ -135,7 +135,7 @@ void test_locally_deprecated_rules_stay_deprecated() throws IOException { List locallyDeprecatedRules = Arrays.asList("S1523", "S4721"); try (Stream fileStream = Files.find(METADATA_DIR, 1, (path, attr) -> path.toString().endsWith(".json"))) { Set deprecatedKeys = fileStream - .filter(path -> !path.toString().endsWith("Sonar_way_profile.json")) + .filter(path -> !path.toString().endsWith("_profile.json")) .filter(path1 -> { try { return isDeprecated(path1); diff --git a/python-commons/src/main/java/org/sonar/plugins/python/AIQualityProfile.java b/python-commons/src/main/java/org/sonar/plugins/python/AIQualityProfile.java new file mode 100644 index 000000000..3f4ebfc8c --- /dev/null +++ b/python-commons/src/main/java/org/sonar/plugins/python/AIQualityProfile.java @@ -0,0 +1,50 @@ +/* + * SonarQube Python Plugin + * Copyright (C) 2011-2025 SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.plugins.python; + +import org.sonar.api.server.profile.BuiltInQualityProfilesDefinition; +import org.sonar.plugins.python.editions.RepositoryInfoProvider; +import org.sonar.plugins.python.editions.RepositoryInfoProvider.RepositoryInfo; +import org.sonarsource.analyzer.commons.BuiltInQualityProfileJsonLoader; + +public class AIQualityProfile implements BuiltInQualityProfilesDefinition { + + static final String PROFILE_NAME = "AI quality profile"; + + private final RepositoryInfoProvider[] editionMetadataProviders; + + public AIQualityProfile(RepositoryInfoProvider[] editionMetadataProviders) { + this.editionMetadataProviders = editionMetadataProviders; + } + + @Override + public void define(Context context) { + NewBuiltInQualityProfile profile = context.createBuiltInQualityProfile(PROFILE_NAME, Python.KEY); + + for (RepositoryInfoProvider repositoryInfoProvider : editionMetadataProviders) { + registerRulesForEdition(repositoryInfoProvider, profile); + } + + profile.done(); + } + + private static void registerRulesForEdition(RepositoryInfoProvider repositoryInfoProvider, NewBuiltInQualityProfile profile) { + RepositoryInfo repositoryInfo = repositoryInfoProvider.getAIProfileInfo(); + BuiltInQualityProfileJsonLoader.load(profile, repositoryInfo.repositoryKey(), repositoryInfo.profileLocation()); + profile.activeRules().removeIf(rule -> repositoryInfo.disabledRules().contains(rule.ruleKey())); + } +} diff --git a/python-commons/src/main/java/org/sonar/plugins/python/IPynbAIQualityProfile.java b/python-commons/src/main/java/org/sonar/plugins/python/IPynbAIQualityProfile.java new file mode 100644 index 000000000..3f5d951a3 --- /dev/null +++ b/python-commons/src/main/java/org/sonar/plugins/python/IPynbAIQualityProfile.java @@ -0,0 +1,50 @@ +/* + * SonarQube Python Plugin + * Copyright (C) 2011-2025 SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.plugins.python; + +import org.sonar.api.server.profile.BuiltInQualityProfilesDefinition; +import org.sonar.plugins.python.editions.RepositoryInfoProvider; +import org.sonar.plugins.python.editions.RepositoryInfoProvider.RepositoryInfo; +import org.sonarsource.analyzer.commons.BuiltInQualityProfileJsonLoader; + +public class IPynbAIQualityProfile implements BuiltInQualityProfilesDefinition { + + static final String PROFILE_NAME = "AI quality profile"; + + private final RepositoryInfoProvider[] editionMetadataProviders; + + public IPynbAIQualityProfile(RepositoryInfoProvider[] editionMetadataProviders) { + this.editionMetadataProviders = editionMetadataProviders; + } + + @Override + public void define(Context context) { + NewBuiltInQualityProfile profile = context.createBuiltInQualityProfile(PROFILE_NAME, IPynb.KEY); + + for (RepositoryInfoProvider repositoryInfoProvider : editionMetadataProviders) { + registerRulesForEdition(repositoryInfoProvider, profile); + } + + profile.done(); + } + + private static void registerRulesForEdition(RepositoryInfoProvider repositoryInfoProvider, NewBuiltInQualityProfile profile) { + RepositoryInfo repositoryInfo = repositoryInfoProvider.getIPynbAIProfileInfo(); + BuiltInQualityProfileJsonLoader.load(profile, repositoryInfo.repositoryKey(), repositoryInfo.profileLocation()); + profile.activeRules().removeIf(rule -> repositoryInfo.disabledRules().contains(rule.ruleKey())); + } +} diff --git a/python-commons/src/main/java/org/sonar/plugins/python/PythonExtensions.java b/python-commons/src/main/java/org/sonar/plugins/python/PythonExtensions.java index bd67a8950..c12173c4b 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/PythonExtensions.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/PythonExtensions.java @@ -76,6 +76,7 @@ public static void addCommonExtensions(Plugin.Context context) { Python.class, PythonProfile.class, + AIQualityProfile.class, PythonSensor.class, PythonRuleRepository.class, @@ -88,6 +89,7 @@ public static void addCommonExtensions(Plugin.Context context) { IPynb.class, IPynbProfile.class, + IPynbAIQualityProfile.class, IPynbSensor.class, IPynbRuleRepository.class, OpenSourceRepositoryInfoProvider.class diff --git a/python-commons/src/main/java/org/sonar/plugins/python/editions/OpenSourceRepositoryInfoProvider.java b/python-commons/src/main/java/org/sonar/plugins/python/editions/OpenSourceRepositoryInfoProvider.java index a76b11b58..63a79c8cf 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/editions/OpenSourceRepositoryInfoProvider.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/editions/OpenSourceRepositoryInfoProvider.java @@ -41,4 +41,24 @@ public RepositoryInfo getIPynbInfo() { IPynbRuleRepository.DISABLED_RULES ); } + + @Override + public RepositoryInfo getAIProfileInfo() { + return new RepositoryInfo( + PythonRuleRepository.REPOSITORY_KEY, + OpenSourceCheckList.AI_QUALITY_PROFILE_LOCATION, + new OpenSourceCheckList().getChecks().toList(), + Set.of() + ); + } + + @Override + public RepositoryInfo getIPynbAIProfileInfo() { + return new RepositoryInfo( + IPynbRuleRepository.IPYTHON_REPOSITORY_KEY, + OpenSourceCheckList.AI_QUALITY_PROFILE_LOCATION, + new OpenSourceCheckList().getChecks().toList(), + IPynbRuleRepository.DISABLED_RULES + ); + } } diff --git a/python-commons/src/main/java/org/sonar/plugins/python/editions/RepositoryInfoProvider.java b/python-commons/src/main/java/org/sonar/plugins/python/editions/RepositoryInfoProvider.java index 378de853f..3fdcad40e 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/editions/RepositoryInfoProvider.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/editions/RepositoryInfoProvider.java @@ -30,6 +30,8 @@ public interface RepositoryInfoProvider { RepositoryInfo getInfo(); RepositoryInfo getIPynbInfo(); + RepositoryInfo getAIProfileInfo(); + RepositoryInfo getIPynbAIProfileInfo(); record RepositoryInfo(String repositoryKey, String profileLocation, List> checks, Set disabledRules) { } diff --git a/python-commons/src/test/java/org/sonar/plugins/python/AIQualityProfileTest.java b/python-commons/src/test/java/org/sonar/plugins/python/AIQualityProfileTest.java new file mode 100644 index 000000000..eee4364d5 --- /dev/null +++ b/python-commons/src/test/java/org/sonar/plugins/python/AIQualityProfileTest.java @@ -0,0 +1,42 @@ +/* + * SonarQube Python Plugin + * Copyright (C) 2011-2025 SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.plugins.python; + +import org.junit.jupiter.api.Test; +import org.sonar.api.server.profile.BuiltInQualityProfilesDefinition; +import org.sonar.api.server.profile.BuiltInQualityProfilesDefinition.BuiltInActiveRule; +import org.sonar.plugins.python.editions.OpenSourceRepositoryInfoProvider; +import org.sonar.plugins.python.editions.RepositoryInfoProvider; + +import static org.assertj.core.api.Assertions.assertThat; + +class AIQualityProfileTest { + + public BuiltInQualityProfilesDefinition.BuiltInQualityProfile getProfile() { + BuiltInQualityProfilesDefinition.Context context = new BuiltInQualityProfilesDefinition.Context(); + new AIQualityProfile(new RepositoryInfoProvider[]{new OpenSourceRepositoryInfoProvider()}).define(context); + return context.profile("py", "AI quality profile"); + } + + @Test + void profile() { + BuiltInQualityProfilesDefinition.BuiltInQualityProfile profile = getProfile(); + assertThat(profile.rules()).extracting("repoKey").containsOnly("python"); + assertThat(profile.rules()).hasSizeGreaterThan(25); + assertThat(profile.rules()).extracting(BuiltInActiveRule::ruleKey).contains("S100"); + } +} diff --git a/python-commons/src/test/java/org/sonar/plugins/python/IPynbAIQualityProfileTest.java b/python-commons/src/test/java/org/sonar/plugins/python/IPynbAIQualityProfileTest.java new file mode 100644 index 000000000..1e7e40126 --- /dev/null +++ b/python-commons/src/test/java/org/sonar/plugins/python/IPynbAIQualityProfileTest.java @@ -0,0 +1,46 @@ +/* + * SonarQube Python Plugin + * Copyright (C) 2011-2025 SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.plugins.python; + +import org.junit.jupiter.api.Test; +import org.sonar.api.server.profile.BuiltInQualityProfilesDefinition; +import org.sonar.api.server.profile.BuiltInQualityProfilesDefinition.BuiltInActiveRule; +import org.sonar.plugins.python.editions.OpenSourceRepositoryInfoProvider; +import org.sonar.plugins.python.editions.RepositoryInfoProvider; + +import static org.assertj.core.api.Assertions.assertThat; + +class IPynbAIQualityProfileTest { + + public BuiltInQualityProfilesDefinition.BuiltInQualityProfile getProfile() { + BuiltInQualityProfilesDefinition.Context context = new BuiltInQualityProfilesDefinition.Context(); + new IPynbAIQualityProfile(new RepositoryInfoProvider[]{new OpenSourceRepositoryInfoProvider()}).define(context); + return context.profile("ipynb", "AI quality profile"); + } + + @Test + void profile() { + BuiltInQualityProfilesDefinition.BuiltInQualityProfile profile = getProfile(); + assertThat(profile.rules()).extracting("repoKey").containsOnly("ipython"); + assertThat(profile.rules()).hasSizeGreaterThan(25); + assertThat(profile.rules()).extracting(BuiltInActiveRule::ruleKey).contains("S100"); + // Rules disabled for notebooks should be excluded + assertThat(profile.rules()).extracting(BuiltInActiveRule::ruleKey).doesNotContain("S905"); + assertThat(profile.rules()).extracting(BuiltInActiveRule::ruleKey).doesNotContain("S2201"); + assertThat(profile.rules()).extracting(BuiltInActiveRule::ruleKey).doesNotContain("S1481"); + } +} diff --git a/python-commons/src/test/java/org/sonar/plugins/python/PythonExtensionsTest.java b/python-commons/src/test/java/org/sonar/plugins/python/PythonExtensionsTest.java index af6e7963f..38b63085e 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/PythonExtensionsTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/PythonExtensionsTest.java @@ -43,10 +43,10 @@ class PythonExtensionsTest { void testGetExtensions() { Version v79 = Version.create(7, 9); SonarRuntime runtime = SonarRuntimeImpl.forSonarQube(v79, SonarQubeSide.SERVER, SonarEdition.DEVELOPER); - assertThat(extensions(runtime)).hasSize(43); + assertThat(extensions(runtime)).hasSize(45); assertThat(extensions(runtime)).contains(AnalysisWarningsWrapper.class); assertThat(extensions(SonarRuntimeImpl.forSonarLint(v79))) - .hasSize(23) + .hasSize(25) .contains(SonarLintCache.class); } From a4f7669b133e964387d2a0c2197e41708ec7245c Mon Sep 17 00:00:00 2001 From: Thomas Serre <118730793+thomas-serre-sonarsource@users.noreply.github.com> Date: Wed, 25 Mar 2026 16:40:11 +0100 Subject: [PATCH 045/322] SONARPY-3956 Optimize CI to reduce Repox bandwidth for sonar-python-enterprise (#1000) GitOrigin-RevId: fbdb629a17b4343a44941912a22e53d1c53e78d1 --- .github/actions/setup-orchestrator-cache/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/setup-orchestrator-cache/action.yml b/.github/actions/setup-orchestrator-cache/action.yml index b937f3e77..f578a3413 100644 --- a/.github/actions/setup-orchestrator-cache/action.yml +++ b/.github/actions/setup-orchestrator-cache/action.yml @@ -20,7 +20,7 @@ runs: echo "cache-key=${CACHE_KEY}" >> $GITHUB_OUTPUT - name: Setup orchestrator cache - uses: SonarSource/ci-github-actions/cache@v1 + uses: SonarSource/gh-action_cache@v1 with: path: "~/.sonar/orchestrator/" key: "${{ steps.set-paths.outputs.cache-key }}" From 9e640393e9cd8faf3b8dc8411e88ad683dc038a9 Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Thu, 26 Mar 2026 10:49:57 +0100 Subject: [PATCH 046/322] SONARPY-3949 Migrated rule S2115, S5828, S6727, S6882, S6887 to typeV2 (#991) GitOrigin-RevId: 712dcaf53f7ce55d7259650cf0efe27b5d7cf5b6 --- .../python/checks/DbNoPasswordCheck.java | 42 ++++--- ...ectParameterDatetimeConstructorsCheck.java | 17 +-- .../python/checks/InvalidOpenModeCheck.java | 7 +- .../python/checks/IsCloseAbsTolCheck.java | 7 +- ...ytzTimeZoneInDatetimeConstructorCheck.java | 14 +-- .../custom_protobuf/pg.connection.protobuf | 20 +++ .../types/custom_protobuf/pg.db.protobuf | 45 +++++++ .../python/types/custom_protobuf/pg.protobuf | 89 ++++++++++++++ .../importlib_metadata._adapters.protobuf | Bin 0 -> 1457 bytes .../importlib_metadata._collections.protobuf | Bin 0 -> 3547 bytes .../importlib_metadata._compat.protobuf | 20 +++ .../importlib_metadata._functools.protobuf | 22 ++++ .../importlib_metadata._itertools.protobuf | Bin 0 -> 1086 bytes .../importlib_metadata._meta.protobuf | 116 ++++++++++++++++++ .../importlib_metadata._text.protobuf | Bin 0 -> 955 bytes .../importlib_metadata._typing.protobuf | 10 ++ .../importlib_metadata.compat.protobuf | 9 ++ .../importlib_metadata.compat.py311.protobuf | 11 ++ .../importlib_metadata.compat.py39.protobuf | 19 +++ .../importlib_metadata.protobuf | Bin 0 -> 30259 bytes .../checksums/custom.checksum | 4 +- .../checksums/importer.checksum | 2 +- .../resources/custom/pg/__init__.pyi | 13 ++ .../resources/custom/pg/connection.pyi | 5 + .../resources/custom/pg/db.pyi | 15 +++ 25 files changed, 444 insertions(+), 43 deletions(-) create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pg.connection.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pg.db.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pg.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/importlib_metadata._adapters.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/importlib_metadata._collections.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/importlib_metadata._compat.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/importlib_metadata._functools.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/importlib_metadata._itertools.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/importlib_metadata._meta.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/importlib_metadata._text.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/importlib_metadata._typing.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/importlib_metadata.compat.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/importlib_metadata.compat.py311.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/importlib_metadata.compat.py39.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/importlib_metadata.protobuf create mode 100644 python-frontend/typeshed_serializer/resources/custom/pg/__init__.pyi create mode 100644 python-frontend/typeshed_serializer/resources/custom/pg/connection.pyi create mode 100644 python-frontend/typeshed_serializer/resources/custom/pg/db.pyi diff --git a/python-checks/src/main/java/org/sonar/python/checks/DbNoPasswordCheck.java b/python-checks/src/main/java/org/sonar/python/checks/DbNoPasswordCheck.java index 33e2baa3d..b2b7534f8 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/DbNoPasswordCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/DbNoPasswordCheck.java @@ -16,14 +16,12 @@ */ package org.sonar.python.checks; -import java.util.Arrays; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.sonar.check.Rule; import org.sonar.plugins.python.api.PythonSubscriptionCheck; import org.sonar.plugins.python.api.SubscriptionContext; -import org.sonar.plugins.python.api.symbols.Symbol; import org.sonar.plugins.python.api.tree.Argument; import org.sonar.plugins.python.api.tree.AssignmentStatement; import org.sonar.plugins.python.api.tree.CallExpression; @@ -34,6 +32,8 @@ import org.sonar.plugins.python.api.tree.StringLiteral; import org.sonar.plugins.python.api.tree.Tree; import org.sonar.plugins.python.api.tree.Tree.Kind; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; import static org.sonar.plugins.python.api.tree.Tree.Kind.ASSIGNMENT_STMT; import static org.sonar.plugins.python.api.tree.Tree.Kind.CALL_EXPR; @@ -49,15 +49,19 @@ public class DbNoPasswordCheck extends PythonSubscriptionCheck { private static final String MESSAGE = "Add password protection to this database."; - private static final List CONNECT_METHODS = Arrays.asList( - "mysql.connector.connect", - "mysql.connector.connection.MySQLConnection", - "pymysql.connections.connect", - "psycopg2.connect", - "pgdb.connect.connect", - "pg.DB", - "pg.connect" - ); + private static final TypeMatcher PG_MATCHER = TypeMatchers.any( + TypeMatchers.isType("pg.db.DB"), + TypeMatchers.isType("pg.connect")); + + private static final TypeMatcher CONNECT_MATCHER = TypeMatchers.any( + TypeMatchers.isType("mysql.connector.connect"), + TypeMatchers.isType("mysql.connector.connection.MySQLConnection"), + TypeMatchers.isType("pymysql.connections.connect"), + TypeMatchers.isType("psycopg2.connect"), + // pgdb.connect is a module whose connect function has FQN pgdb.connect.connect. + // isType can't resolve it through the type table, so use withFQN to match on the FQN directly. + TypeMatchers.withFQN("pgdb.connect.connect"), + PG_MATCHER); private static final Pattern CONNECTION_URI_PATTERN = Pattern.compile("^(?:postgresql|mysql|oracle|mssql)(?:\\+.+?)?://.+?(:.*)?@.+"); @@ -83,17 +87,17 @@ private static void checkDbUri(SubscriptionContext ctx) { private static void checkDbApi(SubscriptionContext ctx) { CallExpression callExpr = (CallExpression) ctx.syntaxNode(); - Symbol symbol = callExpr.calleeSymbol(); - if (symbol != null && CONNECT_METHODS.contains(symbol.fullyQualifiedName())) { - RegularArgument passwordArgument = getPasswordArgument(symbol.fullyQualifiedName(), callExpr.arguments()); - if (passwordArgument != null && isString(passwordArgument.expression(), "")) { - ctx.addIssue(passwordArgument, MESSAGE); - } + if (!CONNECT_MATCHER.isTrueFor(callExpr.callee(), ctx)) { + return; + } + boolean isPg = PG_MATCHER.isTrueFor(callExpr.callee(), ctx); + RegularArgument passwordArgument = getPasswordArgument(isPg, callExpr.arguments()); + if (passwordArgument != null && isString(passwordArgument.expression(), "")) { + ctx.addIssue(passwordArgument, MESSAGE); } } - private static RegularArgument getPasswordArgument(String method, List arguments) { - boolean isPg = method.startsWith("pg."); + private static RegularArgument getPasswordArgument(boolean isPg, List arguments) { String argumentKeyword = isPg ? "passwd" : "password"; int passwordIndex = isPg ? 5 : 2; int positionalIndex = 0; diff --git a/python-checks/src/main/java/org/sonar/python/checks/IncorrectParameterDatetimeConstructorsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/IncorrectParameterDatetimeConstructorsCheck.java index fd89aea51..6433e1d85 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/IncorrectParameterDatetimeConstructorsCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/IncorrectParameterDatetimeConstructorsCheck.java @@ -19,7 +19,6 @@ import org.sonar.check.Rule; import org.sonar.plugins.python.api.PythonSubscriptionCheck; import org.sonar.plugins.python.api.SubscriptionContext; -import org.sonar.plugins.python.api.symbols.Symbol; import org.sonar.plugins.python.api.tree.CallExpression; import org.sonar.plugins.python.api.tree.Expression; import org.sonar.plugins.python.api.tree.Name; @@ -27,6 +26,8 @@ import org.sonar.plugins.python.api.tree.RegularArgument; import org.sonar.plugins.python.api.tree.Tree; import org.sonar.plugins.python.api.tree.UnaryExpression; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; import org.sonar.python.checks.utils.Expressions; import org.sonar.python.tree.TreeUtils; @@ -36,6 +37,9 @@ public class IncorrectParameterDatetimeConstructorsCheck extends PythonSubscript private static final int MAX_YEAR = 9999; private static final String MESSAGE = "Provide a correct value for the `%s` parameter."; private static final String MESSAGE_SECONDARY_LOCATION = "An invalid value is assigned here."; + private static final TypeMatcher DATE_MATCHER = TypeMatchers.isType("datetime.date"); + private static final TypeMatcher TIME_MATCHER = TypeMatchers.isType("datetime.time"); + private static final TypeMatcher DATETIME_MATCHER = TypeMatchers.isType("datetime.datetime"); @Override public void initialize(Context context) { @@ -44,15 +48,12 @@ public void initialize(Context context) { private static void checkCallExpr(SubscriptionContext context) { CallExpression callExpression = (CallExpression) context.syntaxNode(); - Symbol calleeSymbol = callExpression.calleeSymbol(); - if (calleeSymbol == null) { - return; - } - if ("datetime.date".equals(calleeSymbol.fullyQualifiedName())) { + Expression callee = callExpression.callee(); + if (DATE_MATCHER.isTrueFor(callee, context)) { checkDate(context, callExpression); - } else if ("datetime.time".equals(calleeSymbol.fullyQualifiedName())) { + } else if (TIME_MATCHER.isTrueFor(callee, context)) { checkTime(context, callExpression); - } else if ("datetime.datetime".equals(calleeSymbol.fullyQualifiedName())) { + } else if (DATETIME_MATCHER.isTrueFor(callee, context)) { checkDate(context, callExpression); checkTime(context, callExpression, 3); } diff --git a/python-checks/src/main/java/org/sonar/python/checks/InvalidOpenModeCheck.java b/python-checks/src/main/java/org/sonar/python/checks/InvalidOpenModeCheck.java index a69371753..c7084c51e 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/InvalidOpenModeCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/InvalidOpenModeCheck.java @@ -23,7 +23,6 @@ import org.sonar.check.Rule; import org.sonar.plugins.python.api.PythonSubscriptionCheck; import org.sonar.plugins.python.api.SubscriptionContext; -import org.sonar.plugins.python.api.symbols.Symbol; import org.sonar.plugins.python.api.tree.Argument; import org.sonar.plugins.python.api.tree.CallExpression; import org.sonar.plugins.python.api.tree.Expression; @@ -32,6 +31,8 @@ import org.sonar.plugins.python.api.tree.StringElement; import org.sonar.plugins.python.api.tree.StringLiteral; import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; import org.sonar.python.checks.utils.Expressions; import org.sonar.python.tree.TreeUtils; @@ -41,13 +42,13 @@ public class InvalidOpenModeCheck extends PythonSubscriptionCheck { private static final String VALID_MODES = "rwatb+Ux"; private static final Pattern INVALID_CHARACTERS = Pattern.compile("[^" + VALID_MODES + "]"); private static final String MESSAGE = "Fix this invalid mode string."; + private static final TypeMatcher OPEN_MATCHER = TypeMatchers.isType("open"); @Override public void initialize(Context context) { context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, ctx -> { CallExpression callExpression = (CallExpression) ctx.syntaxNode(); - Symbol calleeSymbol = callExpression.calleeSymbol(); - if (calleeSymbol == null || !"open".equals(calleeSymbol.fullyQualifiedName())) { + if (!OPEN_MATCHER.isTrueFor(callExpression.callee(), ctx)) { return; } List arguments = callExpression.arguments(); diff --git a/python-checks/src/main/java/org/sonar/python/checks/IsCloseAbsTolCheck.java b/python-checks/src/main/java/org/sonar/python/checks/IsCloseAbsTolCheck.java index 7370f1f80..acf0e2a11 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/IsCloseAbsTolCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/IsCloseAbsTolCheck.java @@ -22,13 +22,14 @@ import org.sonar.plugins.python.api.PythonSubscriptionCheck; import org.sonar.plugins.python.api.SubscriptionContext; import org.sonar.plugins.python.api.quickfix.PythonQuickFix; -import org.sonar.plugins.python.api.symbols.Symbol; import org.sonar.plugins.python.api.tree.CallExpression; import org.sonar.plugins.python.api.tree.Expression; import org.sonar.plugins.python.api.tree.Name; import org.sonar.plugins.python.api.tree.NumericLiteral; import org.sonar.plugins.python.api.tree.RegularArgument; import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; import org.sonar.python.checks.utils.Expressions; import org.sonar.python.quickfix.TextEditUtils; import org.sonar.python.tree.TreeUtils; @@ -39,6 +40,7 @@ public class IsCloseAbsTolCheck extends PythonSubscriptionCheck { private static final String MESSAGE = "Provide the \"abs_tol\" parameter when using \"math.isclose\" to compare a value to 0."; private static final String SECONDARY_LOCATION_MESSAGE = "This argument evaluates to zero."; private static final String QUICK_FIX_MESSAGE = "Add the \"abs_tol\" parameter."; + private static final TypeMatcher MATH_ISCLOSE = TypeMatchers.isType("math.isclose"); @Override public void initialize(Context context) { @@ -47,8 +49,7 @@ public void initialize(Context context) { } private static void checkForIsCloseAbsTolArgument(SubscriptionContext ctx, CallExpression call) { - Symbol symbol = call.calleeSymbol(); - if (symbol != null && "math.isclose".equals(symbol.fullyQualifiedName()) + if (MATH_ISCLOSE.isTrueFor(call.callee(), ctx) && TreeUtils.argumentByKeyword("abs_tol", call.arguments()) == null) { RegularArgument firstArg = TreeUtils.nthArgumentOrKeyword(0, "a", call.arguments()); RegularArgument secondArg = TreeUtils.nthArgumentOrKeyword(1, "b", call.arguments()); diff --git a/python-checks/src/main/java/org/sonar/python/checks/PytzTimeZoneInDatetimeConstructorCheck.java b/python-checks/src/main/java/org/sonar/python/checks/PytzTimeZoneInDatetimeConstructorCheck.java index 0f0638c70..175b65a36 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/PytzTimeZoneInDatetimeConstructorCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/PytzTimeZoneInDatetimeConstructorCheck.java @@ -18,15 +18,15 @@ import java.util.Comparator; import java.util.List; -import java.util.Optional; import org.sonar.check.Rule; import org.sonar.plugins.python.api.PythonSubscriptionCheck; import org.sonar.plugins.python.api.SubscriptionContext; -import org.sonar.plugins.python.api.symbols.Symbol; import org.sonar.plugins.python.api.tree.CallExpression; import org.sonar.plugins.python.api.tree.Name; import org.sonar.plugins.python.api.tree.RegularArgument; import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; import org.sonar.python.tree.TreeUtils; @Rule(key = "S6887") @@ -34,6 +34,8 @@ public class PytzTimeZoneInDatetimeConstructorCheck extends PythonSubscriptionCh private static final String MESSAGE = "Don't pass a \"pytz.timezone\" to the \"datetime.datetime\" constructor."; private static final String SECONDARY_MESSAGE = "The pytz.timezone is created here."; + private static final TypeMatcher DATETIME_DATETIME = TypeMatchers.isType("datetime.datetime"); + private static final TypeMatcher PYTZ_TIMEZONE = TypeMatchers.isType("pytz.timezone"); @Override public void initialize(Context context) { @@ -42,9 +44,8 @@ public void initialize(Context context) { private static void checkCallExpression(SubscriptionContext context) { CallExpression callExpression = (CallExpression) context.syntaxNode(); - Symbol calleeSymbol = callExpression.calleeSymbol(); - if (calleeSymbol != null && "datetime.datetime".equals(calleeSymbol.fullyQualifiedName())) { + if (DATETIME_DATETIME.isTrueFor(callExpression.callee(), context)) { RegularArgument argument = TreeUtils.nthArgumentOrKeyword(7, "tzinfo", callExpression.arguments()); if (argument == null) { return; @@ -56,8 +57,7 @@ private static void checkCallExpression(SubscriptionContext context) { private static void checkArgument(RegularArgument argument, SubscriptionContext context) { if (argument.expression().is(Tree.Kind.CALL_EXPR)) { CallExpression callExpression = (CallExpression) argument.expression(); - Symbol calleeSymbol = callExpression.calleeSymbol(); - if (!(calleeSymbol != null && "pytz.timezone".equals(calleeSymbol.fullyQualifiedName()))) { + if (!PYTZ_TIMEZONE.isTrueFor(callExpression.callee(), context)) { return; } context.addIssue(argument, MESSAGE); @@ -65,7 +65,7 @@ private static void checkArgument(RegularArgument argument, SubscriptionContext List allSecondaryLocations = context.valuesAtLocation((Name) argument.expression()).stream() .filter(expression -> expression.is(Tree.Kind.CALL_EXPR)) .map(CallExpression.class::cast) - .filter(call -> Optional.ofNullable(call.calleeSymbol()).map(symbol ->"pytz.timezone".equals(symbol.fullyQualifiedName())).orElse(false)) + .filter(call -> PYTZ_TIMEZONE.isTrueFor(call.callee(), context)) .sorted(Comparator.comparingInt(call -> call.firstToken().line())) .toList(); diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pg.connection.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pg.connection.protobuf new file mode 100644 index 000000000..455c92c05 --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pg.connection.protobuf @@ -0,0 +1,20 @@ + + pg.connection + +Connectionpg.connection.Connection"*SonarPythonAnalyzerFakeStub.CustomStubBase* +querypg.connection.Connection.query" +None*> +self4 +pg.connection.Connection"pg.connection.Connection*) +command + builtins.str" builtins.str* +args +Any*q +closepg.connection.Connection.close" +None*> +self4 +pg.connection.Connection"pg.connection.Connection* +__annotations__pg.connection.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pg.db.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pg.db.protobuf new file mode 100644 index 000000000..dc7b308e7 --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pg.db.protobuf @@ -0,0 +1,45 @@ + +pg.db +DBpg.db.DB"*SonarPythonAnalyzerFakeStub.CustomStubBase* +__init__pg.db.DB.__init__" +None* +self +pg.db.DB"pg.db.DB*R +dbnameD +Union[builtins.str,None] + builtins.str" builtins.str +None *P +hostD +Union[builtins.str,None] + builtins.str" builtins.str +None *( +port + builtins.int" builtins.int *O +optD +Union[builtins.str,None] + builtins.str" builtins.str +None *P +userD +Union[builtins.str,None] + builtins.str" builtins.str +None *R +passwdD +Union[builtins.str,None] + builtins.str" builtins.str +None * +querypg.db.DB.query" +None* +self +pg.db.DB"pg.db.DB*) +command + builtins.str" builtins.str* +args +Any*A +closepg.db.DB.close" +None* +self +pg.db.DB"pg.db.DB* +__annotations__pg.db.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pg.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pg.protobuf new file mode 100644 index 000000000..1321c84f0 --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pg.protobuf @@ -0,0 +1,89 @@ + +pg + +Connectionpg.connection.Connection"*SonarPythonAnalyzerFakeStub.CustomStubBase* +querypg.connection.Connection.query" +None*> +self4 +pg.connection.Connection"pg.connection.Connection*) +command + builtins.str" builtins.str* +args +Any*q +closepg.connection.Connection.close" +None*> +self4 +pg.connection.Connection"pg.connection.Connection +DBpg.db.DB"*SonarPythonAnalyzerFakeStub.CustomStubBase* +__init__pg.db.DB.__init__" +None* +self +pg.db.DB"pg.db.DB*R +dbnameD +Union[builtins.str,None] + builtins.str" builtins.str +None *P +hostD +Union[builtins.str,None] + builtins.str" builtins.str +None *( +port + builtins.int" builtins.int *O +optD +Union[builtins.str,None] + builtins.str" builtins.str +None *P +userD +Union[builtins.str,None] + builtins.str" builtins.str +None *R +passwdD +Union[builtins.str,None] + builtins.str" builtins.str +None * +querypg.db.DB.query" +None* +self +pg.db.DB"pg.db.DB*) +command + builtins.str" builtins.str* +args +Any*A +closepg.db.DB.close" +None* +self +pg.db.DB"pg.db.DB +connect +pg.connect"4 +pg.connection.Connection"pg.connection.Connection*R +dbnameD +Union[builtins.str,None] + builtins.str" builtins.str +None *P +hostD +Union[builtins.str,None] + builtins.str" builtins.str +None *( +port + builtins.int" builtins.int *O +optD +Union[builtins.str,None] + builtins.str" builtins.str +None *P +userD +Union[builtins.str,None] + builtins.str" builtins.str +None *R +passwdD +Union[builtins.str,None] + builtins.str" builtins.str +None *, +nowait + builtins.bool" builtins.bool *c +__path__ pg.__path__J +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list*~ +__annotations__pg.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/importlib_metadata._adapters.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/importlib_metadata._adapters.protobuf new file mode 100644 index 0000000000000000000000000000000000000000..3aafc188e3dc9b65cc871c4ba1fc23cc5d058915 GIT binary patch literal 1457 zcmb7EU27CE6m7b*?(S7_Iv~hUP(~4qHB=}?^hry75CtuQNLgaKb34Y)7fIH2UVRhv z-B*8!Kg2&{W@a6C>ssSeZo)a|o+KxMO_`O2GO0Y`85$7_BN(?sX;A6l8-dY*m_092 zIjMr1XJJ`~i>_cMWXj5h#rEq-t3VIHJ1){Vxb3FIYA_vwr!hVDNnPb4LtBlY|6Zh1 zTL#~UFnESqiv)ukXX?&T(dE`(){@wKnSNS_0p~f+I1jd5gxDM%4WRchulzp!OrSSO zwNJv21nA4E#6uUMvA-TZ1vm3R`+2fG}lJSJPDYSSchMbvG3!ZF7n`(lR^#sP2MK=H;$$ l&1@vL?B6gBH(|lJQPI+@^AcU`n6(b|q2GK~K|5R{KLKZ~{lowO literal 0 HcmV?d00001 diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/importlib_metadata._collections.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/importlib_metadata._collections.protobuf new file mode 100644 index 0000000000000000000000000000000000000000..31154149e4d1b55460d5a27e85894b62b3bd6ab3 GIT binary patch literal 3547 zcmeHKL5tHs6n3_$TgKH5Lt!BZy9CkQVT~(zQW1qk@Upu?#X~8x({{RsohD&ss&@Z@ z7w_uDv*17Q4|w-ycH%|_ue;O;C47nVxf50B}1lYpDG%V zUd%b`sW6Tt`nd+1PX%Kaw9DBc8_*F~hha~ldnKO1-@N>-8SJ2+!Syv9?!qgC3_~fy z=!_8bcp3Cy1_3vqBN-pK0I$Q^IUDPTV|aOBQeo)9Qt+AcA7pU?*U3P{7c4>#mqN_F zJsskcXzbR}mo4a=&`_WoWq8KQzt$avT!oPg)F|N$pTc@Vg=7fZxCg1NIiDVv`h4_} zDfU*m-~iljPLX?@N~xRURoqVi{#JtxB3Qy{kD=REyG+de_WD_>wO0>XpIxrw#(?K)zPQAY6bTlrBlE+^Rk1*WyiNB zMK3e_x~5A`rD0jyl4sWbOSnB9E#qDsL`_(o#W7B4&A(c}S?#%d=V($G(sNr9O>O^= zN7ZDVkH;g}2o)1Xjkv%&fK5F#S~3LB^2K)AmXrI`-<ayoL6-rzR;zW@knSrXsIYN>yoxkGbc2P kVnx$m5v^EC|2eYEi(Zvwjz5{=6gNY6%9>}+p|a?H16R+}l>h($ literal 0 HcmV?d00001 diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/importlib_metadata._compat.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/importlib_metadata._compat.protobuf new file mode 100644 index 000000000..4ef6a415b --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/importlib_metadata._compat.protobuf @@ -0,0 +1,20 @@ + +importlib_metadata._compat + +NullFinder%importlib_metadata._compat.NullFinder"builtins.object*m + find_spec/importlib_metadata._compat.NullFinder.find_spec* +args* + +kwargs0:builtins.staticmethodh6 +install"importlib_metadata._compat.install* +clsI +disable_stdlib_finder0importlib_metadata._compat.disable_stdlib_finder@ + pypy_partial'importlib_metadata._compat.pypy_partial* +val* +__annotations__*importlib_metadata._compat.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict*y +__all__"importlib_metadata._compat.__all__J +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/importlib_metadata._functools.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/importlib_metadata._functools.protobuf new file mode 100644 index 000000000..0a7e20dc8 --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/importlib_metadata._functools.protobuf @@ -0,0 +1,22 @@ + +importlib_metadata._functools[ + method_cache*importlib_metadata._functools.method_cache* + +method* + cache_wrapper > + pass_none'importlib_metadata._functools.pass_none* +func@ +noop"importlib_metadata._functools.noop* +args* + +kwargs + passthrough)importlib_metadata._functools.passthrough"K +CallableType[builtins.function]& +builtins.function"builtins.function*U +funcK +CallableType[builtins.function]& +builtins.function"builtins.function* +__annotations__-importlib_metadata._functools.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/importlib_metadata._itertools.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/importlib_metadata._itertools.protobuf new file mode 100644 index 0000000000000000000000000000000000000000..d3f5cadcbb1dca0cd629b720f2adb154cab11e3d GIT binary patch literal 1086 zcmb7D+e*Vg5H<8-J62Ni7!*tKL8C@}69qv;zd#TbSvKjaYtwAaPAd5nKgqvxl4?@( zU{~^zUCudsX66iR%E?qE7|DQ51o9C_?lXxZL8T(?e72w+q~Tbgv;8O1pQDC$kje;U ztbG-{iV(dqbQqJdM8=#06AAwZ?scH4MfB9SydHFNPdtbOomQbS78(86(4Fx}l4+In zt%2oTL65Oe#mLD4J$P*RU`6p(=(~Y6_AHQ*cq+7WWTsLv7MypXRj82Lv!WAJ#(z3d zz{%1jS;{?88z#gzv{W(jx{?!U&}^L@vw9@D)ai>j>$j3qXfo=#vuj2rXvIB;HVb+9 zBAh)lb^)&V*8uq>=3{ma%`{3vspH;(oyPJl6->-TqJ@Z;1+oUO#jyJw!-3`AgUzFN zp6OzB@|Z4@uEFz6)56R%9dIoeW>d;KW%|Pcn=u~83OPzu)!^fZpQe@YkvA;c&eKMM9q8PeUJmP| zRI+PmA}T^mSb&@^S+?UoZ@&G*tk~KVAK^7Cwl=j0H!IegchEvCxGkL94?F3SW-ZvY zLXA5SyN5PnW;AhkdoE`XmQx$PlOZ&u#^fSIcHmn5eTWSeqI9jiL#)hPl*v^{j7RIB zL3H!yV~=M#BV&|J-EUTy95bF3f;~VibuJcRwLDtaVtdfAvyp501!6l@lEPvwb3BmG +importlib_metadata.EntryPoint"importlib_metadata.EntryPoint* +params +Any* +__annotations__.importlib_metadata.compat.py39.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/importlib_metadata.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/importlib_metadata.protobuf new file mode 100644 index 0000000000000000000000000000000000000000..d4da6b905e29880247248f6e9fce4c2f1f8b7b21 GIT binary patch literal 30259 zcmeHQYm6PqRZh>0=TT$tjC;MW-k0gHkMue>>s{}%af0P|y=Gr_oWz@5;!N5-_x8;6 z&Yj!W-F@vHD?uS41SB3pARa3%LWDqo1cX>XK_K7{Xh8^s_!03?A|iw$@sjuv1qp?( zs`^pgeflxud%d#=`HyG%oKscjoH})0Rl{^|Yv>12-&?h}+{o!Uk)!|X6gzY#aNTRp zYTrHWt~sNAblU4i`mr)_$L{+5zT1sFe-L&kEb}%Mq9@7qK+alai?+Sxg`qcCw{898 zZm4$@3f4TE3ElqMvS!V(=}mVV|9L-~UE@n}_4n+GyhP3@2j|(Gy%zY_+=2eyT~Um& z4NUQUgYD&g`mf!_X3jfapnqo*Jq~5wv^w(okq2%^qha5*F0p+>CkS2LYJ=Vpu$({L zehB`6Ws&9Y2&(?)IH9gg$Key`g6P!8Dt<19#YWx~~4tR-+`~=8tLY!FCwu zE-cR&m)PM8d{r0Isf1B*MEzl9dD^&(?N@(g=6^F?-Vy0tiZej~zQt<=vk zHEZU99G$(r?|yg&Mq$g@Y->aX?Ei0%NgL~Udz@hNUgQSc8(G$jhuI-)8n_IdXX0O8 z6l$5Ar{+@Ov!%0XSU+t41O)aIzw5h$-0yG#zHO)l@0XiVe@83B!p(L4jtD*w@7k6J zv@q)pB;N{i{5g$#N}k*Ag>7w+gr2+;5Wor8FXv`+103o{TM1i5F(zdxgJ00tQan=Z zEr-pXH+Ky?1+2+U@db!B^hW{w!ImC{gly~twkTb9=J@^exe`6n;T^)5d-G~k{xOt6yzaMraRC&Ui2mx$w z;6)G#83GhZATX2QS?px(R}Fa;-KzzCGMz*l1q5d$%<}#HGLz($P>Uml35u5pj zn&b81|6%g!^bYg9YZ9>fSKOfQJH3D}<`S7<%1JREGK#hUc^0=u&YA4yx2 z75&@NFI5y2N9j` zE;3!hj+NgNQTY0r_TA&8GkhBJrx9gpg%zHoB}lOO1-nQes9!wb7ZXF5P2;ad0(EoIbE!$5G zqG0NJjq}@LUWetbupb9?7X1BzKr7cx~N=L%hPck@%ick~< zbWNa0kwZ4n!yIv#1rDu#MRs%~Y&}i=wVN5srlQ|Xs73auwzYt_S{T*rfElEf zX&EM}2fr1)xM$d$;1L{es;?khS0@HjsGt!5k(9F)E>Bx7yU7MgWC{JN{6BQMULlu< z=1m1Lt=a?rSX@kQS}v-{%0wT5CfI%6M$n`Q0!kF}1&({U4GxDAI4|-9K!_4BHa8Hd zZZ4Gr8K^Q>h=%)^5RFp*KgN$CbVGBhjmMCL!-UXr1hfq&+-QR);c_;qTwNZU{S2Y~0oCZMPt&VtGRGOhb#qMnYHJbpk zyuJSI1-6(iFVycLXe-~9&|Y3d_{T!Up1O~q;KNBnwjK3sG{TtI>yw=_PO_%?HhgdD zNw6MMHa->A=GT_){J+83hx-PI=^8dyh+vL`nb*IRXH#eQ`f1&qo(9utuE_d3&O?*bz|X)67V-6)?&>vKY$k4mYyKxU?#78RHo$H(*1@3u2^j_g;)?ell z!qi+8A~Jo-*Oxo)VeJdeN==Hd&@?Gir+l}L7kbEYufdxW}f{1>q&>&T6;gtU?w} zH-go}wP2Loeqx#}N-K(cCrGwaZQ;4qE5Kv5yW{1;FT(Qja~&+$vmFkVGWq=}wjdlQ zE=1DD%1I;zHOHYpACE7U8zH;zLdDfwb$EUwcMRk1>=G?lS9Q<*^EeiIUfAV*n4}A- zPQH^snxEC!!)h}&t|?NNl2zoDv8+4k8+`^z7=Ag@dUFNvd#E_`s|9dnAy_z#@2>Po zR9?uNRGlX!X6mJUj8RcZHKMsQ@XV8egNqP1xkZ(RxHWq6ttoZ@d0%%8RZvmBB%40e zsdjSUdq`t`5^;PFfg7HJF!qcdgY{Kmp7q5kHswTQiap10CmM@Mdy5EO^h$oQd&uZ*grHv5p(G>4*rRHHG z7ppR(V2#zM0PD*4DK2T&4^6Ryc%~tAw_v@o-Y~?aHuAP(j(;T-b0XZ}friYx)O+NW zigBFElG<4XZHT4Y16;bWs&wRcaH{e>i@ZPC8kQp;1MUU(pya#XWkM$^lB~ z%1AwSCpD6M5+NiXCTkogMpj074QFuRULJWk=9{CJ1k(I|Ey*3`)hhi7QGcd>W9&M) z(T8oSM?Ltv5Hn;ACeTl75bV!mDSW>G7fa|TR6rry>|&LX6sn)r*zI=D9fq=>|O>QiWHt#h`xu1r<0b7V8vj5MD=H&fghSk_Kz ztBX8y_P$e3o`rL)zdpxwm4u9Z$x1~T%*^_Tk&5efI7MDY3nqvAIe^I2TGzx@z zlcvPMcNudJ#i%c(NzQYO>Wd=CMe)b7kUjpkhU(Xf6x5+)y=ri&m9rcN3@)74htPb2px|cAX7yo`^r=|bNESpc5M_TmcV_Dz- zTGe;TLMEt`#y8df6Wm&9Te#~ZjTG;~mFZJ8SW8o+wQW7w`DVSy7ScQx>5L}R>ZD-Y zM#(wA4u(56aS``|<8YCj2G7B4^CoNr6j|?Ts zi|-ltvn9!QyqA%(JGsJ^aW;6F9V{-XM>>w_ASLkDV+~?ohcaO)dEwcNMQijgBbeba z2v7NEaR{kDWiXR+&=F`B-%X^z%I?1Ph3VG8PkAo#UBz73WTGr~tVKzeuUnnYO2tM0 zA{^OHRst%OcYj<<3hbZJ*h5tn_VNmOot+My%CMwl2r&6@b#(w$Rb&4+N~iKD#r4)` zgDypt$Lr*fa(;5`u)$Xn1Z(pdpF+XK8;F`MdIY7j6zbna_&dZDN{EUtv*$zuyIdiH zCp7)n7uj-A-6|US@(SK~oxu8c^?an>hAoauos&(s?u#^9?I-^90M`)sTH|~X<=g1E z5t%$*Dx-~i!Agw13v4p%`ejHm%Vq7|UMTA`g+4Uut(T(4;EpWs5*9UuvG$@(Miy^{ zHU!Hf3ZhilP?AOF9?CLm=ATss)SGxAo7;Vv91n4ah-_&fM#>?Hfq-0_Y7V{+e;a@s z4ziuDJOl?Fr-d;dXLE5;icB9QZc_}Co{h#uwtq`W3XpC46$u1>1ytf9nR7EcAnv-_ zR|98=ry%*m52z~641AwXXedNE4CiwBxoYDCTSyxK$jY`tCI#fQcmn~9IBw}I^4~`r zxI4d2OQ%301~s2!_dbalAMcqHUQ`-BiQWWM+Evk<C8wI%39fR2`8Zjy}3N>E(qBHSj=P?xt|<6W%hpU*>5pG+qbaNMWi79WSlmwEIIN?Sf2?VxOF@^MU$W8?0nOrKnT zmzeQ+jp^dgZD9VA5u7xc5G;c=bS#c@o_S%RD&ht$gq6T$!m>i1cjn$c^3J5J;*SUh z#`jbY{({|-o&RGubX1Usnb;r1vEI)AavJY$p$-7?1s5!S2~Dh92=379OV2jmP%(@# zVt1)+!a?LY{fjXSo-D`hnT7PHT|Pi=9xRPuJ%|j^_M`76?|sL~Y5pAxvXE`ue)Q;3 w($&mBj~)f=W!?mUa06;Wxe4*Nv1-Xh3@Kf9dPw=rIL2-*F`@9s)XH4?UlK;zz5oCK literal 0 HcmV?d00001 diff --git a/python-frontend/typeshed_serializer/checksums/custom.checksum b/python-frontend/typeshed_serializer/checksums/custom.checksum index 4ff26fe03..ada60fd5a 100644 --- a/python-frontend/typeshed_serializer/checksums/custom.checksum +++ b/python-frontend/typeshed_serializer/checksums/custom.checksum @@ -1,2 +1,2 @@ -87337f7b40e10d53f0e6d2fa4e82dff6bdefea2daee4ad89099bd43ade6d5123 -d9033485534f02a01a57cc2cb030873d15b62a715bac2a6685adea2698259fc4 \ No newline at end of file +0e133142aff9e9d8fee6f4c7205e699f7865502ae3921345895cc814acf0e877 +c137c6a178c97aca6334c983fabbed631672e730554ae8ee66b0aff1949cc90a \ No newline at end of file diff --git a/python-frontend/typeshed_serializer/checksums/importer.checksum b/python-frontend/typeshed_serializer/checksums/importer.checksum index 4ed2d949e..4d680d8f5 100644 --- a/python-frontend/typeshed_serializer/checksums/importer.checksum +++ b/python-frontend/typeshed_serializer/checksums/importer.checksum @@ -1,2 +1,2 @@ fd77cbe2295d8908b6b4fa54a1ae7d257084790de28f164bd67e4c22e8cd5149 -b9ad5bf1c2bb88ebc44d2516a96b05c68fe2af5b54930919794907c8d71a9caa \ No newline at end of file +9c0741d2e7af56b666d4505c0f64a8c25888d84e62a98f508f9147db79f306b3 \ No newline at end of file diff --git a/python-frontend/typeshed_serializer/resources/custom/pg/__init__.pyi b/python-frontend/typeshed_serializer/resources/custom/pg/__init__.pyi new file mode 100644 index 000000000..4ab0dbfd8 --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/pg/__init__.pyi @@ -0,0 +1,13 @@ +from pg.connection import Connection +from pg.db import DB +from typing import Optional + +def connect( + dbname: Optional[str] = None, + host: Optional[str] = None, + port: int = -1, + opt: Optional[str] = None, + user: Optional[str] = None, + passwd: Optional[str] = None, + nowait: bool = False, +) -> Connection: ... diff --git a/python-frontend/typeshed_serializer/resources/custom/pg/connection.pyi b/python-frontend/typeshed_serializer/resources/custom/pg/connection.pyi new file mode 100644 index 000000000..49db3498a --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/pg/connection.pyi @@ -0,0 +1,5 @@ +from SonarPythonAnalyzerFakeStub import CustomStubBase + +class Connection(CustomStubBase): + def query(self, command: str, *args) -> None: ... + def close(self) -> None: ... diff --git a/python-frontend/typeshed_serializer/resources/custom/pg/db.pyi b/python-frontend/typeshed_serializer/resources/custom/pg/db.pyi new file mode 100644 index 000000000..3c91dc37f --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/pg/db.pyi @@ -0,0 +1,15 @@ +from SonarPythonAnalyzerFakeStub import CustomStubBase +from typing import Optional + +class DB(CustomStubBase): + def __init__( + self, + dbname: Optional[str] = None, + host: Optional[str] = None, + port: int = -1, + opt: Optional[str] = None, + user: Optional[str] = None, + passwd: Optional[str] = None, + ) -> None: ... + def query(self, command: str, *args) -> None: ... + def close(self) -> None: ... From af01a05359a420d599a21e36073c9032e335d891 Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Thu, 26 Mar 2026 15:01:46 +0100 Subject: [PATCH 047/322] SONARPY-3974 Fix serializer test and migrated HardcodedCredentials rule to typeV2 to properly raise on pg.DB (#1009) GitOrigin-RevId: 1336278bad4790a29c57f4c69e363ac82002d996 --- .../hotspots/HardCodedCredentialsCheck.java | 47 +++++++++---------- .../custom_protobuf/pg.connection.protobuf | 32 ++++++++++++- .../types/custom_protobuf/pg.db.protobuf | 8 ++-- .../python/types/custom_protobuf/pg.protobuf | 40 ++++++++++++++-- .../checksums/custom.checksum | 4 +- .../resources/custom/pg/connection.pyi | 11 +++++ .../resources/custom/pg/db.pyi | 1 + .../tests/test_serializers.py | 2 +- 8 files changed, 106 insertions(+), 39 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/HardCodedCredentialsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/HardCodedCredentialsCheck.java index ba52044dc..a55a7492d 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/HardCodedCredentialsCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/HardCodedCredentialsCheck.java @@ -21,10 +21,7 @@ import java.net.URISyntaxException; import java.net.URL; import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.Optional; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -74,6 +71,21 @@ public class HardCodedCredentialsCheck extends PythonSubscriptionCheck { private static final TypeMatcher ENVIRON_MATCHER = TypeMatchers.isType("os.environ"); private static final TypeMatcher GET_ENVIRON_MATCHER = TypeMatchers.isType("typing.Mapping.get"); + private static final TypeMatcher SENSITIVE_ARG_2_MATCHER = TypeMatchers.any( + TypeMatchers.isType("mysql.connector.connect"), + TypeMatchers.isType("mysql.connector.connection.MySQLConnection"), + TypeMatchers.isType("pymysql.connect"), + TypeMatchers.isType("pymysql.connections.connect"), + TypeMatchers.isType("pymysql.connections.Connection"), + TypeMatchers.isType("psycopg2.connect"), + // pgdb.connect is a module whose connect function has FQN pgdb.connect.connect. + // isType can't resolve it through the type table, so use withFQN to match on the FQN directly. + TypeMatchers.withFQN("pgdb.connect.connect")); + + private static final TypeMatcher SENSITIVE_ARG_5_MATCHER = TypeMatchers.any( + TypeMatchers.isType("pg.DB"), + TypeMatchers.isType("pg.connect")); + @RuleProperty( key = "credentialWords", description = "Comma separated list of words identifying potential credentials", @@ -81,25 +93,6 @@ public class HardCodedCredentialsCheck extends PythonSubscriptionCheck { public String credentialWords = DEFAULT_CREDENTIAL_WORDS; private List variablePatterns = null; private List literalPatterns = null; - private Map sensitiveArgumentByFQN; - - private Map sensitiveArgumentByFQN() { - if (sensitiveArgumentByFQN == null) { - sensitiveArgumentByFQN = new HashMap<>(); - sensitiveArgumentByFQN.put("mysql.connector.connect", 2); - sensitiveArgumentByFQN.put("mysql.connector.connection.MySQLConnection", 2); - sensitiveArgumentByFQN.put("pymysql.connect", 2); - sensitiveArgumentByFQN.put("pymysql.connections.connect", 2); - sensitiveArgumentByFQN.put("pymysql.connections.Connection", 2); - sensitiveArgumentByFQN.put("psycopg2.connect", 2); - sensitiveArgumentByFQN.put("pgdb.connect", 2); - sensitiveArgumentByFQN.put("pgdb.connect.connect", 2); - sensitiveArgumentByFQN.put("pg.DB", 5); - sensitiveArgumentByFQN.put("pg.connect", 5); - sensitiveArgumentByFQN = Collections.unmodifiableMap(sensitiveArgumentByFQN); - } - return sensitiveArgumentByFQN; - } private Stream variablePatterns() { if (variablePatterns == null) { @@ -175,13 +168,15 @@ private void handleRegularArgument(RegularArgument regularArgument, Subscription } } - private void handleCallExpression(CallExpression callExpression, SubscriptionContext ctx) { + private static void handleCallExpression(CallExpression callExpression, SubscriptionContext ctx) { if (callExpression.arguments().isEmpty()) { return; } - Symbol calleeSymbol = callExpression.calleeSymbol(); - if (calleeSymbol != null && sensitiveArgumentByFQN().containsKey(calleeSymbol.fullyQualifiedName())) { - checkSensitiveArgument(callExpression, sensitiveArgumentByFQN().get(calleeSymbol.fullyQualifiedName()), ctx); + Expression callee = callExpression.callee(); + if (SENSITIVE_ARG_2_MATCHER.isTrueFor(callee, ctx)) { + checkSensitiveArgument(callExpression, 2, ctx); + } else if (SENSITIVE_ARG_5_MATCHER.isTrueFor(callee, ctx)) { + checkSensitiveArgument(callExpression, 5, ctx); } } diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pg.connection.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pg.connection.protobuf index 455c92c05..1ff9834e6 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pg.connection.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pg.connection.protobuf @@ -1,7 +1,35 @@ - pg.connection + pg.connection -Connectionpg.connection.Connection"*SonarPythonAnalyzerFakeStub.CustomStubBase* +Connectionpg.connection.Connection"*SonarPythonAnalyzerFakeStub.CustomStubBase* +__init__!pg.connection.Connection.__init__" +None*> +self4 +pg.connection.Connection"pg.connection.Connection*R +dbnameD +Union[builtins.str,None] + builtins.str" builtins.str +None *P +hostD +Union[builtins.str,None] + builtins.str" builtins.str +None *( +port + builtins.int" builtins.int *O +optD +Union[builtins.str,None] + builtins.str" builtins.str +None *P +userD +Union[builtins.str,None] + builtins.str" builtins.str +None *R +passwdD +Union[builtins.str,None] + builtins.str" builtins.str +None *, +nowait + builtins.bool" builtins.bool * querypg.connection.Connection.query" None*> self4 diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pg.db.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pg.db.protobuf index dc7b308e7..84272ac7f 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pg.db.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pg.db.protobuf @@ -1,6 +1,6 @@ -pg.db -DBpg.db.DB"*SonarPythonAnalyzerFakeStub.CustomStubBase* +pg.db +DBpg.db.DB"*SonarPythonAnalyzerFakeStub.CustomStubBase* __init__pg.db.DB.__init__" None* self @@ -26,7 +26,9 @@ passwdD Union[builtins.str,None] builtins.str" builtins.str -None * +None *, +nowait + builtins.bool" builtins.bool * querypg.db.DB.query" None* self diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pg.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pg.protobuf index 1321c84f0..15762419e 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pg.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pg.protobuf @@ -1,7 +1,35 @@ -pg +pg -Connectionpg.connection.Connection"*SonarPythonAnalyzerFakeStub.CustomStubBase* +Connectionpg.connection.Connection"*SonarPythonAnalyzerFakeStub.CustomStubBase* +__init__!pg.connection.Connection.__init__" +None*> +self4 +pg.connection.Connection"pg.connection.Connection*R +dbnameD +Union[builtins.str,None] + builtins.str" builtins.str +None *P +hostD +Union[builtins.str,None] + builtins.str" builtins.str +None *( +port + builtins.int" builtins.int *O +optD +Union[builtins.str,None] + builtins.str" builtins.str +None *P +userD +Union[builtins.str,None] + builtins.str" builtins.str +None *R +passwdD +Union[builtins.str,None] + builtins.str" builtins.str +None *, +nowait + builtins.bool" builtins.bool * querypg.connection.Connection.query" None*> self4 @@ -13,8 +41,8 @@ Connectionpg.connection.Connection"*SonarPythonAnalyzerFakeStub.CustomStubBase closepg.connection.Connection.close" None*> self4 -pg.connection.Connection"pg.connection.Connection -DBpg.db.DB"*SonarPythonAnalyzerFakeStub.CustomStubBase* +pg.connection.Connection"pg.connection.Connection +DBpg.db.DB"*SonarPythonAnalyzerFakeStub.CustomStubBase* __init__pg.db.DB.__init__" None* self @@ -40,7 +68,9 @@ Connectionpg.connection.Connection"*SonarPythonAnalyzerFakeStub.CustomStubBase passwdD Union[builtins.str,None] builtins.str" builtins.str -None * +None *, +nowait + builtins.bool" builtins.bool * querypg.db.DB.query" None* self diff --git a/python-frontend/typeshed_serializer/checksums/custom.checksum b/python-frontend/typeshed_serializer/checksums/custom.checksum index ada60fd5a..6961b2f3d 100644 --- a/python-frontend/typeshed_serializer/checksums/custom.checksum +++ b/python-frontend/typeshed_serializer/checksums/custom.checksum @@ -1,2 +1,2 @@ -0e133142aff9e9d8fee6f4c7205e699f7865502ae3921345895cc814acf0e877 -c137c6a178c97aca6334c983fabbed631672e730554ae8ee66b0aff1949cc90a \ No newline at end of file +774d53e2cc547be2fbc3e6fc9a9b5b4fadfe72eb7f7fd3444a4566d9110a0a7f +5c09d20b8cbc107906625c2325a16ebe4e2795c0f866ef3a2c636a0e23488018 \ No newline at end of file diff --git a/python-frontend/typeshed_serializer/resources/custom/pg/connection.pyi b/python-frontend/typeshed_serializer/resources/custom/pg/connection.pyi index 49db3498a..e7a0bd3ff 100644 --- a/python-frontend/typeshed_serializer/resources/custom/pg/connection.pyi +++ b/python-frontend/typeshed_serializer/resources/custom/pg/connection.pyi @@ -1,5 +1,16 @@ from SonarPythonAnalyzerFakeStub import CustomStubBase +from typing import Optional class Connection(CustomStubBase): + def __init__( + self, + dbname: Optional[str] = None, + host: Optional[str] = None, + port: int = -1, + opt: Optional[str] = None, + user: Optional[str] = None, + passwd: Optional[str] = None, + nowait: bool = False, + ) -> None: ... def query(self, command: str, *args) -> None: ... def close(self) -> None: ... diff --git a/python-frontend/typeshed_serializer/resources/custom/pg/db.pyi b/python-frontend/typeshed_serializer/resources/custom/pg/db.pyi index 3c91dc37f..1118c66cb 100644 --- a/python-frontend/typeshed_serializer/resources/custom/pg/db.pyi +++ b/python-frontend/typeshed_serializer/resources/custom/pg/db.pyi @@ -10,6 +10,7 @@ class DB(CustomStubBase): opt: Optional[str] = None, user: Optional[str] = None, passwd: Optional[str] = None, + nowait: bool = False, ) -> None: ... def query(self, command: str, *args) -> None: ... def close(self) -> None: ... diff --git a/python-frontend/typeshed_serializer/tests/test_serializers.py b/python-frontend/typeshed_serializer/tests/test_serializers.py index f65f43191..8b7be8695 100644 --- a/python-frontend/typeshed_serializer/tests/test_serializers.py +++ b/python-frontend/typeshed_serializer/tests/test_serializers.py @@ -74,7 +74,7 @@ def test_custom_stubs_serializer(typeshed_custom_stubs): custom_stubs_serializer.serialize() assert custom_stubs_serializer.get_build_result.call_count == 1 # Not every files from "typeshed_custom_stubs" build are serialized, as some are builtins - assert symbols.save_module.call_count == 344 + assert symbols.save_module.call_count == 347 def test_importer_serializer(): From 98fd5c37617fe5fbc3a8d86d6a242a07904579e9 Mon Sep 17 00:00:00 2001 From: "sonar-nigel[bot]" <247337653+sonar-nigel[bot]@users.noreply.github.com> Date: Thu, 26 Mar 2026 15:11:13 +0100 Subject: [PATCH 048/322] SONARPY-3928 Rule S8517 "sorted()" should not be used with indexing to find minimum or maximum values (#969) Co-authored-by: Sonar Vibe Bot Co-authored-by: Claude Co-authored-by: joke1196 Co-authored-by: Guillaume Dequenne GitOrigin-RevId: 4a75f134de001187116ffc77e881edb6f8c2ccdc --- .../python/checks/OpenSourceCheckList.java | 1 + .../python/checks/SortedMinMaxCheck.java | 127 ++++++++++++++++++ .../org/sonar/l10n/py/rules/python/S8517.html | 64 +++++++++ .../org/sonar/l10n/py/rules/python/S8517.json | 24 ++++ .../py/rules/python/Sonar_way_profile.json | 3 +- .../python/checks/SortedMinMaxCheckTest.java | 29 ++++ .../src/test/resources/checks/sortedMinMax.py | 126 +++++++++++++++++ 7 files changed, 373 insertions(+), 1 deletion(-) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/SortedMinMaxCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8517.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8517.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/SortedMinMaxCheckTest.java create mode 100644 python-checks/src/test/resources/checks/sortedMinMax.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 9ff1e47fe..931c99b80 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -398,6 +398,7 @@ public Stream> getChecks() { SkippedTestNoReasonCheck.class, SkLearnEstimatorDontInitializeEstimatedValuesCheck.class, SleepZeroInAsyncCheck.class, + SortedMinMaxCheck.class, SpecialMethodParamListCheck.class, SpecialMethodReturnTypeCheck.class, SQLQueriesCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/SortedMinMaxCheck.java b/python-checks/src/main/java/org/sonar/python/checks/SortedMinMaxCheck.java new file mode 100644 index 000000000..8793a8cc9 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/SortedMinMaxCheck.java @@ -0,0 +1,127 @@ +/* + * SonarQube Python Plugin + * Copyright (C) 2011-2025 SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import javax.annotation.Nullable; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.NumericLiteral; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.SubscriptionExpression; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.tree.UnaryExpression; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.checks.hotspots.CommonValidationUtils; +import org.sonar.python.checks.utils.Expressions; +import org.sonar.python.tree.TreeUtils; + +@Rule(key = "S8517") +public class SortedMinMaxCheck extends PythonSubscriptionCheck { + + private static final TypeMatcher IS_SORTED = TypeMatchers.isType("sorted"); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.SUBSCRIPTION, SortedMinMaxCheck::check); + } + + private static void check(SubscriptionContext ctx) { + SubscriptionExpression subscriptionExpression = (SubscriptionExpression) ctx.syntaxNode(); + + if (subscriptionExpression.subscripts().expressions().size() != 1) { + return; + } + + Expression subscript = subscriptionExpression.subscripts().expressions().get(0); + Boolean isFirstElement = isIndexZeroOrMinusOne(subscript); + if (isFirstElement == null) { + return; + } + + Expression object = subscriptionExpression.object(); + if (!(object instanceof CallExpression callExpression)) { + return; + } + + if (!IS_SORTED.isTrueFor(callExpression.callee(), ctx)) { + return; + } + + Boolean isReversed = isReversed(callExpression); + if (isReversed == null) { + // Cannot determine reverse truthiness, skip to avoid wrong suggestions + return; + } + + String replacement = getReplacementFunction(isFirstElement, isReversed); + ctx.addIssue(subscriptionExpression, "Use \"" + replacement + "()\" instead of sorting to find this value."); + } + + /** + * Returns true if the expression is the integer literal 0 (first element), + * false if it is -1 (last element), or null if it is neither. + */ + @Nullable + private static Boolean isIndexZeroOrMinusOne(Expression subscript) { + if (subscript instanceof NumericLiteral numericLiteral && CommonValidationUtils.isEqualTo(numericLiteral, 0)) { + return true; + } + if (subscript instanceof UnaryExpression unaryExpression + && unaryExpression.is(Tree.Kind.UNARY_MINUS) + && unaryExpression.expression() instanceof NumericLiteral numericLiteral + && CommonValidationUtils.isEqualTo(numericLiteral, 1)) { + return false; + } + return null; + } + + /** + * Returns {@code Boolean.TRUE} if the reverse argument is truthy, {@code Boolean.FALSE} if it is absent or falsy, + * or {@code null} if the reverse argument is present but its truthiness cannot be determined. + */ + @Nullable + private static Boolean isReversed(CallExpression callExpression) { + RegularArgument reverseArg = TreeUtils.argumentByKeyword("reverse", callExpression.arguments()); + if (reverseArg == null) { + return Boolean.FALSE; + } + Expression value = reverseArg.expression(); + if (Expressions.isTruthy(value)) { + return Boolean.TRUE; + } + if (Expressions.isFalsy(value)) { + return Boolean.FALSE; + } + return null; + } + + private static String getReplacementFunction(boolean isFirstElement, boolean isReversed) { + // sorted()[0] -> min (smallest first without reverse) + // sorted()[-1] -> max (largest last without reverse) + // sorted(reverse=True)[0] -> max (largest first with reverse) + // sorted(reverse=True)[-1] -> min (smallest last with reverse) + if (isFirstElement) { + return isReversed ? "max" : "min"; + } else { + return isReversed ? "min" : "max"; + } + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8517.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8517.html new file mode 100644 index 000000000..c499adcbc --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8517.html @@ -0,0 +1,64 @@ +

      This rule raises an issue when sorted() with indexing ([0] or [-1]) is used to find the minimum or maximum +value in a collection, including variants with reverse=True.

      +

      Why is this an issue?

      +

      When you need to find the smallest or largest element in a collection, you might be tempted to sort the entire collection and then access the first +or last element. However, this approach is inefficient and makes your code harder to understand.

      +

      The sorted() function creates a new sorted list from all elements, an O(n log n) operation in time, plus O(n) in memory. After +sorting, you only use one element and discard the rest.

      +

      Python provides built-in min() and max() functions that find the smallest or largest element in a single pass (O(n) time) +with no extra memory allocation. They also make your intent immediately clear to anyone reading the code.

      +

      min(), max(), and sorted() all support an optional key parameter, so you can preserve custom +comparison logic. Note that min() and max() do not have a reverse parameter, so when replacing +sorted(iterable, reverse=True)[0], you should use max(iterable) instead, and vice versa for [-1].

      +

      What is the potential impact?

      +
        +
      • Performance degradation: sorting takes O(n log n) operations while min() or max() take only O(n). For + large collections, this difference results in noticeably slower execution.
      • +
      • Memory overhead: sorted() creates a new list containing all elements. min() and max() + only store a single element during execution.
      • +
      • Reduced code clarity: using sorted()[0] to find a minimum value obscures the intent of the code.
      • +
      +

      How to fix it

      +

      Replace sorted(iterable)[0] with min(iterable) and sorted(iterable)[-1] with max(iterable). +When reverse=True is used, the mapping is inverted: sorted(iterable, reverse=True)[0] becomes max(iterable) and +sorted(iterable, reverse=True)[-1] becomes min(iterable).

      +

      Code examples

      +

      Noncompliant code example

      +
      +numbers = [42, 17, 93, 8, 51]
      +smallest = sorted(numbers)[0]  # Noncompliant
      +
      +

      Compliant solution

      +
      +numbers = [42, 17, 93, 8, 51]
      +smallest = min(numbers)
      +
      +

      Noncompliant code example

      +
      +numbers = [42, 17, 93, 8, 51]
      +largest = sorted(numbers)[-1]  # Noncompliant
      +
      +

      Compliant solution

      +
      +numbers = [42, 17, 93, 8, 51]
      +largest = max(numbers)
      +
      +

      Noncompliant code example

      +
      +numbers = [42, 17, 93, 8, 51]
      +largest = sorted(numbers, reverse=True)[0]  # Noncompliant
      +
      +

      Compliant solution

      +
      +numbers = [42, 17, 93, 8, 51]
      +largest = max(numbers)
      +
      +

      Resources

      +

      Documentation

      + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8517.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8517.json new file mode 100644 index 000000000..e4b8a5ccc --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8517.json @@ -0,0 +1,24 @@ +{ + "title": "\"sorted()\" should not be used with indexing to find minimum or maximum values", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5 min" + }, + "tags": [ + "performance", + "pythonic" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-8517", + "sqKey": "S8517", + "scope": "All", + "quickfix": "targeted", + "code": { + "impacts": { + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "EFFICIENT" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index ef644bdcf..2dda33b7e 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -327,6 +327,7 @@ "S8412", "S8413", "S8414", - "S8415" + "S8415", + "S8517" ] } diff --git a/python-checks/src/test/java/org/sonar/python/checks/SortedMinMaxCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/SortedMinMaxCheckTest.java new file mode 100644 index 000000000..cb62c6a97 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/SortedMinMaxCheckTest.java @@ -0,0 +1,29 @@ +/* + * SonarQube Python Plugin + * Copyright (C) 2011-2025 SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.junit.jupiter.api.Test; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class SortedMinMaxCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/sortedMinMax.py", new SortedMinMaxCheck()); + } + +} diff --git a/python-checks/src/test/resources/checks/sortedMinMax.py b/python-checks/src/test/resources/checks/sortedMinMax.py new file mode 100644 index 000000000..3c3349a40 --- /dev/null +++ b/python-checks/src/test/resources/checks/sortedMinMax.py @@ -0,0 +1,126 @@ +numbers = [42, 17, 93, 8, 51] +words = ["banana", "fig", "apple", "date"] + +# Issues detected +smallest = sorted(numbers)[0] # Noncompliant {{Use "min()" instead of sorting to find this value.}} +# ^^^^^^^^^^^^^^^^^^ + +largest = sorted(numbers)[-1] # Noncompliant {{Use "max()" instead of sorting to find this value.}} +# ^^^^^^^^^^^^^^^^^^^ + +also_largest = sorted(numbers, reverse=True)[0] # Noncompliant {{Use "max()" instead of sorting to find this value.}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +also_smallest = sorted(numbers, reverse=True)[-1] # Noncompliant {{Use "min()" instead of sorting to find this value.}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +# reverse=False is treated the same as no reverse argument +x = sorted(numbers, reverse=False)[0] # Noncompliant {{Use "min()" instead of sorting to find this value.}} +y = sorted(numbers, reverse=False)[-1] # Noncompliant {{Use "max()" instead of sorting to find this value.}} + +# key parameter does not suppress the issue +shortest = sorted(words, key=len)[0] # Noncompliant {{Use "min()" instead of sorting to find this value.}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^ + +longest_by_len = sorted(words, key=len, reverse=True)[0] # Noncompliant {{Use "max()" instead of sorting to find this value.}} + +# inline collection literal +inline_min = sorted([5, 3, 8, 1])[0] # Noncompliant + +# used in a boolean expression +def get_min(data): + if sorted(data)[0] < 0: # Noncompliant + return True + + +# Compliant cases + +# use min() and max() directly +min_val = min(numbers) +max_val = max(numbers) +min_by_len = min(words, key=len) +max_by_len = max(words, key=len) + +# sorted() without indexing +sorted_numbers = sorted(numbers) + +# index other than 0 or -1 +second = sorted(numbers)[1] +second_to_last = sorted(numbers)[-2] + +# slice, not a single index +first_three = sorted(numbers)[0:3] + +# indexing a non-sorted() object +first = numbers[0] +last = numbers[-1] + +# sorted result stored in a variable first +ordered = sorted(numbers) +first_ordered = ordered[0] +last_ordered = ordered[-1] + +# custom (shadowed) sorted function +def case_custom_sorted(): + def sorted(iterable): + return list(iterable) + result = sorted(numbers)[0] + +# indirect call through a variable +def case_indirect(): + sort_fn = sorted + result = sort_fn(numbers)[0] # Noncompliant +# ^^^^^^^^^^^^^^^^^^^ + +# sorted result wrapped in another call +def identity(x): + return x + +wrapped = identity(sorted(numbers))[0] + +# multiple subscripts (tuple index) - not a single subscript +multi_subscript = sorted(numbers)[0, 1] + +# qualified name callee - TypeMatchers resolves builtins.sorted correctly +import builtins +qualified_sorted = builtins.sorted(numbers)[0] # Noncompliant {{Use "min()" instead of sorting to find this value.}} + +# unary plus index - not UNARY_MINUS, so not -1 +unary_plus_index = sorted(numbers)[+1] + +# unary minus applied to a variable - not a NumericLiteral operand +neg_var = 1 +unary_minus_var_index = sorted(numbers)[-neg_var] + +# reverse argument is a truthy integer literal +reverse_int_literal = sorted(numbers, reverse=1)[0] # Noncompliant {{Use "max()" instead of sorting to find this value.}} + +# reverse argument is a falsy integer literal +reverse_zero = sorted(numbers, reverse=0)[0] # Noncompliant {{Use "min()" instead of sorting to find this value.}} + +# reverse argument is a variable assigned to True - resolved through single assignment +rev_flag = True +reverse_var = sorted(numbers, reverse=rev_flag)[0] # Noncompliant {{Use "max()" instead of sorting to find this value.}} + +# reverse argument is an unknown variable - cannot determine truthiness, skip +def some_function(flag): + unknown_reverse = sorted(numbers, reverse=flag)[0] + +# sorted used inside a lambda expression (the sorted()[index] is still flagged) +get_last = lambda lst: sorted(lst, key=lambda m: m)[-1] # Noncompliant {{Use "max()" instead of sorting to find this value.}} + +# sorted result used as subscript key into another collection +d = {"a": 1, "b": 2, "c": 3} +value = d[sorted(d.keys())[-1]] # Noncompliant {{Use "max()" instead of sorting to find this value.}} + +# negated key lambda - sorted(key=lambda x: -f(x))[0] is still noncompliant +items = ["hi", "hello", "hey"] +negated_key = sorted(items, key=lambda s: -len(s))[0] # Noncompliant {{Use "min()" instead of sorting to find this value.}} + +# multi-line sorted call - same rule applies regardless of formatting +multi_line_min = sorted( # Noncompliant {{Use "min()" instead of sorting to find this value.}} + words, + key=len, +)[0] + +test_float = sorted(items)[0.5] From 08c2eb0300a8798f15ae3f1a29282219e7dde14c Mon Sep 17 00:00:00 2001 From: "sonar-nigel[bot]" <247337653+sonar-nigel[bot]@users.noreply.github.com> Date: Thu, 26 Mar 2026 16:47:36 +0100 Subject: [PATCH 049/322] SONARPY-3926 Rule S8510 Loop variables should not be reused in nested loops (#974) Co-authored-by: Sonar Vibe Bot Co-authored-by: Claude Sonnet 4.6 GitOrigin-RevId: 09507f41abf92dc6af97af8697b92b4b9162c6c2 --- .../checks/NestedLoopVariableReuseCheck.java | 117 +++++ .../python/checks/OpenSourceCheckList.java | 1 + .../org/sonar/l10n/py/rules/python/S8510.html | 31 ++ .../org/sonar/l10n/py/rules/python/S8510.json | 23 + .../NestedLoopVariableReuseCheckTest.java | 30 ++ .../checks/nestedLoopVariableReuse.py | 402 ++++++++++++++++++ 6 files changed, 604 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/NestedLoopVariableReuseCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8510.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8510.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/NestedLoopVariableReuseCheckTest.java create mode 100644 python-checks/src/test/resources/checks/nestedLoopVariableReuse.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/NestedLoopVariableReuseCheck.java b/python-checks/src/main/java/org/sonar/python/checks/NestedLoopVariableReuseCheck.java new file mode 100644 index 000000000..677e2b28d --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/NestedLoopVariableReuseCheck.java @@ -0,0 +1,117 @@ +/* + * SonarQube Python Plugin + * Copyright (C) 2011-2025 SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.ForStatement; +import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.tree.Tuple; + +@Rule(key = "S8510") +public class NestedLoopVariableReuseCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Rename this loop variable; it shadows the outer loop variable \"%s\"."; + private static final String SECONDARY_MESSAGE = "Outer loop variable."; + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.FOR_STMT, NestedLoopVariableReuseCheck::checkForStatement); + } + + private static void checkForStatement(SubscriptionContext ctx) { + ForStatement forStatement = (ForStatement) ctx.syntaxNode(); + List innerVarNames = extractLoopVarNames(forStatement); + if (innerVarNames.isEmpty()) { + return; + } + Map> shadowedOuterNames = collectShadowedNames(forStatement, innerVarNames); + reportIssues(ctx, shadowedOuterNames); + } + + private static Map> collectShadowedNames(ForStatement forStatement, List innerVarNames) { + Map> shadowedOuterNames = new LinkedHashMap<>(); + for (Name innerName : innerVarNames) { + shadowedOuterNames.put(innerName, new ArrayList<>()); + } + Tree current = forStatement.parent(); + while (current != null) { + if (current.is(Tree.Kind.FUNCDEF, Tree.Kind.CLASSDEF, Tree.Kind.LAMBDA, + Tree.Kind.LIST_COMPREHENSION, Tree.Kind.SET_COMPREHENSION, + Tree.Kind.DICT_COMPREHENSION, Tree.Kind.GENERATOR_EXPR)) { + break; + } + if (current.is(Tree.Kind.FOR_STMT)) { + collectMatchingNames((ForStatement) current, innerVarNames, shadowedOuterNames); + } + current = current.parent(); + } + return shadowedOuterNames; + } + + private static void collectMatchingNames(ForStatement outerLoop, List innerVarNames, Map> shadowedOuterNames) { + List outerVarNames = extractLoopVarNames(outerLoop); + for (Name innerName : innerVarNames) { + for (Name outerName : outerVarNames) { + if (innerName.name().equals(outerName.name())) { + shadowedOuterNames.get(innerName).add(outerName); + } + } + } + } + + private static void reportIssues(SubscriptionContext ctx, Map> shadowedOuterNames) { + for (Map.Entry> entry : shadowedOuterNames.entrySet()) { + Name innerName = entry.getKey(); + List outerNames = entry.getValue(); + if (!outerNames.isEmpty()) { + var issue = ctx.addIssue(innerName, String.format(MESSAGE, innerName.name())); + for (Name outerName : outerNames) { + issue.secondary(outerName, SECONDARY_MESSAGE); + } + } + } + } + + private static List extractLoopVarNames(ForStatement forStatement) { + List names = new ArrayList<>(); + for (Expression expr : forStatement.expressions()) { + collectNames(expr, names); + } + return names; + } + + private static void collectNames(Expression expr, List names) { + if (expr.is(Tree.Kind.NAME)) { + Name name = (Name) expr; + if (!name.name().startsWith("_")) { + names.add(name); + } + } else if (expr.is(Tree.Kind.TUPLE)) { + for (Expression element : ((Tuple) expr).elements()) { + collectNames(element, names); + } + } + } +} diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 931c99b80..0621f4dd4 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -320,6 +320,7 @@ public Stream> getChecks() { NestedCollectionsCreationCheck.class, NestedConditionalExpressionCheck.class, NestedControlFlowDepthCheck.class, + NestedLoopVariableReuseCheck.class, NewStyleClassCheck.class, NonCallableCalledCheck.class, NonStandardCryptographicAlgorithmCheck.class, diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8510.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8510.html new file mode 100644 index 000000000..b2385e998 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8510.html @@ -0,0 +1,31 @@ +

      This rule raises an issue when a nested loop uses the same variable name as an outer loop, causing the inner loop to shadow the outer loop variable.

      +

      Why is this an issue?

      +

      In Python, loop variables persist after the loop completes and can be reassigned by inner loops without any warning. Unlike languages with +block-scoped variables, Python allows inner loops to silently overwrite outer loop variables, making the outer variable inaccessible within the +inner loop scope.

      +

      This pattern almost always indicates a programmer error. Common scenarios include copying loop patterns without changing variable names, or +confusion about Python's scoping rules. The shadowing happens silently without any compiler or runtime warning, making these bugs difficult to spot.

      +

      How to fix it

      +

      Use different variable names for each loop. Choose descriptive names that reflect what each variable represents.

      +

      Code examples

      +

      Noncompliant code example

      +
      +for i in range(10):
      +    print(f"Outer: {i}")
      +    for i in range(5):  # Noncompliant
      +        print(f"Inner: {i}")
      +    # i now contains 4, not the outer loop value
      +
      +

      Compliant solution

      +
      +for i in range(10):
      +    print(f"Outer: {i}")
      +    for j in range(5):
      +        print(f"Inner: {j}")
      +    # i still contains the outer loop value
      +
      +

      Resources

      +

      Documentation

      + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8510.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8510.json new file mode 100644 index 000000000..1417972e7 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8510.json @@ -0,0 +1,23 @@ +{ + "title": "Loop variables should not be reused in nested loops", + "type": "CODE_SMELL", + "code": { + "impacts": { + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "CLEAR" + }, + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "suspicious" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-8510", + "sqKey": "S8510", + "scope": "All", + "quickfix": "unknown" +} diff --git a/python-checks/src/test/java/org/sonar/python/checks/NestedLoopVariableReuseCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/NestedLoopVariableReuseCheckTest.java new file mode 100644 index 000000000..90f867371 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/NestedLoopVariableReuseCheckTest.java @@ -0,0 +1,30 @@ +/* + * SonarQube Python Plugin + * Copyright (C) 2011-2025 SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.junit.jupiter.api.Test; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class NestedLoopVariableReuseCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify( + "src/test/resources/checks/nestedLoopVariableReuse.py", + new NestedLoopVariableReuseCheck()); + } +} diff --git a/python-checks/src/test/resources/checks/nestedLoopVariableReuse.py b/python-checks/src/test/resources/checks/nestedLoopVariableReuse.py new file mode 100644 index 000000000..51f366d11 --- /dev/null +++ b/python-checks/src/test/resources/checks/nestedLoopVariableReuse.py @@ -0,0 +1,402 @@ +def simple_shadowing(): + for i in range(10): +# ^> {{Outer loop variable.}} + for i in range(5): # Noncompliant {{Rename this loop variable; it shadows the outer loop variable "i".}} +# ^ + pass + + +def long_variable_name_shadowing(): + for item in get_items(): +# ^^^^> {{Outer loop variable.}} + for item in get_sub_items(): # Noncompliant {{Rename this loop variable; it shadows the outer loop variable "item".}} +# ^^^^ + process(item) + + +def shadowing_with_intervening_code(): + for x in range(10): +# ^> {{Outer loop variable.}} + print(x) + if some_condition(): + for x in range(3): # Noncompliant {{Rename this loop variable; it shadows the outer loop variable "x".}} +# ^ + do_something(x) + + +def tuple_unpacking_shadows_outer(): + for i in range(10): +# ^> {{Outer loop variable.}} + for i, j in some_pairs(): # Noncompliant {{Rename this loop variable; it shadows the outer loop variable "i".}} +# ^ + pass + + +def inner_shadows_outer_tuple_element(): + for i, j in some_pairs(): +# ^> {{Outer loop variable.}} + for i in range(5): # Noncompliant {{Rename this loop variable; it shadows the outer loop variable "i".}} +# ^ + pass + + +def three_levels_shadowing(): + for i in range(10): +# ^> {{Outer loop variable.}} + for i in range(5): # Noncompliant {{Rename this loop variable; it shadows the outer loop variable "i".}} +# ^ + for i in range(3): # Noncompliant {{Rename this loop variable; it shadows the outer loop variable "i".}} +# ^ + pass + + +def three_levels_innermost_shadows_two_outers(): + for i in range(10): + for j in range(5): +# ^> {{Outer loop variable.}} + for j in range(3): # Noncompliant {{Rename this loop variable; it shadows the outer loop variable "j".}} +# ^ + pass + + +def both_variables_shadow_respective_outers(): + for i in range(10): + for j in range(5): + for i, j in some_triples(): # Noncompliant 2 + pass + + +def shadowing_inside_with_block(): + for i in range(10): +# ^> {{Outer loop variable.}} + with open("file") as f: + for i in range(5): # Noncompliant {{Rename this loop variable; it shadows the outer loop variable "i".}} +# ^ + pass + + +def shadowing_inside_try_block(): + for n in range(10): +# ^> {{Outer loop variable.}} + try: + for n in range(5): # Noncompliant {{Rename this loop variable; it shadows the outer loop variable "n".}} +# ^ + pass + except Exception: + pass + + +def outer_loop_in_while_body(): + while True: + for k in range(10): +# ^> {{Outer loop variable.}} + for k in range(5): # Noncompliant {{Rename this loop variable; it shadows the outer loop variable "k".}} +# ^ + pass + + +def underscore_plus_real_variable_shadows(): + for k in range(10): +# ^> {{Outer loop variable.}} + for _, k in enumerate(items()): # Noncompliant {{Rename this loop variable; it shadows the outer loop variable "k".}} +# ^ + pass + + +def async_for_shadows_regular_for(): + async def runner(): + for i in range(10): +# ^> {{Outer loop variable.}} + async for i in async_iterable(): # Noncompliant {{Rename this loop variable; it shadows the outer loop variable "i".}} +# ^ + pass + + +def underscore_variable_nested(): + for _ in range(10): + for _ in range(5): # _ is a throwaway variable, not flagged + pass + + +def underscore_prefixed_variable_nested(): + for _item in range(10): + for _item in range(5): # _item starts with _, not flagged + pass + + +def different_variable_names(): + for i in range(10): + for j in range(5): + pass + + +def consecutive_loops_same_name(): + for i in range(10): + pass + for i in range(5): + pass + + +def inner_for_in_nested_function(): + for i in range(10): + def helper(): + for i in range(5): + pass + helper() + + +def inner_for_in_nested_class(): + for i in range(10): + class Helper: + def method(self): + for i in range(5): + pass + + +def inner_for_in_lambda(): + for i in range(10): + transform = lambda i: i * 2 + results = list(map(transform, range(5))) + + +def inner_for_in_list_comprehension(): + for i in range(10): + result = [i * 2 for i in range(5)] + + +def inner_for_in_set_comprehension(): + for i in range(10): + result = {i for i in range(5)} + + +def inner_for_in_dict_comprehension(): + for i in range(10): + result = {i: i * 2 for i in range(5)} + + +def inner_for_in_generator_expr(): + for i in range(10): + result = sum(i for i in range(5)) + + +def tuple_unpacking_no_clash(): + for i in range(10): + for j, k in some_pairs(): + pass + + +def different_names_with_tuples(): + for a, b in some_pairs(): + for c, d in other_pairs(): + pass + + +def async_for_different_names(): + async def runner(): + for item in collection: + async for sub_item in item.children(): + process(sub_item) + + +def single_loop_only(): + for i in range(10): + do_something(i) + + +def deeply_nested_with_multiple_scope_boundaries(): + for i in range(10): + class Outer: + def method(self): + for i in range(5): + def inner(): + for i in range(3): + pass + + + +def async_for_as_outer_shadows_inner(): + async def runner(): + async for i in async_iterable(): +# ^> {{Outer loop variable.}} + for i in range(5): # Noncompliant {{Rename this loop variable; it shadows the outer loop variable "i".}} +# ^ + pass + + +def for_else_body_shadowing(): + for i in range(10): +# ^> {{Outer loop variable.}} + pass + else: + for i in range(5): # Noncompliant {{Rename this loop variable; it shadows the outer loop variable "i".}} +# ^ + pass + + +def for_in_finally_shadows_outer(): + for i in range(10): +# ^> {{Outer loop variable.}} + try: + do_something(i) + finally: + for i in range(5): # Noncompliant {{Rename this loop variable; it shadows the outer loop variable "i".}} +# ^ + pass + + +def three_levels_skip_middle(): + for i in range(10): +# ^> {{Outer loop variable.}} + for j in range(5): + for i in range(3): # Noncompliant {{Rename this loop variable; it shadows the outer loop variable "i".}} +# ^ + pass + + +def outer_for_inside_with(): + with open("file") as f: + for i in f: +# ^> {{Outer loop variable.}} + for i in range(5): # Noncompliant {{Rename this loop variable; it shadows the outer loop variable "i".}} +# ^ + pass + + +def nested_tuple_element_shadows(): + for a, (b, c) in triples(): +# ^> {{Outer loop variable.}} + for b in range(5): # Noncompliant {{Rename this loop variable; it shadows the outer loop variable "b".}} +# ^ + pass + + +def for_in_except_body_shadows_outer(): + for n in range(10): +# ^> {{Outer loop variable.}} + try: + do_something(n) + except ValueError: + for n in range(5): # Noncompliant {{Rename this loop variable; it shadows the outer loop variable "n".}} +# ^ + pass + + + +def async_for_as_outer_different_names(): + async def runner(): + async for item in async_iterable(): + for sub in range(5): + process(item, sub) + + +def for_else_body_different_names(): + for i in range(10): + pass + else: + for j in range(5): + pass + + +def for_in_finally_different_names(): + for i in range(10): + try: + do_something(i) + finally: + for j in range(5): + pass + + +def three_levels_no_clash(): + for i in range(10): + for j in range(5): + for k in range(3): + pass + + +def nested_tuple_no_clash(): + for a, (b, c) in triples(): + for d in range(5): + pass + + +def consecutive_loops_at_class_body_level(): + class MyClass: + for i in range(10): + pass + for i in range(5): + pass + + +def outer_for_inside_with_different_names(): + with open("file") as f: + for line in f: + for word in line.split(): + process(word) + + +def for_in_except_body_different_names(): + for n in range(10): + try: + do_something(n) + except ValueError: + for m in range(5): + pass + + + +def starred_variable_in_outer_for_not_detected(): + # STAR_EXPR targets are not extracted, so *b in outer loop is not tracked + for a, *b in some_pairs(): + for b in range(5): + pass + + +def starred_variable_in_inner_for_not_detected(): + # STAR_EXPR targets are not extracted from inner loop either + for b in range(10): + for a, *b in some_pairs(): + pass + + +def three_levels_scope_boundary_between_1_and_3(): + for i in range(10): + def middle(): + for j in range(5): + for i in range(3): # not flagged — funcdef is a scope boundary + pass + + +def deeply_nested_tuple_variable_shadows(): + for a, (b, (c, d)) in deeply_nested(): +# ^> {{Outer loop variable.}} + for c in range(5): # Noncompliant {{Rename this loop variable; it shadows the outer loop variable "c".}} +# ^ + pass + + +def class_body_nested_loops_same_name(): + class MyClass: + for i in range(10): +# ^> {{Outer loop variable.}} + for i in range(5): # Noncompliant {{Rename this loop variable; it shadows the outer loop variable "i".}} +# ^ + pass + + +def subscript_target_inner_loop_not_detected(): + for i in range(10): + obj = {} + for obj[i] in range(5): + pass + + +def attribute_target_inner_loop_not_detected(): + for i in range(10): + class C: pass + c = C() + for c.i in range(5): + pass + + +for _module_item in range(10): + pass From 5c10cd420b7787441ace1adcf1247b54d0327838 Mon Sep 17 00:00:00 2001 From: "sonar-nigel[bot]" <247337653+sonar-nigel[bot]@users.noreply.github.com> Date: Thu, 26 Mar 2026 16:49:00 +0100 Subject: [PATCH 050/322] SONARPY-3946 Rule S8508 Mutable default values should not be used with "dict.fromkeys()" or "ContextVar()" (#992) Co-authored-by: Sonar Vibe Bot Co-authored-by: Guillaume Dequenne GitOrigin-RevId: eb0532027b854abc510c3de930187e950d00f720 --- .../checks/MutableDefaultValueCheck.java | 111 ++++++ .../python/checks/OpenSourceCheckList.java | 1 + .../org/sonar/l10n/py/rules/python/S8508.html | 60 ++++ .../org/sonar/l10n/py/rules/python/S8508.json | 21 ++ .../checks/MutableDefaultValueCheckTest.java | 29 ++ .../checks/mutableDefaultValueCheck.py | 328 ++++++++++++++++++ 6 files changed, 550 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/MutableDefaultValueCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8508.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8508.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/MutableDefaultValueCheckTest.java create mode 100644 python-checks/src/test/resources/checks/mutableDefaultValueCheck.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/MutableDefaultValueCheck.java b/python-checks/src/main/java/org/sonar/python/checks/MutableDefaultValueCheck.java new file mode 100644 index 000000000..dacb3e2cd --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/MutableDefaultValueCheck.java @@ -0,0 +1,111 @@ +/* + * SonarQube Python Plugin + * Copyright (C) 2011-2025 SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import java.util.List; +import java.util.Set; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.Argument; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.QualifiedExpression; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.tree.TreeUtils; + +@Rule(key = "S8508") +public class MutableDefaultValueCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Replace this mutable value with an immutable default to avoid shared state."; + + private static final TypeMatcher IS_DICT_TYPE = TypeMatchers.isType("builtins.dict"); + private static final TypeMatcher IS_CONTEXT_VAR = TypeMatchers.isType("contextvars.ContextVar"); + private static final TypeMatcher IS_MUTABLE_CONSTRUCTOR = TypeMatchers.any( + TypeMatchers.isType("builtins.list"), + TypeMatchers.isType("builtins.dict"), + TypeMatchers.isType("builtins.set"), + TypeMatchers.isType("builtins.bytearray") + ); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, MutableDefaultValueCheck::checkCall); + } + + private static void checkCall(SubscriptionContext ctx) { + CallExpression callExpression = (CallExpression) ctx.syntaxNode(); + Expression callee = callExpression.callee(); + if (isDictFromkeys(callee, ctx)) { + checkDictFromkeys(ctx, callExpression); + } else if (IS_CONTEXT_VAR.isTrueFor(callee, ctx)) { + checkContextVar(ctx, callExpression); + } + } + + private static boolean isDictFromkeys(Expression callee, SubscriptionContext ctx) { + if (!(callee instanceof QualifiedExpression qualifiedExpr)) { + return false; + } + return "fromkeys".equals(qualifiedExpr.name().name()) + && IS_DICT_TYPE.isTrueFor(qualifiedExpr.qualifier(), ctx); + } + + private static void checkDictFromkeys(SubscriptionContext ctx, CallExpression callExpression) { + List arguments = callExpression.arguments(); + if (arguments.size() < 2) { + return; + } + Argument secondArg = arguments.get(1); + if (secondArg instanceof RegularArgument regularArg && regularArg.keywordArgument() == null) { + checkAndReportIfMutable(regularArg.expression(), ctx); + } + } + + private static void checkContextVar(SubscriptionContext ctx, CallExpression callExpression) { + RegularArgument defaultArg = TreeUtils.argumentByKeyword("default", callExpression.arguments()); + if (defaultArg != null) { + checkAndReportIfMutable(defaultArg.expression(), ctx); + } + } + + private static void checkAndReportIfMutable(Expression value, SubscriptionContext ctx) { + if (isMutableValue(value, ctx)) { + ctx.addIssue(value, MESSAGE); + } + } + + private static boolean isMutableValue(Expression expression, SubscriptionContext ctx) { + if (expression.is(Tree.Kind.LIST_LITERAL) + || expression.is(Tree.Kind.DICTIONARY_LITERAL) + || expression.is(Tree.Kind.SET_LITERAL)) { + return true; + } + if (expression instanceof CallExpression callExpr) { + return IS_MUTABLE_CONSTRUCTOR.isTrueFor(callExpr.callee(), ctx); + } + if (expression instanceof Name name) { + Set values = ctx.valuesAtLocation(name); + return !values.isEmpty() && values.stream().allMatch(v -> isMutableValue(v, ctx)); + } + return false; + } +} diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 0621f4dd4..cd21507f9 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -316,6 +316,7 @@ public Stream> getChecks() { ModifiedParameterValueCheck.class, ModuleNameCheck.class, MultipleWhitespaceCheck.class, + MutableDefaultValueCheck.class, NeedlessPassCheck.class, NestedCollectionsCreationCheck.class, NestedConditionalExpressionCheck.class, diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8508.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8508.html new file mode 100644 index 000000000..cdc9b4022 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8508.html @@ -0,0 +1,60 @@ +

      This rule raises an issue when a mutable object is used as the default value in dict.fromkeys() or contextvars.ContextVar().

      +

      Why is this an issue?

      +

      In Python, when you pass a mutable object as a default value to certain constructs, all instances share the same object reference rather than getting +independent copies. This creates unintended shared state that leads to subtle mutation bugs.

      +

      Python evaluates the default value expression once when the code is defined, not each time it is used. The same object instance is then reused +across all keys or contexts.

      +

      The problem with dict.fromkeys()

      +

      The dict.fromkeys(keys, value) method creates a dictionary with all specified keys pointing to the same value +object. When this value is mutable (like a list or dictionary), all keys share the same object reference:

      +
      +keys = ['a', 'b', 'c']
      +my_dict = dict.fromkeys(keys, [])
      +my_dict['a'].append(1)
      +print(my_dict)  # {'a': [1], 'b': [1], 'c': [1]}
      +
      +

      The problem with ContextVar()

      +

      When you create a ContextVar with a mutable default value, that same object is shared across all contexts, which is particularly +problematic in concurrent code.

      +

      What is the potential impact?

      +
        +
      • Data corruption: changes intended for one key or context accidentally affect others
      • +
      • Concurrency issues: in the case of ContextVar, shared mutable defaults can cause race conditions
      • +
      • Test flakiness: tests may pass or fail inconsistently depending on execution order
      • +
      +

      How to fix it

      +

      For dict.fromkeys(), replace it with a dictionary comprehension that creates a new instance for each key. For +ContextVar(), use a factory pattern or omit the mutable default.

      +

      Code examples

      +

      Noncompliant code example

      +
      +keys = ['a', 'b', 'c']
      +my_dict = dict.fromkeys(keys, [])  # Noncompliant
      +
      +

      Compliant solution

      +
      +keys = ['a', 'b', 'c']
      +my_dict = {key: [] for key in keys}
      +
      +

      Noncompliant code example

      +
      +from contextvars import ContextVar
      +
      +my_var = ContextVar('my_var', default=[])  # Noncompliant
      +
      +

      Compliant solution

      +
      +from contextvars import ContextVar
      +
      +my_var: ContextVar[list] = ContextVar('my_var')
      +
      +

      Resources

      +

      Documentation

      + +

      Related rules

      +
        +
      • S2824 - Function parameters should not have mutable default values
      • +
      diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8508.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8508.json new file mode 100644 index 000000000..b9a0b32cf --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8508.json @@ -0,0 +1,21 @@ +{ + "title": "Mutable default values should not be used with \"dict.fromkeys()\" or \"ContextVar()\"", + "type": "BUG", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5 min" + }, + "tags": [], + "defaultSeverity": "Blocker", + "ruleSpecification": "RSPEC-8508", + "sqKey": "S8508", + "scope": "All", + "quickfix": "unknown", + "code": { + "impacts": { + "RELIABILITY": "BLOCKER" + }, + "attribute": "LOGICAL" + } +} diff --git a/python-checks/src/test/java/org/sonar/python/checks/MutableDefaultValueCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/MutableDefaultValueCheckTest.java new file mode 100644 index 000000000..39057e8a9 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/MutableDefaultValueCheckTest.java @@ -0,0 +1,29 @@ +/* + * SonarQube Python Plugin + * Copyright (C) 2011-2025 SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.junit.jupiter.api.Test; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class MutableDefaultValueCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/mutableDefaultValueCheck.py", new MutableDefaultValueCheck()); + } + +} diff --git a/python-checks/src/test/resources/checks/mutableDefaultValueCheck.py b/python-checks/src/test/resources/checks/mutableDefaultValueCheck.py new file mode 100644 index 000000000..7b143cbe8 --- /dev/null +++ b/python-checks/src/test/resources/checks/mutableDefaultValueCheck.py @@ -0,0 +1,328 @@ +def noncompliant_examples(): + """Examples that should trigger the rule.""" + + # Section: dict.fromkeys with list literal + def dict_fromkeys_list_literal(): + keys = ['a', 'b', 'c'] + my_dict = dict.fromkeys(keys, []) # Noncompliant {{Replace this mutable value with an immutable default to avoid shared state.}} + # ^^ + + def dict_fromkeys_dict_literal(): + keys = ['a', 'b', 'c'] + my_dict = dict.fromkeys(keys, {}) # Noncompliant {{Replace this mutable value with an immutable default to avoid shared state.}} + # ^^ + + def dict_fromkeys_set_literal(): + keys = ['a', 'b', 'c'] + my_dict = dict.fromkeys(keys, {1, 2, 3}) # Noncompliant {{Replace this mutable value with an immutable default to avoid shared state.}} + # ^^^^^^^^^ + + def dict_fromkeys_list_constructor(): + keys = ['a', 'b', 'c'] + my_dict = dict.fromkeys(keys, list()) # Noncompliant {{Replace this mutable value with an immutable default to avoid shared state.}} + # ^^^^^^ + + def dict_fromkeys_dict_constructor(): + keys = ['a', 'b', 'c'] + my_dict = dict.fromkeys(keys, dict()) # Noncompliant + # ^^^^^^ + + def dict_fromkeys_set_constructor(): + keys = ['a', 'b', 'c'] + my_dict = dict.fromkeys(keys, set()) # Noncompliant + # ^^^^^ + + def dict_fromkeys_bytearray_constructor(): + keys = ['a', 'b', 'c'] + my_dict = dict.fromkeys(keys, bytearray()) # Noncompliant + # ^^^^^^^^^^^ + + def dict_fromkeys_list_with_elements(): + keys = ['a', 'b', 'c'] + my_dict = dict.fromkeys(keys, [1, 2, 3]) # Noncompliant + # ^^^^^^^^^ + + def dict_fromkeys_dict_with_elements(): + keys = ['a', 'b', 'c'] + my_dict = dict.fromkeys(keys, {'x': 1}) # Noncompliant + # ^^^^^^^^ + + def dict_fromkeys_from_import(): + from builtins import dict as d + keys = range(5) + my_dict = d.fromkeys(keys, []) # Noncompliant + # ^^ + + # Section: ContextVar with mutable defaults + def contextvar_list_literal(): + from contextvars import ContextVar + my_var = ContextVar('my_var', default=[]) # Noncompliant + # ^^ + + def contextvar_dict_literal(): + from contextvars import ContextVar + my_var = ContextVar('my_var', default={}) # Noncompliant + # ^^ + + def contextvar_set_literal(): + from contextvars import ContextVar + my_var = ContextVar('counter', default={1, 2}) # Noncompliant + # ^^^^^^ + + def contextvar_list_constructor(): + from contextvars import ContextVar + my_var = ContextVar('my_var', default=list()) # Noncompliant + # ^^^^^^ + + def contextvar_dict_constructor(): + from contextvars import ContextVar + my_var = ContextVar('my_var', default=dict()) # Noncompliant + # ^^^^^^ + + def contextvar_set_constructor(): + from contextvars import ContextVar + my_var = ContextVar('my_var', default=set()) # Noncompliant + # ^^^^^ + + def contextvar_bytearray_constructor(): + from contextvars import ContextVar + my_var = ContextVar('buffer', default=bytearray()) # Noncompliant + # ^^^^^^^^^^^ + + def contextvar_list_with_elements(): + from contextvars import ContextVar + my_var = ContextVar('items', default=[1, 2, 3]) # Noncompliant + # ^^^^^^^^^ + + def contextvar_fully_qualified(): + import contextvars + my_var = contextvars.ContextVar('my_var', default=[]) # Noncompliant + # ^^ + + def dict_fromkeys_bytearray_with_args(): + keys = ['x', 'y'] + my_dict = dict.fromkeys(keys, bytearray(b'abc')) # Noncompliant + # ^^^^^^^^^^^^^^^^^ + + # Section: Variable propagation via reaching definitions analysis + def dict_fromkeys_variable_default(): + keys = ['a', 'b', 'c'] + default_value = [] + my_dict = dict.fromkeys(keys, default_value) # Noncompliant + # ^^^^^^^^^^^^^ + + def contextvar_variable_default(): + from contextvars import ContextVar + initial = [] + my_var = ContextVar('my_var', default=initial) # Noncompliant + # ^^^^^^^ + + def dict_fromkeys_variable_dict_literal(): + keys = ['a', 'b', 'c'] + default_value = {} + my_dict = dict.fromkeys(keys, default_value) # Noncompliant + # ^^^^^^^^^^^^^ + + def dict_fromkeys_variable_set_literal(): + keys = ['a', 'b', 'c'] + default_value = {1, 2} + my_dict = dict.fromkeys(keys, default_value) # Noncompliant + # ^^^^^^^^^^^^^ + + def dict_fromkeys_variable_list_constructor(): + keys = ['a', 'b', 'c'] + default_value = list() + my_dict = dict.fromkeys(keys, default_value) # Noncompliant + # ^^^^^^^^^^^^^ + + def contextvar_variable_dict_constructor(): + from contextvars import ContextVar + initial = dict() + my_var = ContextVar('my_var', default=initial) # Noncompliant + # ^^^^^^^ + + # Section: Conditional assignment where all branches are mutable + def dict_fromkeys_conditional_all_mutable(): + keys = ['a', 'b', 'c'] + if some_condition: + default_value = [] + else: + default_value = {} + my_dict = dict.fromkeys(keys, default_value) # Noncompliant + # ^^^^^^^^^^^^^ + + def contextvar_conditional_all_mutable(): + from contextvars import ContextVar + if some_condition: + initial = set() + else: + initial = [] + my_var = ContextVar('my_var', default=initial) # Noncompliant + # ^^^^^^^ + + +def compliant_examples(): + """Examples that should NOT trigger the rule.""" + + def dict_fromkeys_no_default(): + # No second argument — no shared mutable default + keys = ['a', 'b', 'c'] + my_dict = dict.fromkeys(keys) + + def dict_fromkeys_none_default(): + keys = ['a', 'b', 'c'] + my_dict = dict.fromkeys(keys, None) + + def dict_fromkeys_string_default(): + keys = ['a', 'b', 'c'] + my_dict = dict.fromkeys(keys, "default") + + def dict_fromkeys_int_default(): + keys = ['a', 'b', 'c'] + my_dict = dict.fromkeys(keys, 0) + + def dict_fromkeys_tuple_default(): + keys = ['a', 'b', 'c'] + my_dict = dict.fromkeys(keys, (1, 2, 3)) + + def dict_fromkeys_frozenset_default(): + keys = ['a', 'b', 'c'] + my_dict = dict.fromkeys(keys, frozenset({1, 2, 3})) + + def dict_fromkeys_function_return_default(): + # Cannot determine what compute_default() returns statically + def compute_default(): + return [] + keys = ['a', 'b', 'c'] + my_dict = dict.fromkeys(keys, compute_default()) + + def contextvar_no_default(): + from contextvars import ContextVar + my_var = ContextVar('my_var') + + def contextvar_none_default(): + from contextvars import ContextVar + my_var = ContextVar('my_var', default=None) + + def contextvar_string_default(): + from contextvars import ContextVar + my_var = ContextVar('my_var', default="initial") + + def contextvar_int_default(): + from contextvars import ContextVar + my_var = ContextVar('counter', default=0) + + def contextvar_tuple_default(): + from contextvars import ContextVar + my_var = ContextVar('my_var', default=(1, 2, 3)) + + def contextvar_frozenset_default(): + from contextvars import ContextVar + my_var = ContextVar('my_var', default=frozenset({1, 2})) + + def contextvar_function_return_default(): + from contextvars import ContextVar + def make_default(): + return [] + my_var = ContextVar('my_var', default=make_default()) + + def dict_fromkeys_conditional_one_immutable(): + # At least one branch assigns an immutable value — do not raise + keys = ['a', 'b', 'c'] + if some_condition: + default_value = [] + else: + default_value = None + my_dict = dict.fromkeys(keys, default_value) + + def contextvar_conditional_one_immutable(): + from contextvars import ContextVar + if some_condition: + initial = "safe" + else: + initial = [] + my_var = ContextVar('my_var', default=initial) + + def dict_fromkeys_variable_immutable(): + keys = ['a', 'b', 'c'] + default_value = 0 + my_dict = dict.fromkeys(keys, default_value) + + def contextvar_variable_immutable(): + from contextvars import ContextVar + initial = "hello" + my_var = ContextVar('my_var', default=initial) + + def dict_fromkeys_variable_from_function(): + # Function return — reaching definitions won't resolve this + keys = ['a', 'b', 'c'] + default_value = some_function() + my_dict = dict.fromkeys(keys, default_value) + + def not_dict_fromkeys(): + # A different class with a fromkeys method — not builtins.dict + class MyMapping: + @classmethod + def fromkeys(cls, keys, value=None): + return {} + my_dict = MyMapping.fromkeys(['a', 'b'], []) + + def not_context_var(): + # A class also named ContextVar but not from contextvars + class ContextVar: + def __init__(self, name, default=None): + pass + my_var = ContextVar('my_var', default=[]) + + +def edge_cases(): + """Corner cases and static analysis limitations.""" + + def dict_fromkeys_keyword_second_arg(): + # Second arg passed as keyword — not checked (only positional at index 1 is inspected) + keys = ['a', 'b', 'c'] + my_dict = dict.fromkeys(keys, value=[]) + + def dict_fromkeys_starred_args(): + # Unpacked positional args — static analysis cannot inspect the value + keys = ['a', 'b', 'c'] + args = (keys, []) + my_dict = dict.fromkeys(*args) + + def contextvar_positional_default(): + # Default passed positionally rather than by keyword — not flagged + # because the check only inspects the 'default' keyword argument + from contextvars import ContextVar + my_var = ContextVar('my_var', []) + + def dict_fromkeys_chained_non_constructor_call(): + # A call that happens to return a list but is not a recognised constructor + keys = ['a', 'b', 'c'] + my_dict = dict.fromkeys(keys, sorted([3, 1, 2])) + + def contextvar_mutable_from_non_constructor(): + # A function that returns a list but is not a recognised mutable constructor + from contextvars import ContextVar + def make_list(): + return [1, 2, 3] + my_var = ContextVar('my_var', default=make_list()) + + def dict_fromkeys_nested_mutable_in_tuple(): + # The default is a tuple (immutable), even though it contains a list — + # the outer container determines immutability for this check + keys = ['a', 'b', 'c'] + my_dict = dict.fromkeys(keys, ([],)) + + def contextvar_inside_class(): + from contextvars import ContextVar + + class MyService: + state: ContextVar = ContextVar('state', default=[]) # Noncompliant + # ^^ + config: ContextVar = ContextVar('config', default={}) # Noncompliant + # ^^ + + def dict_fromkeys_inside_nested_function(): + def build_mapping(key_list): + return dict.fromkeys(key_list, set()) # Noncompliant + # ^^^^^ From 8401c22ab53cc36047ae30f39a4243fb2258f1b7 Mon Sep 17 00:00:00 2001 From: "sonar-nigel[bot]" <247337653+sonar-nigel[bot]@users.noreply.github.com> Date: Fri, 27 Mar 2026 11:21:20 +0100 Subject: [PATCH 051/322] SONARPY-3941 Rule S8509 Classes should not inherit from the same base class multiple times (#979) Co-authored-by: Sonar Vibe Bot Co-authored-by: joke1196 GitOrigin-RevId: a0640cc32e6b22f696b79fbd4b6cf710354ef909 --- .../checks/DuplicateBaseClassCheck.java | 87 ++++++++++++++++ .../python/checks/OpenSourceCheckList.java | 1 + .../org/sonar/l10n/py/rules/python/S8509.html | 25 +++++ .../org/sonar/l10n/py/rules/python/S8509.json | 24 +++++ .../checks/DuplicateBaseClassCheckTest.java | 33 +++++++ .../resources/checks/duplicateBaseClass.py | 99 +++++++++++++++++++ .../checks/duplicateBaseClassCompliant.py | 32 ++++++ 7 files changed, 301 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/DuplicateBaseClassCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8509.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8509.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/DuplicateBaseClassCheckTest.java create mode 100644 python-checks/src/test/resources/checks/duplicateBaseClass.py create mode 100644 python-checks/src/test/resources/checks/duplicateBaseClassCompliant.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/DuplicateBaseClassCheck.java b/python-checks/src/main/java/org/sonar/python/checks/DuplicateBaseClassCheck.java new file mode 100644 index 000000000..007bd0687 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/DuplicateBaseClassCheck.java @@ -0,0 +1,87 @@ +/* + * SonarQube Python Plugin + * Copyright (C) 2011-2025 SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import javax.annotation.CheckForNull; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.ArgList; +import org.sonar.plugins.python.api.tree.Argument; +import org.sonar.plugins.python.api.tree.ClassDef; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.FullyQualifiedNameHelper; + +@Rule(key = "S8509") +public class DuplicateBaseClassCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Remove this duplicate base class."; + private static final String SECONDARY_MESSAGE = "Already listed here."; + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.CLASSDEF, ctx -> checkClassDef((ClassDef) ctx.syntaxNode(), ctx)); + } + + private static void checkClassDef(ClassDef classDef, SubscriptionContext ctx) { + ArgList args = classDef.args(); + if (args == null) { + return; + } + var duplicates = gatherDuplicates(args); + raiseOnDuplicates(duplicates, ctx); + } + + private static Map> gatherDuplicates(ArgList args) { + Map> groups = new LinkedHashMap<>(); + for (Argument argument : args.arguments()) { + if (argument instanceof RegularArgument regularArgument) { + if (regularArgument.keywordArgument() != null) { + continue; + } + String key = expressionKey(regularArgument.expression()); + if (key != null) { + groups.computeIfAbsent(key, k -> new ArrayList<>()).add(regularArgument); + } + } + } + return groups; + } + + private static void raiseOnDuplicates(Map> duplicates, SubscriptionContext ctx) { + for (List group : duplicates.values()) { + if (group.size() > 1) { + RegularArgument first = group.get(0); + PreciseIssue issue = ctx.addIssue(first.expression(), MESSAGE); + for (int i = 1; i < group.size(); i++) { + issue.secondary(group.get(i).expression(), SECONDARY_MESSAGE); + } + } + } + } + + @CheckForNull + private static String expressionKey(Expression expression) { + return FullyQualifiedNameHelper.getFullyQualifiedName(expression.typeV2()).orElse(null); + } +} diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index cd21507f9..7e470b3bd 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -200,6 +200,7 @@ public Stream> getChecks() { DjangoRenderContextCheck.class, DoublePrefixOperatorCheck.class, DuplicateArgumentCheck.class, + DuplicateBaseClassCheck.class, DuplicatedMethodFieldNamesCheck.class, DuplicatedMethodImplementationCheck.class, DuplicatesInCharacterClassCheck.class, diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8509.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8509.html new file mode 100644 index 000000000..0a15ca383 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8509.html @@ -0,0 +1,25 @@ +

      This rule raises an issue when the same class appears more than once in the inheritance list of a class definition.

      +

      Why is this an issue?

      +

      In Python, a class definition can inherit from one or more base classes. When the same base class appears multiple times in the inheritance list, +it serves no purpose and is always a programming error. Python's Method Resolution Order (MRO) ensures that each class appears only once in the +inheritance chain, even if it is listed multiple times.

      +

      This typically happens due to copy-paste errors, misunderstanding of inheritance, or refactoring mistakes.

      +

      How to fix it

      +

      Remove the duplicate base class from the inheritance list, keeping only one occurrence.

      +

      Code examples

      +

      Noncompliant code example

      +
      +class MyWidget(QWidget, Serializable, QWidget):  # Noncompliant
      +    pass
      +
      +

      Compliant solution

      +
      +class MyWidget(QWidget, Serializable):
      +    pass
      +
      +

      Resources

      +

      Documentation

      + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8509.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8509.json new file mode 100644 index 000000000..a8bfc1c82 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8509.json @@ -0,0 +1,24 @@ +{ + "title": "Classes should not inherit from the same base class multiple times", + "type": "CODE_SMELL", + "code": { + "impacts": { + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "CLEAR" + }, + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "confusing", + "suspicious" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-8509", + "sqKey": "S8509", + "scope": "All", + "quickfix": "unknown" +} diff --git a/python-checks/src/test/java/org/sonar/python/checks/DuplicateBaseClassCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/DuplicateBaseClassCheckTest.java new file mode 100644 index 000000000..fcc891324 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/DuplicateBaseClassCheckTest.java @@ -0,0 +1,33 @@ +/* + * SonarQube Python Plugin + * Copyright (C) 2011-2025 SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.junit.jupiter.api.Test; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class DuplicateBaseClassCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/duplicateBaseClass.py", new DuplicateBaseClassCheck()); + } + + @Test + void test_no_issue() { + PythonCheckVerifier.verifyNoIssue("src/test/resources/checks/duplicateBaseClassCompliant.py", new DuplicateBaseClassCheck()); + } +} diff --git a/python-checks/src/test/resources/checks/duplicateBaseClass.py b/python-checks/src/test/resources/checks/duplicateBaseClass.py new file mode 100644 index 000000000..5e01530fa --- /dev/null +++ b/python-checks/src/test/resources/checks/duplicateBaseClass.py @@ -0,0 +1,99 @@ +from os import PathLike +import my_class +from my_class import A, B, C, X, mixin +import a +import mod +# Examples with issues: + +# Duplicate base with a resolved fully-qualified symbol (exercises the FQN path in expressionKey) +class ResolvedSymbolDuplicate(PathLike, PathLike): # Noncompliant {{Remove this duplicate base class.}} +# ^^^^^^^^ ^^^^^^^^< {{Already listed here.}} + pass + +class SimpleEndDuplicate(A, B, A): # Noncompliant {{Remove this duplicate base class.}} +# ^ ^< {{Already listed here.}} + pass + +class MidAndEndDuplicate(A, B, my_class.B): # Noncompliant {{Remove this duplicate base class.}} +# ^ ^^^^^^^^^^< {{Already listed here.}} + pass + +class QualifiedDuplicate(mod.Base, Other, mod.Base): # Noncompliant {{Remove this duplicate base class.}} +# ^^^^^^^^ ^^^^^^^^< {{Already listed here.}} + pass + +# One issue with two secondaries (2nd and 3rd are duplicates of 1st) +class TripleDuplicate(A, A, A): # Noncompliant {{Remove this duplicate base class.}} +# ^ ^< {{Already listed here.}} +# ^@-1< {{Already listed here.}} + pass + +# metaclass keyword argument is skipped, duplicate among positional bases still flagged +class WithMetaclassDuplicate(A, B, A, metaclass=Meta): # Noncompliant + pass + +# Two separate groups of duplicates (2 issues: one for A, one for B) +class TwoPairsDuplicates(A, B, A, B): # Noncompliant 2 + pass + +class ManyBasesDuplicate(A, B, C, D, B): # Noncompliant + pass + +class DeepQualifiedDuplicate(a.b.C, D, a.b.C): # Noncompliant + pass + +# One issue with two secondaries (2nd and 3rd are duplicates of 1st) +class ThreeTimeDuplicate(mixin, mixin, mixin): # Noncompliant +# ^^^^^ ^^^^^< ^^^^^< + pass + +# Star-unpacking is skipped; duplicate among remaining RegularArguments is still detected +class StarAndDuplicate(*extra, A, A): # Noncompliant + pass + +# Name with a symbol but no fully-qualified name (parameter symbol has no FQN) +def make_class(other): + class Inner(other, other): # FN + pass + +# Compliant examples: + +class NoBaseClass: + pass + +class SingleBase(A): + pass + +class MultipleUnique(A, B, C): + pass + +class MultipleUniqueQualified(mod.A, mod.B, mod.C): + pass + +class OnlyMetaclass(metaclass=Meta): + pass + +class UniqueBasesWithMetaclass(A, B, metaclass=Meta): + pass + +# Subscript expressions yield a null key, so duplicates are not detected +class GenericSubscript(Generic[T]): + pass + +class TwoIdenticalSubscripts(Generic[T], Generic[T]): + pass + +class SubscriptAndName(Generic[T], Base): + pass + +# Call expressions yield a null key, so duplicates are not detected +class TwoCallBases(make_base(), make_base()): + pass + +# Qualified name whose qualifier is a call result — null key, no issue +class CallQualifiedBase(obj.method().Attr, obj.method().Attr): + pass + +# Deep qualified expression where an intermediate qualifier is a call result — null key via recursive path +class DeepCallQualifiedBase(a.b().c.D, a.b().c.D): + pass diff --git a/python-checks/src/test/resources/checks/duplicateBaseClassCompliant.py b/python-checks/src/test/resources/checks/duplicateBaseClassCompliant.py new file mode 100644 index 000000000..6af0f2cf2 --- /dev/null +++ b/python-checks/src/test/resources/checks/duplicateBaseClassCompliant.py @@ -0,0 +1,32 @@ +class NoBaseClass: + pass + +class SingleBase(A): + pass + +class MultipleUnique(A, B, C): + pass + +class MultipleUniqueQualified(mod.A, mod.B, mod.C): + pass + +class OnlyMetaclass(metaclass=Meta): + pass + +class UniqueBasesWithMetaclass(A, B, metaclass=Meta): + pass + +class GenericSubscript(Generic[T]): + pass + +class TwoIdenticalSubscripts(Generic[T], Generic[T]): + pass + +class SubscriptAndName(Generic[T], Base): + pass + +class TwoCallBases(make_base(), make_base()): + pass + +class CallQualifiedBase(obj.method().Attr, obj.method().Attr): + pass From a9043e49dd5a60713516b41ab021550c35b64f96 Mon Sep 17 00:00:00 2001 From: "sonar-nigel[bot]" <247337653+sonar-nigel[bot]@users.noreply.github.com> Date: Fri, 27 Mar 2026 15:20:04 +0100 Subject: [PATCH 052/322] SONARPY-3980 Rule S8515 TypeVars should not be both covariant and contravariant (#1014) GitOrigin-RevId: e1596360a39433be9b8b6783cb293b438cab9962 --- .../python/checks/OpenSourceCheckList.java | 1 + ...TypeVarCovariantAndContravariantCheck.java | 61 ++++++++++ .../org/sonar/l10n/py/rules/python/S8515.html | 41 +++++++ .../org/sonar/l10n/py/rules/python/S8515.json | 15 +++ ...VarCovariantAndContravariantCheckTest.java | 30 +++++ .../typeVarCovariantAndContravariant.py | 111 ++++++++++++++++++ 6 files changed, 259 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/TypeVarCovariantAndContravariantCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8515.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8515.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/TypeVarCovariantAndContravariantCheckTest.java create mode 100644 python-checks/src/test/resources/checks/typeVarCovariantAndContravariant.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 7e470b3bd..1c8235c60 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -440,6 +440,7 @@ public Stream> getChecks() { TrailingCommentCheck.class, TrailingWhitespaceCheck.class, TypeAliasAnnotationCheck.class, + TypeVarCovariantAndContravariantCheck.class, TfFunctionDependOnOutsideVariableCheck.class, TfFunctionRecursivityCheck.class, TfInputShapeOnModelSubclassCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/TypeVarCovariantAndContravariantCheck.java b/python-checks/src/main/java/org/sonar/python/checks/TypeVarCovariantAndContravariantCheck.java new file mode 100644 index 000000000..cf5721d47 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/TypeVarCovariantAndContravariantCheck.java @@ -0,0 +1,61 @@ +/* + * SonarQube Python Plugin + * Copyright (C) 2011-2025 SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.checks.utils.Expressions; +import org.sonar.python.tree.TreeUtils; + +@Rule(key = "S8515") +public class TypeVarCovariantAndContravariantCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Remove either \"covariant=True\" or \"contravariant=True\"; a TypeVar cannot be both covariant and contravariant."; + private static final TypeMatcher TYPEVAR_MATCHER = TypeMatchers.any( + TypeMatchers.isType("typing.TypeVar"), + TypeMatchers.isType("typing_extensions.TypeVar") + ); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, TypeVarCovariantAndContravariantCheck::checkTypeVarCall); + } + + private static void checkTypeVarCall(SubscriptionContext ctx) { + CallExpression call = (CallExpression) ctx.syntaxNode(); + if (!TYPEVAR_MATCHER.isTrueFor(call.callee(), ctx)) { + return; + } + RegularArgument covariantArg = TreeUtils.argumentByKeyword("covariant", call.arguments()); + if (covariantArg == null) { + return; + } + RegularArgument contravariantArg = TreeUtils.argumentByKeyword("contravariant", call.arguments()); + if (contravariantArg == null) { + return; + } + if (Expressions.isTruthy(covariantArg.expression()) && Expressions.isTruthy(contravariantArg.expression())) { + ctx.addIssue(call.callee(), MESSAGE); + } + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8515.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8515.html new file mode 100644 index 000000000..6358facd4 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8515.html @@ -0,0 +1,41 @@ +

      This rule raises an issue when a TypeVar is declared with both covariant=True and contravariant=True.

      +

      Why is this an issue?

      +

      A TypeVar in Python represents a type variable used in generic programming. It can have one of three variance modes:

      +
        +
      • invariant, the default: the type must match exactly
      • +
      • covariant with covariant=True: the type can be replaced with a subtype
      • +
      • contravariant with contravariant=True: the type can be replaced with a supertype
      • +
      +

      These variance modes are mutually exclusive. A type variable cannot be both covariant and contravariant simultaneously because these represent opposite relationships in the type hierarchy. Python's typing module will raise a ValueError at runtime when it encounters such a declaration.

      +

      What is the potential impact?

      +
        +
      • Python raises a ValueError when the module is imported, causing the application to crash immediately.
      • +
      • Static type checkers cannot analyze the code properly, reducing confidence in the type safety of the codebase.
      • +
      +

      How to fix it

      +

      Choose the appropriate variance mode for your type variable:

      +
        +
      • if you need covariance to allow subtypes, use only covariant=True
      • +
      • if you need contravariance to allow supertypes, use only contravariant=True
      • +
      • if you need exact type matching, omit both parameters for the default invariant behavior
      • +
      +

      Code examples

      +

      Noncompliant code example

      +
      +from typing import TypeVar
      +
      +T = TypeVar('T', covariant=True, contravariant=True)  # Noncompliant
      +
      +

      Compliant solution

      +
      +from typing import TypeVar
      +
      +T_co = TypeVar('T_co', covariant=True)
      +
      +

      Resources

      +

      Documentation

      + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8515.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8515.json new file mode 100644 index 000000000..3a429f4bc --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8515.json @@ -0,0 +1,15 @@ +{ + "title": "TypeVars should not be both covariant and contravariant", + "type": "BUG", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [], + "defaultSeverity": "Blocker", + "ruleSpecification": "RSPEC-8515", + "sqKey": "S8515", + "scope": "All", + "quickfix": "unknown" +} diff --git a/python-checks/src/test/java/org/sonar/python/checks/TypeVarCovariantAndContravariantCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/TypeVarCovariantAndContravariantCheckTest.java new file mode 100644 index 000000000..78b23c1ad --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/TypeVarCovariantAndContravariantCheckTest.java @@ -0,0 +1,30 @@ +/* + * SonarQube Python Plugin + * Copyright (C) 2011-2025 SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.junit.jupiter.api.Test; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class TypeVarCovariantAndContravariantCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify( + "src/test/resources/checks/typeVarCovariantAndContravariant.py", + new TypeVarCovariantAndContravariantCheck()); + } +} diff --git a/python-checks/src/test/resources/checks/typeVarCovariantAndContravariant.py b/python-checks/src/test/resources/checks/typeVarCovariantAndContravariant.py new file mode 100644 index 000000000..57c48c176 --- /dev/null +++ b/python-checks/src/test/resources/checks/typeVarCovariantAndContravariant.py @@ -0,0 +1,111 @@ +from typing import TypeVar +from typing import TypeVar as TV +from typing_extensions import TypeVar as ExtTV +import typing +import typing_extensions + +T1 = TypeVar('T1', covariant=True, contravariant=True) # Noncompliant +# ^^^^^^^ +T2 = TypeVar('T2', contravariant=True, covariant=True) # Noncompliant +# ^^^^^^^ +T3 = TypeVar('T3', int, str, covariant=True, contravariant=True) # Noncompliant +# ^^^^^^^ +T4 = TypeVar('T4', bound=int, covariant=True, contravariant=True) # Noncompliant +# ^^^^^^^ +T5 = typing.TypeVar('T5', covariant=True, contravariant=True) # Noncompliant +# ^^^^^^^^^^^^^^ +T6 = typing_extensions.TypeVar('T6', covariant=True, contravariant=True) # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^^^^^^ + +cov = True +T7 = TypeVar('T7', covariant=cov, contravariant=True) # Noncompliant +# ^^^^^^^ + +contra = True +T8 = TypeVar('T8', covariant=True, contravariant=contra) # Noncompliant +# ^^^^^^^ + +cov2 = True +contra2 = True +T9 = TypeVar('T9', covariant=cov2, contravariant=contra2) # Noncompliant +# ^^^^^^^ + + +T_co = TypeVar('T_co', covariant=True) +T_contra = TypeVar('T_contra', contravariant=True) +T_inv = TypeVar('T_inv') +T_inv2 = TypeVar('T_inv2', covariant=False, contravariant=False) +T_inv3 = TypeVar('T_inv3', covariant=True, contravariant=False) +T_inv4 = TypeVar('T_inv4', covariant=False, contravariant=True) +T_ext_co = typing_extensions.TypeVar('T_ext_co', covariant=True) +T_ext_contra = typing_extensions.TypeVar('T_ext_contra', contravariant=True) + + +def get_flag(): + return True + + +T_unk = TypeVar('T_unk', covariant=get_flag(), contravariant=True) +T_unk2 = TypeVar('T_unk2', covariant=True, contravariant=get_flag()) + + +def my_func(name, covariant=False, contravariant=False): + pass + + +my_func('X', covariant=True, contravariant=True) + + +cov3 = False +cov3 = True +T_fn = TypeVar('T_fn', covariant=cov3, contravariant=True) + +cov_false = False +T_false_name = TypeVar('T_false_name', covariant=cov_false, contravariant=True) + +T_num_noncompliant = TypeVar('T_num_noncompliant', covariant=1, contravariant=1) # Noncompliant +T_num_mixed = TypeVar('T_num_mixed', covariant=1, contravariant=True) # Noncompliant + +T_num_zero_cov = TypeVar('T_num_zero_cov', covariant=0, contravariant=True) +T_num_zero_contra = TypeVar('T_num_zero_contra', covariant=True, contravariant=0) +T_num_zero_both = TypeVar('T_num_zero_both', covariant=0, contravariant=0) + +T_float_zero_cov = TypeVar('T_float_zero_cov', covariant=0.0, contravariant=True) +T_float_zero_contra = TypeVar('T_float_zero_contra', covariant=True, contravariant=0.0) + +T_complex_zero_cov = TypeVar('T_complex_zero_cov', covariant=0j, contravariant=True) +T_complex_zero_contra = TypeVar('T_complex_zero_contra', covariant=True, contravariant=0j) + +T_none_cov = TypeVar('T_none_cov', covariant=None, contravariant=True) +T_none_contra = TypeVar('T_none_contra', covariant=True, contravariant=None) + +T_str_noncompliant = TypeVar('T_str_noncompliant', covariant="yes", contravariant=True) # Noncompliant +T_str_empty_cov = TypeVar('T_str_empty_cov', covariant="", contravariant=True) + +T_list_empty_cov = TypeVar('T_list_empty_cov', covariant=[], contravariant=True) +T_list_empty_contra = TypeVar('T_list_empty_contra', covariant=True, contravariant=[]) +T_list_nonempty = TypeVar('T_list_nonempty', covariant=[1], contravariant=True) # Noncompliant + +T_tuple_empty_cov = TypeVar('T_tuple_empty_cov', covariant=(), contravariant=True) +T_tuple_empty_contra = TypeVar('T_tuple_empty_contra', covariant=True, contravariant=()) +T_tuple_nonempty = TypeVar('T_tuple_nonempty', covariant=(1,), contravariant=True) # Noncompliant + +T_dict_empty_cov = TypeVar('T_dict_empty_cov', covariant={}, contravariant=True) +T_dict_empty_contra = TypeVar('T_dict_empty_contra', covariant=True, contravariant={}) +T_dict_nonempty = TypeVar('T_dict_nonempty', covariant={1: 2}, contravariant=True) # Noncompliant + +T_set_nonempty = TypeVar('T_set_nonempty', covariant={1, 2}, contravariant=True) # Noncompliant + +T_ext_inv = typing_extensions.TypeVar('T_ext_inv', covariant=False, contravariant=False) + +T_alias = TV('T_alias', covariant=True, contravariant=True) # Noncompliant +# ^^ +T_ext_alias = ExtTV('T_ext_alias', covariant=True, contravariant=True) # Noncompliant +# ^^^^^ + +T_str_contra_truthy = TypeVar('T_str_contra_truthy', covariant=True, contravariant="yes") # Noncompliant +# ^^^^^^^ +T_str_empty_contra = TypeVar('T_str_empty_contra', covariant=True, contravariant="") + +kwargs_with_covariant = {'covariant': True, 'contravariant': True} +T_kwargs_unpacked = TypeVar('T_kwargs_unpacked', **kwargs_with_covariant) From f27a7c9c3e6c0082f927b57e039038b7c8139053 Mon Sep 17 00:00:00 2001 From: "hashicorp-vault-sonar-prod[bot]" <111297361+hashicorp-vault-sonar-prod[bot]@users.noreply.github.com> Date: Fri, 27 Mar 2026 14:53:09 +0000 Subject: [PATCH 053/322] Prepare for next development iteration (previous release was done on the 23rd of March) (#1022) Co-authored-by: Seppli11 <9285506+Seppli11@users.noreply.github.com> GitOrigin-RevId: 8d3bee7c1bfa9cf8a86743cfb982d27d04738278 --- docs/pom.xml | 2 +- docs/python-custom-rules-example/pom.xml | 2 +- its/commons/pom.xml | 2 +- its/plugin/it-python-plugin-test/pom.xml | 2 +- its/plugin/pom.xml | 2 +- its/plugin/python-custom-rules-plugin/pom.xml | 2 +- its/pom.xml | 2 +- pom.xml | 2 +- python-checks-testkit/pom.xml | 2 +- python-checks/pom.xml | 2 +- python-commons/pom.xml | 2 +- python-frontend/pom.xml | 2 +- sonar-python-plugin/pom.xml | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/pom.xml b/docs/pom.xml index b38c6856f..5d47b5eb7 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.python python - 5.20-SNAPSHOT + 5.21-SNAPSHOT docs diff --git a/docs/python-custom-rules-example/pom.xml b/docs/python-custom-rules-example/pom.xml index 4c40f44a3..ac2a78120 100644 --- a/docs/python-custom-rules-example/pom.xml +++ b/docs/python-custom-rules-example/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python docs - 5.20-SNAPSHOT + 5.21-SNAPSHOT python-custom-rules-example diff --git a/its/commons/pom.xml b/its/commons/pom.xml index ea6d73076..61efaa5c5 100644 --- a/its/commons/pom.xml +++ b/its/commons/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python python-its - 5.20-SNAPSHOT + 5.21-SNAPSHOT Python :: ITs :: Commons diff --git a/its/plugin/it-python-plugin-test/pom.xml b/its/plugin/it-python-plugin-test/pom.xml index 1bc56646c..a8a8f9065 100644 --- a/its/plugin/it-python-plugin-test/pom.xml +++ b/its/plugin/it-python-plugin-test/pom.xml @@ -7,7 +7,7 @@ it-python-plugin org.sonarsource.python - 5.20-SNAPSHOT + 5.21-SNAPSHOT it-python-plugin-test diff --git a/its/plugin/pom.xml b/its/plugin/pom.xml index 7e62daae3..5b8f257d7 100644 --- a/its/plugin/pom.xml +++ b/its/plugin/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.python python-its - 5.20-SNAPSHOT + 5.21-SNAPSHOT diff --git a/its/plugin/python-custom-rules-plugin/pom.xml b/its/plugin/python-custom-rules-plugin/pom.xml index 2342a95ed..d524a08f5 100644 --- a/its/plugin/python-custom-rules-plugin/pom.xml +++ b/its/plugin/python-custom-rules-plugin/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python it-python-plugin - 5.20-SNAPSHOT + 5.21-SNAPSHOT python-custom-rules-plugin diff --git a/its/pom.xml b/its/pom.xml index 086da1313..22a5f2cae 100644 --- a/its/pom.xml +++ b/its/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.python python - 5.20-SNAPSHOT + 5.21-SNAPSHOT python-its diff --git a/pom.xml b/pom.xml index 6d9ee49a5..755a5f375 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ org.sonarsource.python python - 5.20-SNAPSHOT + 5.21-SNAPSHOT pom Python diff --git a/python-checks-testkit/pom.xml b/python-checks-testkit/pom.xml index 87cdb42e8..48d7eb5c0 100644 --- a/python-checks-testkit/pom.xml +++ b/python-checks-testkit/pom.xml @@ -6,7 +6,7 @@ python org.sonarsource.python - 5.20-SNAPSHOT + 5.21-SNAPSHOT python-checks-testkit diff --git a/python-checks/pom.xml b/python-checks/pom.xml index c436a132e..78a5c7aa9 100644 --- a/python-checks/pom.xml +++ b/python-checks/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.python python - 5.20-SNAPSHOT + 5.21-SNAPSHOT python-checks diff --git a/python-commons/pom.xml b/python-commons/pom.xml index bcea58727..beaed920f 100644 --- a/python-commons/pom.xml +++ b/python-commons/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python python - 5.20-SNAPSHOT + 5.21-SNAPSHOT python-commons diff --git a/python-frontend/pom.xml b/python-frontend/pom.xml index 811d68a48..395bf937a 100644 --- a/python-frontend/pom.xml +++ b/python-frontend/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python python - 5.20-SNAPSHOT + 5.21-SNAPSHOT python-frontend diff --git a/sonar-python-plugin/pom.xml b/sonar-python-plugin/pom.xml index eeac7a433..efbec4770 100644 --- a/sonar-python-plugin/pom.xml +++ b/sonar-python-plugin/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python python - 5.20-SNAPSHOT + 5.21-SNAPSHOT sonar-python-plugin From f1d98b4eb2c15135787e829e21a57942ce13eb19 Mon Sep 17 00:00:00 2001 From: "sonar-nigel[bot]" <247337653+sonar-nigel[bot]@users.noreply.github.com> Date: Mon, 30 Mar 2026 13:10:19 +0000 Subject: [PATCH 054/322] SONARPY-3832 Fix S905 false positive for bare Airflow operator names at module level (#985) Co-authored-by: Vibe Bot GitOrigin-RevId: 06f6aba74ae9910bc8a5a43f6fca42451242c10c --- .../python/checks/UselessStatementCheck.java | 78 +++++++++++-------- .../uselessStatement/uselessStatement.py | 24 +++++- .../airflow.decorators.protobuf | 16 ++++ .../airflow.models.baseoperator.protobuf | 15 ++++ .../airflow.models.dag.protobuf | 15 ++++ .../custom_protobuf/airflow.models.protobuf | 36 +++++++++ .../airflow.models.taskmixin.protobuf | 15 ++++ .../types/custom_protobuf/airflow.protobuf | 27 +++++++ ...roviders.amazon.aws.operators.ecs.protobuf | 15 ++++ ...ow.providers.amazon.aws.operators.protobuf | 18 +++++ .../airflow.providers.amazon.aws.protobuf | 18 +++++ .../airflow.providers.amazon.protobuf | 18 +++++ ...low.providers.http.operators.http.protobuf | 15 ++++ .../airflow.providers.http.operators.protobuf | 18 +++++ .../airflow.providers.http.protobuf | 18 +++++ .../airflow.providers.protobuf | 27 +++++++ .../checksums/custom.checksum | 4 +- .../resources/custom/airflow/__init__.pyi | 2 + .../custom/airflow/decorators/__init__.pyi | 3 + .../custom/airflow/models/__init__.pyi | 3 + .../custom/airflow/models/baseoperator.pyi | 4 + .../resources/custom/airflow/models/dag.pyi | 4 + .../custom/airflow/models/taskmixin.pyi | 4 + .../custom/airflow/providers/__init__.pyi | 2 + .../airflow/providers/amazon/__init__.pyi | 1 + .../airflow/providers/amazon/aws/__init__.pyi | 1 + .../amazon/aws/operators/__init__.pyi | 1 + .../providers/amazon/aws/operators/ecs.pyi | 4 + .../airflow/providers/http/__init__.pyi | 1 + .../providers/http/operators/__init__.pyi | 1 + .../airflow/providers/http/operators/http.pyi | 4 + .../tests/test_serializers.py | 2 +- 32 files changed, 374 insertions(+), 40 deletions(-) create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.decorators.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.models.baseoperator.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.models.dag.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.models.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.models.taskmixin.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.providers.amazon.aws.operators.ecs.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.providers.amazon.aws.operators.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.providers.amazon.aws.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.providers.amazon.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.providers.http.operators.http.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.providers.http.operators.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.providers.http.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.providers.protobuf create mode 100644 python-frontend/typeshed_serializer/resources/custom/airflow/__init__.pyi create mode 100644 python-frontend/typeshed_serializer/resources/custom/airflow/decorators/__init__.pyi create mode 100644 python-frontend/typeshed_serializer/resources/custom/airflow/models/__init__.pyi create mode 100644 python-frontend/typeshed_serializer/resources/custom/airflow/models/baseoperator.pyi create mode 100644 python-frontend/typeshed_serializer/resources/custom/airflow/models/dag.pyi create mode 100644 python-frontend/typeshed_serializer/resources/custom/airflow/models/taskmixin.pyi create mode 100644 python-frontend/typeshed_serializer/resources/custom/airflow/providers/__init__.pyi create mode 100644 python-frontend/typeshed_serializer/resources/custom/airflow/providers/amazon/__init__.pyi create mode 100644 python-frontend/typeshed_serializer/resources/custom/airflow/providers/amazon/aws/__init__.pyi create mode 100644 python-frontend/typeshed_serializer/resources/custom/airflow/providers/amazon/aws/operators/__init__.pyi create mode 100644 python-frontend/typeshed_serializer/resources/custom/airflow/providers/amazon/aws/operators/ecs.pyi create mode 100644 python-frontend/typeshed_serializer/resources/custom/airflow/providers/http/__init__.pyi create mode 100644 python-frontend/typeshed_serializer/resources/custom/airflow/providers/http/operators/__init__.pyi create mode 100644 python-frontend/typeshed_serializer/resources/custom/airflow/providers/http/operators/http.pyi diff --git a/python-checks/src/main/java/org/sonar/python/checks/UselessStatementCheck.java b/python-checks/src/main/java/org/sonar/python/checks/UselessStatementCheck.java index e4870edd8..93b003d2d 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/UselessStatementCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/UselessStatementCheck.java @@ -17,24 +17,23 @@ package org.sonar.python.checks; import java.util.Arrays; -import java.util.HashSet; import java.util.List; -import java.util.Objects; import java.util.Optional; -import java.util.Set; import java.util.stream.Stream; import org.sonar.check.Rule; import org.sonar.check.RuleProperty; import org.sonar.plugins.python.api.PythonSubscriptionCheck; import org.sonar.plugins.python.api.SubscriptionContext; -import org.sonar.plugins.python.api.symbols.ClassSymbol; -import org.sonar.plugins.python.api.symbols.FunctionSymbol; -import org.sonar.plugins.python.api.symbols.Symbol; -import org.sonar.plugins.python.api.symbols.Usage; +import org.sonar.plugins.python.api.symbols.v2.SymbolV2; +import org.sonar.plugins.python.api.symbols.v2.UsageV2; +import org.sonar.plugins.python.api.types.v2.FunctionType; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; import org.sonar.plugins.python.api.tree.BinaryExpression; import org.sonar.plugins.python.api.tree.CallExpression; import org.sonar.plugins.python.api.tree.ClassDef; import org.sonar.plugins.python.api.tree.ConditionalExpression; +import org.sonar.plugins.python.api.tree.Decorator; import org.sonar.plugins.python.api.tree.Expression; import org.sonar.plugins.python.api.tree.FileInput; import org.sonar.plugins.python.api.tree.FunctionDef; @@ -87,10 +86,22 @@ private List ignoredOperators() { private static final List unaryExpressionKinds = Arrays.asList(Kind.UNARY_PLUS, Kind.UNARY_MINUS, Kind.BITWISE_COMPLEMENT, Kind.NOT); - private static final Set ignoredContexts = new HashSet<>(List.of("contextlib.suppress")); - private static final String MESSAGE = "Remove or refactor this statement; it has no side effects."; + private static final TypeMatcher EXCEPTION_CLASS_TYPE_MATCHER = TypeMatchers.isOrExtendsType("builtins.BaseException"); + + private static final TypeMatcher CONTEXTLIB_SUPPRESS_TYPE_MATCHER = TypeMatchers.isType("contextlib.suppress"); + + private static final TypeMatcher AIRFLOW_TYPE_MATCHER = TypeMatchers.any( + TypeMatchers.isObjectInstanceOf("airflow.models.baseoperator.BaseOperator"), + TypeMatchers.isObjectInstanceOf("airflow.models.dag.DAG"), + TypeMatchers.isObjectInstanceOf("airflow.models.taskmixin.DependencyMixin") + ); + + private static final TypeMatcher DAG_CLASS_TYPE_MATCHER = TypeMatchers.isType("airflow.models.dag.DAG"); + + private static final TypeMatcher DAG_DECORATOR_TYPE_MATCHER = TypeMatchers.isType("airflow.decorators.dag"); + @Override public void initialize(Context context) { context.registerSyntaxNodeConsumer(Kind.STRING_LITERAL, this::checkStringLiteral); @@ -118,18 +129,18 @@ private static void checkNode(SubscriptionContext ctx) { if (parent == null || !parent.is(Kind.EXPRESSION_STMT)) { return; } - if (isWithinIgnoredContext(tree)) { + if (isWithinIgnoredContext(tree, ctx)) { return; } // Safe cast because the rule only subscribes to expressions - if (isAnAirflowException((Expression) tree)) { + if (isAnAirflowException((Expression) tree, ctx)) { return; } ctx.addIssue(tree, MESSAGE); } - private static boolean isAnAirflowException(Expression expression) { - if (isWithinAirflowContext(expression)) { + private static boolean isAnAirflowException(Expression expression, SubscriptionContext ctx) { + if (isWithinAirflowContext(expression, ctx)) { StatementList statementList = (StatementList) TreeUtils.firstAncestorOfKind(expression, Kind.STATEMENT_LIST); return Optional.ofNullable(statementList).map(StatementList::statements).map(statements -> statements.get(statements.size() - 1)) .filter(lastStatement -> lastStatement.equals(TreeUtils.firstAncestorOfKind(expression, Kind.EXPRESSION_STMT))).isPresent(); @@ -137,37 +148,36 @@ private static boolean isAnAirflowException(Expression expression) { return false; } - private static boolean isWithinIgnoredContext(Tree tree) { + private static boolean isWithinIgnoredContext(Tree tree, SubscriptionContext ctx) { Tree withParent = TreeUtils.firstAncestorOfKind(tree, Kind.WITH_STMT); if (withParent != null) { WithStatement withStatement = (WithStatement) withParent; return withStatement.withItems().stream() .map(WithItem::test) .filter(item -> item.is(Kind.CALL_EXPR)) - .map(item -> ((CallExpression) item).calleeSymbol()) - .filter(Objects::nonNull) - .anyMatch(s -> ignoredContexts.contains(s.fullyQualifiedName())); + .map(item -> ((CallExpression) item).callee()) + .anyMatch(callee -> CONTEXTLIB_SUPPRESS_TYPE_MATCHER.isTrueFor(callee, ctx)); } return false; } - private static boolean isWithinAirflowContext(Tree tree) { + private static boolean isWithinAirflowContext(Tree tree, SubscriptionContext ctx) { Tree withParent = TreeUtils.firstAncestorOfKind(tree, Kind.WITH_STMT); while (withParent != null) { WithStatement withStatement = (WithStatement) withParent; if (withStatement.withItems().stream() .map(WithItem::test) .filter(item -> item.is(Kind.CALL_EXPR)) - .map(item -> ((CallExpression) item).calleeSymbol()) - .filter(Objects::nonNull) - .anyMatch(s -> "airflow.DAG".equals(s.fullyQualifiedName()))) { + .map(item -> ((CallExpression) item).callee()) + .anyMatch(callee -> DAG_CLASS_TYPE_MATCHER.isTrueFor(callee, ctx))) { return true; } withParent = TreeUtils.firstAncestorOfKind(withParent, Kind.WITH_STMT); } FunctionDef funcParent = (FunctionDef) TreeUtils.firstAncestorOfKind(tree, Kind.FUNCDEF); - return funcParent != null && funcParent.decorators().stream().map(deco -> TreeUtils.getSymbolFromTree(deco.expression())).filter(Optional::isPresent) - .anyMatch(symbol -> "airflow.decorators.dag".equals(symbol.get().fullyQualifiedName())); + return funcParent != null && funcParent.decorators().stream() + .map(Decorator::expression) + .anyMatch(expr -> DAG_DECORATOR_TYPE_MATCHER.isTrueFor(expr, ctx)); } private static boolean isBooleanExpressionWithCalls(Tree tree) { @@ -192,16 +202,16 @@ private void checkStringLiteral(SubscriptionContext ctx) { private static void checkName(SubscriptionContext ctx) { Name name = (Name) ctx.syntaxNode(); - Symbol symbol = name.symbol(); - if (symbol != null && symbol.is(Symbol.Kind.CLASS)) { - ClassSymbol classSymbol = (ClassSymbol) symbol; - // Creating an exception without raising it is covered by S3984 - if (classSymbol.canBeOrExtend("BaseException")) { - return; - } + // Creating an exception without raising it is covered by S3984 + if (EXCEPTION_CLASS_TYPE_MATCHER.isTrueFor(name, ctx)) { + return; + } + // Avoid raising on useless statements made to suppress issues due to "unused" import + SymbolV2 symbolV2 = name.symbolV2(); + if (symbolV2 != null && symbolV2.usages().stream().anyMatch(u -> u.kind() == UsageV2.Kind.IMPORT) && symbolV2.usages().size() == 2) { + return; } - if (symbol != null && symbol.usages().stream().anyMatch(u -> u.kind().equals(Usage.Kind.IMPORT)) && symbol.usages().size() == 2) { - // Avoid raising on useless statements made to suppress issues due to "unused" import + if (AIRFLOW_TYPE_MATCHER.isTrueFor(name, ctx)) { return; } checkNode(ctx); @@ -209,8 +219,8 @@ private static void checkName(SubscriptionContext ctx) { private static void checkQualifiedExpression(SubscriptionContext ctx) { QualifiedExpression qualifiedExpression = (QualifiedExpression) ctx.syntaxNode(); - Symbol symbol = qualifiedExpression.symbol(); - if (symbol != null && symbol.is(Symbol.Kind.FUNCTION) && ((FunctionSymbol) symbol).decorators().stream().noneMatch(d -> d.matches("property"))) { + // Only raise on functions; properties are already resolved to their return type by the type inference engine + if (qualifiedExpression.typeV2() instanceof FunctionType) { checkNode(ctx); } } diff --git a/python-checks/src/test/resources/checks/uselessStatement/uselessStatement.py b/python-checks/src/test/resources/checks/uselessStatement/uselessStatement.py index 7da337a39..c6abbcc63 100644 --- a/python-checks/src/test/resources/checks/uselessStatement/uselessStatement.py +++ b/python-checks/src/test/resources/checks/uselessStatement/uselessStatement.py @@ -6,6 +6,8 @@ class MyClass: def method(self): ... + def __eq__(self, other): ... + @classmethod def class_method(cls): ... @@ -149,7 +151,7 @@ def airflow_ignore_context_false_negative(): ping = HttpOperator(endpoint="http://example.com/update/") download = HttpOperator(endpoint="http://example.com/download/") upload = HttpOperator(endpoint="http://example.com/upload/") - ping # Noncompliant + ping download >> upload from airflow.decorators import dag @@ -165,7 +167,7 @@ def airflow_decorator_multiple_statements(): download = HttpOperator(endpoint="http://example.com/download/") upload = HttpOperator(endpoint="http://example.com/upload/") download >> upload - ping # Noncompliant + ping ping >> upload def airflow_nested_with(): @@ -174,7 +176,7 @@ def airflow_nested_with(): ping = HttpOperator(endpoint="http://example.com/update/") download = HttpOperator(endpoint="http://example.com/download/") upload = HttpOperator(endpoint="http://example.com/upload/") - ping # Noncompliant + ping download >> upload @dag @@ -189,3 +191,19 @@ def airflow_ignore_context_not_operator(): some_other_var = True some_var # Noncompliant some_other_var + +from airflow.providers.amazon.aws.operators.ecs import EcsRunTaskOperator +from airflow.models.baseoperator import BaseOperator as AirflowBaseOperator + +_module_dag = DAG(dag_id="example_dag", schedule_interval=None) +_ecs_task = EcsRunTaskOperator(task_id="generate_yaml", dag=_module_dag) +_ecs_task + +_http_task = HttpOperator(task_id="http", endpoint="/", dag=_module_dag) +_http_task + +class _CustomOperator(AirflowBaseOperator): + def execute(self, context): pass + +_custom_task = _CustomOperator(task_id="custom", dag=_module_dag) +_custom_task diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.decorators.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.decorators.protobuf new file mode 100644 index 000000000..b9d0e992b --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.decorators.protobuf @@ -0,0 +1,16 @@ + +airflow.decorators +dagairflow.decorators.dag"K +CallableType[builtins.function]& +builtins.function"builtins.function* +args +Any* +kwargs +Any*s +__path__airflow.decorators.__path__J +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list* +__annotations__"airflow.decorators.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.models.baseoperator.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.models.baseoperator.protobuf new file mode 100644 index 000000000..72ee0ce40 --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.models.baseoperator.protobuf @@ -0,0 +1,15 @@ + +airflow.models.baseoperator + BaseOperator(airflow.models.baseoperator.BaseOperator"*SonarPythonAnalyzerFakeStub.CustomStubBase* +__init__1airflow.models.baseoperator.BaseOperator.__init__" +None*^ +selfT +(airflow.models.baseoperator.BaseOperator"(airflow.models.baseoperator.BaseOperator* +args +Any* +kwargs +Any* +__annotations__+airflow.models.baseoperator.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.models.dag.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.models.dag.protobuf new file mode 100644 index 000000000..63997e7e0 --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.models.dag.protobuf @@ -0,0 +1,15 @@ + +airflow.models.dag +DAGairflow.models.dag.DAG"*SonarPythonAnalyzerFakeStub.CustomStubBase* +__init__airflow.models.dag.DAG.__init__" +None*: +self0 +airflow.models.dag.DAG"airflow.models.dag.DAG* +args +Any* +kwargs +Any* +__annotations__"airflow.models.dag.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.models.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.models.protobuf new file mode 100644 index 000000000..a1a891521 --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.models.protobuf @@ -0,0 +1,36 @@ + +airflow.models + BaseOperator(airflow.models.baseoperator.BaseOperator"*SonarPythonAnalyzerFakeStub.CustomStubBase* +__init__1airflow.models.baseoperator.BaseOperator.__init__" +None*^ +selfT +(airflow.models.baseoperator.BaseOperator"(airflow.models.baseoperator.BaseOperator* +args +Any* +kwargs +Any +DAGairflow.models.dag.DAG"*SonarPythonAnalyzerFakeStub.CustomStubBase* +__init__airflow.models.dag.DAG.__init__" +None*: +self0 +airflow.models.dag.DAG"airflow.models.dag.DAG* +args +Any* +kwargs +Any +DependencyMixin(airflow.models.taskmixin.DependencyMixin"*SonarPythonAnalyzerFakeStub.CustomStubBase* +__init__1airflow.models.taskmixin.DependencyMixin.__init__" +None*^ +selfT +(airflow.models.taskmixin.DependencyMixin"(airflow.models.taskmixin.DependencyMixin* +args +Any* +kwargs +Any*o +__path__airflow.models.__path__J +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list* +__annotations__airflow.models.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.models.taskmixin.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.models.taskmixin.protobuf new file mode 100644 index 000000000..99773b9c9 --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.models.taskmixin.protobuf @@ -0,0 +1,15 @@ + +airflow.models.taskmixin +DependencyMixin(airflow.models.taskmixin.DependencyMixin"*SonarPythonAnalyzerFakeStub.CustomStubBase* +__init__1airflow.models.taskmixin.DependencyMixin.__init__" +None*^ +selfT +(airflow.models.taskmixin.DependencyMixin"(airflow.models.taskmixin.DependencyMixin* +args +Any* +kwargs +Any* +__annotations__(airflow.models.taskmixin.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.protobuf new file mode 100644 index 000000000..152542d53 --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.protobuf @@ -0,0 +1,27 @@ + +airflow +DAGairflow.models.dag.DAG"*SonarPythonAnalyzerFakeStub.CustomStubBase* +__init__airflow.models.dag.DAG.__init__" +None*: +self0 +airflow.models.dag.DAG"airflow.models.dag.DAG* +args +Any* +kwargs +Any + BaseOperator(airflow.models.baseoperator.BaseOperator"*SonarPythonAnalyzerFakeStub.CustomStubBase* +__init__1airflow.models.baseoperator.BaseOperator.__init__" +None*^ +selfT +(airflow.models.baseoperator.BaseOperator"(airflow.models.baseoperator.BaseOperator* +args +Any* +kwargs +Any*h +__path__airflow.__path__J +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list* +__annotations__airflow.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.providers.amazon.aws.operators.ecs.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.providers.amazon.aws.operators.ecs.protobuf new file mode 100644 index 000000000..715a0b104 --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.providers.amazon.aws.operators.ecs.protobuf @@ -0,0 +1,15 @@ + +*airflow.providers.amazon.aws.operators.ecs +EcsRunTaskOperator=airflow.providers.amazon.aws.operators.ecs.EcsRunTaskOperator"(airflow.models.baseoperator.BaseOperator* +__init__Fairflow.providers.amazon.aws.operators.ecs.EcsRunTaskOperator.__init__" +None* +self~ +=airflow.providers.amazon.aws.operators.ecs.EcsRunTaskOperator"=airflow.providers.amazon.aws.operators.ecs.EcsRunTaskOperator* +args +Any* +kwargs +Any* +__annotations__:airflow.providers.amazon.aws.operators.ecs.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.providers.amazon.aws.operators.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.providers.amazon.aws.operators.protobuf new file mode 100644 index 000000000..def6fe28b --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.providers.amazon.aws.operators.protobuf @@ -0,0 +1,18 @@ + +&airflow.providers.amazon.aws.operators +EcsRunTaskOperator=airflow.providers.amazon.aws.operators.ecs.EcsRunTaskOperator"(airflow.models.baseoperator.BaseOperator* +__init__Fairflow.providers.amazon.aws.operators.ecs.EcsRunTaskOperator.__init__" +None* +self~ +=airflow.providers.amazon.aws.operators.ecs.EcsRunTaskOperator"=airflow.providers.amazon.aws.operators.ecs.EcsRunTaskOperator* +args +Any* +kwargs +Any* +__path__/airflow.providers.amazon.aws.operators.__path__J +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list* +__annotations__6airflow.providers.amazon.aws.operators.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.providers.amazon.aws.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.providers.amazon.aws.protobuf new file mode 100644 index 000000000..e79876bea --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.providers.amazon.aws.protobuf @@ -0,0 +1,18 @@ + +airflow.providers.amazon.aws +EcsRunTaskOperator=airflow.providers.amazon.aws.operators.ecs.EcsRunTaskOperator"(airflow.models.baseoperator.BaseOperator* +__init__Fairflow.providers.amazon.aws.operators.ecs.EcsRunTaskOperator.__init__" +None* +self~ +=airflow.providers.amazon.aws.operators.ecs.EcsRunTaskOperator"=airflow.providers.amazon.aws.operators.ecs.EcsRunTaskOperator* +args +Any* +kwargs +Any*} +__path__%airflow.providers.amazon.aws.__path__J +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list* +__annotations__,airflow.providers.amazon.aws.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.providers.amazon.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.providers.amazon.protobuf new file mode 100644 index 000000000..e52ed0019 --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.providers.amazon.protobuf @@ -0,0 +1,18 @@ + +airflow.providers.amazon +EcsRunTaskOperator=airflow.providers.amazon.aws.operators.ecs.EcsRunTaskOperator"(airflow.models.baseoperator.BaseOperator* +__init__Fairflow.providers.amazon.aws.operators.ecs.EcsRunTaskOperator.__init__" +None* +self~ +=airflow.providers.amazon.aws.operators.ecs.EcsRunTaskOperator"=airflow.providers.amazon.aws.operators.ecs.EcsRunTaskOperator* +args +Any* +kwargs +Any*y +__path__!airflow.providers.amazon.__path__J +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list* +__annotations__(airflow.providers.amazon.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.providers.http.operators.http.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.providers.http.operators.http.protobuf new file mode 100644 index 000000000..684fe9105 --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.providers.http.operators.http.protobuf @@ -0,0 +1,15 @@ + +%airflow.providers.http.operators.http + HttpOperator2airflow.providers.http.operators.http.HttpOperator"(airflow.models.baseoperator.BaseOperator* +__init__;airflow.providers.http.operators.http.HttpOperator.__init__" +None*r +selfh +2airflow.providers.http.operators.http.HttpOperator"2airflow.providers.http.operators.http.HttpOperator* +args +Any* +kwargs +Any* +__annotations__5airflow.providers.http.operators.http.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.providers.http.operators.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.providers.http.operators.protobuf new file mode 100644 index 000000000..882cd8f5b --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.providers.http.operators.protobuf @@ -0,0 +1,18 @@ + + airflow.providers.http.operators + HttpOperator2airflow.providers.http.operators.http.HttpOperator"(airflow.models.baseoperator.BaseOperator* +__init__;airflow.providers.http.operators.http.HttpOperator.__init__" +None*r +selfh +2airflow.providers.http.operators.http.HttpOperator"2airflow.providers.http.operators.http.HttpOperator* +args +Any* +kwargs +Any* +__path__)airflow.providers.http.operators.__path__J +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list* +__annotations__0airflow.providers.http.operators.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.providers.http.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.providers.http.protobuf new file mode 100644 index 000000000..be29857b0 --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.providers.http.protobuf @@ -0,0 +1,18 @@ + +airflow.providers.http + HttpOperator2airflow.providers.http.operators.http.HttpOperator"(airflow.models.baseoperator.BaseOperator* +__init__;airflow.providers.http.operators.http.HttpOperator.__init__" +None*r +selfh +2airflow.providers.http.operators.http.HttpOperator"2airflow.providers.http.operators.http.HttpOperator* +args +Any* +kwargs +Any*w +__path__airflow.providers.http.__path__J +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list* +__annotations__&airflow.providers.http.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.providers.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.providers.protobuf new file mode 100644 index 000000000..a281df181 --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/airflow.providers.protobuf @@ -0,0 +1,27 @@ + +airflow.providers +EcsRunTaskOperator=airflow.providers.amazon.aws.operators.ecs.EcsRunTaskOperator"(airflow.models.baseoperator.BaseOperator* +__init__Fairflow.providers.amazon.aws.operators.ecs.EcsRunTaskOperator.__init__" +None* +self~ +=airflow.providers.amazon.aws.operators.ecs.EcsRunTaskOperator"=airflow.providers.amazon.aws.operators.ecs.EcsRunTaskOperator* +args +Any* +kwargs +Any + HttpOperator2airflow.providers.http.operators.http.HttpOperator"(airflow.models.baseoperator.BaseOperator* +__init__;airflow.providers.http.operators.http.HttpOperator.__init__" +None*r +selfh +2airflow.providers.http.operators.http.HttpOperator"2airflow.providers.http.operators.http.HttpOperator* +args +Any* +kwargs +Any*r +__path__airflow.providers.__path__J +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list* +__annotations__!airflow.providers.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/typeshed_serializer/checksums/custom.checksum b/python-frontend/typeshed_serializer/checksums/custom.checksum index 6961b2f3d..20d75a91b 100644 --- a/python-frontend/typeshed_serializer/checksums/custom.checksum +++ b/python-frontend/typeshed_serializer/checksums/custom.checksum @@ -1,2 +1,2 @@ -774d53e2cc547be2fbc3e6fc9a9b5b4fadfe72eb7f7fd3444a4566d9110a0a7f -5c09d20b8cbc107906625c2325a16ebe4e2795c0f866ef3a2c636a0e23488018 \ No newline at end of file +61e014719cf03716e393ae97da9e3d394f41cc9f4bf4f5ee9fe48b2004605cfd +f8586ea766acbd86c5c0995ce3a7cc068ce433673cf057457eb8188fadc9ff39 diff --git a/python-frontend/typeshed_serializer/resources/custom/airflow/__init__.pyi b/python-frontend/typeshed_serializer/resources/custom/airflow/__init__.pyi new file mode 100644 index 000000000..ae112538d --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/airflow/__init__.pyi @@ -0,0 +1,2 @@ +from airflow.models.dag import DAG +from airflow.models.baseoperator import BaseOperator diff --git a/python-frontend/typeshed_serializer/resources/custom/airflow/decorators/__init__.pyi b/python-frontend/typeshed_serializer/resources/custom/airflow/decorators/__init__.pyi new file mode 100644 index 000000000..d3adc80fc --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/airflow/decorators/__init__.pyi @@ -0,0 +1,3 @@ +from typing import Any, Callable + +def dag(*args, **kwargs) -> Callable[..., Any]: ... diff --git a/python-frontend/typeshed_serializer/resources/custom/airflow/models/__init__.pyi b/python-frontend/typeshed_serializer/resources/custom/airflow/models/__init__.pyi new file mode 100644 index 000000000..fab4e551a --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/airflow/models/__init__.pyi @@ -0,0 +1,3 @@ +from airflow.models.baseoperator import BaseOperator +from airflow.models.dag import DAG +from airflow.models.taskmixin import DependencyMixin diff --git a/python-frontend/typeshed_serializer/resources/custom/airflow/models/baseoperator.pyi b/python-frontend/typeshed_serializer/resources/custom/airflow/models/baseoperator.pyi new file mode 100644 index 000000000..98c93400e --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/airflow/models/baseoperator.pyi @@ -0,0 +1,4 @@ +from SonarPythonAnalyzerFakeStub import CustomStubBase + +class BaseOperator(CustomStubBase): + def __init__(self, *args, **kwargs) -> None: ... diff --git a/python-frontend/typeshed_serializer/resources/custom/airflow/models/dag.pyi b/python-frontend/typeshed_serializer/resources/custom/airflow/models/dag.pyi new file mode 100644 index 000000000..9aa85f1ca --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/airflow/models/dag.pyi @@ -0,0 +1,4 @@ +from SonarPythonAnalyzerFakeStub import CustomStubBase + +class DAG(CustomStubBase): + def __init__(self, *args, **kwargs) -> None: ... diff --git a/python-frontend/typeshed_serializer/resources/custom/airflow/models/taskmixin.pyi b/python-frontend/typeshed_serializer/resources/custom/airflow/models/taskmixin.pyi new file mode 100644 index 000000000..320414a5f --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/airflow/models/taskmixin.pyi @@ -0,0 +1,4 @@ +from SonarPythonAnalyzerFakeStub import CustomStubBase + +class DependencyMixin(CustomStubBase): + def __init__(self, *args, **kwargs) -> None: ... diff --git a/python-frontend/typeshed_serializer/resources/custom/airflow/providers/__init__.pyi b/python-frontend/typeshed_serializer/resources/custom/airflow/providers/__init__.pyi new file mode 100644 index 000000000..814955b0e --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/airflow/providers/__init__.pyi @@ -0,0 +1,2 @@ +from airflow.providers.amazon.aws.operators.ecs import EcsRunTaskOperator +from airflow.providers.http.operators.http import HttpOperator diff --git a/python-frontend/typeshed_serializer/resources/custom/airflow/providers/amazon/__init__.pyi b/python-frontend/typeshed_serializer/resources/custom/airflow/providers/amazon/__init__.pyi new file mode 100644 index 000000000..0c7584143 --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/airflow/providers/amazon/__init__.pyi @@ -0,0 +1 @@ +from airflow.providers.amazon.aws.operators.ecs import EcsRunTaskOperator diff --git a/python-frontend/typeshed_serializer/resources/custom/airflow/providers/amazon/aws/__init__.pyi b/python-frontend/typeshed_serializer/resources/custom/airflow/providers/amazon/aws/__init__.pyi new file mode 100644 index 000000000..0c7584143 --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/airflow/providers/amazon/aws/__init__.pyi @@ -0,0 +1 @@ +from airflow.providers.amazon.aws.operators.ecs import EcsRunTaskOperator diff --git a/python-frontend/typeshed_serializer/resources/custom/airflow/providers/amazon/aws/operators/__init__.pyi b/python-frontend/typeshed_serializer/resources/custom/airflow/providers/amazon/aws/operators/__init__.pyi new file mode 100644 index 000000000..0c7584143 --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/airflow/providers/amazon/aws/operators/__init__.pyi @@ -0,0 +1 @@ +from airflow.providers.amazon.aws.operators.ecs import EcsRunTaskOperator diff --git a/python-frontend/typeshed_serializer/resources/custom/airflow/providers/amazon/aws/operators/ecs.pyi b/python-frontend/typeshed_serializer/resources/custom/airflow/providers/amazon/aws/operators/ecs.pyi new file mode 100644 index 000000000..6e098bbc8 --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/airflow/providers/amazon/aws/operators/ecs.pyi @@ -0,0 +1,4 @@ +from airflow.models.baseoperator import BaseOperator + +class EcsRunTaskOperator(BaseOperator): + def __init__(self, *args, **kwargs) -> None: ... diff --git a/python-frontend/typeshed_serializer/resources/custom/airflow/providers/http/__init__.pyi b/python-frontend/typeshed_serializer/resources/custom/airflow/providers/http/__init__.pyi new file mode 100644 index 000000000..c768f3d01 --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/airflow/providers/http/__init__.pyi @@ -0,0 +1 @@ +from airflow.providers.http.operators.http import HttpOperator diff --git a/python-frontend/typeshed_serializer/resources/custom/airflow/providers/http/operators/__init__.pyi b/python-frontend/typeshed_serializer/resources/custom/airflow/providers/http/operators/__init__.pyi new file mode 100644 index 000000000..c768f3d01 --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/airflow/providers/http/operators/__init__.pyi @@ -0,0 +1 @@ +from airflow.providers.http.operators.http import HttpOperator diff --git a/python-frontend/typeshed_serializer/resources/custom/airflow/providers/http/operators/http.pyi b/python-frontend/typeshed_serializer/resources/custom/airflow/providers/http/operators/http.pyi new file mode 100644 index 000000000..a0bbefd43 --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/airflow/providers/http/operators/http.pyi @@ -0,0 +1,4 @@ +from airflow.models.baseoperator import BaseOperator + +class HttpOperator(BaseOperator): + def __init__(self, *args, **kwargs) -> None: ... diff --git a/python-frontend/typeshed_serializer/tests/test_serializers.py b/python-frontend/typeshed_serializer/tests/test_serializers.py index 8b7be8695..3c05fa2d2 100644 --- a/python-frontend/typeshed_serializer/tests/test_serializers.py +++ b/python-frontend/typeshed_serializer/tests/test_serializers.py @@ -74,7 +74,7 @@ def test_custom_stubs_serializer(typeshed_custom_stubs): custom_stubs_serializer.serialize() assert custom_stubs_serializer.get_build_result.call_count == 1 # Not every files from "typeshed_custom_stubs" build are serialized, as some are builtins - assert symbols.save_module.call_count == 347 + assert symbols.save_module.call_count == 361 def test_importer_serializer(): From 57993cfa4d1ded4651a3ee1a6fbc9c006981fc38 Mon Sep 17 00:00:00 2001 From: "sonar-nigel[bot]" <247337653+sonar-nigel[bot]@users.noreply.github.com> Date: Mon, 30 Mar 2026 15:31:57 +0200 Subject: [PATCH 055/322] SONARPY-3505 Fix S5953 false positives on PEP 695 new generics syntax (#984) Co-authored-by: Vibe Bot GitOrigin-RevId: cf8686af965e1276e1ee6967c2fa5f0878a51a7a --- .../python/checks/UndefinedSymbolsCheck.java | 11 +++++-- .../resources/checks/genericTypeStatement.py | 6 ++-- .../undefinedSymbols/undefinedSymbols.py | 24 +++++++++++++++ .../python/semantic/SymbolTableBuilder.java | 2 ++ .../python/semantic/v2/ReadUsagesVisitor.java | 1 + .../semantic/v2/WriteUsagesVisitor.java | 1 + .../semantic/SymbolTableBuilderTest.java | 29 ++++++++++++++++++ .../semantic/v2/SymbolTableBuilderV2Test.java | 30 +++++++++++++++++++ 8 files changed, 97 insertions(+), 7 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/UndefinedSymbolsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/UndefinedSymbolsCheck.java index 3c1ab068b..74c0d0557 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/UndefinedSymbolsCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/UndefinedSymbolsCheck.java @@ -31,7 +31,9 @@ import org.sonar.plugins.python.api.tree.ImportFrom; import org.sonar.plugins.python.api.tree.Name; import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.tree.TypeAliasStatement; import org.sonar.plugins.python.api.tree.TypeParams; +import org.sonar.python.semantic.BuiltinSymbols; import org.sonar.python.tree.TreeUtils; @Rule(key = "S5953") @@ -72,19 +74,22 @@ private static class UnresolvedSymbolsVisitor extends BaseTreeVisitor { @Override public void visitName(Name name) { - if (name.isVariable() && name.symbol() == null && !name.name().startsWith("_") && !isTypeVar(name)) { + if (name.isVariable() && name.symbolV2() == null && !BuiltinSymbols.all().contains(name.name()) && !name.name().startsWith("_") && !isTypeVar(name)) { nameIssues.computeIfAbsent(name.name(), k -> new ArrayList<>()).add(name); } } private static boolean isTypeVar(Name name) { - return TreeUtils.firstAncestor(name, tree -> classWithTypeVar(tree, name)) != null; + return TreeUtils.firstAncestor(name, tree -> hasTypeVarInScope(tree, name)) != null; } - private static boolean classWithTypeVar(Tree tree, Name name) { + private static boolean hasTypeVarInScope(Tree tree, Name name) { if (tree instanceof ClassDef classDef) { return hasTypeVar(classDef.typeParams(), name); } + if (tree instanceof TypeAliasStatement typeAliasStatement) { + return hasTypeVar(typeAliasStatement.typeParams(), name); + } return false; } diff --git a/python-checks/src/test/resources/checks/genericTypeStatement.py b/python-checks/src/test/resources/checks/genericTypeStatement.py index 2f756a01d..20ecc1b31 100644 --- a/python-checks/src/test/resources/checks/genericTypeStatement.py +++ b/python-checks/src/test/resources/checks/genericTypeStatement.py @@ -20,13 +20,11 @@ def non_compliant_1(): type MyAlias[T] = dict[T, _R] # Noncompliant # ^^^^^^^ ^^< {{Use of "TypeVar" here.}} - M = TypeVar("M") - # ^^^^^^^^^^^^> {{"TypeVar" is assigned here.}} - type MyAlias[M] = set[M] # Noncompliant - # ^^^^^^^ ^< {{Use of "TypeVar" here.}} def compliant(AType): type MyAlias[T] = dict[T, str] type MyAlias = set[str] type MyAlias = set[AType] + M = TypeVar("M") + type MyAlias[M] = set[M] # Compliant: M in set[M] refers to the type parameter, not the TypeVar diff --git a/python-checks/src/test/resources/checks/undefinedSymbols/undefinedSymbols.py b/python-checks/src/test/resources/checks/undefinedSymbols/undefinedSymbols.py index 59c339f5d..277850870 100644 --- a/python-checks/src/test/resources/checks/undefinedSymbols/undefinedSymbols.py +++ b/python-checks/src/test/resources/checks/undefinedSymbols/undefinedSymbols.py @@ -163,6 +163,30 @@ def from_class_def(self): def unknow_generic(self): a: list[X] = ... # Noncompliant +class GenericClassBuiltinBound[ItemType, ItemTypeId: str]: + pass + +class BaseBound: + pass + +class GenericClassUserDefinedBound[FooT: BaseBound]: + pass + +class UserBase: + pass + +class UserGeneric[UBased: UserBase]: + def __init__(self, value: UBased) -> None: + self.value = value + +from collections.abc import Callable +type Validator[V] = Callable[[V], V] + +class Serializable: + pass + +type SerializableList[S: Serializable] = list[S] + # FP with python 2 syntax for exception handling try: "" diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/SymbolTableBuilder.java b/python-frontend/src/main/java/org/sonar/python/semantic/SymbolTableBuilder.java index 4679690d1..9147aefd6 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/SymbolTableBuilder.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/SymbolTableBuilder.java @@ -342,6 +342,7 @@ private void createTypeParameters(@Nullable TypeParams typeParams) { @Override public void visitTypeAliasStatement(TypeAliasStatement typeAliasStatement) { addBindingUsage(typeAliasStatement.name(), Usage.Kind.TYPE_ALIAS_DECLARATION); + createTypeParameters(typeAliasStatement.typeParams()); super.visitTypeAliasStatement(typeAliasStatement); } @@ -697,6 +698,7 @@ public void visitTypeAnnotation(TypeAnnotation tree) { public void visitClassDef(ClassDef pyClassDefTree) { scan(pyClassDefTree.args()); scan(pyClassDefTree.decorators()); + scan(pyClassDefTree.typeParams()); enterScope(pyClassDefTree); scan(pyClassDefTree.name()); resolveTypeHierarchy(pyClassDefTree, pyClassDefTree.name().symbol(), pythonFile, scopesByRootTree.get(fileInput).symbolsByName); diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/ReadUsagesVisitor.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/ReadUsagesVisitor.java index 05fce61d4..ecf44f5ac 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/ReadUsagesVisitor.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/ReadUsagesVisitor.java @@ -121,6 +121,7 @@ public void visitTypeAnnotation(TypeAnnotation tree) { public void visitClassDef(ClassDef classDef) { scan(classDef.args()); scan(classDef.decorators()); + scan(classDef.typeParams()); enterScope(classDef); scan(classDef.name()); scan(classDef.body()); diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/WriteUsagesVisitor.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/WriteUsagesVisitor.java index 5ab37618c..ac8ec5d29 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/WriteUsagesVisitor.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/WriteUsagesVisitor.java @@ -171,6 +171,7 @@ private void addTupleParamElementsToBindingUsage(TupleParameter param) { @Override public void visitTypeAliasStatement(TypeAliasStatement typeAliasStatement) { currentScope().addBindingUsage(typeAliasStatement.name(), UsageV2.Kind.TYPE_ALIAS_DECLARATION); + createTypeParameters(typeAliasStatement.typeParams()); super.visitTypeAliasStatement(typeAliasStatement); } diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/SymbolTableBuilderTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/SymbolTableBuilderTest.java index 854797cd0..84f592b08 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/SymbolTableBuilderTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/SymbolTableBuilderTest.java @@ -35,6 +35,7 @@ import org.sonar.plugins.python.api.symbols.Usage; import org.sonar.plugins.python.api.tree.BaseTreeVisitor; import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.ClassDef; import org.sonar.plugins.python.api.tree.ComprehensionExpression; import org.sonar.plugins.python.api.tree.DictCompExpression; import org.sonar.plugins.python.api.tree.ExpressionStatement; @@ -44,6 +45,7 @@ import org.sonar.plugins.python.api.tree.Name; import org.sonar.plugins.python.api.tree.Tree; import org.sonar.plugins.python.api.tree.Tuple; +import org.sonar.plugins.python.api.tree.TypeAliasStatement; import org.sonar.python.PythonTestUtils; import org.sonar.python.TestPythonVisitorRunner; import org.sonar.python.tree.TreeUtils; @@ -636,6 +638,33 @@ void type_alias_declaration() { assertThat(symbolByName.get("M").usages().get(0).kind()).isEqualTo(Usage.Kind.TYPE_ALIAS_DECLARATION); } + @Test + void class_type_param_bound_resolved_in_enclosing_scope() { + FileInput tree = PythonTestUtils.parse( + "class BaseBound:", + " pass", + "class Foo[T: BaseBound]:", + " pass" + ); + ClassDef fooClass = (ClassDef) PythonTestUtils.getLastDescendant(tree, t -> t.is(Tree.Kind.CLASSDEF)); + Name boundName = (Name) fooClass.typeParams().typeParamsList().get(0).typeAnnotation().expression(); + assertThat(boundName.name()).isEqualTo("BaseBound"); + assertThat(boundName.symbol()).isNotNull(); + assertThat(boundName.symbol().name()).isEqualTo("BaseBound"); + } + + @Test + void type_alias_type_params_registered() { + FileInput tree = PythonTestUtils.parse("type Alias[T] = list[T]"); + TypeAliasStatement typeAlias = (TypeAliasStatement) tree.statements().statements().get(0); + Name typeParamName = typeAlias.typeParams().typeParamsList().get(0).name(); + assertThat(typeParamName.name()).isEqualTo("T"); + assertThat(typeParamName.symbol()).isNotNull(); + assertThat(typeParamName.symbol().usages()) + .extracting(Usage::kind) + .contains(Usage.Kind.TYPE_PARAM_DECLARATION); + } + private static class TestVisitor extends BaseTreeVisitor { @Override public void visitFunctionDef(FunctionDef pyFunctionDefTree) { diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/SymbolTableBuilderV2Test.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/SymbolTableBuilderV2Test.java index 6f7e9277b..275b65eee 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/SymbolTableBuilderV2Test.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/SymbolTableBuilderV2Test.java @@ -22,12 +22,15 @@ import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.sonar.plugins.python.api.symbols.v2.SymbolV2; +import org.sonar.plugins.python.api.symbols.v2.UsageV2; import org.sonar.plugins.python.api.tree.AssignmentStatement; +import org.sonar.plugins.python.api.tree.ClassDef; import org.sonar.plugins.python.api.tree.FileInput; import org.sonar.plugins.python.api.tree.FunctionDef; import org.sonar.plugins.python.api.tree.ImportName; import org.sonar.plugins.python.api.tree.Name; import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.tree.TypeAliasStatement; import org.sonar.python.PythonTestUtils; import org.sonar.python.tree.TreeUtils; @@ -260,6 +263,33 @@ void never_written_variables_have_symbol() { } + @Test + void class_type_param_bound_is_resolved_in_enclosing_scope() { + FileInput fileInput = PythonTestUtils.parse(""" + class BaseBound: + pass + class Foo[T: BaseBound]: + pass + """); + new SymbolTableBuilderV2(fileInput).build(); + ClassDef fooClass = (ClassDef) fileInput.statements().statements().get(1); + Name boundName = (Name) fooClass.typeParams().typeParamsList().get(0).typeAnnotation().expression(); + Assertions.assertThat(boundName.symbolV2()).isNotNull(); + Assertions.assertThat(boundName.symbolV2().name()).isEqualTo("BaseBound"); + } + + @Test + void type_alias_type_params_are_registered() { + FileInput fileInput = PythonTestUtils.parse("type Alias[T] = list[T]"); + new SymbolTableBuilderV2(fileInput).build(); + TypeAliasStatement typeAlias = (TypeAliasStatement) fileInput.statements().statements().get(0); + Name typeParamName = typeAlias.typeParams().typeParamsList().get(0).name(); + Assertions.assertThat(typeParamName.symbolV2()).isNotNull(); + Assertions.assertThat(typeParamName.symbolV2().usages()) + .extracting(UsageV2::kind) + .contains(UsageV2.Kind.TYPE_PARAM_DECLARATION); + } + private static void assertNameSymbol(Name name, String expectedSymbolName, int expectedUsagesCount) { var symbol = name.symbolV2(); Assertions.assertThat(symbol).isNotNull(); From 47d6101e5b60f7531835811a255bbef86b3c015e Mon Sep 17 00:00:00 2001 From: "sonar-nigel[bot]" <247337653+sonar-nigel[bot]@users.noreply.github.com> Date: Mon, 30 Mar 2026 15:45:15 +0200 Subject: [PATCH 056/322] SONARPY-3833 Fix S8411 false positive when path parameter is used in Depends() (#986) Co-authored-by: Vibe Bot GitOrigin-RevId: b2dd5520b1acce2f16f12f7814e0ed777fb3129a --- .../checks/FastAPIPathParametersCheck.java | 95 +++++++++++++++++++ .../resources/checks/fastapiPathParameters.py | 92 +++++++++++++++++- 2 files changed, 186 insertions(+), 1 deletion(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/FastAPIPathParametersCheck.java b/python-checks/src/main/java/org/sonar/python/checks/FastAPIPathParametersCheck.java index 32facaf51..8c23ff1ca 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/FastAPIPathParametersCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/FastAPIPathParametersCheck.java @@ -18,6 +18,7 @@ import java.util.HashSet; import java.util.List; +import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.regex.Matcher; @@ -26,11 +27,22 @@ import org.sonar.check.Rule; import org.sonar.plugins.python.api.PythonSubscriptionCheck; import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.symbols.v2.SymbolV2; +import org.sonar.plugins.python.api.symbols.v2.UsageV2; import org.sonar.plugins.python.api.tree.CallExpression; import org.sonar.plugins.python.api.tree.Decorator; import org.sonar.plugins.python.api.tree.Expression; import org.sonar.plugins.python.api.tree.FunctionDef; +import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.Parameter; +import org.sonar.plugins.python.api.tree.ParameterList; +import org.sonar.plugins.python.api.tree.QualifiedExpression; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.SubscriptionExpression; import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.tree.TypeAnnotation; +import org.sonar.plugins.python.api.types.v2.FunctionType; +import org.sonar.plugins.python.api.types.v2.ParameterV2; import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; import org.sonar.python.checks.utils.Expressions; @@ -56,6 +68,9 @@ public class FastAPIPathParametersCheck extends PythonSubscriptionCheck { TypeMatchers.isType("fastapi.APIRouter." + method))) ); + private static final TypeMatcher FASTAPI_DEPENDS_MATCHER = TypeMatchers.isType("fastapi.param_functions.Depends"); + private static final TypeMatcher TYPING_ANNOTATED_MATCHER = TypeMatchers.isType("typing.Annotated"); + @Override public void initialize(Context context) { context.registerSyntaxNodeConsumer(Tree.Kind.FUNCDEF, FastAPIPathParametersCheck::checkFunction); @@ -84,9 +99,89 @@ private static void checkDecorator(SubscriptionContext ctx, Decorator decorator, } FunctionParameterInfo paramInfo = FunctionParameterUtils.extractFunctionParameters(functionDef); + pathParams.removeAll(extractDependencyParameters(functionDef, ctx)); reportIssues(ctx, functionDef, pathParams, paramInfo); } + private static Set extractDependencyParameters(FunctionDef functionDef, SubscriptionContext ctx) { + return extractDependencyParameters(functionDef, ctx, new HashSet<>()); + } + + private static Set extractDependencyParameters(FunctionDef functionDef, SubscriptionContext ctx, Set visited) { + if (!visited.add(functionDef)) { + return Set.of(); + } + ParameterList parameterList = functionDef.parameters(); + if (parameterList == null) { + return Set.of(); + } + Set dependencyParams = new HashSet<>(); + parameterList.nonTuple().stream() + .map(param -> getDependsCall(param, ctx)) + .filter(Optional::isPresent) + .map(Optional::get) + .forEach(dependsCall -> collectDependencyParams(dependsCall, dependencyParams, visited, ctx)); + return dependencyParams; + } + + private static Optional getDependsCall(Parameter param, SubscriptionContext ctx) { + Expression defaultValue = param.defaultValue(); + if (defaultValue instanceof CallExpression callExpr && FASTAPI_DEPENDS_MATCHER.isTrueFor(callExpr.callee(), ctx)) { + return Optional.of(callExpr); + } + TypeAnnotation typeAnnotation = param.typeAnnotation(); + if (typeAnnotation != null && typeAnnotation.expression() instanceof SubscriptionExpression subscriptionExpr + && TYPING_ANNOTATED_MATCHER.isTrueFor(subscriptionExpr.object(), ctx)) { + return subscriptionExpr.subscripts().expressions().stream() + .filter(e -> e instanceof CallExpression ce && FASTAPI_DEPENDS_MATCHER.isTrueFor(ce.callee(), ctx)) + .map(e -> (CallExpression) e) + .findFirst(); + } + return Optional.empty(); + } + + private static void collectDependencyParams(CallExpression dependsCall, Set dependencyParams, Set visited, SubscriptionContext ctx) { + TreeUtils.nthArgumentOrKeywordOptional(0, "dependency", dependsCall.arguments()) + .map(RegularArgument::expression) + .ifPresent(argExpr -> { + if (argExpr.typeV2() instanceof FunctionType funcType) { + funcType.parameters().stream() + .filter(param -> !param.isVariadic()) + .map(ParameterV2::name) + .filter(Objects::nonNull) + .forEach(dependencyParams::add); + } + getFunctionDef(argExpr).ifPresent(depFuncDef -> + dependencyParams.addAll(extractDependencyParameters(depFuncDef, ctx, visited)) + ); + }); + } + + private static Optional getFunctionDef(Expression expression) { + Name name; + if (expression instanceof Name n) { + name = n; + } else if (expression instanceof QualifiedExpression qe) { + name = qe.name(); + } else { + name = null; + } + if (name == null) { + return Optional.empty(); + } + SymbolV2 symbol = name.symbolV2(); + if (symbol == null) { + return Optional.empty(); + } + return symbol.usages().stream() + .filter(u -> u.kind() == UsageV2.Kind.FUNC_DECLARATION) + .map(UsageV2::tree) + .map(tree -> TreeUtils.firstAncestorOfKind(tree, Tree.Kind.FUNCDEF)) + .filter(Objects::nonNull) + .map(FunctionDef.class::cast) + .findFirst(); + } + private static Set extractPathParameters(CallExpression callExpr) { Set pathParams = new HashSet<>(); String pathString = getPathArgument(callExpr).orElse(""); diff --git a/python-checks/src/test/resources/checks/fastapiPathParameters.py b/python-checks/src/test/resources/checks/fastapiPathParameters.py index a50e52dd5..fe6105ef3 100644 --- a/python-checks/src/test/resources/checks/fastapiPathParameters.py +++ b/python-checks/src/test/resources/checks/fastapiPathParameters.py @@ -1,4 +1,6 @@ -from fastapi import FastAPI, APIRouter +import typing +from fastapi import FastAPI, APIRouter, Depends +from typing import Annotated app = FastAPI() router = APIRouter() @@ -167,3 +169,91 @@ def compliant_empty_path(): @app.get(True) def compliant_path_is_not_a_string(): pass + +# --- Depends() path parameter delegation --- + +def get_item(item_id: int): + return {"item_id": item_id} + +@router.get("/items/{item_id}") +def compliant_depends_default_value(item=Depends(get_item)): + return item + +@app.get("/items/{item_id}") +def compliant_depends_annotated(item: Annotated[dict, Depends(get_item)]): + return item + +@app.get("/users/{user_id}/items/{item_id}") +def compliant_depends_partial(user_id: int, item=Depends(get_item)): + return {"user_id": user_id, "item": item} + +async def get_item_async(item_id: int): + return {"item_id": item_id} + +@router.get("/items/{item_id}") +def compliant_depends_async_dependency(item=Depends(get_item_async)): + return item + +def dep_without_item_id(name: str): + return name + +@app.get("/items/{item_id}") +def noncompliant_depends_param_not_in_dep(item=Depends(dep_without_item_id)): # Noncompliant {{Add path parameter "item_id" to the function signature.}} + return item + +@app.get("/items/{item_id}") +def compliant_depends_annotated_qualified(item: typing.Annotated[dict, Depends(get_item)]): + return item + +# --- Nested/recursive Depends() --- + +def get_item_wrapper(item=Depends(get_item)): + return item + +@router.get("/items/{item_id}") +def compliant_nested_depends(item=Depends(get_item_wrapper)): + return item + +def get_item_annotated_wrapper(item: Annotated[dict, Depends(get_item)]): + return item + +@app.get("/items/{item_id}") +def compliant_nested_depends_annotated(item=Depends(get_item_annotated_wrapper)): + return item + +def dep_level2_no_id(name: str): + return name + +def dep_level1_no_id(x=Depends(dep_level2_no_id)): + return x + +@app.get("/items/{item_id}") +def noncompliant_nested_depends_not_covering(item=Depends(dep_level1_no_id)): # Noncompliant {{Add path parameter "item_id" to the function signature.}} + return item + +# --- Circular dependency detection (cycle in Depends chain) --- +# dep_b_circular references dep_a_circular (defined below) - tests cycle detection at line 112 +def dep_b_circular(dep=Depends(dep_a_circular)): + return dep + +def dep_a_circular(item_id: int, dep=Depends(dep_b_circular)): + return item_id + +@app.get("/items/{item_id}") +def compliant_circular_depends(dep=Depends(dep_a_circular)): + return dep + +# --- QualifiedExpression as Depends argument (tests lines 164-165 and 174) --- +class ItemDepsHolder: + @staticmethod + def get_item(item_id: int): + return item_id + +@app.get("/items/{item_id}") +def compliant_qualified_expr_depends(dep=Depends(ItemDepsHolder.get_item)): + return dep + +# --- Non-Name/non-QualifiedExpression as Depends argument (tests lines 167 and 170) --- +@app.get("/items/{item_id}") +def noncompliant_lambda_depends(dep=Depends(lambda: None)): # Noncompliant {{Add path parameter "item_id" to the function signature.}} + return dep From 15624620f91ac24327385066d5c90c2dddeef755 Mon Sep 17 00:00:00 2001 From: "sonar-nigel[bot]" <247337653+sonar-nigel[bot]@users.noreply.github.com> Date: Mon, 30 Mar 2026 15:51:02 +0200 Subject: [PATCH 057/322] SONARPY-3951 Rule S8521 Dictionary membership tests should not explicitly call ".keys()" (#993) Co-authored-by: Sonar Vibe Bot Co-authored-by: joke1196 GitOrigin-RevId: 9de21f27386465951d447001890d6ea1fc3eefc6 --- .../checks/DictKeysMembershipTestCheck.java | 62 +++++++++++++++++++ .../python/checks/OpenSourceCheckList.java | 1 + .../org/sonar/l10n/py/rules/python/S8521.html | 35 +++++++++++ .../org/sonar/l10n/py/rules/python/S8521.json | 15 +++++ .../DictKeysMembershipTestCheckTest.java | 28 +++++++++ .../checks/dictKeysMembershipTest.py | 40 ++++++++++++ 6 files changed, 181 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/DictKeysMembershipTestCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8521.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8521.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/DictKeysMembershipTestCheckTest.java create mode 100644 python-checks/src/test/resources/checks/dictKeysMembershipTest.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/DictKeysMembershipTestCheck.java b/python-checks/src/main/java/org/sonar/python/checks/DictKeysMembershipTestCheck.java new file mode 100644 index 000000000..09048c832 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/DictKeysMembershipTestCheck.java @@ -0,0 +1,62 @@ +/* + * SonarQube Python Plugin + * Copyright (C) 2011-2025 SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.InExpression; +import org.sonar.plugins.python.api.tree.QualifiedExpression; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; + +@Rule(key = "S8521") +public class DictKeysMembershipTestCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Remove this unnecessary \"keys()\" call."; + private static final String KEYS_METHOD_NAME = "keys"; + private static final TypeMatcher DICT_OR_SUBCLASS_KEYS_MATCHER = + TypeMatchers.isFunctionOwnerSatisfying(TypeMatchers.isOrExtendsType("builtins.dict")); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.IN, DictKeysMembershipTestCheck::checkInExpression); + } + + private static void checkInExpression(SubscriptionContext ctx) { + InExpression inExpression = (InExpression) ctx.syntaxNode(); + if (!(inExpression.rightOperand() instanceof CallExpression callExpression)) { + return; + } + if (!callExpression.arguments().isEmpty()) { + return; + } + if (!isKeysCall(callExpression)) { + return; + } + if (DICT_OR_SUBCLASS_KEYS_MATCHER.isTrueFor(callExpression.callee(), ctx)) { + ctx.addIssue(callExpression, MESSAGE); + } + } + + private static boolean isKeysCall(CallExpression callExpression) { + return callExpression.callee() instanceof QualifiedExpression qualifiedExpression + && KEYS_METHOD_NAME.equals(qualifiedExpression.name().name()); + } +} diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 1c8235c60..ac1d2bd4e 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -187,6 +187,7 @@ public Stream> getChecks() { DedicatedAssertionCheck.class, DefaultFactoryArgumentCheck.class, DeprecatedNumpyTypesCheck.class, + DictKeysMembershipTestCheck.class, DictionaryDuplicateKeyCheck.class, DictionaryStaticKeyCheck.class, DirectTypeComparisonCheck.class, diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8521.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8521.html new file mode 100644 index 000000000..61df253c7 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8521.html @@ -0,0 +1,35 @@ +

      This rule raises an issue when .keys() is called explicitly on a dictionary for membership testing.

      +

      Why is this an issue?

      +

      In Python, dictionaries support direct membership testing without needing to explicitly call the .keys() method. When you write +key in dict.keys(), you are being unnecessarily verbose.

      +

      The expression key in dict is the idiomatic Python way to check for key membership. It is:

      +
        +
      • more readable: the intent is clearer and the code is shorter
      • +
      • slightly more efficient: it avoids creating an intermediate dictionary view object
      • +
      • more Pythonic: it follows Python's principle of having one obvious way to do it
      • +
      +

      The .keys() method exists primarily for cases where you need to perform set operations on dictionary keys or when you need an explicit +view object. For simple membership testing, it is redundant because dictionaries are designed to support the in operator directly.

      +

      How to fix it

      +

      Remove the .keys() call and use direct membership testing on the dictionary.

      +

      Code examples

      +

      Noncompliant code example

      +
      +my_dict = {'a': 1, 'b': 2, 'c': 3}
      +
      +if 'a' in my_dict.keys():  # Noncompliant
      +    print('Found')
      +
      +

      Compliant solution

      +
      +my_dict = {'a': 1, 'b': 2, 'c': 3}
      +
      +if 'a' in my_dict:
      +    print('Found')
      +
      +

      Resources

      +

      Documentation

      + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8521.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8521.json new file mode 100644 index 000000000..0ae7d3ab3 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8521.json @@ -0,0 +1,15 @@ +{ + "title": "Dictionary membership tests should not explicitly call \".keys()\"", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "2min" + }, + "tags": [], + "defaultSeverity": "Minor", + "ruleSpecification": "RSPEC-8521", + "sqKey": "S8521", + "scope": "All", + "quickfix": "unknown" +} diff --git a/python-checks/src/test/java/org/sonar/python/checks/DictKeysMembershipTestCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/DictKeysMembershipTestCheckTest.java new file mode 100644 index 000000000..e985d74b9 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/DictKeysMembershipTestCheckTest.java @@ -0,0 +1,28 @@ +/* + * SonarQube Python Plugin + * Copyright (C) 2011-2025 SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.junit.jupiter.api.Test; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class DictKeysMembershipTestCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/dictKeysMembershipTest.py", new DictKeysMembershipTestCheck()); + } +} diff --git a/python-checks/src/test/resources/checks/dictKeysMembershipTest.py b/python-checks/src/test/resources/checks/dictKeysMembershipTest.py new file mode 100644 index 000000000..e5368056a --- /dev/null +++ b/python-checks/src/test/resources/checks/dictKeysMembershipTest.py @@ -0,0 +1,40 @@ +def noncompliant_basic(): + my_dict = {'a': 1, 'b': 2} + if 'a' in my_dict.keys(): # Noncompliant {{Remove this unnecessary "keys()" call.}} +# ^^^^^^^^^^^^^^ + print('Found') + + +def noncompliant_not_in(): + my_dict = {'a': 1, 'b': 2} + if 'a' not in my_dict.keys(): # Noncompliant {{Remove this unnecessary "keys()" call.}} +# ^^^^^^^^^^^^^^ + print('Not found') + + +def compliant_direct_membership(): + my_dict = {'a': 1, 'b': 2} + if 'a' in my_dict: + print('Found') + + +def compliant_keys_with_argument(): + my_dict = {'a': 1} + if 'a' in my_dict.keys('unexpected'): + print('Not flagged') + + +def compliant_values_call(): + my_dict = {'a': 1, 'b': 2} + if 1 in my_dict.values(): + print('Found value') + + +def compliant_custom_class(): + class CustomMapping: + def keys(self): + return ['x', 'y'] + + obj = CustomMapping() + if 'x' in obj.keys(): + print('Found') From 65840c9781b186614381001f7f18f7691c202754 Mon Sep 17 00:00:00 2001 From: Guillaume Dequenne Date: Mon, 30 Mar 2026 15:53:36 +0200 Subject: [PATCH 058/322] SONARPY-3997 Compute ReachingDefinitionsAnalysis at module-level (#1018) GitOrigin-RevId: 372eff5a6e5c40910ec716dfdd87024e9a830082 --- .../datetime_constructor_pytz_timezone.py | 4 +- .../fixpoint/ReachingDefinitionsAnalysis.java | 29 ++++++++- .../sonar/python/SubscriptionVisitorTest.java | 26 ++++++++ .../ReachingDefinitionsAnalysisTest.java | 61 ++++++++++++++++++- 4 files changed, 115 insertions(+), 5 deletions(-) diff --git a/python-checks/src/test/resources/checks/datetime_constructor_pytz_timezone.py b/python-checks/src/test/resources/checks/datetime_constructor_pytz_timezone.py index a178e4d6f..459eb8fa1 100644 --- a/python-checks/src/test/resources/checks/datetime_constructor_pytz_timezone.py +++ b/python-checks/src/test/resources/checks/datetime_constructor_pytz_timezone.py @@ -13,7 +13,9 @@ def timezone_in_a_variable(): return dt1 some_timezone_1 = pytz.timezone('US/Eastern') -dt1 = datetime.datetime(2022, 1, 1, tzinfo=some_timezone_1) # FN because of ReachingDefinitionsAnalysis limitations : it only runs in functions + #^^^^^^^^^^^^^^^^^^^^^^^^^^^> 1 {{The pytz.timezone is created here.}} +dt1 = datetime.datetime(2022, 1, 1, tzinfo=some_timezone_1) # Noncompliant {{Don't pass a "pytz.timezone" to the "datetime.datetime" constructor.}} + #^^^^^^^^^^^^^^^^^^^^^^ def compliant(): other_timezone = datetime.timezone(datetime.timedelta(hours=2)) diff --git a/python-frontend/src/main/java/org/sonar/python/cfg/fixpoint/ReachingDefinitionsAnalysis.java b/python-frontend/src/main/java/org/sonar/python/cfg/fixpoint/ReachingDefinitionsAnalysis.java index da22d50b0..80f13e94d 100644 --- a/python-frontend/src/main/java/org/sonar/python/cfg/fixpoint/ReachingDefinitionsAnalysis.java +++ b/python-frontend/src/main/java/org/sonar/python/cfg/fixpoint/ReachingDefinitionsAnalysis.java @@ -37,12 +37,14 @@ import org.sonar.plugins.python.api.tree.AssignmentStatement; import org.sonar.plugins.python.api.tree.BaseTreeVisitor; import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.FileInput; import org.sonar.plugins.python.api.tree.FunctionDef; import org.sonar.plugins.python.api.tree.Name; import org.sonar.plugins.python.api.tree.Tree; import org.sonar.python.tree.TreeUtils; import static org.sonar.plugins.python.api.tree.Tree.Kind.ASSIGNMENT_STMT; +import static org.sonar.plugins.python.api.tree.Tree.Kind.CLASSDEF; import static org.sonar.plugins.python.api.tree.Tree.Kind.FUNCDEF; import static org.sonar.plugins.python.api.tree.Tree.Kind.TRY_STMT; @@ -74,17 +76,38 @@ public Set valuesAtLocation(Name variable) { return assignedExpressions; } FunctionDef enclosingFunction = (FunctionDef) TreeUtils.firstAncestorOfKind(variable, FUNCDEF); - if (enclosingFunction == null || TreeUtils.hasDescendant(enclosingFunction, t -> t.is(TRY_STMT))) { + if (enclosingFunction != null) { + return valuesInFunctionScope(variable, enclosingFunction); + } + + FileInput fileInput = TreeUtils.firstAncestorOfClass(variable, FileInput.class); + if (fileInput == null) { + return Collections.emptySet(); + } + return analyzeScope(variable, fileInput, () -> ControlFlowGraph.build(fileInput, pythonFile), fileInput.globalVariables()); + } + + private Set valuesInFunctionScope(Name variable, FunctionDef enclosingFunction) { + return analyzeScope(variable, enclosingFunction, () -> ControlFlowGraph.build(enclosingFunction, pythonFile), enclosingFunction.localVariables()); + } + + private Set analyzeScope(Name variable, Tree scopeTree, Supplier cfgSupplier, Set variables) { + if (hasTryStatementInScope(scopeTree)) { return Collections.emptySet(); } - ControlFlowGraph cfg = ControlFlowGraph.build(enclosingFunction, pythonFile); + ControlFlowGraph cfg = cfgSupplier.get(); if (cfg == null) { return Collections.emptySet(); } - compute(cfg, enclosingFunction.localVariables()); + compute(cfg, variables); return assignedExpressionByName.getOrDefault(variable, Collections.emptySet()); } + private static boolean hasTryStatementInScope(Tree tree) { + return tree.children().stream().anyMatch(child -> + child.is(TRY_STMT) || (!child.is(FUNCDEF, CLASSDEF) && hasTryStatementInScope(child))); + } + private Set getAssignedExpressions(Name variable, ProgramStateAtElement programStateAtElement) { Symbol symbol = variable.symbol(); if (symbol == null) { diff --git a/python-frontend/src/test/java/org/sonar/python/SubscriptionVisitorTest.java b/python-frontend/src/test/java/org/sonar/python/SubscriptionVisitorTest.java index 07c4f9cdc..a10d26682 100644 --- a/python-frontend/src/test/java/org/sonar/python/SubscriptionVisitorTest.java +++ b/python-frontend/src/test/java/org/sonar/python/SubscriptionVisitorTest.java @@ -215,4 +215,30 @@ public void initialize(Context context) { .withFailMessage("valuesAtLocation was not called by both checks") .isZero(); } + + @Test + void reachingDefinitionAnalysis_at_module_level() { + var latch = new CountDownLatch(1); + + var check = new PythonSubscriptionCheck() { + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.EXPRESSION_STMT, ctx -> { + var exprStmt = (ExpressionStatement) ctx.syntaxNode(); + var expr = exprStmt.expressions().get(0); + if (expr instanceof Name name && "x".equals(name.name())) { + assertThat(ctx.valuesAtLocation(name)).extracting(e -> ((NumericLiteral) e).valueAsString()).containsExactly("42"); + latch.countDown(); + } + }); + } + }; + + var fileInput = PythonTestUtils.parse("x = 42\nx"); + var context = new Builder(fileInput, PythonTestUtils.pythonFile("file")).build(); + SubscriptionVisitor.analyze(List.of(check), context); + assertThat(latch.getCount()) + .withFailMessage("valuesAtLocation was not called at module level") + .isZero(); + } } diff --git a/python-frontend/src/test/java/org/sonar/python/cfg/fixpoint/ReachingDefinitionsAnalysisTest.java b/python-frontend/src/test/java/org/sonar/python/cfg/fixpoint/ReachingDefinitionsAnalysisTest.java index 5cd832656..9f7352a21 100644 --- a/python-frontend/src/test/java/org/sonar/python/cfg/fixpoint/ReachingDefinitionsAnalysisTest.java +++ b/python-frontend/src/test/java/org/sonar/python/cfg/fixpoint/ReachingDefinitionsAnalysisTest.java @@ -82,12 +82,37 @@ void valuesAtLocation_branches() { @Test void valuesAtLocation_outside_function() { Name x = (Name) lastExpression("x = 42; x"); - assertThat(analysis.valuesAtLocation(x)).isEmpty(); + assertThat(analysis.valuesAtLocation(x)).extracting(ReachingDefinitionsAnalysisTest::getValueAsString).containsExactly("42"); } @Test void valuesAtLocation_outside_function_annotated() { Name x = (Name) lastExpression("x: int = 42; x"); + assertThat(analysis.valuesAtLocation(x)).extracting(ReachingDefinitionsAnalysisTest::getValueAsString).containsExactly("42"); + } + + @Test + void valuesAtLocation_outside_function_branches() { + Name x = (Name) lastExpression( + "if p:", + " x = 1", + "else:", + " x = 2", + "x" + ); + assertThat(analysis.valuesAtLocation(x)).extracting(ReachingDefinitionsAnalysisTest::getValueAsString).containsExactlyInAnyOrder("1", "2"); + } + + @Test + void valuesAtLocation_outside_function_try_stmt() { + Name x = (Name) lastExpression( + "x = 1", + "try:", + " x = 2", + "except:", + " pass", + "x" + ); assertThat(analysis.valuesAtLocation(x)).isEmpty(); } @@ -97,6 +122,12 @@ void valuesAtLocation_invalid_cfg() { assertThat(analysis.valuesAtLocation(x)).isEmpty(); } + @Test + void valuesAtLocation_outside_function_invalid_cfg() { + Name x = (Name) lastExpression("x = 42", "break", "x"); + assertThat(analysis.valuesAtLocation(x)).isEmpty(); + } + @Test void valuesAtLocation_no_name_assignment() { Name x = (Name) lastExpressionInFunction("x.foo = 42", "x"); @@ -158,6 +189,34 @@ void compound_assignments() { assertThat(analysis.valuesAtLocation(x)).isEmpty(); } + @Test + void try_stmt_in_nested_function() { + Name x = (Name) lastExpressionInFunction( + "x = 1", + "def inner():", + " try:", + " pass", + " except:", + " pass", + "x" + ); + assertThat(analysis.valuesAtLocation(x)).extracting(ReachingDefinitionsAnalysisTest::getValueAsString).containsExactly("1"); + } + + @Test + void valuesAtLocation_outside_function_try_stmt_in_nested_function() { + Name x = (Name) lastExpression( + "x = 1", + "def f():", + " try:", + " pass", + " except:", + " pass", + "x" + ); + assertThat(analysis.valuesAtLocation(x)).extracting(ReachingDefinitionsAnalysisTest::getValueAsString).containsExactly("1"); + } + @Test void try_stmt() { Name x = (Name) lastExpressionInFunction( From 92bd53cd816d70ae3e29605b4657cab805a38f5d Mon Sep 17 00:00:00 2001 From: "sonar-nigel[bot]" <247337653+sonar-nigel[bot]@users.noreply.github.com> Date: Mon, 30 Mar 2026 15:58:13 +0200 Subject: [PATCH 059/322] SONARPY-3984 Fix S3626 false positive for bare return in marimo notebook cells (#1023) Co-authored-by: Vibe Bot GitOrigin-RevId: ac09baa64a490f05145a060ebca1d205ca8ef455 --- .../python/checks/RedundantJumpCheck.java | 8 +- .../python/checks/utils/MarimoUtils.java | 53 ++++++++++++ .../python/checks/utils/MarimoUtilsTest.java | 86 +++++++++++++++++++ .../test/resources/checks/redundantJump.py | 44 ++++++++++ .../types/custom_protobuf/marimo.protobuf | 41 +++++++++ .../resources/custom/marimo/__init__.pyi | 7 ++ .../tests/test_serializers.py | 2 +- 7 files changed, 237 insertions(+), 4 deletions(-) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/utils/MarimoUtils.java create mode 100644 python-checks/src/test/java/org/sonar/python/checks/utils/MarimoUtilsTest.java create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/marimo.protobuf create mode 100644 python-frontend/typeshed_serializer/resources/custom/marimo/__init__.pyi diff --git a/python-checks/src/main/java/org/sonar/python/checks/RedundantJumpCheck.java b/python-checks/src/main/java/org/sonar/python/checks/RedundantJumpCheck.java index bcb8ee75c..ef53fcc90 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/RedundantJumpCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/RedundantJumpCheck.java @@ -31,6 +31,7 @@ import org.sonar.plugins.python.api.tree.Tree.Kind; import org.sonar.python.cfg.PythonCfgBranchingBlock; import org.sonar.plugins.python.api.quickfix.PythonQuickFix; +import org.sonar.python.checks.utils.MarimoUtils; import org.sonar.python.quickfix.TextEditUtils; import org.sonar.python.tree.TreeUtils; @@ -54,7 +55,7 @@ private static void checkCfg(@Nullable ControlFlowGraph cfg, SubscriptionContext .forEach(cfgBlock -> { List elements = cfgBlock.elements(); Tree lastElement = elements.get(elements.size() - 1); - if (!isException(lastElement)) { + if (!isException(lastElement, ctx)) { var issue = ctx.addIssue(lastElement, message(lastElement)); addQuickFix(lastElement, issue); @@ -92,11 +93,12 @@ private static boolean isReturnWithExpression(Tree lastElement) { return lastElement.is(Kind.RETURN_STMT) && !((ReturnStatement) lastElement).expressions().isEmpty(); } - private static boolean isException(Tree lastElement) { + private static boolean isException(Tree lastElement, SubscriptionContext ctx) { return lastElement.is(Kind.RAISE_STMT) || isReturnWithExpression(lastElement) || isInsideSingleStatementBlock(lastElement) - || hasTryAncestor(lastElement); + || hasTryAncestor(lastElement) + || MarimoUtils.isTreeInMarimoDecoratedFunction(lastElement, ctx); } // ignore jumps in try statement because CFG is not precise diff --git a/python-checks/src/main/java/org/sonar/python/checks/utils/MarimoUtils.java b/python-checks/src/main/java/org/sonar/python/checks/utils/MarimoUtils.java new file mode 100644 index 000000000..b368f3881 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/utils/MarimoUtils.java @@ -0,0 +1,53 @@ +/* + * SonarQube Python Plugin + * Copyright (C) 2011-2025 SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.utils; + +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.Decorator; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.FunctionDef; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.tree.Tree.Kind; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.tree.TreeUtils; + +public class MarimoUtils { + + private static final TypeMatcher APP_CELL_MATCHER = TypeMatchers.isType("marimo.App.cell"); + private static final TypeMatcher APP_FUNCTION_MATCHER = TypeMatchers.isType("marimo.App.function"); + + private MarimoUtils() { + } + + public static boolean isTreeInMarimoDecoratedFunction(Tree tree, SubscriptionContext ctx) { + FunctionDef functionDef = (FunctionDef) TreeUtils.firstAncestorOfKind(tree, Kind.FUNCDEF); + if (functionDef == null) { + return false; + } + return functionDef.decorators().stream().anyMatch(decorator -> isAppCellDecorator(decorator, ctx)); + } + + private static boolean isAppCellDecorator(Decorator decorator, SubscriptionContext ctx) { + Expression expr = decorator.expression(); + if (expr instanceof CallExpression callExpr) { + expr = callExpr.callee(); + } + return APP_CELL_MATCHER.isTrueFor(expr, ctx) || APP_FUNCTION_MATCHER.isTrueFor(expr, ctx); + } +} diff --git a/python-checks/src/test/java/org/sonar/python/checks/utils/MarimoUtilsTest.java b/python-checks/src/test/java/org/sonar/python/checks/utils/MarimoUtilsTest.java new file mode 100644 index 000000000..66e23021b --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/utils/MarimoUtilsTest.java @@ -0,0 +1,86 @@ +/* + * SonarQube Python Plugin + * Copyright (C) 2011-2025 SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.utils; + +import com.sonar.sslr.api.AstNode; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.FileInput; +import org.sonar.plugins.python.api.tree.FunctionDef; +import org.sonar.python.TestPythonVisitorRunner; +import org.sonar.python.parser.PythonParser; +import org.sonar.python.semantic.ProjectLevelSymbolTable; +import org.sonar.python.semantic.v2.SymbolTableBuilderV2; +import org.sonar.python.semantic.v2.TypeInferenceV2; +import org.sonar.python.semantic.v2.typetable.ProjectLevelTypeTable; +import org.sonar.python.tree.PythonTreeMaker; + +import static org.assertj.core.api.Assertions.assertThat; + +class MarimoUtilsTest { + + @Test + void isTreeInMarimoDecoratedFunction_returnsFalseWhenNotInsideFunction() { + FileInput fileInput = parse(""" + import marimo + x = 1 + """); + + SubscriptionContext ctx = mockSubscriptionContext(); + + assertThat(MarimoUtils.isTreeInMarimoDecoratedFunction(fileInput, ctx)).isFalse(); + } + + @Test + void isTreeInMarimoDecoratedFunction_returnsTrueWhenInsideAppCellFunction() { + String content = """ + import marimo + app = marimo.App() + @app.cell + def some_cell(): + return 1 + """; + + FileInput fileInput = parse(content); + var typeTable = new ProjectLevelTypeTable(ProjectLevelSymbolTable.empty()); + var mockFile = new TestPythonVisitorRunner.MockPythonFile("", "test.py", content); + var symbolTableV2 = new SymbolTableBuilderV2(fileInput).build(); + new TypeInferenceV2(typeTable, mockFile, symbolTableV2, "").inferModuleType(fileInput); + + SubscriptionContext ctx = Mockito.mock(SubscriptionContext.class); + Mockito.when(ctx.typeTable()).thenReturn(typeTable); + + var statements = fileInput.statements().statements(); + var functionDef = (FunctionDef) statements.get(statements.size() - 1); + var returnStatement = functionDef.body().statements().get(0); + + assertThat(MarimoUtils.isTreeInMarimoDecoratedFunction(returnStatement, ctx)).isTrue(); + } + + private static SubscriptionContext mockSubscriptionContext() { + SubscriptionContext ctx = Mockito.mock(SubscriptionContext.class); + Mockito.when(ctx.typeTable()).thenReturn(new ProjectLevelTypeTable(ProjectLevelSymbolTable.empty())); + return ctx; + } + + private static FileInput parse(String content) { + PythonParser parser = PythonParser.create(); + AstNode astNode = parser.parse(content); + return new PythonTreeMaker().fileInput(astNode); + } +} diff --git a/python-checks/src/test/resources/checks/redundantJump.py b/python-checks/src/test/resources/checks/redundantJump.py index dbfecbf3b..f25ca6dcd 100644 --- a/python-checks/src/test/resources/checks/redundantJump.py +++ b/python-checks/src/test/resources/checks/redundantJump.py @@ -340,3 +340,47 @@ def match_statement_single_return(value): match value: case "42": return # OK + + +import marimo + +app = marimo.App() + + +@app.cell +def _(mo, engine): + _df = mo.sql(f"""SELECT * FROM table""", engine=engine) + return # OK + + +@app.cell(hide_code=True) +def _(mo): + mo.md("# Dashboard") + return # OK + + +@app.cell +def _(mo, condition): + if condition: + mo.md("Condition met") + return # OK + mo.md("Condition not met") + return # OK + + +@app.function +def helper(): + x = 1 + return # OK + + +@app.function +def helper_with_condition(condition): + if condition: + return # OK + return # OK + + +def not_a_marimo_cell(): + x = 1 + return # Noncompliant diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/marimo.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/marimo.protobuf new file mode 100644 index 000000000..aaf0cdc2c --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/marimo.protobuf @@ -0,0 +1,41 @@ + +marimo +App +marimo.App"*SonarPythonAnalyzerFakeStub.CustomStubBase*u +__init__marimo.App.__init__" +None*" +self + +marimo.App" +marimo.App* +args +Any* +kwargs +Any*l +cellmarimo.App.cell" +Any*" +self + +marimo.App" +marimo.App* +args +Any* +kwargs +Any*t +functionmarimo.App.function" +Any*" +self + +marimo.App" +marimo.App* +args +Any* +kwargs +Any*g +__path__marimo.__path__J +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list* +__annotations__marimo.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/typeshed_serializer/resources/custom/marimo/__init__.pyi b/python-frontend/typeshed_serializer/resources/custom/marimo/__init__.pyi new file mode 100644 index 000000000..7a173b7e1 --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/marimo/__init__.pyi @@ -0,0 +1,7 @@ +from SonarPythonAnalyzerFakeStub import CustomStubBase +from typing import Any + +class App(CustomStubBase): + def __init__(self, *args: Any, **kwargs: Any) -> None: ... + def cell(self, *args: Any, **kwargs: Any) -> Any: ... + def function(self, *args: Any, **kwargs: Any) -> Any: ... diff --git a/python-frontend/typeshed_serializer/tests/test_serializers.py b/python-frontend/typeshed_serializer/tests/test_serializers.py index 3c05fa2d2..ecf80c897 100644 --- a/python-frontend/typeshed_serializer/tests/test_serializers.py +++ b/python-frontend/typeshed_serializer/tests/test_serializers.py @@ -74,7 +74,7 @@ def test_custom_stubs_serializer(typeshed_custom_stubs): custom_stubs_serializer.serialize() assert custom_stubs_serializer.get_build_result.call_count == 1 # Not every files from "typeshed_custom_stubs" build are serialized, as some are builtins - assert symbols.save_module.call_count == 361 + assert symbols.save_module.call_count == 362 def test_importer_serializer(): From 05cdab9c32b95b41693189ef0766798a5f444a62 Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Mon, 30 Mar 2026 16:10:01 +0200 Subject: [PATCH 060/322] SONARPY-4003 Fix S7630 raise on orchestrator cache action (#1027) GitOrigin-RevId: 1378d63ac646f9c7534e313a3d90b6d7e5dd122a --- .github/actions/setup-orchestrator-cache/action.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/actions/setup-orchestrator-cache/action.yml b/.github/actions/setup-orchestrator-cache/action.yml index f578a3413..8a9e92e44 100644 --- a/.github/actions/setup-orchestrator-cache/action.yml +++ b/.github/actions/setup-orchestrator-cache/action.yml @@ -12,11 +12,13 @@ runs: - name: Calculate orchestrator cache key id: set-paths shell: bash + env: + SQ_VERSION: ${{ inputs.sq-version }} run: | # Get current month for cache rotation CURRENT_MONTH=$(date +"%B") - CACHE_KEY="orchestrator-${{ github.workflow }}-${{ inputs.sq-version }}-${CURRENT_MONTH}" + CACHE_KEY="orchestrator-${{ github.workflow }}-${SQ_VERSION}-${CURRENT_MONTH}" echo "cache-key=${CACHE_KEY}" >> $GITHUB_OUTPUT - name: Setup orchestrator cache From e4658ec6419d51cf7e52bc14798193a62bac95da Mon Sep 17 00:00:00 2001 From: "sonar-nigel[bot]" <247337653+sonar-nigel[bot]@users.noreply.github.com> Date: Tue, 31 Mar 2026 14:20:52 +0200 Subject: [PATCH 061/322] SONARPY-2299 Fix S3801 false positive for match statements with exhaustive coverage (#1020) GitOrigin-RevId: 88a3b5e788bbe41167ebd49be451ee2a7f3c7f37 --- .../python/checks/ConsistentReturnCheck.java | 11 +- .../resources/checks/afterJumpStatement.py | 2 +- .../test/resources/checks/consistentReturn.py | 233 +++++++++++++++++- .../resources/checks/infiniteRecursion.py | 2 +- .../test/resources/checks/invariantReturn.py | 2 +- .../python/cfg/ControlFlowGraphBuilder.java | 42 +++- .../python/api/cfg/ControlFlowGraphTest.java | 120 +++++++++ 7 files changed, 396 insertions(+), 16 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/ConsistentReturnCheck.java b/python-checks/src/main/java/org/sonar/python/checks/ConsistentReturnCheck.java index 956ff5cc7..ec2db7bed 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/ConsistentReturnCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/ConsistentReturnCheck.java @@ -17,7 +17,6 @@ package org.sonar.python.checks; import java.util.List; -import java.util.stream.Collectors; import org.sonar.check.Rule; import org.sonar.plugins.python.api.PythonSubscriptionCheck; import org.sonar.plugins.python.api.SubscriptionContext; @@ -44,12 +43,12 @@ public void initialize(Context context) { if (cfg == null || hasExceptOrFinally(cfg)) { return; } - List endStatements = cfg.end().predecessors().stream() + List endStatements = cfg.end().predecessors().stream() .map(block -> parentStatement(block.elements().get(block.elements().size() - 1))) .filter(s -> !s.is(Kind.RAISE_STMT, Kind.ASSERT_STMT, Kind.WITH_STMT) && !isWhileTrue(s)) - .collect(Collectors.toList()); + .toList(); - List returnsWithValue = endStatements.stream() + List returnsWithValue = endStatements.stream() .filter(s -> s.is(Kind.RETURN_STMT) && hasValue((ReturnStatement) s)) .toList(); @@ -68,9 +67,9 @@ private static boolean isWhileTrue(Statement statement) { return statement.is(Kind.WHILE_STMT) && Expressions.isTruthy(((WhileStatement) statement).condition()); } - private static void addIssue(SubscriptionContext ctx, FunctionDef functionDef, List endStatements) { + private static void addIssue(SubscriptionContext ctx, FunctionDef functionDef, List endStatements) { PreciseIssue issue = ctx.addIssue(functionDef.name(), MESSAGE); - for (Tree statement : endStatements) { + for (Statement statement : endStatements) { if (statement.is(Kind.RETURN_STMT)) { ReturnStatement returnStatement = (ReturnStatement) statement; boolean hasValue = hasValue(returnStatement); diff --git a/python-checks/src/test/resources/checks/afterJumpStatement.py b/python-checks/src/test/resources/checks/afterJumpStatement.py index 5c5895a25..bd0f1dbbc 100644 --- a/python-checks/src/test/resources/checks/afterJumpStatement.py +++ b/python-checks/src/test/resources/checks/afterJumpStatement.py @@ -223,4 +223,4 @@ def match_statement_fn(value): match value: case "1": return case x: return - print("unreachable") # FN, "case x" will match anything + print("unreachable") # Noncompliant diff --git a/python-checks/src/test/resources/checks/consistentReturn.py b/python-checks/src/test/resources/checks/consistentReturn.py index 62633c28f..f5c8aded2 100644 --- a/python-checks/src/test/resources/checks/consistentReturn.py +++ b/python-checks/src/test/resources/checks/consistentReturn.py @@ -106,13 +106,52 @@ def implicit_return_on_match_statement(x): # Noncompliant return x # ^^^^^^^^ < {{Return with value}} -def match_statement_with_default(x): # Noncompliant +def match_statement_with_default(x): match(x): case 0: return x case _: return 42 +def match_wildcard_return_or_raise(x): + match x: + case 1: + return 2 + case _: + raise ValueError("error") + +def match_capture_pattern_all_return(x): + match x: + case 1: + return 2 + case 2: + return 3 + case other: + return other + 10 + +def match_wildcard_with_guard(x): # Noncompliant + match x: + case 1: + return 2 + case _ if x > 0: + return 3 + +def match_irrefutable_not_last(x): + match x: + case _: + return 1 + case 1: + return 2 + +def match_irrefutable_in_middle(x): + match x: + case 0: + return 1 + case _: + return 2 + case 1: + pass + # raise / assert def return_value_or_raise(x): @@ -182,3 +221,195 @@ def fp_on_undetected_raise(x): # Noncompliant def raise_error(): raise "error" + + +# Patterns from ruling analysis + +def find_match_in_loop(texts, frag): # Noncompliant +# ^^^^^^^^^^^^^^^^^^ + for t in texts: +# ^^^ < {{Implicit return without value if the condition is false}} + if t is not frag and t.left > frag.right: + return t +# ^^^^^^^^ < {{Return with value}} + +def multiple_value_returns_with_bare_return(aug_tok1, params): # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + if not aug_tok1: + return +# ^^^^^^ < {{Return without value}} + if aug_tok1.period_final: + return "REASON_KNOWN_COLLOCATION" +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ < {{Return with value}} + if aug_tok1.abbr: + return "REASON_ABBR" +# ^^^^^^^^^^^^^^^^^^^^ < {{Return with value}} + return +# ^^^^^^ < {{Return without value}} + +def return_only_in_else_branch(run_mode): # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^^^^^^^ + if run_mode == 'v1': + do_v1_test() +# ^^^^^^^^^^^^ < {{Implicit return without value}} + elif run_mode == 'v2': + do_v2_test() +# ^^^^^^^^^^^^ < {{Implicit return without value}} + else: + return ValueError('Unknown run mode %s' % run_mode) +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ < {{Return with value}} + + +class MyClass: + def value_or_none(self): # Noncompliant +# ^^^^^^^^^^^^^ + if self.condition: +# ^^ < {{Implicit return without value if the condition is false}} + return self._value +# ^^^^^^^^^^^^^^^^^^ < {{Return with value}} + + def always_returns_none_or_value(self): + if self.condition: + return self._value + return None + + @property + def linked_object(self): # Noncompliant +# ^^^^^^^^^^^^^ + if self.link_type == "a": + return self.a +# ^^^^^^^^^^^^^ < {{Return with value}} + elif self.link_type == "b": + return self.b +# ^^^^^^^^^^^^^ < {{Return with value}} + elif self.link_type == "c": + return self.c +# ^^^^^^^^^^^^^ < {{Return with value}} + elif self.link_type == "d": +# ^^^^ < {{Implicit return without value if the condition is false}} + return self.d +# ^^^^^^^^^^^^^ < {{Return with value}} + + +def outer_with_nested(params): + def handler(cursor): # Noncompliant +# ^^^^^^^ + if cursor.bindvars is None: + return +# ^^^^^^ < {{Return without value}} + if isinstance(cursor.bindvars, list): + return [v.getvalue() for v in cursor.bindvars] +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ < {{Return with value}} + if isinstance(cursor.bindvars, dict): + return {n: v.getvalue() for n, v in cursor.bindvars.items()} +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ < {{Return with value}} + raise TypeError("Unexpected bindvars") + + result = run(handler) + return result + + +def boundaries(start, end): # Noncompliant +# ^^^^^^^^^^ + if not isinstance(start, int): + raise TypeError("expected int") + if not isinstance(end, int): + raise TypeError("expected int") + if start > end: + start, end = end, start + if start < end: +# ^^ < {{Implicit return without value if the condition is false}} + return start, end +# ^^^^^^^^^^^^^^^^^ < {{Return with value}} + + +class MiddlewareMixin: + @staticmethod + def process_request(request): # Noncompliant +# ^^^^^^^^^^^^^^^ + if not request.user.is_authenticated: +# ^^ < {{Implicit return without value if the condition is false}} + if request.path not in IGNORE_URL: +# ^^ < {{Implicit return without value if the condition is false}} + return redirect('/login/') +# ^^^^^^^^^^^^^^^^^^^^^^^^^^ < {{Return with value}} + + +class WebhookPlugin: + def order_fully_paid(self, order, previous_value): # Noncompliant +# ^^^^^^^^^^^^^^^^ + if not self.active: + return previous_value +# ^^^^^^^^^^^^^^^^^^^^^ < {{Return with value}} + event_type = "ORDER_FULLY_PAID" + if webhooks := get_webhooks_for_event(event_type): +# ^^ < {{Implicit return without value if the condition is false}} + trigger_webhooks_async(webhooks) +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ < {{Implicit return without value}} + + +class CacheFactory: + @classmethod + def factory(cls, backend, ttl): # Noncompliant +# ^^^^^^^ + if backend == "memory": + return CacheDict(ttl) +# ^^^^^^^^^^^^^^^^^^^^^ < {{Return with value}} + elif backend == "disk": + return CacheDisk(ttl) +# ^^^^^^^^^^^^^^^^^^^^^ < {{Return with value}} + else: + log.error("unrecognized cache type") +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ < {{Implicit return without value}} + + +@lru_cache() +def cached_lookup(locale): # Noncompliant +# ^^^^^^^^^^^^^ + name = get_name(locale) + if name is not None: +# ^^ < {{Implicit return without value if the condition is false}} + return load_resource(name) +# ^^^^^^^^^^^^^^^^^^^^^^^^^^ < {{Return with value}} + + +@some_hook(flag=True) +def announce_header(**kwargs): # Noncompliant +# ^^^^^^^^^^^^^^^ + if not session.user or config.DISABLE_CHECK: + return +# ^^^^^^ < {{Return without value}} + if down: + text = "scheduler not running" + elif mismatch: + text = "version mismatch" + else: + return +# ^^^^^^ < {{Return without value}} + return 'error', text, True +# ^^^^^^^^^^^^^^^^^^^^^^^^^^ < {{Return with value}} + + +def early_sentinel_value_return(path, conn=None): # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + if conn is None: + conn = get_conn() + if conn is False: + return False +# ^^^^^^^^^^^^ < {{Return with value}} + for comp in path.split("/"): +# ^^^ < {{Implicit return without value if the condition is false}} + process(comp) + + +class SearchHelper: + def dup_check(self, sequence): # Noncompliant +# ^^^^^^^^^ + for sc in self.all_shortcuts: +# ^^^ < {{Implicit return without value if the condition is false}} + if sc is self.shortcut: + continue + for k in sc['keys']: + if k == sequence: + return sc['name'] +# ^^^^^^^^^^^^^^^^^ < {{Return with value}} diff --git a/python-checks/src/test/resources/checks/infiniteRecursion.py b/python-checks/src/test/resources/checks/infiniteRecursion.py index 2d39808e7..090f48c6f 100644 --- a/python-checks/src/test/resources/checks/infiniteRecursion.py +++ b/python-checks/src/test/resources/checks/infiniteRecursion.py @@ -353,7 +353,7 @@ def match_statement_no_fp(value): return no_fp_with_match(value + 1) -def match_statement_fn(value): # FN, "case x" will always match +def match_statement_fn(value): # Noncompliant match value: case x: return match_statement_fn(value + 1) diff --git a/python-checks/src/test/resources/checks/invariantReturn.py b/python-checks/src/test/resources/checks/invariantReturn.py index ab9853727..3648cb887 100644 --- a/python-checks/src/test/resources/checks/invariantReturn.py +++ b/python-checks/src/test/resources/checks/invariantReturn.py @@ -529,7 +529,7 @@ def match_statement_no_fp_with_implicit_return(value): # OK, implicit "None" re return 42 -def match_statement_fn_with_capture(value): # FN, implicit "None" return is unreachable +def match_statement_fn_with_capture(value): # Noncompliant match value: case 1: return 42 diff --git a/python-frontend/src/main/java/org/sonar/python/cfg/ControlFlowGraphBuilder.java b/python-frontend/src/main/java/org/sonar/python/cfg/ControlFlowGraphBuilder.java index 93d314e90..ffde10223 100644 --- a/python-frontend/src/main/java/org/sonar/python/cfg/ControlFlowGraphBuilder.java +++ b/python-frontend/src/main/java/org/sonar/python/cfg/ControlFlowGraphBuilder.java @@ -204,26 +204,56 @@ private static PythonCfgBlock buildFuncDefStatement(FunctionDef functionDef, Pyt private PythonCfgBlock buildMatchStatement(MatchStatement statement, PythonCfgBlock successor) { List caseBlocks = statement.caseBlocks(); - PythonCfgBlock matchingBlock = null; - PythonCfgBlock falseSuccessor = successor; + int irrefutableIdx = findIrrefutableCaseIndex(caseBlocks); + + PythonCfgBlock irrefutableBlock = null; + if (irrefutableIdx >= 0) { + CaseBlock irrefutableCase = caseBlocks.get(irrefutableIdx); + PythonCfgBlock irrefutableBodyBlock = build(irrefutableCase.body().statements(), createSimpleBlock(successor)); + irrefutableBlock = createSimpleBlock(irrefutableBodyBlock); + irrefutableBlock.addElement(irrefutableCase.pattern()); + irrefutableBlock.addElement(statement.subjectExpression()); + } + + PythonCfgBlock matchingBlock = irrefutableBlock; + PythonCfgBlock falseSuccessor = irrefutableBlock != null ? irrefutableBlock : successor; for (int i = caseBlocks.size() - 1; i >= 0; i--) { - PythonCfgBlock caseBodyBlock = createSimpleBlock(successor); + if (irrefutableIdx >= 0 && i >= irrefutableIdx) { + continue; + } + if (i == irrefutableIdx - 1) { + falseSuccessor = irrefutableBlock; + } CaseBlock caseBlock = caseBlocks.get(i); Pattern pattern = caseBlock.pattern(); Guard guard = caseBlock.guard(); - caseBodyBlock = build(caseBlock.body().statements(), caseBodyBlock); + PythonCfgBlock caseBodyBlock = build(caseBlock.body().statements(), createSimpleBlock(successor)); matchingBlock = createBranchingBlock(pattern, caseBodyBlock, falseSuccessor); if (guard != null) { matchingBlock.addElement(guard.condition()); } matchingBlock.addElement(pattern); matchingBlock.addElement(statement.subjectExpression()); - blocks.add(matchingBlock); - falseSuccessor = matchingBlock; + if (i < irrefutableIdx || irrefutableIdx < 0) { + falseSuccessor = matchingBlock; + } } return matchingBlock; } + private static int findIrrefutableCaseIndex(List caseBlocks) { + for (int i = 0; i < caseBlocks.size(); i++) { + if (isIrrefutablePattern(caseBlocks.get(i))) { + return i; + } + } + return -1; + } + + private static boolean isIrrefutablePattern(CaseBlock caseBlock) { + return caseBlock.guard() == null && caseBlock.pattern().is(Tree.Kind.WILDCARD_PATTERN, Tree.Kind.CAPTURE_PATTERN); + } + private PythonCfgBlock buildWithStatement(WithStatement withStatement, PythonCfgBlock successor) { PythonCfgBlock withBodyBlock = build(withStatement.statements().statements(), createSimpleBlock(successor)); // exceptions may be raised inside with block and be caught by context manager diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/cfg/ControlFlowGraphTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/cfg/ControlFlowGraphTest.java index 35195c7db..09475dcff 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/cfg/ControlFlowGraphTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/cfg/ControlFlowGraphTest.java @@ -632,6 +632,126 @@ void match_statement() { assertThat(secondCaseFalseSuccessor).isEqualTo(barBlock); } + @Test + void match_statement_irrefutable_in_middle() { + ControlFlowGraph cfg = cfg(""" + foo() """, + "match x:", + " case \"a\": y()", + " case _: z()", + " case \"b\": w()", + "bar()" + ); + + PythonCfgBranchingBlock start = (PythonCfgBranchingBlock) cfg.start(); + PythonCfgEndBlock end = (PythonCfgEndBlock) cfg.end(); + assertThat(end.predecessors()).hasSize(1); + CfgBlock barBlock = end.predecessors().stream().findFirst().get(); + + // Start block evaluates case "a" (first refutable case before irrefutable) + assertThat(start.elements()).extracting(Tree::getKind) + .containsExactly(Kind.EXPRESSION_STMT, Kind.NAME, Kind.STRING_LITERAL_PATTERN); + + // case "a" body flows to bar + PythonCfgSimpleBlock caseABody = (PythonCfgSimpleBlock) start.trueSuccessor(); + assertThat(caseABody.elements()).extracting(Tree::getKind).containsExactly(Kind.EXPRESSION_STMT); + assertThat(caseABody.successors()).containsExactly(barBlock); + + // case "a" false successor is the irrefutable block (case _), not case "b" + PythonCfgSimpleBlock irrefutableBlock = (PythonCfgSimpleBlock) start.falseSuccessor(); + assertThat(irrefutableBlock.elements()).extracting(Tree::getKind) + .containsExactly(Kind.NAME, Kind.WILDCARD_PATTERN); + + // irrefutable body flows to bar + CfgBlock irrefutableBody = irrefutableBlock.successors().stream().findFirst().get(); + assertThat(irrefutableBody.elements()).extracting(Tree::getKind).containsExactly(Kind.EXPRESSION_STMT); + assertThat(irrefutableBody.successors()).containsExactly(barBlock); + } + + @Test + void match_statement_irrefutable_last() { + ControlFlowGraph cfg = cfg(""" + foo() """, + "match x:", + " case \"a\": y()", + " case _: z()", + "bar()" + ); + + PythonCfgBranchingBlock start = (PythonCfgBranchingBlock) cfg.start(); + PythonCfgEndBlock end = (PythonCfgEndBlock) cfg.end(); + assertThat(end.predecessors()).hasSize(1); + CfgBlock barBlock = end.predecessors().stream().findFirst().get(); + + // case "a" is the only pre-irrefutable case + assertThat(start.elements()).extracting(Tree::getKind) + .containsExactly(Kind.EXPRESSION_STMT, Kind.NAME, Kind.STRING_LITERAL_PATTERN); + + PythonCfgSimpleBlock caseABody = (PythonCfgSimpleBlock) start.trueSuccessor(); + assertThat(caseABody.successors()).containsExactly(barBlock); + + // case "a" false successor is the irrefutable block (case _), not the post-match successor + PythonCfgSimpleBlock irrefutableBlock = (PythonCfgSimpleBlock) start.falseSuccessor(); + assertThat(irrefutableBlock.elements()).extracting(Tree::getKind) + .containsExactly(Kind.NAME, Kind.WILDCARD_PATTERN); + + CfgBlock irrefutableBody = irrefutableBlock.successors().stream().findFirst().get(); + assertThat(irrefutableBody.successors()).containsExactly(barBlock); + } + + @Test + void match_statement_irrefutable_first() { + ControlFlowGraph cfg = cfg(""" + foo() """, + "match x:", + " case _: y()", + " case \"a\": z()", + "bar()" + ); + + // When the irrefutable case is first, the CFG start is a simple block (no branching needed) + PythonCfgSimpleBlock start = (PythonCfgSimpleBlock) cfg.start(); + PythonCfgEndBlock end = (PythonCfgEndBlock) cfg.end(); + assertThat(end.predecessors()).hasSize(1); + CfgBlock barBlock = end.predecessors().stream().findFirst().get(); + + // The start block is the irrefutable block; subsequent unreachable cases are excluded from the CFG + assertThat(start.elements()).extracting(Tree::getKind) + .containsExactly(Kind.EXPRESSION_STMT, Kind.NAME, Kind.WILDCARD_PATTERN); + + CfgBlock irrefutableBody = start.successors().stream().findFirst().get(); + assertThat(irrefutableBody.elements()).extracting(Tree::getKind).containsExactly(Kind.EXPRESSION_STMT); + assertThat(irrefutableBody.successors()).containsExactly(barBlock); + } + + @Test + void match_statement_guarded_wildcard_is_refutable() { + ControlFlowGraph cfg = cfg(""" + foo() """, + "match x:", + " case \"a\": y()", + " case _ if w(): z()", + "bar()" + ); + + PythonCfgBranchingBlock start = (PythonCfgBranchingBlock) cfg.start(); + PythonCfgEndBlock end = (PythonCfgEndBlock) cfg.end(); + assertThat(end.predecessors()).hasSize(1); + CfgBlock barBlock = end.predecessors().stream().findFirst().get(); + + assertThat(start.elements()).extracting(Tree::getKind) + .containsExactly(Kind.EXPRESSION_STMT, Kind.NAME, Kind.STRING_LITERAL_PATTERN); + + PythonCfgSimpleBlock caseABody = (PythonCfgSimpleBlock) start.trueSuccessor(); + assertThat(caseABody.successors()).containsExactly(barBlock); + + // A guarded wildcard is refutable: it still has a false successor (the no-match path) + PythonCfgBranchingBlock guardedWildcard = (PythonCfgBranchingBlock) start.falseSuccessor(); + assertThat(guardedWildcard.elements()).extracting(Tree::getKind) + .containsExactly(Kind.NAME, Kind.WILDCARD_PATTERN, Kind.CALL_EXPR); + assertThat(guardedWildcard.falseSuccessor()).isEqualTo(barBlock); + } + @Test void CFGBlock_toString() { PythonCfgEndBlock endBlock = new PythonCfgEndBlock(); From dce39f8c05604cf90449e639096e1fe1cb559af6 Mon Sep 17 00:00:00 2001 From: Thomas Serre <118730793+thomas-serre-sonarsource@users.noreply.github.com> Date: Tue, 31 Mar 2026 16:49:14 +0200 Subject: [PATCH 062/322] SONARPY-3851 Cache LiveVariableAnalysis (#1026) GitOrigin-RevId: 45ba3c2e62e9b64beebfcefeed4b9e8f26505bf8 --- .../sonar/python/checks/DeadStoreCheck.java | 92 +++++++++---------- .../python/checks/IgnoredParameterCheck.java | 6 +- .../python/api/PythonVisitorContext.java | 17 ++++ .../python/api/SubscriptionContext.java | 3 + .../org/sonar/python/SubscriptionVisitor.java | 6 ++ .../python/api/PythonVisitorContextTest.java | 35 +++++++ 6 files changed, 112 insertions(+), 47 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/DeadStoreCheck.java b/python-checks/src/main/java/org/sonar/python/checks/DeadStoreCheck.java index ab20ea815..5e112e0f0 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/DeadStoreCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/DeadStoreCheck.java @@ -55,55 +55,11 @@ @Rule(key = "S1854") public class DeadStoreCheck extends PythonSubscriptionCheck { + public static final String QUICK_FIX_MESSAGE = "Remove the unused assignment"; private static final String MESSAGE_TEMPLATE = "Remove this assignment to local variable '%s'; the value is never used."; - private static final String SECONDARY_MESSAGE_TEMPLATE = "'%s' is reassigned here."; - public static final String QUICK_FIX_MESSAGE = "Remove the unused assignment"; - private boolean isTemplateVariablesAccessEnabled = false; - @Override - public void initialize(Context context) { - context.registerSyntaxNodeConsumer(Tree.Kind.FILE_INPUT, this::checkTemplateVariablesAccessEnabled); - context.registerSyntaxNodeConsumer(Tree.Kind.FUNCDEF, ctx -> { - FunctionDef functionDef = (FunctionDef) ctx.syntaxNode(); - if (TreeUtils.hasDescendant(functionDef, tree -> tree.is(Tree.Kind.TRY_STMT))) { - return; - } - ControlFlowGraph cfg = ctx.cfg(functionDef); - if (cfg == null) { - return; - } - LiveVariablesAnalysis lva = LiveVariablesAnalysis.analyze(cfg); - cfg.blocks().forEach(block -> verifyBlock(ctx, block, lva.getLiveVariables(block), lva.getReadSymbols(), functionDef)); - }); - } - - private void checkTemplateVariablesAccessEnabled(SubscriptionContext ctx) { - var importedNamesCollector = new ImportedNamesCollector(); - importedNamesCollector.collect(ctx.syntaxNode()); - isTemplateVariablesAccessEnabled = importedNamesCollector.anyMatches("pandas"::equals); - } - - /** - * Bottom-up approach, keeping track of which variables will be read by successor elements. - */ - private void verifyBlock(SubscriptionContext ctx, CfgBlock block, LiveVariablesAnalysis.LiveVariables blockLiveVariables, - Set readSymbols, FunctionDef functionDef) { - - var stringLiteralValuesCollector = new StringLiteralValuesCollector(); - if (isTemplateVariablesAccessEnabled) { - stringLiteralValuesCollector.collect(functionDef); - } - DeadStoreUtils.findUnnecessaryAssignments(block, blockLiveVariables, functionDef) - .stream() - // symbols should have at least one read usage (otherwise will be reported by S1481) - .filter(unnecessaryAssignment -> readSymbols.contains(unnecessaryAssignment.symbol)) - .filter((unnecessaryAssignment -> !isException(unnecessaryAssignment.symbol, unnecessaryAssignment.element, functionDef, - stringLiteralValuesCollector))) - .forEach(unnecessaryAssignment -> raiseIssue(ctx, unnecessaryAssignment)); - } - private static void raiseIssue(SubscriptionContext ctx, DeadStoreUtils.UnnecessaryAssignment unnecessaryAssignment) { Tree element; if (unnecessaryAssignment.element instanceof ClassDef classDefElement) { @@ -247,7 +203,6 @@ private static boolean isFunctionDeclarationSymbol(Symbol symbol) { return symbol.usages().stream().anyMatch(u -> u.kind() == Usage.Kind.FUNC_DECLARATION); } - private static boolean isExceptionForQuickFix(Statement tree) { switch (tree.getKind()) { // foo:str = bar @@ -265,6 +220,51 @@ private static boolean isExceptionForQuickFix(Statement tree) { } } + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.FILE_INPUT, this::checkTemplateVariablesAccessEnabled); + context.registerSyntaxNodeConsumer(Tree.Kind.FUNCDEF, ctx -> { + FunctionDef functionDef = (FunctionDef) ctx.syntaxNode(); + if (TreeUtils.hasDescendant(functionDef, tree -> tree.is(Tree.Kind.TRY_STMT))) { + return; + } + ControlFlowGraph cfg = ctx.cfg(functionDef); + if (cfg == null) { + return; + } + LiveVariablesAnalysis lva = ctx.lva(functionDef); + if (lva == null) { + return; + } + cfg.blocks().forEach(block -> verifyBlock(ctx, block, lva.getLiveVariables(block), lva.getReadSymbols(), functionDef)); + }); + } + + private void checkTemplateVariablesAccessEnabled(SubscriptionContext ctx) { + var importedNamesCollector = new ImportedNamesCollector(); + importedNamesCollector.collect(ctx.syntaxNode()); + isTemplateVariablesAccessEnabled = importedNamesCollector.anyMatches("pandas"::equals); + } + + /** + * Bottom-up approach, keeping track of which variables will be read by successor elements. + */ + private void verifyBlock(SubscriptionContext ctx, CfgBlock block, LiveVariablesAnalysis.LiveVariables blockLiveVariables, + Set readSymbols, FunctionDef functionDef) { + + var stringLiteralValuesCollector = new StringLiteralValuesCollector(); + if (isTemplateVariablesAccessEnabled) { + stringLiteralValuesCollector.collect(functionDef); + } + DeadStoreUtils.findUnnecessaryAssignments(block, blockLiveVariables, functionDef) + .stream() + // symbols should have at least one read usage (otherwise will be reported by S1481) + .filter(unnecessaryAssignment -> readSymbols.contains(unnecessaryAssignment.symbol)) + .filter((unnecessaryAssignment -> !isException(unnecessaryAssignment.symbol, unnecessaryAssignment.element, functionDef, + stringLiteralValuesCollector))) + .forEach(unnecessaryAssignment -> raiseIssue(ctx, unnecessaryAssignment)); + } + private static class SideEffectDetector extends BaseTreeVisitor { private boolean sideEffect = false; diff --git a/python-checks/src/main/java/org/sonar/python/checks/IgnoredParameterCheck.java b/python-checks/src/main/java/org/sonar/python/checks/IgnoredParameterCheck.java index 6921e108b..57128305e 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/IgnoredParameterCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/IgnoredParameterCheck.java @@ -47,7 +47,11 @@ public void initialize(Context context) { if (cfg == null) { return; } - LiveVariablesAnalysis lva = LiveVariablesAnalysis.analyze(cfg); + LiveVariablesAnalysis lva = ctx.lva(functionDef); + if (lva == null) { + return; + } + Set unreachableBlocks = CfgUtils.unreachableBlocks(cfg); cfg.blocks().forEach(block -> { var unnecessaryAssignments = DeadStoreUtils.findUnnecessaryAssignments(block, lva.getLiveVariables(block), functionDef); diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonVisitorContext.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonVisitorContext.java index 5d3fae34d..40356853e 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonVisitorContext.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonVisitorContext.java @@ -20,6 +20,7 @@ import com.sonar.sslr.api.RecognitionException; import java.io.File; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; @@ -37,6 +38,7 @@ import org.sonar.plugins.python.api.tree.Tree; import org.sonar.plugins.python.api.types.v2.ModuleType; import org.sonar.python.caching.CacheContextImpl; +import org.sonar.python.cfg.fixpoint.LiveVariablesAnalysis; import org.sonar.python.cfg.fixpoint.ReachingDefinitionsAnalysis; import org.sonar.python.semantic.ProjectLevelSymbolTable; import org.sonar.python.semantic.SymbolTableBuilder; @@ -58,9 +60,12 @@ public class PythonVisitorContext extends PythonInputFileContext { private final ProjectConfiguration projectConfiguration; private final CallGraph callGraph; private final Map cfgMap; + private final Map lvaMap; private final ReachingDefinitionsAnalysis reachingDefinitionsAnalysis; private final TypeTable typeTable; + + private PythonVisitorContext(FileInput rootTree, PythonFile pythonFile, @Nullable File workingDirectory, @@ -79,6 +84,7 @@ private PythonVisitorContext(FileInput rootTree, this.callGraph = callGraph; this.cfgMap = cfgMap; this.reachingDefinitionsAnalysis = new ReachingDefinitionsAnalysis(pythonFile); + this.lvaMap = new HashMap<>(); this.rootTree = rootTree; this.parsingException = null; this.typeTable = typeTable; @@ -96,6 +102,7 @@ public PythonVisitorContext(PythonFile pythonFile, RecognitionException parsingE this.callGraph = CallGraph.EMPTY; this.cfgMap = Map.of(); this.reachingDefinitionsAnalysis = new ReachingDefinitionsAnalysis(pythonFile); + this.lvaMap = new HashMap<>(); this.issues = new ArrayList<>(); this.moduleType = null; } @@ -142,10 +149,20 @@ public CallGraph callGraph() { return callGraph; } + @CheckForNull public ControlFlowGraph cfg(Tree tree) { return cfgMap.get(tree); } + @CheckForNull + public LiveVariablesAnalysis lva(Tree tree){ + ControlFlowGraph cfg = cfg(tree); + if (cfg == null) { + return null; + } + return lvaMap.computeIfAbsent(tree, t -> LiveVariablesAnalysis.analyze(cfg)); + } + public Optional getDjangoViewInfo(String fqn) { return projectLevelSymbolTable().getDjangoViewInfo(fqn); } diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/SubscriptionContext.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/SubscriptionContext.java index 47b8aa316..841974f7c 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/SubscriptionContext.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/SubscriptionContext.java @@ -31,6 +31,7 @@ import org.sonar.plugins.python.api.tree.Name; import org.sonar.plugins.python.api.tree.Token; import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.python.cfg.fixpoint.LiveVariablesAnalysis; import org.sonar.python.semantic.v2.callgraph.CallGraph; import org.sonar.python.semantic.v2.typetable.TypeTable; import org.sonar.python.types.v2.TypeChecker; @@ -83,6 +84,8 @@ public interface SubscriptionContext { ControlFlowGraph cfg(Tree tree); + LiveVariablesAnalysis lva(Tree tree); + Set valuesAtLocation(Name name); /** diff --git a/python-frontend/src/main/java/org/sonar/python/SubscriptionVisitor.java b/python-frontend/src/main/java/org/sonar/python/SubscriptionVisitor.java index 1228f7142..d18151240 100644 --- a/python-frontend/src/main/java/org/sonar/python/SubscriptionVisitor.java +++ b/python-frontend/src/main/java/org/sonar/python/SubscriptionVisitor.java @@ -51,6 +51,7 @@ import org.sonar.plugins.python.api.tree.Token; import org.sonar.plugins.python.api.tree.Tree; import org.sonar.plugins.python.api.tree.Tree.Kind; +import org.sonar.python.cfg.fixpoint.LiveVariablesAnalysis; import org.sonar.python.regex.PythonAnalyzerRegexSource; import org.sonar.python.regex.PythonRegexIssueLocation; import org.sonar.python.regex.RegexContext; @@ -212,6 +213,11 @@ public ControlFlowGraph cfg(Tree tree) { return pythonVisitorContext.cfg(tree); } + @Override + public LiveVariablesAnalysis lva(Tree tree) { + return pythonVisitorContext.lva(tree); + } + @Override public Set valuesAtLocation(Name name) { return pythonVisitorContext.valuesAtLocation(name); diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/PythonVisitorContextTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/PythonVisitorContextTest.java index 790411200..3e58303f5 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/PythonVisitorContextTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/PythonVisitorContextTest.java @@ -29,6 +29,7 @@ import org.sonar.plugins.python.api.tree.Tree; import org.sonar.python.PythonTestUtils; import org.sonar.python.caching.CacheContextImpl; +import org.sonar.python.cfg.fixpoint.LiveVariablesAnalysis; import org.sonar.python.index.Descriptor; import org.sonar.python.index.VariableDescriptor; import org.sonar.python.parser.PythonParser; @@ -125,6 +126,40 @@ def foo(): } + @Test + void lva_returns_null_when_no_cfg() { + FileInput fileInput = PythonTestUtils.parse("def foo():\n x = 1"); + PythonFile pythonFile = pythonFile("my_module.py"); + var ctx = new PythonVisitorContext.Builder(fileInput, pythonFile).build(); + + FunctionDef functionDef = (FunctionDef) PythonTestUtils.getAllDescendant(fileInput, t -> t.is(Tree.Kind.FUNCDEF)).get(0); + // A Name node has no CFG entry, so lva should return null + assertThat(ctx.lva(functionDef.name())).isNull(); + } + + @Test + void lva_returns_analysis_for_function_def() { + FileInput fileInput = PythonTestUtils.parse("def foo():\n x = 1\n return x"); + PythonFile pythonFile = pythonFile("my_module.py"); + var ctx = new PythonVisitorContext.Builder(fileInput, pythonFile).build(); + + FunctionDef functionDef = (FunctionDef) PythonTestUtils.getAllDescendant(fileInput, t -> t.is(Tree.Kind.FUNCDEF)).get(0); + LiveVariablesAnalysis lva = ctx.lva(functionDef); + assertThat(lva).isNotNull(); + } + + @Test + void lva_caches_result() { + FileInput fileInput = PythonTestUtils.parse("def foo():\n x = 1\n return x"); + PythonFile pythonFile = pythonFile("my_module.py"); + var ctx = new PythonVisitorContext.Builder(fileInput, pythonFile).build(); + + FunctionDef functionDef = (FunctionDef) PythonTestUtils.getAllDescendant(fileInput, t -> t.is(Tree.Kind.FUNCDEF)).get(0); + LiveVariablesAnalysis first = ctx.lva(functionDef); + LiveVariablesAnalysis second = ctx.lva(functionDef); + assertThat(first).isSameAs(second); + } + @Test void sonar_product() { CacheContextImpl cacheContext = CacheContextImpl.dummyCache(); From 04dc9810b9c199c93be0448a68afebf24d535e95 Mon Sep 17 00:00:00 2001 From: Guillaume Dequenne Date: Tue, 31 Mar 2026 16:55:56 +0200 Subject: [PATCH 063/322] SONARPY-3982 Add Security/DBD/Architecture rules to AI quality profile (#1015) GitOrigin-RevId: ac8c6fff6a312746aa42beb649ed69d01b6ba762 --- .../python/checks/OpenSourceCheckList.java | 2 +- ...ile.json => Sonar_agentic_AI_profile.json} | 2 +- .../plugins/python/AIQualityProfile.java | 8 ++- .../plugins/python/IPynbAIQualityProfile.java | 2 +- .../plugins/python/AIQualityProfileTest.java | 51 ++++++++++++++++++- .../python/IPynbAIQualityProfileTest.java | 2 +- 6 files changed, 61 insertions(+), 6 deletions(-) rename python-checks/src/main/resources/org/sonar/l10n/py/rules/python/{AI_quality_profile.json => Sonar_agentic_AI_profile.json} (99%) diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index ac1d2bd4e..8cd9c93bb 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -111,7 +111,7 @@ public class OpenSourceCheckList { public static final String RESOURCE_FOLDER = "org/sonar/l10n/py/rules/python"; public static final String SONAR_WAY_PROFILE_LOCATION = RESOURCE_FOLDER + "/Sonar_way_profile.json"; - public static final String AI_QUALITY_PROFILE_LOCATION = RESOURCE_FOLDER + "/AI_quality_profile.json"; + public static final String AI_QUALITY_PROFILE_LOCATION = RESOURCE_FOLDER + "/Sonar_agentic_AI_profile.json"; public Stream> getChecks() { return Stream.of( diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/AI_quality_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_agentic_AI_profile.json similarity index 99% rename from python-checks/src/main/resources/org/sonar/l10n/py/rules/python/AI_quality_profile.json rename to python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_agentic_AI_profile.json index 73cde111c..620b194d0 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/AI_quality_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_agentic_AI_profile.json @@ -1,5 +1,5 @@ { - "name": "AI quality profile", + "name": "Sonar agentic AI", "ruleKeys": [ "S100", "S101", diff --git a/python-commons/src/main/java/org/sonar/plugins/python/AIQualityProfile.java b/python-commons/src/main/java/org/sonar/plugins/python/AIQualityProfile.java index 3f4ebfc8c..b9dc32d1f 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/AIQualityProfile.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/AIQualityProfile.java @@ -23,7 +23,7 @@ public class AIQualityProfile implements BuiltInQualityProfilesDefinition { - static final String PROFILE_NAME = "AI quality profile"; + static final String PROFILE_NAME = "Sonar agentic AI"; private final RepositoryInfoProvider[] editionMetadataProviders; @@ -39,6 +39,12 @@ public void define(Context context) { registerRulesForEdition(repositoryInfoProvider, profile); } + PythonProfile.getSecurityRuleKeys() + .forEach(key -> profile.activateRule(key.repository(), key.rule())); + PythonProfile.getDataflowBugDetectionRuleKeys() + .forEach(key -> profile.activateRule(key.repository(), key.rule())); + PythonProfile.getArchitectureRuleKeys() + .forEach(key -> profile.activateRule(key.repository(), key.rule())); profile.done(); } diff --git a/python-commons/src/main/java/org/sonar/plugins/python/IPynbAIQualityProfile.java b/python-commons/src/main/java/org/sonar/plugins/python/IPynbAIQualityProfile.java index 3f5d951a3..cbcd586d2 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/IPynbAIQualityProfile.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/IPynbAIQualityProfile.java @@ -23,7 +23,7 @@ public class IPynbAIQualityProfile implements BuiltInQualityProfilesDefinition { - static final String PROFILE_NAME = "AI quality profile"; + static final String PROFILE_NAME = "Sonar agentic AI"; private final RepositoryInfoProvider[] editionMetadataProviders; diff --git a/python-commons/src/test/java/org/sonar/plugins/python/AIQualityProfileTest.java b/python-commons/src/test/java/org/sonar/plugins/python/AIQualityProfileTest.java index eee4364d5..2f458a4c2 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/AIQualityProfileTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/AIQualityProfileTest.java @@ -16,6 +16,9 @@ */ package org.sonar.plugins.python; +import com.sonar.plugins.security.api.PythonRules; +import com.sonarsource.plugins.architecturepythonfrontend.api.ArchitecturePythonRules; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.sonar.api.server.profile.BuiltInQualityProfilesDefinition; import org.sonar.api.server.profile.BuiltInQualityProfilesDefinition.BuiltInActiveRule; @@ -26,10 +29,20 @@ class AIQualityProfileTest { + @BeforeEach + void setUp() { + PythonRules.throwOnCall = false; + PythonRules.getRuleKeys().clear(); + com.sonarsource.plugins.dbd.api.PythonRules.throwOnCall = false; + com.sonarsource.plugins.dbd.api.PythonRules.getDataflowBugDetectionRuleKeys().clear(); + ArchitecturePythonRules.throwOnCall = false; + ArchitecturePythonRules.getRuleKeys().clear(); + } + public BuiltInQualityProfilesDefinition.BuiltInQualityProfile getProfile() { BuiltInQualityProfilesDefinition.Context context = new BuiltInQualityProfilesDefinition.Context(); new AIQualityProfile(new RepositoryInfoProvider[]{new OpenSourceRepositoryInfoProvider()}).define(context); - return context.profile("py", "AI quality profile"); + return context.profile("py", "Sonar agentic AI"); } @Test @@ -39,4 +52,40 @@ void profile() { assertThat(profile.rules()).hasSizeGreaterThan(25); assertThat(profile.rules()).extracting(BuiltInActiveRule::ruleKey).contains("S100"); } + + @Test + void should_contain_security_rules_when_available() { + PythonRules.getRuleKeys().add("S3649"); + try { + BuiltInQualityProfilesDefinition.BuiltInQualityProfile profile = getProfile(); + assertThat(profile.rules()).extracting("repoKey").contains("pythonsecurity"); + assertThat(profile.rules()).extracting(BuiltInActiveRule::ruleKey).contains("S3649"); + } finally { + PythonRules.getRuleKeys().clear(); + } + } + + @Test + void should_contain_dataflow_bug_detection_rules_when_available() { + com.sonarsource.plugins.dbd.api.PythonRules.getDataflowBugDetectionRuleKeys().add("S2259"); + try { + BuiltInQualityProfilesDefinition.BuiltInQualityProfile profile = getProfile(); + assertThat(profile.rules()).extracting("repoKey").contains("dbd-repo-key"); + assertThat(profile.rules()).extracting(BuiltInActiveRule::ruleKey).contains("S2259"); + } finally { + com.sonarsource.plugins.dbd.api.PythonRules.getDataflowBugDetectionRuleKeys().clear(); + } + } + + @Test + void should_contain_architecture_rules_when_available() { + ArchitecturePythonRules.getRuleKeys().add("S7134"); + try { + BuiltInQualityProfilesDefinition.BuiltInQualityProfile profile = getProfile(); + assertThat(profile.rules()).extracting("repoKey").contains("pythonarchitecture"); + assertThat(profile.rules()).extracting(BuiltInActiveRule::ruleKey).contains("S7134"); + } finally { + ArchitecturePythonRules.getRuleKeys().clear(); + } + } } diff --git a/python-commons/src/test/java/org/sonar/plugins/python/IPynbAIQualityProfileTest.java b/python-commons/src/test/java/org/sonar/plugins/python/IPynbAIQualityProfileTest.java index 1e7e40126..6aee4c1af 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/IPynbAIQualityProfileTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/IPynbAIQualityProfileTest.java @@ -29,7 +29,7 @@ class IPynbAIQualityProfileTest { public BuiltInQualityProfilesDefinition.BuiltInQualityProfile getProfile() { BuiltInQualityProfilesDefinition.Context context = new BuiltInQualityProfilesDefinition.Context(); new IPynbAIQualityProfile(new RepositoryInfoProvider[]{new OpenSourceRepositoryInfoProvider()}).define(context); - return context.profile("ipynb", "AI quality profile"); + return context.profile("ipynb", "Sonar agentic AI"); } @Test From e0630c60782432c578abba6f6b01392add053cc1 Mon Sep 17 00:00:00 2001 From: Guillaume Dequenne Date: Wed, 1 Apr 2026 10:44:40 +0200 Subject: [PATCH 064/322] SONARPY-4010 Update rule metadata with Sonar agentic AI profile (#1036) GitOrigin-RevId: 874a994c126e4a781d77d6423ea87b2092161cde --- .../py/rules/python/Sonar_agentic_AI_profile.json | 13 +++++++++++++ sonarpedia.json | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_agentic_AI_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_agentic_AI_profile.json index 620b194d0..b38549ac9 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_agentic_AI_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_agentic_AI_profile.json @@ -1,6 +1,11 @@ { "name": "Sonar agentic AI", "ruleKeys": [ + "BackticksUsage", + "ExecStatementUsage", + "InequalityUsage", + "PreIncrementDecrement", + "PrintStatementUsage", "S100", "S101", "S107", @@ -72,6 +77,8 @@ "S3699", "S3752", "S3776", + "S3827", + "S3862", "S3923", "S3981", "S3984", @@ -117,6 +124,7 @@ "S5719", "S5720", "S5722", + "S5724", "S5727", "S5747", "S5754", @@ -205,6 +213,7 @@ "S6729", "S6730", "S6734", + "S6735", "S6741", "S6742", "S6779", @@ -217,6 +226,7 @@ "S6796", "S6799", "S6882", + "S6883", "S6887", "S6890", "S6894", @@ -256,11 +266,13 @@ "S7501", "S7502", "S7503", + "S7504", "S7505", "S7506", "S7507", "S7508", "S7510", + "S7511", "S7514", "S7515", "S7516", @@ -285,6 +297,7 @@ "S8389", "S8392", "S8396", + "S8397", "S8400", "S8401", "S8405", diff --git a/sonarpedia.json b/sonarpedia.json index 7c8baffac..6e9d765b3 100644 --- a/sonarpedia.json +++ b/sonarpedia.json @@ -3,7 +3,7 @@ "languages": [ "PY" ], - "latest-update": "2026-03-23T12:21:48.201596145Z", + "latest-update": "2026-03-31T15:01:06.932657Z", "options": { "no-language-in-filenames": true, "preserve-filenames": true From 07fe8ea238fbf9da1b6942d7fbdbb8d2dbb314cb Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Wed, 1 Apr 2026 14:30:50 +0200 Subject: [PATCH 065/322] SONARPY-4009 Added rule metadate generation to mvn profile (#1035) GitOrigin-RevId: 5bb5e8e61cb370090d0cdb7cab35f7e7d3e413b4 --- pom.xml | 1 + python-checks/pom.xml | 73 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) diff --git a/pom.xml b/pom.xml index 755a5f375..818d18ae4 100644 --- a/pom.xml +++ b/pom.xml @@ -113,6 +113,7 @@ 6.2.7 2.13.2 2.21.0 + 2.19.0.5763 11 diff --git a/python-checks/pom.xml b/python-checks/pom.xml index 78a5c7aa9..c642e8a86 100644 --- a/python-checks/pom.xml +++ b/python-checks/pom.xml @@ -73,4 +73,77 @@ + + + updateRule + + + rule.id + + + + master + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + download-rule-api + generate-resources + + copy + + + + + com.sonarsource.rule-api + rule-api + ${rule.api.version} + jar + ${project.build.directory} + rule-api.jar + + + + + + + + org.codehaus.mojo + exec-maven-plugin + 3.6.3 + + + run-rule-api + generate-resources + + exec + + + java + ${project.basedir}/.. + + -jar + ${project.build.directory}/rule-api.jar + generate + -rule + ${rule.id} + -branch + ${rule.branch} + + + ${env.RULE_API_GH_TOKEN} + + + + + + + + + + From 4cd3fdcd5b41c81ac89b582ce962e71f26f15b1d Mon Sep 17 00:00:00 2001 From: "sonar-nigel[bot]" <247337653+sonar-nigel[bot]@users.noreply.github.com> Date: Wed, 1 Apr 2026 14:47:58 +0200 Subject: [PATCH 066/322] SONARPY-3965 Rule S8495 Functions should return tuples of consistent length (#1004) GitOrigin-RevId: 115e703b35e94fc608f157b4cb91395814afab84 --- .../checks/InconsistentTupleReturnCheck.java | 114 ++++++ .../python/checks/OpenSourceCheckList.java | 1 + .../org/sonar/l10n/py/rules/python/S8495.html | 49 +++ .../org/sonar/l10n/py/rules/python/S8495.json | 21 ++ .../InconsistentTupleReturnCheckTest.java | 30 ++ .../checks/inconsistentTupleReturn.py | 339 ++++++++++++++++++ 6 files changed, 554 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/InconsistentTupleReturnCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8495.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8495.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/InconsistentTupleReturnCheckTest.java create mode 100644 python-checks/src/test/resources/checks/inconsistentTupleReturn.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/InconsistentTupleReturnCheck.java b/python-checks/src/main/java/org/sonar/python/checks/InconsistentTupleReturnCheck.java new file mode 100644 index 000000000..ab2c7548e --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/InconsistentTupleReturnCheck.java @@ -0,0 +1,114 @@ +/* + * SonarQube Python Plugin + * Copyright (C) 2011-2025 SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import java.util.ArrayList; +import java.util.List; +import java.util.OptionalInt; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.FunctionDef; +import org.sonar.plugins.python.api.tree.ReturnStatement; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.tree.Tuple; + +@Rule(key = "S8495") +public class InconsistentTupleReturnCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Refactor this function to always return tuples of the same length."; + private static final String SECONDARY_MESSAGE = "Returns a %d-tuple."; + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.FUNCDEF, InconsistentTupleReturnCheck::checkFunction); + } + + private static void checkFunction(SubscriptionContext ctx) { + FunctionDef functionDef = (FunctionDef) ctx.syntaxNode(); + + ReturnCheckUtils.ReturnStmtCollector collector = ReturnCheckUtils.ReturnStmtCollector.collect(functionDef); + + if (collector.containsYield()) { + return; + } + + List returnStmts = collector.getReturnStmts(); + + List tupleReturns = new ArrayList<>(); + for (ReturnStatement returnStmt : returnStmts) { + OptionalInt length = getTupleLengthIfTupleReturn(returnStmt); + if (length.isPresent()) { + tupleReturns.add(new ReturnWithLength(returnStmt, length.getAsInt())); + } + } + + if (tupleReturns.size() < 2) { + return; + } + + int firstLength = tupleReturns.get(0).length; + boolean allSame = tupleReturns.stream().allMatch(r -> r.length == firstLength); + if (allSame) { + return; + } + + PreciseIssue issue = ctx.addIssue(functionDef.name(), MESSAGE); + for (ReturnWithLength tupleReturn : tupleReturns) { + issue.secondary(tupleReturn.returnStmt, String.format(SECONDARY_MESSAGE, tupleReturn.length)); + } + } + + private static boolean containsUnpacking(List exprs) { + return exprs.stream().anyMatch(e -> e.is(Tree.Kind.UNPACKING_EXPR)); + } + + private static OptionalInt getTupleLengthIfTupleReturn(ReturnStatement returnStmt) { + List expressions = returnStmt.expressions(); + if (expressions.isEmpty()) { + return OptionalInt.empty(); + } + if (expressions.size() > 1) { + // Implicit tuple: return a, b — skip if any element is a star expression + if (containsUnpacking(expressions)) { + return OptionalInt.empty(); + } + return OptionalInt.of(expressions.size()); + } + // Single expression - check if it's an explicit tuple literal + Expression expr = expressions.get(0); + if (expr.is(Tree.Kind.TUPLE)) { + Tuple tuple = (Tuple) expr; + if (containsUnpacking(tuple.elements())) { + return OptionalInt.empty(); + } + return OptionalInt.of(tuple.elements().size()); + } + return OptionalInt.empty(); + } + + private static class ReturnWithLength { + final ReturnStatement returnStmt; + final int length; + + ReturnWithLength(ReturnStatement returnStmt, int length) { + this.returnStmt = returnStmt; + this.length = length; + } + } +} diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 8cd9c93bb..9ff18e3d3 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -280,6 +280,7 @@ public Stream> getChecks() { ImpossibleBackReferenceCheck.class, ImpossibleBoundariesCheck.class, IncompatibleOperandsCheck.class, + InconsistentTupleReturnCheck.class, InconsistentTypeHintCheck.class, IncorrectExceptionTypeCheck.class, IncorrectParameterDatetimeConstructorsCheck.class, diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8495.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8495.html new file mode 100644 index 000000000..9d4833cd6 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8495.html @@ -0,0 +1,49 @@ +

      This rule raises an issue when a function returns tuples of different lengths in different code paths.

      +

      Why is this an issue?

      +

      When a function returns tuples of varying lengths, it creates an inconsistent API that is difficult to use correctly. Callers cannot reliably +unpack the return value without checking its length first, which leads to fragile code.

      +

      Consider this example:

      +
      +def process_data(value):
      +    if value > 0:
      +        return (value,)  # Returns a 1-tuple
      +    else:
      +        return (value, value * 2)  # Returns a 2-tuple
      +
      +result = process_data(10)
      +x, y = result  # ValueError if value > 0!
      +
      +

      This forces callers to add defensive length-checks before unpacking, making the code fragile and harder to maintain. The function signature +provides no indication that the return type varies, so developers must read the implementation or discover the behavior through runtime errors.

      +

      Consistent return types make code more predictable, easier to test, and less likely to cause unexpected failures in production.

      +

      What is the potential impact?

      +

      Runtime errors from tuple unpacking may not surface during initial testing if certain code paths are not fully exercised, leading to production +failures. The need for defensive length-checking also increases the maintenance burden and makes the API harder to document for new team members.

      +

      How to fix it

      +

      Make all return statements return tuples of the same length. Add placeholder values (like None or 0) to shorter tuples +to maintain consistency.

      +

      Code examples

      +

      Noncompliant code example

      +
      +def calculate_stats(numbers):
      +    if not numbers:
      +        return (0,)  # Noncompliant
      +    total = sum(numbers)
      +    average = total / len(numbers)
      +    return (total, average)
      +
      +

      Compliant solution

      +
      +def calculate_stats(numbers):
      +    if not numbers:
      +        return (0, 0)  # Consistent 2-tuple
      +    total = sum(numbers)
      +    average = total / len(numbers)
      +    return (total, average)
      +
      +

      Resources

      +

      Documentation

      + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8495.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8495.json new file mode 100644 index 000000000..6eba8fc87 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8495.json @@ -0,0 +1,21 @@ +{ + "title": "Functions should return tuples of consistent length", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-8495", + "sqKey": "S8495", + "scope": "Main", + "quickfix": "unknown", + "code": { + "impacts": { + "MAINTAINABILITY": "HIGH" + }, + "attribute": "CONVENTIONAL" + } +} diff --git a/python-checks/src/test/java/org/sonar/python/checks/InconsistentTupleReturnCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/InconsistentTupleReturnCheckTest.java new file mode 100644 index 000000000..0db6e3a87 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/InconsistentTupleReturnCheckTest.java @@ -0,0 +1,30 @@ +/* + * SonarQube Python Plugin + * Copyright (C) 2011-2025 SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.junit.jupiter.api.Test; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class InconsistentTupleReturnCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify( + "src/test/resources/checks/inconsistentTupleReturn.py", + new InconsistentTupleReturnCheck()); + } +} diff --git a/python-checks/src/test/resources/checks/inconsistentTupleReturn.py b/python-checks/src/test/resources/checks/inconsistentTupleReturn.py new file mode 100644 index 000000000..cd5e555fd --- /dev/null +++ b/python-checks/src/test/resources/checks/inconsistentTupleReturn.py @@ -0,0 +1,339 @@ +# Tests: noncompliant cases + + +def calculate_stats(numbers): # Noncompliant {{Refactor this function to always return tuples of the same length.}} +# ^^^^^^^^^^^^^^^ + if not numbers: + return (0,) +# ^^^^^^^^^^^< {{Returns a 1-tuple.}} + total = sum(numbers) + average = total / len(numbers) + return (total, average) +# ^^^^^^^^^^^^^^^^^^^^^^^< {{Returns a 2-tuple.}} + + +def early_guard(x): # Noncompliant {{Refactor this function to always return tuples of the same length.}} +# ^^^^^^^^^^^ + if x < 0: + return (x,) +# ^^^^^^^^^^^< {{Returns a 1-tuple.}} + result = x * 2 + extra = x + 1 + return (x, result, extra) +# ^^^^^^^^^^^^^^^^^^^^^^^^^< {{Returns a 3-tuple.}} + + +def classify_value(x): # Noncompliant {{Refactor this function to always return tuples of the same length.}} +# ^^^^^^^^^^^^^^ + if x > 0: + return (x, "positive", True) +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Returns a 3-tuple.}} + elif x < 0: + return (x, "negative", False) +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Returns a 3-tuple.}} + else: + return (x,) +# ^^^^^^^^^^^< {{Returns a 1-tuple.}} + + +def resolve_address(host, port, secure): # Noncompliant {{Refactor this function to always return tuples of the same length.}} +# ^^^^^^^^^^^^^^^ + if secure: + return (host, port, "https") +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Returns a 3-tuple.}} + return (host, port) +# ^^^^^^^^^^^^^^^^^^^< {{Returns a 2-tuple.}} + + +# Class method with inconsistent returns +class DataProcessor: + def extract(self, data): # Noncompliant {{Refactor this function to always return tuples of the same length.}} +# ^^^^^^^ + if not data: + return (None, 0) +# ^^^^^^^^^^^^^^^^< {{Returns a 2-tuple.}} + value = data[0] + count = len(data) + label = str(value) + return (value, count, label) +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Returns a 3-tuple.}} + + +# Async function with inconsistent returns +async def fetch_resource(url, timeout): # Noncompliant {{Refactor this function to always return tuples of the same length.}} +# ^^^^^^^^^^^^^^ + if timeout <= 0: + return (url, "error") +# ^^^^^^^^^^^^^^^^^^^^^< {{Returns a 2-tuple.}} + content = "data" + status = 200 + latency = 0.1 + return (url, content, status, latency) +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Returns a 4-tuple.}} + + +# Implicit tuple syntax vs explicit tuple syntax +def implicit_vs_explicit(items): # Noncompliant {{Refactor this function to always return tuples of the same length.}} +# ^^^^^^^^^^^^^^^^^^^^ + for i, item in enumerate(items): + if item == 0: + return i, item +# ^^^^^^^^^^^^^^< {{Returns a 2-tuple.}} + return (len(items), items[-1], "last") +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Returns a 3-tuple.}} + + +# Try/except with inconsistent returns +def safe_divide(a, b): # Noncompliant {{Refactor this function to always return tuples of the same length.}} +# ^^^^^^^^^^^ + try: + result = a / b + return (result, None) +# ^^^^^^^^^^^^^^^^^^^^^< {{Returns a 2-tuple.}} + except ZeroDivisionError as e: + return (None, str(e), True) +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Returns a 3-tuple.}} + + +# Multiple branches, one outlier +def parse_config(config): # Noncompliant {{Refactor this function to always return tuples of the same length.}} +# ^^^^^^^^^^^^ + if "host" not in config: + return ("localhost", 8080) +# ^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Returns a 2-tuple.}} + host = config["host"] + port = config.get("port", 80) + if "user" in config: + return (host, port, config["user"]) +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Returns a 3-tuple.}} + return (host, port) +# ^^^^^^^^^^^^^^^^^^^< {{Returns a 2-tuple.}} + + +# Loop body with inconsistent returns +def find_pair(items, target): # Noncompliant {{Refactor this function to always return tuples of the same length.}} +# ^^^^^^^^^ + for i, item in enumerate(items): + if item == target: + return (i, item) +# ^^^^^^^^^^^^^^^^< {{Returns a 2-tuple.}} + if item > target: + return (i,) +# ^^^^^^^^^^^< {{Returns a 1-tuple.}} + return (len(items), None) +# ^^^^^^^^^^^^^^^^^^^^^^^^^< {{Returns a 2-tuple.}} + + +# ############################################################################## +# Compliant patterns +# ############################################################################## + + +# All returns produce 2-tuples — consistent +def calculate_stats_fixed(numbers): + if not numbers: + return (0, 0) + total = sum(numbers) + average = total / len(numbers) + return (total, average) + + +# Single return statement — no inconsistency possible +def make_pair(a, b): + return (a, b) + + +# Only one tuple-returning return statement; the other returns None +def find_element(items, target): + for i, item in enumerate(items): + if item == target: + return (i, item) + return None + + +# Returns a scalar on all paths — rule does not apply (no tuple literals) +def double(x): + if x > 0: + return x * 2 + return 0 + + +# Returns a list on both paths — rule does not apply (list is not a tuple) +def get_items(flag): + if flag: + return [1, 2, 3] + return [4, 5] + + +# Empty tuple consistently — no inconsistency +def always_empty(condition): + if condition: + return () + return () + + +# Generator function — rule does not apply +def generate_pairs(items): + for i, item in enumerate(items): + yield (i, item) + + +# Function with no return statements — no issue +def do_nothing(): + pass + + +# NamedTuple usage — returns a call expression, not a raw tuple literal +from typing import NamedTuple + + +class Stats(NamedTuple): + total: float + average: float + + +def calculate_named_stats(numbers): + if not numbers: + return Stats(total=0, average=0) + total = sum(numbers) + average = total / len(numbers) + return Stats(total=total, average=average) + + +# Async function with consistent 2-tuples — no issue +async def fetch_resource_ok(url, timeout): + if timeout <= 0: + return (url, "timeout") + content = "data" + return (url, content) + + +# Nested function definitions — outer has consistent returns; inner is flagged independently +def outer_consistent(x): + def inner_inconsistent(y): # Noncompliant {{Refactor this function to always return tuples of the same length.}} +# ^^^^^^^^^^^^^^^^^^ + if y > 0: + return (y,) +# ^^^^^^^^^^^< {{Returns a 1-tuple.}} + return (y, y * 2) +# ^^^^^^^^^^^^^^^^^< {{Returns a 2-tuple.}} + + return (x, inner_inconsistent) + + +# Bare return plus one tuple return — only one tuple return, no inconsistency +def maybe_tuple(x): + if x is None: + return + return (x, x + 1) + + +# Variable assigned a tuple and returned — rule only detects literal tuple syntax +# at the return site, so this is a false negative (accepted limitation) +def tuple_via_variable(a, b, c): + t2 = (a, b) + t3 = (a, b, c) + if a > 0: + return t2 + return t3 + + +# Dynamic tuple construction — accepted false negative +def tuple_via_constructor(values): + if values: + return tuple(values) + return tuple(range(3)) + + +# Star-unpacking in tuple — length is dynamic, so rule does not flag this +def star_tuple(prefix, value): + if prefix: + return (*prefix, value) + return (value,) + + +# ############################################################################## +# Edge cases +# ############################################################################## + + +# No arguments — function has no returns at all +def no_body(): + ... + + +# Only non-tuple returns — rule does not apply even though lengths would differ +# if interpreted as tuples +def non_tuple_paths(x): + if x > 0: + return x + elif x < 0: + return -x + return 0 + + +# Single tuple return alongside multiple non-tuple returns — only one tuple +def mixed_non_tuple_and_one_tuple(x): + if x > 100: + return None + if x < 0: + return -1 + return (x, x * 2) + + +# Lambda inside function — lambda returns must not be collected +def outer_with_lambda(items): + transform = lambda x: (x,) if x > 0 else (x, x - 1) + if items: + return (items[0], len(items)) + return (None, 0) + + +# Nested function is itself noncompliant; outer is compliant — inner's returns +# must not pollute the outer function's analysis +def outer_compliant_inner_noncompliant(data): + def inner(x): # Noncompliant {{Refactor this function to always return tuples of the same length.}} +# ^^^^^ + if x: + return (x,) +# ^^^^^^^^^^^< {{Returns a 1-tuple.}} + return (x, 0) +# ^^^^^^^^^^^^^< {{Returns a 2-tuple.}} + result = inner(data) + if data: + return (data, True) + return (None, False) + + +# Implicit tuple with single element — `return x,` is a 1-tuple +def implicit_single_element(x): + if x > 0: + return x, + return x, + + +# Try/except/else/finally — only tuple returns matter, bare returns are ignored +def try_with_bare_return(x): + try: + result = 1 / x + return (result, "ok") + except ZeroDivisionError: + return + finally: + pass + + +# Multiple return values all the same length using implicit syntax +def implicit_consistent(a, b, c): + if a > 0: + return a, b + if b > 0: + return b, c + return c, a + + +# Star-unpacking in implicit tuple — length is dynamic, so rule does not flag this +def star_implicit_tuple(prefix, value): + if prefix: + return *prefix, value + return (value,) From 62e8a63e5ac60363b305979ee3a07c86e7777c13 Mon Sep 17 00:00:00 2001 From: "sonar-nigel[bot]" <247337653+sonar-nigel[bot]@users.noreply.github.com> Date: Wed, 1 Apr 2026 15:27:34 +0200 Subject: [PATCH 067/322] SONARPY-3952 Rule S8494 Attributes should only be assigned if they are declared in "__slots__" (#995) GitOrigin-RevId: d6373896199c687df6e52bbbb71b8a717ac0ba19 --- .../python/checks/OpenSourceCheckList.java | 1 + .../python/checks/SlotsAssignmentCheck.java | 354 ++++++++ .../org/sonar/l10n/py/rules/python/S8494.html | 33 + .../org/sonar/l10n/py/rules/python/S8494.json | 21 + .../checks/SlotsAssignmentCheckTest.java | 28 + .../test/resources/checks/slotsAssignment.py | 804 ++++++++++++++++++ 6 files changed, 1241 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/SlotsAssignmentCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8494.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8494.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/SlotsAssignmentCheckTest.java create mode 100644 python-checks/src/test/resources/checks/slotsAssignment.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 9ff18e3d3..e9c5abd5c 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -404,6 +404,7 @@ public Stream> getChecks() { SkLearnEstimatorDontInitializeEstimatedValuesCheck.class, SleepZeroInAsyncCheck.class, SortedMinMaxCheck.class, + SlotsAssignmentCheck.class, SpecialMethodParamListCheck.class, SpecialMethodReturnTypeCheck.class, SQLQueriesCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/SlotsAssignmentCheck.java b/python-checks/src/main/java/org/sonar/python/checks/SlotsAssignmentCheck.java new file mode 100644 index 000000000..12ac35a60 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/SlotsAssignmentCheck.java @@ -0,0 +1,354 @@ +/* + * SonarQube Python Plugin + * Copyright (C) 2011-2025 SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import javax.annotation.Nullable; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.symbols.v2.SymbolV2; +import org.sonar.plugins.python.api.symbols.v2.UsageV2; +import org.sonar.plugins.python.api.types.BuiltinTypes; +import org.sonar.plugins.python.api.tree.AssignmentStatement; +import org.sonar.plugins.python.api.tree.BaseTreeVisitor; +import org.sonar.plugins.python.api.tree.ClassDef; +import org.sonar.plugins.python.api.tree.CompoundAssignmentStatement; +import org.sonar.plugins.python.api.tree.DictionaryLiteral; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.ExpressionList; +import org.sonar.plugins.python.api.tree.FunctionDef; +import org.sonar.plugins.python.api.tree.KeyValuePair; +import org.sonar.plugins.python.api.tree.ListLiteral; +import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.Parameter; +import org.sonar.plugins.python.api.tree.QualifiedExpression; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.SetLiteral; +import org.sonar.plugins.python.api.tree.Statement; +import org.sonar.plugins.python.api.tree.StringLiteral; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.tree.Tuple; +import org.sonar.plugins.python.api.types.v2.ClassType; +import org.sonar.plugins.python.api.types.v2.FunctionType; +import org.sonar.plugins.python.api.types.v2.PythonType; +import org.sonar.plugins.python.api.types.v2.TypeWrapper; +import org.sonar.python.checks.utils.Expressions; +import org.sonar.python.tree.TreeUtils; + +@Rule(key = "S8494") +public class SlotsAssignmentCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Add \"%s\" to the class's \"__slots__\"."; + + /** + * Built-in C types whose instances don't have __dict__ by default. + * When subclassing these, __slots__ restrictions still apply even though + * we can't find a ClassDef to inspect. + */ + private static final Set BUILTIN_TYPES_WITHOUT_DICT = Set.of( + BuiltinTypes.INT, BuiltinTypes.FLOAT, BuiltinTypes.COMPLEX, + BuiltinTypes.STR, BuiltinTypes.BYTES, + BuiltinTypes.BOOL, BuiltinTypes.LIST, BuiltinTypes.TUPLE, + BuiltinTypes.SET, BuiltinTypes.DICT, BuiltinTypes.NONE_TYPE, + "type", "frozenset", "memoryview", "bytearray", "range"); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.CLASSDEF, SlotsAssignmentCheck::checkClass); + } + + private static void checkClass(SubscriptionContext ctx) { + ClassDef classDef = (ClassDef) ctx.syntaxNode(); + PythonType classType = classDef.name().typeV2(); + if (!(classType instanceof ClassType classTypeV2)) { + return; + } + + // Find __slots__ assignment in this class body + Set ownSlots = extractOwnSlots(classDef); + if (ownSlots == null) { + // No __slots__ found or dynamic/unsupported form + return; + } + + if (ownSlots.contains("__dict__")) { + // Explicit opt-out: __dict__ in slots means no restriction + return; + } + + if (classTypeV2.hasUnresolvedHierarchy()) { + // Can't safely analyze hierarchy + return; + } + + // Build allowed slots: own + ancestors + Set allowedSlots = new HashSet<>(ownSlots); + Set visited = new HashSet<>(); + if (!collectAncestorSlots(classTypeV2, classDef, allowedSlots, visited)) { + // Some resolvable parent has no __slots__, so __dict__ is available + return; + } + + // Check each instance method + for (FunctionDef functionDef : TreeUtils.topLevelFunctionDefs(classDef)) { + PythonType funcType = functionDef.name().typeV2(); + if (!(funcType instanceof FunctionType ft) || !ft.isInstanceMethod()) { + continue; + } + List params = TreeUtils.positionalParameters(functionDef); + if (!params.isEmpty()) { + String selfName = params.get(0).name().name(); + SelfAttributeAssignmentVisitor visitor = new SelfAttributeAssignmentVisitor(selfName, allowedSlots, ctx); + functionDef.body().accept(visitor); + } + } + } + + /** + * Extracts the slot names from the __slots__ assignment in the class body. + * Uses the last __slots__ assignment, since Python's class body executes top-to-bottom + * and the metaclass reads __slots__ from the final namespace value. + * Returns null if no __slots__ is found or if the form is not a supported literal. + * Returns an empty set if __slots__ = [] or __slots__ = (). + */ + @Nullable + private static Set extractOwnSlots(ClassDef classDef) { + Set result = null; + for (Statement stmt : classDef.body().statements()) { + if (stmt instanceof AssignmentStatement assignment) { + List lhsExpressions = assignment.lhsExpressions(); + if (lhsExpressions.size() == 1) { + List lhs = lhsExpressions.get(0).expressions(); + if (lhs.size() == 1 && lhs.get(0).is(Tree.Kind.NAME) && "__slots__".equals(((Name) lhs.get(0)).name())) { + // Found __slots__ assignment; keep iterating to use the last one + result = extractSlotNames(assignment.assignedValue()); + } + } + } + } + return result; + } + + /** + * Extracts slot names from the RHS of a __slots__ assignment. + * Returns null if the form is not a supported literal. + */ + @Nullable + private static Set extractSlotNames(Expression value) { + List elements; + if (value instanceof ListLiteral listLiteral) { + elements = listLiteral.elements().expressions(); + } else if (value instanceof Tuple tuple) { + elements = tuple.elements(); + } else if (value instanceof SetLiteral setLiteral) { + elements = setLiteral.elements(); + } else if (value instanceof DictionaryLiteral dictionaryLiteral) { + elements = extractDictKeys(dictionaryLiteral); + } else if (value instanceof StringLiteral stringLiteral) { + // Single string: __slots__ = 'attr_name' + return Set.of(stringLiteral.trimmedQuotesValue()); + } else { + // Dynamic or unsupported form + return null; + } + return elements != null ? extractStringLiterals(elements) : null; + } + + /** + * Extracts key expressions from a dictionary literal. + * Returns null if any element is not a KeyValuePair with a string key (e.g. unpacking). + */ + @Nullable + private static List extractDictKeys(DictionaryLiteral dictionaryLiteral) { + List keys = new ArrayList<>(); + for (Tree element : dictionaryLiteral.elements()) { + if (!(element instanceof KeyValuePair kvp)) { + return null; + } + keys.add(kvp.key()); + } + return keys; + } + + /** + * Collects trimmed string values from a list of expressions. + * If an element is a Name, attempts to resolve it to a StringLiteral via single-assignment analysis. + * Returns null if any element cannot be resolved to a string literal. + */ + @Nullable + private static Set extractStringLiterals(List elements) { + Set slots = new HashSet<>(); + for (Expression element : elements) { + if (element instanceof StringLiteral stringLiteral) { + slots.add(stringLiteral.trimmedQuotesValue()); + } else if (element instanceof Name name) { + Optional resolved = Expressions.singleAssignedNonNameValue(name); + if (resolved.isPresent() && resolved.get() instanceof StringLiteral stringLiteral) { + slots.add(stringLiteral.trimmedQuotesValue()); + } else { + return null; + } + } else { + return null; + } + } + return slots; + } + + /** + * Collects slot names from all ancestor classes into allowedSlots. + * Uses ClassType (v2) for type hierarchy filtering (FQN, object skipping) and + * resolves parent ClassDef AST nodes via SymbolV2's CLASS_DECLARATION usages. + * Returns false if any resolvable parent has no __slots__ (meaning __dict__ is available). + */ + private static boolean collectAncestorSlots(ClassType classType, ClassDef classDef, Set allowedSlots, + Set visited) { + for (TypeWrapper parentWrapper : classType.superClasses()) { + PythonType parentType = parentWrapper.type(); + if (!(parentType instanceof ClassType parentClassType) + || "object".equals(parentClassType.fullyQualifiedName()) + || !visited.add(parentClassType)) { + continue; + } + if (!processParentType(parentClassType, classDef, allowedSlots, visited)) { + return false; + } + } + return true; + } + + private static boolean processParentType(ClassType parentClassType, ClassDef classDef, Set allowedSlots, + Set visited) { + Optional parentClassDef = findParentClassDef(classDef, parentClassType); + if (parentClassDef.isEmpty()) { + // Can't inspect the parent's __slots__. Built-in C types don't provide __dict__ + // on their instances, so slots restrictions still apply when subclassing them. + // For all other types, we can't determine if __dict__ is available, so bail out. + String fqn = parentClassType.fullyQualifiedName(); + return fqn != null && BUILTIN_TYPES_WITHOUT_DICT.contains(fqn); + } + return processParentClass(parentClassDef.get(), allowedSlots, visited); + } + + private static Optional findParentClassDef(ClassDef childClassDef, ClassType parentClassType) { + if (childClassDef.args() == null) { + return Optional.empty(); + } + for (var arg : childClassDef.args().arguments()) { + if (arg instanceof RegularArgument regArg) { + Expression expr = regArg.expression(); + if (expr instanceof Name name && name.typeV2() == parentClassType) { + return findClassDefFromSymbolV2(name.symbolV2()); + } + } + } + return Optional.empty(); + } + + /** + * Finds the ClassDef AST node from a SymbolV2 by looking for its CLASS_DECLARATION usage. + */ + private static Optional findClassDefFromSymbolV2(@Nullable SymbolV2 symbolV2) { + if (symbolV2 == null) { + return Optional.empty(); + } + return symbolV2.usages().stream() + .filter(usage -> usage.kind() == UsageV2.Kind.CLASS_DECLARATION) + .map(usage -> TreeUtils.firstAncestorOfKind(usage.tree(), Tree.Kind.CLASSDEF)) + .filter(Objects::nonNull) + .map(ClassDef.class::cast) + .findFirst(); + } + + private static boolean processParentClass(ClassDef parentClassDef, Set allowedSlots, Set visited) { + Set parentSlots = extractOwnSlots(parentClassDef); + if (parentSlots == null || parentSlots.contains("__dict__")) { + return false; + } + + allowedSlots.addAll(parentSlots); + + PythonType parentType = parentClassDef.name().typeV2(); + if (!(parentType instanceof ClassType parentClassType)) { + return true; + } + return !parentClassType.hasUnresolvedHierarchy() && collectAncestorSlots(parentClassType, parentClassDef, allowedSlots, visited); + } + + private static class SelfAttributeAssignmentVisitor extends BaseTreeVisitor { + private final String selfName; + private final Set allowedSlots; + private final SubscriptionContext ctx; + + SelfAttributeAssignmentVisitor(String selfName, Set allowedSlots, SubscriptionContext ctx) { + this.selfName = selfName; + this.allowedSlots = allowedSlots; + this.ctx = ctx; + } + + @Override + public void visitAssignmentStatement(AssignmentStatement assignment) { + for (ExpressionList exprList : assignment.lhsExpressions()) { + for (Expression expr : exprList.expressions()) { + checkQualifiedExpression(expr); + } + } + // Do not call super to avoid visiting RHS as assignment targets + } + + @Override + public void visitCompoundAssignment(CompoundAssignmentStatement compoundAssignment) { + checkQualifiedExpression(compoundAssignment.lhsExpression()); + // Do not call super + } + + @Override + public void visitFunctionDef(FunctionDef functionDef) { + // Stop recursion into nested functions to avoid false positives + // where an inner function's first param shadows self + } + + @Override + public void visitClassDef(ClassDef classDef) { + // Stop recursion into nested classes to avoid false positives + } + + private void checkQualifiedExpression(Expression expr) { + if (!expr.is(Tree.Kind.QUALIFIED_EXPR)) { + return; + } + QualifiedExpression qualifiedExpr = (QualifiedExpression) expr; + Expression qualifier = qualifiedExpr.qualifier(); + if (!qualifier.is(Tree.Kind.NAME)) { + return; + } + if (!selfName.equals(((Name) qualifier).name())) { + return; + } + String attrName = qualifiedExpr.name().name(); + if (!allowedSlots.contains(attrName)) { + ctx.addIssue(qualifiedExpr.name(), String.format(MESSAGE, attrName)); + } + } + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8494.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8494.html new file mode 100644 index 000000000..0623e7f3e --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8494.html @@ -0,0 +1,33 @@ +

      This rule raises an issue when code assigns a value to an attribute that is not listed in the class's __slots__ declaration.

      +

      Why is this an issue?

      +

      In Python, the __slots__ class attribute is used to explicitly declare which instance attributes a class can have. When a class defines +__slots__, Python restricts instances to only those attributes, preventing the creation of new attributes dynamically.

      +

      Assigning to an attribute that is not in __slots__ causes Python to raise an AttributeError at runtime.

      +

      How to fix it

      +

      Add the missing attribute to the __slots__ declaration.

      +

      Code examples

      +

      Noncompliant code example

      +
      +class User:
      +    __slots__ = ['name', 'email']
      +
      +    def __init__(self, name, email, age):
      +        self.name = name
      +        self.email = email
      +        self.age = age  # Noncompliant: "age" is not in __slots__
      +
      +

      Compliant solution

      +
      +class User:
      +    __slots__ = ['name', 'email', 'age']
      +
      +    def __init__(self, name, email, age):
      +        self.name = name
      +        self.email = email
      +        self.age = age
      +
      +

      Resources

      +

      Documentation

      + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8494.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8494.json new file mode 100644 index 000000000..15f6e916d --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8494.json @@ -0,0 +1,21 @@ +{ + "title": "Attributes should only be assigned if they are declared in \"__slots__\"", + "type": "BUG", + "code": { + "impacts": { + "RELIABILITY": "BLOCKER" + }, + "attribute": "LOGICAL" + }, + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [], + "defaultSeverity": "Blocker", + "ruleSpecification": "RSPEC-8494", + "sqKey": "S8494", + "scope": "All", + "quickfix": "unknown" +} diff --git a/python-checks/src/test/java/org/sonar/python/checks/SlotsAssignmentCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/SlotsAssignmentCheckTest.java new file mode 100644 index 000000000..20e4ffe05 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/SlotsAssignmentCheckTest.java @@ -0,0 +1,28 @@ +/* + * SonarQube Python Plugin + * Copyright (C) 2011-2025 SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.junit.jupiter.api.Test; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class SlotsAssignmentCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/slotsAssignment.py", new SlotsAssignmentCheck()); + } +} diff --git a/python-checks/src/test/resources/checks/slotsAssignment.py b/python-checks/src/test/resources/checks/slotsAssignment.py new file mode 100644 index 000000000..e827d7455 --- /dev/null +++ b/python-checks/src/test/resources/checks/slotsAssignment.py @@ -0,0 +1,804 @@ +class UserBasic: + __slots__ = ['name', 'email'] + + def __init__(self, name, email, age): + self.name = name + self.email = email + self.age = age # Noncompliant {{Add "age" to the class's "__slots__".}} +# ^^^ + + +# Multiple missing attributes in same __init__ +class UserMultipleMissing: + __slots__ = ['name'] + + def __init__(self, name, email, age): + self.name = name + self.email = email # Noncompliant {{Add "email" to the class's "__slots__".}} +# ^^^^^ + self.age = age # Noncompliant {{Add "age" to the class's "__slots__".}} +# ^^^ + + +# Missing attribute in a non-__init__ method +class Point: + __slots__ = ['x', 'y'] + + def __init__(self, x, y): + self.x = x + self.y = y + + def set_z(self, z): + self.z = z # Noncompliant {{Add "z" to the class's "__slots__".}} +# ^ + + +# __slots__ as tuple +class PointTuple: + __slots__ = ('x', 'y') + + def __init__(self, x, y, z): + self.x = x + self.y = y + self.z = z # Noncompliant {{Add "z" to the class's "__slots__".}} +# ^ + + +# Empty __slots__ +class EmptySlots: + __slots__ = [] + + def __init__(self, value): + self.value = value # Noncompliant +# ^^^^^ + + +# Missing attribute in a property setter +class TemperatureWithBadCache: + __slots__ = ['_celsius'] + + def __init__(self, celsius): + self._celsius = celsius + + @property + def fahrenheit(self): + return self._celsius * 9 / 5 + 32 + + @fahrenheit.setter + def fahrenheit(self, value): + self._celsius = (value - 32) * 5 / 9 + self._fahrenheit_cache = value # Noncompliant +# ^^^^^^^^^^^^^^^^^ + + +# Augmented assignment not in __slots__ +class Counter: + __slots__ = ['count'] + + def __init__(self): + self.count = 0 + + def increment(self): + self.total += 1 # Noncompliant +# ^^^^^ + + +# __slots__ as dict +class LinkedNode: + __slots__ = {'value': 'The node value', 'next': 'The next node'} + + def __init__(self, value, next_node=None, extra=None): + self.value = value + self.next = next_node + self.extra = extra # Noncompliant +# ^^^^^ + + +# Assignment inside a conditional block +class Config: + __slots__ = ['host', 'port'] + + def __init__(self, host, port, debug=False): + self.host = host + self.port = port + if debug: + self.debug_info = "enabled" # Noncompliant +# ^^^^^^^^^^ + + +# Subclass — attribute not in current or parent __slots__ +class Base: + __slots__ = ['base_attr'] + + def __init__(self): + self.base_attr = 1 + + +class DerivedMissingAttr(Base): + __slots__ = ['derived_attr'] + + def __init__(self): + super().__init__() + self.derived_attr = 2 + self.other_attr = 3 # Noncompliant +# ^^^^^^^^^^ + + +# Augmented assignment not in any class's __slots__ +class BaseWithCount: + __slots__ = ['count'] + + def __init__(self): + self.count = 0 + + +class DerivedAugmented(BaseWithCount): + __slots__ = ['name'] + + def update(self): + self.count += 1 # Compliant: in parent slots + self.missing += 1 # Noncompliant +# ^^^^^^^ + + +# Assignment inside a loop body +class Accumulator: + __slots__ = ['total'] + + def __init__(self): + self.total = 0 + + def process(self, items): + for item in items: + self.total += item + self.last_item = item # Noncompliant +# ^^^^^^^^^ + + +# Non-standard self parameter name +class WeirdSelf: + __slots__ = ['value'] + + def __init__(this, value): + this.value = value + this.extra = 42 # Noncompliant +# ^^^^^ + + +# Chained assignment — second target not in __slots__ +class MultiAssign: + __slots__ = ['x'] + + def setup(self): + self.x = self.y = 0 # Noncompliant +# ^ + + +# Compliant: all attributes in __slots__ +class UserCompliant: + __slots__ = ['name', 'email', 'age'] + + def __init__(self, name, email, age): + self.name = name + self.email = email + self.age = age + + +# Compliant: no __slots__ means no restriction +class NoSlots: + def __init__(self, name, value, extra): + self.name = name + self.value = value + self.extra = extra + self.anything = True + + +# Compliant: assigning to other.attr (not self) +class NodeCompliant: + __slots__ = ['value', 'next'] + + def __init__(self, value): + self.value = value + self.next = None + + def append(self, other): + other.value = self.value + other.next = None + other.extra = 42 + + +# Compliant: parent without __slots__ provides __dict__ to child +class ParentWithoutSlots: + def __init__(self): + self.parent_value = 0 + + +class ChildInheritsDict(ParentWithoutSlots): + __slots__ = ['extra'] + + def __init__(self): + super().__init__() + self.extra = 1 + self.anything = True # Compliant: parent provides __dict__ + + +# Compliant: __slots__ contains '__dict__' +class WithDictSlot: + __slots__ = ['name', '__dict__'] + + def __init__(self, name): + self.name = name + self.dynamic_attr = "anything goes" + self.other = 42 + + +# Compliant: current + parent slots cover all assignments +class ShapeBase: + __slots__ = ['color'] + + def __init__(self, color): + self.color = color + + +class Circle(ShapeBase): + __slots__ = ['radius'] + + def __init__(self, color, radius): + super().__init__(color) + self.radius = radius + + def scale(self, factor): + self.radius *= factor + + +# Compliant: @staticmethod skipped +class MathHelper: + __slots__ = ['value'] + + def __init__(self, value): + self.value = value + + @staticmethod + def add(a, b): + result = a + b + return result + + +# Compliant: @classmethod skipped +class Registry: + __slots__ = ['name'] + + def __init__(self, name): + self.name = name + + @classmethod + def create(cls, name): + obj = cls.__new__(cls) + return obj + + +# Compliant: tuple __slots__ covers all attributes +class PointTupleCompliant: + __slots__ = ('x', 'y', 'z') + + def __init__(self, x, y, z): + self.x = x + self.y = y + self.z = z + + +# Compliant: dict __slots__ covers all attributes +class LinkedNodeCompliant: + __slots__ = {'value': 'The node value', 'next': 'The next node'} + + def __init__(self, value, next_node=None): + self.value = value + self.next = next_node + + +# Compliant: property setter assigns only to slots attributes +class TemperatureCompliant: + __slots__ = ['_celsius'] + + def __init__(self, celsius): + self._celsius = celsius + + @property + def fahrenheit(self): + return self._celsius * 9 / 5 + 32 + + @fahrenheit.setter + def fahrenheit(self, value): + self._celsius = (value - 32) * 5 / 9 + + +# FN accepted: dynamic __slots__ — rule bails +def compute_slots(): + return ['x', 'y'] + + +class DynamicSlots: + __slots__ = compute_slots() + + def __init__(self): + self.x = 1 + self.z = 2 # FN: __slots__ not a literal + + +# Compliant: qualifier is subscript, not a name +class NoParams: + __slots__ = ['value'] + + def unusual_method(*args): + args[0].value = 1 + args[0].extra = 2 + + +# Compliant: nested function not analyzed +class WithNestedFunction: + __slots__ = ['value'] + + def __init__(self, value): + self.value = value + + def inner(self): + self.anything = True # not visited + + +# FN accepted: indirect self reference not tracked +class SelfAlias: + __slots__ = ['value'] + + def __init__(self): + obj = self + obj.value = 1 + obj.missing = 2 # FN: qualifier is 'obj' + + +# Compliant: qualifier of 'value' is 'self.child', not 'self' +class DeepChain: + __slots__ = ['child'] + + def __init__(self): + self.child = None + self.child.value = 10 + + +# Compliant: __dict__ in __slots__ lifts restriction +class OnlyDictSlot: + __slots__ = ['__dict__'] + + def __init__(self): + self.anything = True + self.more = "hello" + + +# Compliant: grandparent has no __slots__, __dict__ available +class GrandParentNoSlots: + pass + + +class ParentWithSlots(GrandParentNoSlots): + __slots__ = ['parent_val'] + + +class GrandChildWithSlots(ParentWithSlots): + __slots__ = ['child_val'] + + def __init__(self): + self.child_val = 1 + self.parent_val = 2 + self.anything = 3 # Compliant: grandparent provides __dict__ + + +# Variable references in __slots__ resolved via single-assignment analysis +SLOT_NAME = 'value' + + +class NonStringSlots: + __slots__ = [SLOT_NAME, 'other'] + + def __init__(self): + self.value = 1 + self.missing = 2 # Noncompliant {{Add "missing" to the class's "__slots__".}} +# ^^^^^^^ + + +class NonStringTupleSlots: + __slots__ = (SLOT_NAME, 'other') + + def __init__(self): + self.value = 1 + self.missing = 2 # Noncompliant {{Add "missing" to the class's "__slots__".}} +# ^^^^^^^ + + +# FN accepted: dict unpacking element in __slots__ dict — rule bails +extra = {'z': 'extra'} + + +class DictUnpackingSlots: + __slots__ = {'x': 'x coord', **extra} + + def __init__(self): + self.x = 1 + self.missing = 2 # FN: unpacking in __slots__ dict + + +# FN accepted: non-string key in __slots__ dict — rule bails +class NonStringKeyDictSlots: + __slots__ = {1: 'one', 'other': 'two'} + + def __init__(self): + self.other = 1 + self.missing = 2 # FN: non-string key in __slots__ dict + + +# Compliant: class has unresolved type hierarchy (inherits from unknown external class) +from unknown_module import ExternalBase # noqa + + +class InheritsFromUnknown(ExternalBase): + __slots__ = ['value'] + + def __init__(self, value): + self.value = value + self.extra = 42 # Compliant: unresolved hierarchy, rule bails + + +# Compliant: method with only keyword-only parameters (no positional params) +class KeywordOnlyMethod: + __slots__ = ['value'] + + def __init__(self, value): + self.value = value + + def update(self, *, kwarg): + result = kwarg + return result + + +# Compliant: chained __slots__ assignment (lhsExpressions.size() > 1) — rule bails +class ChainedSlotsAssignment: + __slots__ = other_var = ['value'] + + def __init__(self): + self.value = 1 + self.extra = 2 # FN: chained assignment makes __slots__ unrecognized + + +# Compliant: tuple-unpack LHS on __slots__ assignment (lhs.size() != 1) — rule bails +class TupleUnpackLhsSlots: + a, b = 1, 2 # lhs expressions list has 2 elements, skipped + __slots__ = ['value'] + + def __init__(self): + self.value = 1 + + +# Compliant: LHS is a list literal wrapping a name (lhs.size() == 1, not a NAME) — rule bails +class ListWrapLhsSlots: + [__slots__] = [['value']] + + def __init__(self): + self.value = 1 + self.extra = 2 # FN: list-wrap LHS makes __slots__ unrecognized + + +# Compliant: non-__slots__ assignment in class body does not confuse the check +class WithOtherClassVar: + class_var = 42 + __slots__ = ['value'] + + def __init__(self, value): + self.value = value + + +# Compliant: parent has __dict__ in its __slots__, providing __dict__ to child +class ParentWithDictSlot: + __slots__ = ['parent_val', '__dict__'] + + def __init__(self): + self.parent_val = 0 + + +class ChildOfParentWithDictSlot(ParentWithDictSlot): + __slots__ = ['child_val'] + + def __init__(self): + super().__init__() + self.child_val = 1 + self.anything = True # Compliant: parent has __dict__ in slots + + +# Compliant: explicit object inheritance — object is skipped in ancestor collection +class ExplicitObjectBase(object): + __slots__ = ['value'] + + def __init__(self, value): + self.value = value + + +# Inherits from built-in list — external parent has no local ClassDef +class InheritsFromBuiltin(list): + __slots__ = ['label'] + + def __init__(self, label): + super().__init__() + self.label = label + self.extra = 42 # Noncompliant + + +# Compliant: method with no parameters at all (parameterList is null -> positional params empty) +class NoParamMethod: + __slots__ = ['value'] + + def __init__(self, value): + self.value = value + + def no_params(): + pass + + +# Compliant: LHS in class body is a subscript (not a Name) — skipped by extractOwnSlots +class LhsSubscriptInBody: + _registry = {} + _registry['key'] = 'registered' + __slots__ = ['value'] + + def __init__(self, value): + self.value = value + + +# Compliant: parent is a dynamically-assigned name with no FQN — skipped in ancestor collection +def make_dynamic_base(): + class _Inner: + __slots__ = ['x'] + return _Inner + + +DynamicBase = make_dynamic_base() + + +class InheritsDynamicBase(DynamicBase): + __slots__ = ['y'] + + def __init__(self, x, y): + self.x = x # Compliant: DynamicBase parent is skipped (fqn is null) + self.y = y + + +# Compliant: class with ambiguous symbol (defined in both branches) — getClassSymbolFromDef returns null +import sys as _sys + +if _sys.version_info[0] >= 3: + class VersionedClass: + __slots__ = ['x'] + + def __init__(self): + self.x = 1 +else: + class VersionedClass: # noqa + __slots__ = ['x'] + + def __init__(self): + self.x = 1 + + +# Compliant: parent class is ambiguously defined (same FQN) — parentClassSymbol is null +if _sys.version_info[0] >= 3: + class AmbiguousParent: + __slots__ = ['parent_val'] +else: + class AmbiguousParent: # noqa + __slots__ = ['parent_val'] + + +class InheritsAmbiguousParent(AmbiguousParent): + __slots__ = ['child_val'] + + def __init__(self): + self.parent_val = 1 + self.child_val = 2 + + +# __slots__ as set literal — now supported +class SetSlots: + __slots__ = {'name', 'value'} + + def __init__(self, name, value, extra): + self.name = name + self.value = value + self.extra = extra # Noncompliant {{Add "extra" to the class's "__slots__".}} +# ^^^^^ + + +# Compliant: set literal __slots__ covers all attributes +class SetSlotsCompliant: + __slots__ = {'x', 'y', 'z'} + + def __init__(self, x, y, z): + self.x = x + self.y = y + self.z = z + + +# Variable reference in set literal __slots__ resolved via single-assignment analysis +class NonStringSetSlots: + __slots__ = {SLOT_NAME, 'other'} + + def __init__(self): + self.other = 1 + self.missing = 2 # Noncompliant {{Add "missing" to the class's "__slots__".}} +# ^^^^^^^ + + +# __slots__ as single string — now supported +class SingleStringSlots: + __slots__ = 'value' + + def __init__(self, value, extra): + self.value = value + self.extra = extra # Noncompliant {{Add "extra" to the class's "__slots__".}} +# ^^^^^ + + +# Compliant: single string __slots__ covers the attribute +class SingleStringSlotsCompliant: + __slots__ = 'value' + + def __init__(self, value): + self.value = value + + +# Multiple __slots__ assignments — last one wins +class MultipleSlotsAssignments: + __slots__ = ['x', 'y', 'z'] + __slots__ = ['x'] + + def __init__(self): + self.x = 1 + self.y = 2 # Noncompliant {{Add "y" to the class's "__slots__".}} +# ^ + + +# Multiple __slots__ assignments — last one is larger +class MultipleSlotsLarger: + __slots__ = ['x'] + __slots__ = ['x', 'y', 'z'] + + def __init__(self): + self.x = 1 + self.y = 2 + self.z = 3 + + +# Compliant: nested class inside method does not cause false positives +class OuterWithNestedClass: + __slots__ = ['x'] + + def method(self): + self.x = 1 + class Inner: + def __init__(inner_self): + inner_self.y = 1 # Compliant: visitor stops at nested class + + +# Diamond inheritance — slots from all branches are allowed +class DiamondBase: + __slots__ = ['base_attr'] + +class DiamondLeft(DiamondBase): + __slots__ = ['left_attr'] + +class DiamondRight(DiamondBase): + __slots__ = ['right_attr'] + +class DiamondChild(DiamondLeft, DiamondRight): + __slots__ = ['child_attr'] + + def __init__(self): + self.base_attr = 1 # Compliant: from DiamondBase via DiamondLeft + self.left_attr = 2 # Compliant: from DiamondLeft + self.right_attr = 3 # Compliant: from DiamondRight + self.child_attr = 4 # Compliant: own slot + self.missing = 5 # Noncompliant {{Add "missing" to the class's "__slots__".}} +# ^^^^^^^ + +# Compliant: parent class from different file — can't determine its __slots__ +from collections import OrderedDict + +class CustomOrderedDict(OrderedDict): + __slots__ = ['label'] + + def __init__(self, label): + super().__init__() + self.label = label + self.extra = 42 # Compliant: can't inspect external parent's __slots__ + + +# FN accepted: empty tuple __slots__ +class EmptyTupleSlots: + __slots__ = () + + def __init__(self, value): + self.value = value # Noncompliant {{Add "value" to the class's "__slots__".}} +# ^^^^^ + + +# FN accepted: function call element in __slots__ list — rule bails +class FuncCallInSlots: + __slots__ = ['name', some_func()] + + def __init__(self): + self.name = 1 + self.missing = 2 # FN: function call in __slots__ list + + +# FN accepted: integer literal element in __slots__ list — rule bails +class IntLiteralInSlots: + __slots__ = ['name', 42] + + def __init__(self): + self.name = 1 + self.missing = 2 # FN: non-string literal in __slots__ list + + +# FN accepted: star-unpacking element in __slots__ list — rule bails +base_slots = ['x', 'y'] + + +class StarUnpackingInSlots: + __slots__ = [*base_slots, 'z'] + + def __init__(self): + self.z = 1 + self.missing = 2 # FN: star-unpacking in __slots__ list + + +# FN accepted: unresolvable variable in __slots__ — rule bails +from unknown_module import EXTERNAL_SLOT # noqa + + +class UnresolvableVarInSlots: + __slots__ = ['name', EXTERNAL_SLOT] + + def __init__(self): + self.name = 1 + self.missing = 2 # FN: variable can't be resolved + + +# FN accepted: variable resolves to non-string value — rule bails +MY_INT_VAR = 42 + + +class VarResolvesToNonString: + __slots__ = ['name', MY_INT_VAR] + + def __init__(self): + self.name = 1 + self.missing = 2 # FN: variable resolves to int, not string + + +# FN accepted: variable assigned multiple times — rule bails +if _sys.version_info[0] >= 3: + AMBIGUOUS_SLOT = 'x' +else: + AMBIGUOUS_SLOT = 'y' + + +class AmbiguousVarInSlots: + __slots__ = ['name', AMBIGUOUS_SLOT] + + def __init__(self): + self.name = 1 + self.missing = 2 # FN: variable has multiple assignments + + +# FN accepted: concatenation expression in __slots__ — rule bails +class ConcatenatedSlots: + __slots__ = ['x'] + ['y'] + + def __init__(self): + self.x = 1 + self.missing = 2 # FN: __slots__ is a binary expression, not a literal From d8070f444fdb12263cb4d2afffb5b17088a82366 Mon Sep 17 00:00:00 2001 From: "sonar-nigel[bot]" <247337653+sonar-nigel[bot]@users.noreply.github.com> Date: Wed, 1 Apr 2026 15:40:04 +0200 Subject: [PATCH 068/322] SONARPY-3939 Rule S8512 Class fields should not be defined multiple times (#977) GitOrigin-RevId: 11a73bd19351302bd185b8ec1b9d3589129c9752 --- .../ClassFieldDefinedMultipleTimesCheck.java | 94 +++++++ .../python/checks/OpenSourceCheckList.java | 1 + .../org/sonar/l10n/py/rules/python/S8512.html | 32 +++ .../org/sonar/l10n/py/rules/python/S8512.json | 23 ++ ...assFieldDefinedMultipleTimesCheckTest.java | 29 +++ .../checks/classFieldDefinedMultipleTimes.py | 233 ++++++++++++++++++ 6 files changed, 412 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/ClassFieldDefinedMultipleTimesCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8512.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8512.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/ClassFieldDefinedMultipleTimesCheckTest.java create mode 100644 python-checks/src/test/resources/checks/classFieldDefinedMultipleTimes.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/ClassFieldDefinedMultipleTimesCheck.java b/python-checks/src/main/java/org/sonar/python/checks/ClassFieldDefinedMultipleTimesCheck.java new file mode 100644 index 000000000..e7bd468b6 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/ClassFieldDefinedMultipleTimesCheck.java @@ -0,0 +1,94 @@ +/* + * SonarQube Python Plugin + * Copyright (C) 2011-2025 SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.AnnotatedAssignment; +import org.sonar.plugins.python.api.tree.AssignmentStatement; +import org.sonar.plugins.python.api.tree.ClassDef; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.ExpressionList; +import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.Statement; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.tree.Tree.Kind; + +@Rule(key = "S8512") +public class ClassFieldDefinedMultipleTimesCheck extends PythonSubscriptionCheck { + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Kind.CLASSDEF, ctx -> checkClass(ctx, (ClassDef) ctx.syntaxNode())); + } + + private static void checkClass(SubscriptionContext ctx, ClassDef classDef) { + Map> fieldDefinitions = new LinkedHashMap<>(); + + for (Statement stmt : classDef.body().statements()) { + collectFieldDefinition(stmt, fieldDefinitions); + } + + reportDuplicateDefinitions(ctx, fieldDefinitions); + } + + private static void collectFieldDefinition(Statement stmt, Map> fieldDefinitions) { + if (stmt.is(Kind.ASSIGNMENT_STMT)) { + getAssignmentName((AssignmentStatement) stmt) + .ifPresent(name -> fieldDefinitions.computeIfAbsent(name.name(), k -> new ArrayList<>()).add(name)); + } else if (stmt.is(Kind.ANNOTATED_ASSIGNMENT)) { + getAnnotatedAssignmentName((AnnotatedAssignment) stmt) + .ifPresent(name -> fieldDefinitions.computeIfAbsent(name.name(), k -> new ArrayList<>()).add(name)); + } + } + + private static Optional getAssignmentName(AssignmentStatement assignment) { + List lhsList = assignment.lhsExpressions(); + if (lhsList.size() != 1) { + return Optional.empty(); + } + List expressions = lhsList.get(0).expressions(); + if (expressions.size() == 1 && expressions.get(0).is(Kind.NAME)) { + return Optional.of((Name) expressions.get(0)); + } + return Optional.empty(); + } + + private static Optional getAnnotatedAssignmentName(AnnotatedAssignment annotated) { + if (annotated.variable().is(Kind.NAME) && annotated.assignedValue() != null) { + return Optional.of((Name) annotated.variable()); + } + return Optional.empty(); + } + + private static void reportDuplicateDefinitions(SubscriptionContext ctx, Map> fieldDefinitions) { + fieldDefinitions.forEach((name, definitions) -> { + for (int i = 0; i < definitions.size() - 1; i++) { + Tree current = definitions.get(i); + Tree next = definitions.get(i + 1); + String message = String.format("Remove this assignment; \"%s\" is assigned again on line %d.", name, next.firstToken().line()); + ctx.addIssue(current, message).secondary(next, "Reassignment."); + } + }); + } +} diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index e9c5abd5c..d40d7d07e 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -159,6 +159,7 @@ public Stream> getChecks() { ChildRouterBeforeParentRegistrationCheck.class, CipherBlockChainingCheck.class, ClassComplexityCheck.class, + ClassFieldDefinedMultipleTimesCheck.class, ClassMethodFirstArgumentNameCheck.class, ClassNameCheck.class, ClearTextProtocolsCheck.class, diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8512.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8512.html new file mode 100644 index 000000000..23547fab0 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8512.html @@ -0,0 +1,32 @@ +

      Why is this an issue?

      +

      When a class field is defined multiple times in the same class body, only the last assignment takes effect. All previous assignments are dead code +that serve no purpose.

      +

      This pattern typically occurs due to copy-paste errors, refactoring mistakes, merge conflicts, or misunderstanding of how class attributes work.

      +

      What is the potential impact?

      +
        +
      • Developers may not immediately realize which value is actually used.
      • +
      • Dead code must be read, understood, and maintained even though it has no effect.
      • +
      • The duplicate definition might indicate that two different fields were intended, suggesting a naming error.
      • +
      +

      How to fix it

      +

      Remove all but the last assignment to the class field.

      +

      Code examples

      +

      Noncompliant code example

      +
      +class MyClass:
      +    x = 1
      +    y = 2
      +    x = 3  # Noncompliant: "x" is defined twice
      +
      +

      Compliant solution

      +
      +class MyClass:
      +    x = 3
      +    y = 2
      +
      +

      Resources

      +

      Documentation

      + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8512.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8512.json new file mode 100644 index 000000000..614bb903d --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8512.json @@ -0,0 +1,23 @@ +{ + "title": "Class fields should not be defined multiple times", + "type": "CODE_SMELL", + "code": { + "impacts": { + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "CLEAR" + }, + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "suspicious" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-8512", + "sqKey": "S8512", + "scope": "All", + "quickfix": "unknown" +} diff --git a/python-checks/src/test/java/org/sonar/python/checks/ClassFieldDefinedMultipleTimesCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/ClassFieldDefinedMultipleTimesCheckTest.java new file mode 100644 index 000000000..ca6714373 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/ClassFieldDefinedMultipleTimesCheckTest.java @@ -0,0 +1,29 @@ +/* + * SonarQube Python Plugin + * Copyright (C) 2011-2025 SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.junit.jupiter.api.Test; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class ClassFieldDefinedMultipleTimesCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/classFieldDefinedMultipleTimes.py", new ClassFieldDefinedMultipleTimesCheck()); + } + +} diff --git a/python-checks/src/test/resources/checks/classFieldDefinedMultipleTimes.py b/python-checks/src/test/resources/checks/classFieldDefinedMultipleTimes.py new file mode 100644 index 000000000..b4e8f56a4 --- /dev/null +++ b/python-checks/src/test/resources/checks/classFieldDefinedMultipleTimes.py @@ -0,0 +1,233 @@ +class BasicDuplicate: + x = 1 # Noncompliant {{Remove this assignment; "x" is assigned again on line 4.}} +# ^ + x = 3 +# ^< {{Reassignment.}} + y = 2 + + +class CopyPasteError: + width = 100 # Noncompliant {{Remove this assignment; "width" is assigned again on line 13.}} +# ^^^^^ + height = 200 + width = 800 +# ^^^^^< {{Reassignment.}} + + +class RefactoringMistake: + timeout = 30 # Noncompliant {{Remove this assignment; "timeout" is assigned again on line 21.}} +# ^^^^^^^ + host = "localhost" + timeout = 60 +# ^^^^^^^< {{Reassignment.}} + + +class AnnotatedThenPlain: + x: int = 0 # Noncompliant {{Remove this assignment; "x" is assigned again on line 28.}} +# ^ + x = 1 +# ^< {{Reassignment.}} + + +class MultipleDuplicatePairs: + host = "localhost" # Noncompliant + port = 8080 # Noncompliant + host = "production.example.com" + port = 443 + + +class ThreeAssignments: + status = 0 # Noncompliant + status = "pending" # Noncompliant + status = "active" + + +class NoneToValue: + max_length = None # Noncompliant + max_results = 10 + max_length = 512 + + +class BooleanFlip: + enable_cache = False # Noncompliant + debug = True + enable_cache = True + + +class TypeChange: + code = 0 # Noncompliant + code = "OK" + + +class AnnotatedThenAnnotated: + value: int = 0 # Noncompliant + value: int = 42 + + +class DunderAttribute: + __slots__ = [] # Noncompliant + __slots__ = ["_name", "_value"] + + +class LiteralTypes: + count = 0 # Noncompliant + label = "initial" # Noncompliant + ratio = 0.5 # Noncompliant + count = 100 + label = "final" + ratio = 1.0 + + +class UniqueFields: + x = 1 + y = 2 + z = 3 + + +class AugmentedAssignment: + count = 0 + count += 1 + + +class AnnotationOnlyThenAssignment: + value: int + value = 42 + + +class ConditionalAssignments: + debug = False + if True: + debug = True + + +class TryExceptPattern: + backend = "redis" + try: + backend = "memcached" + except ImportError: + pass + + +class MethodSelfAssignments: + name = "default" + + def __init__(self): + self.name = "instance" + + def reset(self): + self.name = "reset" + + +class ClassMethodAssignments: + total = 0 + + @classmethod + def increment(cls): + cls.total += 1 + + +class ForLoopAssignment: + items = [] + for i in range(10): + items = [i] + + +class WithStatementAssignment: + resource = None + with open("file.txt") as f: + resource = f.read() + + +class WhileLoopAssignment: + retries = 0 + while retries < 3: + retries = retries + 1 + + +class TupleUnpacking: + x = 0 + y = 0 + x, y = 1, 2 + + +class ChainedAssignment: + a = 0 + b = 0 + a = b = 5 + + +class AttributeAssignment: + x = 1 + SomeClass.x = 2 + + +class SubscriptAssignment: + data = {} + data["key"] = "value" + + +class NestedClassSameName: + x = 1 + + class Inner: + x = 10 # Noncompliant + x = 20 + + +class DifferentClasses: + x = 1 + + +class AnotherClass: + x = 2 + + +class NestedFunctionAssignment: + field = "class_level" + + def setup(self): + field = "local" + field = "also_local" + + +class ComplexAnnotationNoValue: + items: list[int] + items: list[str] + items = [] + + +class SingleAnnotatedAssignment: + version: str = "1.0.0" + + +class AugmentedAfterAnnotated: + score: int = 0 + score += 10 + + +class OnlyAnnotationsNoValues: + x: int + x: str + + +class PlainThenAnnotated: + x = 1 # Noncompliant {{Remove this assignment; "x" is assigned again on line 216.}} +# ^ + x: int = 42 +# ^< {{Reassignment.}} + + +class AnnotatedNonNameVariable: + SomeClass.attr: int = 0 + data[0]: str = "x" + + +class SameValueAssignedTwice: + _VERSION = "1.0" # Noncompliant {{Remove this assignment; "_VERSION" is assigned again on line 232.}} +# ^^^^^^^^ + _REQUEST_TOKEN_URL = "https://example.com/oauth/request_token" + _ACCESS_TOKEN_URL = "https://example.com/oauth/access_token" + _AUTHORIZE_URL = "https://example.com/oauth/authorize" + _NO_CALLBACKS = True + _VERSION = "1.0" +# ^^^^^^^^< {{Reassignment.}} From 90b61d21734d701a8e47d3f799a666a6761aed3a Mon Sep 17 00:00:00 2001 From: Sebastian Zumbrunn Date: Thu, 2 Apr 2026 13:20:48 +0200 Subject: [PATCH 069/322] SONARPY-4013 Fix checksum check (#1039) GitOrigin-RevId: 6eb699c1de899e546cae5416f7e5bbb13970f9fb --- python-frontend/typeshed_serializer/README.md | 4 +- .../checksums/custom.checksum | 4 +- .../typeshed_serializer/runners/tox_runner.py | 6 +- .../tests/runners/test_tox_runner.py | 133 +++++++++++++++++- 4 files changed, 134 insertions(+), 13 deletions(-) diff --git a/python-frontend/typeshed_serializer/README.md b/python-frontend/typeshed_serializer/README.md index 0468bf623..1d8865866 100644 --- a/python-frontend/typeshed_serializer/README.md +++ b/python-frontend/typeshed_serializer/README.md @@ -32,8 +32,8 @@ tox -e py39 -- tests/runners/test_tox_runner.py::ToxRunnerTest::test_dry_run_unc python runners/tox_runner.py --dry_run true ``` -Can also be run in fail fast mode, to reflect behaviour in CI (where failStubGenerationFast is true) +Can also be run in fail fast mode, to reflect the checksum validation used by the QA workflow ```bash python runners/tox_runner.py --dry_run true --fail_fast true -``` \ No newline at end of file +``` diff --git a/python-frontend/typeshed_serializer/checksums/custom.checksum b/python-frontend/typeshed_serializer/checksums/custom.checksum index 20d75a91b..c326e1dbe 100644 --- a/python-frontend/typeshed_serializer/checksums/custom.checksum +++ b/python-frontend/typeshed_serializer/checksums/custom.checksum @@ -1,2 +1,2 @@ -61e014719cf03716e393ae97da9e3d394f41cc9f4bf4f5ee9fe48b2004605cfd -f8586ea766acbd86c5c0995ce3a7cc068ce433673cf057457eb8188fadc9ff39 +669032ff87c6a7027931d1987597a4371fc80b9da0f7817762518ec75d1fa357 +8a2fb0e2abba9b8e562913a29440ec31c7fd322f0c31d2d64d9a6c9591b444ed \ No newline at end of file diff --git a/python-frontend/typeshed_serializer/runners/tox_runner.py b/python-frontend/typeshed_serializer/runners/tox_runner.py index 4fd46c6de..61c6b1e29 100644 --- a/python-frontend/typeshed_serializer/runners/tox_runner.py +++ b/python-frontend/typeshed_serializer/runners/tox_runner.py @@ -216,9 +216,9 @@ def detect_required_serializations(fail_fast=False) -> List[str]: binary_changed = compute_and_compare_checksums("BINARY", folder_name, binary_files, read_file, previous_binary_checksum) if ressources_changed or binary_changed: - # Check for binary inconsistency (binary changed but source didn't) - if binary_changed and not ressources_changed and fail_fast: - raise RuntimeError('INCONSISTENT RESOURCE FOLDER BINARY CHECKSUMS') + # In CI fail-fast mode, the committed checksums must already match the tracked tree. + if fail_fast: + raise RuntimeError('INCONSISTENT RESOURCE FOLDER CHECKSUMS') ressources_that_needs_serialization.append(folder_config['serializer']) return ressources_that_needs_serialization diff --git a/python-frontend/typeshed_serializer/tests/runners/test_tox_runner.py b/python-frontend/typeshed_serializer/tests/runners/test_tox_runner.py index f9d3c6ee1..2e2a15e32 100644 --- a/python-frontend/typeshed_serializer/tests/runners/test_tox_runner.py +++ b/python-frontend/typeshed_serializer/tests/runners/test_tox_runner.py @@ -617,7 +617,91 @@ def test_detect_required_serializations_fail_fast_binary_inconsistent(self): tox_runner.detect_required_serializations(fail_fast=True) self.assertEqual( - str(error.exception), "INCONSISTENT RESOURCE FOLDER BINARY CHECKSUMS" + str(error.exception), "INCONSISTENT RESOURCE FOLDER CHECKSUMS" + ) + + def test_detect_required_serializations_fail_fast_source_inconsistent(self): + mock_resources_folders = { + "custom": { + "serializer": "custom", + "source_path": "custom", + } + } + + with ( + mock.patch( + f"{self.MODULE_NAME}.RESOURCES_FOLDERS", + mock_resources_folders, + ), + mock.patch( + f"{self.MODULE_NAME}.fetch_resources_subfolder_files" + ) as mock_resources_files, + mock.patch(self.COMPUTE_CHECKSUM_FUNCTION) as mocked_checksum, + mock.patch( + f"{self.MODULE_NAME}.fetch_binary_files_for_folder" + ) as mock_binary_files, + mock.patch( + f"{self.MODULE_NAME}.read_previous_folder_checksum" + ) as mock_read_checksum, + ): + mock_resources_files.return_value = [os.path.join("custom", "test.pyi")] + mock_binary_files.return_value = [os.path.join("custom_protobuf", "test.protobuf")] + mocked_checksum.side_effect = [ + "456", + "123", + ] + mock_read_checksum.return_value = ( + "999", + "123", + ) + + with self.assertRaises(RuntimeError) as error: + tox_runner.detect_required_serializations(fail_fast=True) + + self.assertEqual( + str(error.exception), "INCONSISTENT RESOURCE FOLDER CHECKSUMS" + ) + + def test_detect_required_serializations_fail_fast_source_and_binary_inconsistent(self): + mock_resources_folders = { + "custom": { + "serializer": "custom", + "source_path": "custom", + } + } + + with ( + mock.patch( + f"{self.MODULE_NAME}.RESOURCES_FOLDERS", + mock_resources_folders, + ), + mock.patch( + f"{self.MODULE_NAME}.fetch_resources_subfolder_files" + ) as mock_resources_files, + mock.patch(self.COMPUTE_CHECKSUM_FUNCTION) as mocked_checksum, + mock.patch( + f"{self.MODULE_NAME}.fetch_binary_files_for_folder" + ) as mock_binary_files, + mock.patch( + f"{self.MODULE_NAME}.read_previous_folder_checksum" + ) as mock_read_checksum, + ): + mock_resources_files.return_value = [os.path.join("custom", "test.pyi")] + mock_binary_files.return_value = [os.path.join("custom_protobuf", "test.protobuf")] + mocked_checksum.side_effect = [ + "456", + "789", + ] + mock_read_checksum.return_value = ( + "999", + "123", + ) + + with self.assertRaises(RuntimeError) as error: + tox_runner.detect_required_serializations(fail_fast=True) + + self.assertEqual( + str(error.exception), "INCONSISTENT RESOURCE FOLDER CHECKSUMS" ) def test_detect_required_serializations_no_fail_fast_binary_inconsistent(self): @@ -665,8 +749,46 @@ def test_detect_required_serializations_no_fail_fast_binary_inconsistent(self): result = tox_runner.detect_required_serializations(fail_fast=False) self.assertEqual(result, ["custom"]) - def test_main_fail_fast_resource_folder_binary_inconsistent(self): - # Test main function fail-fast when resource folder has binary inconsistency + def test_detect_required_serializations_no_fail_fast_source_and_binary_inconsistent(self): + mock_resources_folders = { + "custom": { + "serializer": "custom", + "source_path": "custom", + } + } + + with ( + mock.patch( + f"{self.MODULE_NAME}.RESOURCES_FOLDERS", + mock_resources_folders, + ), + mock.patch( + f"{self.MODULE_NAME}.fetch_resources_subfolder_files" + ) as mock_resources_files, + mock.patch(self.COMPUTE_CHECKSUM_FUNCTION) as mocked_checksum, + mock.patch( + f"{self.MODULE_NAME}.fetch_binary_files_for_folder" + ) as mock_binary_files, + mock.patch( + f"{self.MODULE_NAME}.read_previous_folder_checksum" + ) as mock_read_checksum, + ): + mock_resources_files.return_value = [os.path.join("custom", "test.pyi")] + mock_binary_files.return_value = [os.path.join("custom_protobuf", "test.protobuf")] + mocked_checksum.side_effect = [ + "456", + "789", + ] + mock_read_checksum.return_value = ( + "999", + "123", + ) + + result = tox_runner.detect_required_serializations(fail_fast=False) + self.assertEqual(result, ["custom"]) + + def test_main_fail_fast_resource_folder_checksum_inconsistent(self): + # Test main function fail-fast when resource folder checksums are inconsistent source_checksum = "123" with ( @@ -687,7 +809,7 @@ def test_main_fail_fast_resource_folder_binary_inconsistent(self): # Resource folder check raises RuntimeError mock_check_changes.side_effect = RuntimeError( - "INCONSISTENT RESOURCE FOLDER BINARY CHECKSUMS" + "INCONSISTENT RESOURCE FOLDER CHECKSUMS" ) # Should propagate the RuntimeError @@ -695,7 +817,7 @@ def test_main_fail_fast_resource_folder_binary_inconsistent(self): tox_runner.main(fail_fast=True) self.assertEqual( - str(error.exception), "INCONSISTENT RESOURCE FOLDER BINARY CHECKSUMS" + str(error.exception), "INCONSISTENT RESOURCE FOLDER CHECKSUMS" ) # Should not call subprocess mocked_subprocess.run.assert_not_called() @@ -891,4 +1013,3 @@ def test_compute_and_compare_checksums_unchanged(self): self.assertFalse(result) mock_logger.info.assert_any_call('BINARY FILES UNCHANGED in folder: importer - Computed over 2 files - Checksum: same_checksum') - From b947989456f814b70fc7f631e2795ca97065e166 Mon Sep 17 00:00:00 2001 From: Guillaume Dequenne Date: Thu, 2 Apr 2026 14:46:02 +0200 Subject: [PATCH 070/322] SONARPY-4014 Update parent pom to 87.0.0.3057 (#1041) GitOrigin-RevId: 2e7e792b13b4a267ce09121e77919afb10120b94 --- .../python/CustomPythonRuleRepository.java | 2 +- .../python/CustomPythonRulesPlugin.java | 2 +- .../org/sonar/samples/python/RulesList.java | 2 +- .../checks/CustomPythonSubscriptionCheck.java | 2 +- .../checks/CustomPythonVisitorCheck.java | 2 +- .../samples/python/checks/package-info.java | 2 +- .../sonar/samples/python/package-info.java | 2 +- .../src/main/resources/license-header.txt | 2 +- .../CustomPythonRuleRepositoryTest.java | 2 +- .../python/CustomPythonRulesPluginTest.java | 2 +- .../CustomPythonSubscriptionCheckTest.java | 2 +- .../checks/CustomPythonVisitorCheckTest.java | 2 +- .../it/ConcurrentOrchestratorExtension.java | 6 ++--- .../com/sonar/python/it/IssueListAssert.java | 6 ++--- .../sonar/python/it/IssueListAssertTest.java | 6 ++--- .../com/sonar/python/it/PluginLocator.java | 6 ++--- .../java/com/sonar/python/it/TestsUtils.java | 6 ++--- .../python/it/plugin/BanditReportTest.java | 6 ++--- .../com/sonar/python/it/plugin/CPDTest.java | 6 ++--- .../sonar/python/it/plugin/CoverageTest.java | 6 ++--- .../it/plugin/CustomRulesExampleTest.java | 6 ++--- .../python/it/plugin/CustomRulesTest.java | 6 ++--- .../python/it/plugin/Flake8ReportTest.java | 6 ++--- .../sonar/python/it/plugin/MetricsTest.java | 6 ++--- .../python/it/plugin/MypyReportTest.java | 6 ++--- .../sonar/python/it/plugin/NoSonarTest.java | 6 ++--- .../python/it/plugin/NotebookPluginTest.java | 6 ++--- .../python/it/plugin/PylintReportTest.java | 6 ++--- .../python/it/plugin/RuffReportTest.java | 6 ++--- .../it/plugin/SonarLintIPythonTest.java | 6 ++--- .../sonar/python/it/plugin/SonarLintTest.java | 6 ++--- .../python/it/plugin/TestReportTest.java | 6 ++--- .../sonar/python/it/plugin/TestRulesTest.java | 6 ++--- .../python/CustomPythonRuleRepository.java | 6 ++--- .../python/CustomPythonRulesPlugin.java | 6 ++--- .../python/CustomPythonSubscriptionCheck.java | 6 ++--- .../python/CustomPythonVisitorCheck.java | 6 ++--- .../sonar/samples/python/package-info.java | 6 ++--- .../CustomPythonRuleRepositoryTest.java | 6 ++--- .../python/CustomPythonRulesPluginTest.java | 6 ++--- .../CustomPythonSubscriptionCheckTest.java | 6 ++--- .../python/CustomPythonVisitorCheckTest.java | 6 ++--- pom.xml | 2 +- .../quickfix/PythonQuickFixVerifier.java | 6 ++--- .../python/checks/quickfix/package-info.java | 6 ++--- .../checks/utils/PythonCheckVerifier.java | 6 ++--- .../checks/utils/PythonMultiFileVerifier.java | 6 ++--- .../python/checks/utils/package-info.java | 6 ++--- .../quickfix/PythonQuickFixVerifierTest.java | 6 ++--- .../PythonCheckVerifierAdditionalTest.java | 6 ++--- .../checks/utils/PythonCheckVerifierTest.java | 6 ++--- .../utils/PythonMultiFileVerifierTest.java | 6 ++--- .../checks/AbstractCallExpressionCheck.java | 6 ++--- .../checks/AbstractDuplicateKeyCheck.java | 6 ++--- .../checks/AbstractFunctionNameCheck.java | 6 ++--- .../python/checks/AbstractNameCheck.java | 6 ++--- .../checks/AbstractStringFormatCheck.java | 6 ++--- .../AbstractUnreadPrivateMembersCheck.java | 6 ++--- .../checks/AfterJumpStatementCheck.java | 6 ++--- .../checks/AllBranchesAreIdenticalCheck.java | 6 ++--- .../python/checks/ArgumentNumberCheck.java | 6 ++--- .../python/checks/ArgumentTypeCheck.java | 6 ++--- .../checks/AsyncAwsLambdaHandlerCheck.java | 6 ++--- .../checks/AsyncFunctionNotAsyncCheck.java | 6 ++--- .../checks/AsyncFunctionWithTimeoutCheck.java | 6 ++--- .../python/checks/AsyncLongSleepCheck.java | 6 ++--- .../checks/AsyncWithContextManagerCheck.java | 6 ++--- .../checks/AsyncioTaskNotStoredCheck.java | 6 ++--- .../AwsClientExceptionNotCaughtCheck.java | 6 ++--- .../checks/AwsCustomMetricNamespaceCheck.java | 6 ++--- .../checks/AwsExpectedBucketOwnerCheck.java | 6 ++--- .../checks/AwsHardcodedRegionCheck.java | 6 ++--- .../AwsLambdaClientInstantiationCheck.java | 6 ++--- .../checks/AwsLambdaCrossCallCheck.java | 6 ++--- ...ambdaReservedEnvironmentVariableCheck.java | 6 ++--- ...LambdaReturnValueAreSerializableCheck.java | 6 ++--- .../checks/AwsLambdaTmpCleanupCheck.java | 6 ++--- .../checks/AwsLongTermAccessKeysCheck.java | 6 ++--- .../checks/AwsMissingPaginationCheck.java | 6 ++--- ...AwsWaitersInsteadOfCustomPollingCheck.java | 6 ++--- .../python/checks/BackslashInStringCheck.java | 6 ++--- .../python/checks/BackticksUsageCheck.java | 6 ++--- .../checks/BareRaiseInFinallyCheck.java | 6 ++--- .../BindToAllNetworkInterfacesCheck.java | 6 ++--- .../checks/BooleanCheckNotInvertedCheck.java | 6 ++--- .../BooleanExpressionInExceptCheck.java | 6 ++--- .../checks/BreakContinueOutsideLoopCheck.java | 6 ++--- .../BuiltinGenericsOverTypingModuleCheck.java | 6 ++--- .../BuiltinShadowingAssignmentCheck.java | 6 ++--- .../checks/BusyWaitingInAsyncCheck.java | 6 ++--- .../CancellationReraisedInAsyncCheck.java | 6 ++--- .../CancellationScopeNoCheckpointCheck.java | 6 ++--- .../python/checks/CaughtExceptionsCheck.java | 6 ++--- .../checks/ChangeMethodContractCheck.java | 6 ++--- .../ChildAndParentExceptionCaughtCheck.java | 6 ++--- ...ldRouterBeforeParentRegistrationCheck.java | 6 ++--- .../checks/CipherBlockChainingCheck.java | 6 ++--- .../python/checks/ClassComplexityCheck.java | 6 ++--- .../ClassFieldDefinedMultipleTimesCheck.java | 6 ++--- .../ClassMethodFirstArgumentNameCheck.java | 6 ++--- .../sonar/python/checks/ClassNameCheck.java | 6 ++--- .../CognitiveComplexityFunctionCheck.java | 6 ++--- .../checks/CollapsibleIfStatementsCheck.java | 6 ++--- ...tionCreationWrappedInConstructorCheck.java | 6 ++--- .../CollectionLengthComparisonCheck.java | 6 ++--- .../checks/CommentRegularExpressionCheck.java | 6 ++--- .../python/checks/CommentedCodeCheck.java | 6 ++--- .../python/checks/ComparisonToNoneCheck.java | 6 ++--- .../CompressionModulesFromNamespaceCheck.java | 6 ++--- .../checks/ConfusingTypeCheckingCheck.java | 6 ++--- .../python/checks/ConfusingWalrusCheck.java | 6 ++--- .../python/checks/ConsistentReturnCheck.java | 6 ++--- .../python/checks/ConstantConditionCheck.java | 6 ++--- .../ConstantValueDictComprehensionCheck.java | 6 ++--- .../checks/ControlFlowInTaskGroupCheck.java | 6 ++--- .../checks/CorsMiddlewareOrderingCheck.java | 6 ++--- .../python/checks/DbNoPasswordCheck.java | 6 ++--- .../sonar/python/checks/DeadStoreCheck.java | 6 ++--- .../checks/DefaultFactoryArgumentCheck.java | 6 ++--- .../checks/DeprecatedNumpyTypesCheck.java | 6 ++--- .../checks/DictKeysMembershipTestCheck.java | 6 ++--- .../checks/DictionaryDuplicateKeyCheck.java | 6 ++--- .../checks/DictionaryStaticKeyCheck.java | 6 ++--- .../checks/DirectTypeComparisonCheck.java | 6 ++--- .../DjangoNonDictSerializationCheck.java | 6 ++--- .../checks/DjangoRenderContextCheck.java | 6 ++--- .../checks/DoublePrefixOperatorCheck.java | 6 ++--- .../python/checks/DuplicateArgumentCheck.java | 6 ++--- .../checks/DuplicateBaseClassCheck.java | 6 ++--- .../DuplicatedMethodFieldNamesCheck.java | 6 ++--- .../DuplicatedMethodImplementationCheck.java | 6 ++--- .../python/checks/EinopsSyntaxCheck.java | 6 ++--- .../ElseAfterLoopsWithoutBreakCheck.java | 6 ++--- .../EmptyCollectionConstructorCheck.java | 6 ++--- .../python/checks/EmptyFunctionCheck.java | 6 ++--- .../python/checks/EmptyNestedBlockCheck.java | 6 ++--- .../python/checks/ExceptRethrowingCheck.java | 6 ++--- .../checks/ExceptionCauseTypeCheck.java | 6 ++--- .../python/checks/ExceptionGroupCheck.java | 6 ++--- .../checks/ExceptionNotThrownCheck.java | 6 ++--- .../ExceptionSuperClassDeclarationCheck.java | 6 ++--- .../checks/ExecStatementUsageCheck.java | 6 ++--- .../checks/ExitHasBadArgumentsCheck.java | 6 ++--- .../checks/FStringNestingLevelCheck.java | 6 ++--- .../FastAPIDependencyAnnotatedCheck.java | 6 ++--- .../checks/FastAPIFileUploadFormCheck.java | 6 ++--- .../FastAPIGenericRouteDecoratorCheck.java | 6 ++--- .../FastAPIHTTPExceptionDocumentedCheck.java | 6 ++--- .../checks/FastAPIPathParametersCheck.java | 6 ++--- .../FastAPIRedundantResponseModelCheck.java | 6 ++--- .../checks/FastApiImportStringCheck.java | 6 ++--- .../checks/FieldDuplicatesClassNameCheck.java | 6 ++--- .../sonar/python/checks/FieldNameCheck.java | 6 ++--- .../python/checks/FileComplexityCheck.java | 6 ++--- .../checks/FileHeaderCopyrightCheck.java | 6 ++--- .../python/checks/FilePermissionsCheck.java | 6 ++--- .../python/checks/FixmeCommentCheck.java | 6 ++--- .../checks/FlaskErrorHandlerStatusCheck.java | 6 ++--- .../FlaskHardCodedJWTSecretKeyCheck.java | 6 ++--- .../python/checks/FlaskHardCodedSecret.java | 6 ++--- .../checks/FlaskHardCodedSecretKeyCheck.java | 6 ++--- .../checks/FlaskHeadersDictAccessCheck.java | 6 ++--- .../FlaskPostWithQueryParameterCheck.java | 6 ++--- .../checks/FlaskPreprocessRequestCheck.java | 6 ++--- .../python/checks/FlaskRouteMethodsCheck.java | 6 ++--- .../checks/FlaskSendFileMimeTypeCheck.java | 6 ++--- .../checks/FlaskViewDecoratorCheck.java | 6 ++--- .../checks/FloatingPointEqualityCheck.java | 6 ++--- .../checks/FunctionComplexityCheck.java | 6 ++--- .../python/checks/FunctionNameCheck.java | 6 ++--- .../checks/FunctionReturnTypeCheck.java | 6 ++--- .../FunctionUsingLoopVariableCheck.java | 6 ++--- .../GenericClassTypeParameterCheck.java | 6 ++--- .../checks/GenericExceptionRaisedCheck.java | 6 ++--- .../GenericFunctionTypeParameterCheck.java | 6 ++--- .../checks/GenericTypeStatementCheck.java | 6 ++--- .../GenericTypeWithoutArgumentCheck.java | 6 ++--- .../checks/GraphQLDenialOfServiceCheck.java | 6 ++--- .../checks/HardcodedCredentialsCallCheck.java | 6 ++--- .../sonar/python/checks/HardcodedIPCheck.java | 6 ++--- .../sonar/python/checks/HashMethodCheck.java | 6 ++--- .../HttpNoContentNonEmptyBodyCheck.java | 6 ++--- ...nticalExpressionOnBinaryOperatorCheck.java | 6 ++--- ...dentityComparisonWithCachedTypesCheck.java | 6 ++--- .../IdentityComparisonWithNewObjectCheck.java | 6 ++--- .../python/checks/IgnoredParameterCheck.java | 6 ++--- .../checks/IgnoredPureOperationsCheck.java | 6 ++--- .../python/checks/IgnoredSystemExitCheck.java | 6 ++--- .../ImplicitStringConcatenationCheck.java | 6 ++--- .../python/checks/IncompatibleOperands.java | 6 ++--- .../checks/IncompatibleOperandsCheck.java | 6 ++--- .../checks/InconsistentTupleReturnCheck.java | 6 ++--- .../checks/InconsistentTypeHintCheck.java | 6 ++--- .../checks/IncorrectExceptionTypeCheck.java | 6 ++--- ...ectParameterDatetimeConstructorsCheck.java | 6 ++--- .../sonar/python/checks/IndexMethodCheck.java | 6 ++--- .../checks/InefficientDictIterationCheck.java | 6 ++--- .../python/checks/InequalityUsageCheck.java | 6 ++--- .../python/checks/InfiniteRecursionCheck.java | 6 ++--- .../python/checks/InitReturnsValueCheck.java | 6 ++--- .../python/checks/InputInAsyncCheck.java | 6 ++--- ...ClassMethodsAtLeastOnePositionalCheck.java | 6 ++--- .../InstanceMethodSelfAsFirstCheck.java | 6 ++--- .../python/checks/InvalidOpenModeCheck.java | 6 ++--- .../python/checks/InvariantReturnCheck.java | 6 ++--- .../python/checks/IsCloseAbsTolCheck.java | 6 ++--- .../python/checks/ItemOperationsType.java | 6 ++--- .../checks/ItemOperationsTypeCheck.java | 6 ++--- .../checks/IterMethodReturnTypeCheck.java | 6 ++--- .../python/checks/IterationOnNonIterable.java | 6 ++--- .../checks/IterationOnNonIterableCheck.java | 6 ++--- .../python/checks/JumpInFinallyCheck.java | 6 ++--- .../python/checks/JwtVerificationCheck.java | 6 ++--- .../python/checks/LambdaAssignmentCheck.java | 6 ++--- .../checks/LdapAuthenticationCheck.java | 6 ++--- .../sonar/python/checks/LineLengthCheck.java | 6 ++--- ...riableAndParameterNameConventionCheck.java | 6 ++--- ...gIntegerWithLowercaseSuffixUsageCheck.java | 6 ++--- .../checks/LoopExecutingAtMostOnceCheck.java | 6 ++--- .../checks/LoopOverDictKeyValuesCheck.java | 6 ++--- ...ndatoryFunctionParameterTypeHintCheck.java | 6 ++--- .../MandatoryFunctionReturnTypeHintCheck.java | 6 ++--- .../checks/MembershipTestSupportCheck.java | 6 ++--- .../sonar/python/checks/MethodNameCheck.java | 6 ++--- .../checks/MethodShouldBeStaticCheck.java | 6 ++--- .../python/checks/MissingDocstringCheck.java | 6 ++--- .../checks/MissingHyperParameterCheck.java | 6 ++--- .../MissingNewlineAtEndOfFileCheck.java | 6 ++--- .../checks/ModifiedParameterValueCheck.java | 6 ++--- .../sonar/python/checks/ModuleNameCheck.java | 6 ++--- .../checks/MutableDefaultValueCheck.java | 6 ++--- .../python/checks/NeedlessPassCheck.java | 6 ++--- .../NestedCollectionsCreationCheck.java | 6 ++--- .../NestedConditionalExpressionCheck.java | 6 ++--- .../checks/NestedControlFlowDepthCheck.java | 6 ++--- .../checks/NestedLoopVariableReuseCheck.java | 6 ++--- .../python/checks/NewStyleClassCheck.java | 6 ++--- .../checks/NoPersonReferenceInTodoCheck.java | 6 ++--- .../sonar/python/checks/NoQaCommentCheck.java | 6 ++--- .../python/checks/NoReRaiseInExitCheck.java | 6 ++--- .../python/checks/NoSonarCommentCheck.java | 6 ++--- .../checks/NoSonarCommentFormatCheck.java | 6 ++--- .../python/checks/NonCallableCalled.java | 6 ++--- .../python/checks/NonCallableCalledCheck.java | 6 ++--- .../checks/NonSingletonTfVariableCheck.java | 6 ++--- .../checks/NonStringInAllPropertyCheck.java | 6 ++--- .../NotImplementedBooleanContextCheck.java | 6 ++--- ...mplementedErrorInOperatorMethodsCheck.java | 6 ++--- .../sonar/python/checks/NumpyIsNanCheck.java | 6 ++--- .../checks/NumpyListOverGeneratorCheck.java | 6 ++--- .../python/checks/NumpyRandomStateCheck.java | 6 ++--- .../checks/NumpyWeekMaskValidationCheck.java | 6 ++--- .../checks/NumpyWhereOneConditionCheck.java | 6 ++--- .../checks/OneStatementPerLineCheck.java | 6 ++--- .../python/checks/OpenSourceCheckList.java | 6 ++--- .../OverwrittenCollectionEntryCheck.java | 6 ++--- .../checks/PandasAddMergeParametersCheck.java | 6 ++--- .../checks/PandasChainInstructionCheck.java | 6 ++--- .../checks/PandasDataFrameToNumpyCheck.java | 6 ++--- .../checks/PandasModifyInPlaceCheck.java | 6 ++--- .../checks/PandasReadNoDataTypeCheck.java | 6 ++--- .../checks/PandasToDatetimeFormatCheck.java | 6 ++--- .../python/checks/ParsingErrorCheck.java | 6 ++--- .../checks/PreIncrementDecrementCheck.java | 6 ++--- .../python/checks/PredictableSaltCheck.java | 6 ++--- .../checks/PrintStatementUsageCheck.java | 6 ++--- .../PropertyAccessorParameterCountCheck.java | 6 ++--- .../PyTorchDataLoaderNumWorkersCheck.java | 6 ++--- .../PydanticOptionalFieldDefaultCheck.java | 6 ++--- ...ytzTimeZoneInDatetimeConstructorCheck.java | 6 ++--- .../sonar/python/checks/PytzUsageCheck.java | 6 ++--- .../checks/RaiseOutsideExceptCheck.java | 6 ++--- .../sonar/python/checks/RandomSeedCheck.java | 6 ++--- .../python/checks/RedundantJumpCheck.java | 6 ++--- .../ReferencedBeforeAssignmentCheck.java | 6 ++--- .../ReturnAndYieldInOneFunctionCheck.java | 6 ++--- .../sonar/python/checks/ReturnCheckUtils.java | 6 ++--- .../ReturnYieldOutsideFunctionCheck.java | 6 ++--- ...ectionConstructorAsComprehensionCheck.java | 6 ++--- .../checks/RobustCipherAlgorithmCheck.java | 6 ++--- .../RouterPrefixInIncludeRouterCheck.java | 6 ++--- .../sonar/python/checks/SameBranchCheck.java | 6 ++--- .../python/checks/SameConditionCheck.java | 6 ++--- .../SecureModeEncryptionAlgorithmsCheck.java | 6 ++--- .../python/checks/SelfAssignmentCheck.java | 6 ++--- .../python/checks/SetDuplicateKeyCheck.java | 6 ++--- .../checks/SideEffectInTfFunctionCheck.java | 6 ++--- .../sonar/python/checks/SillyEquality.java | 6 ++--- .../python/checks/SillyEqualityCheck.java | 6 ++--- .../python/checks/SillyIdentityCheck.java | 6 ++--- ...torDontInitializeEstimatedValuesCheck.java | 6 ++--- ...edPipelineDontAccessTransformersCheck.java | 6 ++--- ...learnPipelineParameterAreCorrectCheck.java | 6 ++--- ...arnPipelineSpecifyMemoryArgumentCheck.java | 6 ++--- .../python/checks/SleepZeroInAsyncCheck.java | 6 ++--- .../python/checks/SlotsAssignmentCheck.java | 6 ++--- .../python/checks/SortedMinMaxCheck.java | 6 ++--- .../checks/SpecialMethodParamListCheck.java | 6 ++--- .../checks/SpecialMethodReturnTypeCheck.java | 6 ++--- .../StrftimeConfusingHourSystemCheck.java | 6 ++--- .../org/sonar/python/checks/StringFormat.java | 6 ++--- .../checks/StringFormatCorrectnessCheck.java | 6 ++--- .../checks/StringFormatMisuseCheck.java | 6 ++--- .../checks/StringLiteralDuplicationCheck.java | 6 ++--- ...SynchronousFileOperationsInAsyncCheck.java | 6 ++--- ...SynchronousHttpOperationsInAsyncCheck.java | 6 ++--- .../SynchronousOsCallsInAsyncCheck.java | 6 ++--- ...onousSubprocessOperationsInAsyncCheck.java | 6 ++--- .../TaskGroupNurseryUsedOnlyOnceCheck.java | 6 ++--- .../python/checks/TempFileCreationCheck.java | 6 ++--- .../TemplateAndStrConcatenationCheck.java | 6 ++--- ...eStringStructuralPatternMatchingCheck.java | 6 ++--- .../TestClientContentParameterCheck.java | 6 ++--- ...fFunctionDependOnOutsideVariableCheck.java | 6 ++--- .../checks/TfFunctionRecursivityCheck.java | 6 ++--- ...fGatherDeprecatedValidateIndicesCheck.java | 6 ++--- .../TfInputShapeOnModelSubclassCheck.java | 6 ++--- .../TfPyTorchSpecifyReductionAxisCheck.java | 6 ++--- .../python/checks/TimeSleepInAsyncCheck.java | 6 ++--- ...imezoneNaiveDatetimeConstructorsCheck.java | 6 ++--- .../sonar/python/checks/ToDoCommentCheck.java | 6 ++--- .../checks/TooManyLinesInFileCheck.java | 6 ++--- .../checks/TooManyLinesInFunctionCheck.java | 6 ++--- .../python/checks/TooManyParametersCheck.java | 6 ++--- .../python/checks/TooManyReturnsCheck.java | 6 ++--- ...hAutogradVariableShouldNotBeUsedCheck.java | 6 ++--- ...oadLeadsToUntrustedCodeExecutionCheck.java | 6 ++--- ...oduleModeShouldBeSetAfterLoadingCheck.java | 6 ++--- .../TorchModuleShouldCallInitCheck.java | 6 ++--- .../python/checks/TrailingCommentCheck.java | 6 ++--- .../checks/TrailingWhitespaceCheck.java | 6 ++--- .../checks/TypeAliasAnnotationCheck.java | 6 ++--- ...TypeVarCovariantAndContravariantCheck.java | 6 ++--- .../checks/UndefinedNameAllPropertyCheck.java | 6 ++--- .../python/checks/UndefinedSymbolsCheck.java | 6 ++--- .../checks/UnionTypeExpressionCheck.java | 6 ++--- .../checks/UnnecessaryComprehensionCheck.java | 6 ++--- .../checks/UnnecessaryLambdaMapCallCheck.java | 6 ++--- .../checks/UnnecessaryListCastCheck.java | 6 ++--- ...cessaryListComprehensionArgumentCheck.java | 6 ++--- .../checks/UnnecessaryReversedCallCheck.java | 6 ++--- .../checks/UnnecessarySortInsideSetCheck.java | 6 ++--- .../UnnecessarySubscriptReversalCheck.java | 6 ++--- .../UnprocessedTemplateStringCheck.java | 6 ++--- .../python/checks/UnreachableExceptCheck.java | 6 ++--- .../checks/UnreadPrivateAttributesCheck.java | 6 ++--- .../UnreadPrivateInnerClassesCheck.java | 6 ++--- .../checks/UnreadPrivateMethodsCheck.java | 6 ++--- .../checks/UnusedFunctionParameterCheck.java | 6 ++--- .../python/checks/UnusedImportCheck.java | 6 ++--- .../checks/UnusedLocalVariableCheck.java | 6 ++--- .../checks/UnusedNestedDefinitionCheck.java | 6 ++--- .../checks/UseOfAnyAsTypeHintCheck.java | 6 ++--- .../checks/UseOfEmptyReturnValueCheck.java | 6 ++--- .../checks/UseStartsWithEndsWithCheck.java | 6 ++--- .../UselessParenthesisAfterKeywordCheck.java | 6 ++--- .../checks/UselessParenthesisCheck.java | 6 ++--- .../python/checks/UselessStatementCheck.java | 6 ++--- .../VerifiedSslTlsCertificateCheck.java | 6 ++--- .../python/checks/WeakSSLProtocolCheck.java | 6 ++--- .../checks/WebEntryPointDecoratorCheck.java | 6 ++--- .../python/checks/WildcardImportCheck.java | 6 ++--- .../checks/WrongAssignmentOperatorCheck.java | 6 ++--- .../checks/XMLParserXXEVulnerableCheck.java | 6 ++--- .../checks/cdk/AbstractCdkResourceCheck.java | 6 ++--- .../cdk/AbstractIamPolicyStatementCheck.java | 6 ++--- .../checks/cdk/AbstractS3BucketCheck.java | 6 ++--- .../sonar/python/checks/cdk/CdkPredicate.java | 6 ++--- .../org/sonar/python/checks/cdk/CdkUtils.java | 6 ++--- .../cdk/ClearTextProtocolsCheckPart.java | 6 ++--- .../cdk/DisabledEFSEncryptionCheck.java | 6 ++--- .../cdk/DisabledESDomainEncryptionCheck.java | 6 ++--- .../cdk/DisabledRDSEncryptionCheck.java | 6 ++--- .../cdk/DisabledSNSTopicEncryptionCheck.java | 6 ++--- .../cdk/IamPolicyPublicAccessCheck.java | 6 ++--- .../cdk/IamPrivilegeEscalationCheck.java | 6 ++--- ...workCallsWithoutTimeoutsInLambdaCheck.java | 6 ++--- .../python/checks/cdk/PolicyStatement.java | 6 ++--- .../checks/cdk/PrivilegePolicyCheck.java | 6 ++--- .../PublicApiIsSecuritySensitiveCheck.java | 6 ++--- ...licNetworkAccessToCloudResourcesCheck.java | 6 ++--- .../checks/cdk/ResourceAccessPolicyCheck.java | 6 ++--- .../cdk/S3BucketBlockPublicAccessCheck.java | 6 ++--- .../cdk/S3BucketGrantedAccessCheck.java | 6 ++--- .../cdk/S3BucketHTTPCommunicationCheck.java | 6 ++--- .../cdk/S3BucketServerEncryptionCheck.java | 6 ++--- .../checks/cdk/S3BucketVersioningCheck.java | 6 ++--- .../checks/cdk/UnencryptedEbsVolumeCheck.java | 6 ++--- .../UnencryptedSageMakerNotebookCheck.java | 6 ++--- .../checks/cdk/UnencryptedSqsQueueCheck.java | 6 ++--- .../cdk/UnrestrictedAdministrationCheck.java | 6 ++--- ...tedAdministrationCheckPartCfnSecurity.java | 6 ++--- ...tedAdministrationCheckPartConnections.java | 6 ++--- ...restrictedOutboundCommunicationsCheck.java | 6 ++--- .../checks/cdk/WeakSSLProtocolCheckPart.java | 6 ++--- .../sonar/python/checks/cdk/package-info.java | 6 ++--- .../django/DjangoModelFormFieldsCheck.java | 6 ++--- .../django/DjangoModelStrMethodCheck.java | 6 ++--- .../django/DjangoModelStringFieldCheck.java | 6 ++--- .../python/checks/django/DjangoUtils.java | 6 ++--- .../python/checks/django/package-info.java | 6 ++--- .../hotspots/AbstractCookieFlagCheck.java | 6 ++--- .../hotspots/ClearTextProtocolsCheck.java | 6 ++--- .../checks/hotspots/CommandLineArgsCheck.java | 6 ++--- .../hotspots/CommonValidationUtils.java | 6 ++--- .../python/checks/hotspots/CorsCheck.java | 6 ++--- .../checks/hotspots/CsrfDisabledCheck.java | 6 ++--- .../checks/hotspots/DataEncryptionCheck.java | 6 ++--- .../checks/hotspots/DebugModeCheck.java | 6 ++--- .../hotspots/DisabledHtmlAutoEscapeCheck.java | 6 ++--- .../DisabledHtmlAutoEscapeLegacyCheck.java | 6 ++--- .../hotspots/DynamicCodeExecutionCheck.java | 6 ++--- .../checks/hotspots/EmailSendingCheck.java | 6 ++--- .../hotspots/ExpandingArchiveCheck.java | 6 ++--- .../hotspots/FastHashingOrPlainTextCheck.java | 6 ++--- .../hotspots/GraphQLIntrospectionCheck.java | 6 ++--- .../hotspots/HardCodedCredentialsCheck.java | 6 ++--- .../HardCodedCredentialsEntropyCheck.java | 6 ++--- .../checks/hotspots/HashingDataCheck.java | 6 ++--- .../checks/hotspots/HttpOnlyCookieCheck.java | 6 ++--- .../hotspots/LoggersConfigurationCheck.java | 6 ++--- ...onStandardCryptographicAlgorithmCheck.java | 6 ++--- .../python/checks/hotspots/OsExecCheck.java | 6 ++--- .../hotspots/ProcessSignallingCheck.java | 6 ++--- .../checks/hotspots/PseudoRandomCheck.java | 6 ++--- .../PubliclyWritableDirectoriesCheck.java | 6 ++--- .../python/checks/hotspots/RegexCheck.java | 6 ++--- .../checks/hotspots/SQLQueriesCheck.java | 6 ++--- .../checks/hotspots/SecureCookieCheck.java | 6 ++--- .../checks/hotspots/StandardInputCheck.java | 6 ++--- .../StrongCryptographicKeysCheck.java | 6 ++--- .../hotspots/UnsafeHttpMethodsCheck.java | 6 ++--- .../hotspots/UnverifiedHostnameCheck.java | 6 ++--- .../hotspots/XMLSignatureValidationCheck.java | 6 ++--- .../python/checks/hotspots/package-info.java | 6 ++--- .../org/sonar/python/checks/package-info.java | 6 ++--- .../checks/regex/AbstractRegexCheck.java | 6 ++--- .../checks/regex/AnchorPrecedenceCheck.java | 6 ++--- .../DuplicatesInCharacterClassCheck.java | 6 ++--- .../checks/regex/EmptyAlternativeCheck.java | 6 ++--- .../python/checks/regex/EmptyGroupCheck.java | 6 ++--- .../regex/EmptyStringRepetitionCheck.java | 6 ++--- .../regex/GraphemeClustersInClassesCheck.java | 6 ++--- .../checks/regex/GroupReplacementCheck.java | 6 ++--- .../regex/ImpossibleBackReferenceCheck.java | 6 ++--- .../regex/ImpossibleBoundariesCheck.java | 6 ++--- .../checks/regex/InvalidRegexCheck.java | 6 ++--- .../checks/regex/MultipleWhitespaceCheck.java | 6 ++--- .../python/checks/regex/OctalEscapeCheck.java | 6 ++--- ...PossessiveQuantifierContinuationCheck.java | 6 ++--- .../sonar/python/checks/regex/RedosCheck.java | 6 ++--- .../RedundantRegexAlternativesCheck.java | 6 ++--- .../checks/regex/RegexComplexityCheck.java | 6 ++--- .../checks/regex/RegexLookaheadCheck.java | 6 ++--- .../regex/ReluctantQuantifierCheck.java | 6 ++--- ...tQuantifierWithEmptyContinuationCheck.java | 6 ++--- .../regex/SingleCharCharacterClassCheck.java | 6 ++--- .../SingleCharacterAlternationCheck.java | 6 ++--- .../checks/regex/StringReplaceCheck.java | 6 ++--- .../regex/SuperfluousCurlyBraceCheck.java | 6 ++--- .../UnquantifiedNonCapturingGroupCheck.java | 6 ++--- .../checks/regex/UnusedGroupNamesCheck.java | 6 ++--- .../checks/regex/VerboseRegexCheck.java | 6 ++--- .../python/checks/regex/package-info.java | 6 ++--- .../checks/tests/AssertAfterRaiseCheck.java | 6 ++--- .../tests/AssertOnDissimilarTypesCheck.java | 6 ++--- .../tests/AssertOnTupleLiteralCheck.java | 6 ++--- .../checks/tests/DedicatedAssertionCheck.java | 6 ++--- .../tests/ImplicitlySkippedTestCheck.java | 6 ++--- .../tests/NotDiscoverableTestMethodCheck.java | 6 ++--- .../tests/SkippedTestNoReasonCheck.java | 6 ++--- .../tests/UnconditionalAssertionCheck.java | 6 ++--- .../python/checks/tests/package-info.java | 6 ++--- .../checks/utils/AwsLambdaChecksUtils.java | 6 ++--- .../sonar/python/checks/utils/CheckUtils.java | 6 ++--- .../python/checks/utils/DeadStoreUtils.java | 6 ++--- .../python/checks/utils/Expressions.java | 6 ++--- .../checks/utils/FunctionParameterUtils.java | 6 ++--- .../python/checks/utils/GraphQLUtils.java | 6 ++--- .../checks/utils/ImportedNamesCollector.java | 6 ++--- .../IsComprehensionTransformedChecker.java | 6 ++--- .../python/checks/utils/MarimoUtils.java | 6 ++--- .../utils/StringLiteralValuesCollector.java | 6 ++--- .../python/checks/utils/package-info.java | 6 ++--- .../java/org/sonar/python/package-info.java | 6 ++--- .../checks/AfterJumpStatementCheckTest.java | 6 ++--- .../AllBranchesAreIdenticalCheckTest.java | 6 ++--- .../checks/ArgumentNumberCheckTest.java | 6 ++--- .../python/checks/ArgumentTypeCheckTest.java | 6 ++--- .../AsyncAwsLambdaHandlerCheckTest.java | 6 ++--- .../AsyncFunctionNotAsyncCheckTest.java | 6 ++--- .../AsyncFunctionWithTimeoutCheckTest.java | 6 ++--- .../checks/AsyncLongSleepCheckTest.java | 6 ++--- .../AsyncWithContextManagerCheckTest.java | 6 ++--- .../checks/AsyncioTaskNotStoredCheckTest.java | 6 ++--- .../AwsClientExceptionNotCaughtCheckTest.java | 6 ++--- .../AwsCustomMetricNamespaceCheckTest.java | 6 ++--- .../AwsExpectedBucketOwnerCheckTest.java | 6 ++--- .../checks/AwsHardcodedRegionCheckTest.java | 6 ++--- ...AwsLambdaClientInstantiationCheckTest.java | 6 ++--- .../checks/AwsLambdaCrossCallCheckTest.java | 6 ++--- ...aReservedEnvironmentVariableCheckTest.java | 6 ++--- ...daReturnValueAreSerializableCheckTest.java | 6 ++--- .../checks/AwsLambdaTmpCleanupCheckTest.java | 6 ++--- .../AwsLongTermAccessKeysCheckTest.java | 6 ++--- .../checks/AwsMissingPaginationCheckTest.java | 6 ++--- ...aitersInsteadOfCustomPollingCheckTest.java | 6 ++--- .../checks/BackslashInStringCheckTest.java | 6 ++--- .../checks/BackticksUsageCheckTest.java | 6 ++--- .../checks/BareRaiseInFinallyCheckTest.java | 6 ++--- .../BindToAllNetworkInterfacesCheckTest.java | 6 ++--- .../BooleanCheckNotInvertedCheckTest.java | 6 ++--- .../BooleanExpressionInExceptCheckTest.java | 6 ++--- .../BreakContinueOutsideLoopCheckTest.java | 6 ++--- ...ltinGenericsOverTypingModuleCheckTest.java | 6 ++--- .../BuiltinShadowingAssignmentCheckTest.java | 6 ++--- .../checks/BusyWaitingInAsyncCheckTest.java | 6 ++--- .../CancellationReraisedInAsyncCheckTest.java | 6 ++--- ...ancellationScopeNoCheckpointCheckTest.java | 6 ++--- .../checks/CaughtExceptionsCheckTest.java | 6 ++--- .../checks/ChangeMethodContractCheckTest.java | 6 ++--- ...hildAndParentExceptionCaughtCheckTest.java | 6 ++--- ...uterBeforeParentRegistrationCheckTest.java | 6 ++--- .../checks/CipherBlockChainingCheckTest.java | 6 ++--- .../checks/ClassComplexityCheckTest.java | 6 ++--- ...assFieldDefinedMultipleTimesCheckTest.java | 6 ++--- ...ClassMethodFirstArgumentNameCheckTest.java | 6 ++--- .../python/checks/ClassNameCheckTest.java | 6 ++--- .../CognitiveComplexityFunctionCheckTest.java | 6 ++--- .../CollapsibleIfStatementsCheckTest.java | 6 ++--- ...CreationWrappedInConstructorCheckTest.java | 6 ++--- .../CollectionLengthComparisonCheckTest.java | 6 ++--- .../CommentRegularExpressionCheckTest.java | 6 ++--- .../python/checks/CommentedCodeCheckTest.java | 6 ++--- .../checks/ComparisonToNoneCheckTest.java | 6 ++--- ...pressionModulesFromNamespaceCheckTest.java | 6 ++--- .../ConfusingTypeCheckingCheckTest.java | 6 ++--- .../checks/ConfusingWalrusCheckTest.java | 6 ++--- .../checks/ConsistentReturnCheckTest.java | 6 ++--- .../checks/ConstantConditionCheckTest.java | 6 ++--- ...nstantValueDictComprehensionCheckTest.java | 6 ++--- .../ControlFlowInTaskGroupCheckTest.java | 6 ++--- .../CorsMiddlewareOrderingCheckTest.java | 6 ++--- .../python/checks/DbNoPasswordCheckTest.java | 6 ++--- .../python/checks/DeadStoreCheckTest.java | 6 ++--- .../DefaultFactoryArgumentCheckTest.java | 6 ++--- .../checks/DeprecatedNumpyTypesCheckTest.java | 6 ++--- .../DictKeysMembershipTestCheckTest.java | 6 ++--- .../DictionaryDuplicateKeyCheckTest.java | 6 ++--- .../checks/DictionaryStaticKeyCheckTest.java | 6 ++--- .../checks/DirectTypeComparisonCheckTest.java | 6 ++--- .../DjangoNonDictSerializationCheckTest.java | 6 ++--- .../checks/DjangoRenderContextCheckTest.java | 6 ++--- .../checks/DoublePrefixOperatorCheckTest.java | 6 ++--- .../checks/DuplicateArgumentCheckTest.java | 6 ++--- .../checks/DuplicateBaseClassCheckTest.java | 6 ++--- .../DuplicatedMethodFieldNamesCheckTest.java | 6 ++--- ...plicatedMethodImplementationCheckTest.java | 6 ++--- .../python/checks/EinopsSyntaxCheckTest.java | 6 ++--- .../ElseAfterLoopsWithoutBreakCheckTest.java | 6 ++--- .../EmptyCollectionConstructorCheckTest.java | 6 ++--- .../python/checks/EmptyFunctionCheckTest.java | 6 ++--- .../checks/EmptyNestedBlockCheckTest.java | 6 ++--- .../checks/ExceptRethrowingCheckTest.java | 6 ++--- .../checks/ExceptionCauseTypeCheckTest.java | 6 ++--- .../checks/ExceptionGroupCheckTest.java | 6 ++--- .../checks/ExceptionNotThrownCheckTest.java | 6 ++--- ...ceptionSuperClassDeclarationCheckTest.java | 6 ++--- .../checks/ExecStatementUsageCheckTest.java | 6 ++--- .../checks/ExitHasBadArgumentsCheckTest.java | 6 ++--- .../checks/FStringNestingLevelCheckTest.java | 6 ++--- .../FastAPIDependencyAnnotatedCheckTest.java | 6 ++--- .../FastAPIFileUploadFormCheckTest.java | 6 ++--- ...FastAPIGenericRouteDecoratorCheckTest.java | 6 ++--- ...stAPIHTTPExceptionDocumentedCheckTest.java | 6 ++--- .../FastAPIPathParametersCheckTest.java | 6 ++--- ...astAPIRedundantResponseModelCheckTest.java | 6 ++--- .../checks/FastApiImportStringCheckTest.java | 6 ++--- .../FieldDuplicatesClassNameCheckTest.java | 6 ++--- .../python/checks/FieldNameCheckTest.java | 6 ++--- .../checks/FileComplexityCheckTest.java | 6 ++--- .../checks/FileHeaderCopyrightCheckTest.java | 6 ++--- .../checks/FilePermissionsCheckTest.java | 6 ++--- .../python/checks/FixmeCommentCheckTest.java | 6 ++--- .../FlaskErrorHandlerStatusCheckTest.java | 6 ++--- .../FlaskHardCodedJWTSecretKeyCheckTest.java | 6 ++--- .../FlaskHardCodedSecretKeyCheckTest.java | 6 ++--- .../FlaskHeadersDictAccessCheckTest.java | 6 ++--- .../FlaskPostWithQueryParameterCheckTest.java | 6 ++--- .../FlaskPreprocessRequestCheckTest.java | 6 ++--- .../checks/FlaskRouteMethodsCheckTest.java | 6 ++--- .../FlaskSendFileMimeTypeCheckTest.java | 6 ++--- .../checks/FlaskViewDecoratorCheckTest.java | 6 ++--- .../FloatingPointEqualityCheckTest.java | 6 ++--- .../checks/FunctionComplexityCheckTest.java | 6 ++--- .../python/checks/FunctionNameCheckTest.java | 6 ++--- .../checks/FunctionReturnTypeCheckTest.java | 6 ++--- .../FunctionUsingLoopVariableCheckTest.java | 6 ++--- .../GenericClassTypeParameterCheckTest.java | 6 ++--- .../GenericExceptionRaisedCheckTest.java | 6 ++--- ...GenericFunctionTypeParameterCheckTest.java | 6 ++--- .../checks/GenericTypeStatementCheckTest.java | 6 ++--- .../GenericTypeWithoutArgumentCheckTest.java | 6 ++--- .../GraphQLDenialOfServiceCheckTest.java | 6 ++--- .../HardcodedCredentialsCallCheckTest.java | 6 ++--- .../python/checks/HardcodedIPCheckTest.java | 6 ++--- .../python/checks/HashMethodCheckTest.java | 6 ++--- .../HttpNoContentNonEmptyBodyCheckTest.java | 6 ++--- ...alExpressionOnBinaryOperatorCheckTest.java | 6 ++--- ...ityComparisonWithCachedTypesCheckTest.java | 6 ++--- ...ntityComparisonWithNewObjectCheckTest.java | 6 ++--- .../checks/IgnoredParameterCheckTest.java | 6 ++--- .../IgnoredPureOperationsCheckTest.java | 6 ++--- .../checks/IgnoredSystemExitCheckTest.java | 6 ++--- .../ImplicitStringConcatenationCheckTest.java | 6 ++--- .../checks/IncompatibleOperandsCheckTest.java | 6 ++--- .../InconsistentTupleReturnCheckTest.java | 6 ++--- .../checks/InconsistentTypeHintCheckTest.java | 6 ++--- .../IncorrectExceptionTypeCheckTest.java | 6 ++--- ...arameterDatetimeConstructorsCheckTest.java | 6 ++--- .../python/checks/IndexMethodCheckTest.java | 6 ++--- .../InefficientDictIterationCheckTest.java | 6 ++--- .../checks/InequalityUsageCheckTest.java | 6 ++--- .../checks/InfiniteRecursionCheckTest.java | 6 ++--- .../checks/InitReturnsValueCheckTest.java | 6 ++--- .../python/checks/InputInAsyncCheckTest.java | 6 ++--- ...sMethodsAtLeastOnePositionalCheckTest.java | 6 ++--- .../InstanceMethodSelfAsFirstCheckTest.java | 6 ++--- .../checks/InvalidOpenModeCheckTest.java | 6 ++--- .../checks/InvariantReturnCheckTest.java | 6 ++--- .../python/checks/IsCloseAbsTolCheckTest.java | 6 ++--- .../checks/ItemOperationsTypeCheckTest.java | 6 ++--- .../checks/IterMethodReturnTypeCheckTest.java | 6 ++--- .../IterationOnNonIterableCheckTest.java | 6 ++--- .../python/checks/JumpInFinallyCheckTest.java | 6 ++--- .../checks/JwtVerificationCheckTest.java | 6 ++--- .../checks/LambdaAssignmentCheckTest.java | 6 ++--- .../checks/LdapAuthenticationCheckTest.java | 6 ++--- .../python/checks/LineLengthCheckTest.java | 6 ++--- ...leAndParameterNameConventionCheckTest.java | 6 ++--- ...egerWithLowercaseSuffixUsageCheckTest.java | 6 ++--- .../LoopExecutingAtMostOnceCheckTest.java | 6 ++--- .../LoopOverDictKeyValuesCheckTest.java | 6 ++--- ...oryFunctionParameterTypeHintCheckTest.java | 6 ++--- ...datoryFunctionReturnTypeHintCheckTest.java | 6 ++--- .../MembershipTestSupportCheckTest.java | 6 ++--- .../python/checks/MethodNameCheckTest.java | 6 ++--- .../checks/MethodShouldBeStaticCheckTest.java | 6 ++--- .../checks/MissingDocstringCheckTest.java | 6 ++--- .../MissingHyperParameterCheckTest.java | 6 ++--- .../MissingNewlineAtEndOfFileCheckTest.java | 6 ++--- .../ModifiedParameterValueCheckTest.java | 6 ++--- .../python/checks/ModuleNameCheckTest.java | 6 ++--- .../checks/MutableDefaultValueCheckTest.java | 6 ++--- .../python/checks/NeedlessPassCheckTest.java | 6 ++--- .../NestedCollectionsCreationCheckTest.java | 6 ++--- .../NestedConditionalExpressionCheckTest.java | 6 ++--- .../NestedControlFlowDepthCheckTest.java | 6 ++--- .../NestedLoopVariableReuseCheckTest.java | 6 ++--- .../python/checks/NewStyleClassCheckTest.java | 6 ++--- .../NoPersonReferenceInTodoCheckTest.java | 6 ++--- .../python/checks/NoQaCommentCheckTest.java | 6 ++--- .../checks/NoReRaiseInExitCheckTest.java | 6 ++--- .../checks/NoSonarCommentCheckTest.java | 6 ++--- .../checks/NoSonarCommentFormatCheckTest.java | 6 ++--- .../checks/NonCallableCalledCheckTest.java | 6 ++--- .../NonSingletonTfVariableCheckTest.java | 6 ++--- .../NonStringInAllPropertyCheckTest.java | 6 ++--- ...NotImplementedBooleanContextCheckTest.java | 6 ++--- ...mentedErrorInOperatorMethodsCheckTest.java | 6 ++--- .../python/checks/NumpyIsNanCheckTest.java | 6 ++--- .../NumpyListOverGeneratorCheckTest.java | 6 ++--- .../checks/NumpyRandomStateCheckTest.java | 6 ++--- .../NumpyWeekMaskValidationCheckTest.java | 6 ++--- .../NumpyWhereOneConditionCheckTest.java | 6 ++--- .../checks/OneStatementPerLineCheckTest.java | 6 ++--- .../checks/OpenSourceCheckListTest.java | 6 ++--- .../OverwrittenCollectionEntryCheckTest.java | 6 ++--- .../PandasAddMergeParametersCheckTest.java | 6 ++--- .../PandasChainInstructionCheckTest.java | 6 ++--- .../PandasDataFrameToNumpyCheckTest.java | 6 ++--- .../checks/PandasModifyInPlaceCheckTest.java | 6 ++--- .../checks/PandasReadNoDataTypeCheckTest.java | 6 ++--- .../PandasToDatetimeFormatCheckTest.java | 6 ++--- .../python/checks/ParsingErrorCheckTest.java | 6 ++--- .../PreIncrementDecrementCheckTest.java | 6 ++--- .../checks/PredictableSaltCheckTest.java | 6 ++--- .../checks/PrintStatementUsageCheckTest.java | 6 ++--- ...opertyAccessorParameterCountCheckTest.java | 6 ++--- .../PyTorchDataLoaderNumWorkersCheckTest.java | 6 ++--- ...PydanticOptionalFieldDefaultCheckTest.java | 6 ++--- ...imeZoneInDatetimeConstructorCheckTest.java | 6 ++--- .../python/checks/PytzUsageCheckTest.java | 6 ++--- .../checks/RaiseOutsideExceptCheckTest.java | 6 ++--- .../python/checks/RandomSeedCheckTest.java | 6 ++--- .../python/checks/RedundantJumpCheckTest.java | 6 ++--- .../ReferencedBeforeAssignmentCheckTest.java | 6 ++--- .../ReturnAndYieldInOneFunctionCheckTest.java | 6 ++--- .../ReturnYieldOutsideFunctionCheckTest.java | 6 ++--- ...onConstructorAsComprehensionCheckTest.java | 6 ++--- .../RobustCipherAlgorithmCheckTest.java | 6 ++--- .../RouterPrefixInIncludeRouterCheckTest.java | 6 ++--- .../python/checks/SameBranchCheckTest.java | 6 ++--- .../python/checks/SameConditionCheckTest.java | 6 ++--- ...cureModeEncryptionAlgorithmsCheckTest.java | 6 ++--- .../checks/SelfAssignmentCheckTest.java | 6 ++--- .../checks/SetDuplicateKeyCheckTest.java | 6 ++--- .../SideEffectInTfFunctionCheckTest.java | 6 ++--- .../python/checks/SillyEqualityCheckTest.java | 6 ++--- .../python/checks/SillyIdentityCheckTest.java | 6 ++--- ...ontInitializeEstimatedValuesCheckTest.java | 6 ++--- ...pelineDontAccessTransformersCheckTest.java | 6 ++--- ...nPipelineParameterAreCorrectCheckTest.java | 6 ++--- ...ipelineSpecifyMemoryArgumentCheckTest.java | 6 ++--- .../checks/SleepZeroInAsyncCheckTest.java | 6 ++--- .../checks/SlotsAssignmentCheckTest.java | 6 ++--- .../python/checks/SortedMinMaxCheckTest.java | 6 ++--- .../SpecialMethodParamListCheckTest.java | 6 ++--- .../SpecialMethodReturnTypeCheckTest.java | 6 ++--- .../StrftimeConfusingHourSystemCheckTest.java | 6 ++--- .../StringFormatCorrectnessCheckTest.java | 6 ++--- .../checks/StringFormatMisuseCheckTest.java | 6 ++--- .../StringLiteralDuplicationCheckTest.java | 6 ++--- ...hronousFileOperationsInAsyncCheckTest.java | 6 ++--- ...hronousHttpOperationsInAsyncCheckTest.java | 6 ++--- .../SynchronousOsCallsInAsyncCheckTest.java | 6 ++--- ...sSubprocessOperationsInAsyncCheckTest.java | 6 ++--- ...TaskGroupNurseryUsedOnlyOnceCheckTest.java | 6 ++--- .../checks/TempFileCreationCheckTest.java | 6 ++--- .../TemplateAndStrConcatenationCheckTest.java | 6 ++--- ...ingStructuralPatternMatchingCheckTest.java | 6 ++--- .../TestClientContentParameterCheckTest.java | 6 ++--- ...ctionDependOnOutsideVariableCheckTest.java | 6 ++--- .../TfFunctionRecursivityCheckTest.java | 6 ++--- ...herDeprecatedValidateIndicesCheckTest.java | 6 ++--- .../TfInputShapeOnModelSubclassCheckTest.java | 6 ++--- ...fPyTorchSpecifyReductionAxisCheckTest.java | 6 ++--- .../checks/TimeSleepInAsyncCheckTest.java | 6 ++--- ...oneNaiveDatetimeConstructorsCheckTest.java | 6 ++--- .../python/checks/ToDoCommentCheckTest.java | 6 ++--- .../checks/TooManyLinesInFileCheckTest.java | 6 ++--- .../TooManyLinesInFunctionCheckTest.java | 6 ++--- .../checks/TooManyParametersCheckTest.java | 6 ++--- .../checks/TooManyReturnsCheckTest.java | 6 ++--- ...ogradVariableShouldNotBeUsedCheckTest.java | 6 ++--- ...eadsToUntrustedCodeExecutionCheckTest.java | 6 ++--- ...eModeShouldBeSetAfterLoadingCheckTest.java | 6 ++--- .../TorchModuleShouldCallInitCheckTest.java | 6 ++--- .../checks/TrailingCommentCheckTest.java | 6 ++--- .../checks/TrailingWhitespaceCheckTest.java | 6 ++--- .../checks/TypeAliasAnnotationCheckTest.java | 6 ++--- ...VarCovariantAndContravariantCheckTest.java | 6 ++--- .../UndefinedNameAllPropertyCheckTest.java | 6 ++--- .../checks/UndefinedSymbolsCheckTest.java | 6 ++--- .../checks/UnionTypeExpressionCheckTest.java | 6 ++--- .../UnnecessaryComprehensionCheckTest.java | 6 ++--- .../UnnecessaryLambdaMapCallCheckTest.java | 6 ++--- .../checks/UnnecessaryListCastCheckTest.java | 6 ++--- ...aryListComprehensionArgumentCheckTest.java | 6 ++--- .../UnnecessaryReversedCallCheckTest.java | 6 ++--- .../UnnecessarySortInsideSetCheckTest.java | 6 ++--- ...UnnecessarySubscriptReversalCheckTest.java | 6 ++--- .../UnprocessedTemplateStringCheckTest.java | 6 ++--- .../checks/UnreachableExceptCheckTest.java | 6 ++--- .../UnreadPrivateAttributesCheckTest.java | 6 ++--- .../UnreadPrivateInnerClassesCheckTest.java | 6 ++--- .../checks/UnreadPrivateMethodsCheckTest.java | 6 ++--- .../UnusedFunctionParameterCheckTest.java | 6 ++--- .../python/checks/UnusedImportCheckTest.java | 6 ++--- .../checks/UnusedLocalVariableCheckTest.java | 6 ++--- .../UnusedNestedDefinitionCheckTest.java | 6 ++--- .../checks/UseOfAnyAsTypeHintCheckTest.java | 6 ++--- .../UseOfEmptyReturnValueCheckTest.java | 6 ++--- .../UseStartsWithEndsWithCheckTest.java | 6 ++--- ...elessParenthesisAfterKeywordCheckTest.java | 6 ++--- .../checks/UselessParenthesisCheckTest.java | 6 ++--- .../checks/UselessStatementCheckTest.java | 6 ++--- .../VerifiedSslTlsCertificateCheckTest.java | 6 ++--- .../checks/WeakSSLProtocolCheckTest.java | 6 ++--- .../WebEntryPointDecoratorCheckTest.java | 6 ++--- .../checks/WildcardImportCheckTest.java | 6 ++--- .../WrongAssignmentOperatorCheckTest.java | 6 ++--- .../XMLParserXXEVulnerableCheckTest.java | 6 ++--- .../cdk/ClearTextProtocolsCheckPartTest.java | 6 ++--- .../cdk/DisabledEFSEncryptionCheckTest.java | 6 ++--- .../DisabledESDomainEncryptionCheckTest.java | 6 ++--- .../cdk/DisabledRDSEncryptionCheckTest.java | 6 ++--- .../DisabledSNSTopicEncryptionCheckTest.java | 6 ++--- .../cdk/IamPolicyPublicAccessCheckTest.java | 6 ++--- .../cdk/IamPrivilegeEscalationCheckTest.java | 6 ++--- ...CallsWithoutTimeoutsInLambdaCheckTest.java | 6 ++--- .../checks/cdk/PrivilegePolicyCheckTest.java | 6 ++--- ...PublicApiIsSecuritySensitiveCheckTest.java | 6 ++--- ...etworkAccessToCloudResourcesCheckTest.java | 6 ++--- .../cdk/ResourceAccessPolicyCheckTest.java | 6 ++--- .../S3BucketBlockPublicAccessCheckTest.java | 6 ++--- .../cdk/S3BucketGrantedAccessCheckTest.java | 6 ++--- .../S3BucketHTTPCommunicationCheckTest.java | 6 ++--- .../S3BucketServerEncryptionCheckTest.java | 6 ++--- .../cdk/S3BucketVersioningCheckTest.java | 6 ++--- .../cdk/UnencryptedEbsVolumeCheckTest.java | 6 ++--- ...UnencryptedSageMakerNotebookCheckTest.java | 6 ++--- .../cdk/UnencryptedSqsQueueCheckTest.java | 6 ++--- .../UnrestrictedAdministrationCheckTest.java | 6 ++--- ...rictedOutboundCommunicationsCheckTest.java | 6 ++--- .../DjangoModelFormFieldsCheckTest.java | 6 ++--- .../django/DjangoModelStrMethodCheckTest.java | 6 ++--- .../DjangoModelStringFieldCheckTest.java | 6 ++--- .../hotspots/ClearTextProtocolsCheckTest.java | 6 ++--- .../hotspots/CommandLineArgsCheckTest.java | 6 ++--- .../hotspots/CommonValidationUtilsTest.java | 6 ++--- .../python/checks/hotspots/CorsCheckTest.java | 6 ++--- .../hotspots/CsrfDisabledCheckTest.java | 6 ++--- .../hotspots/DataEncryptionCheckTest.java | 6 ++--- .../checks/hotspots/DebugModeCheckTest.java | 6 ++--- .../DisabledHtmlAutoEscapeCheckTest.java | 6 ++--- ...DisabledHtmlAutoEscapeLegacyCheckTest.java | 6 ++--- .../DynamicCodeExecutionCheckTest.java | 6 ++--- .../hotspots/EmailSendingCheckTest.java | 6 ++--- .../hotspots/ExpandingArchiveCheckTest.java | 6 ++--- .../FastHashingOrPlainTextCheckTest.java | 6 ++--- .../GraphQLIntrospectionCheckTest.java | 6 ++--- .../HardCodedCredentialsCheckTest.java | 6 ++--- .../HardCodedCredentialsEntropyCheckTest.java | 6 ++--- .../checks/hotspots/HashingDataCheckTest.java | 6 ++--- .../hotspots/HttpOnlyCookieCheckTest.java | 6 ++--- .../LoggersConfigurationCheckTest.java | 6 ++--- ...andardCryptographicAlgorithmCheckTest.java | 6 ++--- .../checks/hotspots/OsExecCheckTest.java | 6 ++--- .../hotspots/ProcessSignallingCheckTest.java | 6 ++--- .../hotspots/PseudoRandomCheckTest.java | 6 ++--- .../PubliclyWritableDirectoriesCheckTest.java | 6 ++--- .../checks/hotspots/RegexCheckTest.java | 6 ++--- .../checks/hotspots/SQLQueriesCheckTest.java | 6 ++--- .../hotspots/SecureCookieCheckTest.java | 6 ++--- .../hotspots/StandardInputCheckTest.java | 6 ++--- .../StrongCryptographicKeysCheckTest.java | 6 ++--- .../hotspots/UnsafeHttpMethodsCheckTest.java | 6 ++--- .../hotspots/UnverifiedHostnameCheckTest.java | 6 ++--- .../XMLSignatureValidationCheckTest.java | 6 ++--- .../checks/regex/AbstractRegexCheckTest.java | 6 ++--- .../regex/AnchorPrecedenceCheckTest.java | 6 ++--- .../DuplicatesInCharacterClassCheckTest.java | 6 ++--- .../regex/EmptyAlternativeCheckTest.java | 6 ++--- .../checks/regex/EmptyGroupCheckTest.java | 6 ++--- .../regex/EmptyStringRepetitionCheckTest.java | 6 ++--- .../GraphemeClustersInClassesCheckTest.java | 6 ++--- .../regex/GroupReplacementCheckTest.java | 6 ++--- .../ImpossibleBackReferenceCheckTest.java | 6 ++--- .../regex/ImpossibleBoundariesCheckTest.java | 6 ++--- .../checks/regex/InvalidRegexCheckTest.java | 6 ++--- .../regex/MultipleWhitespaceCheckTest.java | 6 ++--- .../checks/regex/OctalEscapeCheckTest.java | 6 ++--- ...essiveQuantifierContinuationCheckTest.java | 6 ++--- .../python/checks/regex/RedosCheckTest.java | 6 ++--- .../RedundantRegexAlternativesCheckTest.java | 6 ++--- .../regex/RegexComplexityCheckTest.java | 6 ++--- .../checks/regex/RegexLookaheadCheckTest.java | 6 ++--- .../regex/ReluctantQuantifierCheckTest.java | 6 ++--- ...ntifierWithEmptyContinuationCheckTest.java | 6 ++--- .../SingleCharCharacterClassCheckTest.java | 6 ++--- .../SingleCharacterAlternationCheckTest.java | 6 ++--- .../checks/regex/StringReplaceCheckTest.java | 6 ++--- .../regex/SuperfluousCurlyBraceCheckTest.java | 6 ++--- ...nquantifiedNonCapturingGroupCheckTest.java | 6 ++--- .../regex/UnusedGroupNamesCheckTest.java | 6 ++--- .../checks/regex/VerboseRegexCheckTest.java | 6 ++--- .../tests/AssertAfterRaiseCheckTest.java | 6 ++--- .../AssertOnDissimilarTypesCheckTest.java | 6 ++--- .../tests/AssertOnTupleLiteralCheckTest.java | 6 ++--- .../tests/DedicatedAssertionCheckTest.java | 6 ++--- .../tests/ImplicitlySkippedTestCheckTest.java | 6 ++--- .../NotDiscoverableTestMethodCheckTest.java | 6 ++--- .../tests/SkippedTestNoReasonCheckTest.java | 6 ++--- .../UnconditionalAssertionCheckTest.java | 6 ++--- .../utils/AwsLambdaChecksUtilsTest.java | 6 ++--- .../python/checks/utils/CheckUtilsTest.java | 6 ++--- .../python/checks/utils/CodeTestUtils.java | 6 ++--- .../python/checks/utils/ExpressionsTest.java | 6 ++--- .../python/checks/utils/MarimoUtilsTest.java | 6 ++--- .../python/checks/utils/package-info.java | 6 ++--- .../plugins/python/AIQualityProfile.java | 6 ++--- .../python/AbstractPythonRuleRepository.java | 6 ++--- .../python/DependencyTelemetrySensor.java | 6 ++--- .../plugins/python/EmptyReportException.java | 6 ++--- .../plugins/python/ExternalIssuesSensor.java | 6 ++--- .../java/org/sonar/plugins/python/IPynb.java | 6 ++--- .../plugins/python/IPynbAIQualityProfile.java | 6 ++--- .../sonar/plugins/python/IPynbProfile.java | 6 ++--- .../plugins/python/IPynbRuleRepository.java | 6 ++--- .../org/sonar/plugins/python/IPynbSensor.java | 6 ++--- .../plugins/python/IssuesRepository.java | 6 ++--- .../plugins/python/MeasuresRepository.java | 6 ++--- .../python/MultiFileProgressReport.java | 6 ++--- .../plugins/python/NewSymbolsCollector.java | 6 ++--- .../java/org/sonar/plugins/python/Python.java | 6 ++--- .../sonar/plugins/python/PythonChecks.java | 6 ++--- .../plugins/python/PythonExtensionKeys.java | 6 ++--- .../plugins/python/PythonExtensions.java | 6 ++--- .../plugins/python/PythonHighlighter.java | 6 ++--- .../sonar/plugins/python/PythonProfile.java | 6 ++--- .../plugins/python/PythonReportSensor.java | 6 ++--- .../plugins/python/PythonRuleRepository.java | 6 ++--- .../sonar/plugins/python/PythonScanner.java | 6 ++--- .../sonar/plugins/python/PythonSensor.java | 6 ++--- .../org/sonar/plugins/python/Scanner.java | 6 ++--- .../plugins/python/TextReportReader.java | 6 ++--- .../ArchitectureCallbackWrapper.java | 6 ++--- .../DummyArchitectureCallback.java | 6 ++--- .../python/architecture/package-info.java | 6 ++--- .../python/bandit/BanditJsonReportReader.java | 6 ++--- .../python/bandit/BanditRulesDefinition.java | 6 ++--- .../plugins/python/bandit/BanditSensor.java | 6 ++--- .../plugins/python/bandit/package-info.java | 6 ++--- .../sonar/plugins/python/caching/Caching.java | 6 ++--- .../plugins/python/caching/package-info.java | 6 ++--- .../python/coverage/CoberturaParser.java | 6 ++--- .../python/coverage/PythonCoverageSensor.java | 6 ++--- .../plugins/python/coverage/package-info.java | 6 ++--- .../plugins/python/cpd/PythonCpdAnalyzer.java | 6 ++--- .../plugins/python/cpd/package-info.java | 6 ++--- .../dependency/DependencyPostProcessor.java | 6 ++--- .../dependency/DependencyTelemetry.java | 6 ++--- .../dependency/PyProjectTomlParser.java | 6 ++--- .../dependency/RequirementsTxtParser.java | 6 ++--- .../python/dependency/model/Dependencies.java | 6 ++--- .../python/dependency/model/Dependency.java | 6 ++--- .../python/dependency/model/package-info.java | 6 ++--- .../python/dependency/package-info.java | 6 ++--- .../OpenSourceRepositoryInfoProvider.java | 6 ++--- .../editions/RepositoryInfoProvider.java | 6 ++--- .../RepositoryInfoProviderWrapper.java | 6 ++--- .../plugins/python/editions/package-info.java | 6 ++--- .../python/flake8/Flake8RulesDefinition.java | 6 ++--- .../plugins/python/flake8/Flake8Sensor.java | 6 ++--- .../plugins/python/flake8/package-info.java | 6 ++--- .../python/indexer/ConfigSourceRoots.java | 6 ++--- .../indexer/NamespacePackageAnalyzer.java | 6 ++--- .../indexer/NamespacePackageTelemetry.java | 6 ++--- .../indexer/PackageResolutionResult.java | 6 ++--- .../python/indexer/PackageRootResolver.java | 6 ++--- .../plugins/python/indexer/ProjectTree.java | 6 ++--- .../python/indexer/ProjectTreeBuilder.java | 6 ++--- .../indexer/PyProjectExtractionResult.java | 6 ++--- .../indexer/PyProjectTomlSourceRoots.java | 6 ++--- .../plugins/python/indexer/PythonIndexer.java | 6 ++--- .../python/indexer/PythonIndexerWrapper.java | 6 ++--- .../python/indexer/SetupPySourceRoots.java | 6 ++--- .../indexer/SonarLintPythonIndexer.java | 6 ++--- .../indexer/SonarQubePythonIndexer.java | 6 ++--- .../plugins/python/indexer/package-info.java | 6 ++--- .../python/mypy/MypyRulesDefinition.java | 6 ++--- .../sonar/plugins/python/mypy/MypySensor.java | 6 ++--- .../plugins/python/mypy/package-info.java | 6 ++--- .../python/nosonar/NoSonarIssueFilter.java | 6 ++--- .../nosonar/NoSonarLineInfoCollector.java | 6 ++--- .../plugins/python/nosonar/package-info.java | 6 ++--- .../sonar/plugins/python/package-info.java | 6 ++--- .../plugins/python/parser/StaxParser.java | 6 ++--- .../plugins/python/parser/package-info.java | 6 ++--- .../python/pylint/PylintRulesDefinition.java | 6 ++--- .../plugins/python/pylint/PylintSensor.java | 6 ++--- .../plugins/python/pylint/package-info.java | 6 ++--- .../python/ruff/RuffJsonReportReader.java | 6 ++--- .../python/ruff/RuffRulesDefinition.java | 6 ++--- .../sonar/plugins/python/ruff/RuffSensor.java | 6 ++--- .../plugins/python/ruff/package-info.java | 6 ++--- .../telemetry/SensorTelemetryStorage.java | 6 ++--- .../python/telemetry/TelemetryMetricKey.java | 6 ++--- .../collectors/TestFileTelemetry.java | 6 ++--- .../TestFileTelemetryCollector.java | 6 ++--- .../collectors/TypeInferenceTelemetry.java | 6 ++--- .../TypeInferenceTelemetryCollector.java | 6 ++--- .../telemetry/collectors/package-info.java | 6 ++--- .../python/telemetry/package-info.java | 6 ++--- .../warnings/AnalysisWarningsWrapper.java | 6 ++--- .../plugins/python/warnings/package-info.java | 6 ++--- .../python/xunit/PythonXUnitSensor.java | 6 ++--- .../sonar/plugins/python/xunit/TestCase.java | 6 ++--- .../plugins/python/xunit/TestResult.java | 6 ++--- .../sonar/plugins/python/xunit/TestSuite.java | 6 ++--- .../plugins/python/xunit/TestSuiteParser.java | 6 ++--- .../plugins/python/xunit/package-info.java | 6 ++--- .../plugins/security/api/PythonRules.java | 6 ++--- .../api/ArchitecturePythonRules.java | 6 ++--- .../plugins/dbd/api/PythonRules.java | 6 ++--- .../plugins/python/AIQualityProfileTest.java | 6 ++--- .../AbstractPythonRuleRepositoryTest.java | 6 ++--- .../python/DependencyTelemetrySensorTest.java | 6 ++--- .../python/GeneratedIPythonFileTest.java | 6 ++--- .../python/IPynbAIQualityProfileTest.java | 6 ++--- .../plugins/python/IPynbProfileTest.java | 6 ++--- .../python/IPynbRuleRepositoryTest.java | 6 ++--- .../sonar/plugins/python/IPynbSensorTest.java | 6 ++--- .../org/sonar/plugins/python/IPynbTest.java | 6 ++--- .../IpynbNotebookParserScannerTest.java | 6 ++--- .../python/MeasuresRepositoryTest.java | 6 ++--- .../plugins/python/MockSonarLintIssue.java | 6 ++--- .../python/MultiFileProgressReportTest.java | 6 ++--- .../python/NewSymbolsCollectorTest.java | 6 ++--- .../python/NotebookParsingDataTest.java | 6 ++--- .../plugins/python/PythonExtensionsTest.java | 6 ++--- .../plugins/python/PythonHighlighterTest.java | 6 ++--- .../plugins/python/PythonProfileTest.java | 6 ++--- .../python/PythonRuleRepositoryTest.java | 6 ++--- .../plugins/python/PythonSensorTest.java | 6 ++--- .../org/sonar/plugins/python/PythonTest.java | 6 ++--- .../org/sonar/plugins/python/ScannerTest.java | 6 ++--- .../org/sonar/plugins/python/TestUtils.java | 6 ++--- .../ArchitectureUDGBuilderWrapperTest.java | 6 ++--- .../bandit/BanditRulesDefinitionTest.java | 6 ++--- .../python/bandit/BanditSensorTest.java | 6 ++--- .../plugins/python/caching/CachingTest.java | 6 ++--- .../plugins/python/caching/TestReadCache.java | 6 ++--- .../python/caching/TestWriteCache.java | 6 ++--- .../coverage/PythonCoverageSensorTest.java | 6 ++--- .../python/cpd/PythonCpdAnalyzerTest.java | 6 ++--- .../DependencyPostProcessorTest.java | 6 ++--- .../dependency/DependencyTelemetryTest.java | 6 ++--- .../dependency/PyProjectTomlParserTest.java | 6 ++--- .../dependency/RequirementsTxtParserTest.java | 6 ++--- .../dependency/model/DependencyTest.java | 6 ++--- .../OpenSourceRepositoryInfoProviderTest.java | 6 ++--- .../RepositoryInfoProviderWrapperTest.java | 6 ++--- .../flake8/Flake8RulesDefinitionTest.java | 6 ++--- .../python/flake8/Flake8SensorTest.java | 6 ++--- .../python/indexer/ConfigSourceRootsTest.java | 6 ++--- .../indexer/NamespacePackageAnalyzerTest.java | 6 ++--- .../indexer/PackageResolutionResultTest.java | 6 ++--- .../indexer/PackageRootResolverTest.java | 6 ++--- .../indexer/ProjectTreeBuilderTest.java | 6 ++--- .../indexer/PyProjectTomlSourceRootsTest.java | 6 ++--- .../python/indexer/PythonIndexerTest.java | 6 ++--- .../indexer/PythonIndexerWrapperTest.java | 6 ++--- .../indexer/SetupPySourceRootsTest.java | 6 ++--- .../indexer/SonarLintPythonIndexerTest.java | 6 ++--- .../indexer/SonarQubePythonIndexerTest.java | 6 ++--- .../python/indexer/TestModuleFileSystem.java | 6 ++--- .../python/mypy/MypyRulesDefinitionTest.java | 6 ++--- .../plugins/python/mypy/MypySensorTest.java | 6 ++--- .../nosonar/NoSonarIssueFilterTest.java | 6 ++--- .../nosonar/NoSonarLineInfoCollectorTest.java | 6 ++--- .../plugins/python/parser/StaxParserTest.java | 6 ++--- .../pylint/PylintRulesDefinitionTest.java | 6 ++--- .../python/pylint/PylintSensorTest.java | 6 ++--- .../python/ruff/RuffRulesDefinitionTest.java | 6 ++--- .../plugins/python/ruff/RuffSensorTest.java | 6 ++--- .../telemetry/SensorTelemetryStorageTest.java | 6 ++--- .../TestFileTelemetryCollectorTest.java | 6 ++--- .../collectors/TestFileTelemetryTest.java | 6 ++--- .../TypeInferenceTelemetryCollectorTest.java | 6 ++--- .../warnings/AnalysisWarningsWrapperTest.java | 6 ++--- .../python/xunit/PythonXUnitSensorTest.java | 6 ++--- .../plugins/python/xunit/TestCaseTest.java | 6 ++--- .../plugins/python/xunit/TestResultTest.java | 6 ++--- .../plugins/python/xunit/TestSuiteTest.java | 6 ++--- .../plugins/python/GeneratedIPythonFile.java | 6 ++--- .../plugins/python/IpynbNotebookParser.java | 6 ++--- .../plugins/python/NotebookParsingData.java | 6 ++--- .../plugins/python/NotebookTestUtils.java | 6 ++--- .../sonar/plugins/python/PythonInputFile.java | 6 ++--- .../plugins/python/PythonInputFileImpl.java | 6 ++--- .../plugins/python/SonarQubePythonFile.java | 6 ++--- .../plugins/python/api/DjangoViewInfo.java | 6 ++--- .../plugins/python/api/IssueLocation.java | 6 ++--- .../plugins/python/api/LocationInFile.java | 6 ++--- .../org/sonar/plugins/python/api/Parser.java | 6 ++--- .../python/api/ProjectPythonVersion.java | 6 ++--- .../sonar/plugins/python/api/PythonCheck.java | 6 ++--- .../api/PythonCustomRuleRepository.java | 6 ++--- .../PythonCustomRuleRepositoryWrapper.java | 6 ++--- .../sonar/plugins/python/api/PythonFile.java | 6 ++--- .../python/api/PythonFileConsumer.java | 6 ++--- .../python/api/PythonInputFileContext.java | 6 ++--- .../sonar/plugins/python/api/PythonLine.java | 6 ++--- .../python/api/PythonSubscriptionCheck.java | 6 ++--- .../python/api/PythonVersionUtils.java | 6 ++--- .../python/api/PythonVisitorCheck.java | 6 ++--- .../python/api/PythonVisitorContext.java | 6 ++--- .../plugins/python/api/SonarLintCache.java | 6 ++--- .../python/api/SonarLintCacheWrapper.java | 6 ++--- .../plugins/python/api/SubscriptionCheck.java | 6 ++--- .../python/api/SubscriptionContext.java | 6 ++--- .../plugins/python/api/TokenLocation.java | 6 ++--- .../org/sonar/plugins/python/api/TriBool.java | 6 ++--- .../python/api/caching/CacheContext.java | 6 ++--- .../python/api/caching/PythonReadCache.java | 6 ++--- .../python/api/caching/PythonWriteCache.java | 6 ++--- .../python/api/caching/package-info.java | 6 ++--- .../plugins/python/api/cfg/CfgBlock.java | 6 ++--- .../python/api/cfg/CfgBranchingBlock.java | 6 ++--- .../python/api/cfg/ControlFlowGraph.java | 6 ++--- .../plugins/python/api/cfg/package-info.java | 6 ++--- .../python/api/internal/EndOfAnalysis.java | 6 ++--- .../python/api/internal/package-info.java | 6 ++--- .../python/api/nosonar/NoSonarInfoParser.java | 6 ++--- .../python/api/nosonar/NoSonarLineInfo.java | 6 ++--- .../python/api/nosonar/package-info.java | 6 ++--- .../plugins/python/api/package-info.java | 6 ++--- .../configuration/AwsLambdaHandlerInfo.java | 6 ++--- .../AwsProjectConfiguration.java | 6 ++--- .../configuration/ProjectConfiguration.java | 6 ++--- .../project/configuration/package-info.java | 6 ++--- .../python/api/quickfix/PythonQuickFix.java | 6 ++--- .../python/api/quickfix/PythonTextEdit.java | 6 ++--- .../python/api/quickfix/package-info.java | 6 ++--- .../python/api/symbols/AmbiguousSymbol.java | 6 ++--- .../python/api/symbols/ClassSymbol.java | 6 ++--- .../python/api/symbols/FunctionSymbol.java | 6 ++--- .../plugins/python/api/symbols/Symbol.java | 6 ++--- .../plugins/python/api/symbols/Usage.java | 6 ++--- .../python/api/symbols/package-info.java | 6 ++--- .../python/api/symbols/v2/SymbolV2.java | 6 ++--- .../python/api/symbols/v2/UsageV2.java | 6 ++--- .../python/api/symbols/v2/package-info.java | 6 ++--- .../plugins/python/api/tree/AliasedName.java | 6 ++--- .../python/api/tree/AnnotatedAssignment.java | 6 ++--- .../plugins/python/api/tree/AnyParameter.java | 6 ++--- .../plugins/python/api/tree/ArgList.java | 6 ++--- .../plugins/python/api/tree/Argument.java | 6 ++--- .../plugins/python/api/tree/AsPattern.java | 6 ++--- .../python/api/tree/AssertStatement.java | 6 ++--- .../python/api/tree/AssignmentExpression.java | 6 ++--- .../python/api/tree/AssignmentStatement.java | 6 ++--- .../python/api/tree/AwaitExpression.java | 6 ++--- .../python/api/tree/BaseTreeVisitor.java | 6 ++--- .../python/api/tree/BinaryExpression.java | 6 ++--- .../python/api/tree/BreakStatement.java | 6 ++--- .../python/api/tree/CallExpression.java | 6 ++--- .../python/api/tree/CapturePattern.java | 6 ++--- .../plugins/python/api/tree/CaseBlock.java | 6 ++--- .../python/api/tree/CellMagicStatement.java | 6 ++--- .../plugins/python/api/tree/ClassDef.java | 6 ++--- .../plugins/python/api/tree/ClassPattern.java | 6 ++--- .../api/tree/CompoundAssignmentStatement.java | 6 ++--- .../python/api/tree/ComprehensionClause.java | 6 ++--- .../api/tree/ComprehensionExpression.java | 6 ++--- .../python/api/tree/ComprehensionFor.java | 6 ++--- .../python/api/tree/ComprehensionIf.java | 6 ++--- .../api/tree/ConditionalExpression.java | 6 ++--- .../python/api/tree/ContinueStatement.java | 6 ++--- .../plugins/python/api/tree/Decorator.java | 6 ++--- .../plugins/python/api/tree/DelStatement.java | 6 ++--- .../python/api/tree/DictCompExpression.java | 6 ++--- .../python/api/tree/DictionaryLiteral.java | 6 ++--- .../api/tree/DictionaryLiteralElement.java | 6 ++--- .../plugins/python/api/tree/DottedName.java | 6 ++--- .../python/api/tree/DoubleStarPattern.java | 6 ++--- .../api/tree/DynamicObjectInfoStatement.java | 6 ++--- .../python/api/tree/EllipsisExpression.java | 6 ++--- .../plugins/python/api/tree/ElseClause.java | 6 ++--- .../plugins/python/api/tree/ExceptClause.java | 6 ++--- .../python/api/tree/ExecStatement.java | 6 ++--- .../plugins/python/api/tree/Expression.java | 6 ++--- .../python/api/tree/ExpressionList.java | 6 ++--- .../python/api/tree/ExpressionStatement.java | 6 ++--- .../plugins/python/api/tree/FileInput.java | 6 ++--- .../python/api/tree/FinallyClause.java | 6 ++--- .../plugins/python/api/tree/ForStatement.java | 6 ++--- .../python/api/tree/FormatSpecifier.java | 6 ++--- .../python/api/tree/FormattedExpression.java | 6 ++--- .../plugins/python/api/tree/FunctionDef.java | 6 ++--- .../plugins/python/api/tree/FunctionLike.java | 6 ++--- .../python/api/tree/GlobalStatement.java | 6 ++--- .../plugins/python/api/tree/GroupPattern.java | 6 ++--- .../sonar/plugins/python/api/tree/Guard.java | 6 ++--- .../plugins/python/api/tree/HasSymbol.java | 6 ++--- .../plugins/python/api/tree/IfStatement.java | 6 ++--- .../plugins/python/api/tree/ImportFrom.java | 6 ++--- .../plugins/python/api/tree/ImportName.java | 6 ++--- .../python/api/tree/ImportStatement.java | 6 ++--- .../plugins/python/api/tree/InExpression.java | 6 ++--- .../plugins/python/api/tree/IsExpression.java | 6 ++--- .../plugins/python/api/tree/KeyValuePair.java | 6 ++--- .../python/api/tree/KeyValuePattern.java | 6 ++--- .../python/api/tree/KeywordPattern.java | 6 ++--- .../python/api/tree/LambdaExpression.java | 6 ++--- .../plugins/python/api/tree/LineMagic.java | 6 ++--- .../plugins/python/api/tree/ListLiteral.java | 6 ++--- .../python/api/tree/LiteralPattern.java | 6 ++--- .../python/api/tree/MappingPattern.java | 6 ++--- .../python/api/tree/MatchStatement.java | 6 ++--- .../sonar/plugins/python/api/tree/Name.java | 6 ++--- .../python/api/tree/NoneExpression.java | 6 ++--- .../python/api/tree/NonlocalStatement.java | 6 ++--- .../python/api/tree/NumericLiteral.java | 6 ++--- .../plugins/python/api/tree/OrPattern.java | 6 ++--- .../plugins/python/api/tree/Parameter.java | 6 ++--- .../python/api/tree/ParameterList.java | 6 ++--- .../api/tree/ParenthesizedExpression.java | 6 ++--- .../python/api/tree/PassStatement.java | 6 ++--- .../plugins/python/api/tree/Pattern.java | 6 ++--- .../python/api/tree/PrintStatement.java | 6 ++--- .../python/api/tree/QualifiedExpression.java | 6 ++--- .../python/api/tree/RaiseStatement.java | 6 ++--- .../python/api/tree/RegularArgument.java | 6 ++--- .../python/api/tree/ReprExpression.java | 6 ++--- .../python/api/tree/ReturnStatement.java | 6 ++--- .../python/api/tree/SequencePattern.java | 6 ++--- .../plugins/python/api/tree/SetLiteral.java | 6 ++--- .../python/api/tree/SliceExpression.java | 6 ++--- .../plugins/python/api/tree/SliceItem.java | 6 ++--- .../plugins/python/api/tree/SliceList.java | 6 ++--- .../plugins/python/api/tree/StarPattern.java | 6 ++--- .../plugins/python/api/tree/Statement.java | 6 ++--- .../python/api/tree/StatementList.java | 6 ++--- .../python/api/tree/StringElement.java | 6 ++--- .../python/api/tree/StringLiteral.java | 6 ++--- .../api/tree/SubscriptionExpression.java | 6 ++--- .../sonar/plugins/python/api/tree/Token.java | 6 ++--- .../sonar/plugins/python/api/tree/Tree.java | 6 ++--- .../plugins/python/api/tree/TreeVisitor.java | 6 ++--- .../sonar/plugins/python/api/tree/Trivia.java | 6 ++--- .../plugins/python/api/tree/TryStatement.java | 6 ++--- .../sonar/plugins/python/api/tree/Tuple.java | 6 ++--- .../python/api/tree/TupleParameter.java | 6 ++--- .../python/api/tree/TypeAliasStatement.java | 6 ++--- .../python/api/tree/TypeAnnotation.java | 6 ++--- .../plugins/python/api/tree/TypeParam.java | 6 ++--- .../plugins/python/api/tree/TypeParams.java | 6 ++--- .../python/api/tree/UnaryExpression.java | 6 ++--- .../python/api/tree/UnpackingExpression.java | 6 ++--- .../plugins/python/api/tree/ValuePattern.java | 6 ++--- .../python/api/tree/WhileStatement.java | 6 ++--- .../python/api/tree/WildcardPattern.java | 6 ++--- .../plugins/python/api/tree/WithItem.java | 6 ++--- .../python/api/tree/WithStatement.java | 6 ++--- .../python/api/tree/YieldExpression.java | 6 ++--- .../python/api/tree/YieldStatement.java | 6 ++--- .../plugins/python/api/tree/package-info.java | 6 ++--- .../python/api/types/BuiltinTypes.java | 6 ++--- .../python/api/types/InferredType.java | 6 ++--- .../python/api/types/package-info.java | 6 ++--- .../python/api/types/v2/ClassType.java | 6 ++--- .../types/v2/FullyQualifiedNameHelper.java | 6 ++--- .../python/api/types/v2/FunctionType.java | 6 ++--- .../plugins/python/api/types/v2/Member.java | 6 ++--- .../python/api/types/v2/ModuleType.java | 6 ++--- .../python/api/types/v2/ObjectType.java | 6 ++--- .../python/api/types/v2/ParameterV2.java | 6 ++--- .../python/api/types/v2/PythonType.java | 6 ++--- .../plugins/python/api/types/v2/SelfType.java | 6 ++--- .../python/api/types/v2/TypeOrigin.java | 6 ++--- .../python/api/types/v2/TypeSource.java | 6 ++--- .../python/api/types/v2/TypeWrapper.java | 6 ++--- .../python/api/types/v2/UnionType.java | 6 ++--- .../python/api/types/v2/UnknownType.java | 25 +++---------------- .../api/types/v2/matchers/TypeMatcher.java | 6 ++--- .../types/v2/matchers/TypeMatcherUtils.java | 6 ++--- .../api/types/v2/matchers/TypeMatchers.java | 6 ++--- .../api/types/v2/matchers/package-info.java | 6 ++--- .../python/api/types/v2/package-info.java | 6 ++--- .../sonar/plugins/python/package-info.java | 6 ++--- .../org/sonar/python/DocstringExtractor.java | 6 ++--- .../sonar/python/EscapeCharPositionInfo.java | 6 ++--- .../org/sonar/python/IPythonLocation.java | 6 ++--- .../org/sonar/python/PythonConfiguration.java | 6 ++--- .../org/sonar/python/SubscriptionVisitor.java | 6 ++--- .../sonar/python/TestPythonVisitorRunner.java | 6 ++--- .../org/sonar/python/api/IPythonGrammar.java | 6 ++--- .../python/api/IPythonGrammarBuilder.java | 6 ++--- .../org/sonar/python/api/PythonGrammar.java | 6 ++--- .../python/api/PythonGrammarBuilder.java | 6 ++--- .../org/sonar/python/api/PythonKeyword.java | 6 ++--- .../sonar/python/api/PythonPunctuator.java | 6 ++--- .../org/sonar/python/api/PythonTokenType.java | 6 ++--- .../org/sonar/python/api/package-info.java | 6 ++--- .../python/caching/CacheContextImpl.java | 6 ++--- .../sonar/python/caching/CpdSerializer.java | 6 ++--- .../org/sonar/python/caching/DummyCache.java | 6 ++--- .../python/caching/PythonReadCacheImpl.java | 6 ++--- .../python/caching/PythonWriteCacheImpl.java | 6 ++--- .../org/sonar/python/caching/StringTable.java | 6 ++--- .../python/caching/VarLengthInputStream.java | 6 ++--- .../python/caching/VarLengthOutputStream.java | 6 ++--- .../sonar/python/caching/package-info.java | 6 ++--- .../java/org/sonar/python/cfg/CfgUtils.java | 6 ++--- .../python/cfg/ControlFlowGraphBuilder.java | 6 ++--- .../org/sonar/python/cfg/PythonCfgBlock.java | 6 ++--- .../python/cfg/PythonCfgBranchingBlock.java | 6 ++--- .../sonar/python/cfg/PythonCfgEndBlock.java | 6 ++--- .../python/cfg/PythonCfgSimpleBlock.java | 6 ++--- .../python/cfg/fixpoint/CfgBlockState.java | 6 ++--- .../fixpoint/DefinedVariablesAnalysis.java | 6 ++--- .../python/cfg/fixpoint/ForwardAnalysis.java | 6 ++--- .../cfg/fixpoint/LiveVariablesAnalysis.java | 6 ++--- .../python/cfg/fixpoint/ProgramState.java | 6 ++--- .../fixpoint/ReachingDefinitionsAnalysis.java | 6 ++--- .../python/cfg/fixpoint/ReadWriteVisitor.java | 6 ++--- .../python/cfg/fixpoint/package-info.java | 6 ++--- .../org/sonar/python/cfg/package-info.java | 6 ++--- .../sonar/python/index/AliasDescriptor.java | 6 ++--- .../python/index/AmbiguousDescriptor.java | 6 ++--- .../sonar/python/index/ClassDescriptor.java | 6 ++--- .../org/sonar/python/index/Descriptor.java | 6 ++--- .../sonar/python/index/DescriptorUtils.java | 6 ++--- .../python/index/DescriptorsToProtobuf.java | 6 ++--- .../python/index/FunctionDescriptor.java | 6 ++--- .../sonar/python/index/ModuleDescriptor.java | 6 ++--- .../index/TypeAnnotationDescriptor.java | 6 ++--- .../python/index/VariableDescriptor.java | 6 ++--- .../org/sonar/python/index/package-info.java | 6 ++--- .../lexer/FStringAndTStringChannel.java | 6 ++--- .../org/sonar/python/lexer/FStringState.java | 6 ++--- .../lexer/IPynbCellDelimiterChannel.java | 6 ++--- .../python/lexer/IndentationChannel.java | 6 ++--- .../org/sonar/python/lexer/LexerState.java | 6 ++--- .../sonar/python/lexer/NewLineChannel.java | 6 ++--- .../org/sonar/python/lexer/PythonLexer.java | 6 ++--- .../python/lexer/StringLiteralsChannel.java | 6 ++--- .../org/sonar/python/lexer/package-info.java | 6 ++--- .../metrics/CognitiveComplexityVisitor.java | 6 ++--- .../python/metrics/ComplexityVisitor.java | 6 ++--- .../python/metrics/FileLinesVisitor.java | 6 ++--- .../org/sonar/python/metrics/FileMetrics.java | 6 ++--- .../sonar/python/metrics/package-info.java | 6 ++--- .../java/org/sonar/python/package-info.java | 6 ++--- .../org/sonar/python/parser/PythonParser.java | 6 ++--- .../org/sonar/python/parser/package-info.java | 6 ++--- .../config/ProjectConfigurationBuilder.java | 6 ++--- ...natureBasedAwsLambdaHandlersCollector.java | 6 ++--- .../python/project/config/package-info.java | 6 ++--- .../sonar/python/quickfix/TextEditUtils.java | 6 ++--- .../sonar/python/quickfix/package-info.java | 6 ++--- .../regex/PythonAnalyzerRegexSource.java | 6 ++--- .../regex/PythonRegexIssueLocation.java | 6 ++--- .../regex/PythonStringCharacterParser.java | 6 ++--- .../org/sonar/python/regex/RegexContext.java | 6 ++--- .../org/sonar/python/regex/package-info.java | 6 ++--- .../python/semantic/AmbiguousSymbolImpl.java | 6 ++--- .../sonar/python/semantic/BuiltinSymbols.java | 6 ++--- .../python/semantic/ClassSymbolImpl.java | 6 ++--- .../python/semantic/DependencyGraph.java | 6 ++--- .../python/semantic/FunctionSymbolImpl.java | 6 ++--- .../semantic/ProjectLevelSymbolTable.java | 6 ++--- .../java/org/sonar/python/semantic/Scope.java | 6 ++--- .../sonar/python/semantic/SelfSymbolImpl.java | 6 ++--- .../org/sonar/python/semantic/SymbolImpl.java | 6 ++--- .../python/semantic/SymbolTableBuilder.java | 6 ++--- .../sonar/python/semantic/SymbolUtils.java | 6 ++--- .../org/sonar/python/semantic/UsageImpl.java | 6 ++--- .../sonar/python/semantic/package-info.java | 6 ++--- .../python/semantic/v2/ClassTypeBuilder.java | 6 ++--- .../semantic/v2/FunctionTypeBuilder.java | 6 ++--- .../python/semantic/v2/LazyTypesContext.java | 6 ++--- .../python/semantic/v2/ReadUsagesVisitor.java | 6 ++--- .../org/sonar/python/semantic/v2/ScopeV2.java | 6 ++--- .../python/semantic/v2/ScopeVisitor.java | 6 ++--- .../sonar/python/semantic/v2/SymbolTable.java | 6 ++--- .../semantic/v2/SymbolTableBuilderV2.java | 6 ++--- .../python/semantic/v2/SymbolV2Impl.java | 6 ++--- .../python/semantic/v2/SymbolV2Utils.java | 6 ++--- .../v2/SymbolsModuleTypeProvider.java | 6 ++--- .../sonar/python/semantic/v2/TypeBuilder.java | 6 ++--- .../python/semantic/v2/TypeInferenceV2.java | 6 ++--- .../sonar/python/semantic/v2/UsageV2Impl.java | 6 ++--- .../semantic/v2/WriteUsagesVisitor.java | 6 ++--- .../semantic/v2/callgraph/CallGraph.java | 6 ++--- .../v2/callgraph/CallGraphCollector.java | 6 ++--- .../v2/callgraph/CallGraphIterable.java | 6 ++--- .../semantic/v2/callgraph/CallGraphNode.java | 6 ++--- .../v2/callgraph/CallGraphWalker.java | 6 ++--- .../semantic/v2/callgraph/package-info.java | 6 ++--- .../AliasDescriptorToPythonTypeConverter.java | 6 ++--- ...iguousDescriptorToPythonTypeConverter.java | 6 ++--- .../AnyDescriptorToPythonTypeConverter.java | 6 ++--- .../ClassDescriptorToPythonTypeConverter.java | 6 ++--- .../v2/converter/ConversionContext.java | 6 ++--- .../DescriptorToPythonTypeConverter.java | 6 ++--- ...nctionDescriptorToPythonTypeConverter.java | 6 ++--- .../v2/converter/ParameterConverter.java | 6 ++--- .../PythonTypeToDescriptorConverter.java | 6 ++--- .../TypeAnnotationToPythonTypeConverter.java | 6 ++--- ...nknownDescriptorToPythonTypeConverter.java | 6 ++--- ...riableDescriptorToPythonTypeConverter.java | 6 ++--- .../semantic/v2/converter/package-info.java | 6 ++--- .../v2/dynamicstubs/DynamicStubsProvider.java | 6 ++--- .../v2/dynamicstubs/package-info.java | 6 ++--- .../python/semantic/v2/package-info.java | 6 ++--- .../python/semantic/v2/types/Assignment.java | 6 ++--- .../v2/types/AstBasedTypeInference.java | 6 ++--- .../python/semantic/v2/types/Definition.java | 6 ++--- .../v2/types/FlowSensitiveTypeInference.java | 6 ++--- .../semantic/v2/types/IsInstanceVisitor.java | 6 ++--- .../semantic/v2/types/LoopAssignment.java | 6 ++--- .../v2/types/ParameterDefinition.java | 6 ++--- .../ProgramStateTypeInferenceVisitor.java | 6 ++--- .../python/semantic/v2/types/Propagation.java | 6 ++--- .../semantic/v2/types/PropagationVisitor.java | 6 ++--- .../v2/types/TrivialTypeInferenceVisitor.java | 6 ++--- .../types/TrivialTypePropagationVisitor.java | 6 ++--- .../v2/types/TryStatementVisitor.java | 6 ++--- .../v2/types/TypeDependenciesCalculator.java | 6 ++--- .../v2/types/TypeInferenceMatcher.java | 6 ++--- .../v2/types/TypeInferenceMatchers.java | 6 ++--- .../v2/types/TypeInferenceProgramState.java | 6 ++--- .../semantic/v2/types/package-info.java | 6 ++--- .../typecalculator/AwaitedTypeCalculator.java | 6 ++--- .../CallReturnTypeCalculator.java | 6 ++--- .../QualifiedExpressionCalculator.java | 6 ++--- .../v2/types/typecalculator/package-info.java | 6 ++--- .../ClassSymbolToDescriptorConverter.java | 6 ++--- .../FunctionSymbolToDescriptorConverter.java | 6 ++--- .../ModuleSymbolToDescriptorConverter.java | 6 ++--- ...edFunctionSymbolToDescriptorConverter.java | 6 ++--- .../ParameterSymbolToDescriptorConverter.java | 6 ++--- .../semantic/v2/typeshed/ProtoUtils.java | 6 ++--- .../v2/typeshed/TypeShedConstants.java | 6 ++--- .../typeshed/TypeShedDescriptorsProvider.java | 6 ++--- .../semantic/v2/typeshed/TypeShedUtils.java | 6 ++--- .../TypeSymbolToDescriptorConverter.java | 6 ++--- .../VarSymbolToDescriptorConverter.java | 6 ++--- .../semantic/v2/typeshed/package-info.java | 6 ++--- .../semantic/v2/typetable/BasicTypeTable.java | 6 ++--- .../v2/typetable/CachedTypeTable.java | 6 ++--- .../v2/typetable/ProjectLevelTypeTable.java | 6 ++--- .../semantic/v2/typetable/TypeTable.java | 6 ++--- .../semantic/v2/typetable/package-info.java | 6 ++--- .../org/sonar/python/tests/UnittestUtils.java | 6 ++--- .../org/sonar/python/tests/package-info.java | 6 ++--- .../sonar/python/tree/AliasedNameImpl.java | 6 ++--- .../python/tree/AnnotatedAssignmentImpl.java | 6 ++--- .../org/sonar/python/tree/ArgListImpl.java | 6 ++--- .../org/sonar/python/tree/AsPatternImpl.java | 6 ++--- .../python/tree/AssertStatementImpl.java | 6 ++--- .../python/tree/AssignmentExpressionImpl.java | 6 ++--- .../python/tree/AssignmentStatementImpl.java | 6 ++--- .../python/tree/AwaitExpressionImpl.java | 6 ++--- .../python/tree/BinaryExpressionImpl.java | 6 ++--- .../sonar/python/tree/BreakStatementImpl.java | 6 ++--- .../sonar/python/tree/CallExpressionImpl.java | 6 ++--- .../sonar/python/tree/CapturePatternImpl.java | 6 ++--- .../org/sonar/python/tree/CaseBlockImpl.java | 6 ++--- .../python/tree/CellMagicStatementImpl.java | 6 ++--- .../org/sonar/python/tree/ClassDefImpl.java | 6 ++--- .../sonar/python/tree/ClassPatternImpl.java | 6 ++--- .../tree/CompoundAssignmentStatementImpl.java | 6 ++--- .../tree/ComprehensionExpressionImpl.java | 6 ++--- .../python/tree/ComprehensionForImpl.java | 6 ++--- .../python/tree/ComprehensionIfImpl.java | 6 ++--- .../tree/ConditionalExpressionImpl.java | 6 ++--- .../python/tree/ContinueStatementImpl.java | 6 ++--- .../org/sonar/python/tree/DecoratorImpl.java | 6 ++--- .../sonar/python/tree/DelStatementImpl.java | 6 ++--- .../python/tree/DictCompExpressionImpl.java | 6 ++--- .../python/tree/DictOrSetLiteralImpl.java | 6 ++--- .../python/tree/DictionaryLiteralImpl.java | 6 ++--- .../org/sonar/python/tree/DottedNameImpl.java | 6 ++--- .../python/tree/DoubleStarPatternImpl.java | 6 ++--- .../tree/DynamicObjectInfoStatementImpl.java | 6 ++--- .../python/tree/EllipsisExpressionImpl.java | 6 ++--- .../org/sonar/python/tree/ElseClauseImpl.java | 6 ++--- .../sonar/python/tree/ExceptClauseImpl.java | 6 ++--- .../ExceptGroupJumpInstructionsCheck.java | 6 ++--- .../sonar/python/tree/ExecStatementImpl.java | 6 ++--- .../sonar/python/tree/ExpressionListImpl.java | 6 ++--- .../python/tree/ExpressionStatementImpl.java | 6 ++--- .../org/sonar/python/tree/FileInputImpl.java | 6 ++--- .../sonar/python/tree/FinallyClauseImpl.java | 6 ++--- .../sonar/python/tree/ForStatementImpl.java | 6 ++--- .../python/tree/FormatSpecifierImpl.java | 6 ++--- .../python/tree/FormattedExpressionImpl.java | 6 ++--- .../sonar/python/tree/FunctionDefImpl.java | 6 ++--- .../python/tree/GlobalStatementImpl.java | 6 ++--- .../sonar/python/tree/GroupPatternImpl.java | 6 ++--- .../java/org/sonar/python/tree/GuardImpl.java | 6 ++--- .../sonar/python/tree/IPythonTreeMaker.java | 6 ++--- .../sonar/python/tree/IfStatementImpl.java | 6 ++--- .../org/sonar/python/tree/ImportFromImpl.java | 6 ++--- .../org/sonar/python/tree/ImportNameImpl.java | 6 ++--- .../sonar/python/tree/InExpressionImpl.java | 6 ++--- .../sonar/python/tree/IsExpressionImpl.java | 6 ++--- .../sonar/python/tree/KeyValuePairImpl.java | 6 ++--- .../python/tree/KeyValuePatternImpl.java | 6 ++--- .../sonar/python/tree/KeywordPatternImpl.java | 6 ++--- .../python/tree/LambdaExpressionImpl.java | 6 ++--- .../org/sonar/python/tree/LineMagicImpl.java | 6 ++--- .../sonar/python/tree/ListLiteralImpl.java | 6 ++--- .../sonar/python/tree/LiteralPatternImpl.java | 6 ++--- .../sonar/python/tree/MappingPatternImpl.java | 6 ++--- .../sonar/python/tree/MatchStatementImpl.java | 6 ++--- .../java/org/sonar/python/tree/NameImpl.java | 6 ++--- .../sonar/python/tree/NoneExpressionImpl.java | 6 ++--- .../python/tree/NonlocalStatementImpl.java | 6 ++--- .../sonar/python/tree/NumericLiteralImpl.java | 6 ++--- .../org/sonar/python/tree/OrPatternImpl.java | 6 ++--- .../org/sonar/python/tree/ParameterImpl.java | 6 ++--- .../sonar/python/tree/ParameterListImpl.java | 6 ++--- .../tree/ParenthesizedExpressionImpl.java | 6 ++--- .../sonar/python/tree/PassStatementImpl.java | 6 ++--- .../sonar/python/tree/PrintStatementImpl.java | 6 ++--- .../java/org/sonar/python/tree/PyTree.java | 6 ++--- .../sonar/python/tree/PythonTreeMaker.java | 6 ++--- .../python/tree/PythonTreeMakerUtils.java | 6 ++--- .../python/tree/QualifiedExpressionImpl.java | 6 ++--- .../sonar/python/tree/RaiseStatementImpl.java | 6 ++--- .../python/tree/RegularArgumentImpl.java | 6 ++--- .../sonar/python/tree/ReprExpressionImpl.java | 6 ++--- .../python/tree/ReturnStatementImpl.java | 6 ++--- .../org/sonar/python/tree/Separators.java | 6 ++--- .../python/tree/SequencePatternImpl.java | 6 ++--- .../org/sonar/python/tree/SetLiteralImpl.java | 6 ++--- .../sonar/python/tree/SimpleStatement.java | 6 ++--- .../python/tree/SliceExpressionImpl.java | 6 ++--- .../org/sonar/python/tree/SliceItemImpl.java | 6 ++--- .../org/sonar/python/tree/SliceListImpl.java | 6 ++--- .../sonar/python/tree/StarPatternImpl.java | 6 ++--- .../sonar/python/tree/StatementListImpl.java | 6 ++--- .../python/tree/StatementWithSeparator.java | 6 ++--- .../sonar/python/tree/StringElementImpl.java | 6 ++--- .../sonar/python/tree/StringLiteralImpl.java | 6 ++--- .../tree/SubscriptionExpressionImpl.java | 6 ++--- .../org/sonar/python/tree/TokenEnricher.java | 6 ++--- .../java/org/sonar/python/tree/TokenImpl.java | 6 ++--- .../java/org/sonar/python/tree/TreeUtils.java | 6 ++--- .../org/sonar/python/tree/TriviaImpl.java | 6 ++--- .../sonar/python/tree/TryStatementImpl.java | 6 ++--- .../java/org/sonar/python/tree/TupleImpl.java | 6 ++--- .../sonar/python/tree/TupleParameterImpl.java | 6 ++--- .../python/tree/TypeAliasStatementImpl.java | 6 ++--- .../sonar/python/tree/TypeAnnotationImpl.java | 6 ++--- .../org/sonar/python/tree/TypeParamImpl.java | 6 ++--- .../org/sonar/python/tree/TypeParamsImpl.java | 6 ++--- .../python/tree/UnaryExpressionImpl.java | 6 ++--- .../python/tree/UnpackingExpressionImpl.java | 6 ++--- .../sonar/python/tree/ValuePatternImpl.java | 6 ++--- .../sonar/python/tree/WhileStatementImpl.java | 6 ++--- .../python/tree/WildcardPatternImpl.java | 6 ++--- .../sonar/python/tree/WithStatementImpl.java | 6 ++--- .../python/tree/YieldExpressionImpl.java | 6 ++--- .../sonar/python/tree/YieldStatementImpl.java | 6 ++--- .../org/sonar/python/tree/package-info.java | 6 ++--- .../java/org/sonar/python/types/AnyType.java | 6 ++--- .../org/sonar/python/types/DeclaredType.java | 6 ++--- .../types/FlowSensitiveTypeInference.java | 6 ++--- .../python/types/HasTypeDependencies.java | 6 ++--- .../org/sonar/python/types/InferredTypes.java | 6 ++--- .../org/sonar/python/types/RuntimeType.java | 6 ++--- .../org/sonar/python/types/TypeInference.java | 6 ++--- .../types/TypeInferenceProgramState.java | 6 ++--- .../java/org/sonar/python/types/TypeShed.java | 6 ++--- .../org/sonar/python/types/UnionType.java | 6 ++--- .../sonar/python/types/UnknownClassType.java | 6 ++--- .../org/sonar/python/types/package-info.java | 6 ++--- .../org/sonar/python/types/v2/LazyType.java | 6 ++--- .../python/types/v2/LazyTypeWrapper.java | 6 ++--- .../sonar/python/types/v2/LazyUnionType.java | 6 ++--- .../sonar/python/types/v2/ResolvableType.java | 6 ++--- .../python/types/v2/SimpleTypeWrapper.java | 6 ++--- .../python/types/v2/SpecialFormType.java | 6 ++--- .../python/types/v2/TypeCheckBuilder.java | 6 ++--- .../sonar/python/types/v2/TypeCheckMap.java | 6 ++--- .../sonar/python/types/v2/TypeChecker.java | 6 ++--- .../org/sonar/python/types/v2/TypeUtils.java | 6 ++--- .../types/v2/matchers/AllTypePredicate.java | 6 ++--- .../types/v2/matchers/AnyTypePredicate.java | 6 ++--- .../types/v2/matchers/HasFQNPredicate.java | 6 ++--- .../types/v2/matchers/HasMemberPredicate.java | 6 ++--- .../HasMemberSatisfyingPredicate.java | 6 ++--- .../v2/matchers/InternalTypeMatchers.java | 6 ++--- .../matchers/IsAnyTypeInUnionSatisfying.java | 6 ++--- .../IsFunctionOwnerSatisfyingPredicate.java | 6 ++--- .../matchers/IsObjectSatisfyingPredicate.java | 6 ++--- .../v2/matchers/IsSelfTypePredicate.java | 6 ++--- .../IsTypeOrSuperTypeSatisfyingPredicate.java | 6 ++--- .../types/v2/matchers/IsTypePredicate.java | 6 ++--- .../types/v2/matchers/TypeMatcherImpl.java | 6 ++--- .../types/v2/matchers/TypePredicate.java | 6 ++--- .../v2/matchers/TypePredicateContext.java | 6 ++--- .../v2/matchers/TypePredicateContextImpl.java | 6 ++--- .../types/v2/matchers/TypePredicateUtils.java | 6 ++--- .../v2/matchers/TypeSourcePredicate.java | 6 ++--- .../types/v2/matchers/package-info.java | 6 ++--- .../sonar/python/types/v2/package-info.java | 6 ++--- .../python/IpynbNotebookParserTest.java | 6 ++--- .../python/PythonInputFileImplTest.java | 6 ++--- .../python/SonarQubePythonFileTest.java | 6 ++--- .../sonar/plugins/python/api/ParserTest.java | 6 ++--- ...PythonCustomRuleRepositoryWrapperTest.java | 6 ++--- .../python/api/PythonVersionUtilsTest.java | 6 ++--- .../python/api/PythonVisitorContextTest.java | 6 ++--- .../python/api/SonarLintCacheTest.java | 6 ++--- .../python/api/SonarLintCacheWrapperTest.java | 6 ++--- .../plugins/python/api/cfg/CfgValidator.java | 6 ++--- .../python/api/cfg/ControlFlowGraphTest.java | 6 ++--- .../python/api/cfg/ExpectedCfgStructure.java | 6 ++--- .../api/nosonar/NoSonarInfoParserTest.java | 6 ++--- .../api/nosonar/NoSonarLineInfoTest.java | 6 ++--- .../api/quickfix/PythonQuickFixTest.java | 6 ++--- .../api/quickfix/PythonTextEditTest.java | 6 ++--- .../python/api/tree/BaseTreeVisitorTest.java | 6 ++--- .../python/api/types/v2/ClassTypeTest.java | 6 ++--- .../v2/FullyQualifiedNameHelperTest.java | 6 ++--- .../python/api/types/v2/FunctionTypeTest.java | 6 ++--- .../python/api/types/v2/ModuleTypeTest.java | 6 ++--- .../python/api/types/v2/ObjectTypeTest.java | 6 ++--- .../python/api/types/v2/SelfTypeTest.java | 6 ++--- .../api/types/v2/SimpleTypeWrapperTest.java | 6 ++--- .../python/api/types/v2/TriBoolTest.java | 6 ++--- .../python/api/types/v2/UnionTypeTest.java | 6 ++--- .../types/v2/UnresolvedImportTypeTest.java | 6 ++--- .../types/v2/matchers/MatchersTestUtils.java | 6 ++--- .../v2/matchers/TypeMatcherImplTest.java | 6 ++--- .../v2/matchers/TypeMatcherUtilsTest.java | 6 ++--- .../sonar/python/DocstringExtractorTest.java | 6 ++--- .../sonar/python/FileLinesVisitorTest.java | 6 ++--- .../org/sonar/python/IssueLocationTest.java | 6 ++--- .../org/sonar/python/PythonCheckTest.java | 6 ++--- .../python/PythonSubscriptionCheckTest.java | 6 ++--- .../org/sonar/python/PythonTestUtils.java | 6 ++--- .../sonar/python/PythonVisitorCheckTest.java | 6 ++--- .../sonar/python/ReadWriteVisitorTest.java | 6 ++--- .../sonar/python/SubscriptionVisitorTest.java | 6 ++--- .../python/TestPythonVisitorRunnerTest.java | 6 ++--- .../org/sonar/python/TokenLocationTest.java | 6 ++--- .../sonar/python/api/PythonKeywordTest.java | 6 ++--- .../python/api/PythonPunctuatorTest.java | 6 ++--- .../sonar/python/api/PythonTokenTypeTest.java | 6 ++--- .../python/caching/CacheContextImplTest.java | 6 ++--- .../python/caching/CpdSerializerTest.java | 6 ++--- .../sonar/python/caching/DummyCacheTest.java | 6 ++--- .../caching/PythonReadCacheImplTest.java | 6 ++--- .../caching/PythonWriteCacheImplTest.java | 6 ++--- .../org/sonar/python/cfg/CfgUtilsTest.java | 6 ++--- .../sonar/python/cfg/PythonCfgBlockTest.java | 6 ++--- .../DefinedVariablesAnalysisTest.java | 6 ++--- .../fixpoint/LiveVariablesAnalysisTest.java | 6 ++--- .../ReachingDefinitionsAnalysisTest.java | 6 ++--- .../python/index/AliasDescriptorTest.java | 6 ++--- .../python/index/AmbiguousDescriptorTest.java | 6 ++--- .../python/index/ClassDescriptorTest.java | 6 ++--- .../index/DescriptorToProtobufTestUtils.java | 6 ++--- .../python/index/DescriptorUtilsTest.java | 6 ++--- .../python/index/FunctionDescriptorTest.java | 6 ++--- .../python/index/RoundTripDescriptorTest.java | 6 ++--- .../python/index/VariableDescriptorTest.java | 6 ++--- .../sonar/python/lexer/IPythonLexerTest.java | 6 ++--- .../sonar/python/lexer/PythonLexerTest.java | 6 ++--- .../CognitiveComplexityVisitorTest.java | 6 ++--- .../python/metrics/ComplexityVisitorTest.java | 6 ++--- .../sonar/python/metrics/FileMetricsTest.java | 6 ++--- .../python/parser/PythonParserAssert.java | 6 ++--- .../sonar/python/parser/PythonParserTest.java | 6 ++--- .../org/sonar/python/parser/RuleTest.java | 6 ++--- .../compound/statements/CasePatternsTest.java | 6 ++--- .../compound/statements/ClassDefTest.java | 6 ++--- .../compound/statements/DecoratorTest.java | 6 ++--- .../compound/statements/ExceptClauseTest.java | 6 ++--- .../compound/statements/ForStatementTest.java | 6 ++--- .../compound/statements/FuncDefTest.java | 6 ++--- .../compound/statements/IfStatementTest.java | 6 ++--- .../statements/MatchStatementTest.java | 6 ++--- .../parser/compound/statements/SuiteTest.java | 6 ++--- .../compound/statements/TryStatementTest.java | 6 ++--- .../statements/WhileStatementTest.java | 6 ++--- .../statements/WithStatementTest.java | 6 ++--- .../parser/expressions/ArgumentListTest.java | 6 ++--- .../parser/expressions/ExpressionTest.java | 6 ++--- .../python/parser/python/v3/PythonV3Test.java | 6 ++--- .../statements/AssertStatementTest.java | 6 ++--- .../simple/statements/BreakStatementTest.java | 6 ++--- .../statements/ContinueStatementTest.java | 6 ++--- .../simple/statements/DelStatementTest.java | 6 ++--- .../simple/statements/ExecStatementTest.java | 6 ++--- .../statements/ExpressionStatementTest.java | 6 ++--- .../statements/GlobalStatementTest.java | 6 ++--- .../statements/ImportStatementTest.java | 6 ++--- .../statements/NonlocalStatementTest.java | 6 ++--- .../simple/statements/PassStatementTest.java | 6 ++--- .../simple/statements/PrintStatementTest.java | 6 ++--- .../simple/statements/RaiseStatementTest.java | 6 ++--- .../statements/ReturnStatementTest.java | 6 ++--- .../statements/SimpleStatementTest.java | 6 ++--- .../simple/statements/YieldStatementTest.java | 6 ++--- .../python/parser/toplevel/FileInputTest.java | 6 ++--- ...reBasedAwsLambdaHandlersCollectorTest.java | 6 ++--- .../python/quickfix/TextEditUtilsTest.java | 6 ++--- .../regex/PythonAnalyzerRegexSourceTest.java | 6 ++--- .../regex/PythonRegexIssueLocationTest.java | 6 ++--- .../PythonStringCharacterParserTest.java | 6 ++--- .../python/regex/RegexParserTestUtils.java | 6 ++--- .../python/semantic/AmbiguousSymbolTest.java | 6 ++--- .../semantic/ClassLocalSymbolsTest.java | 6 ++--- .../python/semantic/ClassSymbolImplTest.java | 6 ++--- .../python/semantic/ClassSymbolTest.java | 6 ++--- .../python/semantic/DependencyGraphTest.java | 6 ++--- .../semantic/FullyQualifiedNameTest.java | 6 ++--- .../python/semantic/FunctionSymbolTest.java | 6 ++--- .../semantic/MatchStatementSymbolsTest.java | 6 ++--- .../semantic/ProjectLevelSymbolTableTest.java | 6 ++--- .../python/semantic/SelfSymbolImplTest.java | 6 ++--- .../sonar/python/semantic/SymbolImplTest.java | 6 ++--- .../semantic/SymbolTableBuilderTest.java | 6 ++--- .../python/semantic/SymbolUtilsTest.java | 6 ++--- .../sonar/python/semantic/UsageImplTest.java | 6 ++--- .../semantic/v2/SymbolTableBuilderV2Test.java | 6 ++--- .../python/semantic/v2/SymbolV2ImplTest.java | 6 ++--- .../python/semantic/v2/SymbolV2UtilsTest.java | 6 ++--- .../sonar/python/semantic/v2/TestProject.java | 6 ++--- .../semantic/v2/TypeCheckerBuilderTest.java | 6 ++--- .../semantic/v2/TypeInferenceV2Test.java | 6 ++--- .../v2/callgraph/CallGraphCollectorTest.java | 6 ++--- .../v2/callgraph/CallGraphIterableTest.java | 6 ++--- .../v2/callgraph/CallGraphNodeTest.java | 6 ++--- .../semantic/v2/callgraph/CallGraphTest.java | 6 ++--- .../v2/callgraph/CallGraphWalkerTest.java | 6 ++--- ...usDescriptorToPythonTypeConverterTest.java | 6 ++--- ...ssDescriptorToPythonTypeConverterTest.java | 6 ++--- .../v2/converter/ConversionContextTest.java | 6 ++--- .../DescriptorToPythonTypeConverterTest.java | 6 ++--- ...onDescriptorToPythonTypeConverterTest.java | 6 ++--- .../PythonTypeToDescriptorConverterTest.java | 6 ++--- ...peAnnotationToPythonTypeConverterTest.java | 6 ++--- ...leDescriptorToPythonTypeConverterTest.java | 6 ++--- .../TrivialTypePropagationVisitorTest.java | 6 ++--- .../types/TypeDependenciesCalculatorTest.java | 6 ++--- .../v2/types/TypeInferenceMatchersTest.java | 6 ++--- .../CallReturnTypeCalculatorTest.java | 6 ++--- .../QualifiedExpressionCalculatorTest.java | 6 ++--- .../ClassSymbolToDescriptorConverterTest.java | 6 ++--- ...nctionSymbolToDescriptorConverterTest.java | 6 ++--- ...ModuleSymbolToDescriptorConverterTest.java | 6 ++--- ...nctionSymbolToDescriptorConverterTest.java | 6 ++--- ...ameterSymbolToDescriptorConverterTest.java | 6 ++--- .../TypeShedDescriptorsProviderTest.java | 6 ++--- .../v2/typeshed/TypeShedUtilsTest.java | 6 ++--- .../VarSymbolToDescriptorConverterTest.java | 6 ++--- .../v2/typetable/BasicTypeTableTest.java | 6 ++--- .../v2/typetable/CachedTypeTableTest.java | 6 ++--- .../typetable/ProjectLevelTypeTableTest.java | 6 ++--- .../sonar/python/tests/UnittestUtilsTest.java | 6 ++--- .../python/tree/BinaryExpressionImplTest.java | 6 ++--- .../python/tree/CallExpressionImplTest.java | 6 ++--- .../tree/ComprehensionExpressionImplTest.java | 6 ++--- .../python/tree/IPythonTreeMakerTest.java | 6 ++--- .../org/sonar/python/tree/NameImplTest.java | 6 ++--- .../tree/ParenthesizedExpressionImplTest.java | 6 ++--- .../PythonTreeMakerMatchStatementTest.java | 6 ++--- .../python/tree/PythonTreeMakerTest.java | 6 ++--- .../python/tree/PythonTreeMakerUtilsTest.java | 6 ++--- .../python/tree/SliceExpressionImplTest.java | 6 ++--- .../python/tree/StringElementImplTest.java | 6 ++--- .../python/tree/StringLiteralImplTest.java | 6 ++--- .../sonar/python/tree/TokenEnricherTest.java | 6 ++--- .../org/sonar/python/tree/TreeUtilsTest.java | 6 ++--- .../python/tree/UnaryExpressionImplTest.java | 6 ++--- .../org/sonar/python/types/AnyTypeTest.java | 6 ++--- .../sonar/python/types/DeclaredTypeTest.java | 6 ++--- .../sonar/python/types/InferredTypesTest.java | 6 ++--- .../python/types/MemberResolutionTest.java | 6 ++--- .../sonar/python/types/RuntimeTypeTest.java | 6 ++--- .../types/TypeInferenceProgramStateTest.java | 6 ++--- .../sonar/python/types/TypeInferenceTest.java | 6 ++--- .../org/sonar/python/types/TypeShedTest.java | 6 ++--- .../org/sonar/python/types/UnionTypeTest.java | 6 ++--- .../python/types/UnknownClassTypeTest.java | 6 ++--- .../sonar/python/types/v2/LazyTypeTest.java | 6 ++--- .../python/types/v2/LazyTypeWrapperTest.java | 6 ++--- .../python/types/v2/LazyUnionTypeTest.java | 6 ++--- .../python/types/v2/SpecialFormTypeTest.java | 6 ++--- .../python/types/v2/TypeCheckMapTest.java | 6 ++--- .../python/types/v2/TypeCheckerTest.java | 6 ++--- .../v2/TypeInferenceProgramStateTest.java | 6 ++--- .../sonar/python/types/v2/TypesTestUtils.java | 6 ++--- .../v2/matchers/AllTypePredicateTest.java | 6 ++--- .../v2/matchers/AnyTypePredicateTest.java | 6 ++--- .../v2/matchers/HasFQNPredicateTest.java | 6 ++--- .../v2/matchers/HasMemberPredicateTest.java | 6 ++--- .../IsAnyTypeInUnionSatisfyingTest.java | 6 ++--- ...sFunctionOwnerSatisfyingPredicateTest.java | 6 ++--- .../IsObjectSatisfyingPredicateTest.java | 6 ++--- .../v2/matchers/IsSelfTypePredicateTest.java | 6 ++--- ...ypeOrSuperTypeSatisfyingPredicateTest.java | 6 ++--- .../v2/matchers/IsTypePredicateTest.java | 6 ++--- .../v2/matchers/TypeSourcePredicateTest.java | 6 ++--- .../typeshed_serializer/runners/__init__.py | 6 ++--- .../typeshed_serializer/runners/tox_runner.py | 6 ++--- .../serializer/__init__.py | 6 ++--- .../serializer/serializers.py | 6 ++--- .../typeshed_serializer/serializer/symbols.py | 6 ++--- .../serializer/symbols_merger.py | 6 ++--- .../serializer/typeshed_serializer.py | 6 ++--- .../serializer_sources.checksum | 2 +- .../typeshed_serializer/tests/__init__.py | 6 ++--- .../typeshed_serializer/tests/conftest.py | 6 ++--- .../tests/runners/__init__.py | 6 ++--- .../tests/runners/test_tox_runner.py | 6 ++--- .../tests/test_serializers.py | 6 ++--- .../typeshed_serializer/tests/test_symbols.py | 6 ++--- .../tests/test_symbols_merger.py | 6 ++--- .../tests/test_typeshed_serializer.py | 6 ++--- .../tests/utils/__init__.py | 6 ++--- .../tests/utils/test_folder_manager.py | 6 ++--- .../sonar/plugins/python/PythonPlugin.java | 6 ++--- .../sonar/plugins/python/package-info.java | 6 ++--- 1795 files changed, 5357 insertions(+), 5376 deletions(-) diff --git a/docs/python-custom-rules-example/src/main/java/org/sonar/samples/python/CustomPythonRuleRepository.java b/docs/python-custom-rules-example/src/main/java/org/sonar/samples/python/CustomPythonRuleRepository.java index 3b2c7282e..cb8de1fd2 100644 --- a/docs/python-custom-rules-example/src/main/java/org/sonar/samples/python/CustomPythonRuleRepository.java +++ b/docs/python-custom-rules-example/src/main/java/org/sonar/samples/python/CustomPythonRuleRepository.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011-2025 SonarSource Sàrl - mailto:info AT sonarsource DOT com + * Copyright (C) SonarSource Sàrl - mailto:info AT sonarsource DOT com * This code is released under [MIT No Attribution](https://opensource.org/licenses/MIT-0) license. */ package org.sonar.samples.python; diff --git a/docs/python-custom-rules-example/src/main/java/org/sonar/samples/python/CustomPythonRulesPlugin.java b/docs/python-custom-rules-example/src/main/java/org/sonar/samples/python/CustomPythonRulesPlugin.java index 98497c808..3b5ad3e8e 100644 --- a/docs/python-custom-rules-example/src/main/java/org/sonar/samples/python/CustomPythonRulesPlugin.java +++ b/docs/python-custom-rules-example/src/main/java/org/sonar/samples/python/CustomPythonRulesPlugin.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011-2025 SonarSource Sàrl - mailto:info AT sonarsource DOT com + * Copyright (C) SonarSource Sàrl - mailto:info AT sonarsource DOT com * This code is released under [MIT No Attribution](https://opensource.org/licenses/MIT-0) license. */ package org.sonar.samples.python; diff --git a/docs/python-custom-rules-example/src/main/java/org/sonar/samples/python/RulesList.java b/docs/python-custom-rules-example/src/main/java/org/sonar/samples/python/RulesList.java index 731857b29..8b807159f 100644 --- a/docs/python-custom-rules-example/src/main/java/org/sonar/samples/python/RulesList.java +++ b/docs/python-custom-rules-example/src/main/java/org/sonar/samples/python/RulesList.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011-2025 SonarSource Sàrl - mailto:info AT sonarsource DOT com + * Copyright (C) SonarSource Sàrl - mailto:info AT sonarsource DOT com * This code is released under [MIT No Attribution](https://opensource.org/licenses/MIT-0) license. */ package org.sonar.samples.python; diff --git a/docs/python-custom-rules-example/src/main/java/org/sonar/samples/python/checks/CustomPythonSubscriptionCheck.java b/docs/python-custom-rules-example/src/main/java/org/sonar/samples/python/checks/CustomPythonSubscriptionCheck.java index 6b95f7a9c..79ef93564 100644 --- a/docs/python-custom-rules-example/src/main/java/org/sonar/samples/python/checks/CustomPythonSubscriptionCheck.java +++ b/docs/python-custom-rules-example/src/main/java/org/sonar/samples/python/checks/CustomPythonSubscriptionCheck.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011-2025 SonarSource Sàrl - mailto:info AT sonarsource DOT com + * Copyright (C) SonarSource Sàrl - mailto:info AT sonarsource DOT com * This code is released under [MIT No Attribution](https://opensource.org/licenses/MIT-0) license. */ package org.sonar.samples.python.checks; diff --git a/docs/python-custom-rules-example/src/main/java/org/sonar/samples/python/checks/CustomPythonVisitorCheck.java b/docs/python-custom-rules-example/src/main/java/org/sonar/samples/python/checks/CustomPythonVisitorCheck.java index dd432e417..576e88206 100644 --- a/docs/python-custom-rules-example/src/main/java/org/sonar/samples/python/checks/CustomPythonVisitorCheck.java +++ b/docs/python-custom-rules-example/src/main/java/org/sonar/samples/python/checks/CustomPythonVisitorCheck.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011-2025 SonarSource Sàrl - mailto:info AT sonarsource DOT com + * Copyright (C) SonarSource Sàrl - mailto:info AT sonarsource DOT com * This code is released under [MIT No Attribution](https://opensource.org/licenses/MIT-0) license. */ package org.sonar.samples.python.checks; diff --git a/docs/python-custom-rules-example/src/main/java/org/sonar/samples/python/checks/package-info.java b/docs/python-custom-rules-example/src/main/java/org/sonar/samples/python/checks/package-info.java index ec4f65e77..9eb6b26be 100644 --- a/docs/python-custom-rules-example/src/main/java/org/sonar/samples/python/checks/package-info.java +++ b/docs/python-custom-rules-example/src/main/java/org/sonar/samples/python/checks/package-info.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011-2025 SonarSource Sàrl - mailto:info AT sonarsource DOT com + * Copyright (C) SonarSource Sàrl - mailto:info AT sonarsource DOT com * This code is released under [MIT No Attribution](https://opensource.org/licenses/MIT-0) license. */ @ParametersAreNonnullByDefault diff --git a/docs/python-custom-rules-example/src/main/java/org/sonar/samples/python/package-info.java b/docs/python-custom-rules-example/src/main/java/org/sonar/samples/python/package-info.java index 0541ae28d..176bab333 100644 --- a/docs/python-custom-rules-example/src/main/java/org/sonar/samples/python/package-info.java +++ b/docs/python-custom-rules-example/src/main/java/org/sonar/samples/python/package-info.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011-2025 SonarSource Sàrl - mailto:info AT sonarsource DOT com + * Copyright (C) SonarSource Sàrl - mailto:info AT sonarsource DOT com * This code is released under [MIT No Attribution](https://opensource.org/licenses/MIT-0) license. */ @ParametersAreNonnullByDefault diff --git a/docs/python-custom-rules-example/src/main/resources/license-header.txt b/docs/python-custom-rules-example/src/main/resources/license-header.txt index 27a2c5c0c..e4522e045 100644 --- a/docs/python-custom-rules-example/src/main/resources/license-header.txt +++ b/docs/python-custom-rules-example/src/main/resources/license-header.txt @@ -1,2 +1,2 @@ -Copyright (C) ${license.years} ${license.owner} - ${license.mailto} +Copyright (C) ${license.owner} - ${license.mailto} This code is released under [MIT No Attribution](https://opensource.org/licenses/MIT-0) license. \ No newline at end of file diff --git a/docs/python-custom-rules-example/src/test/java/org/sonar/samples/python/CustomPythonRuleRepositoryTest.java b/docs/python-custom-rules-example/src/test/java/org/sonar/samples/python/CustomPythonRuleRepositoryTest.java index 71388e1bb..13459f868 100644 --- a/docs/python-custom-rules-example/src/test/java/org/sonar/samples/python/CustomPythonRuleRepositoryTest.java +++ b/docs/python-custom-rules-example/src/test/java/org/sonar/samples/python/CustomPythonRuleRepositoryTest.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011-2025 SonarSource Sàrl - mailto:info AT sonarsource DOT com + * Copyright (C) SonarSource Sàrl - mailto:info AT sonarsource DOT com * This code is released under [MIT No Attribution](https://opensource.org/licenses/MIT-0) license. */ package org.sonar.samples.python; diff --git a/docs/python-custom-rules-example/src/test/java/org/sonar/samples/python/CustomPythonRulesPluginTest.java b/docs/python-custom-rules-example/src/test/java/org/sonar/samples/python/CustomPythonRulesPluginTest.java index 0f67bb6ab..772ed5b75 100644 --- a/docs/python-custom-rules-example/src/test/java/org/sonar/samples/python/CustomPythonRulesPluginTest.java +++ b/docs/python-custom-rules-example/src/test/java/org/sonar/samples/python/CustomPythonRulesPluginTest.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011-2025 SonarSource Sàrl - mailto:info AT sonarsource DOT com + * Copyright (C) SonarSource Sàrl - mailto:info AT sonarsource DOT com * This code is released under [MIT No Attribution](https://opensource.org/licenses/MIT-0) license. */ package org.sonar.samples.python; diff --git a/docs/python-custom-rules-example/src/test/java/org/sonar/samples/python/checks/CustomPythonSubscriptionCheckTest.java b/docs/python-custom-rules-example/src/test/java/org/sonar/samples/python/checks/CustomPythonSubscriptionCheckTest.java index 8bf2576ca..8a647c954 100644 --- a/docs/python-custom-rules-example/src/test/java/org/sonar/samples/python/checks/CustomPythonSubscriptionCheckTest.java +++ b/docs/python-custom-rules-example/src/test/java/org/sonar/samples/python/checks/CustomPythonSubscriptionCheckTest.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011-2025 SonarSource Sàrl - mailto:info AT sonarsource DOT com + * Copyright (C) SonarSource Sàrl - mailto:info AT sonarsource DOT com * This code is released under [MIT No Attribution](https://opensource.org/licenses/MIT-0) license. */ package org.sonar.samples.python.checks; diff --git a/docs/python-custom-rules-example/src/test/java/org/sonar/samples/python/checks/CustomPythonVisitorCheckTest.java b/docs/python-custom-rules-example/src/test/java/org/sonar/samples/python/checks/CustomPythonVisitorCheckTest.java index 4d7129f4e..4baf79b81 100644 --- a/docs/python-custom-rules-example/src/test/java/org/sonar/samples/python/checks/CustomPythonVisitorCheckTest.java +++ b/docs/python-custom-rules-example/src/test/java/org/sonar/samples/python/checks/CustomPythonVisitorCheckTest.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011-2025 SonarSource Sàrl - mailto:info AT sonarsource DOT com + * Copyright (C) SonarSource Sàrl - mailto:info AT sonarsource DOT com * This code is released under [MIT No Attribution](https://opensource.org/licenses/MIT-0) license. */ package org.sonar.samples.python.checks; diff --git a/its/commons/src/test/java/com/sonar/python/it/ConcurrentOrchestratorExtension.java b/its/commons/src/test/java/com/sonar/python/it/ConcurrentOrchestratorExtension.java index 1376942bc..2153b333a 100644 --- a/its/commons/src/test/java/com/sonar/python/it/ConcurrentOrchestratorExtension.java +++ b/its/commons/src/test/java/com/sonar/python/it/ConcurrentOrchestratorExtension.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/its/commons/src/test/java/com/sonar/python/it/IssueListAssert.java b/its/commons/src/test/java/com/sonar/python/it/IssueListAssert.java index 9711892cd..4c6076014 100644 --- a/its/commons/src/test/java/com/sonar/python/it/IssueListAssert.java +++ b/its/commons/src/test/java/com/sonar/python/it/IssueListAssert.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/its/commons/src/test/java/com/sonar/python/it/IssueListAssertTest.java b/its/commons/src/test/java/com/sonar/python/it/IssueListAssertTest.java index afe59aca6..2d53d04db 100644 --- a/its/commons/src/test/java/com/sonar/python/it/IssueListAssertTest.java +++ b/its/commons/src/test/java/com/sonar/python/it/IssueListAssertTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/its/commons/src/test/java/com/sonar/python/it/PluginLocator.java b/its/commons/src/test/java/com/sonar/python/it/PluginLocator.java index b870b4f0a..a96a1e061 100644 --- a/its/commons/src/test/java/com/sonar/python/it/PluginLocator.java +++ b/its/commons/src/test/java/com/sonar/python/it/PluginLocator.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/its/commons/src/test/java/com/sonar/python/it/TestsUtils.java b/its/commons/src/test/java/com/sonar/python/it/TestsUtils.java index 485fe8a6a..edf343c2e 100644 --- a/its/commons/src/test/java/com/sonar/python/it/TestsUtils.java +++ b/its/commons/src/test/java/com/sonar/python/it/TestsUtils.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/BanditReportTest.java b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/BanditReportTest.java index 79f67e8f6..6cf1f8598 100644 --- a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/BanditReportTest.java +++ b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/BanditReportTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2012-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/CPDTest.java b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/CPDTest.java index 4db54af4b..eff82729e 100644 --- a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/CPDTest.java +++ b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/CPDTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2012-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/CoverageTest.java b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/CoverageTest.java index fcd6f6482..df9aece4a 100644 --- a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/CoverageTest.java +++ b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/CoverageTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2012-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/CustomRulesExampleTest.java b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/CustomRulesExampleTest.java index 7cfab5ff4..742d90354 100644 --- a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/CustomRulesExampleTest.java +++ b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/CustomRulesExampleTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2012-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/CustomRulesTest.java b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/CustomRulesTest.java index 640190912..ee062eada 100644 --- a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/CustomRulesTest.java +++ b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/CustomRulesTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2012-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/Flake8ReportTest.java b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/Flake8ReportTest.java index 5ee3c1c5e..27d97e7fa 100644 --- a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/Flake8ReportTest.java +++ b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/Flake8ReportTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2012-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/MetricsTest.java b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/MetricsTest.java index d89e90c4e..8a84908a5 100644 --- a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/MetricsTest.java +++ b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/MetricsTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2012-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/MypyReportTest.java b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/MypyReportTest.java index 1a585a69a..c089adb3c 100644 --- a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/MypyReportTest.java +++ b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/MypyReportTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2012-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/NoSonarTest.java b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/NoSonarTest.java index be2da2eee..41591ea41 100644 --- a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/NoSonarTest.java +++ b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/NoSonarTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2012-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/NotebookPluginTest.java b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/NotebookPluginTest.java index ab62281b7..a2641eae7 100644 --- a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/NotebookPluginTest.java +++ b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/NotebookPluginTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2012-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/PylintReportTest.java b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/PylintReportTest.java index 38aa06417..49ccd8552 100644 --- a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/PylintReportTest.java +++ b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/PylintReportTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2012-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/RuffReportTest.java b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/RuffReportTest.java index 54056c29f..fbcbb7439 100644 --- a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/RuffReportTest.java +++ b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/RuffReportTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2012-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/SonarLintIPythonTest.java b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/SonarLintIPythonTest.java index b8f0d8061..9c3f36cd9 100755 --- a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/SonarLintIPythonTest.java +++ b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/SonarLintIPythonTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2012-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/SonarLintTest.java b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/SonarLintTest.java index e5e9f4ed4..79d98299e 100644 --- a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/SonarLintTest.java +++ b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/SonarLintTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2012-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/TestReportTest.java b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/TestReportTest.java index b0bcdde8c..2a33f8956 100644 --- a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/TestReportTest.java +++ b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/TestReportTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2012-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/TestRulesTest.java b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/TestRulesTest.java index edb85d10e..18781d664 100644 --- a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/TestRulesTest.java +++ b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/TestRulesTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2012-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/its/plugin/python-custom-rules-plugin/src/main/java/org/sonar/samples/python/CustomPythonRuleRepository.java b/its/plugin/python-custom-rules-plugin/src/main/java/org/sonar/samples/python/CustomPythonRuleRepository.java index 5bd25dab4..71f7cb9d0 100644 --- a/its/plugin/python-custom-rules-plugin/src/main/java/org/sonar/samples/python/CustomPythonRuleRepository.java +++ b/its/plugin/python-custom-rules-plugin/src/main/java/org/sonar/samples/python/CustomPythonRuleRepository.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2012-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/its/plugin/python-custom-rules-plugin/src/main/java/org/sonar/samples/python/CustomPythonRulesPlugin.java b/its/plugin/python-custom-rules-plugin/src/main/java/org/sonar/samples/python/CustomPythonRulesPlugin.java index 68545fe5d..a4b833f58 100644 --- a/its/plugin/python-custom-rules-plugin/src/main/java/org/sonar/samples/python/CustomPythonRulesPlugin.java +++ b/its/plugin/python-custom-rules-plugin/src/main/java/org/sonar/samples/python/CustomPythonRulesPlugin.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2012-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/its/plugin/python-custom-rules-plugin/src/main/java/org/sonar/samples/python/CustomPythonSubscriptionCheck.java b/its/plugin/python-custom-rules-plugin/src/main/java/org/sonar/samples/python/CustomPythonSubscriptionCheck.java index aa8aab2ae..b911d3082 100644 --- a/its/plugin/python-custom-rules-plugin/src/main/java/org/sonar/samples/python/CustomPythonSubscriptionCheck.java +++ b/its/plugin/python-custom-rules-plugin/src/main/java/org/sonar/samples/python/CustomPythonSubscriptionCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2012-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/its/plugin/python-custom-rules-plugin/src/main/java/org/sonar/samples/python/CustomPythonVisitorCheck.java b/its/plugin/python-custom-rules-plugin/src/main/java/org/sonar/samples/python/CustomPythonVisitorCheck.java index 3263e0b52..1d0d31484 100644 --- a/its/plugin/python-custom-rules-plugin/src/main/java/org/sonar/samples/python/CustomPythonVisitorCheck.java +++ b/its/plugin/python-custom-rules-plugin/src/main/java/org/sonar/samples/python/CustomPythonVisitorCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2012-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/its/plugin/python-custom-rules-plugin/src/main/java/org/sonar/samples/python/package-info.java b/its/plugin/python-custom-rules-plugin/src/main/java/org/sonar/samples/python/package-info.java index e8c0598fe..6c7478ff3 100644 --- a/its/plugin/python-custom-rules-plugin/src/main/java/org/sonar/samples/python/package-info.java +++ b/its/plugin/python-custom-rules-plugin/src/main/java/org/sonar/samples/python/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2012-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/its/plugin/python-custom-rules-plugin/src/test/java/org/sonar/samples/python/CustomPythonRuleRepositoryTest.java b/its/plugin/python-custom-rules-plugin/src/test/java/org/sonar/samples/python/CustomPythonRuleRepositoryTest.java index fbbebfbe0..d9dddbfc0 100644 --- a/its/plugin/python-custom-rules-plugin/src/test/java/org/sonar/samples/python/CustomPythonRuleRepositoryTest.java +++ b/its/plugin/python-custom-rules-plugin/src/test/java/org/sonar/samples/python/CustomPythonRuleRepositoryTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2012-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/its/plugin/python-custom-rules-plugin/src/test/java/org/sonar/samples/python/CustomPythonRulesPluginTest.java b/its/plugin/python-custom-rules-plugin/src/test/java/org/sonar/samples/python/CustomPythonRulesPluginTest.java index 1230c0e0c..2219d27d5 100644 --- a/its/plugin/python-custom-rules-plugin/src/test/java/org/sonar/samples/python/CustomPythonRulesPluginTest.java +++ b/its/plugin/python-custom-rules-plugin/src/test/java/org/sonar/samples/python/CustomPythonRulesPluginTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2012-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/its/plugin/python-custom-rules-plugin/src/test/java/org/sonar/samples/python/CustomPythonSubscriptionCheckTest.java b/its/plugin/python-custom-rules-plugin/src/test/java/org/sonar/samples/python/CustomPythonSubscriptionCheckTest.java index 8510a2bdd..3575192e4 100644 --- a/its/plugin/python-custom-rules-plugin/src/test/java/org/sonar/samples/python/CustomPythonSubscriptionCheckTest.java +++ b/its/plugin/python-custom-rules-plugin/src/test/java/org/sonar/samples/python/CustomPythonSubscriptionCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2012-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/its/plugin/python-custom-rules-plugin/src/test/java/org/sonar/samples/python/CustomPythonVisitorCheckTest.java b/its/plugin/python-custom-rules-plugin/src/test/java/org/sonar/samples/python/CustomPythonVisitorCheckTest.java index c32015494..f432c1db4 100644 --- a/its/plugin/python-custom-rules-plugin/src/test/java/org/sonar/samples/python/CustomPythonVisitorCheckTest.java +++ b/its/plugin/python-custom-rules-plugin/src/test/java/org/sonar/samples/python/CustomPythonVisitorCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2012-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/pom.xml b/pom.xml index 818d18ae4..febc85c9c 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.parent parent - 86.0.0.3040 + 87.0.0.3057 org.sonarsource.python diff --git a/python-checks-testkit/src/main/java/org/sonar/python/checks/quickfix/PythonQuickFixVerifier.java b/python-checks-testkit/src/main/java/org/sonar/python/checks/quickfix/PythonQuickFixVerifier.java index 9684118fd..1cd9bbdba 100644 --- a/python-checks-testkit/src/main/java/org/sonar/python/checks/quickfix/PythonQuickFixVerifier.java +++ b/python-checks-testkit/src/main/java/org/sonar/python/checks/quickfix/PythonQuickFixVerifier.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks-testkit/src/main/java/org/sonar/python/checks/quickfix/package-info.java b/python-checks-testkit/src/main/java/org/sonar/python/checks/quickfix/package-info.java index 5f9c664a2..dd9452036 100644 --- a/python-checks-testkit/src/main/java/org/sonar/python/checks/quickfix/package-info.java +++ b/python-checks-testkit/src/main/java/org/sonar/python/checks/quickfix/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks-testkit/src/main/java/org/sonar/python/checks/utils/PythonCheckVerifier.java b/python-checks-testkit/src/main/java/org/sonar/python/checks/utils/PythonCheckVerifier.java index 9e7bc4d36..4fa4ca5b6 100644 --- a/python-checks-testkit/src/main/java/org/sonar/python/checks/utils/PythonCheckVerifier.java +++ b/python-checks-testkit/src/main/java/org/sonar/python/checks/utils/PythonCheckVerifier.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks-testkit/src/main/java/org/sonar/python/checks/utils/PythonMultiFileVerifier.java b/python-checks-testkit/src/main/java/org/sonar/python/checks/utils/PythonMultiFileVerifier.java index 94860bac3..c5d61e3f1 100644 --- a/python-checks-testkit/src/main/java/org/sonar/python/checks/utils/PythonMultiFileVerifier.java +++ b/python-checks-testkit/src/main/java/org/sonar/python/checks/utils/PythonMultiFileVerifier.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks-testkit/src/main/java/org/sonar/python/checks/utils/package-info.java b/python-checks-testkit/src/main/java/org/sonar/python/checks/utils/package-info.java index 8634f7f6d..ff19e08b7 100644 --- a/python-checks-testkit/src/main/java/org/sonar/python/checks/utils/package-info.java +++ b/python-checks-testkit/src/main/java/org/sonar/python/checks/utils/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks-testkit/src/test/java/org/sonar/python/checks/quickfix/PythonQuickFixVerifierTest.java b/python-checks-testkit/src/test/java/org/sonar/python/checks/quickfix/PythonQuickFixVerifierTest.java index 269fe9249..cf0e56191 100644 --- a/python-checks-testkit/src/test/java/org/sonar/python/checks/quickfix/PythonQuickFixVerifierTest.java +++ b/python-checks-testkit/src/test/java/org/sonar/python/checks/quickfix/PythonQuickFixVerifierTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks-testkit/src/test/java/org/sonar/python/checks/utils/PythonCheckVerifierAdditionalTest.java b/python-checks-testkit/src/test/java/org/sonar/python/checks/utils/PythonCheckVerifierAdditionalTest.java index 628893da9..1e0f99b91 100644 --- a/python-checks-testkit/src/test/java/org/sonar/python/checks/utils/PythonCheckVerifierAdditionalTest.java +++ b/python-checks-testkit/src/test/java/org/sonar/python/checks/utils/PythonCheckVerifierAdditionalTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks-testkit/src/test/java/org/sonar/python/checks/utils/PythonCheckVerifierTest.java b/python-checks-testkit/src/test/java/org/sonar/python/checks/utils/PythonCheckVerifierTest.java index dcdafe975..d57b1a930 100644 --- a/python-checks-testkit/src/test/java/org/sonar/python/checks/utils/PythonCheckVerifierTest.java +++ b/python-checks-testkit/src/test/java/org/sonar/python/checks/utils/PythonCheckVerifierTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks-testkit/src/test/java/org/sonar/python/checks/utils/PythonMultiFileVerifierTest.java b/python-checks-testkit/src/test/java/org/sonar/python/checks/utils/PythonMultiFileVerifierTest.java index 65f022bbd..5e6a72fdd 100644 --- a/python-checks-testkit/src/test/java/org/sonar/python/checks/utils/PythonMultiFileVerifierTest.java +++ b/python-checks-testkit/src/test/java/org/sonar/python/checks/utils/PythonMultiFileVerifierTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/AbstractCallExpressionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/AbstractCallExpressionCheck.java index 3f592f7f1..91111a440 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/AbstractCallExpressionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/AbstractCallExpressionCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/AbstractDuplicateKeyCheck.java b/python-checks/src/main/java/org/sonar/python/checks/AbstractDuplicateKeyCheck.java index 482a793fe..24e575773 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/AbstractDuplicateKeyCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/AbstractDuplicateKeyCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/AbstractFunctionNameCheck.java b/python-checks/src/main/java/org/sonar/python/checks/AbstractFunctionNameCheck.java index d44c31cf3..93447dcfc 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/AbstractFunctionNameCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/AbstractFunctionNameCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/AbstractNameCheck.java b/python-checks/src/main/java/org/sonar/python/checks/AbstractNameCheck.java index 1acaa53c2..4039b839a 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/AbstractNameCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/AbstractNameCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/AbstractStringFormatCheck.java b/python-checks/src/main/java/org/sonar/python/checks/AbstractStringFormatCheck.java index ff0c382ff..ddabbe786 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/AbstractStringFormatCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/AbstractStringFormatCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/AbstractUnreadPrivateMembersCheck.java b/python-checks/src/main/java/org/sonar/python/checks/AbstractUnreadPrivateMembersCheck.java index 62976e849..3c770b024 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/AbstractUnreadPrivateMembersCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/AbstractUnreadPrivateMembersCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/AfterJumpStatementCheck.java b/python-checks/src/main/java/org/sonar/python/checks/AfterJumpStatementCheck.java index 5882b0664..04e13a6e2 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/AfterJumpStatementCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/AfterJumpStatementCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/AllBranchesAreIdenticalCheck.java b/python-checks/src/main/java/org/sonar/python/checks/AllBranchesAreIdenticalCheck.java index 1aaf70bcf..b6c16ac20 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/AllBranchesAreIdenticalCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/AllBranchesAreIdenticalCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/ArgumentNumberCheck.java b/python-checks/src/main/java/org/sonar/python/checks/ArgumentNumberCheck.java index 43443cdf5..930d1863e 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/ArgumentNumberCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/ArgumentNumberCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/ArgumentTypeCheck.java b/python-checks/src/main/java/org/sonar/python/checks/ArgumentTypeCheck.java index 76e57db0d..1c66936e5 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/ArgumentTypeCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/ArgumentTypeCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/AsyncAwsLambdaHandlerCheck.java b/python-checks/src/main/java/org/sonar/python/checks/AsyncAwsLambdaHandlerCheck.java index 29123d750..699a27446 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/AsyncAwsLambdaHandlerCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/AsyncAwsLambdaHandlerCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/AsyncFunctionNotAsyncCheck.java b/python-checks/src/main/java/org/sonar/python/checks/AsyncFunctionNotAsyncCheck.java index cfaba0e56..4db86503f 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/AsyncFunctionNotAsyncCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/AsyncFunctionNotAsyncCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/AsyncFunctionWithTimeoutCheck.java b/python-checks/src/main/java/org/sonar/python/checks/AsyncFunctionWithTimeoutCheck.java index 9f5fb83ff..4375acfcb 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/AsyncFunctionWithTimeoutCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/AsyncFunctionWithTimeoutCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/AsyncLongSleepCheck.java b/python-checks/src/main/java/org/sonar/python/checks/AsyncLongSleepCheck.java index b945bb01c..def3df16b 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/AsyncLongSleepCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/AsyncLongSleepCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/AsyncWithContextManagerCheck.java b/python-checks/src/main/java/org/sonar/python/checks/AsyncWithContextManagerCheck.java index 6aa5996f1..5eb05ca26 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/AsyncWithContextManagerCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/AsyncWithContextManagerCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/AsyncioTaskNotStoredCheck.java b/python-checks/src/main/java/org/sonar/python/checks/AsyncioTaskNotStoredCheck.java index 9085ae5c2..515eac81c 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/AsyncioTaskNotStoredCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/AsyncioTaskNotStoredCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/AwsClientExceptionNotCaughtCheck.java b/python-checks/src/main/java/org/sonar/python/checks/AwsClientExceptionNotCaughtCheck.java index 8a0224792..2747f63ef 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/AwsClientExceptionNotCaughtCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/AwsClientExceptionNotCaughtCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/AwsCustomMetricNamespaceCheck.java b/python-checks/src/main/java/org/sonar/python/checks/AwsCustomMetricNamespaceCheck.java index ca0dfd181..3db87d5ee 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/AwsCustomMetricNamespaceCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/AwsCustomMetricNamespaceCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/AwsExpectedBucketOwnerCheck.java b/python-checks/src/main/java/org/sonar/python/checks/AwsExpectedBucketOwnerCheck.java index 88dbafbdd..65d22d62c 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/AwsExpectedBucketOwnerCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/AwsExpectedBucketOwnerCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/AwsHardcodedRegionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/AwsHardcodedRegionCheck.java index a9c55839f..57cfc5ee5 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/AwsHardcodedRegionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/AwsHardcodedRegionCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/AwsLambdaClientInstantiationCheck.java b/python-checks/src/main/java/org/sonar/python/checks/AwsLambdaClientInstantiationCheck.java index 06713fddb..ac8777dd5 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/AwsLambdaClientInstantiationCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/AwsLambdaClientInstantiationCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/AwsLambdaCrossCallCheck.java b/python-checks/src/main/java/org/sonar/python/checks/AwsLambdaCrossCallCheck.java index 34ea0b194..29c502451 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/AwsLambdaCrossCallCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/AwsLambdaCrossCallCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/AwsLambdaReservedEnvironmentVariableCheck.java b/python-checks/src/main/java/org/sonar/python/checks/AwsLambdaReservedEnvironmentVariableCheck.java index 27e87e25c..8b93de855 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/AwsLambdaReservedEnvironmentVariableCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/AwsLambdaReservedEnvironmentVariableCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/AwsLambdaReturnValueAreSerializableCheck.java b/python-checks/src/main/java/org/sonar/python/checks/AwsLambdaReturnValueAreSerializableCheck.java index b0674fe92..dfb4c1c80 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/AwsLambdaReturnValueAreSerializableCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/AwsLambdaReturnValueAreSerializableCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/AwsLambdaTmpCleanupCheck.java b/python-checks/src/main/java/org/sonar/python/checks/AwsLambdaTmpCleanupCheck.java index 2fa10a124..730a4233c 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/AwsLambdaTmpCleanupCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/AwsLambdaTmpCleanupCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/AwsLongTermAccessKeysCheck.java b/python-checks/src/main/java/org/sonar/python/checks/AwsLongTermAccessKeysCheck.java index 00d7889e3..cffe7e0ba 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/AwsLongTermAccessKeysCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/AwsLongTermAccessKeysCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/AwsMissingPaginationCheck.java b/python-checks/src/main/java/org/sonar/python/checks/AwsMissingPaginationCheck.java index ee24801c6..482538eba 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/AwsMissingPaginationCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/AwsMissingPaginationCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/AwsWaitersInsteadOfCustomPollingCheck.java b/python-checks/src/main/java/org/sonar/python/checks/AwsWaitersInsteadOfCustomPollingCheck.java index a704f8c30..8330066ca 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/AwsWaitersInsteadOfCustomPollingCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/AwsWaitersInsteadOfCustomPollingCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/BackslashInStringCheck.java b/python-checks/src/main/java/org/sonar/python/checks/BackslashInStringCheck.java index 63c5fc607..f0dd40330 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/BackslashInStringCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/BackslashInStringCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/BackticksUsageCheck.java b/python-checks/src/main/java/org/sonar/python/checks/BackticksUsageCheck.java index 39389e794..88d8b7125 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/BackticksUsageCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/BackticksUsageCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/BareRaiseInFinallyCheck.java b/python-checks/src/main/java/org/sonar/python/checks/BareRaiseInFinallyCheck.java index 8ffcc2cea..6ab547a02 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/BareRaiseInFinallyCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/BareRaiseInFinallyCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/BindToAllNetworkInterfacesCheck.java b/python-checks/src/main/java/org/sonar/python/checks/BindToAllNetworkInterfacesCheck.java index 542c6856a..bdc5f1e10 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/BindToAllNetworkInterfacesCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/BindToAllNetworkInterfacesCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/BooleanCheckNotInvertedCheck.java b/python-checks/src/main/java/org/sonar/python/checks/BooleanCheckNotInvertedCheck.java index 84b4a714d..0c732194e 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/BooleanCheckNotInvertedCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/BooleanCheckNotInvertedCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/BooleanExpressionInExceptCheck.java b/python-checks/src/main/java/org/sonar/python/checks/BooleanExpressionInExceptCheck.java index ec195c476..22b88dabb 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/BooleanExpressionInExceptCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/BooleanExpressionInExceptCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/BreakContinueOutsideLoopCheck.java b/python-checks/src/main/java/org/sonar/python/checks/BreakContinueOutsideLoopCheck.java index 8f8a6d4e8..d3ec578e5 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/BreakContinueOutsideLoopCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/BreakContinueOutsideLoopCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/BuiltinGenericsOverTypingModuleCheck.java b/python-checks/src/main/java/org/sonar/python/checks/BuiltinGenericsOverTypingModuleCheck.java index 8fa6cca16..75bb50b15 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/BuiltinGenericsOverTypingModuleCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/BuiltinGenericsOverTypingModuleCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/BuiltinShadowingAssignmentCheck.java b/python-checks/src/main/java/org/sonar/python/checks/BuiltinShadowingAssignmentCheck.java index b9df7c868..f5e098074 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/BuiltinShadowingAssignmentCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/BuiltinShadowingAssignmentCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/BusyWaitingInAsyncCheck.java b/python-checks/src/main/java/org/sonar/python/checks/BusyWaitingInAsyncCheck.java index 0cb5a143c..c42ef13c1 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/BusyWaitingInAsyncCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/BusyWaitingInAsyncCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/CancellationReraisedInAsyncCheck.java b/python-checks/src/main/java/org/sonar/python/checks/CancellationReraisedInAsyncCheck.java index 9ada400d9..2c3c77c04 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/CancellationReraisedInAsyncCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/CancellationReraisedInAsyncCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/CancellationScopeNoCheckpointCheck.java b/python-checks/src/main/java/org/sonar/python/checks/CancellationScopeNoCheckpointCheck.java index ffec6922a..3d457ee37 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/CancellationScopeNoCheckpointCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/CancellationScopeNoCheckpointCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/CaughtExceptionsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/CaughtExceptionsCheck.java index 2de88606a..e63cc68f0 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/CaughtExceptionsCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/CaughtExceptionsCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/ChangeMethodContractCheck.java b/python-checks/src/main/java/org/sonar/python/checks/ChangeMethodContractCheck.java index c660005b8..71cd98c13 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/ChangeMethodContractCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/ChangeMethodContractCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/ChildAndParentExceptionCaughtCheck.java b/python-checks/src/main/java/org/sonar/python/checks/ChildAndParentExceptionCaughtCheck.java index 98b3b6297..afd2d432a 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/ChildAndParentExceptionCaughtCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/ChildAndParentExceptionCaughtCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/ChildRouterBeforeParentRegistrationCheck.java b/python-checks/src/main/java/org/sonar/python/checks/ChildRouterBeforeParentRegistrationCheck.java index ccbad390a..d6c236e04 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/ChildRouterBeforeParentRegistrationCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/ChildRouterBeforeParentRegistrationCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/CipherBlockChainingCheck.java b/python-checks/src/main/java/org/sonar/python/checks/CipherBlockChainingCheck.java index 97d1184cf..d038fe96b 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/CipherBlockChainingCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/CipherBlockChainingCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/ClassComplexityCheck.java b/python-checks/src/main/java/org/sonar/python/checks/ClassComplexityCheck.java index 99ab78a15..433ec6219 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/ClassComplexityCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/ClassComplexityCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/ClassFieldDefinedMultipleTimesCheck.java b/python-checks/src/main/java/org/sonar/python/checks/ClassFieldDefinedMultipleTimesCheck.java index e7bd468b6..eab3dff8b 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/ClassFieldDefinedMultipleTimesCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/ClassFieldDefinedMultipleTimesCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/ClassMethodFirstArgumentNameCheck.java b/python-checks/src/main/java/org/sonar/python/checks/ClassMethodFirstArgumentNameCheck.java index 4cd3ab25b..cd6f86fda 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/ClassMethodFirstArgumentNameCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/ClassMethodFirstArgumentNameCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/ClassNameCheck.java b/python-checks/src/main/java/org/sonar/python/checks/ClassNameCheck.java index 377c1c83b..19910cc06 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/ClassNameCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/ClassNameCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/CognitiveComplexityFunctionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/CognitiveComplexityFunctionCheck.java index 7a431c2be..37953c23d 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/CognitiveComplexityFunctionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/CognitiveComplexityFunctionCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/CollapsibleIfStatementsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/CollapsibleIfStatementsCheck.java index c20c2b0b2..fc204fc40 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/CollapsibleIfStatementsCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/CollapsibleIfStatementsCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/CollectionCreationWrappedInConstructorCheck.java b/python-checks/src/main/java/org/sonar/python/checks/CollectionCreationWrappedInConstructorCheck.java index e9ff371d2..824e7d1af 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/CollectionCreationWrappedInConstructorCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/CollectionCreationWrappedInConstructorCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/CollectionLengthComparisonCheck.java b/python-checks/src/main/java/org/sonar/python/checks/CollectionLengthComparisonCheck.java index 8c4e0fda7..946dadbaf 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/CollectionLengthComparisonCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/CollectionLengthComparisonCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/CommentRegularExpressionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/CommentRegularExpressionCheck.java index ebf8b5690..998672ca3 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/CommentRegularExpressionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/CommentRegularExpressionCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/CommentedCodeCheck.java b/python-checks/src/main/java/org/sonar/python/checks/CommentedCodeCheck.java index 69724a792..0b7e493a2 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/CommentedCodeCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/CommentedCodeCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/ComparisonToNoneCheck.java b/python-checks/src/main/java/org/sonar/python/checks/ComparisonToNoneCheck.java index c304892f3..3bdf18c6a 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/ComparisonToNoneCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/ComparisonToNoneCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/CompressionModulesFromNamespaceCheck.java b/python-checks/src/main/java/org/sonar/python/checks/CompressionModulesFromNamespaceCheck.java index a737fc084..b2aeee661 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/CompressionModulesFromNamespaceCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/CompressionModulesFromNamespaceCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/ConfusingTypeCheckingCheck.java b/python-checks/src/main/java/org/sonar/python/checks/ConfusingTypeCheckingCheck.java index 7421d049a..f755cada5 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/ConfusingTypeCheckingCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/ConfusingTypeCheckingCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/ConfusingWalrusCheck.java b/python-checks/src/main/java/org/sonar/python/checks/ConfusingWalrusCheck.java index b867557f3..1893496c4 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/ConfusingWalrusCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/ConfusingWalrusCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/ConsistentReturnCheck.java b/python-checks/src/main/java/org/sonar/python/checks/ConsistentReturnCheck.java index ec2db7bed..76d5ebb68 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/ConsistentReturnCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/ConsistentReturnCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/ConstantConditionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/ConstantConditionCheck.java index 161f97658..2d265ec02 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/ConstantConditionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/ConstantConditionCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/ConstantValueDictComprehensionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/ConstantValueDictComprehensionCheck.java index 17eb24edd..c14c880e3 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/ConstantValueDictComprehensionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/ConstantValueDictComprehensionCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/ControlFlowInTaskGroupCheck.java b/python-checks/src/main/java/org/sonar/python/checks/ControlFlowInTaskGroupCheck.java index 75329c100..050c2e2b3 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/ControlFlowInTaskGroupCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/ControlFlowInTaskGroupCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/CorsMiddlewareOrderingCheck.java b/python-checks/src/main/java/org/sonar/python/checks/CorsMiddlewareOrderingCheck.java index 988a3dc72..eadfa8e24 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/CorsMiddlewareOrderingCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/CorsMiddlewareOrderingCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/DbNoPasswordCheck.java b/python-checks/src/main/java/org/sonar/python/checks/DbNoPasswordCheck.java index b2b7534f8..153447135 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/DbNoPasswordCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/DbNoPasswordCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/DeadStoreCheck.java b/python-checks/src/main/java/org/sonar/python/checks/DeadStoreCheck.java index 5e112e0f0..b6aaa353b 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/DeadStoreCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/DeadStoreCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/DefaultFactoryArgumentCheck.java b/python-checks/src/main/java/org/sonar/python/checks/DefaultFactoryArgumentCheck.java index d84e151b1..990847260 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/DefaultFactoryArgumentCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/DefaultFactoryArgumentCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/DeprecatedNumpyTypesCheck.java b/python-checks/src/main/java/org/sonar/python/checks/DeprecatedNumpyTypesCheck.java index 41c2383a0..b4e1aa26b 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/DeprecatedNumpyTypesCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/DeprecatedNumpyTypesCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/DictKeysMembershipTestCheck.java b/python-checks/src/main/java/org/sonar/python/checks/DictKeysMembershipTestCheck.java index 09048c832..01a6bc9fd 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/DictKeysMembershipTestCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/DictKeysMembershipTestCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/DictionaryDuplicateKeyCheck.java b/python-checks/src/main/java/org/sonar/python/checks/DictionaryDuplicateKeyCheck.java index 75c216985..6d622ecc4 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/DictionaryDuplicateKeyCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/DictionaryDuplicateKeyCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/DictionaryStaticKeyCheck.java b/python-checks/src/main/java/org/sonar/python/checks/DictionaryStaticKeyCheck.java index 2aafc43bf..a787bae10 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/DictionaryStaticKeyCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/DictionaryStaticKeyCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/DirectTypeComparisonCheck.java b/python-checks/src/main/java/org/sonar/python/checks/DirectTypeComparisonCheck.java index deb3a1564..adb3ba25c 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/DirectTypeComparisonCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/DirectTypeComparisonCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/DjangoNonDictSerializationCheck.java b/python-checks/src/main/java/org/sonar/python/checks/DjangoNonDictSerializationCheck.java index 1bc5fc7d9..27254a9cc 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/DjangoNonDictSerializationCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/DjangoNonDictSerializationCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/DjangoRenderContextCheck.java b/python-checks/src/main/java/org/sonar/python/checks/DjangoRenderContextCheck.java index b78f77e3d..fc95de644 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/DjangoRenderContextCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/DjangoRenderContextCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/DoublePrefixOperatorCheck.java b/python-checks/src/main/java/org/sonar/python/checks/DoublePrefixOperatorCheck.java index 7ea28d62e..4a2fbd515 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/DoublePrefixOperatorCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/DoublePrefixOperatorCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/DuplicateArgumentCheck.java b/python-checks/src/main/java/org/sonar/python/checks/DuplicateArgumentCheck.java index 309d6a421..bd41c9575 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/DuplicateArgumentCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/DuplicateArgumentCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/DuplicateBaseClassCheck.java b/python-checks/src/main/java/org/sonar/python/checks/DuplicateBaseClassCheck.java index 007bd0687..d49223bcb 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/DuplicateBaseClassCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/DuplicateBaseClassCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/DuplicatedMethodFieldNamesCheck.java b/python-checks/src/main/java/org/sonar/python/checks/DuplicatedMethodFieldNamesCheck.java index b09a8ab93..5974290dc 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/DuplicatedMethodFieldNamesCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/DuplicatedMethodFieldNamesCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/DuplicatedMethodImplementationCheck.java b/python-checks/src/main/java/org/sonar/python/checks/DuplicatedMethodImplementationCheck.java index da330dda2..c5e4ea45b 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/DuplicatedMethodImplementationCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/DuplicatedMethodImplementationCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/EinopsSyntaxCheck.java b/python-checks/src/main/java/org/sonar/python/checks/EinopsSyntaxCheck.java index baf45b890..3c0b66e14 100755 --- a/python-checks/src/main/java/org/sonar/python/checks/EinopsSyntaxCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/EinopsSyntaxCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/ElseAfterLoopsWithoutBreakCheck.java b/python-checks/src/main/java/org/sonar/python/checks/ElseAfterLoopsWithoutBreakCheck.java index be37249f5..23f6796cf 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/ElseAfterLoopsWithoutBreakCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/ElseAfterLoopsWithoutBreakCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/EmptyCollectionConstructorCheck.java b/python-checks/src/main/java/org/sonar/python/checks/EmptyCollectionConstructorCheck.java index 3cd6ce7f1..7b754ea31 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/EmptyCollectionConstructorCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/EmptyCollectionConstructorCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/EmptyFunctionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/EmptyFunctionCheck.java index c9a68cb5d..6c03821d1 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/EmptyFunctionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/EmptyFunctionCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/EmptyNestedBlockCheck.java b/python-checks/src/main/java/org/sonar/python/checks/EmptyNestedBlockCheck.java index 4958ed63f..ee4f608de 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/EmptyNestedBlockCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/EmptyNestedBlockCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/ExceptRethrowingCheck.java b/python-checks/src/main/java/org/sonar/python/checks/ExceptRethrowingCheck.java index bfa77475d..88d2dc338 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/ExceptRethrowingCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/ExceptRethrowingCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/ExceptionCauseTypeCheck.java b/python-checks/src/main/java/org/sonar/python/checks/ExceptionCauseTypeCheck.java index 209b61a69..e34a290b0 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/ExceptionCauseTypeCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/ExceptionCauseTypeCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/ExceptionGroupCheck.java b/python-checks/src/main/java/org/sonar/python/checks/ExceptionGroupCheck.java index d346f6dd2..111a36b9a 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/ExceptionGroupCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/ExceptionGroupCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/ExceptionNotThrownCheck.java b/python-checks/src/main/java/org/sonar/python/checks/ExceptionNotThrownCheck.java index 3a5b5052d..25d0be483 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/ExceptionNotThrownCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/ExceptionNotThrownCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/ExceptionSuperClassDeclarationCheck.java b/python-checks/src/main/java/org/sonar/python/checks/ExceptionSuperClassDeclarationCheck.java index 19b8b2620..b249ba8ff 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/ExceptionSuperClassDeclarationCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/ExceptionSuperClassDeclarationCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/ExecStatementUsageCheck.java b/python-checks/src/main/java/org/sonar/python/checks/ExecStatementUsageCheck.java index 1d31b239b..777d48541 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/ExecStatementUsageCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/ExecStatementUsageCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/ExitHasBadArgumentsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/ExitHasBadArgumentsCheck.java index 49db585c4..ac1d1fb03 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/ExitHasBadArgumentsCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/ExitHasBadArgumentsCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/FStringNestingLevelCheck.java b/python-checks/src/main/java/org/sonar/python/checks/FStringNestingLevelCheck.java index 1534ad301..e031373cb 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/FStringNestingLevelCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/FStringNestingLevelCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/FastAPIDependencyAnnotatedCheck.java b/python-checks/src/main/java/org/sonar/python/checks/FastAPIDependencyAnnotatedCheck.java index a2bc11c3c..01a1d7d28 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/FastAPIDependencyAnnotatedCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/FastAPIDependencyAnnotatedCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/FastAPIFileUploadFormCheck.java b/python-checks/src/main/java/org/sonar/python/checks/FastAPIFileUploadFormCheck.java index 797a74f31..61aea9cae 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/FastAPIFileUploadFormCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/FastAPIFileUploadFormCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/FastAPIGenericRouteDecoratorCheck.java b/python-checks/src/main/java/org/sonar/python/checks/FastAPIGenericRouteDecoratorCheck.java index 52198130a..49dadb855 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/FastAPIGenericRouteDecoratorCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/FastAPIGenericRouteDecoratorCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/FastAPIHTTPExceptionDocumentedCheck.java b/python-checks/src/main/java/org/sonar/python/checks/FastAPIHTTPExceptionDocumentedCheck.java index 718b04c65..799292700 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/FastAPIHTTPExceptionDocumentedCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/FastAPIHTTPExceptionDocumentedCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/FastAPIPathParametersCheck.java b/python-checks/src/main/java/org/sonar/python/checks/FastAPIPathParametersCheck.java index 8c23ff1ca..6d9e8bde3 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/FastAPIPathParametersCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/FastAPIPathParametersCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/FastAPIRedundantResponseModelCheck.java b/python-checks/src/main/java/org/sonar/python/checks/FastAPIRedundantResponseModelCheck.java index a18b2305c..264d82c4e 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/FastAPIRedundantResponseModelCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/FastAPIRedundantResponseModelCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/FastApiImportStringCheck.java b/python-checks/src/main/java/org/sonar/python/checks/FastApiImportStringCheck.java index ab3858e62..521207e9b 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/FastApiImportStringCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/FastApiImportStringCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/FieldDuplicatesClassNameCheck.java b/python-checks/src/main/java/org/sonar/python/checks/FieldDuplicatesClassNameCheck.java index 6e264b317..91a1816f5 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/FieldDuplicatesClassNameCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/FieldDuplicatesClassNameCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/FieldNameCheck.java b/python-checks/src/main/java/org/sonar/python/checks/FieldNameCheck.java index 151cf7305..119138d0d 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/FieldNameCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/FieldNameCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/FileComplexityCheck.java b/python-checks/src/main/java/org/sonar/python/checks/FileComplexityCheck.java index 2fa51e2d1..4921c09a5 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/FileComplexityCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/FileComplexityCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/FileHeaderCopyrightCheck.java b/python-checks/src/main/java/org/sonar/python/checks/FileHeaderCopyrightCheck.java index c585c5d74..419fa62fe 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/FileHeaderCopyrightCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/FileHeaderCopyrightCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/FilePermissionsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/FilePermissionsCheck.java index e79b2e746..da85127e0 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/FilePermissionsCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/FilePermissionsCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/FixmeCommentCheck.java b/python-checks/src/main/java/org/sonar/python/checks/FixmeCommentCheck.java index 0bf4f13df..23035be23 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/FixmeCommentCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/FixmeCommentCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/FlaskErrorHandlerStatusCheck.java b/python-checks/src/main/java/org/sonar/python/checks/FlaskErrorHandlerStatusCheck.java index c74b1e64f..0af449eb9 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/FlaskErrorHandlerStatusCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/FlaskErrorHandlerStatusCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/FlaskHardCodedJWTSecretKeyCheck.java b/python-checks/src/main/java/org/sonar/python/checks/FlaskHardCodedJWTSecretKeyCheck.java index f7a0b90f2..34015ff5d 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/FlaskHardCodedJWTSecretKeyCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/FlaskHardCodedJWTSecretKeyCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/FlaskHardCodedSecret.java b/python-checks/src/main/java/org/sonar/python/checks/FlaskHardCodedSecret.java index 99bb75615..d32409675 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/FlaskHardCodedSecret.java +++ b/python-checks/src/main/java/org/sonar/python/checks/FlaskHardCodedSecret.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/FlaskHardCodedSecretKeyCheck.java b/python-checks/src/main/java/org/sonar/python/checks/FlaskHardCodedSecretKeyCheck.java index 9d85c2cc4..cfefc2084 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/FlaskHardCodedSecretKeyCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/FlaskHardCodedSecretKeyCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/FlaskHeadersDictAccessCheck.java b/python-checks/src/main/java/org/sonar/python/checks/FlaskHeadersDictAccessCheck.java index 2eafe1554..e8cad03c8 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/FlaskHeadersDictAccessCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/FlaskHeadersDictAccessCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/FlaskPostWithQueryParameterCheck.java b/python-checks/src/main/java/org/sonar/python/checks/FlaskPostWithQueryParameterCheck.java index 59d817257..c2769c633 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/FlaskPostWithQueryParameterCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/FlaskPostWithQueryParameterCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/FlaskPreprocessRequestCheck.java b/python-checks/src/main/java/org/sonar/python/checks/FlaskPreprocessRequestCheck.java index b22964776..4d6c83dc7 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/FlaskPreprocessRequestCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/FlaskPreprocessRequestCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/FlaskRouteMethodsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/FlaskRouteMethodsCheck.java index 5c58c00ad..1f63affec 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/FlaskRouteMethodsCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/FlaskRouteMethodsCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/FlaskSendFileMimeTypeCheck.java b/python-checks/src/main/java/org/sonar/python/checks/FlaskSendFileMimeTypeCheck.java index e77b67d67..a463f1f3e 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/FlaskSendFileMimeTypeCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/FlaskSendFileMimeTypeCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/FlaskViewDecoratorCheck.java b/python-checks/src/main/java/org/sonar/python/checks/FlaskViewDecoratorCheck.java index e49deacc2..723c72cdd 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/FlaskViewDecoratorCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/FlaskViewDecoratorCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/FloatingPointEqualityCheck.java b/python-checks/src/main/java/org/sonar/python/checks/FloatingPointEqualityCheck.java index 4112ed484..01f60f8d1 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/FloatingPointEqualityCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/FloatingPointEqualityCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/FunctionComplexityCheck.java b/python-checks/src/main/java/org/sonar/python/checks/FunctionComplexityCheck.java index dac8b775b..7041724b7 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/FunctionComplexityCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/FunctionComplexityCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/FunctionNameCheck.java b/python-checks/src/main/java/org/sonar/python/checks/FunctionNameCheck.java index ce6f37030..c37c98f0b 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/FunctionNameCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/FunctionNameCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/FunctionReturnTypeCheck.java b/python-checks/src/main/java/org/sonar/python/checks/FunctionReturnTypeCheck.java index 3a8af277d..3410cfdd1 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/FunctionReturnTypeCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/FunctionReturnTypeCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/FunctionUsingLoopVariableCheck.java b/python-checks/src/main/java/org/sonar/python/checks/FunctionUsingLoopVariableCheck.java index c6991f841..c1593147c 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/FunctionUsingLoopVariableCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/FunctionUsingLoopVariableCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/GenericClassTypeParameterCheck.java b/python-checks/src/main/java/org/sonar/python/checks/GenericClassTypeParameterCheck.java index 70da79648..cb5bb03ca 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/GenericClassTypeParameterCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/GenericClassTypeParameterCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/GenericExceptionRaisedCheck.java b/python-checks/src/main/java/org/sonar/python/checks/GenericExceptionRaisedCheck.java index 03032b30f..a35ec6133 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/GenericExceptionRaisedCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/GenericExceptionRaisedCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/GenericFunctionTypeParameterCheck.java b/python-checks/src/main/java/org/sonar/python/checks/GenericFunctionTypeParameterCheck.java index 8bb0a24e6..617e6f06e 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/GenericFunctionTypeParameterCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/GenericFunctionTypeParameterCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/GenericTypeStatementCheck.java b/python-checks/src/main/java/org/sonar/python/checks/GenericTypeStatementCheck.java index a434a3a48..458296529 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/GenericTypeStatementCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/GenericTypeStatementCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/GenericTypeWithoutArgumentCheck.java b/python-checks/src/main/java/org/sonar/python/checks/GenericTypeWithoutArgumentCheck.java index a3177033d..eba3c13fb 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/GenericTypeWithoutArgumentCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/GenericTypeWithoutArgumentCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/GraphQLDenialOfServiceCheck.java b/python-checks/src/main/java/org/sonar/python/checks/GraphQLDenialOfServiceCheck.java index c40a31559..21c83e725 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/GraphQLDenialOfServiceCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/GraphQLDenialOfServiceCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/HardcodedCredentialsCallCheck.java b/python-checks/src/main/java/org/sonar/python/checks/HardcodedCredentialsCallCheck.java index 960417fac..2c9cc77cc 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/HardcodedCredentialsCallCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/HardcodedCredentialsCallCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/HardcodedIPCheck.java b/python-checks/src/main/java/org/sonar/python/checks/HardcodedIPCheck.java index 643f055eb..f9c569b7e 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/HardcodedIPCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/HardcodedIPCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/HashMethodCheck.java b/python-checks/src/main/java/org/sonar/python/checks/HashMethodCheck.java index 647bd4e2d..da4a1aa05 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/HashMethodCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/HashMethodCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/HttpNoContentNonEmptyBodyCheck.java b/python-checks/src/main/java/org/sonar/python/checks/HttpNoContentNonEmptyBodyCheck.java index 2b4107307..f25a6522f 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/HttpNoContentNonEmptyBodyCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/HttpNoContentNonEmptyBodyCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/IdenticalExpressionOnBinaryOperatorCheck.java b/python-checks/src/main/java/org/sonar/python/checks/IdenticalExpressionOnBinaryOperatorCheck.java index 796aa7803..e1ae8db69 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/IdenticalExpressionOnBinaryOperatorCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/IdenticalExpressionOnBinaryOperatorCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/IdentityComparisonWithCachedTypesCheck.java b/python-checks/src/main/java/org/sonar/python/checks/IdentityComparisonWithCachedTypesCheck.java index 2d2a0efa4..25633144a 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/IdentityComparisonWithCachedTypesCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/IdentityComparisonWithCachedTypesCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/IdentityComparisonWithNewObjectCheck.java b/python-checks/src/main/java/org/sonar/python/checks/IdentityComparisonWithNewObjectCheck.java index 4f3d8b421..126b48c50 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/IdentityComparisonWithNewObjectCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/IdentityComparisonWithNewObjectCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/IgnoredParameterCheck.java b/python-checks/src/main/java/org/sonar/python/checks/IgnoredParameterCheck.java index 57128305e..26ced29a4 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/IgnoredParameterCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/IgnoredParameterCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/IgnoredPureOperationsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/IgnoredPureOperationsCheck.java index dec50d4b8..8a616d028 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/IgnoredPureOperationsCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/IgnoredPureOperationsCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/IgnoredSystemExitCheck.java b/python-checks/src/main/java/org/sonar/python/checks/IgnoredSystemExitCheck.java index bbb984d2c..e67d4af39 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/IgnoredSystemExitCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/IgnoredSystemExitCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/ImplicitStringConcatenationCheck.java b/python-checks/src/main/java/org/sonar/python/checks/ImplicitStringConcatenationCheck.java index 0792d6af9..0e1a010b2 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/ImplicitStringConcatenationCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/ImplicitStringConcatenationCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/IncompatibleOperands.java b/python-checks/src/main/java/org/sonar/python/checks/IncompatibleOperands.java index 7f63caa14..0f180beff 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/IncompatibleOperands.java +++ b/python-checks/src/main/java/org/sonar/python/checks/IncompatibleOperands.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/IncompatibleOperandsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/IncompatibleOperandsCheck.java index f87696483..0c104dd69 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/IncompatibleOperandsCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/IncompatibleOperandsCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/InconsistentTupleReturnCheck.java b/python-checks/src/main/java/org/sonar/python/checks/InconsistentTupleReturnCheck.java index ab2c7548e..d09ff83d7 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/InconsistentTupleReturnCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/InconsistentTupleReturnCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/InconsistentTypeHintCheck.java b/python-checks/src/main/java/org/sonar/python/checks/InconsistentTypeHintCheck.java index 909211ad9..aff40d081 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/InconsistentTypeHintCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/InconsistentTypeHintCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/IncorrectExceptionTypeCheck.java b/python-checks/src/main/java/org/sonar/python/checks/IncorrectExceptionTypeCheck.java index 761690491..84f3899ea 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/IncorrectExceptionTypeCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/IncorrectExceptionTypeCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/IncorrectParameterDatetimeConstructorsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/IncorrectParameterDatetimeConstructorsCheck.java index 6433e1d85..df8df7cba 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/IncorrectParameterDatetimeConstructorsCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/IncorrectParameterDatetimeConstructorsCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/IndexMethodCheck.java b/python-checks/src/main/java/org/sonar/python/checks/IndexMethodCheck.java index a92424635..f1ef7d4ff 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/IndexMethodCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/IndexMethodCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/InefficientDictIterationCheck.java b/python-checks/src/main/java/org/sonar/python/checks/InefficientDictIterationCheck.java index b3b116adb..bc8760238 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/InefficientDictIterationCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/InefficientDictIterationCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/InequalityUsageCheck.java b/python-checks/src/main/java/org/sonar/python/checks/InequalityUsageCheck.java index 9b35cf7b5..1e2b980a0 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/InequalityUsageCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/InequalityUsageCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/InfiniteRecursionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/InfiniteRecursionCheck.java index 459a35ec9..aaef73b43 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/InfiniteRecursionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/InfiniteRecursionCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/InitReturnsValueCheck.java b/python-checks/src/main/java/org/sonar/python/checks/InitReturnsValueCheck.java index 4c56232d2..5ca3fd749 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/InitReturnsValueCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/InitReturnsValueCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/InputInAsyncCheck.java b/python-checks/src/main/java/org/sonar/python/checks/InputInAsyncCheck.java index be5c56cd2..aec5d1c8b 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/InputInAsyncCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/InputInAsyncCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/InstanceAndClassMethodsAtLeastOnePositionalCheck.java b/python-checks/src/main/java/org/sonar/python/checks/InstanceAndClassMethodsAtLeastOnePositionalCheck.java index 586cf5607..d1651a097 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/InstanceAndClassMethodsAtLeastOnePositionalCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/InstanceAndClassMethodsAtLeastOnePositionalCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/InstanceMethodSelfAsFirstCheck.java b/python-checks/src/main/java/org/sonar/python/checks/InstanceMethodSelfAsFirstCheck.java index 3e7d92aab..22ff1a3e6 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/InstanceMethodSelfAsFirstCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/InstanceMethodSelfAsFirstCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/InvalidOpenModeCheck.java b/python-checks/src/main/java/org/sonar/python/checks/InvalidOpenModeCheck.java index c7084c51e..9537e96da 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/InvalidOpenModeCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/InvalidOpenModeCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/InvariantReturnCheck.java b/python-checks/src/main/java/org/sonar/python/checks/InvariantReturnCheck.java index c51290b48..476e0b2ea 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/InvariantReturnCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/InvariantReturnCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/IsCloseAbsTolCheck.java b/python-checks/src/main/java/org/sonar/python/checks/IsCloseAbsTolCheck.java index acf0e2a11..b0544b1d6 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/IsCloseAbsTolCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/IsCloseAbsTolCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/ItemOperationsType.java b/python-checks/src/main/java/org/sonar/python/checks/ItemOperationsType.java index 57a4f9c59..9382ee164 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/ItemOperationsType.java +++ b/python-checks/src/main/java/org/sonar/python/checks/ItemOperationsType.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/ItemOperationsTypeCheck.java b/python-checks/src/main/java/org/sonar/python/checks/ItemOperationsTypeCheck.java index 8c348632f..b7b0abff8 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/ItemOperationsTypeCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/ItemOperationsTypeCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/IterMethodReturnTypeCheck.java b/python-checks/src/main/java/org/sonar/python/checks/IterMethodReturnTypeCheck.java index 2ebc62976..24a43eec9 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/IterMethodReturnTypeCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/IterMethodReturnTypeCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/IterationOnNonIterable.java b/python-checks/src/main/java/org/sonar/python/checks/IterationOnNonIterable.java index e447be0e8..8de74d315 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/IterationOnNonIterable.java +++ b/python-checks/src/main/java/org/sonar/python/checks/IterationOnNonIterable.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/IterationOnNonIterableCheck.java b/python-checks/src/main/java/org/sonar/python/checks/IterationOnNonIterableCheck.java index c1d704bf0..f511d4aa0 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/IterationOnNonIterableCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/IterationOnNonIterableCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/JumpInFinallyCheck.java b/python-checks/src/main/java/org/sonar/python/checks/JumpInFinallyCheck.java index 007a281e8..dcae33a53 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/JumpInFinallyCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/JumpInFinallyCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/JwtVerificationCheck.java b/python-checks/src/main/java/org/sonar/python/checks/JwtVerificationCheck.java index 9314dc64f..ae5c6d7b6 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/JwtVerificationCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/JwtVerificationCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/LambdaAssignmentCheck.java b/python-checks/src/main/java/org/sonar/python/checks/LambdaAssignmentCheck.java index d33d27355..f6827c8e3 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/LambdaAssignmentCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/LambdaAssignmentCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/LdapAuthenticationCheck.java b/python-checks/src/main/java/org/sonar/python/checks/LdapAuthenticationCheck.java index e66b99e08..192b697fe 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/LdapAuthenticationCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/LdapAuthenticationCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/LineLengthCheck.java b/python-checks/src/main/java/org/sonar/python/checks/LineLengthCheck.java index 958ebcd2f..63aa019df 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/LineLengthCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/LineLengthCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/LocalVariableAndParameterNameConventionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/LocalVariableAndParameterNameConventionCheck.java index 7d00d3cce..b56168f92 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/LocalVariableAndParameterNameConventionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/LocalVariableAndParameterNameConventionCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/LongIntegerWithLowercaseSuffixUsageCheck.java b/python-checks/src/main/java/org/sonar/python/checks/LongIntegerWithLowercaseSuffixUsageCheck.java index 36bbe6895..0d678c1fc 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/LongIntegerWithLowercaseSuffixUsageCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/LongIntegerWithLowercaseSuffixUsageCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/LoopExecutingAtMostOnceCheck.java b/python-checks/src/main/java/org/sonar/python/checks/LoopExecutingAtMostOnceCheck.java index 9568747b9..d0eae3db3 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/LoopExecutingAtMostOnceCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/LoopExecutingAtMostOnceCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/LoopOverDictKeyValuesCheck.java b/python-checks/src/main/java/org/sonar/python/checks/LoopOverDictKeyValuesCheck.java index 6151ed1d4..69253e72d 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/LoopOverDictKeyValuesCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/LoopOverDictKeyValuesCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/MandatoryFunctionParameterTypeHintCheck.java b/python-checks/src/main/java/org/sonar/python/checks/MandatoryFunctionParameterTypeHintCheck.java index facec6d69..cf9879bfe 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/MandatoryFunctionParameterTypeHintCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/MandatoryFunctionParameterTypeHintCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/MandatoryFunctionReturnTypeHintCheck.java b/python-checks/src/main/java/org/sonar/python/checks/MandatoryFunctionReturnTypeHintCheck.java index 72a749c4e..0b4d11880 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/MandatoryFunctionReturnTypeHintCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/MandatoryFunctionReturnTypeHintCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/MembershipTestSupportCheck.java b/python-checks/src/main/java/org/sonar/python/checks/MembershipTestSupportCheck.java index 07a48e4ef..8c9878d8f 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/MembershipTestSupportCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/MembershipTestSupportCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/MethodNameCheck.java b/python-checks/src/main/java/org/sonar/python/checks/MethodNameCheck.java index a48f345b3..c9a5b77c5 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/MethodNameCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/MethodNameCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/MethodShouldBeStaticCheck.java b/python-checks/src/main/java/org/sonar/python/checks/MethodShouldBeStaticCheck.java index 93710c836..37fc66e8d 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/MethodShouldBeStaticCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/MethodShouldBeStaticCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/MissingDocstringCheck.java b/python-checks/src/main/java/org/sonar/python/checks/MissingDocstringCheck.java index 85f499bfc..aec748319 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/MissingDocstringCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/MissingDocstringCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/MissingHyperParameterCheck.java b/python-checks/src/main/java/org/sonar/python/checks/MissingHyperParameterCheck.java index 9ec7f34ad..c0fd33c2d 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/MissingHyperParameterCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/MissingHyperParameterCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/MissingNewlineAtEndOfFileCheck.java b/python-checks/src/main/java/org/sonar/python/checks/MissingNewlineAtEndOfFileCheck.java index 3b870169e..d10a82336 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/MissingNewlineAtEndOfFileCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/MissingNewlineAtEndOfFileCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/ModifiedParameterValueCheck.java b/python-checks/src/main/java/org/sonar/python/checks/ModifiedParameterValueCheck.java index e2795b6d9..c380e7de1 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/ModifiedParameterValueCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/ModifiedParameterValueCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/ModuleNameCheck.java b/python-checks/src/main/java/org/sonar/python/checks/ModuleNameCheck.java index 3a2970d6d..ef33d749c 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/ModuleNameCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/ModuleNameCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/MutableDefaultValueCheck.java b/python-checks/src/main/java/org/sonar/python/checks/MutableDefaultValueCheck.java index dacb3e2cd..c521dfb3c 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/MutableDefaultValueCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/MutableDefaultValueCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/NeedlessPassCheck.java b/python-checks/src/main/java/org/sonar/python/checks/NeedlessPassCheck.java index 1f7d272fe..01e52840a 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/NeedlessPassCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/NeedlessPassCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/NestedCollectionsCreationCheck.java b/python-checks/src/main/java/org/sonar/python/checks/NestedCollectionsCreationCheck.java index 0dfbc94ba..555437d67 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/NestedCollectionsCreationCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/NestedCollectionsCreationCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/NestedConditionalExpressionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/NestedConditionalExpressionCheck.java index c23d88598..c0418b382 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/NestedConditionalExpressionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/NestedConditionalExpressionCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/NestedControlFlowDepthCheck.java b/python-checks/src/main/java/org/sonar/python/checks/NestedControlFlowDepthCheck.java index 4183f97ee..a2b39f3c2 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/NestedControlFlowDepthCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/NestedControlFlowDepthCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/NestedLoopVariableReuseCheck.java b/python-checks/src/main/java/org/sonar/python/checks/NestedLoopVariableReuseCheck.java index 677e2b28d..73783ca8b 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/NestedLoopVariableReuseCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/NestedLoopVariableReuseCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/NewStyleClassCheck.java b/python-checks/src/main/java/org/sonar/python/checks/NewStyleClassCheck.java index 7a61f5664..401fec4c4 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/NewStyleClassCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/NewStyleClassCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/NoPersonReferenceInTodoCheck.java b/python-checks/src/main/java/org/sonar/python/checks/NoPersonReferenceInTodoCheck.java index 8ab030dba..4eecdf3f8 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/NoPersonReferenceInTodoCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/NoPersonReferenceInTodoCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/NoQaCommentCheck.java b/python-checks/src/main/java/org/sonar/python/checks/NoQaCommentCheck.java index acff68433..5351828fa 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/NoQaCommentCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/NoQaCommentCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/NoReRaiseInExitCheck.java b/python-checks/src/main/java/org/sonar/python/checks/NoReRaiseInExitCheck.java index 8ac34f89f..ef836d4ea 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/NoReRaiseInExitCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/NoReRaiseInExitCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/NoSonarCommentCheck.java b/python-checks/src/main/java/org/sonar/python/checks/NoSonarCommentCheck.java index ea6c39810..fbf497cec 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/NoSonarCommentCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/NoSonarCommentCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/NoSonarCommentFormatCheck.java b/python-checks/src/main/java/org/sonar/python/checks/NoSonarCommentFormatCheck.java index cfaa17af1..d9aeef14c 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/NoSonarCommentFormatCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/NoSonarCommentFormatCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/NonCallableCalled.java b/python-checks/src/main/java/org/sonar/python/checks/NonCallableCalled.java index bd70598fc..6ed8d0151 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/NonCallableCalled.java +++ b/python-checks/src/main/java/org/sonar/python/checks/NonCallableCalled.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/NonCallableCalledCheck.java b/python-checks/src/main/java/org/sonar/python/checks/NonCallableCalledCheck.java index 96d5d67ad..2785056db 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/NonCallableCalledCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/NonCallableCalledCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/NonSingletonTfVariableCheck.java b/python-checks/src/main/java/org/sonar/python/checks/NonSingletonTfVariableCheck.java index 530e939c2..deba6732a 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/NonSingletonTfVariableCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/NonSingletonTfVariableCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/NonStringInAllPropertyCheck.java b/python-checks/src/main/java/org/sonar/python/checks/NonStringInAllPropertyCheck.java index fdcb8514b..9872b384c 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/NonStringInAllPropertyCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/NonStringInAllPropertyCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/NotImplementedBooleanContextCheck.java b/python-checks/src/main/java/org/sonar/python/checks/NotImplementedBooleanContextCheck.java index 1d2e364dd..962db6145 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/NotImplementedBooleanContextCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/NotImplementedBooleanContextCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/NotImplementedErrorInOperatorMethodsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/NotImplementedErrorInOperatorMethodsCheck.java index c2c2e4216..1780994b2 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/NotImplementedErrorInOperatorMethodsCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/NotImplementedErrorInOperatorMethodsCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/NumpyIsNanCheck.java b/python-checks/src/main/java/org/sonar/python/checks/NumpyIsNanCheck.java index 2702442ad..e1cc36aaf 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/NumpyIsNanCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/NumpyIsNanCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/NumpyListOverGeneratorCheck.java b/python-checks/src/main/java/org/sonar/python/checks/NumpyListOverGeneratorCheck.java index 42827575e..e76f8c005 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/NumpyListOverGeneratorCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/NumpyListOverGeneratorCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/NumpyRandomStateCheck.java b/python-checks/src/main/java/org/sonar/python/checks/NumpyRandomStateCheck.java index 291b112f8..f6aca5eeb 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/NumpyRandomStateCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/NumpyRandomStateCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/NumpyWeekMaskValidationCheck.java b/python-checks/src/main/java/org/sonar/python/checks/NumpyWeekMaskValidationCheck.java index b71fedaff..27f1241b9 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/NumpyWeekMaskValidationCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/NumpyWeekMaskValidationCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/NumpyWhereOneConditionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/NumpyWhereOneConditionCheck.java index 6dd9e99ce..969751ff4 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/NumpyWhereOneConditionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/NumpyWhereOneConditionCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/OneStatementPerLineCheck.java b/python-checks/src/main/java/org/sonar/python/checks/OneStatementPerLineCheck.java index ce3b12571..631c8c1d8 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OneStatementPerLineCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OneStatementPerLineCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index d40d7d07e..3118e28ab 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/OverwrittenCollectionEntryCheck.java b/python-checks/src/main/java/org/sonar/python/checks/OverwrittenCollectionEntryCheck.java index 36545a646..f7def2b4a 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OverwrittenCollectionEntryCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OverwrittenCollectionEntryCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/PandasAddMergeParametersCheck.java b/python-checks/src/main/java/org/sonar/python/checks/PandasAddMergeParametersCheck.java index 1bc727dc7..79841be55 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/PandasAddMergeParametersCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/PandasAddMergeParametersCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/PandasChainInstructionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/PandasChainInstructionCheck.java index 29e17913c..11d1fd8b4 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/PandasChainInstructionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/PandasChainInstructionCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/PandasDataFrameToNumpyCheck.java b/python-checks/src/main/java/org/sonar/python/checks/PandasDataFrameToNumpyCheck.java index 3392538c5..bc34bd05c 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/PandasDataFrameToNumpyCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/PandasDataFrameToNumpyCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/PandasModifyInPlaceCheck.java b/python-checks/src/main/java/org/sonar/python/checks/PandasModifyInPlaceCheck.java index 035c66970..e71fbdad7 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/PandasModifyInPlaceCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/PandasModifyInPlaceCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/PandasReadNoDataTypeCheck.java b/python-checks/src/main/java/org/sonar/python/checks/PandasReadNoDataTypeCheck.java index 358ecec7e..be5752bad 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/PandasReadNoDataTypeCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/PandasReadNoDataTypeCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/PandasToDatetimeFormatCheck.java b/python-checks/src/main/java/org/sonar/python/checks/PandasToDatetimeFormatCheck.java index 5dca7b2a3..eee66cd9f 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/PandasToDatetimeFormatCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/PandasToDatetimeFormatCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/ParsingErrorCheck.java b/python-checks/src/main/java/org/sonar/python/checks/ParsingErrorCheck.java index b9c2d54b3..351b6d08d 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/ParsingErrorCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/ParsingErrorCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/PreIncrementDecrementCheck.java b/python-checks/src/main/java/org/sonar/python/checks/PreIncrementDecrementCheck.java index b68669aa7..782b8cd37 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/PreIncrementDecrementCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/PreIncrementDecrementCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/PredictableSaltCheck.java b/python-checks/src/main/java/org/sonar/python/checks/PredictableSaltCheck.java index df91ad2b8..b433fdbbc 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/PredictableSaltCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/PredictableSaltCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/PrintStatementUsageCheck.java b/python-checks/src/main/java/org/sonar/python/checks/PrintStatementUsageCheck.java index 619900bb6..8f6db97e2 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/PrintStatementUsageCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/PrintStatementUsageCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/PropertyAccessorParameterCountCheck.java b/python-checks/src/main/java/org/sonar/python/checks/PropertyAccessorParameterCountCheck.java index ca7ed6ed3..7b19ab1b0 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/PropertyAccessorParameterCountCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/PropertyAccessorParameterCountCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/PyTorchDataLoaderNumWorkersCheck.java b/python-checks/src/main/java/org/sonar/python/checks/PyTorchDataLoaderNumWorkersCheck.java index 66104d4b3..75bb26bde 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/PyTorchDataLoaderNumWorkersCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/PyTorchDataLoaderNumWorkersCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/PydanticOptionalFieldDefaultCheck.java b/python-checks/src/main/java/org/sonar/python/checks/PydanticOptionalFieldDefaultCheck.java index b52399ada..d6db594f6 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/PydanticOptionalFieldDefaultCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/PydanticOptionalFieldDefaultCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/PytzTimeZoneInDatetimeConstructorCheck.java b/python-checks/src/main/java/org/sonar/python/checks/PytzTimeZoneInDatetimeConstructorCheck.java index 175b65a36..d66cea20b 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/PytzTimeZoneInDatetimeConstructorCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/PytzTimeZoneInDatetimeConstructorCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/PytzUsageCheck.java b/python-checks/src/main/java/org/sonar/python/checks/PytzUsageCheck.java index dda8b19f6..0205ce07e 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/PytzUsageCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/PytzUsageCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/RaiseOutsideExceptCheck.java b/python-checks/src/main/java/org/sonar/python/checks/RaiseOutsideExceptCheck.java index 6db2e6fd7..821d6be89 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/RaiseOutsideExceptCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/RaiseOutsideExceptCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/RandomSeedCheck.java b/python-checks/src/main/java/org/sonar/python/checks/RandomSeedCheck.java index cf5682406..1a8668626 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/RandomSeedCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/RandomSeedCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/RedundantJumpCheck.java b/python-checks/src/main/java/org/sonar/python/checks/RedundantJumpCheck.java index ef53fcc90..a25322bae 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/RedundantJumpCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/RedundantJumpCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/ReferencedBeforeAssignmentCheck.java b/python-checks/src/main/java/org/sonar/python/checks/ReferencedBeforeAssignmentCheck.java index 2ed277441..c5384be0f 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/ReferencedBeforeAssignmentCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/ReferencedBeforeAssignmentCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/ReturnAndYieldInOneFunctionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/ReturnAndYieldInOneFunctionCheck.java index 3ab139d24..1c7cab7ed 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/ReturnAndYieldInOneFunctionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/ReturnAndYieldInOneFunctionCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/ReturnCheckUtils.java b/python-checks/src/main/java/org/sonar/python/checks/ReturnCheckUtils.java index 98b51fe03..e311ace56 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/ReturnCheckUtils.java +++ b/python-checks/src/main/java/org/sonar/python/checks/ReturnCheckUtils.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/ReturnYieldOutsideFunctionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/ReturnYieldOutsideFunctionCheck.java index cf8f3bf02..92f8b1238 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/ReturnYieldOutsideFunctionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/ReturnYieldOutsideFunctionCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/RewriteCollectionConstructorAsComprehensionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/RewriteCollectionConstructorAsComprehensionCheck.java index c9351a9f3..8d46d2f5d 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/RewriteCollectionConstructorAsComprehensionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/RewriteCollectionConstructorAsComprehensionCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/RobustCipherAlgorithmCheck.java b/python-checks/src/main/java/org/sonar/python/checks/RobustCipherAlgorithmCheck.java index cd603fa34..c9a8e5575 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/RobustCipherAlgorithmCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/RobustCipherAlgorithmCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/RouterPrefixInIncludeRouterCheck.java b/python-checks/src/main/java/org/sonar/python/checks/RouterPrefixInIncludeRouterCheck.java index 38bc15a98..848be1136 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/RouterPrefixInIncludeRouterCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/RouterPrefixInIncludeRouterCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/SameBranchCheck.java b/python-checks/src/main/java/org/sonar/python/checks/SameBranchCheck.java index 550043459..8b5d73fa7 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/SameBranchCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/SameBranchCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/SameConditionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/SameConditionCheck.java index 0f7a5c24f..d599b4b76 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/SameConditionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/SameConditionCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/SecureModeEncryptionAlgorithmsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/SecureModeEncryptionAlgorithmsCheck.java index 482a72f2f..839a457b2 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/SecureModeEncryptionAlgorithmsCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/SecureModeEncryptionAlgorithmsCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/SelfAssignmentCheck.java b/python-checks/src/main/java/org/sonar/python/checks/SelfAssignmentCheck.java index 2485ff316..0ddb1c754 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/SelfAssignmentCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/SelfAssignmentCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/SetDuplicateKeyCheck.java b/python-checks/src/main/java/org/sonar/python/checks/SetDuplicateKeyCheck.java index 0628b9366..0849d7897 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/SetDuplicateKeyCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/SetDuplicateKeyCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/SideEffectInTfFunctionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/SideEffectInTfFunctionCheck.java index af5fc494f..b07ecc78d 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/SideEffectInTfFunctionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/SideEffectInTfFunctionCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/SillyEquality.java b/python-checks/src/main/java/org/sonar/python/checks/SillyEquality.java index fe843c35e..c6f6777a7 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/SillyEquality.java +++ b/python-checks/src/main/java/org/sonar/python/checks/SillyEquality.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/SillyEqualityCheck.java b/python-checks/src/main/java/org/sonar/python/checks/SillyEqualityCheck.java index aa2114435..093491a56 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/SillyEqualityCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/SillyEqualityCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/SillyIdentityCheck.java b/python-checks/src/main/java/org/sonar/python/checks/SillyIdentityCheck.java index 6b0e72c21..d88ebc296 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/SillyIdentityCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/SillyIdentityCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/SkLearnEstimatorDontInitializeEstimatedValuesCheck.java b/python-checks/src/main/java/org/sonar/python/checks/SkLearnEstimatorDontInitializeEstimatedValuesCheck.java index 058754943..35cdde102 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/SkLearnEstimatorDontInitializeEstimatedValuesCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/SkLearnEstimatorDontInitializeEstimatedValuesCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/SklearnCachedPipelineDontAccessTransformersCheck.java b/python-checks/src/main/java/org/sonar/python/checks/SklearnCachedPipelineDontAccessTransformersCheck.java index 8d1fed1e6..57fb53da1 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/SklearnCachedPipelineDontAccessTransformersCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/SklearnCachedPipelineDontAccessTransformersCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/SklearnPipelineParameterAreCorrectCheck.java b/python-checks/src/main/java/org/sonar/python/checks/SklearnPipelineParameterAreCorrectCheck.java index 14c5531fb..5a8a3fc54 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/SklearnPipelineParameterAreCorrectCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/SklearnPipelineParameterAreCorrectCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/SklearnPipelineSpecifyMemoryArgumentCheck.java b/python-checks/src/main/java/org/sonar/python/checks/SklearnPipelineSpecifyMemoryArgumentCheck.java index e802ccf55..2938fda82 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/SklearnPipelineSpecifyMemoryArgumentCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/SklearnPipelineSpecifyMemoryArgumentCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/SleepZeroInAsyncCheck.java b/python-checks/src/main/java/org/sonar/python/checks/SleepZeroInAsyncCheck.java index 1e4987eae..7c16ecf34 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/SleepZeroInAsyncCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/SleepZeroInAsyncCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/SlotsAssignmentCheck.java b/python-checks/src/main/java/org/sonar/python/checks/SlotsAssignmentCheck.java index 12ac35a60..005c71819 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/SlotsAssignmentCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/SlotsAssignmentCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/SortedMinMaxCheck.java b/python-checks/src/main/java/org/sonar/python/checks/SortedMinMaxCheck.java index 8793a8cc9..9ca83a7a7 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/SortedMinMaxCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/SortedMinMaxCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/SpecialMethodParamListCheck.java b/python-checks/src/main/java/org/sonar/python/checks/SpecialMethodParamListCheck.java index 40f0841d2..d0a467f3d 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/SpecialMethodParamListCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/SpecialMethodParamListCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/SpecialMethodReturnTypeCheck.java b/python-checks/src/main/java/org/sonar/python/checks/SpecialMethodReturnTypeCheck.java index 2c1428828..24b45c4c1 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/SpecialMethodReturnTypeCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/SpecialMethodReturnTypeCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/StrftimeConfusingHourSystemCheck.java b/python-checks/src/main/java/org/sonar/python/checks/StrftimeConfusingHourSystemCheck.java index b31f23582..052802c92 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/StrftimeConfusingHourSystemCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/StrftimeConfusingHourSystemCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/StringFormat.java b/python-checks/src/main/java/org/sonar/python/checks/StringFormat.java index 27bd3e33c..353c714de 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/StringFormat.java +++ b/python-checks/src/main/java/org/sonar/python/checks/StringFormat.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/StringFormatCorrectnessCheck.java b/python-checks/src/main/java/org/sonar/python/checks/StringFormatCorrectnessCheck.java index 654b42298..1959df13b 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/StringFormatCorrectnessCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/StringFormatCorrectnessCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/StringFormatMisuseCheck.java b/python-checks/src/main/java/org/sonar/python/checks/StringFormatMisuseCheck.java index b171e1046..c17692dab 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/StringFormatMisuseCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/StringFormatMisuseCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/StringLiteralDuplicationCheck.java b/python-checks/src/main/java/org/sonar/python/checks/StringLiteralDuplicationCheck.java index b5c2cabc8..37e680f09 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/StringLiteralDuplicationCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/StringLiteralDuplicationCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/SynchronousFileOperationsInAsyncCheck.java b/python-checks/src/main/java/org/sonar/python/checks/SynchronousFileOperationsInAsyncCheck.java index 26f5ae20a..c11833493 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/SynchronousFileOperationsInAsyncCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/SynchronousFileOperationsInAsyncCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/SynchronousHttpOperationsInAsyncCheck.java b/python-checks/src/main/java/org/sonar/python/checks/SynchronousHttpOperationsInAsyncCheck.java index a1619c7f6..9a41132aa 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/SynchronousHttpOperationsInAsyncCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/SynchronousHttpOperationsInAsyncCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/SynchronousOsCallsInAsyncCheck.java b/python-checks/src/main/java/org/sonar/python/checks/SynchronousOsCallsInAsyncCheck.java index 2ae58ed3c..33df01860 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/SynchronousOsCallsInAsyncCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/SynchronousOsCallsInAsyncCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/SynchronousSubprocessOperationsInAsyncCheck.java b/python-checks/src/main/java/org/sonar/python/checks/SynchronousSubprocessOperationsInAsyncCheck.java index 6b2ce4a60..e47195214 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/SynchronousSubprocessOperationsInAsyncCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/SynchronousSubprocessOperationsInAsyncCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/TaskGroupNurseryUsedOnlyOnceCheck.java b/python-checks/src/main/java/org/sonar/python/checks/TaskGroupNurseryUsedOnlyOnceCheck.java index dfc33cfdc..bdd70248a 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/TaskGroupNurseryUsedOnlyOnceCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/TaskGroupNurseryUsedOnlyOnceCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/TempFileCreationCheck.java b/python-checks/src/main/java/org/sonar/python/checks/TempFileCreationCheck.java index 29659553f..1481f7a6e 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/TempFileCreationCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/TempFileCreationCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/TemplateAndStrConcatenationCheck.java b/python-checks/src/main/java/org/sonar/python/checks/TemplateAndStrConcatenationCheck.java index d7e2c3525..bdcc1b81e 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/TemplateAndStrConcatenationCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/TemplateAndStrConcatenationCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/TemplateStringStructuralPatternMatchingCheck.java b/python-checks/src/main/java/org/sonar/python/checks/TemplateStringStructuralPatternMatchingCheck.java index ed81df463..904ad0c47 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/TemplateStringStructuralPatternMatchingCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/TemplateStringStructuralPatternMatchingCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/TestClientContentParameterCheck.java b/python-checks/src/main/java/org/sonar/python/checks/TestClientContentParameterCheck.java index 1f15136e2..7ba4954b7 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/TestClientContentParameterCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/TestClientContentParameterCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/TfFunctionDependOnOutsideVariableCheck.java b/python-checks/src/main/java/org/sonar/python/checks/TfFunctionDependOnOutsideVariableCheck.java index f16aaea79..210373114 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/TfFunctionDependOnOutsideVariableCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/TfFunctionDependOnOutsideVariableCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/TfFunctionRecursivityCheck.java b/python-checks/src/main/java/org/sonar/python/checks/TfFunctionRecursivityCheck.java index 907522e6f..d093b5cde 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/TfFunctionRecursivityCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/TfFunctionRecursivityCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/TfGatherDeprecatedValidateIndicesCheck.java b/python-checks/src/main/java/org/sonar/python/checks/TfGatherDeprecatedValidateIndicesCheck.java index 1d60178de..a67000fe7 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/TfGatherDeprecatedValidateIndicesCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/TfGatherDeprecatedValidateIndicesCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/TfInputShapeOnModelSubclassCheck.java b/python-checks/src/main/java/org/sonar/python/checks/TfInputShapeOnModelSubclassCheck.java index 1cbced79a..6b30e2ac2 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/TfInputShapeOnModelSubclassCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/TfInputShapeOnModelSubclassCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/TfPyTorchSpecifyReductionAxisCheck.java b/python-checks/src/main/java/org/sonar/python/checks/TfPyTorchSpecifyReductionAxisCheck.java index deaaae585..4f37ab1a5 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/TfPyTorchSpecifyReductionAxisCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/TfPyTorchSpecifyReductionAxisCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/TimeSleepInAsyncCheck.java b/python-checks/src/main/java/org/sonar/python/checks/TimeSleepInAsyncCheck.java index 9020a2277..b8546d3c3 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/TimeSleepInAsyncCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/TimeSleepInAsyncCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/TimezoneNaiveDatetimeConstructorsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/TimezoneNaiveDatetimeConstructorsCheck.java index 9ad1054c1..938833f08 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/TimezoneNaiveDatetimeConstructorsCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/TimezoneNaiveDatetimeConstructorsCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/ToDoCommentCheck.java b/python-checks/src/main/java/org/sonar/python/checks/ToDoCommentCheck.java index 33d596b0a..547144c98 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/ToDoCommentCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/ToDoCommentCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/TooManyLinesInFileCheck.java b/python-checks/src/main/java/org/sonar/python/checks/TooManyLinesInFileCheck.java index d3f34f823..65a5a74b2 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/TooManyLinesInFileCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/TooManyLinesInFileCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/TooManyLinesInFunctionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/TooManyLinesInFunctionCheck.java index 207952871..637f72188 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/TooManyLinesInFunctionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/TooManyLinesInFunctionCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/TooManyParametersCheck.java b/python-checks/src/main/java/org/sonar/python/checks/TooManyParametersCheck.java index 95ef7ca04..4ac1484d5 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/TooManyParametersCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/TooManyParametersCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/TooManyReturnsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/TooManyReturnsCheck.java index d672d339e..825e2070e 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/TooManyReturnsCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/TooManyReturnsCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/TorchAutogradVariableShouldNotBeUsedCheck.java b/python-checks/src/main/java/org/sonar/python/checks/TorchAutogradVariableShouldNotBeUsedCheck.java index d4691a46b..d596d5319 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/TorchAutogradVariableShouldNotBeUsedCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/TorchAutogradVariableShouldNotBeUsedCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/TorchLoadLeadsToUntrustedCodeExecutionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/TorchLoadLeadsToUntrustedCodeExecutionCheck.java index 2b9f192e6..5607f58d9 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/TorchLoadLeadsToUntrustedCodeExecutionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/TorchLoadLeadsToUntrustedCodeExecutionCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/TorchModuleModeShouldBeSetAfterLoadingCheck.java b/python-checks/src/main/java/org/sonar/python/checks/TorchModuleModeShouldBeSetAfterLoadingCheck.java index cc0cc20f0..2a232325d 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/TorchModuleModeShouldBeSetAfterLoadingCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/TorchModuleModeShouldBeSetAfterLoadingCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/TorchModuleShouldCallInitCheck.java b/python-checks/src/main/java/org/sonar/python/checks/TorchModuleShouldCallInitCheck.java index 3e945cfa5..9e28e51cd 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/TorchModuleShouldCallInitCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/TorchModuleShouldCallInitCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/TrailingCommentCheck.java b/python-checks/src/main/java/org/sonar/python/checks/TrailingCommentCheck.java index 8a7d0eab8..f8714a753 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/TrailingCommentCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/TrailingCommentCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/TrailingWhitespaceCheck.java b/python-checks/src/main/java/org/sonar/python/checks/TrailingWhitespaceCheck.java index 57f27edfe..cc0621038 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/TrailingWhitespaceCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/TrailingWhitespaceCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/TypeAliasAnnotationCheck.java b/python-checks/src/main/java/org/sonar/python/checks/TypeAliasAnnotationCheck.java index 4feb678f2..456cafbe9 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/TypeAliasAnnotationCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/TypeAliasAnnotationCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/TypeVarCovariantAndContravariantCheck.java b/python-checks/src/main/java/org/sonar/python/checks/TypeVarCovariantAndContravariantCheck.java index cf5721d47..392174d5b 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/TypeVarCovariantAndContravariantCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/TypeVarCovariantAndContravariantCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/UndefinedNameAllPropertyCheck.java b/python-checks/src/main/java/org/sonar/python/checks/UndefinedNameAllPropertyCheck.java index eee61c42d..3fd3f8e56 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/UndefinedNameAllPropertyCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/UndefinedNameAllPropertyCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/UndefinedSymbolsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/UndefinedSymbolsCheck.java index 74c0d0557..609432b8e 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/UndefinedSymbolsCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/UndefinedSymbolsCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/UnionTypeExpressionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/UnionTypeExpressionCheck.java index aedcac6cd..08db91d5d 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/UnionTypeExpressionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/UnionTypeExpressionCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/UnnecessaryComprehensionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/UnnecessaryComprehensionCheck.java index e486786c6..2518314a4 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/UnnecessaryComprehensionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/UnnecessaryComprehensionCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/UnnecessaryLambdaMapCallCheck.java b/python-checks/src/main/java/org/sonar/python/checks/UnnecessaryLambdaMapCallCheck.java index 81e0961e7..69fdb0d69 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/UnnecessaryLambdaMapCallCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/UnnecessaryLambdaMapCallCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/UnnecessaryListCastCheck.java b/python-checks/src/main/java/org/sonar/python/checks/UnnecessaryListCastCheck.java index 2ecfd747e..3a5aac7ae 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/UnnecessaryListCastCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/UnnecessaryListCastCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/UnnecessaryListComprehensionArgumentCheck.java b/python-checks/src/main/java/org/sonar/python/checks/UnnecessaryListComprehensionArgumentCheck.java index 55927f183..1603fffbf 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/UnnecessaryListComprehensionArgumentCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/UnnecessaryListComprehensionArgumentCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/UnnecessaryReversedCallCheck.java b/python-checks/src/main/java/org/sonar/python/checks/UnnecessaryReversedCallCheck.java index 6e6f6ac97..15a59850d 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/UnnecessaryReversedCallCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/UnnecessaryReversedCallCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/UnnecessarySortInsideSetCheck.java b/python-checks/src/main/java/org/sonar/python/checks/UnnecessarySortInsideSetCheck.java index 92f382b2b..748363580 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/UnnecessarySortInsideSetCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/UnnecessarySortInsideSetCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/UnnecessarySubscriptReversalCheck.java b/python-checks/src/main/java/org/sonar/python/checks/UnnecessarySubscriptReversalCheck.java index f277aef66..9e82f571a 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/UnnecessarySubscriptReversalCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/UnnecessarySubscriptReversalCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/UnprocessedTemplateStringCheck.java b/python-checks/src/main/java/org/sonar/python/checks/UnprocessedTemplateStringCheck.java index 81701bf4e..3a43649fc 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/UnprocessedTemplateStringCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/UnprocessedTemplateStringCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/UnreachableExceptCheck.java b/python-checks/src/main/java/org/sonar/python/checks/UnreachableExceptCheck.java index e351674ca..2f7d4c049 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/UnreachableExceptCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/UnreachableExceptCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/UnreadPrivateAttributesCheck.java b/python-checks/src/main/java/org/sonar/python/checks/UnreadPrivateAttributesCheck.java index 42d44e42f..21eef223c 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/UnreadPrivateAttributesCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/UnreadPrivateAttributesCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/UnreadPrivateInnerClassesCheck.java b/python-checks/src/main/java/org/sonar/python/checks/UnreadPrivateInnerClassesCheck.java index d795173b9..44f4b3c86 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/UnreadPrivateInnerClassesCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/UnreadPrivateInnerClassesCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/UnreadPrivateMethodsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/UnreadPrivateMethodsCheck.java index bd8069435..9457d2b51 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/UnreadPrivateMethodsCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/UnreadPrivateMethodsCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/UnusedFunctionParameterCheck.java b/python-checks/src/main/java/org/sonar/python/checks/UnusedFunctionParameterCheck.java index a15dba6a5..d04a682a1 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/UnusedFunctionParameterCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/UnusedFunctionParameterCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/UnusedImportCheck.java b/python-checks/src/main/java/org/sonar/python/checks/UnusedImportCheck.java index ea76bbd79..85cd443d0 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/UnusedImportCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/UnusedImportCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/UnusedLocalVariableCheck.java b/python-checks/src/main/java/org/sonar/python/checks/UnusedLocalVariableCheck.java index ca2e03fbe..f5c8b34fa 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/UnusedLocalVariableCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/UnusedLocalVariableCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/UnusedNestedDefinitionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/UnusedNestedDefinitionCheck.java index 66d40de3e..1f64b80db 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/UnusedNestedDefinitionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/UnusedNestedDefinitionCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/UseOfAnyAsTypeHintCheck.java b/python-checks/src/main/java/org/sonar/python/checks/UseOfAnyAsTypeHintCheck.java index 5cb0d97cf..d552669e7 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/UseOfAnyAsTypeHintCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/UseOfAnyAsTypeHintCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/UseOfEmptyReturnValueCheck.java b/python-checks/src/main/java/org/sonar/python/checks/UseOfEmptyReturnValueCheck.java index f10914706..7e944d8dc 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/UseOfEmptyReturnValueCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/UseOfEmptyReturnValueCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/UseStartsWithEndsWithCheck.java b/python-checks/src/main/java/org/sonar/python/checks/UseStartsWithEndsWithCheck.java index 38f74e675..c227dc295 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/UseStartsWithEndsWithCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/UseStartsWithEndsWithCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/UselessParenthesisAfterKeywordCheck.java b/python-checks/src/main/java/org/sonar/python/checks/UselessParenthesisAfterKeywordCheck.java index 5076d46eb..b1b707a6d 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/UselessParenthesisAfterKeywordCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/UselessParenthesisAfterKeywordCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/UselessParenthesisCheck.java b/python-checks/src/main/java/org/sonar/python/checks/UselessParenthesisCheck.java index d4d711239..0a6a578e6 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/UselessParenthesisCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/UselessParenthesisCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/UselessStatementCheck.java b/python-checks/src/main/java/org/sonar/python/checks/UselessStatementCheck.java index 93b003d2d..628b2e5c9 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/UselessStatementCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/UselessStatementCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/VerifiedSslTlsCertificateCheck.java b/python-checks/src/main/java/org/sonar/python/checks/VerifiedSslTlsCertificateCheck.java index cad135a96..5f99c20d5 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/VerifiedSslTlsCertificateCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/VerifiedSslTlsCertificateCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/WeakSSLProtocolCheck.java b/python-checks/src/main/java/org/sonar/python/checks/WeakSSLProtocolCheck.java index f0362354d..545b474f5 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/WeakSSLProtocolCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/WeakSSLProtocolCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/WebEntryPointDecoratorCheck.java b/python-checks/src/main/java/org/sonar/python/checks/WebEntryPointDecoratorCheck.java index d0ddec7db..1216f7739 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/WebEntryPointDecoratorCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/WebEntryPointDecoratorCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/WildcardImportCheck.java b/python-checks/src/main/java/org/sonar/python/checks/WildcardImportCheck.java index be5770528..2486c2f13 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/WildcardImportCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/WildcardImportCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/WrongAssignmentOperatorCheck.java b/python-checks/src/main/java/org/sonar/python/checks/WrongAssignmentOperatorCheck.java index 6e80797c1..d5f622709 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/WrongAssignmentOperatorCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/WrongAssignmentOperatorCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/XMLParserXXEVulnerableCheck.java b/python-checks/src/main/java/org/sonar/python/checks/XMLParserXXEVulnerableCheck.java index 79172f85e..05bac5190 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/XMLParserXXEVulnerableCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/XMLParserXXEVulnerableCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/cdk/AbstractCdkResourceCheck.java b/python-checks/src/main/java/org/sonar/python/checks/cdk/AbstractCdkResourceCheck.java index b4e707c03..cde6af2b8 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/cdk/AbstractCdkResourceCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/cdk/AbstractCdkResourceCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/cdk/AbstractIamPolicyStatementCheck.java b/python-checks/src/main/java/org/sonar/python/checks/cdk/AbstractIamPolicyStatementCheck.java index 4c855bcb0..7e65b41a2 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/cdk/AbstractIamPolicyStatementCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/cdk/AbstractIamPolicyStatementCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/cdk/AbstractS3BucketCheck.java b/python-checks/src/main/java/org/sonar/python/checks/cdk/AbstractS3BucketCheck.java index 5cc1382ae..f6d768127 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/cdk/AbstractS3BucketCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/cdk/AbstractS3BucketCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/cdk/CdkPredicate.java b/python-checks/src/main/java/org/sonar/python/checks/cdk/CdkPredicate.java index ec73c2f58..88baf2ec3 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/cdk/CdkPredicate.java +++ b/python-checks/src/main/java/org/sonar/python/checks/cdk/CdkPredicate.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/cdk/CdkUtils.java b/python-checks/src/main/java/org/sonar/python/checks/cdk/CdkUtils.java index 2fd6099e7..dea9ad81b 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/cdk/CdkUtils.java +++ b/python-checks/src/main/java/org/sonar/python/checks/cdk/CdkUtils.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/cdk/ClearTextProtocolsCheckPart.java b/python-checks/src/main/java/org/sonar/python/checks/cdk/ClearTextProtocolsCheckPart.java index e4fbdd172..d102baf43 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/cdk/ClearTextProtocolsCheckPart.java +++ b/python-checks/src/main/java/org/sonar/python/checks/cdk/ClearTextProtocolsCheckPart.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/cdk/DisabledEFSEncryptionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/cdk/DisabledEFSEncryptionCheck.java index 342f38345..aa32956b0 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/cdk/DisabledEFSEncryptionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/cdk/DisabledEFSEncryptionCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/cdk/DisabledESDomainEncryptionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/cdk/DisabledESDomainEncryptionCheck.java index 047facd14..1a2bb24be 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/cdk/DisabledESDomainEncryptionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/cdk/DisabledESDomainEncryptionCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/cdk/DisabledRDSEncryptionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/cdk/DisabledRDSEncryptionCheck.java index 6aa23d332..cfd48c669 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/cdk/DisabledRDSEncryptionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/cdk/DisabledRDSEncryptionCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/cdk/DisabledSNSTopicEncryptionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/cdk/DisabledSNSTopicEncryptionCheck.java index 0b324110a..bcea7505a 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/cdk/DisabledSNSTopicEncryptionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/cdk/DisabledSNSTopicEncryptionCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/cdk/IamPolicyPublicAccessCheck.java b/python-checks/src/main/java/org/sonar/python/checks/cdk/IamPolicyPublicAccessCheck.java index b06445b95..f7b9976af 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/cdk/IamPolicyPublicAccessCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/cdk/IamPolicyPublicAccessCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/cdk/IamPrivilegeEscalationCheck.java b/python-checks/src/main/java/org/sonar/python/checks/cdk/IamPrivilegeEscalationCheck.java index e6e0be11c..3e4de22b6 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/cdk/IamPrivilegeEscalationCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/cdk/IamPrivilegeEscalationCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/cdk/NetworkCallsWithoutTimeoutsInLambdaCheck.java b/python-checks/src/main/java/org/sonar/python/checks/cdk/NetworkCallsWithoutTimeoutsInLambdaCheck.java index 5778519ba..a2eea81b4 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/cdk/NetworkCallsWithoutTimeoutsInLambdaCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/cdk/NetworkCallsWithoutTimeoutsInLambdaCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/cdk/PolicyStatement.java b/python-checks/src/main/java/org/sonar/python/checks/cdk/PolicyStatement.java index 2d232ea7b..9199e66d6 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/cdk/PolicyStatement.java +++ b/python-checks/src/main/java/org/sonar/python/checks/cdk/PolicyStatement.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/cdk/PrivilegePolicyCheck.java b/python-checks/src/main/java/org/sonar/python/checks/cdk/PrivilegePolicyCheck.java index 00ee2556a..d82af5b21 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/cdk/PrivilegePolicyCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/cdk/PrivilegePolicyCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/cdk/PublicApiIsSecuritySensitiveCheck.java b/python-checks/src/main/java/org/sonar/python/checks/cdk/PublicApiIsSecuritySensitiveCheck.java index 64f4c9585..6d50d0c7b 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/cdk/PublicApiIsSecuritySensitiveCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/cdk/PublicApiIsSecuritySensitiveCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/cdk/PublicNetworkAccessToCloudResourcesCheck.java b/python-checks/src/main/java/org/sonar/python/checks/cdk/PublicNetworkAccessToCloudResourcesCheck.java index b2040c941..12f80b40e 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/cdk/PublicNetworkAccessToCloudResourcesCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/cdk/PublicNetworkAccessToCloudResourcesCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/cdk/ResourceAccessPolicyCheck.java b/python-checks/src/main/java/org/sonar/python/checks/cdk/ResourceAccessPolicyCheck.java index 5e1d25717..fdb8f42d7 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/cdk/ResourceAccessPolicyCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/cdk/ResourceAccessPolicyCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/cdk/S3BucketBlockPublicAccessCheck.java b/python-checks/src/main/java/org/sonar/python/checks/cdk/S3BucketBlockPublicAccessCheck.java index 52c1c4dc2..b9f820288 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/cdk/S3BucketBlockPublicAccessCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/cdk/S3BucketBlockPublicAccessCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/cdk/S3BucketGrantedAccessCheck.java b/python-checks/src/main/java/org/sonar/python/checks/cdk/S3BucketGrantedAccessCheck.java index 8e3c6eedc..96d2fb362 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/cdk/S3BucketGrantedAccessCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/cdk/S3BucketGrantedAccessCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/cdk/S3BucketHTTPCommunicationCheck.java b/python-checks/src/main/java/org/sonar/python/checks/cdk/S3BucketHTTPCommunicationCheck.java index a66b9e843..2025361a9 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/cdk/S3BucketHTTPCommunicationCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/cdk/S3BucketHTTPCommunicationCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/cdk/S3BucketServerEncryptionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/cdk/S3BucketServerEncryptionCheck.java index ed91fe4be..a8ed20f71 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/cdk/S3BucketServerEncryptionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/cdk/S3BucketServerEncryptionCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/cdk/S3BucketVersioningCheck.java b/python-checks/src/main/java/org/sonar/python/checks/cdk/S3BucketVersioningCheck.java index 6cc3b8de2..f014d0095 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/cdk/S3BucketVersioningCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/cdk/S3BucketVersioningCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/cdk/UnencryptedEbsVolumeCheck.java b/python-checks/src/main/java/org/sonar/python/checks/cdk/UnencryptedEbsVolumeCheck.java index 12a07a5d7..d1f2fb08a 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/cdk/UnencryptedEbsVolumeCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/cdk/UnencryptedEbsVolumeCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/cdk/UnencryptedSageMakerNotebookCheck.java b/python-checks/src/main/java/org/sonar/python/checks/cdk/UnencryptedSageMakerNotebookCheck.java index 7d86b5581..46d9bdcd2 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/cdk/UnencryptedSageMakerNotebookCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/cdk/UnencryptedSageMakerNotebookCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/cdk/UnencryptedSqsQueueCheck.java b/python-checks/src/main/java/org/sonar/python/checks/cdk/UnencryptedSqsQueueCheck.java index 08a369b19..d2d5af5f3 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/cdk/UnencryptedSqsQueueCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/cdk/UnencryptedSqsQueueCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/cdk/UnrestrictedAdministrationCheck.java b/python-checks/src/main/java/org/sonar/python/checks/cdk/UnrestrictedAdministrationCheck.java index 0de0b54ba..3e812765c 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/cdk/UnrestrictedAdministrationCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/cdk/UnrestrictedAdministrationCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/cdk/UnrestrictedAdministrationCheckPartCfnSecurity.java b/python-checks/src/main/java/org/sonar/python/checks/cdk/UnrestrictedAdministrationCheckPartCfnSecurity.java index 3ed6c2e14..1b03391cf 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/cdk/UnrestrictedAdministrationCheckPartCfnSecurity.java +++ b/python-checks/src/main/java/org/sonar/python/checks/cdk/UnrestrictedAdministrationCheckPartCfnSecurity.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/cdk/UnrestrictedAdministrationCheckPartConnections.java b/python-checks/src/main/java/org/sonar/python/checks/cdk/UnrestrictedAdministrationCheckPartConnections.java index 8e12a6d6d..350a78c16 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/cdk/UnrestrictedAdministrationCheckPartConnections.java +++ b/python-checks/src/main/java/org/sonar/python/checks/cdk/UnrestrictedAdministrationCheckPartConnections.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/cdk/UnrestrictedOutboundCommunicationsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/cdk/UnrestrictedOutboundCommunicationsCheck.java index d215677d2..9d6719490 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/cdk/UnrestrictedOutboundCommunicationsCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/cdk/UnrestrictedOutboundCommunicationsCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/cdk/WeakSSLProtocolCheckPart.java b/python-checks/src/main/java/org/sonar/python/checks/cdk/WeakSSLProtocolCheckPart.java index 0ad57bd01..1241cb237 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/cdk/WeakSSLProtocolCheckPart.java +++ b/python-checks/src/main/java/org/sonar/python/checks/cdk/WeakSSLProtocolCheckPart.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/cdk/package-info.java b/python-checks/src/main/java/org/sonar/python/checks/cdk/package-info.java index 44670788e..c1a514955 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/cdk/package-info.java +++ b/python-checks/src/main/java/org/sonar/python/checks/cdk/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/django/DjangoModelFormFieldsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/django/DjangoModelFormFieldsCheck.java index 894716f05..d288f38c3 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/django/DjangoModelFormFieldsCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/django/DjangoModelFormFieldsCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/django/DjangoModelStrMethodCheck.java b/python-checks/src/main/java/org/sonar/python/checks/django/DjangoModelStrMethodCheck.java index ff7b4f020..bb3e5aa46 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/django/DjangoModelStrMethodCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/django/DjangoModelStrMethodCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/django/DjangoModelStringFieldCheck.java b/python-checks/src/main/java/org/sonar/python/checks/django/DjangoModelStringFieldCheck.java index a1307b9a7..6f8bb4af4 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/django/DjangoModelStringFieldCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/django/DjangoModelStringFieldCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/django/DjangoUtils.java b/python-checks/src/main/java/org/sonar/python/checks/django/DjangoUtils.java index ca58a0aa7..ead1539ff 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/django/DjangoUtils.java +++ b/python-checks/src/main/java/org/sonar/python/checks/django/DjangoUtils.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/django/package-info.java b/python-checks/src/main/java/org/sonar/python/checks/django/package-info.java index ff4915251..5bc4dffab 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/django/package-info.java +++ b/python-checks/src/main/java/org/sonar/python/checks/django/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/AbstractCookieFlagCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/AbstractCookieFlagCheck.java index ae8167f0a..20faca57e 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/AbstractCookieFlagCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/AbstractCookieFlagCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/ClearTextProtocolsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/ClearTextProtocolsCheck.java index eb5cbaf48..b349e2603 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/ClearTextProtocolsCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/ClearTextProtocolsCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/CommandLineArgsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/CommandLineArgsCheck.java index 42c6f57fb..a2158a251 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/CommandLineArgsCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/CommandLineArgsCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/CommonValidationUtils.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/CommonValidationUtils.java index 0f70a2206..2f01125ce 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/CommonValidationUtils.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/CommonValidationUtils.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/CorsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/CorsCheck.java index 94321dbcd..e4c304443 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/CorsCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/CorsCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/CsrfDisabledCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/CsrfDisabledCheck.java index 4619b9897..46d5c688f 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/CsrfDisabledCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/CsrfDisabledCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/DataEncryptionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/DataEncryptionCheck.java index 0e162f305..f58f90926 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/DataEncryptionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/DataEncryptionCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/DebugModeCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/DebugModeCheck.java index e8937fe23..2a8c34ff5 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/DebugModeCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/DebugModeCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/DisabledHtmlAutoEscapeCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/DisabledHtmlAutoEscapeCheck.java index ac95e7084..9cc3a8396 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/DisabledHtmlAutoEscapeCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/DisabledHtmlAutoEscapeCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/DisabledHtmlAutoEscapeLegacyCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/DisabledHtmlAutoEscapeLegacyCheck.java index 6654b4e63..c35844af2 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/DisabledHtmlAutoEscapeLegacyCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/DisabledHtmlAutoEscapeLegacyCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/DynamicCodeExecutionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/DynamicCodeExecutionCheck.java index 4630aa2dc..896f038a6 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/DynamicCodeExecutionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/DynamicCodeExecutionCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/EmailSendingCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/EmailSendingCheck.java index d88765569..4e07afc37 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/EmailSendingCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/EmailSendingCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/ExpandingArchiveCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/ExpandingArchiveCheck.java index 168f80517..570834463 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/ExpandingArchiveCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/ExpandingArchiveCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/FastHashingOrPlainTextCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/FastHashingOrPlainTextCheck.java index 1d724533d..db86633c3 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/FastHashingOrPlainTextCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/FastHashingOrPlainTextCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/GraphQLIntrospectionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/GraphQLIntrospectionCheck.java index 9ea18021d..7fd2fd6c7 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/GraphQLIntrospectionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/GraphQLIntrospectionCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/HardCodedCredentialsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/HardCodedCredentialsCheck.java index a55a7492d..35953466b 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/HardCodedCredentialsCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/HardCodedCredentialsCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/HardCodedCredentialsEntropyCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/HardCodedCredentialsEntropyCheck.java index 80ad2331a..10b509d56 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/HardCodedCredentialsEntropyCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/HardCodedCredentialsEntropyCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/HashingDataCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/HashingDataCheck.java index 9a2e0df85..98138d1d4 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/HashingDataCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/HashingDataCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/HttpOnlyCookieCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/HttpOnlyCookieCheck.java index 48261ebf7..2a9ad42b6 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/HttpOnlyCookieCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/HttpOnlyCookieCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/LoggersConfigurationCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/LoggersConfigurationCheck.java index b60499c00..10d82c00f 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/LoggersConfigurationCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/LoggersConfigurationCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/NonStandardCryptographicAlgorithmCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/NonStandardCryptographicAlgorithmCheck.java index 6158c69aa..3c3106d42 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/NonStandardCryptographicAlgorithmCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/NonStandardCryptographicAlgorithmCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/OsExecCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/OsExecCheck.java index 47fd373af..d0eb3205e 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/OsExecCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/OsExecCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/ProcessSignallingCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/ProcessSignallingCheck.java index 2862d1e73..76f5d5458 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/ProcessSignallingCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/ProcessSignallingCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/PseudoRandomCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/PseudoRandomCheck.java index 4c5fcfe87..9f30986b0 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/PseudoRandomCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/PseudoRandomCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/PubliclyWritableDirectoriesCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/PubliclyWritableDirectoriesCheck.java index 369c043ba..2b31f8682 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/PubliclyWritableDirectoriesCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/PubliclyWritableDirectoriesCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/RegexCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/RegexCheck.java index b775ddd13..b7cf4e64e 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/RegexCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/RegexCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/SQLQueriesCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/SQLQueriesCheck.java index 1f05dda17..379bd1852 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/SQLQueriesCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/SQLQueriesCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/SecureCookieCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/SecureCookieCheck.java index 7b0933062..f8de4e8fc 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/SecureCookieCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/SecureCookieCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/StandardInputCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/StandardInputCheck.java index c5544d797..0f7af6af1 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/StandardInputCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/StandardInputCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/StrongCryptographicKeysCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/StrongCryptographicKeysCheck.java index 106ab0c48..f0a11045c 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/StrongCryptographicKeysCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/StrongCryptographicKeysCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/UnsafeHttpMethodsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/UnsafeHttpMethodsCheck.java index 89b58dabd..f3e08be37 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/UnsafeHttpMethodsCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/UnsafeHttpMethodsCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/UnverifiedHostnameCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/UnverifiedHostnameCheck.java index 60464ba11..405770e66 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/UnverifiedHostnameCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/UnverifiedHostnameCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/XMLSignatureValidationCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/XMLSignatureValidationCheck.java index 21d8cbfd7..47693f38a 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/XMLSignatureValidationCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/XMLSignatureValidationCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/package-info.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/package-info.java index 0e1767285..4c74e82e0 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/package-info.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/package-info.java b/python-checks/src/main/java/org/sonar/python/checks/package-info.java index 5cc0f0936..9f46952e4 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/package-info.java +++ b/python-checks/src/main/java/org/sonar/python/checks/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/regex/AbstractRegexCheck.java b/python-checks/src/main/java/org/sonar/python/checks/regex/AbstractRegexCheck.java index 65186cce5..49e500ea2 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/regex/AbstractRegexCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/regex/AbstractRegexCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/regex/AnchorPrecedenceCheck.java b/python-checks/src/main/java/org/sonar/python/checks/regex/AnchorPrecedenceCheck.java index b7730ea9a..309ed1609 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/regex/AnchorPrecedenceCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/regex/AnchorPrecedenceCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/regex/DuplicatesInCharacterClassCheck.java b/python-checks/src/main/java/org/sonar/python/checks/regex/DuplicatesInCharacterClassCheck.java index 77e0921c7..e1a7e0404 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/regex/DuplicatesInCharacterClassCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/regex/DuplicatesInCharacterClassCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/regex/EmptyAlternativeCheck.java b/python-checks/src/main/java/org/sonar/python/checks/regex/EmptyAlternativeCheck.java index 7bfffde99..be5b873cb 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/regex/EmptyAlternativeCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/regex/EmptyAlternativeCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/regex/EmptyGroupCheck.java b/python-checks/src/main/java/org/sonar/python/checks/regex/EmptyGroupCheck.java index 8866cfa20..27adfc0bd 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/regex/EmptyGroupCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/regex/EmptyGroupCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/regex/EmptyStringRepetitionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/regex/EmptyStringRepetitionCheck.java index 5ecd2316e..bef9e1bfd 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/regex/EmptyStringRepetitionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/regex/EmptyStringRepetitionCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/regex/GraphemeClustersInClassesCheck.java b/python-checks/src/main/java/org/sonar/python/checks/regex/GraphemeClustersInClassesCheck.java index 51c8af080..8a48bf8c7 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/regex/GraphemeClustersInClassesCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/regex/GraphemeClustersInClassesCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/regex/GroupReplacementCheck.java b/python-checks/src/main/java/org/sonar/python/checks/regex/GroupReplacementCheck.java index 326e1620e..53976663a 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/regex/GroupReplacementCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/regex/GroupReplacementCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/regex/ImpossibleBackReferenceCheck.java b/python-checks/src/main/java/org/sonar/python/checks/regex/ImpossibleBackReferenceCheck.java index 935053b06..96364f6e2 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/regex/ImpossibleBackReferenceCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/regex/ImpossibleBackReferenceCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/regex/ImpossibleBoundariesCheck.java b/python-checks/src/main/java/org/sonar/python/checks/regex/ImpossibleBoundariesCheck.java index 2c4df04b5..1e4f66554 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/regex/ImpossibleBoundariesCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/regex/ImpossibleBoundariesCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/regex/InvalidRegexCheck.java b/python-checks/src/main/java/org/sonar/python/checks/regex/InvalidRegexCheck.java index f2dbe0347..89610a51b 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/regex/InvalidRegexCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/regex/InvalidRegexCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/regex/MultipleWhitespaceCheck.java b/python-checks/src/main/java/org/sonar/python/checks/regex/MultipleWhitespaceCheck.java index 70a5adde6..5d4655aa1 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/regex/MultipleWhitespaceCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/regex/MultipleWhitespaceCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/regex/OctalEscapeCheck.java b/python-checks/src/main/java/org/sonar/python/checks/regex/OctalEscapeCheck.java index cbf626add..6bb8a35dd 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/regex/OctalEscapeCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/regex/OctalEscapeCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/regex/PossessiveQuantifierContinuationCheck.java b/python-checks/src/main/java/org/sonar/python/checks/regex/PossessiveQuantifierContinuationCheck.java index 653d0acb2..cb27a1250 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/regex/PossessiveQuantifierContinuationCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/regex/PossessiveQuantifierContinuationCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/regex/RedosCheck.java b/python-checks/src/main/java/org/sonar/python/checks/regex/RedosCheck.java index ff7a16da0..7f443b677 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/regex/RedosCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/regex/RedosCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/regex/RedundantRegexAlternativesCheck.java b/python-checks/src/main/java/org/sonar/python/checks/regex/RedundantRegexAlternativesCheck.java index dcde32090..2f5610c6f 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/regex/RedundantRegexAlternativesCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/regex/RedundantRegexAlternativesCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/regex/RegexComplexityCheck.java b/python-checks/src/main/java/org/sonar/python/checks/regex/RegexComplexityCheck.java index cf5ac1670..8788dcb85 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/regex/RegexComplexityCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/regex/RegexComplexityCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/regex/RegexLookaheadCheck.java b/python-checks/src/main/java/org/sonar/python/checks/regex/RegexLookaheadCheck.java index fc0839e3d..3e0256379 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/regex/RegexLookaheadCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/regex/RegexLookaheadCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/regex/ReluctantQuantifierCheck.java b/python-checks/src/main/java/org/sonar/python/checks/regex/ReluctantQuantifierCheck.java index c6f3ad238..7ff945c37 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/regex/ReluctantQuantifierCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/regex/ReluctantQuantifierCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/regex/ReluctantQuantifierWithEmptyContinuationCheck.java b/python-checks/src/main/java/org/sonar/python/checks/regex/ReluctantQuantifierWithEmptyContinuationCheck.java index a6c571af7..c12e31fab 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/regex/ReluctantQuantifierWithEmptyContinuationCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/regex/ReluctantQuantifierWithEmptyContinuationCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/regex/SingleCharCharacterClassCheck.java b/python-checks/src/main/java/org/sonar/python/checks/regex/SingleCharCharacterClassCheck.java index a819a0a71..1a37391d0 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/regex/SingleCharCharacterClassCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/regex/SingleCharCharacterClassCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/regex/SingleCharacterAlternationCheck.java b/python-checks/src/main/java/org/sonar/python/checks/regex/SingleCharacterAlternationCheck.java index 7a10cd1ed..c0597b276 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/regex/SingleCharacterAlternationCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/regex/SingleCharacterAlternationCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/regex/StringReplaceCheck.java b/python-checks/src/main/java/org/sonar/python/checks/regex/StringReplaceCheck.java index 1b018f385..b436d9b21 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/regex/StringReplaceCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/regex/StringReplaceCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/regex/SuperfluousCurlyBraceCheck.java b/python-checks/src/main/java/org/sonar/python/checks/regex/SuperfluousCurlyBraceCheck.java index af46cba32..c141a01b1 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/regex/SuperfluousCurlyBraceCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/regex/SuperfluousCurlyBraceCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/regex/UnquantifiedNonCapturingGroupCheck.java b/python-checks/src/main/java/org/sonar/python/checks/regex/UnquantifiedNonCapturingGroupCheck.java index eb3f9c456..222768423 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/regex/UnquantifiedNonCapturingGroupCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/regex/UnquantifiedNonCapturingGroupCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/regex/UnusedGroupNamesCheck.java b/python-checks/src/main/java/org/sonar/python/checks/regex/UnusedGroupNamesCheck.java index fdf555210..9c50fb6ae 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/regex/UnusedGroupNamesCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/regex/UnusedGroupNamesCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/regex/VerboseRegexCheck.java b/python-checks/src/main/java/org/sonar/python/checks/regex/VerboseRegexCheck.java index b58f24879..901c835e6 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/regex/VerboseRegexCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/regex/VerboseRegexCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/regex/package-info.java b/python-checks/src/main/java/org/sonar/python/checks/regex/package-info.java index e9a845108..7938242d4 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/regex/package-info.java +++ b/python-checks/src/main/java/org/sonar/python/checks/regex/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/AssertAfterRaiseCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/AssertAfterRaiseCheck.java index 553a2d925..dde868f2b 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/AssertAfterRaiseCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/AssertAfterRaiseCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/AssertOnDissimilarTypesCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/AssertOnDissimilarTypesCheck.java index ece9bdf90..73db1c777 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/AssertOnDissimilarTypesCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/AssertOnDissimilarTypesCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/AssertOnTupleLiteralCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/AssertOnTupleLiteralCheck.java index 559bf717d..274e8190e 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/AssertOnTupleLiteralCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/AssertOnTupleLiteralCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/DedicatedAssertionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/DedicatedAssertionCheck.java index dfb681ea9..3881cf849 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/DedicatedAssertionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/DedicatedAssertionCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/ImplicitlySkippedTestCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/ImplicitlySkippedTestCheck.java index b0ad28040..beb377736 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/ImplicitlySkippedTestCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/ImplicitlySkippedTestCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/NotDiscoverableTestMethodCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/NotDiscoverableTestMethodCheck.java index a914eea75..bfbbae3e9 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/NotDiscoverableTestMethodCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/NotDiscoverableTestMethodCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/SkippedTestNoReasonCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/SkippedTestNoReasonCheck.java index 3932e155c..bcb44d699 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/SkippedTestNoReasonCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/SkippedTestNoReasonCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/UnconditionalAssertionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/UnconditionalAssertionCheck.java index 9ddfdfbb5..ece10619a 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/UnconditionalAssertionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/UnconditionalAssertionCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/package-info.java b/python-checks/src/main/java/org/sonar/python/checks/tests/package-info.java index 77f4d166c..c5c4b5750 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/package-info.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/utils/AwsLambdaChecksUtils.java b/python-checks/src/main/java/org/sonar/python/checks/utils/AwsLambdaChecksUtils.java index 02e90bc95..69110aa64 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/utils/AwsLambdaChecksUtils.java +++ b/python-checks/src/main/java/org/sonar/python/checks/utils/AwsLambdaChecksUtils.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/utils/CheckUtils.java b/python-checks/src/main/java/org/sonar/python/checks/utils/CheckUtils.java index 968bad196..cfae1602d 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/utils/CheckUtils.java +++ b/python-checks/src/main/java/org/sonar/python/checks/utils/CheckUtils.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/utils/DeadStoreUtils.java b/python-checks/src/main/java/org/sonar/python/checks/utils/DeadStoreUtils.java index a1b5512c5..5cdc27a05 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/utils/DeadStoreUtils.java +++ b/python-checks/src/main/java/org/sonar/python/checks/utils/DeadStoreUtils.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/utils/Expressions.java b/python-checks/src/main/java/org/sonar/python/checks/utils/Expressions.java index 80b92d196..afc6f5ee8 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/utils/Expressions.java +++ b/python-checks/src/main/java/org/sonar/python/checks/utils/Expressions.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/utils/FunctionParameterUtils.java b/python-checks/src/main/java/org/sonar/python/checks/utils/FunctionParameterUtils.java index 38a3a7f07..d78e3d326 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/utils/FunctionParameterUtils.java +++ b/python-checks/src/main/java/org/sonar/python/checks/utils/FunctionParameterUtils.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/utils/GraphQLUtils.java b/python-checks/src/main/java/org/sonar/python/checks/utils/GraphQLUtils.java index 30fbcebac..bbb880d4e 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/utils/GraphQLUtils.java +++ b/python-checks/src/main/java/org/sonar/python/checks/utils/GraphQLUtils.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/utils/ImportedNamesCollector.java b/python-checks/src/main/java/org/sonar/python/checks/utils/ImportedNamesCollector.java index 70743b562..b68322a8c 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/utils/ImportedNamesCollector.java +++ b/python-checks/src/main/java/org/sonar/python/checks/utils/ImportedNamesCollector.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/utils/IsComprehensionTransformedChecker.java b/python-checks/src/main/java/org/sonar/python/checks/utils/IsComprehensionTransformedChecker.java index 223ede5ed..18d296a4c 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/utils/IsComprehensionTransformedChecker.java +++ b/python-checks/src/main/java/org/sonar/python/checks/utils/IsComprehensionTransformedChecker.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/utils/MarimoUtils.java b/python-checks/src/main/java/org/sonar/python/checks/utils/MarimoUtils.java index b368f3881..322d12b14 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/utils/MarimoUtils.java +++ b/python-checks/src/main/java/org/sonar/python/checks/utils/MarimoUtils.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/utils/StringLiteralValuesCollector.java b/python-checks/src/main/java/org/sonar/python/checks/utils/StringLiteralValuesCollector.java index f7e959a51..5bfaa4d88 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/utils/StringLiteralValuesCollector.java +++ b/python-checks/src/main/java/org/sonar/python/checks/utils/StringLiteralValuesCollector.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/checks/utils/package-info.java b/python-checks/src/main/java/org/sonar/python/checks/utils/package-info.java index d3e954bfa..ed42e1cd6 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/utils/package-info.java +++ b/python-checks/src/main/java/org/sonar/python/checks/utils/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/main/java/org/sonar/python/package-info.java b/python-checks/src/main/java/org/sonar/python/package-info.java index dfd27de73..fbad990d6 100644 --- a/python-checks/src/main/java/org/sonar/python/package-info.java +++ b/python-checks/src/main/java/org/sonar/python/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/AfterJumpStatementCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/AfterJumpStatementCheckTest.java index 48e9b4825..e9cae0c15 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/AfterJumpStatementCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/AfterJumpStatementCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/AllBranchesAreIdenticalCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/AllBranchesAreIdenticalCheckTest.java index 92c32f7f4..e5d5cccc1 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/AllBranchesAreIdenticalCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/AllBranchesAreIdenticalCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/ArgumentNumberCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/ArgumentNumberCheckTest.java index ebc11d1bf..bb2b01ff6 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/ArgumentNumberCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/ArgumentNumberCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/ArgumentTypeCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/ArgumentTypeCheckTest.java index f899693f8..f92dca3c2 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/ArgumentTypeCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/ArgumentTypeCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/AsyncAwsLambdaHandlerCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/AsyncAwsLambdaHandlerCheckTest.java index bc4cba40f..24b7e97d7 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/AsyncAwsLambdaHandlerCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/AsyncAwsLambdaHandlerCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/AsyncFunctionNotAsyncCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/AsyncFunctionNotAsyncCheckTest.java index ef04c7b6f..e773e21e0 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/AsyncFunctionNotAsyncCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/AsyncFunctionNotAsyncCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/AsyncFunctionWithTimeoutCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/AsyncFunctionWithTimeoutCheckTest.java index 4772dc051..47c4235d9 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/AsyncFunctionWithTimeoutCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/AsyncFunctionWithTimeoutCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/AsyncLongSleepCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/AsyncLongSleepCheckTest.java index 9641c0e3a..8bd8e8cab 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/AsyncLongSleepCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/AsyncLongSleepCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/AsyncWithContextManagerCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/AsyncWithContextManagerCheckTest.java index 3d96bfa53..821da7d72 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/AsyncWithContextManagerCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/AsyncWithContextManagerCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/AsyncioTaskNotStoredCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/AsyncioTaskNotStoredCheckTest.java index 63b1e3bf1..54e61158c 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/AsyncioTaskNotStoredCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/AsyncioTaskNotStoredCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/AwsClientExceptionNotCaughtCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/AwsClientExceptionNotCaughtCheckTest.java index f7c81e519..309ae7ce0 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/AwsClientExceptionNotCaughtCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/AwsClientExceptionNotCaughtCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/AwsCustomMetricNamespaceCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/AwsCustomMetricNamespaceCheckTest.java index c2fcdb496..ae57a082e 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/AwsCustomMetricNamespaceCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/AwsCustomMetricNamespaceCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/AwsExpectedBucketOwnerCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/AwsExpectedBucketOwnerCheckTest.java index d010f270b..831618d64 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/AwsExpectedBucketOwnerCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/AwsExpectedBucketOwnerCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/AwsHardcodedRegionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/AwsHardcodedRegionCheckTest.java index b90137689..bf7c11cdb 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/AwsHardcodedRegionCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/AwsHardcodedRegionCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/AwsLambdaClientInstantiationCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/AwsLambdaClientInstantiationCheckTest.java index 54eecdf3f..a98f39bac 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/AwsLambdaClientInstantiationCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/AwsLambdaClientInstantiationCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/AwsLambdaCrossCallCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/AwsLambdaCrossCallCheckTest.java index 0528d08dc..047e040c9 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/AwsLambdaCrossCallCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/AwsLambdaCrossCallCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/AwsLambdaReservedEnvironmentVariableCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/AwsLambdaReservedEnvironmentVariableCheckTest.java index 6a09770f7..ae7a1b9f4 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/AwsLambdaReservedEnvironmentVariableCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/AwsLambdaReservedEnvironmentVariableCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/AwsLambdaReturnValueAreSerializableCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/AwsLambdaReturnValueAreSerializableCheckTest.java index 92c7007de..23a2b49ad 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/AwsLambdaReturnValueAreSerializableCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/AwsLambdaReturnValueAreSerializableCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/AwsLambdaTmpCleanupCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/AwsLambdaTmpCleanupCheckTest.java index 73d34770b..a69fa562c 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/AwsLambdaTmpCleanupCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/AwsLambdaTmpCleanupCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/AwsLongTermAccessKeysCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/AwsLongTermAccessKeysCheckTest.java index a95b7c9a0..a6043f3a5 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/AwsLongTermAccessKeysCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/AwsLongTermAccessKeysCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/AwsMissingPaginationCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/AwsMissingPaginationCheckTest.java index b4bfb682a..de7aecbf7 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/AwsMissingPaginationCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/AwsMissingPaginationCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/AwsWaitersInsteadOfCustomPollingCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/AwsWaitersInsteadOfCustomPollingCheckTest.java index 02e6ec804..4940f3e08 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/AwsWaitersInsteadOfCustomPollingCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/AwsWaitersInsteadOfCustomPollingCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/BackslashInStringCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/BackslashInStringCheckTest.java index e66392a13..7a9e8bd65 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/BackslashInStringCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/BackslashInStringCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/BackticksUsageCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/BackticksUsageCheckTest.java index b379c6c60..d4a5bee72 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/BackticksUsageCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/BackticksUsageCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/BareRaiseInFinallyCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/BareRaiseInFinallyCheckTest.java index 5947316cc..ba9129550 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/BareRaiseInFinallyCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/BareRaiseInFinallyCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/BindToAllNetworkInterfacesCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/BindToAllNetworkInterfacesCheckTest.java index 791a3df70..a84bf62ba 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/BindToAllNetworkInterfacesCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/BindToAllNetworkInterfacesCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/BooleanCheckNotInvertedCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/BooleanCheckNotInvertedCheckTest.java index 0cc2a994f..d05305b59 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/BooleanCheckNotInvertedCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/BooleanCheckNotInvertedCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/BooleanExpressionInExceptCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/BooleanExpressionInExceptCheckTest.java index 453cf868d..68c03afe4 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/BooleanExpressionInExceptCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/BooleanExpressionInExceptCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/BreakContinueOutsideLoopCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/BreakContinueOutsideLoopCheckTest.java index 279e1379c..737c3f191 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/BreakContinueOutsideLoopCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/BreakContinueOutsideLoopCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/BuiltinGenericsOverTypingModuleCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/BuiltinGenericsOverTypingModuleCheckTest.java index b9ada7e11..697dbe0c9 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/BuiltinGenericsOverTypingModuleCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/BuiltinGenericsOverTypingModuleCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/BuiltinShadowingAssignmentCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/BuiltinShadowingAssignmentCheckTest.java index bf1094bcc..e1f16e4c8 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/BuiltinShadowingAssignmentCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/BuiltinShadowingAssignmentCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/BusyWaitingInAsyncCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/BusyWaitingInAsyncCheckTest.java index c16b3ca9f..1d9fca5ca 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/BusyWaitingInAsyncCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/BusyWaitingInAsyncCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/CancellationReraisedInAsyncCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/CancellationReraisedInAsyncCheckTest.java index e7312767b..4813c85f1 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/CancellationReraisedInAsyncCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/CancellationReraisedInAsyncCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/CancellationScopeNoCheckpointCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/CancellationScopeNoCheckpointCheckTest.java index 6b2b43fc6..5a6c0cf3b 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/CancellationScopeNoCheckpointCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/CancellationScopeNoCheckpointCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/CaughtExceptionsCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/CaughtExceptionsCheckTest.java index 5ec30475c..bfdbadc4c 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/CaughtExceptionsCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/CaughtExceptionsCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/ChangeMethodContractCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/ChangeMethodContractCheckTest.java index b3b558c49..d4535fcaf 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/ChangeMethodContractCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/ChangeMethodContractCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/ChildAndParentExceptionCaughtCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/ChildAndParentExceptionCaughtCheckTest.java index 99eb5179c..d12290e33 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/ChildAndParentExceptionCaughtCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/ChildAndParentExceptionCaughtCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/ChildRouterBeforeParentRegistrationCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/ChildRouterBeforeParentRegistrationCheckTest.java index b592d81f4..5c2ce9069 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/ChildRouterBeforeParentRegistrationCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/ChildRouterBeforeParentRegistrationCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/CipherBlockChainingCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/CipherBlockChainingCheckTest.java index 067a829ce..8c25ca2c6 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/CipherBlockChainingCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/CipherBlockChainingCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/ClassComplexityCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/ClassComplexityCheckTest.java index fb8d1cc13..580305077 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/ClassComplexityCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/ClassComplexityCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/ClassFieldDefinedMultipleTimesCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/ClassFieldDefinedMultipleTimesCheckTest.java index ca6714373..3dc8a4b0f 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/ClassFieldDefinedMultipleTimesCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/ClassFieldDefinedMultipleTimesCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/ClassMethodFirstArgumentNameCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/ClassMethodFirstArgumentNameCheckTest.java index 5640e39ce..baf954ab4 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/ClassMethodFirstArgumentNameCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/ClassMethodFirstArgumentNameCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/ClassNameCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/ClassNameCheckTest.java index 3f23617ba..cc90665fb 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/ClassNameCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/ClassNameCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/CognitiveComplexityFunctionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/CognitiveComplexityFunctionCheckTest.java index 662d645c5..25833308e 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/CognitiveComplexityFunctionCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/CognitiveComplexityFunctionCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/CollapsibleIfStatementsCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/CollapsibleIfStatementsCheckTest.java index 777e3c3b3..d140aa0e6 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/CollapsibleIfStatementsCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/CollapsibleIfStatementsCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/CollectionCreationWrappedInConstructorCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/CollectionCreationWrappedInConstructorCheckTest.java index 2316caa89..7261175b3 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/CollectionCreationWrappedInConstructorCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/CollectionCreationWrappedInConstructorCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/CollectionLengthComparisonCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/CollectionLengthComparisonCheckTest.java index 0b4390824..3a98804f3 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/CollectionLengthComparisonCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/CollectionLengthComparisonCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/CommentRegularExpressionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/CommentRegularExpressionCheckTest.java index 89d9076d5..ce9fd0831 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/CommentRegularExpressionCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/CommentRegularExpressionCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/CommentedCodeCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/CommentedCodeCheckTest.java index 041b09daf..4b3f7add1 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/CommentedCodeCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/CommentedCodeCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/ComparisonToNoneCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/ComparisonToNoneCheckTest.java index b5df401a2..4f92eb894 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/ComparisonToNoneCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/ComparisonToNoneCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/CompressionModulesFromNamespaceCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/CompressionModulesFromNamespaceCheckTest.java index 1bf9db42d..ac658321f 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/CompressionModulesFromNamespaceCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/CompressionModulesFromNamespaceCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/ConfusingTypeCheckingCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/ConfusingTypeCheckingCheckTest.java index 780be48ee..737eec878 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/ConfusingTypeCheckingCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/ConfusingTypeCheckingCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/ConfusingWalrusCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/ConfusingWalrusCheckTest.java index dd65ed056..6e24522f6 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/ConfusingWalrusCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/ConfusingWalrusCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/ConsistentReturnCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/ConsistentReturnCheckTest.java index 1f299d76a..3dba8af85 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/ConsistentReturnCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/ConsistentReturnCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/ConstantConditionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/ConstantConditionCheckTest.java index 8f158f125..d96f119ea 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/ConstantConditionCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/ConstantConditionCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/ConstantValueDictComprehensionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/ConstantValueDictComprehensionCheckTest.java index 276918082..412765fa6 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/ConstantValueDictComprehensionCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/ConstantValueDictComprehensionCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/ControlFlowInTaskGroupCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/ControlFlowInTaskGroupCheckTest.java index 6f8658894..422d08c47 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/ControlFlowInTaskGroupCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/ControlFlowInTaskGroupCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/CorsMiddlewareOrderingCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/CorsMiddlewareOrderingCheckTest.java index 36c0f1eb1..e7e3bc9db 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/CorsMiddlewareOrderingCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/CorsMiddlewareOrderingCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/DbNoPasswordCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/DbNoPasswordCheckTest.java index 0f5d12358..2de623778 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/DbNoPasswordCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/DbNoPasswordCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/DeadStoreCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/DeadStoreCheckTest.java index 07e9e9fa1..1587df1a1 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/DeadStoreCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/DeadStoreCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/DefaultFactoryArgumentCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/DefaultFactoryArgumentCheckTest.java index f870fe354..df68c12b2 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/DefaultFactoryArgumentCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/DefaultFactoryArgumentCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/DeprecatedNumpyTypesCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/DeprecatedNumpyTypesCheckTest.java index 8c42d8e30..0a89babf8 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/DeprecatedNumpyTypesCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/DeprecatedNumpyTypesCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/DictKeysMembershipTestCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/DictKeysMembershipTestCheckTest.java index e985d74b9..ac3167aa7 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/DictKeysMembershipTestCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/DictKeysMembershipTestCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/DictionaryDuplicateKeyCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/DictionaryDuplicateKeyCheckTest.java index edbbbc9d6..5bcfb8029 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/DictionaryDuplicateKeyCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/DictionaryDuplicateKeyCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/DictionaryStaticKeyCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/DictionaryStaticKeyCheckTest.java index 48a0c3d03..71f833011 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/DictionaryStaticKeyCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/DictionaryStaticKeyCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/DirectTypeComparisonCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/DirectTypeComparisonCheckTest.java index c71e24498..5f711ef7e 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/DirectTypeComparisonCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/DirectTypeComparisonCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/DjangoNonDictSerializationCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/DjangoNonDictSerializationCheckTest.java index f1aca1471..886f9c898 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/DjangoNonDictSerializationCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/DjangoNonDictSerializationCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/DjangoRenderContextCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/DjangoRenderContextCheckTest.java index f99013a32..2b4b3838d 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/DjangoRenderContextCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/DjangoRenderContextCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/DoublePrefixOperatorCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/DoublePrefixOperatorCheckTest.java index efa7f081e..2e44ae6da 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/DoublePrefixOperatorCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/DoublePrefixOperatorCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/DuplicateArgumentCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/DuplicateArgumentCheckTest.java index de8091f4e..f390eba8f 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/DuplicateArgumentCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/DuplicateArgumentCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/DuplicateBaseClassCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/DuplicateBaseClassCheckTest.java index fcc891324..9d1a7c418 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/DuplicateBaseClassCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/DuplicateBaseClassCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/DuplicatedMethodFieldNamesCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/DuplicatedMethodFieldNamesCheckTest.java index 6f64d5cdc..e60aa96a2 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/DuplicatedMethodFieldNamesCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/DuplicatedMethodFieldNamesCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/DuplicatedMethodImplementationCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/DuplicatedMethodImplementationCheckTest.java index 629dce9b6..b12f62fb3 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/DuplicatedMethodImplementationCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/DuplicatedMethodImplementationCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/EinopsSyntaxCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/EinopsSyntaxCheckTest.java index 006254dd6..5a9b86fbd 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/EinopsSyntaxCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/EinopsSyntaxCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/ElseAfterLoopsWithoutBreakCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/ElseAfterLoopsWithoutBreakCheckTest.java index 887573ef9..ea0ee8874 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/ElseAfterLoopsWithoutBreakCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/ElseAfterLoopsWithoutBreakCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/EmptyCollectionConstructorCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/EmptyCollectionConstructorCheckTest.java index 1ad49aad9..24fac657b 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/EmptyCollectionConstructorCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/EmptyCollectionConstructorCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/EmptyFunctionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/EmptyFunctionCheckTest.java index 582881857..164204d54 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/EmptyFunctionCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/EmptyFunctionCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/EmptyNestedBlockCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/EmptyNestedBlockCheckTest.java index 87cd539ba..6331b13df 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/EmptyNestedBlockCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/EmptyNestedBlockCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/ExceptRethrowingCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/ExceptRethrowingCheckTest.java index 08e1c177f..e8ce69a36 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/ExceptRethrowingCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/ExceptRethrowingCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/ExceptionCauseTypeCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/ExceptionCauseTypeCheckTest.java index c784cfa5b..5429bd7f2 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/ExceptionCauseTypeCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/ExceptionCauseTypeCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/ExceptionGroupCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/ExceptionGroupCheckTest.java index a848908e6..c7cd12a8c 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/ExceptionGroupCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/ExceptionGroupCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/ExceptionNotThrownCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/ExceptionNotThrownCheckTest.java index b5a2080c8..f407b4814 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/ExceptionNotThrownCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/ExceptionNotThrownCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/ExceptionSuperClassDeclarationCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/ExceptionSuperClassDeclarationCheckTest.java index 4b11469af..3b2fda1aa 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/ExceptionSuperClassDeclarationCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/ExceptionSuperClassDeclarationCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/ExecStatementUsageCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/ExecStatementUsageCheckTest.java index 61f0fa268..c65310483 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/ExecStatementUsageCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/ExecStatementUsageCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/ExitHasBadArgumentsCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/ExitHasBadArgumentsCheckTest.java index 02f73db45..f17e730ae 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/ExitHasBadArgumentsCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/ExitHasBadArgumentsCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/FStringNestingLevelCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/FStringNestingLevelCheckTest.java index 332fffed7..c8637bc44 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/FStringNestingLevelCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/FStringNestingLevelCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/FastAPIDependencyAnnotatedCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/FastAPIDependencyAnnotatedCheckTest.java index 45358b3aa..418c67b87 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/FastAPIDependencyAnnotatedCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/FastAPIDependencyAnnotatedCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/FastAPIFileUploadFormCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/FastAPIFileUploadFormCheckTest.java index a5ff9134f..90cccd927 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/FastAPIFileUploadFormCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/FastAPIFileUploadFormCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/FastAPIGenericRouteDecoratorCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/FastAPIGenericRouteDecoratorCheckTest.java index f697e9a19..c81507d41 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/FastAPIGenericRouteDecoratorCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/FastAPIGenericRouteDecoratorCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/FastAPIHTTPExceptionDocumentedCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/FastAPIHTTPExceptionDocumentedCheckTest.java index f103bb131..0bb88daae 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/FastAPIHTTPExceptionDocumentedCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/FastAPIHTTPExceptionDocumentedCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/FastAPIPathParametersCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/FastAPIPathParametersCheckTest.java index 5a68520c1..f40cc161b 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/FastAPIPathParametersCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/FastAPIPathParametersCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/FastAPIRedundantResponseModelCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/FastAPIRedundantResponseModelCheckTest.java index c45dffbd9..67dc3e248 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/FastAPIRedundantResponseModelCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/FastAPIRedundantResponseModelCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/FastApiImportStringCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/FastApiImportStringCheckTest.java index 686a81b7e..57e33e0b4 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/FastApiImportStringCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/FastApiImportStringCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/FieldDuplicatesClassNameCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/FieldDuplicatesClassNameCheckTest.java index 4dbeed547..62e8dcc1c 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/FieldDuplicatesClassNameCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/FieldDuplicatesClassNameCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/FieldNameCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/FieldNameCheckTest.java index 6d556a3c5..3a8b524e8 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/FieldNameCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/FieldNameCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/FileComplexityCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/FileComplexityCheckTest.java index dd5daac57..c0bf8d0df 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/FileComplexityCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/FileComplexityCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/FileHeaderCopyrightCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/FileHeaderCopyrightCheckTest.java index 363e31184..7fe722ead 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/FileHeaderCopyrightCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/FileHeaderCopyrightCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/FilePermissionsCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/FilePermissionsCheckTest.java index cba0ffcb3..92069aed0 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/FilePermissionsCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/FilePermissionsCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/FixmeCommentCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/FixmeCommentCheckTest.java index 8ab95dd28..9ddfbeba8 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/FixmeCommentCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/FixmeCommentCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/FlaskErrorHandlerStatusCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/FlaskErrorHandlerStatusCheckTest.java index 378b840fc..74458ae6f 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/FlaskErrorHandlerStatusCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/FlaskErrorHandlerStatusCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/FlaskHardCodedJWTSecretKeyCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/FlaskHardCodedJWTSecretKeyCheckTest.java index 2afaa9f7d..f672c88e7 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/FlaskHardCodedJWTSecretKeyCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/FlaskHardCodedJWTSecretKeyCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/FlaskHardCodedSecretKeyCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/FlaskHardCodedSecretKeyCheckTest.java index 123bbb503..71719cd3d 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/FlaskHardCodedSecretKeyCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/FlaskHardCodedSecretKeyCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/FlaskHeadersDictAccessCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/FlaskHeadersDictAccessCheckTest.java index 113f80201..ba4c2af29 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/FlaskHeadersDictAccessCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/FlaskHeadersDictAccessCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/FlaskPostWithQueryParameterCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/FlaskPostWithQueryParameterCheckTest.java index 99385675c..92d023114 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/FlaskPostWithQueryParameterCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/FlaskPostWithQueryParameterCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/FlaskPreprocessRequestCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/FlaskPreprocessRequestCheckTest.java index 07eb5d941..4b3e0e4dc 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/FlaskPreprocessRequestCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/FlaskPreprocessRequestCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/FlaskRouteMethodsCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/FlaskRouteMethodsCheckTest.java index ddd344dee..dd83cd5ac 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/FlaskRouteMethodsCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/FlaskRouteMethodsCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/FlaskSendFileMimeTypeCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/FlaskSendFileMimeTypeCheckTest.java index f5ab69783..c2c548522 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/FlaskSendFileMimeTypeCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/FlaskSendFileMimeTypeCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/FlaskViewDecoratorCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/FlaskViewDecoratorCheckTest.java index eac3d07b8..e21f96c02 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/FlaskViewDecoratorCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/FlaskViewDecoratorCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/FloatingPointEqualityCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/FloatingPointEqualityCheckTest.java index ec7f828a5..2b8121992 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/FloatingPointEqualityCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/FloatingPointEqualityCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/FunctionComplexityCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/FunctionComplexityCheckTest.java index 20591fd7f..c6b333521 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/FunctionComplexityCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/FunctionComplexityCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/FunctionNameCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/FunctionNameCheckTest.java index f124dc041..9aa2a055c 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/FunctionNameCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/FunctionNameCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/FunctionReturnTypeCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/FunctionReturnTypeCheckTest.java index 9b5cebb23..8c68763c8 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/FunctionReturnTypeCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/FunctionReturnTypeCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/FunctionUsingLoopVariableCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/FunctionUsingLoopVariableCheckTest.java index 76434c0d8..8fbb5cde8 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/FunctionUsingLoopVariableCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/FunctionUsingLoopVariableCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/GenericClassTypeParameterCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/GenericClassTypeParameterCheckTest.java index c70ff835a..12b88fe42 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/GenericClassTypeParameterCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/GenericClassTypeParameterCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/GenericExceptionRaisedCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/GenericExceptionRaisedCheckTest.java index 84a7cb8a6..780ed0738 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/GenericExceptionRaisedCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/GenericExceptionRaisedCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/GenericFunctionTypeParameterCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/GenericFunctionTypeParameterCheckTest.java index feb43ffd1..a8dbb4a3d 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/GenericFunctionTypeParameterCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/GenericFunctionTypeParameterCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/GenericTypeStatementCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/GenericTypeStatementCheckTest.java index ee660991a..1358cc340 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/GenericTypeStatementCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/GenericTypeStatementCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/GenericTypeWithoutArgumentCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/GenericTypeWithoutArgumentCheckTest.java index d10144478..3288ca62c 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/GenericTypeWithoutArgumentCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/GenericTypeWithoutArgumentCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/GraphQLDenialOfServiceCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/GraphQLDenialOfServiceCheckTest.java index 2886959cb..9a02015ad 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/GraphQLDenialOfServiceCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/GraphQLDenialOfServiceCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/HardcodedCredentialsCallCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/HardcodedCredentialsCallCheckTest.java index 29cb4d021..a47f6c854 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/HardcodedCredentialsCallCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/HardcodedCredentialsCallCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/HardcodedIPCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/HardcodedIPCheckTest.java index 47fc80cff..32bf6d92c 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/HardcodedIPCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/HardcodedIPCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/HashMethodCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/HashMethodCheckTest.java index 6ac0a7a0c..ad2a52827 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/HashMethodCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/HashMethodCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/HttpNoContentNonEmptyBodyCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/HttpNoContentNonEmptyBodyCheckTest.java index 4d33d8c6f..0c531d801 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/HttpNoContentNonEmptyBodyCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/HttpNoContentNonEmptyBodyCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/IdenticalExpressionOnBinaryOperatorCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/IdenticalExpressionOnBinaryOperatorCheckTest.java index 71e81daa9..d9d090765 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/IdenticalExpressionOnBinaryOperatorCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/IdenticalExpressionOnBinaryOperatorCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/IdentityComparisonWithCachedTypesCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/IdentityComparisonWithCachedTypesCheckTest.java index fdc4fa25f..6d172cc91 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/IdentityComparisonWithCachedTypesCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/IdentityComparisonWithCachedTypesCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/IdentityComparisonWithNewObjectCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/IdentityComparisonWithNewObjectCheckTest.java index 14edbeafd..decffb9c6 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/IdentityComparisonWithNewObjectCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/IdentityComparisonWithNewObjectCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/IgnoredParameterCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/IgnoredParameterCheckTest.java index 5c62b3af7..41792b110 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/IgnoredParameterCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/IgnoredParameterCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/IgnoredPureOperationsCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/IgnoredPureOperationsCheckTest.java index 936568aaa..0dc0df8e1 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/IgnoredPureOperationsCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/IgnoredPureOperationsCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/IgnoredSystemExitCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/IgnoredSystemExitCheckTest.java index c9a1f666a..32761d0b4 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/IgnoredSystemExitCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/IgnoredSystemExitCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/ImplicitStringConcatenationCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/ImplicitStringConcatenationCheckTest.java index d9d4f4433..60bb06964 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/ImplicitStringConcatenationCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/ImplicitStringConcatenationCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/IncompatibleOperandsCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/IncompatibleOperandsCheckTest.java index e36b34ffe..44faf109a 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/IncompatibleOperandsCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/IncompatibleOperandsCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/InconsistentTupleReturnCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/InconsistentTupleReturnCheckTest.java index 0db6e3a87..50f0773fd 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/InconsistentTupleReturnCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/InconsistentTupleReturnCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/InconsistentTypeHintCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/InconsistentTypeHintCheckTest.java index f457cfaf9..a965887bc 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/InconsistentTypeHintCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/InconsistentTypeHintCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/IncorrectExceptionTypeCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/IncorrectExceptionTypeCheckTest.java index 9d26b721c..4be255611 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/IncorrectExceptionTypeCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/IncorrectExceptionTypeCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/IncorrectParameterDatetimeConstructorsCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/IncorrectParameterDatetimeConstructorsCheckTest.java index 35bcf2102..44e1f777f 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/IncorrectParameterDatetimeConstructorsCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/IncorrectParameterDatetimeConstructorsCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/IndexMethodCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/IndexMethodCheckTest.java index abec2579b..cc3beb39d 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/IndexMethodCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/IndexMethodCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/InefficientDictIterationCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/InefficientDictIterationCheckTest.java index fef66f93e..014b0ff0e 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/InefficientDictIterationCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/InefficientDictIterationCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/InequalityUsageCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/InequalityUsageCheckTest.java index 334ec907b..70ea92151 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/InequalityUsageCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/InequalityUsageCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/InfiniteRecursionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/InfiniteRecursionCheckTest.java index 8b8276867..cd32642fa 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/InfiniteRecursionCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/InfiniteRecursionCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/InitReturnsValueCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/InitReturnsValueCheckTest.java index 82dfe5b00..a9f65d489 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/InitReturnsValueCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/InitReturnsValueCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/InputInAsyncCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/InputInAsyncCheckTest.java index a4c626118..a9f508525 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/InputInAsyncCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/InputInAsyncCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/InstanceAndClassMethodsAtLeastOnePositionalCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/InstanceAndClassMethodsAtLeastOnePositionalCheckTest.java index 1cad8baf7..2260d7956 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/InstanceAndClassMethodsAtLeastOnePositionalCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/InstanceAndClassMethodsAtLeastOnePositionalCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/InstanceMethodSelfAsFirstCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/InstanceMethodSelfAsFirstCheckTest.java index 5999a5e47..9dd737405 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/InstanceMethodSelfAsFirstCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/InstanceMethodSelfAsFirstCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/InvalidOpenModeCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/InvalidOpenModeCheckTest.java index f8fd65899..364ffba3d 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/InvalidOpenModeCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/InvalidOpenModeCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/InvariantReturnCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/InvariantReturnCheckTest.java index 759b7c547..23dd487de 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/InvariantReturnCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/InvariantReturnCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/IsCloseAbsTolCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/IsCloseAbsTolCheckTest.java index ceb452df2..65f85c6b4 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/IsCloseAbsTolCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/IsCloseAbsTolCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/ItemOperationsTypeCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/ItemOperationsTypeCheckTest.java index fb03bf409..490921433 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/ItemOperationsTypeCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/ItemOperationsTypeCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/IterMethodReturnTypeCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/IterMethodReturnTypeCheckTest.java index c647daf34..b8cfd0a84 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/IterMethodReturnTypeCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/IterMethodReturnTypeCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/IterationOnNonIterableCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/IterationOnNonIterableCheckTest.java index 4695e9f85..6df73f928 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/IterationOnNonIterableCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/IterationOnNonIterableCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/JumpInFinallyCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/JumpInFinallyCheckTest.java index b1cc661bf..b29e282a1 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/JumpInFinallyCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/JumpInFinallyCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/JwtVerificationCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/JwtVerificationCheckTest.java index 1aefe8558..a28fc0641 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/JwtVerificationCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/JwtVerificationCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/LambdaAssignmentCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/LambdaAssignmentCheckTest.java index 9442fa00b..71d4dbdde 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/LambdaAssignmentCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/LambdaAssignmentCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/LdapAuthenticationCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/LdapAuthenticationCheckTest.java index 625599b34..543f4c1f5 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/LdapAuthenticationCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/LdapAuthenticationCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/LineLengthCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/LineLengthCheckTest.java index 4b217d256..d843cd724 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/LineLengthCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/LineLengthCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/LocalVariableAndParameterNameConventionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/LocalVariableAndParameterNameConventionCheckTest.java index f453db7e8..0773775c2 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/LocalVariableAndParameterNameConventionCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/LocalVariableAndParameterNameConventionCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/LongIntegerWithLowercaseSuffixUsageCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/LongIntegerWithLowercaseSuffixUsageCheckTest.java index 52cd95b59..681fbc928 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/LongIntegerWithLowercaseSuffixUsageCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/LongIntegerWithLowercaseSuffixUsageCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/LoopExecutingAtMostOnceCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/LoopExecutingAtMostOnceCheckTest.java index ef2525cd4..07f3bd454 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/LoopExecutingAtMostOnceCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/LoopExecutingAtMostOnceCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/LoopOverDictKeyValuesCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/LoopOverDictKeyValuesCheckTest.java index cab2bf9e4..b876bb1d9 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/LoopOverDictKeyValuesCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/LoopOverDictKeyValuesCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/MandatoryFunctionParameterTypeHintCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/MandatoryFunctionParameterTypeHintCheckTest.java index 53d8f9c89..754e5efc7 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/MandatoryFunctionParameterTypeHintCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/MandatoryFunctionParameterTypeHintCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/MandatoryFunctionReturnTypeHintCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/MandatoryFunctionReturnTypeHintCheckTest.java index 387bd5074..b024e0212 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/MandatoryFunctionReturnTypeHintCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/MandatoryFunctionReturnTypeHintCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/MembershipTestSupportCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/MembershipTestSupportCheckTest.java index 643ce873d..0d6f310b0 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/MembershipTestSupportCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/MembershipTestSupportCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/MethodNameCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/MethodNameCheckTest.java index fb71edbf5..389586e3d 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/MethodNameCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/MethodNameCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/MethodShouldBeStaticCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/MethodShouldBeStaticCheckTest.java index 3dc1613ee..dc8377ef5 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/MethodShouldBeStaticCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/MethodShouldBeStaticCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/MissingDocstringCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/MissingDocstringCheckTest.java index 3eb224685..bf497c024 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/MissingDocstringCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/MissingDocstringCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/MissingHyperParameterCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/MissingHyperParameterCheckTest.java index d59a74545..988c64ff5 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/MissingHyperParameterCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/MissingHyperParameterCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/MissingNewlineAtEndOfFileCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/MissingNewlineAtEndOfFileCheckTest.java index cd55ef6c3..08996aae6 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/MissingNewlineAtEndOfFileCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/MissingNewlineAtEndOfFileCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/ModifiedParameterValueCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/ModifiedParameterValueCheckTest.java index 9403fd0ef..d83bff4ee 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/ModifiedParameterValueCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/ModifiedParameterValueCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/ModuleNameCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/ModuleNameCheckTest.java index 9f6732c3b..10b6e3404 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/ModuleNameCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/ModuleNameCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/MutableDefaultValueCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/MutableDefaultValueCheckTest.java index 39057e8a9..2d0fbb9f5 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/MutableDefaultValueCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/MutableDefaultValueCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/NeedlessPassCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/NeedlessPassCheckTest.java index 2f3693110..5b64cb7b8 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/NeedlessPassCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/NeedlessPassCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/NestedCollectionsCreationCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/NestedCollectionsCreationCheckTest.java index b009b2b17..09f2d7b37 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/NestedCollectionsCreationCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/NestedCollectionsCreationCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/NestedConditionalExpressionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/NestedConditionalExpressionCheckTest.java index c54df288e..07f7ef777 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/NestedConditionalExpressionCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/NestedConditionalExpressionCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/NestedControlFlowDepthCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/NestedControlFlowDepthCheckTest.java index 973425dc2..d04156526 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/NestedControlFlowDepthCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/NestedControlFlowDepthCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/NestedLoopVariableReuseCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/NestedLoopVariableReuseCheckTest.java index 90f867371..8fb6458fe 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/NestedLoopVariableReuseCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/NestedLoopVariableReuseCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/NewStyleClassCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/NewStyleClassCheckTest.java index abd08a402..84701dcb8 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/NewStyleClassCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/NewStyleClassCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/NoPersonReferenceInTodoCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/NoPersonReferenceInTodoCheckTest.java index 8318031d0..93fc72689 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/NoPersonReferenceInTodoCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/NoPersonReferenceInTodoCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/NoQaCommentCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/NoQaCommentCheckTest.java index a50ea6cc7..4883f6bb3 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/NoQaCommentCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/NoQaCommentCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/NoReRaiseInExitCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/NoReRaiseInExitCheckTest.java index b2d28cdd4..75758831b 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/NoReRaiseInExitCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/NoReRaiseInExitCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/NoSonarCommentCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/NoSonarCommentCheckTest.java index 98cdce0b7..ac37ed5dc 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/NoSonarCommentCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/NoSonarCommentCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/NoSonarCommentFormatCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/NoSonarCommentFormatCheckTest.java index 645319a63..6d13dd573 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/NoSonarCommentFormatCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/NoSonarCommentFormatCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/NonCallableCalledCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/NonCallableCalledCheckTest.java index d6faa4632..a0442c92f 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/NonCallableCalledCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/NonCallableCalledCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/NonSingletonTfVariableCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/NonSingletonTfVariableCheckTest.java index bde7005f8..5294af3cb 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/NonSingletonTfVariableCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/NonSingletonTfVariableCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/NonStringInAllPropertyCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/NonStringInAllPropertyCheckTest.java index 7d0e0979d..4ec239430 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/NonStringInAllPropertyCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/NonStringInAllPropertyCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/NotImplementedBooleanContextCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/NotImplementedBooleanContextCheckTest.java index 9d7dbc5a7..9fac89c90 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/NotImplementedBooleanContextCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/NotImplementedBooleanContextCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/NotImplementedErrorInOperatorMethodsCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/NotImplementedErrorInOperatorMethodsCheckTest.java index 03b0eeb3b..28a093ed7 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/NotImplementedErrorInOperatorMethodsCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/NotImplementedErrorInOperatorMethodsCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/NumpyIsNanCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/NumpyIsNanCheckTest.java index 82d4a6a7e..bd38fa16b 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/NumpyIsNanCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/NumpyIsNanCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/NumpyListOverGeneratorCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/NumpyListOverGeneratorCheckTest.java index 571848e84..64c263e03 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/NumpyListOverGeneratorCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/NumpyListOverGeneratorCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/NumpyRandomStateCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/NumpyRandomStateCheckTest.java index 471d6aa8d..ca941ef7b 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/NumpyRandomStateCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/NumpyRandomStateCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/NumpyWeekMaskValidationCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/NumpyWeekMaskValidationCheckTest.java index 3e2173243..7f107b69d 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/NumpyWeekMaskValidationCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/NumpyWeekMaskValidationCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/NumpyWhereOneConditionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/NumpyWhereOneConditionCheckTest.java index fa2ae4dbe..4a9077a31 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/NumpyWhereOneConditionCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/NumpyWhereOneConditionCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/OneStatementPerLineCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/OneStatementPerLineCheckTest.java index a22a04a08..78750ed8b 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/OneStatementPerLineCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/OneStatementPerLineCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/OpenSourceCheckListTest.java b/python-checks/src/test/java/org/sonar/python/checks/OpenSourceCheckListTest.java index 8bd1b9baa..baa8401b6 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/OpenSourceCheckListTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/OpenSourceCheckListTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/OverwrittenCollectionEntryCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/OverwrittenCollectionEntryCheckTest.java index ef103f240..54ce16db1 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/OverwrittenCollectionEntryCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/OverwrittenCollectionEntryCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/PandasAddMergeParametersCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/PandasAddMergeParametersCheckTest.java index 53ac33faa..52797365d 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/PandasAddMergeParametersCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/PandasAddMergeParametersCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/PandasChainInstructionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/PandasChainInstructionCheckTest.java index e7043bbf6..de8980064 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/PandasChainInstructionCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/PandasChainInstructionCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/PandasDataFrameToNumpyCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/PandasDataFrameToNumpyCheckTest.java index e9e40ccc3..c9bef482a 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/PandasDataFrameToNumpyCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/PandasDataFrameToNumpyCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/PandasModifyInPlaceCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/PandasModifyInPlaceCheckTest.java index b56a77f03..b937ccf30 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/PandasModifyInPlaceCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/PandasModifyInPlaceCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/PandasReadNoDataTypeCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/PandasReadNoDataTypeCheckTest.java index 86195dd9f..4761f7598 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/PandasReadNoDataTypeCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/PandasReadNoDataTypeCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/PandasToDatetimeFormatCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/PandasToDatetimeFormatCheckTest.java index e774a7650..67971435f 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/PandasToDatetimeFormatCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/PandasToDatetimeFormatCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/ParsingErrorCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/ParsingErrorCheckTest.java index c03fa289f..9c4ea974e 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/ParsingErrorCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/ParsingErrorCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/PreIncrementDecrementCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/PreIncrementDecrementCheckTest.java index 645007f8c..cb0a566fc 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/PreIncrementDecrementCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/PreIncrementDecrementCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/PredictableSaltCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/PredictableSaltCheckTest.java index d07555e66..28767e14f 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/PredictableSaltCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/PredictableSaltCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/PrintStatementUsageCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/PrintStatementUsageCheckTest.java index 503c39426..2a1f756aa 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/PrintStatementUsageCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/PrintStatementUsageCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/PropertyAccessorParameterCountCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/PropertyAccessorParameterCountCheckTest.java index 50c23d503..a2702b765 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/PropertyAccessorParameterCountCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/PropertyAccessorParameterCountCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/PyTorchDataLoaderNumWorkersCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/PyTorchDataLoaderNumWorkersCheckTest.java index 217c0bc1f..78e563a9b 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/PyTorchDataLoaderNumWorkersCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/PyTorchDataLoaderNumWorkersCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/PydanticOptionalFieldDefaultCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/PydanticOptionalFieldDefaultCheckTest.java index fa77b0a34..657d1d2ba 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/PydanticOptionalFieldDefaultCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/PydanticOptionalFieldDefaultCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/PytzTimeZoneInDatetimeConstructorCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/PytzTimeZoneInDatetimeConstructorCheckTest.java index 02c9fcf95..7eb6ea699 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/PytzTimeZoneInDatetimeConstructorCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/PytzTimeZoneInDatetimeConstructorCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/PytzUsageCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/PytzUsageCheckTest.java index 96ff89470..2adffedaf 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/PytzUsageCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/PytzUsageCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/RaiseOutsideExceptCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/RaiseOutsideExceptCheckTest.java index 1806908fe..07372d9ec 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/RaiseOutsideExceptCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/RaiseOutsideExceptCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/RandomSeedCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/RandomSeedCheckTest.java index 9d3b812ee..096d29799 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/RandomSeedCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/RandomSeedCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/RedundantJumpCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/RedundantJumpCheckTest.java index 96016d200..e88a96090 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/RedundantJumpCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/RedundantJumpCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/ReferencedBeforeAssignmentCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/ReferencedBeforeAssignmentCheckTest.java index 5482c2df0..19fc832f7 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/ReferencedBeforeAssignmentCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/ReferencedBeforeAssignmentCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/ReturnAndYieldInOneFunctionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/ReturnAndYieldInOneFunctionCheckTest.java index 7cace1bcb..1aa7c5a12 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/ReturnAndYieldInOneFunctionCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/ReturnAndYieldInOneFunctionCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/ReturnYieldOutsideFunctionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/ReturnYieldOutsideFunctionCheckTest.java index d0d3a6025..c1162c341 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/ReturnYieldOutsideFunctionCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/ReturnYieldOutsideFunctionCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/RewriteCollectionConstructorAsComprehensionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/RewriteCollectionConstructorAsComprehensionCheckTest.java index 7acfdecc1..20a42c2a5 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/RewriteCollectionConstructorAsComprehensionCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/RewriteCollectionConstructorAsComprehensionCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/RobustCipherAlgorithmCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/RobustCipherAlgorithmCheckTest.java index 1d90030ec..941a0d6de 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/RobustCipherAlgorithmCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/RobustCipherAlgorithmCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/RouterPrefixInIncludeRouterCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/RouterPrefixInIncludeRouterCheckTest.java index 0f3663509..b79bbed01 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/RouterPrefixInIncludeRouterCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/RouterPrefixInIncludeRouterCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/SameBranchCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/SameBranchCheckTest.java index b4307d5b4..55b7d3df1 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/SameBranchCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/SameBranchCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/SameConditionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/SameConditionCheckTest.java index 036b02ca2..a490081f3 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/SameConditionCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/SameConditionCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/SecureModeEncryptionAlgorithmsCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/SecureModeEncryptionAlgorithmsCheckTest.java index 993df1ac9..2f4848ca5 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/SecureModeEncryptionAlgorithmsCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/SecureModeEncryptionAlgorithmsCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/SelfAssignmentCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/SelfAssignmentCheckTest.java index 1b1ea6e24..5ab04b06c 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/SelfAssignmentCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/SelfAssignmentCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/SetDuplicateKeyCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/SetDuplicateKeyCheckTest.java index 1fab1f34f..7bd41f569 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/SetDuplicateKeyCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/SetDuplicateKeyCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/SideEffectInTfFunctionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/SideEffectInTfFunctionCheckTest.java index f301044f8..551005d24 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/SideEffectInTfFunctionCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/SideEffectInTfFunctionCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/SillyEqualityCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/SillyEqualityCheckTest.java index 9a92bdab1..3700dd9b9 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/SillyEqualityCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/SillyEqualityCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/SillyIdentityCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/SillyIdentityCheckTest.java index f3283c860..373d3ba25 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/SillyIdentityCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/SillyIdentityCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/SkLearnEstimatorDontInitializeEstimatedValuesCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/SkLearnEstimatorDontInitializeEstimatedValuesCheckTest.java index db813cd18..666128c22 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/SkLearnEstimatorDontInitializeEstimatedValuesCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/SkLearnEstimatorDontInitializeEstimatedValuesCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/SklearnCachedPipelineDontAccessTransformersCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/SklearnCachedPipelineDontAccessTransformersCheckTest.java index 95a82629a..e0b5c0e63 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/SklearnCachedPipelineDontAccessTransformersCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/SklearnCachedPipelineDontAccessTransformersCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/SklearnPipelineParameterAreCorrectCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/SklearnPipelineParameterAreCorrectCheckTest.java index e8fbd4952..c6a646df3 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/SklearnPipelineParameterAreCorrectCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/SklearnPipelineParameterAreCorrectCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/SklearnPipelineSpecifyMemoryArgumentCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/SklearnPipelineSpecifyMemoryArgumentCheckTest.java index 6ac55b48c..acf145a59 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/SklearnPipelineSpecifyMemoryArgumentCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/SklearnPipelineSpecifyMemoryArgumentCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/SleepZeroInAsyncCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/SleepZeroInAsyncCheckTest.java index 8bb0da705..3045109d1 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/SleepZeroInAsyncCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/SleepZeroInAsyncCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/SlotsAssignmentCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/SlotsAssignmentCheckTest.java index 20e4ffe05..690d83084 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/SlotsAssignmentCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/SlotsAssignmentCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/SortedMinMaxCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/SortedMinMaxCheckTest.java index cb62c6a97..9a93ed6ef 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/SortedMinMaxCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/SortedMinMaxCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/SpecialMethodParamListCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/SpecialMethodParamListCheckTest.java index 243d69769..6d3f6883c 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/SpecialMethodParamListCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/SpecialMethodParamListCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/SpecialMethodReturnTypeCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/SpecialMethodReturnTypeCheckTest.java index ed0a360bb..044cb6cfd 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/SpecialMethodReturnTypeCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/SpecialMethodReturnTypeCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/StrftimeConfusingHourSystemCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/StrftimeConfusingHourSystemCheckTest.java index c80b656c5..8876eebca 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/StrftimeConfusingHourSystemCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/StrftimeConfusingHourSystemCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/StringFormatCorrectnessCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/StringFormatCorrectnessCheckTest.java index 1ec07391d..4703d935e 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/StringFormatCorrectnessCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/StringFormatCorrectnessCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/StringFormatMisuseCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/StringFormatMisuseCheckTest.java index b189c7c53..9f112e78f 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/StringFormatMisuseCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/StringFormatMisuseCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/StringLiteralDuplicationCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/StringLiteralDuplicationCheckTest.java index 713de8d3b..6c4900452 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/StringLiteralDuplicationCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/StringLiteralDuplicationCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/SynchronousFileOperationsInAsyncCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/SynchronousFileOperationsInAsyncCheckTest.java index 6fe45b1d0..16d3326cb 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/SynchronousFileOperationsInAsyncCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/SynchronousFileOperationsInAsyncCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/SynchronousHttpOperationsInAsyncCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/SynchronousHttpOperationsInAsyncCheckTest.java index 5c8f05749..a87e278fe 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/SynchronousHttpOperationsInAsyncCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/SynchronousHttpOperationsInAsyncCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/SynchronousOsCallsInAsyncCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/SynchronousOsCallsInAsyncCheckTest.java index 628c2d23a..b00d27eb0 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/SynchronousOsCallsInAsyncCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/SynchronousOsCallsInAsyncCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/SynchronousSubprocessOperationsInAsyncCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/SynchronousSubprocessOperationsInAsyncCheckTest.java index 7e9682cd4..d28a55110 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/SynchronousSubprocessOperationsInAsyncCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/SynchronousSubprocessOperationsInAsyncCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/TaskGroupNurseryUsedOnlyOnceCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/TaskGroupNurseryUsedOnlyOnceCheckTest.java index 7c00b043f..77b66635b 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/TaskGroupNurseryUsedOnlyOnceCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/TaskGroupNurseryUsedOnlyOnceCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/TempFileCreationCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/TempFileCreationCheckTest.java index acc9e877c..8f3df2d62 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/TempFileCreationCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/TempFileCreationCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/TemplateAndStrConcatenationCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/TemplateAndStrConcatenationCheckTest.java index f234930ed..e234cd8a5 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/TemplateAndStrConcatenationCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/TemplateAndStrConcatenationCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/TemplateStringStructuralPatternMatchingCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/TemplateStringStructuralPatternMatchingCheckTest.java index f8384d592..30156efd6 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/TemplateStringStructuralPatternMatchingCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/TemplateStringStructuralPatternMatchingCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/TestClientContentParameterCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/TestClientContentParameterCheckTest.java index 9aed519c6..d400bebbf 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/TestClientContentParameterCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/TestClientContentParameterCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/TfFunctionDependOnOutsideVariableCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/TfFunctionDependOnOutsideVariableCheckTest.java index ee5372ac3..a50fa70b4 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/TfFunctionDependOnOutsideVariableCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/TfFunctionDependOnOutsideVariableCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/TfFunctionRecursivityCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/TfFunctionRecursivityCheckTest.java index 4645432c8..d7bdbd8cb 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/TfFunctionRecursivityCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/TfFunctionRecursivityCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/TfGatherDeprecatedValidateIndicesCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/TfGatherDeprecatedValidateIndicesCheckTest.java index 446bf9880..5da4ee775 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/TfGatherDeprecatedValidateIndicesCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/TfGatherDeprecatedValidateIndicesCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/TfInputShapeOnModelSubclassCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/TfInputShapeOnModelSubclassCheckTest.java index f8abd76d5..6010336ce 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/TfInputShapeOnModelSubclassCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/TfInputShapeOnModelSubclassCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/TfPyTorchSpecifyReductionAxisCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/TfPyTorchSpecifyReductionAxisCheckTest.java index 58dc6e5b4..3c736dd41 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/TfPyTorchSpecifyReductionAxisCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/TfPyTorchSpecifyReductionAxisCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/TimeSleepInAsyncCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/TimeSleepInAsyncCheckTest.java index 6483691c5..6bc1b4c49 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/TimeSleepInAsyncCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/TimeSleepInAsyncCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/TimezoneNaiveDatetimeConstructorsCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/TimezoneNaiveDatetimeConstructorsCheckTest.java index 91ae10398..fbe05591a 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/TimezoneNaiveDatetimeConstructorsCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/TimezoneNaiveDatetimeConstructorsCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/ToDoCommentCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/ToDoCommentCheckTest.java index 7113d929b..f7016c7d7 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/ToDoCommentCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/ToDoCommentCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/TooManyLinesInFileCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/TooManyLinesInFileCheckTest.java index ae733d4b6..732269b6a 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/TooManyLinesInFileCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/TooManyLinesInFileCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/TooManyLinesInFunctionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/TooManyLinesInFunctionCheckTest.java index 045abe1db..67418cc2a 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/TooManyLinesInFunctionCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/TooManyLinesInFunctionCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/TooManyParametersCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/TooManyParametersCheckTest.java index 1ebded15e..efdb551cd 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/TooManyParametersCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/TooManyParametersCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/TooManyReturnsCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/TooManyReturnsCheckTest.java index a8dc2e704..9c5c16ebd 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/TooManyReturnsCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/TooManyReturnsCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/TorchAutogradVariableShouldNotBeUsedCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/TorchAutogradVariableShouldNotBeUsedCheckTest.java index 72910130f..1f60e05de 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/TorchAutogradVariableShouldNotBeUsedCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/TorchAutogradVariableShouldNotBeUsedCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/TorchLoadLeadsToUntrustedCodeExecutionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/TorchLoadLeadsToUntrustedCodeExecutionCheckTest.java index 1982be419..72dbc874b 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/TorchLoadLeadsToUntrustedCodeExecutionCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/TorchLoadLeadsToUntrustedCodeExecutionCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/TorchModuleModeShouldBeSetAfterLoadingCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/TorchModuleModeShouldBeSetAfterLoadingCheckTest.java index 997bd02f4..ba1675588 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/TorchModuleModeShouldBeSetAfterLoadingCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/TorchModuleModeShouldBeSetAfterLoadingCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/TorchModuleShouldCallInitCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/TorchModuleShouldCallInitCheckTest.java index 35b998924..768954fb3 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/TorchModuleShouldCallInitCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/TorchModuleShouldCallInitCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/TrailingCommentCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/TrailingCommentCheckTest.java index 49d543346..a59379b29 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/TrailingCommentCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/TrailingCommentCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/TrailingWhitespaceCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/TrailingWhitespaceCheckTest.java index 8e8855472..a36f5d04d 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/TrailingWhitespaceCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/TrailingWhitespaceCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/TypeAliasAnnotationCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/TypeAliasAnnotationCheckTest.java index c0f46cdf5..911b75d85 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/TypeAliasAnnotationCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/TypeAliasAnnotationCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/TypeVarCovariantAndContravariantCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/TypeVarCovariantAndContravariantCheckTest.java index 78b23c1ad..41a92dc96 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/TypeVarCovariantAndContravariantCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/TypeVarCovariantAndContravariantCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/UndefinedNameAllPropertyCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/UndefinedNameAllPropertyCheckTest.java index 231cc7a6d..db1bbf479 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/UndefinedNameAllPropertyCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/UndefinedNameAllPropertyCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/UndefinedSymbolsCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/UndefinedSymbolsCheckTest.java index c513de2c1..b039a6740 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/UndefinedSymbolsCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/UndefinedSymbolsCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/UnionTypeExpressionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/UnionTypeExpressionCheckTest.java index 90355d348..0562c2a5c 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/UnionTypeExpressionCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/UnionTypeExpressionCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/UnnecessaryComprehensionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/UnnecessaryComprehensionCheckTest.java index c727b3200..b4a472ef9 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/UnnecessaryComprehensionCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/UnnecessaryComprehensionCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/UnnecessaryLambdaMapCallCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/UnnecessaryLambdaMapCallCheckTest.java index 574ab17ae..395d1a3ea 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/UnnecessaryLambdaMapCallCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/UnnecessaryLambdaMapCallCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/UnnecessaryListCastCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/UnnecessaryListCastCheckTest.java index 296919a6d..a196c58c6 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/UnnecessaryListCastCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/UnnecessaryListCastCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/UnnecessaryListComprehensionArgumentCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/UnnecessaryListComprehensionArgumentCheckTest.java index 87e5ab7a8..15b621dd1 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/UnnecessaryListComprehensionArgumentCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/UnnecessaryListComprehensionArgumentCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/UnnecessaryReversedCallCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/UnnecessaryReversedCallCheckTest.java index 2744e1f51..91b44a5cc 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/UnnecessaryReversedCallCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/UnnecessaryReversedCallCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/UnnecessarySortInsideSetCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/UnnecessarySortInsideSetCheckTest.java index 31037f34e..9b51bc112 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/UnnecessarySortInsideSetCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/UnnecessarySortInsideSetCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/UnnecessarySubscriptReversalCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/UnnecessarySubscriptReversalCheckTest.java index d9cccb657..4461a53b7 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/UnnecessarySubscriptReversalCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/UnnecessarySubscriptReversalCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/UnprocessedTemplateStringCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/UnprocessedTemplateStringCheckTest.java index 61c92886f..cf36f7f7b 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/UnprocessedTemplateStringCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/UnprocessedTemplateStringCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/UnreachableExceptCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/UnreachableExceptCheckTest.java index 43b8889bb..cb5636322 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/UnreachableExceptCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/UnreachableExceptCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/UnreadPrivateAttributesCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/UnreadPrivateAttributesCheckTest.java index c16a3e67c..a85f26fc5 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/UnreadPrivateAttributesCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/UnreadPrivateAttributesCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/UnreadPrivateInnerClassesCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/UnreadPrivateInnerClassesCheckTest.java index 5c96df53e..31b7c105a 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/UnreadPrivateInnerClassesCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/UnreadPrivateInnerClassesCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/UnreadPrivateMethodsCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/UnreadPrivateMethodsCheckTest.java index 02bbb7c75..ba62a3bcf 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/UnreadPrivateMethodsCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/UnreadPrivateMethodsCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/UnusedFunctionParameterCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/UnusedFunctionParameterCheckTest.java index 3e51bc241..e0abcc002 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/UnusedFunctionParameterCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/UnusedFunctionParameterCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/UnusedImportCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/UnusedImportCheckTest.java index d0a036e1c..627d86bbe 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/UnusedImportCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/UnusedImportCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/UnusedLocalVariableCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/UnusedLocalVariableCheckTest.java index b6d5e0d90..296eb786f 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/UnusedLocalVariableCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/UnusedLocalVariableCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/UnusedNestedDefinitionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/UnusedNestedDefinitionCheckTest.java index 4c1da48b3..3bf7fe466 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/UnusedNestedDefinitionCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/UnusedNestedDefinitionCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/UseOfAnyAsTypeHintCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/UseOfAnyAsTypeHintCheckTest.java index 130d50b83..076d7d924 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/UseOfAnyAsTypeHintCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/UseOfAnyAsTypeHintCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/UseOfEmptyReturnValueCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/UseOfEmptyReturnValueCheckTest.java index c5cd76cad..837e21dbe 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/UseOfEmptyReturnValueCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/UseOfEmptyReturnValueCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/UseStartsWithEndsWithCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/UseStartsWithEndsWithCheckTest.java index 6224505e6..f726f9642 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/UseStartsWithEndsWithCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/UseStartsWithEndsWithCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/UselessParenthesisAfterKeywordCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/UselessParenthesisAfterKeywordCheckTest.java index 4ab004c4e..0d207fec9 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/UselessParenthesisAfterKeywordCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/UselessParenthesisAfterKeywordCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/UselessParenthesisCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/UselessParenthesisCheckTest.java index d8550060d..48c61ef03 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/UselessParenthesisCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/UselessParenthesisCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/UselessStatementCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/UselessStatementCheckTest.java index 7a79957e8..5a0f6c35a 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/UselessStatementCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/UselessStatementCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/VerifiedSslTlsCertificateCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/VerifiedSslTlsCertificateCheckTest.java index dd15df578..a9dae6153 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/VerifiedSslTlsCertificateCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/VerifiedSslTlsCertificateCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/WeakSSLProtocolCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/WeakSSLProtocolCheckTest.java index aec451e68..1ecc47afa 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/WeakSSLProtocolCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/WeakSSLProtocolCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/WebEntryPointDecoratorCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/WebEntryPointDecoratorCheckTest.java index 889377b39..119fc2371 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/WebEntryPointDecoratorCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/WebEntryPointDecoratorCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/WildcardImportCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/WildcardImportCheckTest.java index 0fffad8e0..6efd38fbe 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/WildcardImportCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/WildcardImportCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/WrongAssignmentOperatorCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/WrongAssignmentOperatorCheckTest.java index 299001cd9..ab0f2270d 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/WrongAssignmentOperatorCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/WrongAssignmentOperatorCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/XMLParserXXEVulnerableCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/XMLParserXXEVulnerableCheckTest.java index 0c56975d6..a0872daab 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/XMLParserXXEVulnerableCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/XMLParserXXEVulnerableCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/cdk/ClearTextProtocolsCheckPartTest.java b/python-checks/src/test/java/org/sonar/python/checks/cdk/ClearTextProtocolsCheckPartTest.java index cc6188531..bb49bcb99 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/cdk/ClearTextProtocolsCheckPartTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/cdk/ClearTextProtocolsCheckPartTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/cdk/DisabledEFSEncryptionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/cdk/DisabledEFSEncryptionCheckTest.java index d600b3301..d7357a393 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/cdk/DisabledEFSEncryptionCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/cdk/DisabledEFSEncryptionCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/cdk/DisabledESDomainEncryptionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/cdk/DisabledESDomainEncryptionCheckTest.java index eb79c14de..0ad8403c4 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/cdk/DisabledESDomainEncryptionCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/cdk/DisabledESDomainEncryptionCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/cdk/DisabledRDSEncryptionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/cdk/DisabledRDSEncryptionCheckTest.java index 7b30c753d..c128619ec 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/cdk/DisabledRDSEncryptionCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/cdk/DisabledRDSEncryptionCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/cdk/DisabledSNSTopicEncryptionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/cdk/DisabledSNSTopicEncryptionCheckTest.java index a6207ec5d..afd58a5f1 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/cdk/DisabledSNSTopicEncryptionCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/cdk/DisabledSNSTopicEncryptionCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/cdk/IamPolicyPublicAccessCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/cdk/IamPolicyPublicAccessCheckTest.java index 796956956..18a99d732 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/cdk/IamPolicyPublicAccessCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/cdk/IamPolicyPublicAccessCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/cdk/IamPrivilegeEscalationCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/cdk/IamPrivilegeEscalationCheckTest.java index e445c0bfb..49a402bda 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/cdk/IamPrivilegeEscalationCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/cdk/IamPrivilegeEscalationCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/cdk/NetworkCallsWithoutTimeoutsInLambdaCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/cdk/NetworkCallsWithoutTimeoutsInLambdaCheckTest.java index 0c3689517..5829fc0ba 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/cdk/NetworkCallsWithoutTimeoutsInLambdaCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/cdk/NetworkCallsWithoutTimeoutsInLambdaCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/cdk/PrivilegePolicyCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/cdk/PrivilegePolicyCheckTest.java index e87a32994..759d82699 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/cdk/PrivilegePolicyCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/cdk/PrivilegePolicyCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/cdk/PublicApiIsSecuritySensitiveCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/cdk/PublicApiIsSecuritySensitiveCheckTest.java index 94d4f0066..dc3a97c0e 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/cdk/PublicApiIsSecuritySensitiveCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/cdk/PublicApiIsSecuritySensitiveCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/cdk/PublicNetworkAccessToCloudResourcesCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/cdk/PublicNetworkAccessToCloudResourcesCheckTest.java index b5818cf46..8bffa8461 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/cdk/PublicNetworkAccessToCloudResourcesCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/cdk/PublicNetworkAccessToCloudResourcesCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/cdk/ResourceAccessPolicyCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/cdk/ResourceAccessPolicyCheckTest.java index 423130db3..d3273be75 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/cdk/ResourceAccessPolicyCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/cdk/ResourceAccessPolicyCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/cdk/S3BucketBlockPublicAccessCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/cdk/S3BucketBlockPublicAccessCheckTest.java index 40aa76431..8c272923e 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/cdk/S3BucketBlockPublicAccessCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/cdk/S3BucketBlockPublicAccessCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/cdk/S3BucketGrantedAccessCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/cdk/S3BucketGrantedAccessCheckTest.java index eecefd3f9..3e5795c8d 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/cdk/S3BucketGrantedAccessCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/cdk/S3BucketGrantedAccessCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/cdk/S3BucketHTTPCommunicationCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/cdk/S3BucketHTTPCommunicationCheckTest.java index 1654e43b9..d419dd3f7 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/cdk/S3BucketHTTPCommunicationCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/cdk/S3BucketHTTPCommunicationCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/cdk/S3BucketServerEncryptionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/cdk/S3BucketServerEncryptionCheckTest.java index 9cea57590..49fd1a7f4 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/cdk/S3BucketServerEncryptionCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/cdk/S3BucketServerEncryptionCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/cdk/S3BucketVersioningCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/cdk/S3BucketVersioningCheckTest.java index 9b2fc2977..0ce6db5ec 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/cdk/S3BucketVersioningCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/cdk/S3BucketVersioningCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/cdk/UnencryptedEbsVolumeCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/cdk/UnencryptedEbsVolumeCheckTest.java index 5fecda7ef..440891422 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/cdk/UnencryptedEbsVolumeCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/cdk/UnencryptedEbsVolumeCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/cdk/UnencryptedSageMakerNotebookCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/cdk/UnencryptedSageMakerNotebookCheckTest.java index ba79f9b3b..8ec7d5081 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/cdk/UnencryptedSageMakerNotebookCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/cdk/UnencryptedSageMakerNotebookCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/cdk/UnencryptedSqsQueueCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/cdk/UnencryptedSqsQueueCheckTest.java index 210c05cab..f5f1c1ad6 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/cdk/UnencryptedSqsQueueCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/cdk/UnencryptedSqsQueueCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/cdk/UnrestrictedAdministrationCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/cdk/UnrestrictedAdministrationCheckTest.java index d07bc596a..2e0ebc23d 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/cdk/UnrestrictedAdministrationCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/cdk/UnrestrictedAdministrationCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/cdk/UnrestrictedOutboundCommunicationsCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/cdk/UnrestrictedOutboundCommunicationsCheckTest.java index 7b66d0ce1..af2aba6a9 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/cdk/UnrestrictedOutboundCommunicationsCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/cdk/UnrestrictedOutboundCommunicationsCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/django/DjangoModelFormFieldsCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/django/DjangoModelFormFieldsCheckTest.java index ac2c9d159..084c7f0f3 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/django/DjangoModelFormFieldsCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/django/DjangoModelFormFieldsCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/django/DjangoModelStrMethodCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/django/DjangoModelStrMethodCheckTest.java index e8b4d665e..b62dc26be 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/django/DjangoModelStrMethodCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/django/DjangoModelStrMethodCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/django/DjangoModelStringFieldCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/django/DjangoModelStringFieldCheckTest.java index 16da2800e..9d394d843 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/django/DjangoModelStringFieldCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/django/DjangoModelStringFieldCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/hotspots/ClearTextProtocolsCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/hotspots/ClearTextProtocolsCheckTest.java index 448e45e3f..d4718c341 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/hotspots/ClearTextProtocolsCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/hotspots/ClearTextProtocolsCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/hotspots/CommandLineArgsCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/hotspots/CommandLineArgsCheckTest.java index 1bfe2376d..c2192f6f9 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/hotspots/CommandLineArgsCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/hotspots/CommandLineArgsCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/hotspots/CommonValidationUtilsTest.java b/python-checks/src/test/java/org/sonar/python/checks/hotspots/CommonValidationUtilsTest.java index 9cba9f256..594518d3a 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/hotspots/CommonValidationUtilsTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/hotspots/CommonValidationUtilsTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/hotspots/CorsCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/hotspots/CorsCheckTest.java index 16cba1e1a..7698ee091 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/hotspots/CorsCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/hotspots/CorsCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/hotspots/CsrfDisabledCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/hotspots/CsrfDisabledCheckTest.java index 5ddd36b97..4e24456d9 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/hotspots/CsrfDisabledCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/hotspots/CsrfDisabledCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/hotspots/DataEncryptionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/hotspots/DataEncryptionCheckTest.java index 096b70d52..24d16bb8a 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/hotspots/DataEncryptionCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/hotspots/DataEncryptionCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/hotspots/DebugModeCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/hotspots/DebugModeCheckTest.java index 6e35be5a6..96434a054 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/hotspots/DebugModeCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/hotspots/DebugModeCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/hotspots/DisabledHtmlAutoEscapeCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/hotspots/DisabledHtmlAutoEscapeCheckTest.java index e80f25a21..0dfc6c6b8 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/hotspots/DisabledHtmlAutoEscapeCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/hotspots/DisabledHtmlAutoEscapeCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/hotspots/DisabledHtmlAutoEscapeLegacyCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/hotspots/DisabledHtmlAutoEscapeLegacyCheckTest.java index 7c2adda70..987eb57fc 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/hotspots/DisabledHtmlAutoEscapeLegacyCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/hotspots/DisabledHtmlAutoEscapeLegacyCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/hotspots/DynamicCodeExecutionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/hotspots/DynamicCodeExecutionCheckTest.java index dc70ac8c1..fd7ebdd97 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/hotspots/DynamicCodeExecutionCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/hotspots/DynamicCodeExecutionCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/hotspots/EmailSendingCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/hotspots/EmailSendingCheckTest.java index 1fe4716f7..42a760f88 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/hotspots/EmailSendingCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/hotspots/EmailSendingCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/hotspots/ExpandingArchiveCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/hotspots/ExpandingArchiveCheckTest.java index 38b9a2f4a..611284895 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/hotspots/ExpandingArchiveCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/hotspots/ExpandingArchiveCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/hotspots/FastHashingOrPlainTextCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/hotspots/FastHashingOrPlainTextCheckTest.java index ec662fb1d..e88c2b766 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/hotspots/FastHashingOrPlainTextCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/hotspots/FastHashingOrPlainTextCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/hotspots/GraphQLIntrospectionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/hotspots/GraphQLIntrospectionCheckTest.java index ba5db8aee..62c5cc4b7 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/hotspots/GraphQLIntrospectionCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/hotspots/GraphQLIntrospectionCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/hotspots/HardCodedCredentialsCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/hotspots/HardCodedCredentialsCheckTest.java index 36fad263a..7dbdc1c7a 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/hotspots/HardCodedCredentialsCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/hotspots/HardCodedCredentialsCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/hotspots/HardCodedCredentialsEntropyCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/hotspots/HardCodedCredentialsEntropyCheckTest.java index 77fe1a7a6..84966a702 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/hotspots/HardCodedCredentialsEntropyCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/hotspots/HardCodedCredentialsEntropyCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/hotspots/HashingDataCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/hotspots/HashingDataCheckTest.java index 69d45c602..92685c555 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/hotspots/HashingDataCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/hotspots/HashingDataCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/hotspots/HttpOnlyCookieCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/hotspots/HttpOnlyCookieCheckTest.java index fde771e36..beb70e0c7 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/hotspots/HttpOnlyCookieCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/hotspots/HttpOnlyCookieCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/hotspots/LoggersConfigurationCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/hotspots/LoggersConfigurationCheckTest.java index 40928f072..40a3ae74d 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/hotspots/LoggersConfigurationCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/hotspots/LoggersConfigurationCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/hotspots/NonStandardCryptographicAlgorithmCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/hotspots/NonStandardCryptographicAlgorithmCheckTest.java index abc99103c..60b405624 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/hotspots/NonStandardCryptographicAlgorithmCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/hotspots/NonStandardCryptographicAlgorithmCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/hotspots/OsExecCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/hotspots/OsExecCheckTest.java index 8500bdf6e..5ba1b992a 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/hotspots/OsExecCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/hotspots/OsExecCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/hotspots/ProcessSignallingCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/hotspots/ProcessSignallingCheckTest.java index 9fa75c88b..933c618f3 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/hotspots/ProcessSignallingCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/hotspots/ProcessSignallingCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/hotspots/PseudoRandomCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/hotspots/PseudoRandomCheckTest.java index 096e77a81..a22850fd7 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/hotspots/PseudoRandomCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/hotspots/PseudoRandomCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/hotspots/PubliclyWritableDirectoriesCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/hotspots/PubliclyWritableDirectoriesCheckTest.java index 88b10a4b3..4a21921a2 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/hotspots/PubliclyWritableDirectoriesCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/hotspots/PubliclyWritableDirectoriesCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/hotspots/RegexCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/hotspots/RegexCheckTest.java index 6673ac53d..2e9d98cbd 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/hotspots/RegexCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/hotspots/RegexCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/hotspots/SQLQueriesCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/hotspots/SQLQueriesCheckTest.java index ae486139c..92352555f 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/hotspots/SQLQueriesCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/hotspots/SQLQueriesCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/hotspots/SecureCookieCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/hotspots/SecureCookieCheckTest.java index 7251290a6..538971d33 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/hotspots/SecureCookieCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/hotspots/SecureCookieCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/hotspots/StandardInputCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/hotspots/StandardInputCheckTest.java index 0c70be5c2..6524bf007 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/hotspots/StandardInputCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/hotspots/StandardInputCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/hotspots/StrongCryptographicKeysCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/hotspots/StrongCryptographicKeysCheckTest.java index 50e199042..06a28b98a 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/hotspots/StrongCryptographicKeysCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/hotspots/StrongCryptographicKeysCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/hotspots/UnsafeHttpMethodsCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/hotspots/UnsafeHttpMethodsCheckTest.java index 6d362cab3..b1036459d 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/hotspots/UnsafeHttpMethodsCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/hotspots/UnsafeHttpMethodsCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/hotspots/UnverifiedHostnameCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/hotspots/UnverifiedHostnameCheckTest.java index 6b9fb8cd0..c1a85aa7a 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/hotspots/UnverifiedHostnameCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/hotspots/UnverifiedHostnameCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/hotspots/XMLSignatureValidationCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/hotspots/XMLSignatureValidationCheckTest.java index e02665536..6f23581fe 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/hotspots/XMLSignatureValidationCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/hotspots/XMLSignatureValidationCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/regex/AbstractRegexCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/regex/AbstractRegexCheckTest.java index fcbc44147..f4f81bc5d 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/regex/AbstractRegexCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/regex/AbstractRegexCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/regex/AnchorPrecedenceCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/regex/AnchorPrecedenceCheckTest.java index 14a44c7d8..66fe7f21f 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/regex/AnchorPrecedenceCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/regex/AnchorPrecedenceCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/regex/DuplicatesInCharacterClassCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/regex/DuplicatesInCharacterClassCheckTest.java index 1afa4ba8e..7fc6b4eb0 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/regex/DuplicatesInCharacterClassCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/regex/DuplicatesInCharacterClassCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/regex/EmptyAlternativeCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/regex/EmptyAlternativeCheckTest.java index 4691b3ae7..ac8d36dba 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/regex/EmptyAlternativeCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/regex/EmptyAlternativeCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/regex/EmptyGroupCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/regex/EmptyGroupCheckTest.java index 29c421d53..0a0bb65fa 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/regex/EmptyGroupCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/regex/EmptyGroupCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/regex/EmptyStringRepetitionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/regex/EmptyStringRepetitionCheckTest.java index ca43cff22..a7c5b09e6 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/regex/EmptyStringRepetitionCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/regex/EmptyStringRepetitionCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/regex/GraphemeClustersInClassesCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/regex/GraphemeClustersInClassesCheckTest.java index 9bb556b5b..103b4d31b 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/regex/GraphemeClustersInClassesCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/regex/GraphemeClustersInClassesCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/regex/GroupReplacementCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/regex/GroupReplacementCheckTest.java index 92b6da8a3..40ab4216c 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/regex/GroupReplacementCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/regex/GroupReplacementCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/regex/ImpossibleBackReferenceCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/regex/ImpossibleBackReferenceCheckTest.java index a2584838b..53d47b977 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/regex/ImpossibleBackReferenceCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/regex/ImpossibleBackReferenceCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/regex/ImpossibleBoundariesCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/regex/ImpossibleBoundariesCheckTest.java index 17f515fb0..6802d237d 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/regex/ImpossibleBoundariesCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/regex/ImpossibleBoundariesCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/regex/InvalidRegexCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/regex/InvalidRegexCheckTest.java index e4eaec9a4..cf1b035f4 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/regex/InvalidRegexCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/regex/InvalidRegexCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/regex/MultipleWhitespaceCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/regex/MultipleWhitespaceCheckTest.java index bc26a06ab..f1099dfd2 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/regex/MultipleWhitespaceCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/regex/MultipleWhitespaceCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/regex/OctalEscapeCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/regex/OctalEscapeCheckTest.java index 8178b9fca..b93c89022 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/regex/OctalEscapeCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/regex/OctalEscapeCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/regex/PossessiveQuantifierContinuationCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/regex/PossessiveQuantifierContinuationCheckTest.java index fad556029..dccbb6bf1 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/regex/PossessiveQuantifierContinuationCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/regex/PossessiveQuantifierContinuationCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/regex/RedosCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/regex/RedosCheckTest.java index 9dae38e7e..e7cb9c404 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/regex/RedosCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/regex/RedosCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/regex/RedundantRegexAlternativesCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/regex/RedundantRegexAlternativesCheckTest.java index c762be68a..59e2517db 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/regex/RedundantRegexAlternativesCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/regex/RedundantRegexAlternativesCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/regex/RegexComplexityCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/regex/RegexComplexityCheckTest.java index d6fb4c8fa..caa2e4c2f 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/regex/RegexComplexityCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/regex/RegexComplexityCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/regex/RegexLookaheadCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/regex/RegexLookaheadCheckTest.java index bd3461f9e..39a96a7df 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/regex/RegexLookaheadCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/regex/RegexLookaheadCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/regex/ReluctantQuantifierCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/regex/ReluctantQuantifierCheckTest.java index 3ce914e21..5007f2797 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/regex/ReluctantQuantifierCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/regex/ReluctantQuantifierCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/regex/ReluctantQuantifierWithEmptyContinuationCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/regex/ReluctantQuantifierWithEmptyContinuationCheckTest.java index a97a6bb42..10bec7d3e 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/regex/ReluctantQuantifierWithEmptyContinuationCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/regex/ReluctantQuantifierWithEmptyContinuationCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/regex/SingleCharCharacterClassCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/regex/SingleCharCharacterClassCheckTest.java index 9b501d2ec..eb3140b22 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/regex/SingleCharCharacterClassCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/regex/SingleCharCharacterClassCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/regex/SingleCharacterAlternationCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/regex/SingleCharacterAlternationCheckTest.java index f239309b9..7c3db05aa 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/regex/SingleCharacterAlternationCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/regex/SingleCharacterAlternationCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/regex/StringReplaceCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/regex/StringReplaceCheckTest.java index 7118cadda..e9c3c1142 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/regex/StringReplaceCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/regex/StringReplaceCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/regex/SuperfluousCurlyBraceCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/regex/SuperfluousCurlyBraceCheckTest.java index 6156eed3a..3cacfcb42 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/regex/SuperfluousCurlyBraceCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/regex/SuperfluousCurlyBraceCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/regex/UnquantifiedNonCapturingGroupCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/regex/UnquantifiedNonCapturingGroupCheckTest.java index dd52d89af..023bb1cce 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/regex/UnquantifiedNonCapturingGroupCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/regex/UnquantifiedNonCapturingGroupCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/regex/UnusedGroupNamesCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/regex/UnusedGroupNamesCheckTest.java index 0e5e032c6..ef0966629 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/regex/UnusedGroupNamesCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/regex/UnusedGroupNamesCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/regex/VerboseRegexCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/regex/VerboseRegexCheckTest.java index 203387d03..a5128a6f2 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/regex/VerboseRegexCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/regex/VerboseRegexCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/AssertAfterRaiseCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/AssertAfterRaiseCheckTest.java index c866c8435..f475723fd 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/tests/AssertAfterRaiseCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/AssertAfterRaiseCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/AssertOnDissimilarTypesCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/AssertOnDissimilarTypesCheckTest.java index f771659d6..e342cf72d 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/tests/AssertOnDissimilarTypesCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/AssertOnDissimilarTypesCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/AssertOnTupleLiteralCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/AssertOnTupleLiteralCheckTest.java index b460e877e..c91c7c17e 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/tests/AssertOnTupleLiteralCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/AssertOnTupleLiteralCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/DedicatedAssertionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/DedicatedAssertionCheckTest.java index db84ca19a..a1a368cc1 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/tests/DedicatedAssertionCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/DedicatedAssertionCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/ImplicitlySkippedTestCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/ImplicitlySkippedTestCheckTest.java index 7dae43a2d..acf282754 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/tests/ImplicitlySkippedTestCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/ImplicitlySkippedTestCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/NotDiscoverableTestMethodCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/NotDiscoverableTestMethodCheckTest.java index 664699c38..9f5aa795b 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/tests/NotDiscoverableTestMethodCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/NotDiscoverableTestMethodCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/SkippedTestNoReasonCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/SkippedTestNoReasonCheckTest.java index 4ed600076..0eae23aae 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/tests/SkippedTestNoReasonCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/SkippedTestNoReasonCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/UnconditionalAssertionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/UnconditionalAssertionCheckTest.java index e8561487d..0e6d0df17 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/tests/UnconditionalAssertionCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/UnconditionalAssertionCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/utils/AwsLambdaChecksUtilsTest.java b/python-checks/src/test/java/org/sonar/python/checks/utils/AwsLambdaChecksUtilsTest.java index 8ca30e585..7286ac60e 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/utils/AwsLambdaChecksUtilsTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/utils/AwsLambdaChecksUtilsTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/utils/CheckUtilsTest.java b/python-checks/src/test/java/org/sonar/python/checks/utils/CheckUtilsTest.java index c131f271e..1cc4dac95 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/utils/CheckUtilsTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/utils/CheckUtilsTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/utils/CodeTestUtils.java b/python-checks/src/test/java/org/sonar/python/checks/utils/CodeTestUtils.java index d0a9eb242..970277208 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/utils/CodeTestUtils.java +++ b/python-checks/src/test/java/org/sonar/python/checks/utils/CodeTestUtils.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/utils/ExpressionsTest.java b/python-checks/src/test/java/org/sonar/python/checks/utils/ExpressionsTest.java index b476fd170..a486fb75c 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/utils/ExpressionsTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/utils/ExpressionsTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/utils/MarimoUtilsTest.java b/python-checks/src/test/java/org/sonar/python/checks/utils/MarimoUtilsTest.java index 66e23021b..5744fda05 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/utils/MarimoUtilsTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/utils/MarimoUtilsTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-checks/src/test/java/org/sonar/python/checks/utils/package-info.java b/python-checks/src/test/java/org/sonar/python/checks/utils/package-info.java index 8634f7f6d..ff19e08b7 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/utils/package-info.java +++ b/python-checks/src/test/java/org/sonar/python/checks/utils/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/AIQualityProfile.java b/python-commons/src/main/java/org/sonar/plugins/python/AIQualityProfile.java index b9dc32d1f..b4096cc7e 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/AIQualityProfile.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/AIQualityProfile.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/AbstractPythonRuleRepository.java b/python-commons/src/main/java/org/sonar/plugins/python/AbstractPythonRuleRepository.java index ac46697a2..e96b32190 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/AbstractPythonRuleRepository.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/AbstractPythonRuleRepository.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/DependencyTelemetrySensor.java b/python-commons/src/main/java/org/sonar/plugins/python/DependencyTelemetrySensor.java index 32fb774b2..bd49842b2 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/DependencyTelemetrySensor.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/DependencyTelemetrySensor.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/EmptyReportException.java b/python-commons/src/main/java/org/sonar/plugins/python/EmptyReportException.java index 7e75aad19..e4b2a3afe 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/EmptyReportException.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/EmptyReportException.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/ExternalIssuesSensor.java b/python-commons/src/main/java/org/sonar/plugins/python/ExternalIssuesSensor.java index 5163243aa..eac063826 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/ExternalIssuesSensor.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/ExternalIssuesSensor.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/IPynb.java b/python-commons/src/main/java/org/sonar/plugins/python/IPynb.java index 8eb895d54..662d9240d 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/IPynb.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/IPynb.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/IPynbAIQualityProfile.java b/python-commons/src/main/java/org/sonar/plugins/python/IPynbAIQualityProfile.java index cbcd586d2..040a5dca6 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/IPynbAIQualityProfile.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/IPynbAIQualityProfile.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/IPynbProfile.java b/python-commons/src/main/java/org/sonar/plugins/python/IPynbProfile.java index 521f4b665..9a8790a02 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/IPynbProfile.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/IPynbProfile.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/IPynbRuleRepository.java b/python-commons/src/main/java/org/sonar/plugins/python/IPynbRuleRepository.java index f04c0b684..24111a049 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/IPynbRuleRepository.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/IPynbRuleRepository.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/IPynbSensor.java b/python-commons/src/main/java/org/sonar/plugins/python/IPynbSensor.java index 2826914f3..c8b9e97f3 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/IPynbSensor.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/IPynbSensor.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/IssuesRepository.java b/python-commons/src/main/java/org/sonar/plugins/python/IssuesRepository.java index 60a960715..b6ec706b0 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/IssuesRepository.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/IssuesRepository.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/MeasuresRepository.java b/python-commons/src/main/java/org/sonar/plugins/python/MeasuresRepository.java index 0b2b337aa..97c72cee2 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/MeasuresRepository.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/MeasuresRepository.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/MultiFileProgressReport.java b/python-commons/src/main/java/org/sonar/plugins/python/MultiFileProgressReport.java index f2760e212..782d3645d 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/MultiFileProgressReport.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/MultiFileProgressReport.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/NewSymbolsCollector.java b/python-commons/src/main/java/org/sonar/plugins/python/NewSymbolsCollector.java index 2c0b664fd..9dccf6302 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/NewSymbolsCollector.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/NewSymbolsCollector.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/Python.java b/python-commons/src/main/java/org/sonar/plugins/python/Python.java index b79e55233..769d7bed5 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/Python.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/Python.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/PythonChecks.java b/python-commons/src/main/java/org/sonar/plugins/python/PythonChecks.java index 1c37578b2..cc8ee04eb 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/PythonChecks.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/PythonChecks.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/PythonExtensionKeys.java b/python-commons/src/main/java/org/sonar/plugins/python/PythonExtensionKeys.java index 61f26db29..e31096c2a 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/PythonExtensionKeys.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/PythonExtensionKeys.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/PythonExtensions.java b/python-commons/src/main/java/org/sonar/plugins/python/PythonExtensions.java index c12173c4b..b035746a0 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/PythonExtensions.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/PythonExtensions.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/PythonHighlighter.java b/python-commons/src/main/java/org/sonar/plugins/python/PythonHighlighter.java index 34ba05a12..a1fe59192 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/PythonHighlighter.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/PythonHighlighter.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/PythonProfile.java b/python-commons/src/main/java/org/sonar/plugins/python/PythonProfile.java index 2e9f7d5e2..a797b193e 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/PythonProfile.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/PythonProfile.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/PythonReportSensor.java b/python-commons/src/main/java/org/sonar/plugins/python/PythonReportSensor.java index e384d0b36..29530fbdc 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/PythonReportSensor.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/PythonReportSensor.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/PythonRuleRepository.java b/python-commons/src/main/java/org/sonar/plugins/python/PythonRuleRepository.java index 32f783b2a..f6f4c9e8f 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/PythonRuleRepository.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/PythonRuleRepository.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/PythonScanner.java b/python-commons/src/main/java/org/sonar/plugins/python/PythonScanner.java index ac7ff4a16..d7e302373 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/PythonScanner.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/PythonScanner.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/PythonSensor.java b/python-commons/src/main/java/org/sonar/plugins/python/PythonSensor.java index c1daf53f7..49fb74564 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/PythonSensor.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/PythonSensor.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/Scanner.java b/python-commons/src/main/java/org/sonar/plugins/python/Scanner.java index 046a7685b..9b1c95f7d 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/Scanner.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/Scanner.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/TextReportReader.java b/python-commons/src/main/java/org/sonar/plugins/python/TextReportReader.java index bd2e96210..417942fc3 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/TextReportReader.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/TextReportReader.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/architecture/ArchitectureCallbackWrapper.java b/python-commons/src/main/java/org/sonar/plugins/python/architecture/ArchitectureCallbackWrapper.java index bf2bbca7f..c40573d06 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/architecture/ArchitectureCallbackWrapper.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/architecture/ArchitectureCallbackWrapper.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/architecture/DummyArchitectureCallback.java b/python-commons/src/main/java/org/sonar/plugins/python/architecture/DummyArchitectureCallback.java index b4b8c48cf..ce137c4f7 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/architecture/DummyArchitectureCallback.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/architecture/DummyArchitectureCallback.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/architecture/package-info.java b/python-commons/src/main/java/org/sonar/plugins/python/architecture/package-info.java index d45875aa0..a9c6f617b 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/architecture/package-info.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/architecture/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/bandit/BanditJsonReportReader.java b/python-commons/src/main/java/org/sonar/plugins/python/bandit/BanditJsonReportReader.java index 41ae42fa7..fbbd8add0 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/bandit/BanditJsonReportReader.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/bandit/BanditJsonReportReader.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/bandit/BanditRulesDefinition.java b/python-commons/src/main/java/org/sonar/plugins/python/bandit/BanditRulesDefinition.java index 8995858d6..ec48d1039 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/bandit/BanditRulesDefinition.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/bandit/BanditRulesDefinition.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/bandit/BanditSensor.java b/python-commons/src/main/java/org/sonar/plugins/python/bandit/BanditSensor.java index 6af9f32a9..d5b55f668 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/bandit/BanditSensor.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/bandit/BanditSensor.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/bandit/package-info.java b/python-commons/src/main/java/org/sonar/plugins/python/bandit/package-info.java index 20cfe934e..407d708be 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/bandit/package-info.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/bandit/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/caching/Caching.java b/python-commons/src/main/java/org/sonar/plugins/python/caching/Caching.java index 1e5419520..e3105b3cd 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/caching/Caching.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/caching/Caching.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/caching/package-info.java b/python-commons/src/main/java/org/sonar/plugins/python/caching/package-info.java index 94e995d8b..dbbb5b11b 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/caching/package-info.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/caching/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/coverage/CoberturaParser.java b/python-commons/src/main/java/org/sonar/plugins/python/coverage/CoberturaParser.java index 384a8e1ee..e3bf736f0 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/coverage/CoberturaParser.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/coverage/CoberturaParser.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/coverage/PythonCoverageSensor.java b/python-commons/src/main/java/org/sonar/plugins/python/coverage/PythonCoverageSensor.java index 353959383..89ecdbc85 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/coverage/PythonCoverageSensor.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/coverage/PythonCoverageSensor.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/coverage/package-info.java b/python-commons/src/main/java/org/sonar/plugins/python/coverage/package-info.java index 9c3dab097..c653fefb3 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/coverage/package-info.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/coverage/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/cpd/PythonCpdAnalyzer.java b/python-commons/src/main/java/org/sonar/plugins/python/cpd/PythonCpdAnalyzer.java index e7f15511f..2b7bf1729 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/cpd/PythonCpdAnalyzer.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/cpd/PythonCpdAnalyzer.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/cpd/package-info.java b/python-commons/src/main/java/org/sonar/plugins/python/cpd/package-info.java index afaadd7b4..c8e1eead6 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/cpd/package-info.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/cpd/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/dependency/DependencyPostProcessor.java b/python-commons/src/main/java/org/sonar/plugins/python/dependency/DependencyPostProcessor.java index beaadd4d5..ad90ec5aa 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/dependency/DependencyPostProcessor.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/dependency/DependencyPostProcessor.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/dependency/DependencyTelemetry.java b/python-commons/src/main/java/org/sonar/plugins/python/dependency/DependencyTelemetry.java index d78009ef4..fb3b2932f 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/dependency/DependencyTelemetry.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/dependency/DependencyTelemetry.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/dependency/PyProjectTomlParser.java b/python-commons/src/main/java/org/sonar/plugins/python/dependency/PyProjectTomlParser.java index baa9ceae4..43d036470 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/dependency/PyProjectTomlParser.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/dependency/PyProjectTomlParser.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/dependency/RequirementsTxtParser.java b/python-commons/src/main/java/org/sonar/plugins/python/dependency/RequirementsTxtParser.java index f258ca599..d340221fd 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/dependency/RequirementsTxtParser.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/dependency/RequirementsTxtParser.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/dependency/model/Dependencies.java b/python-commons/src/main/java/org/sonar/plugins/python/dependency/model/Dependencies.java index 91f673413..f548af486 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/dependency/model/Dependencies.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/dependency/model/Dependencies.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/dependency/model/Dependency.java b/python-commons/src/main/java/org/sonar/plugins/python/dependency/model/Dependency.java index 4424ae798..540514286 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/dependency/model/Dependency.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/dependency/model/Dependency.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/dependency/model/package-info.java b/python-commons/src/main/java/org/sonar/plugins/python/dependency/model/package-info.java index 8b493658b..d888e1f0d 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/dependency/model/package-info.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/dependency/model/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/dependency/package-info.java b/python-commons/src/main/java/org/sonar/plugins/python/dependency/package-info.java index 7723dac9b..6e5de142e 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/dependency/package-info.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/dependency/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/editions/OpenSourceRepositoryInfoProvider.java b/python-commons/src/main/java/org/sonar/plugins/python/editions/OpenSourceRepositoryInfoProvider.java index 63a79c8cf..370bf249c 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/editions/OpenSourceRepositoryInfoProvider.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/editions/OpenSourceRepositoryInfoProvider.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/editions/RepositoryInfoProvider.java b/python-commons/src/main/java/org/sonar/plugins/python/editions/RepositoryInfoProvider.java index 3fdcad40e..52fe2447a 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/editions/RepositoryInfoProvider.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/editions/RepositoryInfoProvider.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/editions/RepositoryInfoProviderWrapper.java b/python-commons/src/main/java/org/sonar/plugins/python/editions/RepositoryInfoProviderWrapper.java index 63cbe81ce..e1a7d3a14 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/editions/RepositoryInfoProviderWrapper.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/editions/RepositoryInfoProviderWrapper.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/editions/package-info.java b/python-commons/src/main/java/org/sonar/plugins/python/editions/package-info.java index 06a6af84b..5fefc19c9 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/editions/package-info.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/editions/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/flake8/Flake8RulesDefinition.java b/python-commons/src/main/java/org/sonar/plugins/python/flake8/Flake8RulesDefinition.java index 791397bf1..676734cd1 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/flake8/Flake8RulesDefinition.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/flake8/Flake8RulesDefinition.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/flake8/Flake8Sensor.java b/python-commons/src/main/java/org/sonar/plugins/python/flake8/Flake8Sensor.java index 70f8d1701..686eb4270 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/flake8/Flake8Sensor.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/flake8/Flake8Sensor.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/flake8/package-info.java b/python-commons/src/main/java/org/sonar/plugins/python/flake8/package-info.java index 4a0fc70b6..8e569da16 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/flake8/package-info.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/flake8/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/indexer/ConfigSourceRoots.java b/python-commons/src/main/java/org/sonar/plugins/python/indexer/ConfigSourceRoots.java index 6abcf3521..9a30f0392 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/indexer/ConfigSourceRoots.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/indexer/ConfigSourceRoots.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/indexer/NamespacePackageAnalyzer.java b/python-commons/src/main/java/org/sonar/plugins/python/indexer/NamespacePackageAnalyzer.java index ab8832a85..c0cca3e01 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/indexer/NamespacePackageAnalyzer.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/indexer/NamespacePackageAnalyzer.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/indexer/NamespacePackageTelemetry.java b/python-commons/src/main/java/org/sonar/plugins/python/indexer/NamespacePackageTelemetry.java index ecf07c12a..905ce2b99 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/indexer/NamespacePackageTelemetry.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/indexer/NamespacePackageTelemetry.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/indexer/PackageResolutionResult.java b/python-commons/src/main/java/org/sonar/plugins/python/indexer/PackageResolutionResult.java index b721395a5..88c6b701b 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/indexer/PackageResolutionResult.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/indexer/PackageResolutionResult.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/indexer/PackageRootResolver.java b/python-commons/src/main/java/org/sonar/plugins/python/indexer/PackageRootResolver.java index d5d6a2bce..926d662df 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/indexer/PackageRootResolver.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/indexer/PackageRootResolver.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/indexer/ProjectTree.java b/python-commons/src/main/java/org/sonar/plugins/python/indexer/ProjectTree.java index b36c18edb..0586aceba 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/indexer/ProjectTree.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/indexer/ProjectTree.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/indexer/ProjectTreeBuilder.java b/python-commons/src/main/java/org/sonar/plugins/python/indexer/ProjectTreeBuilder.java index ad0268255..ea62a43bf 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/indexer/ProjectTreeBuilder.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/indexer/ProjectTreeBuilder.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/indexer/PyProjectExtractionResult.java b/python-commons/src/main/java/org/sonar/plugins/python/indexer/PyProjectExtractionResult.java index 6945f7a66..89e8bef41 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/indexer/PyProjectExtractionResult.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/indexer/PyProjectExtractionResult.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/indexer/PyProjectTomlSourceRoots.java b/python-commons/src/main/java/org/sonar/plugins/python/indexer/PyProjectTomlSourceRoots.java index 469b5e8b9..d9d398f37 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/indexer/PyProjectTomlSourceRoots.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/indexer/PyProjectTomlSourceRoots.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/indexer/PythonIndexer.java b/python-commons/src/main/java/org/sonar/plugins/python/indexer/PythonIndexer.java index a65e6061e..25e12f7da 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/indexer/PythonIndexer.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/indexer/PythonIndexer.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/indexer/PythonIndexerWrapper.java b/python-commons/src/main/java/org/sonar/plugins/python/indexer/PythonIndexerWrapper.java index 1a98b5473..5dadecdc3 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/indexer/PythonIndexerWrapper.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/indexer/PythonIndexerWrapper.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/indexer/SetupPySourceRoots.java b/python-commons/src/main/java/org/sonar/plugins/python/indexer/SetupPySourceRoots.java index 5090c7ba3..03750cc32 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/indexer/SetupPySourceRoots.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/indexer/SetupPySourceRoots.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/indexer/SonarLintPythonIndexer.java b/python-commons/src/main/java/org/sonar/plugins/python/indexer/SonarLintPythonIndexer.java index 75eadc184..2788f3511 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/indexer/SonarLintPythonIndexer.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/indexer/SonarLintPythonIndexer.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexer.java b/python-commons/src/main/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexer.java index f4c554e77..f61a6a961 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexer.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexer.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/indexer/package-info.java b/python-commons/src/main/java/org/sonar/plugins/python/indexer/package-info.java index df040759d..d9fc2e1bf 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/indexer/package-info.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/indexer/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/mypy/MypyRulesDefinition.java b/python-commons/src/main/java/org/sonar/plugins/python/mypy/MypyRulesDefinition.java index ad5f218f2..c6310d66c 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/mypy/MypyRulesDefinition.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/mypy/MypyRulesDefinition.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/mypy/MypySensor.java b/python-commons/src/main/java/org/sonar/plugins/python/mypy/MypySensor.java index ce3c25934..72d65efdc 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/mypy/MypySensor.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/mypy/MypySensor.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/mypy/package-info.java b/python-commons/src/main/java/org/sonar/plugins/python/mypy/package-info.java index eb82845e0..f5ccae0ca 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/mypy/package-info.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/mypy/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/nosonar/NoSonarIssueFilter.java b/python-commons/src/main/java/org/sonar/plugins/python/nosonar/NoSonarIssueFilter.java index b398e5c0b..a79456c98 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/nosonar/NoSonarIssueFilter.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/nosonar/NoSonarIssueFilter.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/nosonar/NoSonarLineInfoCollector.java b/python-commons/src/main/java/org/sonar/plugins/python/nosonar/NoSonarLineInfoCollector.java index 959f27231..a0f255b42 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/nosonar/NoSonarLineInfoCollector.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/nosonar/NoSonarLineInfoCollector.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/nosonar/package-info.java b/python-commons/src/main/java/org/sonar/plugins/python/nosonar/package-info.java index aec7fac26..5f3d394ef 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/nosonar/package-info.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/nosonar/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/package-info.java b/python-commons/src/main/java/org/sonar/plugins/python/package-info.java index 4309be690..f7731e1fc 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/package-info.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/parser/StaxParser.java b/python-commons/src/main/java/org/sonar/plugins/python/parser/StaxParser.java index 3abb29248..c8898561a 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/parser/StaxParser.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/parser/StaxParser.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/parser/package-info.java b/python-commons/src/main/java/org/sonar/plugins/python/parser/package-info.java index 07e17125e..7a13469ea 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/parser/package-info.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/parser/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/pylint/PylintRulesDefinition.java b/python-commons/src/main/java/org/sonar/plugins/python/pylint/PylintRulesDefinition.java index 232309021..525b4cc0d 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/pylint/PylintRulesDefinition.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/pylint/PylintRulesDefinition.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/pylint/PylintSensor.java b/python-commons/src/main/java/org/sonar/plugins/python/pylint/PylintSensor.java index c7905b1f9..7d2477911 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/pylint/PylintSensor.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/pylint/PylintSensor.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/pylint/package-info.java b/python-commons/src/main/java/org/sonar/plugins/python/pylint/package-info.java index ee90ed871..61a88ae00 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/pylint/package-info.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/pylint/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/ruff/RuffJsonReportReader.java b/python-commons/src/main/java/org/sonar/plugins/python/ruff/RuffJsonReportReader.java index 07ac2c886..8b6b073cd 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/ruff/RuffJsonReportReader.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/ruff/RuffJsonReportReader.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/ruff/RuffRulesDefinition.java b/python-commons/src/main/java/org/sonar/plugins/python/ruff/RuffRulesDefinition.java index 1360f1f11..7da62169d 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/ruff/RuffRulesDefinition.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/ruff/RuffRulesDefinition.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/ruff/RuffSensor.java b/python-commons/src/main/java/org/sonar/plugins/python/ruff/RuffSensor.java index f1c4fd63d..d4d99e32c 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/ruff/RuffSensor.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/ruff/RuffSensor.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/ruff/package-info.java b/python-commons/src/main/java/org/sonar/plugins/python/ruff/package-info.java index ee0b6790d..31fb5de5f 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/ruff/package-info.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/ruff/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/telemetry/SensorTelemetryStorage.java b/python-commons/src/main/java/org/sonar/plugins/python/telemetry/SensorTelemetryStorage.java index 09968fe14..0e75e8a77 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/telemetry/SensorTelemetryStorage.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/telemetry/SensorTelemetryStorage.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/telemetry/TelemetryMetricKey.java b/python-commons/src/main/java/org/sonar/plugins/python/telemetry/TelemetryMetricKey.java index 32a11f005..24dbed70a 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/telemetry/TelemetryMetricKey.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/telemetry/TelemetryMetricKey.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/telemetry/collectors/TestFileTelemetry.java b/python-commons/src/main/java/org/sonar/plugins/python/telemetry/collectors/TestFileTelemetry.java index cb29d0d47..78693e0e1 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/telemetry/collectors/TestFileTelemetry.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/telemetry/collectors/TestFileTelemetry.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/telemetry/collectors/TestFileTelemetryCollector.java b/python-commons/src/main/java/org/sonar/plugins/python/telemetry/collectors/TestFileTelemetryCollector.java index dd627d036..cd0f1a239 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/telemetry/collectors/TestFileTelemetryCollector.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/telemetry/collectors/TestFileTelemetryCollector.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/telemetry/collectors/TypeInferenceTelemetry.java b/python-commons/src/main/java/org/sonar/plugins/python/telemetry/collectors/TypeInferenceTelemetry.java index ccf744212..93b31f057 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/telemetry/collectors/TypeInferenceTelemetry.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/telemetry/collectors/TypeInferenceTelemetry.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/telemetry/collectors/TypeInferenceTelemetryCollector.java b/python-commons/src/main/java/org/sonar/plugins/python/telemetry/collectors/TypeInferenceTelemetryCollector.java index acc151ebb..45cd052c0 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/telemetry/collectors/TypeInferenceTelemetryCollector.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/telemetry/collectors/TypeInferenceTelemetryCollector.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/telemetry/collectors/package-info.java b/python-commons/src/main/java/org/sonar/plugins/python/telemetry/collectors/package-info.java index 72cfb4ea2..e6bb3dd67 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/telemetry/collectors/package-info.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/telemetry/collectors/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/telemetry/package-info.java b/python-commons/src/main/java/org/sonar/plugins/python/telemetry/package-info.java index caecfb169..fd6649d6c 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/telemetry/package-info.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/telemetry/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/warnings/AnalysisWarningsWrapper.java b/python-commons/src/main/java/org/sonar/plugins/python/warnings/AnalysisWarningsWrapper.java index 7d503fd8f..106f93d10 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/warnings/AnalysisWarningsWrapper.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/warnings/AnalysisWarningsWrapper.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/warnings/package-info.java b/python-commons/src/main/java/org/sonar/plugins/python/warnings/package-info.java index 1781ada50..812915218 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/warnings/package-info.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/warnings/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/xunit/PythonXUnitSensor.java b/python-commons/src/main/java/org/sonar/plugins/python/xunit/PythonXUnitSensor.java index 3fcc5c210..b48396a19 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/xunit/PythonXUnitSensor.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/xunit/PythonXUnitSensor.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/xunit/TestCase.java b/python-commons/src/main/java/org/sonar/plugins/python/xunit/TestCase.java index 6a22b2742..8f284c311 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/xunit/TestCase.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/xunit/TestCase.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/xunit/TestResult.java b/python-commons/src/main/java/org/sonar/plugins/python/xunit/TestResult.java index 364dbdb55..ab45741e6 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/xunit/TestResult.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/xunit/TestResult.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/xunit/TestSuite.java b/python-commons/src/main/java/org/sonar/plugins/python/xunit/TestSuite.java index de4a7d8a3..2560ced46 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/xunit/TestSuite.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/xunit/TestSuite.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/xunit/TestSuiteParser.java b/python-commons/src/main/java/org/sonar/plugins/python/xunit/TestSuiteParser.java index 42b221944..f7e61f301 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/xunit/TestSuiteParser.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/xunit/TestSuiteParser.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/main/java/org/sonar/plugins/python/xunit/package-info.java b/python-commons/src/main/java/org/sonar/plugins/python/xunit/package-info.java index 088e9e32d..7d643c99d 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/xunit/package-info.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/xunit/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/com/sonar/plugins/security/api/PythonRules.java b/python-commons/src/test/java/com/sonar/plugins/security/api/PythonRules.java index f85ce5f5f..14458c493 100644 --- a/python-commons/src/test/java/com/sonar/plugins/security/api/PythonRules.java +++ b/python-commons/src/test/java/com/sonar/plugins/security/api/PythonRules.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/com/sonarsource/plugins/architecturepythonfrontend/api/ArchitecturePythonRules.java b/python-commons/src/test/java/com/sonarsource/plugins/architecturepythonfrontend/api/ArchitecturePythonRules.java index ae67e3ca4..4d2c9cf0c 100644 --- a/python-commons/src/test/java/com/sonarsource/plugins/architecturepythonfrontend/api/ArchitecturePythonRules.java +++ b/python-commons/src/test/java/com/sonarsource/plugins/architecturepythonfrontend/api/ArchitecturePythonRules.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/com/sonarsource/plugins/dbd/api/PythonRules.java b/python-commons/src/test/java/com/sonarsource/plugins/dbd/api/PythonRules.java index 2889b9c80..30624cb56 100644 --- a/python-commons/src/test/java/com/sonarsource/plugins/dbd/api/PythonRules.java +++ b/python-commons/src/test/java/com/sonarsource/plugins/dbd/api/PythonRules.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/AIQualityProfileTest.java b/python-commons/src/test/java/org/sonar/plugins/python/AIQualityProfileTest.java index 2f458a4c2..2cd1c428d 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/AIQualityProfileTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/AIQualityProfileTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/AbstractPythonRuleRepositoryTest.java b/python-commons/src/test/java/org/sonar/plugins/python/AbstractPythonRuleRepositoryTest.java index 66dc8d8ba..ae7240460 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/AbstractPythonRuleRepositoryTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/AbstractPythonRuleRepositoryTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/DependencyTelemetrySensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/DependencyTelemetrySensorTest.java index 906a8e45d..ac11f5fc6 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/DependencyTelemetrySensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/DependencyTelemetrySensorTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/GeneratedIPythonFileTest.java b/python-commons/src/test/java/org/sonar/plugins/python/GeneratedIPythonFileTest.java index 9ce2410ba..8aea15d8d 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/GeneratedIPythonFileTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/GeneratedIPythonFileTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/IPynbAIQualityProfileTest.java b/python-commons/src/test/java/org/sonar/plugins/python/IPynbAIQualityProfileTest.java index 6aee4c1af..ea58a316d 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/IPynbAIQualityProfileTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/IPynbAIQualityProfileTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/IPynbProfileTest.java b/python-commons/src/test/java/org/sonar/plugins/python/IPynbProfileTest.java index 6161e18d7..ec16c5333 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/IPynbProfileTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/IPynbProfileTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/IPynbRuleRepositoryTest.java b/python-commons/src/test/java/org/sonar/plugins/python/IPynbRuleRepositoryTest.java index 31440111e..65f5786d1 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/IPynbRuleRepositoryTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/IPynbRuleRepositoryTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/IPynbSensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/IPynbSensorTest.java index 4ddd69f69..0e14321d9 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/IPynbSensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/IPynbSensorTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/IPynbTest.java b/python-commons/src/test/java/org/sonar/plugins/python/IPynbTest.java index 0ec216500..30a36f0e0 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/IPynbTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/IPynbTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/IpynbNotebookParserScannerTest.java b/python-commons/src/test/java/org/sonar/plugins/python/IpynbNotebookParserScannerTest.java index 2c32114cb..6e00deb07 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/IpynbNotebookParserScannerTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/IpynbNotebookParserScannerTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/MeasuresRepositoryTest.java b/python-commons/src/test/java/org/sonar/plugins/python/MeasuresRepositoryTest.java index ff7bef9da..a1d02f628 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/MeasuresRepositoryTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/MeasuresRepositoryTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/MockSonarLintIssue.java b/python-commons/src/test/java/org/sonar/plugins/python/MockSonarLintIssue.java index 65fb02c2f..a1ee7657e 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/MockSonarLintIssue.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/MockSonarLintIssue.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/MultiFileProgressReportTest.java b/python-commons/src/test/java/org/sonar/plugins/python/MultiFileProgressReportTest.java index a18dd5ae0..b9dad91c0 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/MultiFileProgressReportTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/MultiFileProgressReportTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/NewSymbolsCollectorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/NewSymbolsCollectorTest.java index c72625c80..c4541fc1f 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/NewSymbolsCollectorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/NewSymbolsCollectorTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/NotebookParsingDataTest.java b/python-commons/src/test/java/org/sonar/plugins/python/NotebookParsingDataTest.java index 61a85e156..604b061de 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/NotebookParsingDataTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/NotebookParsingDataTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/PythonExtensionsTest.java b/python-commons/src/test/java/org/sonar/plugins/python/PythonExtensionsTest.java index 38b63085e..e9eab83ed 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/PythonExtensionsTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/PythonExtensionsTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/PythonHighlighterTest.java b/python-commons/src/test/java/org/sonar/plugins/python/PythonHighlighterTest.java index 522047e3e..efaaaffac 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/PythonHighlighterTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/PythonHighlighterTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/PythonProfileTest.java b/python-commons/src/test/java/org/sonar/plugins/python/PythonProfileTest.java index 24ff13b07..6d43ad2d0 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/PythonProfileTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/PythonProfileTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/PythonRuleRepositoryTest.java b/python-commons/src/test/java/org/sonar/plugins/python/PythonRuleRepositoryTest.java index 8a3800e3e..764a1b31e 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/PythonRuleRepositoryTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/PythonRuleRepositoryTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java index cc4f91ff1..ac19b3699 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/PythonTest.java b/python-commons/src/test/java/org/sonar/plugins/python/PythonTest.java index 2ab9104ea..8c0e64b7b 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/PythonTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/PythonTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/ScannerTest.java b/python-commons/src/test/java/org/sonar/plugins/python/ScannerTest.java index 5d9f869ca..15c37396e 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/ScannerTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/ScannerTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/TestUtils.java b/python-commons/src/test/java/org/sonar/plugins/python/TestUtils.java index 389dce085..d67cecbaf 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/TestUtils.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/TestUtils.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/architecture/ArchitectureUDGBuilderWrapperTest.java b/python-commons/src/test/java/org/sonar/plugins/python/architecture/ArchitectureUDGBuilderWrapperTest.java index 6a2d487e1..6ade07779 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/architecture/ArchitectureUDGBuilderWrapperTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/architecture/ArchitectureUDGBuilderWrapperTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/bandit/BanditRulesDefinitionTest.java b/python-commons/src/test/java/org/sonar/plugins/python/bandit/BanditRulesDefinitionTest.java index 5d6dd09dc..dd03b362a 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/bandit/BanditRulesDefinitionTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/bandit/BanditRulesDefinitionTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/bandit/BanditSensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/bandit/BanditSensorTest.java index cf9de5411..c275dd85e 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/bandit/BanditSensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/bandit/BanditSensorTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/caching/CachingTest.java b/python-commons/src/test/java/org/sonar/plugins/python/caching/CachingTest.java index f062546de..616499866 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/caching/CachingTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/caching/CachingTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/caching/TestReadCache.java b/python-commons/src/test/java/org/sonar/plugins/python/caching/TestReadCache.java index 1264664f9..0eff260fb 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/caching/TestReadCache.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/caching/TestReadCache.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/caching/TestWriteCache.java b/python-commons/src/test/java/org/sonar/plugins/python/caching/TestWriteCache.java index 0a9d840fa..455fb09c1 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/caching/TestWriteCache.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/caching/TestWriteCache.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/coverage/PythonCoverageSensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/coverage/PythonCoverageSensorTest.java index 417401340..6fdd6f863 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/coverage/PythonCoverageSensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/coverage/PythonCoverageSensorTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/cpd/PythonCpdAnalyzerTest.java b/python-commons/src/test/java/org/sonar/plugins/python/cpd/PythonCpdAnalyzerTest.java index 97be62326..daa24d712 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/cpd/PythonCpdAnalyzerTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/cpd/PythonCpdAnalyzerTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/dependency/DependencyPostProcessorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/dependency/DependencyPostProcessorTest.java index a43e9df78..c4dda615a 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/dependency/DependencyPostProcessorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/dependency/DependencyPostProcessorTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/dependency/DependencyTelemetryTest.java b/python-commons/src/test/java/org/sonar/plugins/python/dependency/DependencyTelemetryTest.java index b2cbf76c2..60cf30839 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/dependency/DependencyTelemetryTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/dependency/DependencyTelemetryTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/dependency/PyProjectTomlParserTest.java b/python-commons/src/test/java/org/sonar/plugins/python/dependency/PyProjectTomlParserTest.java index beec88ab7..777002c05 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/dependency/PyProjectTomlParserTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/dependency/PyProjectTomlParserTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/dependency/RequirementsTxtParserTest.java b/python-commons/src/test/java/org/sonar/plugins/python/dependency/RequirementsTxtParserTest.java index e3d75b6b6..fcdb1dac6 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/dependency/RequirementsTxtParserTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/dependency/RequirementsTxtParserTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/dependency/model/DependencyTest.java b/python-commons/src/test/java/org/sonar/plugins/python/dependency/model/DependencyTest.java index 55a291ca6..bfc582976 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/dependency/model/DependencyTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/dependency/model/DependencyTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/editions/OpenSourceRepositoryInfoProviderTest.java b/python-commons/src/test/java/org/sonar/plugins/python/editions/OpenSourceRepositoryInfoProviderTest.java index df351f76d..0ff15677f 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/editions/OpenSourceRepositoryInfoProviderTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/editions/OpenSourceRepositoryInfoProviderTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/editions/RepositoryInfoProviderWrapperTest.java b/python-commons/src/test/java/org/sonar/plugins/python/editions/RepositoryInfoProviderWrapperTest.java index adf55d720..b1c0cd78a 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/editions/RepositoryInfoProviderWrapperTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/editions/RepositoryInfoProviderWrapperTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/flake8/Flake8RulesDefinitionTest.java b/python-commons/src/test/java/org/sonar/plugins/python/flake8/Flake8RulesDefinitionTest.java index 4a2ad1536..04000ad0e 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/flake8/Flake8RulesDefinitionTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/flake8/Flake8RulesDefinitionTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/flake8/Flake8SensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/flake8/Flake8SensorTest.java index bf5ddab2b..b79e75ce3 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/flake8/Flake8SensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/flake8/Flake8SensorTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/indexer/ConfigSourceRootsTest.java b/python-commons/src/test/java/org/sonar/plugins/python/indexer/ConfigSourceRootsTest.java index 03ed0d336..ec5d6508b 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/indexer/ConfigSourceRootsTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/indexer/ConfigSourceRootsTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/indexer/NamespacePackageAnalyzerTest.java b/python-commons/src/test/java/org/sonar/plugins/python/indexer/NamespacePackageAnalyzerTest.java index e677cc994..4adf497c7 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/indexer/NamespacePackageAnalyzerTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/indexer/NamespacePackageAnalyzerTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/indexer/PackageResolutionResultTest.java b/python-commons/src/test/java/org/sonar/plugins/python/indexer/PackageResolutionResultTest.java index 9cf58e338..908ca4aa7 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/indexer/PackageResolutionResultTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/indexer/PackageResolutionResultTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/indexer/PackageRootResolverTest.java b/python-commons/src/test/java/org/sonar/plugins/python/indexer/PackageRootResolverTest.java index 1d7421a6f..1a4d0e515 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/indexer/PackageRootResolverTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/indexer/PackageRootResolverTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/indexer/ProjectTreeBuilderTest.java b/python-commons/src/test/java/org/sonar/plugins/python/indexer/ProjectTreeBuilderTest.java index e38c61de2..c455f4bea 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/indexer/ProjectTreeBuilderTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/indexer/ProjectTreeBuilderTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/indexer/PyProjectTomlSourceRootsTest.java b/python-commons/src/test/java/org/sonar/plugins/python/indexer/PyProjectTomlSourceRootsTest.java index ceaeb85d0..28e8ea411 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/indexer/PyProjectTomlSourceRootsTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/indexer/PyProjectTomlSourceRootsTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/indexer/PythonIndexerTest.java b/python-commons/src/test/java/org/sonar/plugins/python/indexer/PythonIndexerTest.java index 384f7398a..8a0f260da 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/indexer/PythonIndexerTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/indexer/PythonIndexerTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/indexer/PythonIndexerWrapperTest.java b/python-commons/src/test/java/org/sonar/plugins/python/indexer/PythonIndexerWrapperTest.java index e48f12296..8d58cd2d7 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/indexer/PythonIndexerWrapperTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/indexer/PythonIndexerWrapperTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/indexer/SetupPySourceRootsTest.java b/python-commons/src/test/java/org/sonar/plugins/python/indexer/SetupPySourceRootsTest.java index 59b3e3194..b16b59a42 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/indexer/SetupPySourceRootsTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/indexer/SetupPySourceRootsTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarLintPythonIndexerTest.java b/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarLintPythonIndexerTest.java index f2e597f76..d8ea2519a 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarLintPythonIndexerTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarLintPythonIndexerTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexerTest.java b/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexerTest.java index 54da23334..43f061282 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexerTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexerTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/indexer/TestModuleFileSystem.java b/python-commons/src/test/java/org/sonar/plugins/python/indexer/TestModuleFileSystem.java index 7d94cbfe1..a0da14037 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/indexer/TestModuleFileSystem.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/indexer/TestModuleFileSystem.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/mypy/MypyRulesDefinitionTest.java b/python-commons/src/test/java/org/sonar/plugins/python/mypy/MypyRulesDefinitionTest.java index 3c40c191e..bfd38277e 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/mypy/MypyRulesDefinitionTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/mypy/MypyRulesDefinitionTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/mypy/MypySensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/mypy/MypySensorTest.java index 891f4c98c..16b894d4e 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/mypy/MypySensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/mypy/MypySensorTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/nosonar/NoSonarIssueFilterTest.java b/python-commons/src/test/java/org/sonar/plugins/python/nosonar/NoSonarIssueFilterTest.java index 133453ffe..17b0d7299 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/nosonar/NoSonarIssueFilterTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/nosonar/NoSonarIssueFilterTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/nosonar/NoSonarLineInfoCollectorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/nosonar/NoSonarLineInfoCollectorTest.java index 5a5f11810..7fb2f6e07 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/nosonar/NoSonarLineInfoCollectorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/nosonar/NoSonarLineInfoCollectorTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/parser/StaxParserTest.java b/python-commons/src/test/java/org/sonar/plugins/python/parser/StaxParserTest.java index 424ce22e0..fe711cd02 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/parser/StaxParserTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/parser/StaxParserTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/pylint/PylintRulesDefinitionTest.java b/python-commons/src/test/java/org/sonar/plugins/python/pylint/PylintRulesDefinitionTest.java index 7d0148817..ae7b965f8 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/pylint/PylintRulesDefinitionTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/pylint/PylintRulesDefinitionTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/pylint/PylintSensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/pylint/PylintSensorTest.java index 079324d6b..18ea07820 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/pylint/PylintSensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/pylint/PylintSensorTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/ruff/RuffRulesDefinitionTest.java b/python-commons/src/test/java/org/sonar/plugins/python/ruff/RuffRulesDefinitionTest.java index 0b4036622..5d5522b22 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/ruff/RuffRulesDefinitionTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/ruff/RuffRulesDefinitionTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/ruff/RuffSensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/ruff/RuffSensorTest.java index f7038ae25..779a343be 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/ruff/RuffSensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/ruff/RuffSensorTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/telemetry/SensorTelemetryStorageTest.java b/python-commons/src/test/java/org/sonar/plugins/python/telemetry/SensorTelemetryStorageTest.java index 685dbe627..3e28e9474 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/telemetry/SensorTelemetryStorageTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/telemetry/SensorTelemetryStorageTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/telemetry/collectors/TestFileTelemetryCollectorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/telemetry/collectors/TestFileTelemetryCollectorTest.java index 706699c73..43a54edb7 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/telemetry/collectors/TestFileTelemetryCollectorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/telemetry/collectors/TestFileTelemetryCollectorTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/telemetry/collectors/TestFileTelemetryTest.java b/python-commons/src/test/java/org/sonar/plugins/python/telemetry/collectors/TestFileTelemetryTest.java index 2d8002821..628f6f63a 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/telemetry/collectors/TestFileTelemetryTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/telemetry/collectors/TestFileTelemetryTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/telemetry/collectors/TypeInferenceTelemetryCollectorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/telemetry/collectors/TypeInferenceTelemetryCollectorTest.java index 8e562c56e..11476d270 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/telemetry/collectors/TypeInferenceTelemetryCollectorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/telemetry/collectors/TypeInferenceTelemetryCollectorTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/warnings/AnalysisWarningsWrapperTest.java b/python-commons/src/test/java/org/sonar/plugins/python/warnings/AnalysisWarningsWrapperTest.java index e6309cd86..736d3aee2 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/warnings/AnalysisWarningsWrapperTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/warnings/AnalysisWarningsWrapperTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/xunit/PythonXUnitSensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/xunit/PythonXUnitSensorTest.java index 521d95814..ddad326b0 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/xunit/PythonXUnitSensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/xunit/PythonXUnitSensorTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/xunit/TestCaseTest.java b/python-commons/src/test/java/org/sonar/plugins/python/xunit/TestCaseTest.java index 452e79981..db0ca1897 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/xunit/TestCaseTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/xunit/TestCaseTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/xunit/TestResultTest.java b/python-commons/src/test/java/org/sonar/plugins/python/xunit/TestResultTest.java index 7a4ec8a94..86b82739a 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/xunit/TestResultTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/xunit/TestResultTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-commons/src/test/java/org/sonar/plugins/python/xunit/TestSuiteTest.java b/python-commons/src/test/java/org/sonar/plugins/python/xunit/TestSuiteTest.java index c4cdcbf8a..ce225f387 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/xunit/TestSuiteTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/xunit/TestSuiteTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/GeneratedIPythonFile.java b/python-frontend/src/main/java/org/sonar/plugins/python/GeneratedIPythonFile.java index bafb1ec5c..2c71f5f63 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/GeneratedIPythonFile.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/GeneratedIPythonFile.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/IpynbNotebookParser.java b/python-frontend/src/main/java/org/sonar/plugins/python/IpynbNotebookParser.java index 841cb09fd..533ccdc4e 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/IpynbNotebookParser.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/IpynbNotebookParser.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/NotebookParsingData.java b/python-frontend/src/main/java/org/sonar/plugins/python/NotebookParsingData.java index 90759bdca..19c477fde 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/NotebookParsingData.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/NotebookParsingData.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/NotebookTestUtils.java b/python-frontend/src/main/java/org/sonar/plugins/python/NotebookTestUtils.java index f0f37697b..650f4b716 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/NotebookTestUtils.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/NotebookTestUtils.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/PythonInputFile.java b/python-frontend/src/main/java/org/sonar/plugins/python/PythonInputFile.java index 0279198e9..c558609ae 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/PythonInputFile.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/PythonInputFile.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/PythonInputFileImpl.java b/python-frontend/src/main/java/org/sonar/plugins/python/PythonInputFileImpl.java index 465e20384..5185c1a59 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/PythonInputFileImpl.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/PythonInputFileImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/SonarQubePythonFile.java b/python-frontend/src/main/java/org/sonar/plugins/python/SonarQubePythonFile.java index 658016b3e..53a7748be 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/SonarQubePythonFile.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/SonarQubePythonFile.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/DjangoViewInfo.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/DjangoViewInfo.java index 4ccf88be5..4d1e455bf 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/DjangoViewInfo.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/DjangoViewInfo.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/IssueLocation.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/IssueLocation.java index 03ab147cc..25cc7a594 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/IssueLocation.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/IssueLocation.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/LocationInFile.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/LocationInFile.java index 76850a9dd..8a213c663 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/LocationInFile.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/LocationInFile.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/Parser.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/Parser.java index a80142d6a..10f093596 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/Parser.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/Parser.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/ProjectPythonVersion.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/ProjectPythonVersion.java index 1b94118ad..e00d28628 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/ProjectPythonVersion.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/ProjectPythonVersion.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonCheck.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonCheck.java index 9241bf99d..55fbe81b0 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonCheck.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonCustomRuleRepository.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonCustomRuleRepository.java index e72e5f72a..277805b5b 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonCustomRuleRepository.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonCustomRuleRepository.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonCustomRuleRepositoryWrapper.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonCustomRuleRepositoryWrapper.java index 1f87e325c..a1ab0a67e 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonCustomRuleRepositoryWrapper.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonCustomRuleRepositoryWrapper.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonFile.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonFile.java index 9ebe2bbbb..504e84740 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonFile.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonFile.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonFileConsumer.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonFileConsumer.java index 3156bf3c1..ca6c4dd10 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonFileConsumer.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonFileConsumer.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonInputFileContext.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonInputFileContext.java index 8494f4754..92041e6fd 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonInputFileContext.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonInputFileContext.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonLine.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonLine.java index 36f3c44e8..5b29730a3 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonLine.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonLine.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonSubscriptionCheck.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonSubscriptionCheck.java index 17b7fce1c..bd203a545 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonSubscriptionCheck.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonSubscriptionCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonVersionUtils.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonVersionUtils.java index baefa7644..ecff21c02 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonVersionUtils.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonVersionUtils.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonVisitorCheck.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonVisitorCheck.java index ed2686a32..ca99ac496 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonVisitorCheck.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonVisitorCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonVisitorContext.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonVisitorContext.java index 40356853e..b36a70bbf 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonVisitorContext.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonVisitorContext.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/SonarLintCache.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/SonarLintCache.java index 0fca919c5..9439bbd97 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/SonarLintCache.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/SonarLintCache.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/SonarLintCacheWrapper.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/SonarLintCacheWrapper.java index 5135eda9f..105ba4797 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/SonarLintCacheWrapper.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/SonarLintCacheWrapper.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/SubscriptionCheck.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/SubscriptionCheck.java index d57db6136..a17a1ff3c 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/SubscriptionCheck.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/SubscriptionCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/SubscriptionContext.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/SubscriptionContext.java index 841974f7c..aec793cdb 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/SubscriptionContext.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/SubscriptionContext.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/TokenLocation.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/TokenLocation.java index 8d07dbf74..da864795e 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/TokenLocation.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/TokenLocation.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/TriBool.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/TriBool.java index f1477a257..e1bd10240 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/TriBool.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/TriBool.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/caching/CacheContext.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/caching/CacheContext.java index 13f2a6cbd..cd8050d98 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/caching/CacheContext.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/caching/CacheContext.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/caching/PythonReadCache.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/caching/PythonReadCache.java index 0c3458baa..3218116d1 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/caching/PythonReadCache.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/caching/PythonReadCache.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/caching/PythonWriteCache.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/caching/PythonWriteCache.java index 23a05a0d7..699497c31 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/caching/PythonWriteCache.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/caching/PythonWriteCache.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/caching/package-info.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/caching/package-info.java index 634b68b7d..e09392d3a 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/caching/package-info.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/caching/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/cfg/CfgBlock.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/cfg/CfgBlock.java index 2b69f3af4..62548855a 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/cfg/CfgBlock.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/cfg/CfgBlock.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/cfg/CfgBranchingBlock.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/cfg/CfgBranchingBlock.java index 9689b80f7..f1f52de4c 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/cfg/CfgBranchingBlock.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/cfg/CfgBranchingBlock.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/cfg/ControlFlowGraph.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/cfg/ControlFlowGraph.java index c816e74c9..9e1bd836d 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/cfg/ControlFlowGraph.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/cfg/ControlFlowGraph.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/cfg/package-info.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/cfg/package-info.java index 72ff14269..022a3dd4f 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/cfg/package-info.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/cfg/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/internal/EndOfAnalysis.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/internal/EndOfAnalysis.java index b923717a4..ec8de4fe5 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/internal/EndOfAnalysis.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/internal/EndOfAnalysis.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/internal/package-info.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/internal/package-info.java index ec6ba03c9..c4c7f77c0 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/internal/package-info.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/internal/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/nosonar/NoSonarInfoParser.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/nosonar/NoSonarInfoParser.java index e42ed8d38..4f80be0f4 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/nosonar/NoSonarInfoParser.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/nosonar/NoSonarInfoParser.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/nosonar/NoSonarLineInfo.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/nosonar/NoSonarLineInfo.java index 7579a5899..1ddde66c8 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/nosonar/NoSonarLineInfo.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/nosonar/NoSonarLineInfo.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/nosonar/package-info.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/nosonar/package-info.java index fde7af53f..889c4e46e 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/nosonar/package-info.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/nosonar/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/package-info.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/package-info.java index 719b8014e..34619e088 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/package-info.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/project/configuration/AwsLambdaHandlerInfo.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/project/configuration/AwsLambdaHandlerInfo.java index 17b0dc11c..477b7a195 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/project/configuration/AwsLambdaHandlerInfo.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/project/configuration/AwsLambdaHandlerInfo.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/project/configuration/AwsProjectConfiguration.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/project/configuration/AwsProjectConfiguration.java index f86d9bad9..afcaf8994 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/project/configuration/AwsProjectConfiguration.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/project/configuration/AwsProjectConfiguration.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/project/configuration/ProjectConfiguration.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/project/configuration/ProjectConfiguration.java index 3ef0c8421..5c9f35a9e 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/project/configuration/ProjectConfiguration.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/project/configuration/ProjectConfiguration.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/project/configuration/package-info.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/project/configuration/package-info.java index 77d2b49f0..3ea7927aa 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/project/configuration/package-info.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/project/configuration/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/quickfix/PythonQuickFix.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/quickfix/PythonQuickFix.java index 53e4da593..638d84186 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/quickfix/PythonQuickFix.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/quickfix/PythonQuickFix.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/quickfix/PythonTextEdit.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/quickfix/PythonTextEdit.java index 9f1659428..8c72962c2 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/quickfix/PythonTextEdit.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/quickfix/PythonTextEdit.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/quickfix/package-info.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/quickfix/package-info.java index d816d1891..490b14d50 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/quickfix/package-info.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/quickfix/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/symbols/AmbiguousSymbol.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/symbols/AmbiguousSymbol.java index 26da80419..e714420c8 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/symbols/AmbiguousSymbol.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/symbols/AmbiguousSymbol.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/symbols/ClassSymbol.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/symbols/ClassSymbol.java index 3af2dd0c5..a5deb6f1d 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/symbols/ClassSymbol.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/symbols/ClassSymbol.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/symbols/FunctionSymbol.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/symbols/FunctionSymbol.java index f35004ecc..59f10752a 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/symbols/FunctionSymbol.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/symbols/FunctionSymbol.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/symbols/Symbol.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/symbols/Symbol.java index 450fa42c6..8b8749e94 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/symbols/Symbol.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/symbols/Symbol.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/symbols/Usage.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/symbols/Usage.java index 1cf9dfafc..2c315a487 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/symbols/Usage.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/symbols/Usage.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/symbols/package-info.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/symbols/package-info.java index 999d5c085..6941e7389 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/symbols/package-info.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/symbols/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/symbols/v2/SymbolV2.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/symbols/v2/SymbolV2.java index d2cad504c..ce6f8096c 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/symbols/v2/SymbolV2.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/symbols/v2/SymbolV2.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/symbols/v2/UsageV2.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/symbols/v2/UsageV2.java index 9a24e6bc9..02db235a1 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/symbols/v2/UsageV2.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/symbols/v2/UsageV2.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/symbols/v2/package-info.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/symbols/v2/package-info.java index 96727be3d..bc50928aa 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/symbols/v2/package-info.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/symbols/v2/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/AliasedName.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/AliasedName.java index 795d7b754..e6f64ab1e 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/AliasedName.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/AliasedName.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/AnnotatedAssignment.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/AnnotatedAssignment.java index 5245c24ef..ef42d7aea 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/AnnotatedAssignment.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/AnnotatedAssignment.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/AnyParameter.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/AnyParameter.java index 7c16977be..1a968dc03 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/AnyParameter.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/AnyParameter.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ArgList.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ArgList.java index c341afc1d..c8097c24f 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ArgList.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ArgList.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Argument.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Argument.java index 8f74fa3b0..9c52238d2 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Argument.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Argument.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/AsPattern.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/AsPattern.java index 80889fd64..8fe90cb07 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/AsPattern.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/AsPattern.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/AssertStatement.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/AssertStatement.java index 63cc82a4f..28d72d56a 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/AssertStatement.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/AssertStatement.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/AssignmentExpression.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/AssignmentExpression.java index bc45a915b..fd6f4729e 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/AssignmentExpression.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/AssignmentExpression.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/AssignmentStatement.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/AssignmentStatement.java index 1d8dcd604..ec893718e 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/AssignmentStatement.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/AssignmentStatement.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/AwaitExpression.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/AwaitExpression.java index e6729b51b..22621af1d 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/AwaitExpression.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/AwaitExpression.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/BaseTreeVisitor.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/BaseTreeVisitor.java index 9e371b858..409b940c5 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/BaseTreeVisitor.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/BaseTreeVisitor.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/BinaryExpression.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/BinaryExpression.java index 35aa2c53d..0ba03e884 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/BinaryExpression.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/BinaryExpression.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/BreakStatement.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/BreakStatement.java index 18f789e23..59382c0f1 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/BreakStatement.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/BreakStatement.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/CallExpression.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/CallExpression.java index a79944cc2..77ef1f601 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/CallExpression.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/CallExpression.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/CapturePattern.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/CapturePattern.java index c38ef3dab..34610a147 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/CapturePattern.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/CapturePattern.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/CaseBlock.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/CaseBlock.java index bf72157e2..2b758e70c 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/CaseBlock.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/CaseBlock.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/CellMagicStatement.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/CellMagicStatement.java index e25b82d8c..13883629c 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/CellMagicStatement.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/CellMagicStatement.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ClassDef.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ClassDef.java index 26af308d9..1b6313797 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ClassDef.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ClassDef.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ClassPattern.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ClassPattern.java index 69038f30f..6dc9bfc40 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ClassPattern.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ClassPattern.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/CompoundAssignmentStatement.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/CompoundAssignmentStatement.java index 3ea55ce63..8b510d730 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/CompoundAssignmentStatement.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/CompoundAssignmentStatement.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ComprehensionClause.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ComprehensionClause.java index c80bb9650..f144d259c 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ComprehensionClause.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ComprehensionClause.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ComprehensionExpression.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ComprehensionExpression.java index 4829095ae..9e16230b5 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ComprehensionExpression.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ComprehensionExpression.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ComprehensionFor.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ComprehensionFor.java index 12bb3a2c7..dd7c2a47f 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ComprehensionFor.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ComprehensionFor.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ComprehensionIf.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ComprehensionIf.java index 7e45428f5..bde5b16a8 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ComprehensionIf.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ComprehensionIf.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ConditionalExpression.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ConditionalExpression.java index f688578e9..7733fe1ab 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ConditionalExpression.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ConditionalExpression.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ContinueStatement.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ContinueStatement.java index 3384b898d..bdded7438 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ContinueStatement.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ContinueStatement.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Decorator.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Decorator.java index ea05ce625..538a39206 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Decorator.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Decorator.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/DelStatement.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/DelStatement.java index a4cc5ed8b..a59a57da8 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/DelStatement.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/DelStatement.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/DictCompExpression.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/DictCompExpression.java index 66eb196c6..c3d2eee04 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/DictCompExpression.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/DictCompExpression.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/DictionaryLiteral.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/DictionaryLiteral.java index 17f55a1ac..2ebe1e1bf 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/DictionaryLiteral.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/DictionaryLiteral.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/DictionaryLiteralElement.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/DictionaryLiteralElement.java index 17b565c7f..e4ceff404 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/DictionaryLiteralElement.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/DictionaryLiteralElement.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/DottedName.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/DottedName.java index 301260b63..f5de34a73 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/DottedName.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/DottedName.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/DoubleStarPattern.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/DoubleStarPattern.java index 52d0e7dc8..813525041 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/DoubleStarPattern.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/DoubleStarPattern.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/DynamicObjectInfoStatement.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/DynamicObjectInfoStatement.java index a3138167d..2543bd5ee 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/DynamicObjectInfoStatement.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/DynamicObjectInfoStatement.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/EllipsisExpression.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/EllipsisExpression.java index 12dd3807a..82e4f4103 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/EllipsisExpression.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/EllipsisExpression.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ElseClause.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ElseClause.java index ff0697c3d..b231bd546 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ElseClause.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ElseClause.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ExceptClause.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ExceptClause.java index f5d3adea3..99a1354b8 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ExceptClause.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ExceptClause.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ExecStatement.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ExecStatement.java index 8d7efe4a3..b9a2dd0eb 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ExecStatement.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ExecStatement.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Expression.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Expression.java index 305755d82..1b157b200 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Expression.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Expression.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ExpressionList.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ExpressionList.java index 3b818a7c8..0d754ac13 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ExpressionList.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ExpressionList.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ExpressionStatement.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ExpressionStatement.java index 3e4f4ccfd..8b8129800 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ExpressionStatement.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ExpressionStatement.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/FileInput.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/FileInput.java index f105c1f81..c400c662d 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/FileInput.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/FileInput.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/FinallyClause.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/FinallyClause.java index cd26f707a..6617fd1ad 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/FinallyClause.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/FinallyClause.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ForStatement.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ForStatement.java index 208e7807f..21ef5d7a2 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ForStatement.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ForStatement.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/FormatSpecifier.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/FormatSpecifier.java index 608689ee0..de0c35d3c 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/FormatSpecifier.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/FormatSpecifier.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/FormattedExpression.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/FormattedExpression.java index 45bd67e88..56e2bb87e 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/FormattedExpression.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/FormattedExpression.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/FunctionDef.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/FunctionDef.java index 686a17f8d..bd738544b 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/FunctionDef.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/FunctionDef.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/FunctionLike.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/FunctionLike.java index 6d3d25a2f..ec30829be 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/FunctionLike.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/FunctionLike.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/GlobalStatement.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/GlobalStatement.java index 3628e39ba..d914993f2 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/GlobalStatement.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/GlobalStatement.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/GroupPattern.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/GroupPattern.java index ce528ff28..ab6fec9ed 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/GroupPattern.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/GroupPattern.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Guard.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Guard.java index ee37714d2..921592f73 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Guard.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Guard.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/HasSymbol.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/HasSymbol.java index ec1275fca..054aaa6b1 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/HasSymbol.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/HasSymbol.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/IfStatement.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/IfStatement.java index 42ab3b3c3..384986a25 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/IfStatement.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/IfStatement.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ImportFrom.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ImportFrom.java index ab33e5288..54ad87a37 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ImportFrom.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ImportFrom.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ImportName.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ImportName.java index fb3edd17f..a0fc26738 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ImportName.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ImportName.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ImportStatement.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ImportStatement.java index 5cd769376..8c70c02d0 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ImportStatement.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ImportStatement.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/InExpression.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/InExpression.java index b98af33d3..ba5d0a846 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/InExpression.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/InExpression.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/IsExpression.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/IsExpression.java index c41650b1c..d7be5e54e 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/IsExpression.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/IsExpression.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/KeyValuePair.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/KeyValuePair.java index 827298519..8aff50e2c 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/KeyValuePair.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/KeyValuePair.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/KeyValuePattern.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/KeyValuePattern.java index 33ed14a74..07f1dc3a0 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/KeyValuePattern.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/KeyValuePattern.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/KeywordPattern.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/KeywordPattern.java index fb204ef0e..f898f4eac 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/KeywordPattern.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/KeywordPattern.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/LambdaExpression.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/LambdaExpression.java index 321fc41ec..091a539c7 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/LambdaExpression.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/LambdaExpression.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/LineMagic.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/LineMagic.java index 6726c6fe4..4820a7684 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/LineMagic.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/LineMagic.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ListLiteral.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ListLiteral.java index f723d5913..78153a7c0 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ListLiteral.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ListLiteral.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/LiteralPattern.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/LiteralPattern.java index 66a230430..2f41e9126 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/LiteralPattern.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/LiteralPattern.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/MappingPattern.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/MappingPattern.java index 1bfdb5a16..24ec35cca 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/MappingPattern.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/MappingPattern.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/MatchStatement.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/MatchStatement.java index 5ec06503e..c45e98b94 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/MatchStatement.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/MatchStatement.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Name.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Name.java index 80a7afd53..e9c83d82f 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Name.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Name.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/NoneExpression.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/NoneExpression.java index fff857766..abfa36d8d 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/NoneExpression.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/NoneExpression.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/NonlocalStatement.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/NonlocalStatement.java index c7e051120..5ff05b945 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/NonlocalStatement.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/NonlocalStatement.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/NumericLiteral.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/NumericLiteral.java index e44d762ef..26b361c89 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/NumericLiteral.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/NumericLiteral.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/OrPattern.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/OrPattern.java index 0f27167a2..d81c20044 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/OrPattern.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/OrPattern.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Parameter.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Parameter.java index 6b76e8835..77d61d7e9 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Parameter.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Parameter.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ParameterList.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ParameterList.java index 8e4db94b8..27aab460f 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ParameterList.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ParameterList.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ParenthesizedExpression.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ParenthesizedExpression.java index f547e18e2..873eb16c1 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ParenthesizedExpression.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ParenthesizedExpression.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/PassStatement.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/PassStatement.java index 0f798760d..331ba7dd5 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/PassStatement.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/PassStatement.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Pattern.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Pattern.java index e1db9352b..99b38859e 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Pattern.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Pattern.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/PrintStatement.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/PrintStatement.java index f0d603908..2959aac1e 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/PrintStatement.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/PrintStatement.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/QualifiedExpression.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/QualifiedExpression.java index 54b4addad..9211e9209 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/QualifiedExpression.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/QualifiedExpression.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/RaiseStatement.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/RaiseStatement.java index 4e80f5826..b8d09ead7 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/RaiseStatement.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/RaiseStatement.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/RegularArgument.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/RegularArgument.java index 698c21772..d7baba170 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/RegularArgument.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/RegularArgument.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ReprExpression.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ReprExpression.java index a2fe9f34d..fde9c9a62 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ReprExpression.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ReprExpression.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ReturnStatement.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ReturnStatement.java index 4c103fb3a..34a232350 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ReturnStatement.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ReturnStatement.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/SequencePattern.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/SequencePattern.java index ab8115852..826cfd3c5 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/SequencePattern.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/SequencePattern.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/SetLiteral.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/SetLiteral.java index e273b4355..2353df52f 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/SetLiteral.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/SetLiteral.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/SliceExpression.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/SliceExpression.java index 33eacfe0c..a06146db6 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/SliceExpression.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/SliceExpression.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/SliceItem.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/SliceItem.java index fc80cf186..fd1781781 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/SliceItem.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/SliceItem.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/SliceList.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/SliceList.java index f767b32e4..b1d67134a 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/SliceList.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/SliceList.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/StarPattern.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/StarPattern.java index cdb6a142d..920e97501 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/StarPattern.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/StarPattern.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Statement.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Statement.java index 0f556ccc1..41ed9546e 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Statement.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Statement.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/StatementList.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/StatementList.java index 5703d06f8..851ff0e04 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/StatementList.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/StatementList.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/StringElement.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/StringElement.java index 78167826b..c24fea3ad 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/StringElement.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/StringElement.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/StringLiteral.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/StringLiteral.java index 33ee9d518..82e195080 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/StringLiteral.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/StringLiteral.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/SubscriptionExpression.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/SubscriptionExpression.java index d44108c0c..91f9a9500 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/SubscriptionExpression.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/SubscriptionExpression.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Token.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Token.java index 0740b1a2a..032f4deef 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Token.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Token.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Tree.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Tree.java index a7ca7c186..8076460e8 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Tree.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Tree.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/TreeVisitor.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/TreeVisitor.java index 7cb1dc070..5c355a637 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/TreeVisitor.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/TreeVisitor.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Trivia.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Trivia.java index 0f147676c..315bd1ae5 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Trivia.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Trivia.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/TryStatement.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/TryStatement.java index 822458593..f3a3b0f49 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/TryStatement.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/TryStatement.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Tuple.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Tuple.java index 203a77820..a9236389f 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Tuple.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Tuple.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/TupleParameter.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/TupleParameter.java index 91c102bd6..9373c99da 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/TupleParameter.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/TupleParameter.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/TypeAliasStatement.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/TypeAliasStatement.java index 822a6c1bd..d480796ea 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/TypeAliasStatement.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/TypeAliasStatement.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/TypeAnnotation.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/TypeAnnotation.java index 82f6dbb1b..53b216f42 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/TypeAnnotation.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/TypeAnnotation.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/TypeParam.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/TypeParam.java index d87d0a3cb..83f3d9e7c 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/TypeParam.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/TypeParam.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/TypeParams.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/TypeParams.java index 6eaaf86fe..37e1fea84 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/TypeParams.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/TypeParams.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/UnaryExpression.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/UnaryExpression.java index b87fe8947..2a6c1a2d7 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/UnaryExpression.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/UnaryExpression.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/UnpackingExpression.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/UnpackingExpression.java index 739eda049..0f96cbebb 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/UnpackingExpression.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/UnpackingExpression.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ValuePattern.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ValuePattern.java index 856894237..76b3c48de 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ValuePattern.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/ValuePattern.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/WhileStatement.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/WhileStatement.java index 7cbce0763..d8b67d415 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/WhileStatement.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/WhileStatement.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/WildcardPattern.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/WildcardPattern.java index a18dee450..c5917b4c9 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/WildcardPattern.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/WildcardPattern.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/WithItem.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/WithItem.java index aee6006da..ec569e9f8 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/WithItem.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/WithItem.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/WithStatement.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/WithStatement.java index b9b5b31a5..987c626e6 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/WithStatement.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/WithStatement.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/YieldExpression.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/YieldExpression.java index f4fe99a72..ccbece91c 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/YieldExpression.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/YieldExpression.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/YieldStatement.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/YieldStatement.java index df8411758..8487930f1 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/YieldStatement.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/YieldStatement.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/package-info.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/package-info.java index 270976290..7a1f8f450 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/package-info.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/tree/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/BuiltinTypes.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/BuiltinTypes.java index e6f3e466c..292638ebd 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/BuiltinTypes.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/BuiltinTypes.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/InferredType.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/InferredType.java index 0d38917b5..5af31cc0e 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/InferredType.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/InferredType.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/package-info.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/package-info.java index 561d456c3..202a5773e 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/package-info.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/ClassType.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/ClassType.java index 686ba2ebc..4d9a50b50 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/ClassType.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/ClassType.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/FullyQualifiedNameHelper.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/FullyQualifiedNameHelper.java index 116a6e7eb..cbf27b9f3 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/FullyQualifiedNameHelper.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/FullyQualifiedNameHelper.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/FunctionType.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/FunctionType.java index 3746b0848..5175b0c2b 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/FunctionType.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/FunctionType.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/Member.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/Member.java index 05ee7a166..ad0053195 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/Member.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/Member.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/ModuleType.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/ModuleType.java index d96973f35..2112dbc7b 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/ModuleType.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/ModuleType.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/ObjectType.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/ObjectType.java index 34b838dd1..b9df28fcd 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/ObjectType.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/ObjectType.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/ParameterV2.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/ParameterV2.java index 9efdf6799..96637f61a 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/ParameterV2.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/ParameterV2.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/PythonType.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/PythonType.java index 53b949a0b..47b85deee 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/PythonType.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/PythonType.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/SelfType.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/SelfType.java index 8f65a6bb2..5ceb568b9 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/SelfType.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/SelfType.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/TypeOrigin.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/TypeOrigin.java index 12a5686f9..a0a5f0e73 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/TypeOrigin.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/TypeOrigin.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/TypeSource.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/TypeSource.java index 6b79fd784..d33d37d51 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/TypeSource.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/TypeSource.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/TypeWrapper.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/TypeWrapper.java index 4031470f8..533741728 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/TypeWrapper.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/TypeWrapper.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/UnionType.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/UnionType.java index f82130f11..297d51b18 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/UnionType.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/UnionType.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/UnknownType.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/UnknownType.java index 8261c6649..7f8dae35b 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/UnknownType.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/UnknownType.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -14,25 +14,6 @@ * You should have received a copy of the Sonar Source-Available License * along with this program; if not, see https://sonarsource.com/license/ssal/ */ -/* - * SonarQube Python Plugin - * Copyright (C) 2011-2024 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ package org.sonar.plugins.python.api.types.v2; import java.util.Optional; diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/matchers/TypeMatcher.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/matchers/TypeMatcher.java index a99e1bfe2..67ecdd812 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/matchers/TypeMatcher.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/matchers/TypeMatcher.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/matchers/TypeMatcherUtils.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/matchers/TypeMatcherUtils.java index c4c9e70d2..e138afe2e 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/matchers/TypeMatcherUtils.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/matchers/TypeMatcherUtils.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/matchers/TypeMatchers.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/matchers/TypeMatchers.java index f48ac7ba8..77b2705e9 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/matchers/TypeMatchers.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/matchers/TypeMatchers.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/matchers/package-info.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/matchers/package-info.java index 92be06f29..93f6e5a63 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/matchers/package-info.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/matchers/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/package-info.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/package-info.java index 42f5967b7..2938e95e8 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/package-info.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/package-info.java b/python-frontend/src/main/java/org/sonar/plugins/python/package-info.java index 7bd4910cb..e0e0e606d 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/package-info.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/DocstringExtractor.java b/python-frontend/src/main/java/org/sonar/python/DocstringExtractor.java index 3bc220fb5..709ec8edc 100644 --- a/python-frontend/src/main/java/org/sonar/python/DocstringExtractor.java +++ b/python-frontend/src/main/java/org/sonar/python/DocstringExtractor.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/EscapeCharPositionInfo.java b/python-frontend/src/main/java/org/sonar/python/EscapeCharPositionInfo.java index 2b47ca65c..c3a5b7d28 100644 --- a/python-frontend/src/main/java/org/sonar/python/EscapeCharPositionInfo.java +++ b/python-frontend/src/main/java/org/sonar/python/EscapeCharPositionInfo.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/IPythonLocation.java b/python-frontend/src/main/java/org/sonar/python/IPythonLocation.java index ed2d5a519..fec2ae2a7 100644 --- a/python-frontend/src/main/java/org/sonar/python/IPythonLocation.java +++ b/python-frontend/src/main/java/org/sonar/python/IPythonLocation.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/PythonConfiguration.java b/python-frontend/src/main/java/org/sonar/python/PythonConfiguration.java index 38c05001f..de07e4089 100644 --- a/python-frontend/src/main/java/org/sonar/python/PythonConfiguration.java +++ b/python-frontend/src/main/java/org/sonar/python/PythonConfiguration.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/SubscriptionVisitor.java b/python-frontend/src/main/java/org/sonar/python/SubscriptionVisitor.java index d18151240..df4b66dd6 100644 --- a/python-frontend/src/main/java/org/sonar/python/SubscriptionVisitor.java +++ b/python-frontend/src/main/java/org/sonar/python/SubscriptionVisitor.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/TestPythonVisitorRunner.java b/python-frontend/src/main/java/org/sonar/python/TestPythonVisitorRunner.java index 7e623cdbc..24f38ceba 100644 --- a/python-frontend/src/main/java/org/sonar/python/TestPythonVisitorRunner.java +++ b/python-frontend/src/main/java/org/sonar/python/TestPythonVisitorRunner.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/api/IPythonGrammar.java b/python-frontend/src/main/java/org/sonar/python/api/IPythonGrammar.java index 3b93c5a35..a4b3c0cc5 100644 --- a/python-frontend/src/main/java/org/sonar/python/api/IPythonGrammar.java +++ b/python-frontend/src/main/java/org/sonar/python/api/IPythonGrammar.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/api/IPythonGrammarBuilder.java b/python-frontend/src/main/java/org/sonar/python/api/IPythonGrammarBuilder.java index 5b07095b0..a904be8e2 100644 --- a/python-frontend/src/main/java/org/sonar/python/api/IPythonGrammarBuilder.java +++ b/python-frontend/src/main/java/org/sonar/python/api/IPythonGrammarBuilder.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/api/PythonGrammar.java b/python-frontend/src/main/java/org/sonar/python/api/PythonGrammar.java index 0c497e866..eb1651e65 100644 --- a/python-frontend/src/main/java/org/sonar/python/api/PythonGrammar.java +++ b/python-frontend/src/main/java/org/sonar/python/api/PythonGrammar.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/api/PythonGrammarBuilder.java b/python-frontend/src/main/java/org/sonar/python/api/PythonGrammarBuilder.java index 99551925d..602037fa2 100644 --- a/python-frontend/src/main/java/org/sonar/python/api/PythonGrammarBuilder.java +++ b/python-frontend/src/main/java/org/sonar/python/api/PythonGrammarBuilder.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/api/PythonKeyword.java b/python-frontend/src/main/java/org/sonar/python/api/PythonKeyword.java index 2653527a9..29d2856c7 100644 --- a/python-frontend/src/main/java/org/sonar/python/api/PythonKeyword.java +++ b/python-frontend/src/main/java/org/sonar/python/api/PythonKeyword.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/api/PythonPunctuator.java b/python-frontend/src/main/java/org/sonar/python/api/PythonPunctuator.java index d6b20dabf..67ba2941e 100644 --- a/python-frontend/src/main/java/org/sonar/python/api/PythonPunctuator.java +++ b/python-frontend/src/main/java/org/sonar/python/api/PythonPunctuator.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/api/PythonTokenType.java b/python-frontend/src/main/java/org/sonar/python/api/PythonTokenType.java index 394b8de46..9b7b5c1c4 100644 --- a/python-frontend/src/main/java/org/sonar/python/api/PythonTokenType.java +++ b/python-frontend/src/main/java/org/sonar/python/api/PythonTokenType.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/api/package-info.java b/python-frontend/src/main/java/org/sonar/python/api/package-info.java index 494861dba..4821fc77a 100644 --- a/python-frontend/src/main/java/org/sonar/python/api/package-info.java +++ b/python-frontend/src/main/java/org/sonar/python/api/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/caching/CacheContextImpl.java b/python-frontend/src/main/java/org/sonar/python/caching/CacheContextImpl.java index dbe2b288b..17c9f1f6b 100644 --- a/python-frontend/src/main/java/org/sonar/python/caching/CacheContextImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/caching/CacheContextImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/caching/CpdSerializer.java b/python-frontend/src/main/java/org/sonar/python/caching/CpdSerializer.java index 5bd113022..5f778fae1 100644 --- a/python-frontend/src/main/java/org/sonar/python/caching/CpdSerializer.java +++ b/python-frontend/src/main/java/org/sonar/python/caching/CpdSerializer.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/caching/DummyCache.java b/python-frontend/src/main/java/org/sonar/python/caching/DummyCache.java index 9edc58050..694a1e7cb 100644 --- a/python-frontend/src/main/java/org/sonar/python/caching/DummyCache.java +++ b/python-frontend/src/main/java/org/sonar/python/caching/DummyCache.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/caching/PythonReadCacheImpl.java b/python-frontend/src/main/java/org/sonar/python/caching/PythonReadCacheImpl.java index 5b9056078..bf4a8113f 100644 --- a/python-frontend/src/main/java/org/sonar/python/caching/PythonReadCacheImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/caching/PythonReadCacheImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/caching/PythonWriteCacheImpl.java b/python-frontend/src/main/java/org/sonar/python/caching/PythonWriteCacheImpl.java index 227644a3f..2ead1f4e5 100644 --- a/python-frontend/src/main/java/org/sonar/python/caching/PythonWriteCacheImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/caching/PythonWriteCacheImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/caching/StringTable.java b/python-frontend/src/main/java/org/sonar/python/caching/StringTable.java index 6167ed4a1..f2738cc04 100644 --- a/python-frontend/src/main/java/org/sonar/python/caching/StringTable.java +++ b/python-frontend/src/main/java/org/sonar/python/caching/StringTable.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/caching/VarLengthInputStream.java b/python-frontend/src/main/java/org/sonar/python/caching/VarLengthInputStream.java index 34ca97701..890c99ff0 100644 --- a/python-frontend/src/main/java/org/sonar/python/caching/VarLengthInputStream.java +++ b/python-frontend/src/main/java/org/sonar/python/caching/VarLengthInputStream.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/caching/VarLengthOutputStream.java b/python-frontend/src/main/java/org/sonar/python/caching/VarLengthOutputStream.java index 603470025..555dda6af 100644 --- a/python-frontend/src/main/java/org/sonar/python/caching/VarLengthOutputStream.java +++ b/python-frontend/src/main/java/org/sonar/python/caching/VarLengthOutputStream.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/caching/package-info.java b/python-frontend/src/main/java/org/sonar/python/caching/package-info.java index 13ebab110..e8b6dde3d 100644 --- a/python-frontend/src/main/java/org/sonar/python/caching/package-info.java +++ b/python-frontend/src/main/java/org/sonar/python/caching/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/cfg/CfgUtils.java b/python-frontend/src/main/java/org/sonar/python/cfg/CfgUtils.java index ce704de42..e1d87acc3 100644 --- a/python-frontend/src/main/java/org/sonar/python/cfg/CfgUtils.java +++ b/python-frontend/src/main/java/org/sonar/python/cfg/CfgUtils.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/cfg/ControlFlowGraphBuilder.java b/python-frontend/src/main/java/org/sonar/python/cfg/ControlFlowGraphBuilder.java index ffde10223..f8048f853 100644 --- a/python-frontend/src/main/java/org/sonar/python/cfg/ControlFlowGraphBuilder.java +++ b/python-frontend/src/main/java/org/sonar/python/cfg/ControlFlowGraphBuilder.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/cfg/PythonCfgBlock.java b/python-frontend/src/main/java/org/sonar/python/cfg/PythonCfgBlock.java index d494e937b..08e4bd8a9 100644 --- a/python-frontend/src/main/java/org/sonar/python/cfg/PythonCfgBlock.java +++ b/python-frontend/src/main/java/org/sonar/python/cfg/PythonCfgBlock.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/cfg/PythonCfgBranchingBlock.java b/python-frontend/src/main/java/org/sonar/python/cfg/PythonCfgBranchingBlock.java index f3db34df6..4877c050d 100644 --- a/python-frontend/src/main/java/org/sonar/python/cfg/PythonCfgBranchingBlock.java +++ b/python-frontend/src/main/java/org/sonar/python/cfg/PythonCfgBranchingBlock.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/cfg/PythonCfgEndBlock.java b/python-frontend/src/main/java/org/sonar/python/cfg/PythonCfgEndBlock.java index 826829a60..29a7aa283 100644 --- a/python-frontend/src/main/java/org/sonar/python/cfg/PythonCfgEndBlock.java +++ b/python-frontend/src/main/java/org/sonar/python/cfg/PythonCfgEndBlock.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/cfg/PythonCfgSimpleBlock.java b/python-frontend/src/main/java/org/sonar/python/cfg/PythonCfgSimpleBlock.java index e99ef74df..34b931a81 100644 --- a/python-frontend/src/main/java/org/sonar/python/cfg/PythonCfgSimpleBlock.java +++ b/python-frontend/src/main/java/org/sonar/python/cfg/PythonCfgSimpleBlock.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/cfg/fixpoint/CfgBlockState.java b/python-frontend/src/main/java/org/sonar/python/cfg/fixpoint/CfgBlockState.java index c4ecbb084..70f22347a 100644 --- a/python-frontend/src/main/java/org/sonar/python/cfg/fixpoint/CfgBlockState.java +++ b/python-frontend/src/main/java/org/sonar/python/cfg/fixpoint/CfgBlockState.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/cfg/fixpoint/DefinedVariablesAnalysis.java b/python-frontend/src/main/java/org/sonar/python/cfg/fixpoint/DefinedVariablesAnalysis.java index ea5aa645f..56708a072 100644 --- a/python-frontend/src/main/java/org/sonar/python/cfg/fixpoint/DefinedVariablesAnalysis.java +++ b/python-frontend/src/main/java/org/sonar/python/cfg/fixpoint/DefinedVariablesAnalysis.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/cfg/fixpoint/ForwardAnalysis.java b/python-frontend/src/main/java/org/sonar/python/cfg/fixpoint/ForwardAnalysis.java index 77421ff6b..d36351f20 100644 --- a/python-frontend/src/main/java/org/sonar/python/cfg/fixpoint/ForwardAnalysis.java +++ b/python-frontend/src/main/java/org/sonar/python/cfg/fixpoint/ForwardAnalysis.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/cfg/fixpoint/LiveVariablesAnalysis.java b/python-frontend/src/main/java/org/sonar/python/cfg/fixpoint/LiveVariablesAnalysis.java index 5ffa04392..8f5e0bbe2 100644 --- a/python-frontend/src/main/java/org/sonar/python/cfg/fixpoint/LiveVariablesAnalysis.java +++ b/python-frontend/src/main/java/org/sonar/python/cfg/fixpoint/LiveVariablesAnalysis.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/cfg/fixpoint/ProgramState.java b/python-frontend/src/main/java/org/sonar/python/cfg/fixpoint/ProgramState.java index 8273bfd64..6870454ab 100644 --- a/python-frontend/src/main/java/org/sonar/python/cfg/fixpoint/ProgramState.java +++ b/python-frontend/src/main/java/org/sonar/python/cfg/fixpoint/ProgramState.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/cfg/fixpoint/ReachingDefinitionsAnalysis.java b/python-frontend/src/main/java/org/sonar/python/cfg/fixpoint/ReachingDefinitionsAnalysis.java index 80f13e94d..8841f4e3d 100644 --- a/python-frontend/src/main/java/org/sonar/python/cfg/fixpoint/ReachingDefinitionsAnalysis.java +++ b/python-frontend/src/main/java/org/sonar/python/cfg/fixpoint/ReachingDefinitionsAnalysis.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/cfg/fixpoint/ReadWriteVisitor.java b/python-frontend/src/main/java/org/sonar/python/cfg/fixpoint/ReadWriteVisitor.java index fb1cafc95..47135b0ed 100644 --- a/python-frontend/src/main/java/org/sonar/python/cfg/fixpoint/ReadWriteVisitor.java +++ b/python-frontend/src/main/java/org/sonar/python/cfg/fixpoint/ReadWriteVisitor.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/cfg/fixpoint/package-info.java b/python-frontend/src/main/java/org/sonar/python/cfg/fixpoint/package-info.java index e3ee6cbf5..37605d20d 100644 --- a/python-frontend/src/main/java/org/sonar/python/cfg/fixpoint/package-info.java +++ b/python-frontend/src/main/java/org/sonar/python/cfg/fixpoint/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/cfg/package-info.java b/python-frontend/src/main/java/org/sonar/python/cfg/package-info.java index 846c63e8c..8b5f7e41b 100644 --- a/python-frontend/src/main/java/org/sonar/python/cfg/package-info.java +++ b/python-frontend/src/main/java/org/sonar/python/cfg/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/index/AliasDescriptor.java b/python-frontend/src/main/java/org/sonar/python/index/AliasDescriptor.java index 4d0c2d0d0..809a3cafb 100644 --- a/python-frontend/src/main/java/org/sonar/python/index/AliasDescriptor.java +++ b/python-frontend/src/main/java/org/sonar/python/index/AliasDescriptor.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/index/AmbiguousDescriptor.java b/python-frontend/src/main/java/org/sonar/python/index/AmbiguousDescriptor.java index a0fc933d9..e60553045 100644 --- a/python-frontend/src/main/java/org/sonar/python/index/AmbiguousDescriptor.java +++ b/python-frontend/src/main/java/org/sonar/python/index/AmbiguousDescriptor.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/index/ClassDescriptor.java b/python-frontend/src/main/java/org/sonar/python/index/ClassDescriptor.java index 7e761801f..ba9d467a8 100644 --- a/python-frontend/src/main/java/org/sonar/python/index/ClassDescriptor.java +++ b/python-frontend/src/main/java/org/sonar/python/index/ClassDescriptor.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/index/Descriptor.java b/python-frontend/src/main/java/org/sonar/python/index/Descriptor.java index 13b00a80f..dd47926aa 100644 --- a/python-frontend/src/main/java/org/sonar/python/index/Descriptor.java +++ b/python-frontend/src/main/java/org/sonar/python/index/Descriptor.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/index/DescriptorUtils.java b/python-frontend/src/main/java/org/sonar/python/index/DescriptorUtils.java index 970fcca53..c852d9609 100644 --- a/python-frontend/src/main/java/org/sonar/python/index/DescriptorUtils.java +++ b/python-frontend/src/main/java/org/sonar/python/index/DescriptorUtils.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/index/DescriptorsToProtobuf.java b/python-frontend/src/main/java/org/sonar/python/index/DescriptorsToProtobuf.java index c63a505c2..81781e885 100644 --- a/python-frontend/src/main/java/org/sonar/python/index/DescriptorsToProtobuf.java +++ b/python-frontend/src/main/java/org/sonar/python/index/DescriptorsToProtobuf.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/index/FunctionDescriptor.java b/python-frontend/src/main/java/org/sonar/python/index/FunctionDescriptor.java index e55692d69..f2b85f949 100644 --- a/python-frontend/src/main/java/org/sonar/python/index/FunctionDescriptor.java +++ b/python-frontend/src/main/java/org/sonar/python/index/FunctionDescriptor.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/index/ModuleDescriptor.java b/python-frontend/src/main/java/org/sonar/python/index/ModuleDescriptor.java index b6db93206..a8e4a669d 100644 --- a/python-frontend/src/main/java/org/sonar/python/index/ModuleDescriptor.java +++ b/python-frontend/src/main/java/org/sonar/python/index/ModuleDescriptor.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/index/TypeAnnotationDescriptor.java b/python-frontend/src/main/java/org/sonar/python/index/TypeAnnotationDescriptor.java index 4249cb5ae..d08f64f32 100644 --- a/python-frontend/src/main/java/org/sonar/python/index/TypeAnnotationDescriptor.java +++ b/python-frontend/src/main/java/org/sonar/python/index/TypeAnnotationDescriptor.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/index/VariableDescriptor.java b/python-frontend/src/main/java/org/sonar/python/index/VariableDescriptor.java index 9784bc079..ae385f7e2 100644 --- a/python-frontend/src/main/java/org/sonar/python/index/VariableDescriptor.java +++ b/python-frontend/src/main/java/org/sonar/python/index/VariableDescriptor.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/index/package-info.java b/python-frontend/src/main/java/org/sonar/python/index/package-info.java index 2d1cd0ecc..f3c818c43 100644 --- a/python-frontend/src/main/java/org/sonar/python/index/package-info.java +++ b/python-frontend/src/main/java/org/sonar/python/index/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/lexer/FStringAndTStringChannel.java b/python-frontend/src/main/java/org/sonar/python/lexer/FStringAndTStringChannel.java index 5c7e46855..c2a055776 100644 --- a/python-frontend/src/main/java/org/sonar/python/lexer/FStringAndTStringChannel.java +++ b/python-frontend/src/main/java/org/sonar/python/lexer/FStringAndTStringChannel.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/lexer/FStringState.java b/python-frontend/src/main/java/org/sonar/python/lexer/FStringState.java index 5f9faed3e..5b03d6ef8 100644 --- a/python-frontend/src/main/java/org/sonar/python/lexer/FStringState.java +++ b/python-frontend/src/main/java/org/sonar/python/lexer/FStringState.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/lexer/IPynbCellDelimiterChannel.java b/python-frontend/src/main/java/org/sonar/python/lexer/IPynbCellDelimiterChannel.java index dd2cdc26b..3889817ce 100644 --- a/python-frontend/src/main/java/org/sonar/python/lexer/IPynbCellDelimiterChannel.java +++ b/python-frontend/src/main/java/org/sonar/python/lexer/IPynbCellDelimiterChannel.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/lexer/IndentationChannel.java b/python-frontend/src/main/java/org/sonar/python/lexer/IndentationChannel.java index 2417c0600..5af7ff52f 100644 --- a/python-frontend/src/main/java/org/sonar/python/lexer/IndentationChannel.java +++ b/python-frontend/src/main/java/org/sonar/python/lexer/IndentationChannel.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/lexer/LexerState.java b/python-frontend/src/main/java/org/sonar/python/lexer/LexerState.java index b66a52ad8..4b4bd8d3c 100644 --- a/python-frontend/src/main/java/org/sonar/python/lexer/LexerState.java +++ b/python-frontend/src/main/java/org/sonar/python/lexer/LexerState.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/lexer/NewLineChannel.java b/python-frontend/src/main/java/org/sonar/python/lexer/NewLineChannel.java index 3757bdeee..c8401bf60 100644 --- a/python-frontend/src/main/java/org/sonar/python/lexer/NewLineChannel.java +++ b/python-frontend/src/main/java/org/sonar/python/lexer/NewLineChannel.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/lexer/PythonLexer.java b/python-frontend/src/main/java/org/sonar/python/lexer/PythonLexer.java index eb0317634..6ee92c296 100644 --- a/python-frontend/src/main/java/org/sonar/python/lexer/PythonLexer.java +++ b/python-frontend/src/main/java/org/sonar/python/lexer/PythonLexer.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/lexer/StringLiteralsChannel.java b/python-frontend/src/main/java/org/sonar/python/lexer/StringLiteralsChannel.java index 7e81dea0b..ea4ba78b4 100644 --- a/python-frontend/src/main/java/org/sonar/python/lexer/StringLiteralsChannel.java +++ b/python-frontend/src/main/java/org/sonar/python/lexer/StringLiteralsChannel.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/lexer/package-info.java b/python-frontend/src/main/java/org/sonar/python/lexer/package-info.java index be010b211..1f7b8f18f 100644 --- a/python-frontend/src/main/java/org/sonar/python/lexer/package-info.java +++ b/python-frontend/src/main/java/org/sonar/python/lexer/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/metrics/CognitiveComplexityVisitor.java b/python-frontend/src/main/java/org/sonar/python/metrics/CognitiveComplexityVisitor.java index 6141f5c58..33778aee9 100644 --- a/python-frontend/src/main/java/org/sonar/python/metrics/CognitiveComplexityVisitor.java +++ b/python-frontend/src/main/java/org/sonar/python/metrics/CognitiveComplexityVisitor.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/metrics/ComplexityVisitor.java b/python-frontend/src/main/java/org/sonar/python/metrics/ComplexityVisitor.java index 3158852e0..2d4ace914 100644 --- a/python-frontend/src/main/java/org/sonar/python/metrics/ComplexityVisitor.java +++ b/python-frontend/src/main/java/org/sonar/python/metrics/ComplexityVisitor.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/metrics/FileLinesVisitor.java b/python-frontend/src/main/java/org/sonar/python/metrics/FileLinesVisitor.java index 48a287e88..9e1672a94 100644 --- a/python-frontend/src/main/java/org/sonar/python/metrics/FileLinesVisitor.java +++ b/python-frontend/src/main/java/org/sonar/python/metrics/FileLinesVisitor.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/metrics/FileMetrics.java b/python-frontend/src/main/java/org/sonar/python/metrics/FileMetrics.java index f41d18f33..06a810989 100644 --- a/python-frontend/src/main/java/org/sonar/python/metrics/FileMetrics.java +++ b/python-frontend/src/main/java/org/sonar/python/metrics/FileMetrics.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/metrics/package-info.java b/python-frontend/src/main/java/org/sonar/python/metrics/package-info.java index 0bade320b..e458533ef 100644 --- a/python-frontend/src/main/java/org/sonar/python/metrics/package-info.java +++ b/python-frontend/src/main/java/org/sonar/python/metrics/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/package-info.java b/python-frontend/src/main/java/org/sonar/python/package-info.java index dfd27de73..fbad990d6 100644 --- a/python-frontend/src/main/java/org/sonar/python/package-info.java +++ b/python-frontend/src/main/java/org/sonar/python/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/parser/PythonParser.java b/python-frontend/src/main/java/org/sonar/python/parser/PythonParser.java index 31d38d136..7642f3dd1 100644 --- a/python-frontend/src/main/java/org/sonar/python/parser/PythonParser.java +++ b/python-frontend/src/main/java/org/sonar/python/parser/PythonParser.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/parser/package-info.java b/python-frontend/src/main/java/org/sonar/python/parser/package-info.java index 0ffc99166..e5e44da6f 100644 --- a/python-frontend/src/main/java/org/sonar/python/parser/package-info.java +++ b/python-frontend/src/main/java/org/sonar/python/parser/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/project/config/ProjectConfigurationBuilder.java b/python-frontend/src/main/java/org/sonar/python/project/config/ProjectConfigurationBuilder.java index 5d784086e..c53863d1f 100644 --- a/python-frontend/src/main/java/org/sonar/python/project/config/ProjectConfigurationBuilder.java +++ b/python-frontend/src/main/java/org/sonar/python/project/config/ProjectConfigurationBuilder.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/project/config/SignatureBasedAwsLambdaHandlersCollector.java b/python-frontend/src/main/java/org/sonar/python/project/config/SignatureBasedAwsLambdaHandlersCollector.java index 04bf07b91..39251aa28 100644 --- a/python-frontend/src/main/java/org/sonar/python/project/config/SignatureBasedAwsLambdaHandlersCollector.java +++ b/python-frontend/src/main/java/org/sonar/python/project/config/SignatureBasedAwsLambdaHandlersCollector.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/project/config/package-info.java b/python-frontend/src/main/java/org/sonar/python/project/config/package-info.java index 73aba48a5..47ecce2ea 100644 --- a/python-frontend/src/main/java/org/sonar/python/project/config/package-info.java +++ b/python-frontend/src/main/java/org/sonar/python/project/config/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/quickfix/TextEditUtils.java b/python-frontend/src/main/java/org/sonar/python/quickfix/TextEditUtils.java index 788d52183..49988068f 100644 --- a/python-frontend/src/main/java/org/sonar/python/quickfix/TextEditUtils.java +++ b/python-frontend/src/main/java/org/sonar/python/quickfix/TextEditUtils.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/quickfix/package-info.java b/python-frontend/src/main/java/org/sonar/python/quickfix/package-info.java index 7df36a769..feb9323fe 100644 --- a/python-frontend/src/main/java/org/sonar/python/quickfix/package-info.java +++ b/python-frontend/src/main/java/org/sonar/python/quickfix/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/regex/PythonAnalyzerRegexSource.java b/python-frontend/src/main/java/org/sonar/python/regex/PythonAnalyzerRegexSource.java index cd84c20a0..714e6e798 100644 --- a/python-frontend/src/main/java/org/sonar/python/regex/PythonAnalyzerRegexSource.java +++ b/python-frontend/src/main/java/org/sonar/python/regex/PythonAnalyzerRegexSource.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/regex/PythonRegexIssueLocation.java b/python-frontend/src/main/java/org/sonar/python/regex/PythonRegexIssueLocation.java index 41ea190fc..7cf4aa4eb 100644 --- a/python-frontend/src/main/java/org/sonar/python/regex/PythonRegexIssueLocation.java +++ b/python-frontend/src/main/java/org/sonar/python/regex/PythonRegexIssueLocation.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/regex/PythonStringCharacterParser.java b/python-frontend/src/main/java/org/sonar/python/regex/PythonStringCharacterParser.java index c519bad5b..907d31a6a 100644 --- a/python-frontend/src/main/java/org/sonar/python/regex/PythonStringCharacterParser.java +++ b/python-frontend/src/main/java/org/sonar/python/regex/PythonStringCharacterParser.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/regex/RegexContext.java b/python-frontend/src/main/java/org/sonar/python/regex/RegexContext.java index 32df357df..aacd0836c 100644 --- a/python-frontend/src/main/java/org/sonar/python/regex/RegexContext.java +++ b/python-frontend/src/main/java/org/sonar/python/regex/RegexContext.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/regex/package-info.java b/python-frontend/src/main/java/org/sonar/python/regex/package-info.java index ad9113e41..0b2d1acdb 100644 --- a/python-frontend/src/main/java/org/sonar/python/regex/package-info.java +++ b/python-frontend/src/main/java/org/sonar/python/regex/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/AmbiguousSymbolImpl.java b/python-frontend/src/main/java/org/sonar/python/semantic/AmbiguousSymbolImpl.java index 622755bfa..2d31f5228 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/AmbiguousSymbolImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/AmbiguousSymbolImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/BuiltinSymbols.java b/python-frontend/src/main/java/org/sonar/python/semantic/BuiltinSymbols.java index ffedabf63..66cf2e194 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/BuiltinSymbols.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/BuiltinSymbols.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/ClassSymbolImpl.java b/python-frontend/src/main/java/org/sonar/python/semantic/ClassSymbolImpl.java index e8eb61c52..153a98acc 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/ClassSymbolImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/ClassSymbolImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/DependencyGraph.java b/python-frontend/src/main/java/org/sonar/python/semantic/DependencyGraph.java index e97e5095d..b55d31130 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/DependencyGraph.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/DependencyGraph.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/FunctionSymbolImpl.java b/python-frontend/src/main/java/org/sonar/python/semantic/FunctionSymbolImpl.java index 305605a3a..3264f4851 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/FunctionSymbolImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/FunctionSymbolImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/ProjectLevelSymbolTable.java b/python-frontend/src/main/java/org/sonar/python/semantic/ProjectLevelSymbolTable.java index 419a5689c..91114a8d4 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/ProjectLevelSymbolTable.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/ProjectLevelSymbolTable.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/Scope.java b/python-frontend/src/main/java/org/sonar/python/semantic/Scope.java index 1c380f18d..cd3f1b065 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/Scope.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/Scope.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/SelfSymbolImpl.java b/python-frontend/src/main/java/org/sonar/python/semantic/SelfSymbolImpl.java index 29d7de9ed..564ddaaf0 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/SelfSymbolImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/SelfSymbolImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/SymbolImpl.java b/python-frontend/src/main/java/org/sonar/python/semantic/SymbolImpl.java index b1805f713..1dfe36417 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/SymbolImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/SymbolImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/SymbolTableBuilder.java b/python-frontend/src/main/java/org/sonar/python/semantic/SymbolTableBuilder.java index 9147aefd6..f796faa39 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/SymbolTableBuilder.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/SymbolTableBuilder.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/SymbolUtils.java b/python-frontend/src/main/java/org/sonar/python/semantic/SymbolUtils.java index 9bc860cdd..e23fc3f4f 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/SymbolUtils.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/SymbolUtils.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/UsageImpl.java b/python-frontend/src/main/java/org/sonar/python/semantic/UsageImpl.java index fc8b896f9..4d6782ac3 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/UsageImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/UsageImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/package-info.java b/python-frontend/src/main/java/org/sonar/python/semantic/package-info.java index 8e395b959..ef465772c 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/package-info.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/ClassTypeBuilder.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/ClassTypeBuilder.java index db97a440d..5feae8943 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/ClassTypeBuilder.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/ClassTypeBuilder.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/FunctionTypeBuilder.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/FunctionTypeBuilder.java index 7fe711c52..b830d03aa 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/FunctionTypeBuilder.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/FunctionTypeBuilder.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/LazyTypesContext.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/LazyTypesContext.java index 17ec56d0a..327bcb1bd 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/LazyTypesContext.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/LazyTypesContext.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/ReadUsagesVisitor.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/ReadUsagesVisitor.java index ecf44f5ac..c921978d3 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/ReadUsagesVisitor.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/ReadUsagesVisitor.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/ScopeV2.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/ScopeV2.java index 71b6eadce..b3b3ab864 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/ScopeV2.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/ScopeV2.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/ScopeVisitor.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/ScopeVisitor.java index aef2f64ef..ceb043270 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/ScopeVisitor.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/ScopeVisitor.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/SymbolTable.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/SymbolTable.java index b478c758a..6b60ddb74 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/SymbolTable.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/SymbolTable.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/SymbolTableBuilderV2.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/SymbolTableBuilderV2.java index 36b58cdef..a84de48d8 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/SymbolTableBuilderV2.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/SymbolTableBuilderV2.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/SymbolV2Impl.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/SymbolV2Impl.java index 7c87305ae..80915757a 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/SymbolV2Impl.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/SymbolV2Impl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/SymbolV2Utils.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/SymbolV2Utils.java index 9ca42f34a..f1caa2447 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/SymbolV2Utils.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/SymbolV2Utils.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/SymbolsModuleTypeProvider.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/SymbolsModuleTypeProvider.java index ab22ae11a..5c8ab84c4 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/SymbolsModuleTypeProvider.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/SymbolsModuleTypeProvider.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/TypeBuilder.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/TypeBuilder.java index 2c237ad48..0225c85fd 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/TypeBuilder.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/TypeBuilder.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/TypeInferenceV2.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/TypeInferenceV2.java index b7977fd3e..6be9d4439 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/TypeInferenceV2.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/TypeInferenceV2.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/UsageV2Impl.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/UsageV2Impl.java index 27895ca72..f85333644 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/UsageV2Impl.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/UsageV2Impl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/WriteUsagesVisitor.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/WriteUsagesVisitor.java index ac8ec5d29..35b9d62f0 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/WriteUsagesVisitor.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/WriteUsagesVisitor.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/callgraph/CallGraph.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/callgraph/CallGraph.java index 28b984793..fb9731a6a 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/callgraph/CallGraph.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/callgraph/CallGraph.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/callgraph/CallGraphCollector.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/callgraph/CallGraphCollector.java index ac5220781..c74e7de12 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/callgraph/CallGraphCollector.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/callgraph/CallGraphCollector.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/callgraph/CallGraphIterable.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/callgraph/CallGraphIterable.java index 8b4fe4dc6..7c220f77e 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/callgraph/CallGraphIterable.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/callgraph/CallGraphIterable.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/callgraph/CallGraphNode.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/callgraph/CallGraphNode.java index 708862ac3..11e943001 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/callgraph/CallGraphNode.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/callgraph/CallGraphNode.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/callgraph/CallGraphWalker.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/callgraph/CallGraphWalker.java index 438d5f4eb..b2fd977c0 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/callgraph/CallGraphWalker.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/callgraph/CallGraphWalker.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/callgraph/package-info.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/callgraph/package-info.java index 0153721eb..198f74bcf 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/callgraph/package-info.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/callgraph/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/AliasDescriptorToPythonTypeConverter.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/AliasDescriptorToPythonTypeConverter.java index 8139ed430..07e85552a 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/AliasDescriptorToPythonTypeConverter.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/AliasDescriptorToPythonTypeConverter.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/AmbiguousDescriptorToPythonTypeConverter.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/AmbiguousDescriptorToPythonTypeConverter.java index 228c9a784..d15b34fb8 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/AmbiguousDescriptorToPythonTypeConverter.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/AmbiguousDescriptorToPythonTypeConverter.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/AnyDescriptorToPythonTypeConverter.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/AnyDescriptorToPythonTypeConverter.java index bd3662ea7..2c3515809 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/AnyDescriptorToPythonTypeConverter.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/AnyDescriptorToPythonTypeConverter.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/ClassDescriptorToPythonTypeConverter.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/ClassDescriptorToPythonTypeConverter.java index 765ee59e0..867719ca3 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/ClassDescriptorToPythonTypeConverter.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/ClassDescriptorToPythonTypeConverter.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/ConversionContext.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/ConversionContext.java index 49ce82e47..bb124ae8c 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/ConversionContext.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/ConversionContext.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/DescriptorToPythonTypeConverter.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/DescriptorToPythonTypeConverter.java index 822e027a8..f9ae44908 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/DescriptorToPythonTypeConverter.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/DescriptorToPythonTypeConverter.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/FunctionDescriptorToPythonTypeConverter.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/FunctionDescriptorToPythonTypeConverter.java index 1062aa44b..15cf8f0f1 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/FunctionDescriptorToPythonTypeConverter.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/FunctionDescriptorToPythonTypeConverter.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/ParameterConverter.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/ParameterConverter.java index a667691df..f99a60b95 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/ParameterConverter.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/ParameterConverter.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/PythonTypeToDescriptorConverter.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/PythonTypeToDescriptorConverter.java index 829ca7fa6..284281ce4 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/PythonTypeToDescriptorConverter.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/PythonTypeToDescriptorConverter.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/TypeAnnotationToPythonTypeConverter.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/TypeAnnotationToPythonTypeConverter.java index d5f8a0693..141cc5760 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/TypeAnnotationToPythonTypeConverter.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/TypeAnnotationToPythonTypeConverter.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/UnknownDescriptorToPythonTypeConverter.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/UnknownDescriptorToPythonTypeConverter.java index 9904edc8b..68d59bc8e 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/UnknownDescriptorToPythonTypeConverter.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/UnknownDescriptorToPythonTypeConverter.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/VariableDescriptorToPythonTypeConverter.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/VariableDescriptorToPythonTypeConverter.java index 62b57fd32..207571a6f 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/VariableDescriptorToPythonTypeConverter.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/VariableDescriptorToPythonTypeConverter.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/package-info.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/package-info.java index 76fca63b2..6a844783c 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/package-info.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/converter/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/dynamicstubs/DynamicStubsProvider.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/dynamicstubs/DynamicStubsProvider.java index 627cc84f0..5c8a233ae 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/dynamicstubs/DynamicStubsProvider.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/dynamicstubs/DynamicStubsProvider.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/dynamicstubs/package-info.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/dynamicstubs/package-info.java index 545f8f438..1dc6299d3 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/dynamicstubs/package-info.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/dynamicstubs/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/package-info.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/package-info.java index d6d1c3b64..9adf81b20 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/package-info.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/Assignment.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/Assignment.java index 7e4541b04..913da6f19 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/Assignment.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/Assignment.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/AstBasedTypeInference.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/AstBasedTypeInference.java index 877deffe2..6e8a9d94b 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/AstBasedTypeInference.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/AstBasedTypeInference.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/Definition.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/Definition.java index 0453fbec5..f5759aa7d 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/Definition.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/Definition.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/FlowSensitiveTypeInference.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/FlowSensitiveTypeInference.java index 4b77f9ce8..87cf172a4 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/FlowSensitiveTypeInference.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/FlowSensitiveTypeInference.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/IsInstanceVisitor.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/IsInstanceVisitor.java index 42255d404..ab3531bfc 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/IsInstanceVisitor.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/IsInstanceVisitor.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/LoopAssignment.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/LoopAssignment.java index 44e452a0d..70a38a393 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/LoopAssignment.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/LoopAssignment.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/ParameterDefinition.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/ParameterDefinition.java index 7ce8f4af9..8c963e000 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/ParameterDefinition.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/ParameterDefinition.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/ProgramStateTypeInferenceVisitor.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/ProgramStateTypeInferenceVisitor.java index 5b2ba290f..eb8944f33 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/ProgramStateTypeInferenceVisitor.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/ProgramStateTypeInferenceVisitor.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/Propagation.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/Propagation.java index e4d15bbe5..c3f0d48e5 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/Propagation.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/Propagation.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/PropagationVisitor.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/PropagationVisitor.java index dc7d30227..106db7038 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/PropagationVisitor.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/PropagationVisitor.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/TrivialTypeInferenceVisitor.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/TrivialTypeInferenceVisitor.java index 20c2ff6c0..6715c70f7 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/TrivialTypeInferenceVisitor.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/TrivialTypeInferenceVisitor.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/TrivialTypePropagationVisitor.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/TrivialTypePropagationVisitor.java index 035650cba..324966a05 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/TrivialTypePropagationVisitor.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/TrivialTypePropagationVisitor.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/TryStatementVisitor.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/TryStatementVisitor.java index 81daf468b..663e3510d 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/TryStatementVisitor.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/TryStatementVisitor.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/TypeDependenciesCalculator.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/TypeDependenciesCalculator.java index 893697a49..b196399bb 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/TypeDependenciesCalculator.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/TypeDependenciesCalculator.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/TypeInferenceMatcher.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/TypeInferenceMatcher.java index a69fcdb58..cceb29c64 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/TypeInferenceMatcher.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/TypeInferenceMatcher.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/TypeInferenceMatchers.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/TypeInferenceMatchers.java index 491492c69..6be35ba21 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/TypeInferenceMatchers.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/TypeInferenceMatchers.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/TypeInferenceProgramState.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/TypeInferenceProgramState.java index 236e8952f..2c001ad3a 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/TypeInferenceProgramState.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/TypeInferenceProgramState.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/package-info.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/package-info.java index 992484b55..89a95db62 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/package-info.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/typecalculator/AwaitedTypeCalculator.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/typecalculator/AwaitedTypeCalculator.java index 7e2b13ca0..619e8394d 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/typecalculator/AwaitedTypeCalculator.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/typecalculator/AwaitedTypeCalculator.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/typecalculator/CallReturnTypeCalculator.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/typecalculator/CallReturnTypeCalculator.java index 236167e7e..9580f9805 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/typecalculator/CallReturnTypeCalculator.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/typecalculator/CallReturnTypeCalculator.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/typecalculator/QualifiedExpressionCalculator.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/typecalculator/QualifiedExpressionCalculator.java index 618b0b214..8fa48b3a9 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/typecalculator/QualifiedExpressionCalculator.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/typecalculator/QualifiedExpressionCalculator.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/typecalculator/package-info.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/typecalculator/package-info.java index ac55aa41a..2c53c8553 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/typecalculator/package-info.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/typecalculator/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/ClassSymbolToDescriptorConverter.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/ClassSymbolToDescriptorConverter.java index eda0e7e04..9114b043f 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/ClassSymbolToDescriptorConverter.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/ClassSymbolToDescriptorConverter.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/FunctionSymbolToDescriptorConverter.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/FunctionSymbolToDescriptorConverter.java index 72c766268..0d7773848 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/FunctionSymbolToDescriptorConverter.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/FunctionSymbolToDescriptorConverter.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/ModuleSymbolToDescriptorConverter.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/ModuleSymbolToDescriptorConverter.java index 325458348..d7fc07b0a 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/ModuleSymbolToDescriptorConverter.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/ModuleSymbolToDescriptorConverter.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/OverloadedFunctionSymbolToDescriptorConverter.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/OverloadedFunctionSymbolToDescriptorConverter.java index 047ca155a..8fddbe4dd 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/OverloadedFunctionSymbolToDescriptorConverter.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/OverloadedFunctionSymbolToDescriptorConverter.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/ParameterSymbolToDescriptorConverter.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/ParameterSymbolToDescriptorConverter.java index 4fc90e9f8..3946d1b62 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/ParameterSymbolToDescriptorConverter.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/ParameterSymbolToDescriptorConverter.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/ProtoUtils.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/ProtoUtils.java index 5283bbaac..c63121a7d 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/ProtoUtils.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/ProtoUtils.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/TypeShedConstants.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/TypeShedConstants.java index fd05e71c2..560a445c9 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/TypeShedConstants.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/TypeShedConstants.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/TypeShedDescriptorsProvider.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/TypeShedDescriptorsProvider.java index a8bfd89c1..068e3c782 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/TypeShedDescriptorsProvider.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/TypeShedDescriptorsProvider.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/TypeShedUtils.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/TypeShedUtils.java index f567f385c..d2635e625 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/TypeShedUtils.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/TypeShedUtils.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/TypeSymbolToDescriptorConverter.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/TypeSymbolToDescriptorConverter.java index 2dd8495be..13902f830 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/TypeSymbolToDescriptorConverter.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/TypeSymbolToDescriptorConverter.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/VarSymbolToDescriptorConverter.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/VarSymbolToDescriptorConverter.java index 15e6d586e..10ef00c00 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/VarSymbolToDescriptorConverter.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/VarSymbolToDescriptorConverter.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/package-info.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/package-info.java index d74c18422..76991a050 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/package-info.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/typetable/BasicTypeTable.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/typetable/BasicTypeTable.java index fcde81489..e146152b7 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/typetable/BasicTypeTable.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/typetable/BasicTypeTable.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/typetable/CachedTypeTable.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/typetable/CachedTypeTable.java index 1c2e4ca3f..1b7a4bfc8 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/typetable/CachedTypeTable.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/typetable/CachedTypeTable.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/typetable/ProjectLevelTypeTable.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/typetable/ProjectLevelTypeTable.java index a99c0dedd..ac9a37e93 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/typetable/ProjectLevelTypeTable.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/typetable/ProjectLevelTypeTable.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/typetable/TypeTable.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/typetable/TypeTable.java index 025b8ff8c..45f9a860e 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/typetable/TypeTable.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/typetable/TypeTable.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/typetable/package-info.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/typetable/package-info.java index 0f7d1b9c9..94fabf403 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/typetable/package-info.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/typetable/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tests/UnittestUtils.java b/python-frontend/src/main/java/org/sonar/python/tests/UnittestUtils.java index 4a304c417..3d834b9b3 100644 --- a/python-frontend/src/main/java/org/sonar/python/tests/UnittestUtils.java +++ b/python-frontend/src/main/java/org/sonar/python/tests/UnittestUtils.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tests/package-info.java b/python-frontend/src/main/java/org/sonar/python/tests/package-info.java index 0ed651f50..ebc1f0105 100644 --- a/python-frontend/src/main/java/org/sonar/python/tests/package-info.java +++ b/python-frontend/src/main/java/org/sonar/python/tests/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/AliasedNameImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/AliasedNameImpl.java index ee3cecad3..ba3e02f84 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/AliasedNameImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/AliasedNameImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/AnnotatedAssignmentImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/AnnotatedAssignmentImpl.java index 2e828c48b..0f58436cc 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/AnnotatedAssignmentImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/AnnotatedAssignmentImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/ArgListImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/ArgListImpl.java index 5a89e6f17..2de62bf86 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/ArgListImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/ArgListImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/AsPatternImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/AsPatternImpl.java index dec95f3d3..e3cb08af4 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/AsPatternImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/AsPatternImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/AssertStatementImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/AssertStatementImpl.java index c926058e7..60bb28236 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/AssertStatementImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/AssertStatementImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/AssignmentExpressionImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/AssignmentExpressionImpl.java index 63c5251ca..6cbe16f24 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/AssignmentExpressionImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/AssignmentExpressionImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/AssignmentStatementImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/AssignmentStatementImpl.java index edec91daf..513c45ea1 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/AssignmentStatementImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/AssignmentStatementImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/AwaitExpressionImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/AwaitExpressionImpl.java index 9abbc31fd..ac9638811 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/AwaitExpressionImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/AwaitExpressionImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/BinaryExpressionImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/BinaryExpressionImpl.java index 35b5c1d5d..399a73cf9 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/BinaryExpressionImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/BinaryExpressionImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/BreakStatementImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/BreakStatementImpl.java index 60160224e..923bcce49 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/BreakStatementImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/BreakStatementImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/CallExpressionImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/CallExpressionImpl.java index a0e4cfe98..cd85dbc7c 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/CallExpressionImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/CallExpressionImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/CapturePatternImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/CapturePatternImpl.java index 527737d7b..1b2cde5ee 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/CapturePatternImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/CapturePatternImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/CaseBlockImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/CaseBlockImpl.java index 75c213e4f..1bced8caa 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/CaseBlockImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/CaseBlockImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/CellMagicStatementImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/CellMagicStatementImpl.java index 20b744a02..86c37ac9c 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/CellMagicStatementImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/CellMagicStatementImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/ClassDefImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/ClassDefImpl.java index aa5c293e8..58313e098 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/ClassDefImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/ClassDefImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/ClassPatternImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/ClassPatternImpl.java index f790c785c..f86d26f8c 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/ClassPatternImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/ClassPatternImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/CompoundAssignmentStatementImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/CompoundAssignmentStatementImpl.java index c37c09e1a..67b543e1b 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/CompoundAssignmentStatementImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/CompoundAssignmentStatementImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/ComprehensionExpressionImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/ComprehensionExpressionImpl.java index 3e1803909..e1ddd52fd 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/ComprehensionExpressionImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/ComprehensionExpressionImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/ComprehensionForImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/ComprehensionForImpl.java index 48c52f680..87643f06c 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/ComprehensionForImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/ComprehensionForImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/ComprehensionIfImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/ComprehensionIfImpl.java index 9067152e6..dd174b4b8 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/ComprehensionIfImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/ComprehensionIfImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/ConditionalExpressionImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/ConditionalExpressionImpl.java index 63e3be954..0322cda0e 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/ConditionalExpressionImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/ConditionalExpressionImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/ContinueStatementImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/ContinueStatementImpl.java index 2ac28215f..0fb8f5884 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/ContinueStatementImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/ContinueStatementImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/DecoratorImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/DecoratorImpl.java index 27702c5d9..5127c5933 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/DecoratorImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/DecoratorImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/DelStatementImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/DelStatementImpl.java index 0f2c0e582..ffcf9c4d8 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/DelStatementImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/DelStatementImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/DictCompExpressionImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/DictCompExpressionImpl.java index 11a62ef34..b67114832 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/DictCompExpressionImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/DictCompExpressionImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/DictOrSetLiteralImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/DictOrSetLiteralImpl.java index 5c139a9e2..09135ff69 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/DictOrSetLiteralImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/DictOrSetLiteralImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/DictionaryLiteralImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/DictionaryLiteralImpl.java index a05e1f886..9011e2408 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/DictionaryLiteralImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/DictionaryLiteralImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/DottedNameImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/DottedNameImpl.java index 86745515c..2a5266348 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/DottedNameImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/DottedNameImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/DoubleStarPatternImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/DoubleStarPatternImpl.java index 8fd806849..284f44654 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/DoubleStarPatternImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/DoubleStarPatternImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/DynamicObjectInfoStatementImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/DynamicObjectInfoStatementImpl.java index 09a5fecb8..6ca2e3f6b 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/DynamicObjectInfoStatementImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/DynamicObjectInfoStatementImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/EllipsisExpressionImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/EllipsisExpressionImpl.java index 90698123e..b819015bd 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/EllipsisExpressionImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/EllipsisExpressionImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/ElseClauseImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/ElseClauseImpl.java index f0a9d12b9..ff4f865bb 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/ElseClauseImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/ElseClauseImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/ExceptClauseImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/ExceptClauseImpl.java index 67276d945..690f82f77 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/ExceptClauseImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/ExceptClauseImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/ExceptGroupJumpInstructionsCheck.java b/python-frontend/src/main/java/org/sonar/python/tree/ExceptGroupJumpInstructionsCheck.java index feaa80034..2313260ee 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/ExceptGroupJumpInstructionsCheck.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/ExceptGroupJumpInstructionsCheck.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/ExecStatementImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/ExecStatementImpl.java index b47b164c4..f51763dad 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/ExecStatementImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/ExecStatementImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/ExpressionListImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/ExpressionListImpl.java index 041326320..e13d1c1df 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/ExpressionListImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/ExpressionListImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/ExpressionStatementImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/ExpressionStatementImpl.java index 6a9dd77af..da437744a 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/ExpressionStatementImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/ExpressionStatementImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/FileInputImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/FileInputImpl.java index 906ea2a4f..0d3da11ff 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/FileInputImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/FileInputImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/FinallyClauseImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/FinallyClauseImpl.java index 2019b63cd..933baead3 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/FinallyClauseImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/FinallyClauseImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/ForStatementImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/ForStatementImpl.java index ccd212c9f..754eb54ae 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/ForStatementImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/ForStatementImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/FormatSpecifierImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/FormatSpecifierImpl.java index 25774f710..2196712e5 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/FormatSpecifierImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/FormatSpecifierImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/FormattedExpressionImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/FormattedExpressionImpl.java index d49005c3e..ec3edf3cc 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/FormattedExpressionImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/FormattedExpressionImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/FunctionDefImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/FunctionDefImpl.java index 72713be88..5565f899f 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/FunctionDefImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/FunctionDefImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/GlobalStatementImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/GlobalStatementImpl.java index ab6160fc9..9361c2e61 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/GlobalStatementImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/GlobalStatementImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/GroupPatternImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/GroupPatternImpl.java index c2c752450..bfa6e023e 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/GroupPatternImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/GroupPatternImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/GuardImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/GuardImpl.java index 063147741..8dde1a6cc 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/GuardImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/GuardImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/IPythonTreeMaker.java b/python-frontend/src/main/java/org/sonar/python/tree/IPythonTreeMaker.java index 5fcf2ad40..a8f3bb986 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/IPythonTreeMaker.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/IPythonTreeMaker.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/IfStatementImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/IfStatementImpl.java index 221c309cb..a6794cafd 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/IfStatementImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/IfStatementImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/ImportFromImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/ImportFromImpl.java index 777242019..798abab55 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/ImportFromImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/ImportFromImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/ImportNameImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/ImportNameImpl.java index 0a82c80c9..75ff16e25 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/ImportNameImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/ImportNameImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/InExpressionImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/InExpressionImpl.java index b53c71e7f..675d28e2c 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/InExpressionImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/InExpressionImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/IsExpressionImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/IsExpressionImpl.java index a44f555c5..66fbe4f55 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/IsExpressionImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/IsExpressionImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/KeyValuePairImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/KeyValuePairImpl.java index aec71e5c0..ad0557d56 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/KeyValuePairImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/KeyValuePairImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/KeyValuePatternImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/KeyValuePatternImpl.java index c38a714d1..77e67a574 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/KeyValuePatternImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/KeyValuePatternImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/KeywordPatternImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/KeywordPatternImpl.java index 7b04c1d23..e70533df9 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/KeywordPatternImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/KeywordPatternImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/LambdaExpressionImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/LambdaExpressionImpl.java index cdb99d5bb..80ce3e3dd 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/LambdaExpressionImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/LambdaExpressionImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/LineMagicImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/LineMagicImpl.java index 218362d05..23014f894 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/LineMagicImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/LineMagicImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/ListLiteralImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/ListLiteralImpl.java index a37d21e1c..cd6a75701 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/ListLiteralImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/ListLiteralImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/LiteralPatternImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/LiteralPatternImpl.java index 8f6714ffd..ce12ad8e5 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/LiteralPatternImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/LiteralPatternImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/MappingPatternImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/MappingPatternImpl.java index 043cab7c1..feae226b1 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/MappingPatternImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/MappingPatternImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/MatchStatementImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/MatchStatementImpl.java index dff15d80c..20ee3fe99 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/MatchStatementImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/MatchStatementImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/NameImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/NameImpl.java index c71981997..25655a1cd 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/NameImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/NameImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/NoneExpressionImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/NoneExpressionImpl.java index 74d5a2923..e71f55f0a 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/NoneExpressionImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/NoneExpressionImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/NonlocalStatementImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/NonlocalStatementImpl.java index 4e6ec8a79..ace2db5ef 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/NonlocalStatementImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/NonlocalStatementImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/NumericLiteralImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/NumericLiteralImpl.java index cbc631bd3..8912c425a 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/NumericLiteralImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/NumericLiteralImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/OrPatternImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/OrPatternImpl.java index 1d5d86057..96ab2fcf4 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/OrPatternImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/OrPatternImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/ParameterImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/ParameterImpl.java index d61c98b75..ea3719755 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/ParameterImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/ParameterImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/ParameterListImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/ParameterListImpl.java index a3ea6d3fb..b5e7ed07d 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/ParameterListImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/ParameterListImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/ParenthesizedExpressionImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/ParenthesizedExpressionImpl.java index cdf40a92e..dcbf900e1 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/ParenthesizedExpressionImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/ParenthesizedExpressionImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/PassStatementImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/PassStatementImpl.java index 288dae205..5a1fbe1fa 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/PassStatementImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/PassStatementImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/PrintStatementImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/PrintStatementImpl.java index 7892fbc7f..f7f779edb 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/PrintStatementImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/PrintStatementImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/PyTree.java b/python-frontend/src/main/java/org/sonar/python/tree/PyTree.java index b3bc425ed..1072c51a4 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/PyTree.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/PyTree.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/PythonTreeMaker.java b/python-frontend/src/main/java/org/sonar/python/tree/PythonTreeMaker.java index b48b102be..50d6ddb1e 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/PythonTreeMaker.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/PythonTreeMaker.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/PythonTreeMakerUtils.java b/python-frontend/src/main/java/org/sonar/python/tree/PythonTreeMakerUtils.java index a70327291..d9db5d6e0 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/PythonTreeMakerUtils.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/PythonTreeMakerUtils.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/QualifiedExpressionImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/QualifiedExpressionImpl.java index f628416e5..01c01a034 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/QualifiedExpressionImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/QualifiedExpressionImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/RaiseStatementImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/RaiseStatementImpl.java index 9a22b1d53..5395c57a0 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/RaiseStatementImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/RaiseStatementImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/RegularArgumentImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/RegularArgumentImpl.java index 50bc594e2..63349c7b0 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/RegularArgumentImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/RegularArgumentImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/ReprExpressionImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/ReprExpressionImpl.java index 98df10ffb..33894b766 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/ReprExpressionImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/ReprExpressionImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/ReturnStatementImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/ReturnStatementImpl.java index 6fbf126df..d50676e4f 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/ReturnStatementImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/ReturnStatementImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/Separators.java b/python-frontend/src/main/java/org/sonar/python/tree/Separators.java index fa8205712..9ead255a0 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/Separators.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/Separators.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/SequencePatternImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/SequencePatternImpl.java index 20720a537..dd7fbc8c4 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/SequencePatternImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/SequencePatternImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/SetLiteralImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/SetLiteralImpl.java index f7d8c7ae9..e5962bef5 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/SetLiteralImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/SetLiteralImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/SimpleStatement.java b/python-frontend/src/main/java/org/sonar/python/tree/SimpleStatement.java index 90cb7bc7e..c70477eb9 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/SimpleStatement.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/SimpleStatement.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/SliceExpressionImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/SliceExpressionImpl.java index 15081b06d..274d55d0f 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/SliceExpressionImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/SliceExpressionImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/SliceItemImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/SliceItemImpl.java index 4f1d4574d..f1e9a0a4f 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/SliceItemImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/SliceItemImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/SliceListImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/SliceListImpl.java index 336b7a373..26973747b 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/SliceListImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/SliceListImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/StarPatternImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/StarPatternImpl.java index 68e78b436..fb22398d0 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/StarPatternImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/StarPatternImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/StatementListImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/StatementListImpl.java index 161ce9e07..b89fab3de 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/StatementListImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/StatementListImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/StatementWithSeparator.java b/python-frontend/src/main/java/org/sonar/python/tree/StatementWithSeparator.java index 7851c7c79..9fb5f5d7a 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/StatementWithSeparator.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/StatementWithSeparator.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/StringElementImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/StringElementImpl.java index bec4b59bd..0ecc4b1b7 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/StringElementImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/StringElementImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/StringLiteralImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/StringLiteralImpl.java index 94ff30c5e..5cfce22dd 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/StringLiteralImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/StringLiteralImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/SubscriptionExpressionImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/SubscriptionExpressionImpl.java index af75fbec5..ca21f58c8 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/SubscriptionExpressionImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/SubscriptionExpressionImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/TokenEnricher.java b/python-frontend/src/main/java/org/sonar/python/tree/TokenEnricher.java index bafab53d9..5ac3b993e 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/TokenEnricher.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/TokenEnricher.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/TokenImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/TokenImpl.java index 82494b609..c210f7948 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/TokenImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/TokenImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/TreeUtils.java b/python-frontend/src/main/java/org/sonar/python/tree/TreeUtils.java index 90a829d11..61f668b9d 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/TreeUtils.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/TreeUtils.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/TriviaImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/TriviaImpl.java index 1e96667b4..ae97cf86a 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/TriviaImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/TriviaImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/TryStatementImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/TryStatementImpl.java index 6d711541b..5a2027822 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/TryStatementImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/TryStatementImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/TupleImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/TupleImpl.java index c909eef14..7c6f68afd 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/TupleImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/TupleImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/TupleParameterImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/TupleParameterImpl.java index 28d1a8bc6..8b08b54f3 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/TupleParameterImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/TupleParameterImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/TypeAliasStatementImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/TypeAliasStatementImpl.java index 662d46de9..e7b933270 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/TypeAliasStatementImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/TypeAliasStatementImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/TypeAnnotationImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/TypeAnnotationImpl.java index 7dce566f6..c54958366 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/TypeAnnotationImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/TypeAnnotationImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/TypeParamImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/TypeParamImpl.java index 82cdbb46f..fc2a3c445 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/TypeParamImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/TypeParamImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/TypeParamsImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/TypeParamsImpl.java index b83937c39..b84ce36bf 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/TypeParamsImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/TypeParamsImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/UnaryExpressionImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/UnaryExpressionImpl.java index 22eb59fe0..0e786e61e 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/UnaryExpressionImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/UnaryExpressionImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/UnpackingExpressionImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/UnpackingExpressionImpl.java index 2535702a3..fa357d54d 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/UnpackingExpressionImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/UnpackingExpressionImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/ValuePatternImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/ValuePatternImpl.java index a59aba361..d974bf210 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/ValuePatternImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/ValuePatternImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/WhileStatementImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/WhileStatementImpl.java index 90360287d..1b53e0055 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/WhileStatementImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/WhileStatementImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/WildcardPatternImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/WildcardPatternImpl.java index 469e81508..23531e247 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/WildcardPatternImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/WildcardPatternImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/WithStatementImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/WithStatementImpl.java index 248870b7a..5ee095de9 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/WithStatementImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/WithStatementImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/YieldExpressionImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/YieldExpressionImpl.java index 8ee5038fb..d9c734e38 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/YieldExpressionImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/YieldExpressionImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/YieldStatementImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/YieldStatementImpl.java index 48a3d1571..7b9409ec1 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/YieldStatementImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/YieldStatementImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/tree/package-info.java b/python-frontend/src/main/java/org/sonar/python/tree/package-info.java index d0220493d..8281ea18b 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/package-info.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/AnyType.java b/python-frontend/src/main/java/org/sonar/python/types/AnyType.java index e017c9d62..7cbbd9642 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/AnyType.java +++ b/python-frontend/src/main/java/org/sonar/python/types/AnyType.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/DeclaredType.java b/python-frontend/src/main/java/org/sonar/python/types/DeclaredType.java index c2cdc66f2..4edb5a0bd 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/DeclaredType.java +++ b/python-frontend/src/main/java/org/sonar/python/types/DeclaredType.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/FlowSensitiveTypeInference.java b/python-frontend/src/main/java/org/sonar/python/types/FlowSensitiveTypeInference.java index 21fb7f160..2ba9d48d2 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/FlowSensitiveTypeInference.java +++ b/python-frontend/src/main/java/org/sonar/python/types/FlowSensitiveTypeInference.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/HasTypeDependencies.java b/python-frontend/src/main/java/org/sonar/python/types/HasTypeDependencies.java index d7782eaa8..72b4f9146 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/HasTypeDependencies.java +++ b/python-frontend/src/main/java/org/sonar/python/types/HasTypeDependencies.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/InferredTypes.java b/python-frontend/src/main/java/org/sonar/python/types/InferredTypes.java index 6380cba33..9c6752049 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/InferredTypes.java +++ b/python-frontend/src/main/java/org/sonar/python/types/InferredTypes.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/RuntimeType.java b/python-frontend/src/main/java/org/sonar/python/types/RuntimeType.java index 4df9c2afc..fea4273e1 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/RuntimeType.java +++ b/python-frontend/src/main/java/org/sonar/python/types/RuntimeType.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/TypeInference.java b/python-frontend/src/main/java/org/sonar/python/types/TypeInference.java index b14b9422e..1cd1180a6 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/TypeInference.java +++ b/python-frontend/src/main/java/org/sonar/python/types/TypeInference.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/TypeInferenceProgramState.java b/python-frontend/src/main/java/org/sonar/python/types/TypeInferenceProgramState.java index 1aaa7fccf..5d5accabd 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/TypeInferenceProgramState.java +++ b/python-frontend/src/main/java/org/sonar/python/types/TypeInferenceProgramState.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/TypeShed.java b/python-frontend/src/main/java/org/sonar/python/types/TypeShed.java index d87ae75fb..755a09681 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/TypeShed.java +++ b/python-frontend/src/main/java/org/sonar/python/types/TypeShed.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/UnionType.java b/python-frontend/src/main/java/org/sonar/python/types/UnionType.java index 727c4e0f0..6753442a1 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/UnionType.java +++ b/python-frontend/src/main/java/org/sonar/python/types/UnionType.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/UnknownClassType.java b/python-frontend/src/main/java/org/sonar/python/types/UnknownClassType.java index e99e3cfa2..d08175285 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/UnknownClassType.java +++ b/python-frontend/src/main/java/org/sonar/python/types/UnknownClassType.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/package-info.java b/python-frontend/src/main/java/org/sonar/python/types/package-info.java index 03e352c7c..ae8b327d9 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/package-info.java +++ b/python-frontend/src/main/java/org/sonar/python/types/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/v2/LazyType.java b/python-frontend/src/main/java/org/sonar/python/types/v2/LazyType.java index 3b7758b85..ebb5c0344 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/v2/LazyType.java +++ b/python-frontend/src/main/java/org/sonar/python/types/v2/LazyType.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/v2/LazyTypeWrapper.java b/python-frontend/src/main/java/org/sonar/python/types/v2/LazyTypeWrapper.java index 00cca1359..e14954d27 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/v2/LazyTypeWrapper.java +++ b/python-frontend/src/main/java/org/sonar/python/types/v2/LazyTypeWrapper.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/v2/LazyUnionType.java b/python-frontend/src/main/java/org/sonar/python/types/v2/LazyUnionType.java index 8d02a1d65..45efb7502 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/v2/LazyUnionType.java +++ b/python-frontend/src/main/java/org/sonar/python/types/v2/LazyUnionType.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/v2/ResolvableType.java b/python-frontend/src/main/java/org/sonar/python/types/v2/ResolvableType.java index 2c6561aeb..cb8349c7b 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/v2/ResolvableType.java +++ b/python-frontend/src/main/java/org/sonar/python/types/v2/ResolvableType.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/v2/SimpleTypeWrapper.java b/python-frontend/src/main/java/org/sonar/python/types/v2/SimpleTypeWrapper.java index ac661bfcd..123f562ce 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/v2/SimpleTypeWrapper.java +++ b/python-frontend/src/main/java/org/sonar/python/types/v2/SimpleTypeWrapper.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/v2/SpecialFormType.java b/python-frontend/src/main/java/org/sonar/python/types/v2/SpecialFormType.java index 431c68ba0..3f36cdc1f 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/v2/SpecialFormType.java +++ b/python-frontend/src/main/java/org/sonar/python/types/v2/SpecialFormType.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/v2/TypeCheckBuilder.java b/python-frontend/src/main/java/org/sonar/python/types/v2/TypeCheckBuilder.java index 09111d05a..e6f2a37a2 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/v2/TypeCheckBuilder.java +++ b/python-frontend/src/main/java/org/sonar/python/types/v2/TypeCheckBuilder.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/v2/TypeCheckMap.java b/python-frontend/src/main/java/org/sonar/python/types/v2/TypeCheckMap.java index dcdcb9590..6cd15003e 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/v2/TypeCheckMap.java +++ b/python-frontend/src/main/java/org/sonar/python/types/v2/TypeCheckMap.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/v2/TypeChecker.java b/python-frontend/src/main/java/org/sonar/python/types/v2/TypeChecker.java index 89f4bdc62..bfb1e4a87 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/v2/TypeChecker.java +++ b/python-frontend/src/main/java/org/sonar/python/types/v2/TypeChecker.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/v2/TypeUtils.java b/python-frontend/src/main/java/org/sonar/python/types/v2/TypeUtils.java index 77885311b..a2d8ddbbe 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/v2/TypeUtils.java +++ b/python-frontend/src/main/java/org/sonar/python/types/v2/TypeUtils.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/AllTypePredicate.java b/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/AllTypePredicate.java index 2f99cfb89..5734e4f29 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/AllTypePredicate.java +++ b/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/AllTypePredicate.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/AnyTypePredicate.java b/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/AnyTypePredicate.java index f83de6de8..9db028862 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/AnyTypePredicate.java +++ b/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/AnyTypePredicate.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/HasFQNPredicate.java b/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/HasFQNPredicate.java index 5e66b0029..37ff0d8f7 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/HasFQNPredicate.java +++ b/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/HasFQNPredicate.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/HasMemberPredicate.java b/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/HasMemberPredicate.java index 21517f4df..f8d019057 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/HasMemberPredicate.java +++ b/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/HasMemberPredicate.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/HasMemberSatisfyingPredicate.java b/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/HasMemberSatisfyingPredicate.java index ba995ad81..156155947 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/HasMemberSatisfyingPredicate.java +++ b/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/HasMemberSatisfyingPredicate.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/InternalTypeMatchers.java b/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/InternalTypeMatchers.java index c89bce4f7..64a20e16f 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/InternalTypeMatchers.java +++ b/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/InternalTypeMatchers.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/IsAnyTypeInUnionSatisfying.java b/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/IsAnyTypeInUnionSatisfying.java index c56a34d8f..acaccd821 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/IsAnyTypeInUnionSatisfying.java +++ b/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/IsAnyTypeInUnionSatisfying.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/IsFunctionOwnerSatisfyingPredicate.java b/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/IsFunctionOwnerSatisfyingPredicate.java index 765dae4df..09361eee3 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/IsFunctionOwnerSatisfyingPredicate.java +++ b/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/IsFunctionOwnerSatisfyingPredicate.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/IsObjectSatisfyingPredicate.java b/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/IsObjectSatisfyingPredicate.java index 0d25cf552..99c046cf9 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/IsObjectSatisfyingPredicate.java +++ b/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/IsObjectSatisfyingPredicate.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/IsSelfTypePredicate.java b/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/IsSelfTypePredicate.java index 6b19ac56e..06e66f4cb 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/IsSelfTypePredicate.java +++ b/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/IsSelfTypePredicate.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/IsTypeOrSuperTypeSatisfyingPredicate.java b/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/IsTypeOrSuperTypeSatisfyingPredicate.java index 0f5018619..83cf64272 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/IsTypeOrSuperTypeSatisfyingPredicate.java +++ b/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/IsTypeOrSuperTypeSatisfyingPredicate.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/IsTypePredicate.java b/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/IsTypePredicate.java index 91f6639c4..4c55ba0e4 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/IsTypePredicate.java +++ b/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/IsTypePredicate.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/TypeMatcherImpl.java b/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/TypeMatcherImpl.java index a42c2da75..92f316db3 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/TypeMatcherImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/TypeMatcherImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/TypePredicate.java b/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/TypePredicate.java index 719852249..edcdfdf72 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/TypePredicate.java +++ b/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/TypePredicate.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/TypePredicateContext.java b/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/TypePredicateContext.java index d5057008b..0d60d4203 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/TypePredicateContext.java +++ b/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/TypePredicateContext.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/TypePredicateContextImpl.java b/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/TypePredicateContextImpl.java index c82a4f511..6c9047f98 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/TypePredicateContextImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/TypePredicateContextImpl.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/TypePredicateUtils.java b/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/TypePredicateUtils.java index 0711fd946..dde26ffe5 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/TypePredicateUtils.java +++ b/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/TypePredicateUtils.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/TypeSourcePredicate.java b/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/TypeSourcePredicate.java index 2b8bf3eaf..c8010e0b9 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/TypeSourcePredicate.java +++ b/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/TypeSourcePredicate.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/package-info.java b/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/package-info.java index 80343ef25..de6fd181d 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/package-info.java +++ b/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/main/java/org/sonar/python/types/v2/package-info.java b/python-frontend/src/main/java/org/sonar/python/types/v2/package-info.java index a991c740f..30709e872 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/v2/package-info.java +++ b/python-frontend/src/main/java/org/sonar/python/types/v2/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/IpynbNotebookParserTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/IpynbNotebookParserTest.java index 4f359e8fe..937d9fd77 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/IpynbNotebookParserTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/IpynbNotebookParserTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/PythonInputFileImplTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/PythonInputFileImplTest.java index 1d5b9b914..cf3cf625b 100755 --- a/python-frontend/src/test/java/org/sonar/plugins/python/PythonInputFileImplTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/PythonInputFileImplTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/SonarQubePythonFileTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/SonarQubePythonFileTest.java index 750aa234e..a19f57a4b 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/SonarQubePythonFileTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/SonarQubePythonFileTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/ParserTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/ParserTest.java index f3cd57200..386caea11 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/ParserTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/ParserTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/PythonCustomRuleRepositoryWrapperTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/PythonCustomRuleRepositoryWrapperTest.java index ec6dac62f..a4872342f 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/PythonCustomRuleRepositoryWrapperTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/PythonCustomRuleRepositoryWrapperTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/PythonVersionUtilsTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/PythonVersionUtilsTest.java index 49bc32f28..e8f786c00 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/PythonVersionUtilsTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/PythonVersionUtilsTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/PythonVisitorContextTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/PythonVisitorContextTest.java index 3e58303f5..a22c8bea1 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/PythonVisitorContextTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/PythonVisitorContextTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/SonarLintCacheTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/SonarLintCacheTest.java index 1afe09420..2a515d8ad 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/SonarLintCacheTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/SonarLintCacheTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/SonarLintCacheWrapperTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/SonarLintCacheWrapperTest.java index ad99fbbca..53ab4b29b 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/SonarLintCacheWrapperTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/SonarLintCacheWrapperTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/cfg/CfgValidator.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/cfg/CfgValidator.java index 857e98340..9836827e6 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/cfg/CfgValidator.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/cfg/CfgValidator.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/cfg/ControlFlowGraphTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/cfg/ControlFlowGraphTest.java index 09475dcff..47eaa3045 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/cfg/ControlFlowGraphTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/cfg/ControlFlowGraphTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/cfg/ExpectedCfgStructure.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/cfg/ExpectedCfgStructure.java index 962466b48..b818c83f7 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/cfg/ExpectedCfgStructure.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/cfg/ExpectedCfgStructure.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/nosonar/NoSonarInfoParserTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/nosonar/NoSonarInfoParserTest.java index 561681555..afde41140 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/nosonar/NoSonarInfoParserTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/nosonar/NoSonarInfoParserTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/nosonar/NoSonarLineInfoTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/nosonar/NoSonarLineInfoTest.java index dd5dc8cf9..790c2d89c 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/nosonar/NoSonarLineInfoTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/nosonar/NoSonarLineInfoTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/quickfix/PythonQuickFixTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/quickfix/PythonQuickFixTest.java index 67972ef75..81fe71a35 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/quickfix/PythonQuickFixTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/quickfix/PythonQuickFixTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/quickfix/PythonTextEditTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/quickfix/PythonTextEditTest.java index f2a8cf535..9a13f11a3 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/quickfix/PythonTextEditTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/quickfix/PythonTextEditTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/tree/BaseTreeVisitorTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/tree/BaseTreeVisitorTest.java index b4742b109..d4d1951bf 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/tree/BaseTreeVisitorTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/tree/BaseTreeVisitorTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/ClassTypeTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/ClassTypeTest.java index f4b741164..d94d69243 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/ClassTypeTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/ClassTypeTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/FullyQualifiedNameHelperTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/FullyQualifiedNameHelperTest.java index 4b5e2ff32..9fcafb7b7 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/FullyQualifiedNameHelperTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/FullyQualifiedNameHelperTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/FunctionTypeTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/FunctionTypeTest.java index 72d1870b9..cbfe1f09f 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/FunctionTypeTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/FunctionTypeTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/ModuleTypeTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/ModuleTypeTest.java index ca1a4a1de..cdee4c7f0 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/ModuleTypeTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/ModuleTypeTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/ObjectTypeTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/ObjectTypeTest.java index a77eeeec5..d37ee8a75 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/ObjectTypeTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/ObjectTypeTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/SelfTypeTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/SelfTypeTest.java index 507b803d2..7f7564e5f 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/SelfTypeTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/SelfTypeTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/SimpleTypeWrapperTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/SimpleTypeWrapperTest.java index 8821d9b90..4a1b744b7 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/SimpleTypeWrapperTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/SimpleTypeWrapperTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/TriBoolTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/TriBoolTest.java index 8688bbca9..2bae05a55 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/TriBoolTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/TriBoolTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/UnionTypeTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/UnionTypeTest.java index 01355d8e9..23ee26b44 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/UnionTypeTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/UnionTypeTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/UnresolvedImportTypeTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/UnresolvedImportTypeTest.java index fe002bd48..38de4a1be 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/UnresolvedImportTypeTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/UnresolvedImportTypeTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/matchers/MatchersTestUtils.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/matchers/MatchersTestUtils.java index d7dca7d47..279cccdca 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/matchers/MatchersTestUtils.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/matchers/MatchersTestUtils.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/matchers/TypeMatcherImplTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/matchers/TypeMatcherImplTest.java index 438ebd786..c04c26e6a 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/matchers/TypeMatcherImplTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/matchers/TypeMatcherImplTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/matchers/TypeMatcherUtilsTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/matchers/TypeMatcherUtilsTest.java index f5ca3fbed..870d9de01 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/matchers/TypeMatcherUtilsTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/matchers/TypeMatcherUtilsTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/DocstringExtractorTest.java b/python-frontend/src/test/java/org/sonar/python/DocstringExtractorTest.java index 3e5723945..67aaa88b2 100644 --- a/python-frontend/src/test/java/org/sonar/python/DocstringExtractorTest.java +++ b/python-frontend/src/test/java/org/sonar/python/DocstringExtractorTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/FileLinesVisitorTest.java b/python-frontend/src/test/java/org/sonar/python/FileLinesVisitorTest.java index f0b1420e2..4987dea27 100644 --- a/python-frontend/src/test/java/org/sonar/python/FileLinesVisitorTest.java +++ b/python-frontend/src/test/java/org/sonar/python/FileLinesVisitorTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/IssueLocationTest.java b/python-frontend/src/test/java/org/sonar/python/IssueLocationTest.java index fe18f2dbb..d1f129ffc 100644 --- a/python-frontend/src/test/java/org/sonar/python/IssueLocationTest.java +++ b/python-frontend/src/test/java/org/sonar/python/IssueLocationTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/PythonCheckTest.java b/python-frontend/src/test/java/org/sonar/python/PythonCheckTest.java index 9350e14f1..bd80f71eb 100644 --- a/python-frontend/src/test/java/org/sonar/python/PythonCheckTest.java +++ b/python-frontend/src/test/java/org/sonar/python/PythonCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/PythonSubscriptionCheckTest.java b/python-frontend/src/test/java/org/sonar/python/PythonSubscriptionCheckTest.java index 048ed3883..59838a9e4 100644 --- a/python-frontend/src/test/java/org/sonar/python/PythonSubscriptionCheckTest.java +++ b/python-frontend/src/test/java/org/sonar/python/PythonSubscriptionCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/PythonTestUtils.java b/python-frontend/src/test/java/org/sonar/python/PythonTestUtils.java index 2aad1988a..fe5eb8046 100644 --- a/python-frontend/src/test/java/org/sonar/python/PythonTestUtils.java +++ b/python-frontend/src/test/java/org/sonar/python/PythonTestUtils.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/PythonVisitorCheckTest.java b/python-frontend/src/test/java/org/sonar/python/PythonVisitorCheckTest.java index 159fdb974..89c367f7b 100644 --- a/python-frontend/src/test/java/org/sonar/python/PythonVisitorCheckTest.java +++ b/python-frontend/src/test/java/org/sonar/python/PythonVisitorCheckTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/ReadWriteVisitorTest.java b/python-frontend/src/test/java/org/sonar/python/ReadWriteVisitorTest.java index 4c54d0f39..ec06db7d1 100644 --- a/python-frontend/src/test/java/org/sonar/python/ReadWriteVisitorTest.java +++ b/python-frontend/src/test/java/org/sonar/python/ReadWriteVisitorTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/SubscriptionVisitorTest.java b/python-frontend/src/test/java/org/sonar/python/SubscriptionVisitorTest.java index a10d26682..7a6fb8c48 100644 --- a/python-frontend/src/test/java/org/sonar/python/SubscriptionVisitorTest.java +++ b/python-frontend/src/test/java/org/sonar/python/SubscriptionVisitorTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/TestPythonVisitorRunnerTest.java b/python-frontend/src/test/java/org/sonar/python/TestPythonVisitorRunnerTest.java index 3a50647b7..6c0f115d6 100644 --- a/python-frontend/src/test/java/org/sonar/python/TestPythonVisitorRunnerTest.java +++ b/python-frontend/src/test/java/org/sonar/python/TestPythonVisitorRunnerTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/TokenLocationTest.java b/python-frontend/src/test/java/org/sonar/python/TokenLocationTest.java index 835746421..91a0c0320 100644 --- a/python-frontend/src/test/java/org/sonar/python/TokenLocationTest.java +++ b/python-frontend/src/test/java/org/sonar/python/TokenLocationTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/api/PythonKeywordTest.java b/python-frontend/src/test/java/org/sonar/python/api/PythonKeywordTest.java index 7abb7e13a..bcc29ae63 100644 --- a/python-frontend/src/test/java/org/sonar/python/api/PythonKeywordTest.java +++ b/python-frontend/src/test/java/org/sonar/python/api/PythonKeywordTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/api/PythonPunctuatorTest.java b/python-frontend/src/test/java/org/sonar/python/api/PythonPunctuatorTest.java index fddc43b4f..265771713 100644 --- a/python-frontend/src/test/java/org/sonar/python/api/PythonPunctuatorTest.java +++ b/python-frontend/src/test/java/org/sonar/python/api/PythonPunctuatorTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/api/PythonTokenTypeTest.java b/python-frontend/src/test/java/org/sonar/python/api/PythonTokenTypeTest.java index 8889c9122..812f98f83 100644 --- a/python-frontend/src/test/java/org/sonar/python/api/PythonTokenTypeTest.java +++ b/python-frontend/src/test/java/org/sonar/python/api/PythonTokenTypeTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/caching/CacheContextImplTest.java b/python-frontend/src/test/java/org/sonar/python/caching/CacheContextImplTest.java index 6426b2b0c..2ca32a775 100644 --- a/python-frontend/src/test/java/org/sonar/python/caching/CacheContextImplTest.java +++ b/python-frontend/src/test/java/org/sonar/python/caching/CacheContextImplTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/caching/CpdSerializerTest.java b/python-frontend/src/test/java/org/sonar/python/caching/CpdSerializerTest.java index 4613a22e7..07b74761b 100644 --- a/python-frontend/src/test/java/org/sonar/python/caching/CpdSerializerTest.java +++ b/python-frontend/src/test/java/org/sonar/python/caching/CpdSerializerTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/caching/DummyCacheTest.java b/python-frontend/src/test/java/org/sonar/python/caching/DummyCacheTest.java index a3721d4ab..2d3aed64f 100644 --- a/python-frontend/src/test/java/org/sonar/python/caching/DummyCacheTest.java +++ b/python-frontend/src/test/java/org/sonar/python/caching/DummyCacheTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/caching/PythonReadCacheImplTest.java b/python-frontend/src/test/java/org/sonar/python/caching/PythonReadCacheImplTest.java index 85c008894..d97243004 100644 --- a/python-frontend/src/test/java/org/sonar/python/caching/PythonReadCacheImplTest.java +++ b/python-frontend/src/test/java/org/sonar/python/caching/PythonReadCacheImplTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/caching/PythonWriteCacheImplTest.java b/python-frontend/src/test/java/org/sonar/python/caching/PythonWriteCacheImplTest.java index 7aec187b3..f7c555335 100644 --- a/python-frontend/src/test/java/org/sonar/python/caching/PythonWriteCacheImplTest.java +++ b/python-frontend/src/test/java/org/sonar/python/caching/PythonWriteCacheImplTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/cfg/CfgUtilsTest.java b/python-frontend/src/test/java/org/sonar/python/cfg/CfgUtilsTest.java index b0bcafa60..3af8fd413 100644 --- a/python-frontend/src/test/java/org/sonar/python/cfg/CfgUtilsTest.java +++ b/python-frontend/src/test/java/org/sonar/python/cfg/CfgUtilsTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/cfg/PythonCfgBlockTest.java b/python-frontend/src/test/java/org/sonar/python/cfg/PythonCfgBlockTest.java index 46e2206b7..b980debda 100644 --- a/python-frontend/src/test/java/org/sonar/python/cfg/PythonCfgBlockTest.java +++ b/python-frontend/src/test/java/org/sonar/python/cfg/PythonCfgBlockTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/cfg/fixpoint/DefinedVariablesAnalysisTest.java b/python-frontend/src/test/java/org/sonar/python/cfg/fixpoint/DefinedVariablesAnalysisTest.java index 72ca96e79..19e1c5fde 100644 --- a/python-frontend/src/test/java/org/sonar/python/cfg/fixpoint/DefinedVariablesAnalysisTest.java +++ b/python-frontend/src/test/java/org/sonar/python/cfg/fixpoint/DefinedVariablesAnalysisTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/cfg/fixpoint/LiveVariablesAnalysisTest.java b/python-frontend/src/test/java/org/sonar/python/cfg/fixpoint/LiveVariablesAnalysisTest.java index a0b0baddc..d1b140791 100644 --- a/python-frontend/src/test/java/org/sonar/python/cfg/fixpoint/LiveVariablesAnalysisTest.java +++ b/python-frontend/src/test/java/org/sonar/python/cfg/fixpoint/LiveVariablesAnalysisTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/cfg/fixpoint/ReachingDefinitionsAnalysisTest.java b/python-frontend/src/test/java/org/sonar/python/cfg/fixpoint/ReachingDefinitionsAnalysisTest.java index 9f7352a21..4da5981d9 100644 --- a/python-frontend/src/test/java/org/sonar/python/cfg/fixpoint/ReachingDefinitionsAnalysisTest.java +++ b/python-frontend/src/test/java/org/sonar/python/cfg/fixpoint/ReachingDefinitionsAnalysisTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/index/AliasDescriptorTest.java b/python-frontend/src/test/java/org/sonar/python/index/AliasDescriptorTest.java index 11f43cf00..19463efb0 100644 --- a/python-frontend/src/test/java/org/sonar/python/index/AliasDescriptorTest.java +++ b/python-frontend/src/test/java/org/sonar/python/index/AliasDescriptorTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/index/AmbiguousDescriptorTest.java b/python-frontend/src/test/java/org/sonar/python/index/AmbiguousDescriptorTest.java index 71b5b6e2b..c5c2b9bd1 100644 --- a/python-frontend/src/test/java/org/sonar/python/index/AmbiguousDescriptorTest.java +++ b/python-frontend/src/test/java/org/sonar/python/index/AmbiguousDescriptorTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/index/ClassDescriptorTest.java b/python-frontend/src/test/java/org/sonar/python/index/ClassDescriptorTest.java index 5d902c543..d632ed6fe 100644 --- a/python-frontend/src/test/java/org/sonar/python/index/ClassDescriptorTest.java +++ b/python-frontend/src/test/java/org/sonar/python/index/ClassDescriptorTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/index/DescriptorToProtobufTestUtils.java b/python-frontend/src/test/java/org/sonar/python/index/DescriptorToProtobufTestUtils.java index 2fa98a178..aa489fab4 100644 --- a/python-frontend/src/test/java/org/sonar/python/index/DescriptorToProtobufTestUtils.java +++ b/python-frontend/src/test/java/org/sonar/python/index/DescriptorToProtobufTestUtils.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/index/DescriptorUtilsTest.java b/python-frontend/src/test/java/org/sonar/python/index/DescriptorUtilsTest.java index 3f7500045..28edec322 100644 --- a/python-frontend/src/test/java/org/sonar/python/index/DescriptorUtilsTest.java +++ b/python-frontend/src/test/java/org/sonar/python/index/DescriptorUtilsTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/index/FunctionDescriptorTest.java b/python-frontend/src/test/java/org/sonar/python/index/FunctionDescriptorTest.java index 16d03da7e..bf13e6143 100644 --- a/python-frontend/src/test/java/org/sonar/python/index/FunctionDescriptorTest.java +++ b/python-frontend/src/test/java/org/sonar/python/index/FunctionDescriptorTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/index/RoundTripDescriptorTest.java b/python-frontend/src/test/java/org/sonar/python/index/RoundTripDescriptorTest.java index e58cef163..bcf60dfcc 100644 --- a/python-frontend/src/test/java/org/sonar/python/index/RoundTripDescriptorTest.java +++ b/python-frontend/src/test/java/org/sonar/python/index/RoundTripDescriptorTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/index/VariableDescriptorTest.java b/python-frontend/src/test/java/org/sonar/python/index/VariableDescriptorTest.java index 901b27287..93ee4b481 100644 --- a/python-frontend/src/test/java/org/sonar/python/index/VariableDescriptorTest.java +++ b/python-frontend/src/test/java/org/sonar/python/index/VariableDescriptorTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/lexer/IPythonLexerTest.java b/python-frontend/src/test/java/org/sonar/python/lexer/IPythonLexerTest.java index 51de4a1d2..09b3f29b0 100644 --- a/python-frontend/src/test/java/org/sonar/python/lexer/IPythonLexerTest.java +++ b/python-frontend/src/test/java/org/sonar/python/lexer/IPythonLexerTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/lexer/PythonLexerTest.java b/python-frontend/src/test/java/org/sonar/python/lexer/PythonLexerTest.java index a6f8e0185..404d2987c 100644 --- a/python-frontend/src/test/java/org/sonar/python/lexer/PythonLexerTest.java +++ b/python-frontend/src/test/java/org/sonar/python/lexer/PythonLexerTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/metrics/CognitiveComplexityVisitorTest.java b/python-frontend/src/test/java/org/sonar/python/metrics/CognitiveComplexityVisitorTest.java index 17e643c51..c3d05a488 100644 --- a/python-frontend/src/test/java/org/sonar/python/metrics/CognitiveComplexityVisitorTest.java +++ b/python-frontend/src/test/java/org/sonar/python/metrics/CognitiveComplexityVisitorTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/metrics/ComplexityVisitorTest.java b/python-frontend/src/test/java/org/sonar/python/metrics/ComplexityVisitorTest.java index c65e37056..ac15e316b 100644 --- a/python-frontend/src/test/java/org/sonar/python/metrics/ComplexityVisitorTest.java +++ b/python-frontend/src/test/java/org/sonar/python/metrics/ComplexityVisitorTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/metrics/FileMetricsTest.java b/python-frontend/src/test/java/org/sonar/python/metrics/FileMetricsTest.java index 415831e85..36e0ff271 100644 --- a/python-frontend/src/test/java/org/sonar/python/metrics/FileMetricsTest.java +++ b/python-frontend/src/test/java/org/sonar/python/metrics/FileMetricsTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/parser/PythonParserAssert.java b/python-frontend/src/test/java/org/sonar/python/parser/PythonParserAssert.java index 926935e19..741c5c045 100644 --- a/python-frontend/src/test/java/org/sonar/python/parser/PythonParserAssert.java +++ b/python-frontend/src/test/java/org/sonar/python/parser/PythonParserAssert.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/parser/PythonParserTest.java b/python-frontend/src/test/java/org/sonar/python/parser/PythonParserTest.java index 1c65ee597..168c18ede 100644 --- a/python-frontend/src/test/java/org/sonar/python/parser/PythonParserTest.java +++ b/python-frontend/src/test/java/org/sonar/python/parser/PythonParserTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/parser/RuleTest.java b/python-frontend/src/test/java/org/sonar/python/parser/RuleTest.java index b184bef14..a11d0dbb6 100644 --- a/python-frontend/src/test/java/org/sonar/python/parser/RuleTest.java +++ b/python-frontend/src/test/java/org/sonar/python/parser/RuleTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/CasePatternsTest.java b/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/CasePatternsTest.java index 482c6f88c..b8a2091f2 100644 --- a/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/CasePatternsTest.java +++ b/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/CasePatternsTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/ClassDefTest.java b/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/ClassDefTest.java index d04f3ed7b..3f32b806f 100644 --- a/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/ClassDefTest.java +++ b/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/ClassDefTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/DecoratorTest.java b/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/DecoratorTest.java index 892ca431e..2a6f03605 100644 --- a/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/DecoratorTest.java +++ b/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/DecoratorTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/ExceptClauseTest.java b/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/ExceptClauseTest.java index 394a036ef..40a58fc0a 100644 --- a/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/ExceptClauseTest.java +++ b/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/ExceptClauseTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/ForStatementTest.java b/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/ForStatementTest.java index 7a3ed0dcc..1ff3b3a86 100644 --- a/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/ForStatementTest.java +++ b/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/ForStatementTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/FuncDefTest.java b/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/FuncDefTest.java index 5e80dec61..78981d4f0 100644 --- a/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/FuncDefTest.java +++ b/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/FuncDefTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/IfStatementTest.java b/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/IfStatementTest.java index 05912da63..90c97b702 100644 --- a/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/IfStatementTest.java +++ b/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/IfStatementTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/MatchStatementTest.java b/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/MatchStatementTest.java index af6b5ebcf..320d73af9 100644 --- a/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/MatchStatementTest.java +++ b/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/MatchStatementTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/SuiteTest.java b/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/SuiteTest.java index 5bf587e73..861a7a7f7 100644 --- a/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/SuiteTest.java +++ b/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/SuiteTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/TryStatementTest.java b/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/TryStatementTest.java index 5402007af..9ab194d7e 100644 --- a/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/TryStatementTest.java +++ b/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/TryStatementTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/WhileStatementTest.java b/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/WhileStatementTest.java index 79e89ff76..7202ac5d4 100644 --- a/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/WhileStatementTest.java +++ b/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/WhileStatementTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/WithStatementTest.java b/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/WithStatementTest.java index f84b4c6c2..f7eeeacfa 100644 --- a/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/WithStatementTest.java +++ b/python-frontend/src/test/java/org/sonar/python/parser/compound/statements/WithStatementTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/parser/expressions/ArgumentListTest.java b/python-frontend/src/test/java/org/sonar/python/parser/expressions/ArgumentListTest.java index 0ab113218..e8f8f1966 100644 --- a/python-frontend/src/test/java/org/sonar/python/parser/expressions/ArgumentListTest.java +++ b/python-frontend/src/test/java/org/sonar/python/parser/expressions/ArgumentListTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/parser/expressions/ExpressionTest.java b/python-frontend/src/test/java/org/sonar/python/parser/expressions/ExpressionTest.java index 88d4a54c3..e47bb457f 100644 --- a/python-frontend/src/test/java/org/sonar/python/parser/expressions/ExpressionTest.java +++ b/python-frontend/src/test/java/org/sonar/python/parser/expressions/ExpressionTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/parser/python/v3/PythonV3Test.java b/python-frontend/src/test/java/org/sonar/python/parser/python/v3/PythonV3Test.java index a68813966..687e1bf7d 100644 --- a/python-frontend/src/test/java/org/sonar/python/parser/python/v3/PythonV3Test.java +++ b/python-frontend/src/test/java/org/sonar/python/parser/python/v3/PythonV3Test.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/AssertStatementTest.java b/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/AssertStatementTest.java index 496c84022..0af1032e5 100644 --- a/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/AssertStatementTest.java +++ b/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/AssertStatementTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/BreakStatementTest.java b/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/BreakStatementTest.java index 65cd7585a..961181e43 100644 --- a/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/BreakStatementTest.java +++ b/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/BreakStatementTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/ContinueStatementTest.java b/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/ContinueStatementTest.java index 6afa274fb..41990c480 100644 --- a/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/ContinueStatementTest.java +++ b/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/ContinueStatementTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/DelStatementTest.java b/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/DelStatementTest.java index 5b75de52b..dd47f22ec 100644 --- a/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/DelStatementTest.java +++ b/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/DelStatementTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/ExecStatementTest.java b/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/ExecStatementTest.java index b7bf31005..83792dfcd 100644 --- a/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/ExecStatementTest.java +++ b/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/ExecStatementTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/ExpressionStatementTest.java b/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/ExpressionStatementTest.java index a92a09dce..b622ef3af 100644 --- a/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/ExpressionStatementTest.java +++ b/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/ExpressionStatementTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/GlobalStatementTest.java b/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/GlobalStatementTest.java index 70d3e7e6f..43261b4a9 100644 --- a/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/GlobalStatementTest.java +++ b/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/GlobalStatementTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/ImportStatementTest.java b/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/ImportStatementTest.java index cdcf57316..83b4005c0 100644 --- a/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/ImportStatementTest.java +++ b/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/ImportStatementTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/NonlocalStatementTest.java b/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/NonlocalStatementTest.java index 5381821d3..53f4ddefc 100644 --- a/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/NonlocalStatementTest.java +++ b/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/NonlocalStatementTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/PassStatementTest.java b/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/PassStatementTest.java index 9e489fab6..801b4bd91 100644 --- a/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/PassStatementTest.java +++ b/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/PassStatementTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/PrintStatementTest.java b/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/PrintStatementTest.java index 765ec62d3..b17c3cf32 100644 --- a/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/PrintStatementTest.java +++ b/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/PrintStatementTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/RaiseStatementTest.java b/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/RaiseStatementTest.java index 62a2eabba..fd11ec39d 100644 --- a/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/RaiseStatementTest.java +++ b/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/RaiseStatementTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/ReturnStatementTest.java b/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/ReturnStatementTest.java index d36add04b..2e42ead0b 100644 --- a/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/ReturnStatementTest.java +++ b/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/ReturnStatementTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/SimpleStatementTest.java b/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/SimpleStatementTest.java index 9f60d1a17..dc797fec9 100644 --- a/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/SimpleStatementTest.java +++ b/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/SimpleStatementTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/YieldStatementTest.java b/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/YieldStatementTest.java index 801c4c30b..2acef2fe4 100644 --- a/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/YieldStatementTest.java +++ b/python-frontend/src/test/java/org/sonar/python/parser/simple/statements/YieldStatementTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/parser/toplevel/FileInputTest.java b/python-frontend/src/test/java/org/sonar/python/parser/toplevel/FileInputTest.java index 2e4ccfdba..3e85bf227 100644 --- a/python-frontend/src/test/java/org/sonar/python/parser/toplevel/FileInputTest.java +++ b/python-frontend/src/test/java/org/sonar/python/parser/toplevel/FileInputTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/project/config/SignatureBasedAwsLambdaHandlersCollectorTest.java b/python-frontend/src/test/java/org/sonar/python/project/config/SignatureBasedAwsLambdaHandlersCollectorTest.java index 2761f5d5b..b0e6a6ac6 100644 --- a/python-frontend/src/test/java/org/sonar/python/project/config/SignatureBasedAwsLambdaHandlersCollectorTest.java +++ b/python-frontend/src/test/java/org/sonar/python/project/config/SignatureBasedAwsLambdaHandlersCollectorTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/quickfix/TextEditUtilsTest.java b/python-frontend/src/test/java/org/sonar/python/quickfix/TextEditUtilsTest.java index 77d497e60..952d1625b 100644 --- a/python-frontend/src/test/java/org/sonar/python/quickfix/TextEditUtilsTest.java +++ b/python-frontend/src/test/java/org/sonar/python/quickfix/TextEditUtilsTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/regex/PythonAnalyzerRegexSourceTest.java b/python-frontend/src/test/java/org/sonar/python/regex/PythonAnalyzerRegexSourceTest.java index 657620009..1c18eb05c 100644 --- a/python-frontend/src/test/java/org/sonar/python/regex/PythonAnalyzerRegexSourceTest.java +++ b/python-frontend/src/test/java/org/sonar/python/regex/PythonAnalyzerRegexSourceTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/regex/PythonRegexIssueLocationTest.java b/python-frontend/src/test/java/org/sonar/python/regex/PythonRegexIssueLocationTest.java index 813785b71..9891efa3d 100644 --- a/python-frontend/src/test/java/org/sonar/python/regex/PythonRegexIssueLocationTest.java +++ b/python-frontend/src/test/java/org/sonar/python/regex/PythonRegexIssueLocationTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/regex/PythonStringCharacterParserTest.java b/python-frontend/src/test/java/org/sonar/python/regex/PythonStringCharacterParserTest.java index 869654380..828348f08 100644 --- a/python-frontend/src/test/java/org/sonar/python/regex/PythonStringCharacterParserTest.java +++ b/python-frontend/src/test/java/org/sonar/python/regex/PythonStringCharacterParserTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/regex/RegexParserTestUtils.java b/python-frontend/src/test/java/org/sonar/python/regex/RegexParserTestUtils.java index 63bce4e21..6ff313508 100644 --- a/python-frontend/src/test/java/org/sonar/python/regex/RegexParserTestUtils.java +++ b/python-frontend/src/test/java/org/sonar/python/regex/RegexParserTestUtils.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/AmbiguousSymbolTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/AmbiguousSymbolTest.java index e95bc3198..675ac6536 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/AmbiguousSymbolTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/AmbiguousSymbolTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/ClassLocalSymbolsTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/ClassLocalSymbolsTest.java index 829673170..c7ffcfef1 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/ClassLocalSymbolsTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/ClassLocalSymbolsTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/ClassSymbolImplTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/ClassSymbolImplTest.java index 3c92a870f..f0c034b83 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/ClassSymbolImplTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/ClassSymbolImplTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/ClassSymbolTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/ClassSymbolTest.java index 9a98e6753..ce2427547 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/ClassSymbolTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/ClassSymbolTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/DependencyGraphTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/DependencyGraphTest.java index 1930d11cc..a44b1a987 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/DependencyGraphTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/DependencyGraphTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/FullyQualifiedNameTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/FullyQualifiedNameTest.java index 31065e16e..0ce307592 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/FullyQualifiedNameTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/FullyQualifiedNameTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/FunctionSymbolTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/FunctionSymbolTest.java index 9c7ec3632..ee9ed74c6 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/FunctionSymbolTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/FunctionSymbolTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/MatchStatementSymbolsTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/MatchStatementSymbolsTest.java index 67beb595c..b5f195261 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/MatchStatementSymbolsTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/MatchStatementSymbolsTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/ProjectLevelSymbolTableTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/ProjectLevelSymbolTableTest.java index 914c96d75..a00c5fecf 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/ProjectLevelSymbolTableTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/ProjectLevelSymbolTableTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/SelfSymbolImplTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/SelfSymbolImplTest.java index 8076b065b..a37da1e58 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/SelfSymbolImplTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/SelfSymbolImplTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/SymbolImplTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/SymbolImplTest.java index 24aed1544..e04e7be70 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/SymbolImplTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/SymbolImplTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/SymbolTableBuilderTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/SymbolTableBuilderTest.java index 84f592b08..946385193 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/SymbolTableBuilderTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/SymbolTableBuilderTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/SymbolUtilsTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/SymbolUtilsTest.java index ce7cbeb13..11c806cf3 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/SymbolUtilsTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/SymbolUtilsTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/UsageImplTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/UsageImplTest.java index 1125c7fb3..04f77527e 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/UsageImplTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/UsageImplTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/SymbolTableBuilderV2Test.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/SymbolTableBuilderV2Test.java index 275b65eee..227ca9bf6 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/SymbolTableBuilderV2Test.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/SymbolTableBuilderV2Test.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/SymbolV2ImplTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/SymbolV2ImplTest.java index b2657c2c5..7c46d06e3 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/SymbolV2ImplTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/SymbolV2ImplTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/SymbolV2UtilsTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/SymbolV2UtilsTest.java index 1fb3345c6..8010720cc 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/SymbolV2UtilsTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/SymbolV2UtilsTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/TestProject.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/TestProject.java index 42d5a463b..54910abcf 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/TestProject.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/TestProject.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/TypeCheckerBuilderTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/TypeCheckerBuilderTest.java index 89283af97..792db13f9 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/TypeCheckerBuilderTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/TypeCheckerBuilderTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/TypeInferenceV2Test.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/TypeInferenceV2Test.java index e24c21254..fba69af43 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/TypeInferenceV2Test.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/TypeInferenceV2Test.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/callgraph/CallGraphCollectorTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/callgraph/CallGraphCollectorTest.java index 157488c48..803989aa9 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/callgraph/CallGraphCollectorTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/callgraph/CallGraphCollectorTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/callgraph/CallGraphIterableTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/callgraph/CallGraphIterableTest.java index 5403ded2c..569944207 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/callgraph/CallGraphIterableTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/callgraph/CallGraphIterableTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/callgraph/CallGraphNodeTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/callgraph/CallGraphNodeTest.java index e032c1366..71397a7ea 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/callgraph/CallGraphNodeTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/callgraph/CallGraphNodeTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/callgraph/CallGraphTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/callgraph/CallGraphTest.java index 2190ce6bd..c5e7da95d 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/callgraph/CallGraphTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/callgraph/CallGraphTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/callgraph/CallGraphWalkerTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/callgraph/CallGraphWalkerTest.java index 1d32e8ba7..809fdf24a 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/callgraph/CallGraphWalkerTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/callgraph/CallGraphWalkerTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/AmbiguousDescriptorToPythonTypeConverterTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/AmbiguousDescriptorToPythonTypeConverterTest.java index a533c1e60..f422ace1d 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/AmbiguousDescriptorToPythonTypeConverterTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/AmbiguousDescriptorToPythonTypeConverterTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/ClassDescriptorToPythonTypeConverterTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/ClassDescriptorToPythonTypeConverterTest.java index ede3e5e84..8a62dcb42 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/ClassDescriptorToPythonTypeConverterTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/ClassDescriptorToPythonTypeConverterTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/ConversionContextTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/ConversionContextTest.java index 7ec495be7..3f12bd4f2 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/ConversionContextTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/ConversionContextTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/DescriptorToPythonTypeConverterTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/DescriptorToPythonTypeConverterTest.java index 722f1f54c..df87a587e 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/DescriptorToPythonTypeConverterTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/DescriptorToPythonTypeConverterTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/FunctionDescriptorToPythonTypeConverterTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/FunctionDescriptorToPythonTypeConverterTest.java index 143985ffd..21d617c2d 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/FunctionDescriptorToPythonTypeConverterTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/FunctionDescriptorToPythonTypeConverterTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/PythonTypeToDescriptorConverterTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/PythonTypeToDescriptorConverterTest.java index 60628e34e..be6f2dbcb 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/PythonTypeToDescriptorConverterTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/PythonTypeToDescriptorConverterTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/TypeAnnotationToPythonTypeConverterTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/TypeAnnotationToPythonTypeConverterTest.java index 2552bf742..b40aaa6d1 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/TypeAnnotationToPythonTypeConverterTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/TypeAnnotationToPythonTypeConverterTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/VariableDescriptorToPythonTypeConverterTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/VariableDescriptorToPythonTypeConverterTest.java index 356b786ff..97f30c576 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/VariableDescriptorToPythonTypeConverterTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/VariableDescriptorToPythonTypeConverterTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/types/TrivialTypePropagationVisitorTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/types/TrivialTypePropagationVisitorTest.java index 13a133856..382648da3 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/types/TrivialTypePropagationVisitorTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/types/TrivialTypePropagationVisitorTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/types/TypeDependenciesCalculatorTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/types/TypeDependenciesCalculatorTest.java index 4026c6cd1..cc5db369f 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/types/TypeDependenciesCalculatorTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/types/TypeDependenciesCalculatorTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/types/TypeInferenceMatchersTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/types/TypeInferenceMatchersTest.java index 14ee18a59..487ad5fa5 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/types/TypeInferenceMatchersTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/types/TypeInferenceMatchersTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/types/typecalculator/CallReturnTypeCalculatorTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/types/typecalculator/CallReturnTypeCalculatorTest.java index 766232551..2646eb966 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/types/typecalculator/CallReturnTypeCalculatorTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/types/typecalculator/CallReturnTypeCalculatorTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/types/typecalculator/QualifiedExpressionCalculatorTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/types/typecalculator/QualifiedExpressionCalculatorTest.java index 0a6df8f9d..772df71cf 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/types/typecalculator/QualifiedExpressionCalculatorTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/types/typecalculator/QualifiedExpressionCalculatorTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/typeshed/ClassSymbolToDescriptorConverterTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/typeshed/ClassSymbolToDescriptorConverterTest.java index 628a6a452..b67b0a82e 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/typeshed/ClassSymbolToDescriptorConverterTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/typeshed/ClassSymbolToDescriptorConverterTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/typeshed/FunctionSymbolToDescriptorConverterTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/typeshed/FunctionSymbolToDescriptorConverterTest.java index 94b5e5c35..af27d53cc 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/typeshed/FunctionSymbolToDescriptorConverterTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/typeshed/FunctionSymbolToDescriptorConverterTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/typeshed/ModuleSymbolToDescriptorConverterTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/typeshed/ModuleSymbolToDescriptorConverterTest.java index 25e0c5cbc..f2cac2d4a 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/typeshed/ModuleSymbolToDescriptorConverterTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/typeshed/ModuleSymbolToDescriptorConverterTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/typeshed/OverloadedFunctionSymbolToDescriptorConverterTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/typeshed/OverloadedFunctionSymbolToDescriptorConverterTest.java index e4c45f282..843f01963 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/typeshed/OverloadedFunctionSymbolToDescriptorConverterTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/typeshed/OverloadedFunctionSymbolToDescriptorConverterTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/typeshed/ParameterSymbolToDescriptorConverterTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/typeshed/ParameterSymbolToDescriptorConverterTest.java index 8ff2b051d..b8ed64fdd 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/typeshed/ParameterSymbolToDescriptorConverterTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/typeshed/ParameterSymbolToDescriptorConverterTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/typeshed/TypeShedDescriptorsProviderTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/typeshed/TypeShedDescriptorsProviderTest.java index 84a5fcc65..24ef1ee4b 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/typeshed/TypeShedDescriptorsProviderTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/typeshed/TypeShedDescriptorsProviderTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/typeshed/TypeShedUtilsTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/typeshed/TypeShedUtilsTest.java index 979d23874..e0acb563d 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/typeshed/TypeShedUtilsTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/typeshed/TypeShedUtilsTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/typeshed/VarSymbolToDescriptorConverterTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/typeshed/VarSymbolToDescriptorConverterTest.java index 67611fd5a..8ad6515bd 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/typeshed/VarSymbolToDescriptorConverterTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/typeshed/VarSymbolToDescriptorConverterTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/typetable/BasicTypeTableTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/typetable/BasicTypeTableTest.java index f88ecd610..2e05e45a3 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/typetable/BasicTypeTableTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/typetable/BasicTypeTableTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/typetable/CachedTypeTableTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/typetable/CachedTypeTableTest.java index de5251263..64c977798 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/typetable/CachedTypeTableTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/typetable/CachedTypeTableTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/typetable/ProjectLevelTypeTableTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/typetable/ProjectLevelTypeTableTest.java index 8d4422336..98372936c 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/typetable/ProjectLevelTypeTableTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/typetable/ProjectLevelTypeTableTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/tests/UnittestUtilsTest.java b/python-frontend/src/test/java/org/sonar/python/tests/UnittestUtilsTest.java index e43fa4930..4fd975023 100644 --- a/python-frontend/src/test/java/org/sonar/python/tests/UnittestUtilsTest.java +++ b/python-frontend/src/test/java/org/sonar/python/tests/UnittestUtilsTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/tree/BinaryExpressionImplTest.java b/python-frontend/src/test/java/org/sonar/python/tree/BinaryExpressionImplTest.java index 6ecbc083c..7c4141bcd 100644 --- a/python-frontend/src/test/java/org/sonar/python/tree/BinaryExpressionImplTest.java +++ b/python-frontend/src/test/java/org/sonar/python/tree/BinaryExpressionImplTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/tree/CallExpressionImplTest.java b/python-frontend/src/test/java/org/sonar/python/tree/CallExpressionImplTest.java index acbd85de3..5407aee34 100644 --- a/python-frontend/src/test/java/org/sonar/python/tree/CallExpressionImplTest.java +++ b/python-frontend/src/test/java/org/sonar/python/tree/CallExpressionImplTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/tree/ComprehensionExpressionImplTest.java b/python-frontend/src/test/java/org/sonar/python/tree/ComprehensionExpressionImplTest.java index 130a321ea..31076b263 100644 --- a/python-frontend/src/test/java/org/sonar/python/tree/ComprehensionExpressionImplTest.java +++ b/python-frontend/src/test/java/org/sonar/python/tree/ComprehensionExpressionImplTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/tree/IPythonTreeMakerTest.java b/python-frontend/src/test/java/org/sonar/python/tree/IPythonTreeMakerTest.java index 90c59b6e7..75582d5d2 100644 --- a/python-frontend/src/test/java/org/sonar/python/tree/IPythonTreeMakerTest.java +++ b/python-frontend/src/test/java/org/sonar/python/tree/IPythonTreeMakerTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/tree/NameImplTest.java b/python-frontend/src/test/java/org/sonar/python/tree/NameImplTest.java index 738ef30a5..7b103313c 100644 --- a/python-frontend/src/test/java/org/sonar/python/tree/NameImplTest.java +++ b/python-frontend/src/test/java/org/sonar/python/tree/NameImplTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/tree/ParenthesizedExpressionImplTest.java b/python-frontend/src/test/java/org/sonar/python/tree/ParenthesizedExpressionImplTest.java index 788aa8e72..cdef033f8 100644 --- a/python-frontend/src/test/java/org/sonar/python/tree/ParenthesizedExpressionImplTest.java +++ b/python-frontend/src/test/java/org/sonar/python/tree/ParenthesizedExpressionImplTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/tree/PythonTreeMakerMatchStatementTest.java b/python-frontend/src/test/java/org/sonar/python/tree/PythonTreeMakerMatchStatementTest.java index 9e3f9ffe5..31ff5e7b4 100644 --- a/python-frontend/src/test/java/org/sonar/python/tree/PythonTreeMakerMatchStatementTest.java +++ b/python-frontend/src/test/java/org/sonar/python/tree/PythonTreeMakerMatchStatementTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/tree/PythonTreeMakerTest.java b/python-frontend/src/test/java/org/sonar/python/tree/PythonTreeMakerTest.java index 63e4cbc75..4b2ece264 100644 --- a/python-frontend/src/test/java/org/sonar/python/tree/PythonTreeMakerTest.java +++ b/python-frontend/src/test/java/org/sonar/python/tree/PythonTreeMakerTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/tree/PythonTreeMakerUtilsTest.java b/python-frontend/src/test/java/org/sonar/python/tree/PythonTreeMakerUtilsTest.java index fe0678fd8..056085b68 100644 --- a/python-frontend/src/test/java/org/sonar/python/tree/PythonTreeMakerUtilsTest.java +++ b/python-frontend/src/test/java/org/sonar/python/tree/PythonTreeMakerUtilsTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/tree/SliceExpressionImplTest.java b/python-frontend/src/test/java/org/sonar/python/tree/SliceExpressionImplTest.java index ae21480dd..231dd7c2b 100644 --- a/python-frontend/src/test/java/org/sonar/python/tree/SliceExpressionImplTest.java +++ b/python-frontend/src/test/java/org/sonar/python/tree/SliceExpressionImplTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/tree/StringElementImplTest.java b/python-frontend/src/test/java/org/sonar/python/tree/StringElementImplTest.java index ff48794ba..6c3140ee3 100644 --- a/python-frontend/src/test/java/org/sonar/python/tree/StringElementImplTest.java +++ b/python-frontend/src/test/java/org/sonar/python/tree/StringElementImplTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/tree/StringLiteralImplTest.java b/python-frontend/src/test/java/org/sonar/python/tree/StringLiteralImplTest.java index e6bec8b58..61c1c495e 100644 --- a/python-frontend/src/test/java/org/sonar/python/tree/StringLiteralImplTest.java +++ b/python-frontend/src/test/java/org/sonar/python/tree/StringLiteralImplTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/tree/TokenEnricherTest.java b/python-frontend/src/test/java/org/sonar/python/tree/TokenEnricherTest.java index 91d5c053d..c50e3c1a3 100644 --- a/python-frontend/src/test/java/org/sonar/python/tree/TokenEnricherTest.java +++ b/python-frontend/src/test/java/org/sonar/python/tree/TokenEnricherTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/tree/TreeUtilsTest.java b/python-frontend/src/test/java/org/sonar/python/tree/TreeUtilsTest.java index 63d2be240..6f65e538b 100644 --- a/python-frontend/src/test/java/org/sonar/python/tree/TreeUtilsTest.java +++ b/python-frontend/src/test/java/org/sonar/python/tree/TreeUtilsTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/tree/UnaryExpressionImplTest.java b/python-frontend/src/test/java/org/sonar/python/tree/UnaryExpressionImplTest.java index 71381e983..3393645a5 100644 --- a/python-frontend/src/test/java/org/sonar/python/tree/UnaryExpressionImplTest.java +++ b/python-frontend/src/test/java/org/sonar/python/tree/UnaryExpressionImplTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/types/AnyTypeTest.java b/python-frontend/src/test/java/org/sonar/python/types/AnyTypeTest.java index c5de1f50f..fd3030871 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/AnyTypeTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/AnyTypeTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/types/DeclaredTypeTest.java b/python-frontend/src/test/java/org/sonar/python/types/DeclaredTypeTest.java index 0b2768a37..7d947fc45 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/DeclaredTypeTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/DeclaredTypeTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/types/InferredTypesTest.java b/python-frontend/src/test/java/org/sonar/python/types/InferredTypesTest.java index 1bd04c111..104d89c76 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/InferredTypesTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/InferredTypesTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/types/MemberResolutionTest.java b/python-frontend/src/test/java/org/sonar/python/types/MemberResolutionTest.java index 36d2f30be..5a40e45d7 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/MemberResolutionTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/MemberResolutionTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/types/RuntimeTypeTest.java b/python-frontend/src/test/java/org/sonar/python/types/RuntimeTypeTest.java index ac8a0c119..936131046 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/RuntimeTypeTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/RuntimeTypeTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/types/TypeInferenceProgramStateTest.java b/python-frontend/src/test/java/org/sonar/python/types/TypeInferenceProgramStateTest.java index c2c377a2b..5f8a8b922 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/TypeInferenceProgramStateTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/TypeInferenceProgramStateTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/types/TypeInferenceTest.java b/python-frontend/src/test/java/org/sonar/python/types/TypeInferenceTest.java index 8770a7535..cada42c44 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/TypeInferenceTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/TypeInferenceTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/types/TypeShedTest.java b/python-frontend/src/test/java/org/sonar/python/types/TypeShedTest.java index 4e2e7e4b7..edcfd7507 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/TypeShedTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/TypeShedTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/types/UnionTypeTest.java b/python-frontend/src/test/java/org/sonar/python/types/UnionTypeTest.java index bbd450917..c97a4f215 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/UnionTypeTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/UnionTypeTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/types/UnknownClassTypeTest.java b/python-frontend/src/test/java/org/sonar/python/types/UnknownClassTypeTest.java index 3b7ca0964..984da3982 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/UnknownClassTypeTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/UnknownClassTypeTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/types/v2/LazyTypeTest.java b/python-frontend/src/test/java/org/sonar/python/types/v2/LazyTypeTest.java index 2501ee269..03aaadeb3 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/v2/LazyTypeTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/v2/LazyTypeTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/types/v2/LazyTypeWrapperTest.java b/python-frontend/src/test/java/org/sonar/python/types/v2/LazyTypeWrapperTest.java index f712d729f..b5148df01 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/v2/LazyTypeWrapperTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/v2/LazyTypeWrapperTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/types/v2/LazyUnionTypeTest.java b/python-frontend/src/test/java/org/sonar/python/types/v2/LazyUnionTypeTest.java index 7ae70e4e4..ac4eb6b3f 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/v2/LazyUnionTypeTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/v2/LazyUnionTypeTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/types/v2/SpecialFormTypeTest.java b/python-frontend/src/test/java/org/sonar/python/types/v2/SpecialFormTypeTest.java index c66b586f5..bd706d192 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/v2/SpecialFormTypeTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/v2/SpecialFormTypeTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/types/v2/TypeCheckMapTest.java b/python-frontend/src/test/java/org/sonar/python/types/v2/TypeCheckMapTest.java index c3d615042..a72e147c2 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/v2/TypeCheckMapTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/v2/TypeCheckMapTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/types/v2/TypeCheckerTest.java b/python-frontend/src/test/java/org/sonar/python/types/v2/TypeCheckerTest.java index 0f71be9ca..32bd259c8 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/v2/TypeCheckerTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/v2/TypeCheckerTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/types/v2/TypeInferenceProgramStateTest.java b/python-frontend/src/test/java/org/sonar/python/types/v2/TypeInferenceProgramStateTest.java index ab6e41ef9..457c0ae61 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/v2/TypeInferenceProgramStateTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/v2/TypeInferenceProgramStateTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/types/v2/TypesTestUtils.java b/python-frontend/src/test/java/org/sonar/python/types/v2/TypesTestUtils.java index 205ca498d..6e1275174 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/v2/TypesTestUtils.java +++ b/python-frontend/src/test/java/org/sonar/python/types/v2/TypesTestUtils.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/AllTypePredicateTest.java b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/AllTypePredicateTest.java index b74ed7983..593e3b57a 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/AllTypePredicateTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/AllTypePredicateTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/AnyTypePredicateTest.java b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/AnyTypePredicateTest.java index 4d42a4b76..49dcfa61c 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/AnyTypePredicateTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/AnyTypePredicateTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/HasFQNPredicateTest.java b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/HasFQNPredicateTest.java index 1d17aa2e4..645773aac 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/HasFQNPredicateTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/HasFQNPredicateTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/HasMemberPredicateTest.java b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/HasMemberPredicateTest.java index e2cf2dc91..2b6f8ac47 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/HasMemberPredicateTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/HasMemberPredicateTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsAnyTypeInUnionSatisfyingTest.java b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsAnyTypeInUnionSatisfyingTest.java index eb322bea5..1d5c9c293 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsAnyTypeInUnionSatisfyingTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsAnyTypeInUnionSatisfyingTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsFunctionOwnerSatisfyingPredicateTest.java b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsFunctionOwnerSatisfyingPredicateTest.java index 20d24a46c..218fe4a38 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsFunctionOwnerSatisfyingPredicateTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsFunctionOwnerSatisfyingPredicateTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsObjectSatisfyingPredicateTest.java b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsObjectSatisfyingPredicateTest.java index bc8c2e83d..a368b65b5 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsObjectSatisfyingPredicateTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsObjectSatisfyingPredicateTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsSelfTypePredicateTest.java b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsSelfTypePredicateTest.java index aa3e2d09c..0f80998ab 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsSelfTypePredicateTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsSelfTypePredicateTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsTypeOrSuperTypeSatisfyingPredicateTest.java b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsTypeOrSuperTypeSatisfyingPredicateTest.java index e5d5a4daa..8544ca61a 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsTypeOrSuperTypeSatisfyingPredicateTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsTypeOrSuperTypeSatisfyingPredicateTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsTypePredicateTest.java b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsTypePredicateTest.java index 38a306673..6d97f9dde 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsTypePredicateTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsTypePredicateTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/TypeSourcePredicateTest.java b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/TypeSourcePredicateTest.java index 766f5c046..c5ca9ed1b 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/TypeSourcePredicateTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/TypeSourcePredicateTest.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/typeshed_serializer/runners/__init__.py b/python-frontend/typeshed_serializer/runners/__init__.py index 2a765941b..2739b9a3e 100644 --- a/python-frontend/typeshed_serializer/runners/__init__.py +++ b/python-frontend/typeshed_serializer/runners/__init__.py @@ -1,10 +1,10 @@ # # SonarQube Python Plugin -# Copyright (C) 2011-2025 SonarSource Sàrl +# Copyright (C) SonarSource Sàrl # mailto:info AT sonarsource DOT com # -# This program is free software; you can redistribute it and/or -# modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. +# You can redistribute and/or modify this program under the terms of +# the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/typeshed_serializer/runners/tox_runner.py b/python-frontend/typeshed_serializer/runners/tox_runner.py index 61c6b1e29..f6b17f195 100644 --- a/python-frontend/typeshed_serializer/runners/tox_runner.py +++ b/python-frontend/typeshed_serializer/runners/tox_runner.py @@ -1,10 +1,10 @@ # # SonarQube Python Plugin -# Copyright (C) 2011-2025 SonarSource Sàrl +# Copyright (C) SonarSource Sàrl # mailto:info AT sonarsource DOT com # -# This program is free software; you can redistribute it and/or -# modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. +# You can redistribute and/or modify this program under the terms of +# the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/typeshed_serializer/serializer/__init__.py b/python-frontend/typeshed_serializer/serializer/__init__.py index 2a765941b..2739b9a3e 100644 --- a/python-frontend/typeshed_serializer/serializer/__init__.py +++ b/python-frontend/typeshed_serializer/serializer/__init__.py @@ -1,10 +1,10 @@ # # SonarQube Python Plugin -# Copyright (C) 2011-2025 SonarSource Sàrl +# Copyright (C) SonarSource Sàrl # mailto:info AT sonarsource DOT com # -# This program is free software; you can redistribute it and/or -# modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. +# You can redistribute and/or modify this program under the terms of +# the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/typeshed_serializer/serializer/serializers.py b/python-frontend/typeshed_serializer/serializer/serializers.py index 022cfe001..5c2c1f3a0 100644 --- a/python-frontend/typeshed_serializer/serializer/serializers.py +++ b/python-frontend/typeshed_serializer/serializer/serializers.py @@ -1,10 +1,10 @@ # # SonarQube Python Plugin -# Copyright (C) 2011-2025 SonarSource Sàrl +# Copyright (C) SonarSource Sàrl # mailto:info AT sonarsource DOT com # -# This program is free software; you can redistribute it and/or -# modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. +# You can redistribute and/or modify this program under the terms of +# the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/typeshed_serializer/serializer/symbols.py b/python-frontend/typeshed_serializer/serializer/symbols.py index c423685ef..db583ada4 100644 --- a/python-frontend/typeshed_serializer/serializer/symbols.py +++ b/python-frontend/typeshed_serializer/serializer/symbols.py @@ -1,10 +1,10 @@ # # SonarQube Python Plugin -# Copyright (C) 2011-2025 SonarSource Sàrl +# Copyright (C) SonarSource Sàrl # mailto:info AT sonarsource DOT com # -# This program is free software; you can redistribute it and/or -# modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. +# You can redistribute and/or modify this program under the terms of +# the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/typeshed_serializer/serializer/symbols_merger.py b/python-frontend/typeshed_serializer/serializer/symbols_merger.py index 8d6898183..2e39fccab 100644 --- a/python-frontend/typeshed_serializer/serializer/symbols_merger.py +++ b/python-frontend/typeshed_serializer/serializer/symbols_merger.py @@ -1,10 +1,10 @@ # # SonarQube Python Plugin -# Copyright (C) 2011-2025 SonarSource Sàrl +# Copyright (C) SonarSource Sàrl # mailto:info AT sonarsource DOT com # -# This program is free software; you can redistribute it and/or -# modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. +# You can redistribute and/or modify this program under the terms of +# the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/typeshed_serializer/serializer/typeshed_serializer.py b/python-frontend/typeshed_serializer/serializer/typeshed_serializer.py index 40b2d224c..5f2a12b95 100644 --- a/python-frontend/typeshed_serializer/serializer/typeshed_serializer.py +++ b/python-frontend/typeshed_serializer/serializer/typeshed_serializer.py @@ -1,10 +1,10 @@ # # SonarQube Python Plugin -# Copyright (C) 2011-2025 SonarSource Sàrl +# Copyright (C) SonarSource Sàrl # mailto:info AT sonarsource DOT com # -# This program is free software; you can redistribute it and/or -# modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. +# You can redistribute and/or modify this program under the terms of +# the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/typeshed_serializer/serializer_sources.checksum b/python-frontend/typeshed_serializer/serializer_sources.checksum index 3a57d6740..d3f9d5703 100644 --- a/python-frontend/typeshed_serializer/serializer_sources.checksum +++ b/python-frontend/typeshed_serializer/serializer_sources.checksum @@ -1 +1 @@ -75ec98e58a7ae0ccd94f569d49e43f9034a6d2744ade0ba7565718a139edf33b \ No newline at end of file +161bca1cd08946d58465c4232c7d43adec538b6fde516fef8f1c08de7b8ccc9b \ No newline at end of file diff --git a/python-frontend/typeshed_serializer/tests/__init__.py b/python-frontend/typeshed_serializer/tests/__init__.py index 2a765941b..2739b9a3e 100644 --- a/python-frontend/typeshed_serializer/tests/__init__.py +++ b/python-frontend/typeshed_serializer/tests/__init__.py @@ -1,10 +1,10 @@ # # SonarQube Python Plugin -# Copyright (C) 2011-2025 SonarSource Sàrl +# Copyright (C) SonarSource Sàrl # mailto:info AT sonarsource DOT com # -# This program is free software; you can redistribute it and/or -# modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. +# You can redistribute and/or modify this program under the terms of +# the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/typeshed_serializer/tests/conftest.py b/python-frontend/typeshed_serializer/tests/conftest.py index eb8636b2a..eeaddb6ad 100644 --- a/python-frontend/typeshed_serializer/tests/conftest.py +++ b/python-frontend/typeshed_serializer/tests/conftest.py @@ -1,10 +1,10 @@ # # SonarQube Python Plugin -# Copyright (C) 2011-2025 SonarSource Sàrl +# Copyright (C) SonarSource Sàrl # mailto:info AT sonarsource DOT com # -# This program is free software; you can redistribute it and/or -# modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. +# You can redistribute and/or modify this program under the terms of +# the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/typeshed_serializer/tests/runners/__init__.py b/python-frontend/typeshed_serializer/tests/runners/__init__.py index 2a765941b..2739b9a3e 100644 --- a/python-frontend/typeshed_serializer/tests/runners/__init__.py +++ b/python-frontend/typeshed_serializer/tests/runners/__init__.py @@ -1,10 +1,10 @@ # # SonarQube Python Plugin -# Copyright (C) 2011-2025 SonarSource Sàrl +# Copyright (C) SonarSource Sàrl # mailto:info AT sonarsource DOT com # -# This program is free software; you can redistribute it and/or -# modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. +# You can redistribute and/or modify this program under the terms of +# the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/typeshed_serializer/tests/runners/test_tox_runner.py b/python-frontend/typeshed_serializer/tests/runners/test_tox_runner.py index 2e2a15e32..a98f6a460 100644 --- a/python-frontend/typeshed_serializer/tests/runners/test_tox_runner.py +++ b/python-frontend/typeshed_serializer/tests/runners/test_tox_runner.py @@ -1,10 +1,10 @@ # # SonarQube Python Plugin -# Copyright (C) 2011-2025 SonarSource Sàrl +# Copyright (C) SonarSource Sàrl # mailto:info AT sonarsource DOT com # -# This program is free software; you can redistribute it and/or -# modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. +# You can redistribute and/or modify this program under the terms of +# the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/typeshed_serializer/tests/test_serializers.py b/python-frontend/typeshed_serializer/tests/test_serializers.py index ecf80c897..6822fa577 100644 --- a/python-frontend/typeshed_serializer/tests/test_serializers.py +++ b/python-frontend/typeshed_serializer/tests/test_serializers.py @@ -1,10 +1,10 @@ # # SonarQube Python Plugin -# Copyright (C) 2011-2025 SonarSource Sàrl +# Copyright (C) SonarSource Sàrl # mailto:info AT sonarsource DOT com # -# This program is free software; you can redistribute it and/or -# modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. +# You can redistribute and/or modify this program under the terms of +# the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/typeshed_serializer/tests/test_symbols.py b/python-frontend/typeshed_serializer/tests/test_symbols.py index 5d3b64e92..80c4c3fab 100644 --- a/python-frontend/typeshed_serializer/tests/test_symbols.py +++ b/python-frontend/typeshed_serializer/tests/test_symbols.py @@ -1,10 +1,10 @@ # # SonarQube Python Plugin -# Copyright (C) 2011-2025 SonarSource Sàrl +# Copyright (C) SonarSource Sàrl # mailto:info AT sonarsource DOT com # -# This program is free software; you can redistribute it and/or -# modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. +# You can redistribute and/or modify this program under the terms of +# the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/typeshed_serializer/tests/test_symbols_merger.py b/python-frontend/typeshed_serializer/tests/test_symbols_merger.py index 97931a9cd..b76a6431b 100644 --- a/python-frontend/typeshed_serializer/tests/test_symbols_merger.py +++ b/python-frontend/typeshed_serializer/tests/test_symbols_merger.py @@ -1,10 +1,10 @@ # # SonarQube Python Plugin -# Copyright (C) 2011-2025 SonarSource Sàrl +# Copyright (C) SonarSource Sàrl # mailto:info AT sonarsource DOT com # -# This program is free software; you can redistribute it and/or -# modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. +# You can redistribute and/or modify this program under the terms of +# the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/typeshed_serializer/tests/test_typeshed_serializer.py b/python-frontend/typeshed_serializer/tests/test_typeshed_serializer.py index a37d33e55..a6504a70c 100644 --- a/python-frontend/typeshed_serializer/tests/test_typeshed_serializer.py +++ b/python-frontend/typeshed_serializer/tests/test_typeshed_serializer.py @@ -1,10 +1,10 @@ # # SonarQube Python Plugin -# Copyright (C) 2011-2025 SonarSource Sàrl +# Copyright (C) SonarSource Sàrl # mailto:info AT sonarsource DOT com # -# This program is free software; you can redistribute it and/or -# modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. +# You can redistribute and/or modify this program under the terms of +# the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/typeshed_serializer/tests/utils/__init__.py b/python-frontend/typeshed_serializer/tests/utils/__init__.py index 2a765941b..2739b9a3e 100644 --- a/python-frontend/typeshed_serializer/tests/utils/__init__.py +++ b/python-frontend/typeshed_serializer/tests/utils/__init__.py @@ -1,10 +1,10 @@ # # SonarQube Python Plugin -# Copyright (C) 2011-2025 SonarSource Sàrl +# Copyright (C) SonarSource Sàrl # mailto:info AT sonarsource DOT com # -# This program is free software; you can redistribute it and/or -# modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. +# You can redistribute and/or modify this program under the terms of +# the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/python-frontend/typeshed_serializer/tests/utils/test_folder_manager.py b/python-frontend/typeshed_serializer/tests/utils/test_folder_manager.py index 2bc159305..d43f5ae63 100644 --- a/python-frontend/typeshed_serializer/tests/utils/test_folder_manager.py +++ b/python-frontend/typeshed_serializer/tests/utils/test_folder_manager.py @@ -1,10 +1,10 @@ # # SonarQube Python Plugin -# Copyright (C) 2011-2025 SonarSource Sàrl +# Copyright (C) SonarSource Sàrl # mailto:info AT sonarsource DOT com # -# This program is free software; you can redistribute it and/or -# modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. +# You can redistribute and/or modify this program under the terms of +# the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/sonar-python-plugin/src/main/java/org/sonar/plugins/python/PythonPlugin.java b/sonar-python-plugin/src/main/java/org/sonar/plugins/python/PythonPlugin.java index e6f8739e8..da5fc0c85 100644 --- a/sonar-python-plugin/src/main/java/org/sonar/plugins/python/PythonPlugin.java +++ b/sonar-python-plugin/src/main/java/org/sonar/plugins/python/PythonPlugin.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/sonar-python-plugin/src/main/java/org/sonar/plugins/python/package-info.java b/sonar-python-plugin/src/main/java/org/sonar/plugins/python/package-info.java index 4309be690..f7731e1fc 100644 --- a/sonar-python-plugin/src/main/java/org/sonar/plugins/python/package-info.java +++ b/sonar-python-plugin/src/main/java/org/sonar/plugins/python/package-info.java @@ -1,10 +1,10 @@ /* * SonarQube Python Plugin - * Copyright (C) 2011-2025 SonarSource Sàrl + * Copyright (C) SonarSource Sàrl * mailto:info AT sonarsource DOT com * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of From b1f2a3e9c7844c529577513913b0cb06468b0ae1 Mon Sep 17 00:00:00 2001 From: "sonar-nigel[bot]" <247337653+sonar-nigel[bot]@users.noreply.github.com> Date: Thu, 2 Apr 2026 14:58:28 +0000 Subject: [PATCH 071/322] SONARPY-3996 Rule S8504 Property methods should have a return statement (#1025) Co-authored-by: Sonar Vibe Bot Co-authored-by: David Kunzmann GitOrigin-RevId: 177d15782e00e2aeb45196ab1c23e59ac4a4cfac --- .../python/checks/OpenSourceCheckList.java | 1 + .../PropertyMethodWithoutReturnCheck.java | 59 ++++ .../org/sonar/l10n/py/rules/python/S8504.html | 45 +++ .../org/sonar/l10n/py/rules/python/S8504.json | 23 ++ .../py/rules/python/Sonar_way_profile.json | 1 + .../PropertyMethodWithoutReturnCheckTest.java | 29 ++ .../checks/propertyMethodWithoutReturn.py | 290 ++++++++++++++++++ 7 files changed, 448 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/PropertyMethodWithoutReturnCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8504.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8504.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/PropertyMethodWithoutReturnCheckTest.java create mode 100644 python-checks/src/test/resources/checks/propertyMethodWithoutReturn.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 3118e28ab..de7d36ca7 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -363,6 +363,7 @@ public Stream> getChecks() { PrivilegePolicyCheck.class, ProcessSignallingCheck.class, PropertyAccessorParameterCountCheck.class, + PropertyMethodWithoutReturnCheck.class, PytzUsageCheck.class, PseudoRandomCheck.class, PublicApiIsSecuritySensitiveCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/PropertyMethodWithoutReturnCheck.java b/python-checks/src/main/java/org/sonar/python/checks/PropertyMethodWithoutReturnCheck.java new file mode 100644 index 000000000..c7c57ff7e --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/PropertyMethodWithoutReturnCheck.java @@ -0,0 +1,59 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.tree.FunctionDef; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.checks.utils.CheckUtils; + +@Rule(key = "S8504") +public class PropertyMethodWithoutReturnCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Add a return statement to this property method."; + private static final TypeMatcher PROPERTY_MATCHER = TypeMatchers.isType("builtins.property"); + private static final TypeMatcher ABSTRACT_METHOD_MATCHER = TypeMatchers.isType("abc.abstractmethod"); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.FUNCDEF, ctx -> { + FunctionDef functionDef = (FunctionDef) ctx.syntaxNode(); + + boolean isProperty = functionDef.decorators().stream() + .anyMatch(d -> PROPERTY_MATCHER.isTrueFor(d.expression(), ctx)); + boolean isAbstract = functionDef.decorators().stream() + .anyMatch(d -> ABSTRACT_METHOD_MATCHER.isTrueFor(d.expression(), ctx)); + + if (!isProperty || isAbstract) { + return; + } + + if (functionDef.body().statements().stream().allMatch(CheckUtils::isEmptyStatement)) { + return; + } + + var collector = ReturnCheckUtils.ReturnStmtCollector.collect(functionDef); + + if (collector.getReturnStmts().isEmpty() && !collector.containsYield() && !collector.raisesExceptions()) { + ctx.addIssue(functionDef.name(), MESSAGE); + } + }); + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8504.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8504.html new file mode 100644 index 000000000..9c297522e --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8504.html @@ -0,0 +1,45 @@ +

      This rule raises an issue when a method decorated with @property does not contain any return statement.

      +

      Why is this an issue?

      +

      In Python, the @property decorator transforms a method into a getter for a computed attribute. When you access a property, you expect +to receive a value, just like accessing a regular attribute.

      +

      A property method without a return statement will implicitly return None. This makes the property useless because it +always provides None instead of a meaningful value. This behavior is almost always unintentional and indicates a bug in the code.

      +

      Exceptions

      +

      This rule does not raise an issue when the property method raises an exception or is decorated with @abstractmethod, as these are +intentional patterns where a return value is not expected.

      +

      What is the potential impact?

      +

      When a property method lacks a return statement, it always returns None. This leads to:

      +
        +
      • logic errors: code that depends on the property value will behave incorrectly, potentially causing application failures or + incorrect results.
      • +
      • difficult debugging: the implicit None return is not obvious from looking at the property access, making bugs + harder to trace.
      • +
      • API contract violation: users of the class expect the property to provide meaningful data, but receive None + instead, breaking the expected interface.
      • +
      +

      How to fix it

      +

      Add a return statement to the property method that returns the intended value.

      +

      Code examples

      +

      Noncompliant code example

      +
      +@property
      +def area(self):
      +    3.14159 * self._radius ** 2  # Noncompliant
      +
      +

      Compliant solution

      +
      +@property
      +def area(self):
      +    return 3.14159 * self._radius ** 2
      +
      +

      Resources

      +

      Documentation

      + +

      Related rules

      +
        +
      • {rule:python:S3801} - Functions should use "return" consistently
      • +
      + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8504.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8504.json new file mode 100644 index 000000000..41dda1924 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8504.json @@ -0,0 +1,23 @@ +{ + "title": "Property methods should have a return statement", + "type": "BUG", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "pitfall" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-8504", + "sqKey": "S8504", + "scope": "All", + "quickfix": "targeted", + "code": { + "impacts": { + "RELIABILITY": "HIGH" + }, + "attribute": "LOGICAL" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 2dda33b7e..051065e42 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -328,6 +328,7 @@ "S8413", "S8414", "S8415", + "S8504", "S8517" ] } diff --git a/python-checks/src/test/java/org/sonar/python/checks/PropertyMethodWithoutReturnCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/PropertyMethodWithoutReturnCheckTest.java new file mode 100644 index 000000000..e24869b8f --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/PropertyMethodWithoutReturnCheckTest.java @@ -0,0 +1,29 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.junit.jupiter.api.Test; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class PropertyMethodWithoutReturnCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/propertyMethodWithoutReturn.py", new PropertyMethodWithoutReturnCheck()); + } + +} diff --git a/python-checks/src/test/resources/checks/propertyMethodWithoutReturn.py b/python-checks/src/test/resources/checks/propertyMethodWithoutReturn.py new file mode 100644 index 000000000..941552cf0 --- /dev/null +++ b/python-checks/src/test/resources/checks/propertyMethodWithoutReturn.py @@ -0,0 +1,290 @@ +import abc +from abc import abstractmethod + + +class Rectangle: + def __init__(self, width, height): + self._width = width + self._height = height + self._area = None + + @property + def area(self): # Noncompliant {{Add a return statement to this property method.}} + self._width * self._height + + @property + def empty(self): # Compliant - pass body is intentionally empty (stub/hook pattern) + pass + + @property + def ellipsis_body(self): # Compliant - ellipsis body is intentionally empty (stub/hook pattern) + ... + + @property + def cached_area(self): # Noncompliant {{Add a return statement to this property method.}} + result = self._width * self._height + self._area = result + + @property + def description(self): # Noncompliant {{Add a return statement to this property method.}} + if self._width > self._height: + value = "landscape" + else: + value = "portrait" + + @property + def perimeter_sum(self): # Noncompliant {{Add a return statement to this property method.}} + total = 0 + for side in [self._width, self._height, self._width, self._height]: + total += side + + @property + def label(self): # Noncompliant {{Add a return statement to this property method.}} + print(f"Rectangle({self._width}x{self._height})") + self._area = self._width * self._height + + @property + def dimensions(self): # Noncompliant {{Add a return statement to this property method.}} + w = self._width + h = self._height + label = f"{w}x{h}" + self._area = w * h + + +class Circle: + def __init__(self, radius): + self._radius = radius + self._cache = {} + + @property + def radius(self): + return self._radius + + @property + def diameter(self): + if self._radius > 0: + return self._radius * 2 + return 0 + + @property + def area(self): + raise NotImplementedError("Subclass must implement area") + + @property + def none_value(self): + return None + + @property + def cached_value(self): + try: + return self._cache["value"] + except KeyError: + return self._radius * 2 + + @property + def early_return(self): + if self._radius <= 0: + return 0 + return self._radius * 3.14159 + + def compute_area(self): + self._radius * self._radius * 3.14159 + + +class AbstractShape(abc.ABC): + @property + @abstractmethod + def area(self): + pass + + @property + @abc.abstractmethod + def perimeter(self): + pass + + @property + @abstractmethod + def volume(self): # Compliant - @abstractmethod with non-empty body + self._volume = 0 + + @property + @abc.abstractmethod + def surface(self): # Compliant - @abc.abstractmethod with non-empty body + self._surface = 0 + + +class DataStream: + def __init__(self, data): + self._data = data + + @property + def values(self): + yield from self._data + + @property + def pairs(self): + for i, v in enumerate(self._data): + yield i, v + + +class NestedFunctionInProperty: + def __init__(self, value): + self._value = value + + @property + def computed(self): # Noncompliant {{Add a return statement to this property method.}} + def helper(): + return self._value * 2 + + @property + def with_nested_and_return(self): + def helper(): + return self._value * 2 + return helper() + + +class PropertyWithSetterDeleter: + def __init__(self): + self._x = 0 + + @property + def x(self): + return self._x + + @x.setter + def x(self, value): # Compliant - setter does not need a return statement + self._x = value + + @x.deleter + def x(self): # Compliant - deleter does not need a return statement + del self._x + + +class BareReturnCases: + def __init__(self): + self._value = 0 + + @property + def only_bare_return(self): + return # Compliant - has a return statement (returns None implicitly) + + @property + def bare_return_in_branch(self): + if self._value < 0: + return # Compliant - has a return statement + self._value = 0 + + +class TryCasesWithoutReturn: + def __init__(self): + self._data = {} + + @property + def no_return_in_try(self): # Noncompliant {{Add a return statement to this property method.}} + try: + self._data["key"] # result not returned, no raise in except + except KeyError: + print("missing") + + @property + def raise_only_in_except(self): # Compliant - raises in except branch + try: + return self._data["key"] + except KeyError: + raise ValueError("key not found") + + @property + def via_finally(self): # Compliant - return in finally block + try: + pass + finally: + return self._data.get("key") + + +def property(func): + """A user-defined decorator that happens to be named 'property'.""" + return func + + +class UserDefinedPropertyDecorator: + def __init__(self): + self._value = 0 + + @property + def value(self): # Compliant - built-in 'property' is shadowed by the user-defined decorator above; type matcher correctly excludes this + self._value * 2 + + +import functools + + +class FunctoolsCachedProperty: + def __init__(self, radius): + self._radius = radius + + @functools.cached_property + def area(self): # Compliant - @functools.cached_property is out of scope for this rule + self._radius * self._radius * 3.14159 + + +# ---- Protocol exemptions ---- +from typing import Protocol + + +class ReadBuffer(Protocol): + @property + def mode(self) -> str: + ... # Compliant - Protocol stub with ellipsis body + + @property + def closed(self) -> bool: + pass # Compliant - Protocol stub with pass body + + @property + def name(self) -> str: + """The name of the buffer.""" + ... # Compliant - Protocol stub with docstring + ellipsis + + +class ReadBufferWithMissingReturn(Protocol): + @property + def mode(self) -> str: # Noncompliant {{Add a return statement to this property method.}} + self._mode = "r" + + +# ---- ABC subclass exemptions (no @abstractmethod, body is pass/...) ---- +class AbstractBase(abc.ABC): + @property + def value(self): + ... # Compliant - ABC subclass with ellipsis body, conventionally abstract + + @property + def label(self): + pass # Compliant - ABC subclass with pass body, conventionally abstract + + @property + def description(self): + """Returns a description.""" + ... # Compliant - ABC subclass with docstring + ellipsis + + @property + def computed(self): # Noncompliant {{Add a return statement to this property method.}} + result = self._x * 2 + + +class PlainClassWithEmptyBody: + """A plain class (not ABC, not Protocol) - empty body is still compliant.""" + def __init__(self): + self._value = 0 + + @property + def stub(self): + pass # Compliant - pass body is always exempt regardless of class type + + @property + def stub_ellipsis(self): + ... # Compliant - ellipsis body is always exempt regardless of class type + + @property + def real_body(self): # Noncompliant {{Add a return statement to this property method.}} + self._value * 2 From abc60f7283aed2672f4daacaa949633293be3351 Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Thu, 2 Apr 2026 18:33:36 +0200 Subject: [PATCH 072/322] SONARPY-4020 S8504 Fix property shadowing tests (#1048) GitOrigin-RevId: d95038f4fc3260c5c9266d3a05f80d63da24ff2c --- .../checks/PropertyMethodWithoutReturnCheck.java | 2 +- .../PropertyMethodWithoutReturnCheckTest.java | 4 ++++ .../checks/propertyMethodWithoutReturn.py | 14 -------------- ...propertyMethodWithoutReturnShadowingProperty.py | 14 ++++++++++++++ 4 files changed, 19 insertions(+), 15 deletions(-) create mode 100644 python-checks/src/test/resources/checks/propertyMethodWithoutReturnShadowingProperty.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/PropertyMethodWithoutReturnCheck.java b/python-checks/src/main/java/org/sonar/python/checks/PropertyMethodWithoutReturnCheck.java index c7c57ff7e..c7f73a79d 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/PropertyMethodWithoutReturnCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/PropertyMethodWithoutReturnCheck.java @@ -28,7 +28,7 @@ public class PropertyMethodWithoutReturnCheck extends PythonSubscriptionCheck { private static final String MESSAGE = "Add a return statement to this property method."; - private static final TypeMatcher PROPERTY_MATCHER = TypeMatchers.isType("builtins.property"); + private static final TypeMatcher PROPERTY_MATCHER = TypeMatchers.isType("property"); private static final TypeMatcher ABSTRACT_METHOD_MATCHER = TypeMatchers.isType("abc.abstractmethod"); @Override diff --git a/python-checks/src/test/java/org/sonar/python/checks/PropertyMethodWithoutReturnCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/PropertyMethodWithoutReturnCheckTest.java index e24869b8f..50be609af 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/PropertyMethodWithoutReturnCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/PropertyMethodWithoutReturnCheckTest.java @@ -26,4 +26,8 @@ void test() { PythonCheckVerifier.verify("src/test/resources/checks/propertyMethodWithoutReturn.py", new PropertyMethodWithoutReturnCheck()); } + @Test + void test_shadowing_propery() { + PythonCheckVerifier.verifyNoIssue("src/test/resources/checks/propertyMethodWithoutReturnShadowingProperty.py", new PropertyMethodWithoutReturnCheck()); + } } diff --git a/python-checks/src/test/resources/checks/propertyMethodWithoutReturn.py b/python-checks/src/test/resources/checks/propertyMethodWithoutReturn.py index 941552cf0..5c4e6b91e 100644 --- a/python-checks/src/test/resources/checks/propertyMethodWithoutReturn.py +++ b/python-checks/src/test/resources/checks/propertyMethodWithoutReturn.py @@ -201,20 +201,6 @@ def via_finally(self): # Compliant - return in finally block return self._data.get("key") -def property(func): - """A user-defined decorator that happens to be named 'property'.""" - return func - - -class UserDefinedPropertyDecorator: - def __init__(self): - self._value = 0 - - @property - def value(self): # Compliant - built-in 'property' is shadowed by the user-defined decorator above; type matcher correctly excludes this - self._value * 2 - - import functools diff --git a/python-checks/src/test/resources/checks/propertyMethodWithoutReturnShadowingProperty.py b/python-checks/src/test/resources/checks/propertyMethodWithoutReturnShadowingProperty.py new file mode 100644 index 000000000..6059fe962 --- /dev/null +++ b/python-checks/src/test/resources/checks/propertyMethodWithoutReturnShadowingProperty.py @@ -0,0 +1,14 @@ + +def property(func): + """A user-defined decorator that happens to be named 'property'.""" + return func + + +class UserDefinedPropertyDecorator: + def __init__(self): + self._value = 0 + + @property + def value(self): # Compliant - built-in 'property' is shadowed by the user-defined decorator above; type matcher correctly excludes this + self._value * 2 + From 3690627e7fe176296a32569d3bb921e78a9bd598 Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Tue, 7 Apr 2026 13:18:46 +0200 Subject: [PATCH 073/322] SONARPY-4017 S8494 Fixing FPs on naming conventions (#1047) GitOrigin-RevId: 4088afedaa3541b3d30fe804b95102aedd1f3a88 --- .../python/checks/SlotsAssignmentCheck.java | 23 +++++++++++++-- .../test/resources/checks/slotsAssignment.py | 28 +++++++++++++++++++ 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/SlotsAssignmentCheck.java b/python-checks/src/main/java/org/sonar/python/checks/SlotsAssignmentCheck.java index 005c71819..9761beffd 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/SlotsAssignmentCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/SlotsAssignmentCheck.java @@ -110,6 +110,7 @@ private static void checkClass(SubscriptionContext ctx) { } // Check each instance method + String className = classDef.name().name(); for (FunctionDef functionDef : TreeUtils.topLevelFunctionDefs(classDef)) { PythonType funcType = functionDef.name().typeV2(); if (!(funcType instanceof FunctionType ft) || !ft.isInstanceMethod()) { @@ -118,7 +119,7 @@ private static void checkClass(SubscriptionContext ctx) { List params = TreeUtils.positionalParameters(functionDef); if (!params.isEmpty()) { String selfName = params.get(0).name().name(); - SelfAttributeAssignmentVisitor visitor = new SelfAttributeAssignmentVisitor(selfName, allowedSlots, ctx); + SelfAttributeAssignmentVisitor visitor = new SelfAttributeAssignmentVisitor(selfName, allowedSlots, className, ctx); functionDef.body().accept(visitor); } } @@ -298,11 +299,13 @@ private static boolean processParentClass(ClassDef parentClassDef, Set a private static class SelfAttributeAssignmentVisitor extends BaseTreeVisitor { private final String selfName; private final Set allowedSlots; + private final String className; private final SubscriptionContext ctx; - SelfAttributeAssignmentVisitor(String selfName, Set allowedSlots, SubscriptionContext ctx) { + SelfAttributeAssignmentVisitor(String selfName, Set allowedSlots, String className, SubscriptionContext ctx) { this.selfName = selfName; this.allowedSlots = allowedSlots; + this.className = className; this.ctx = ctx; } @@ -346,9 +349,23 @@ private void checkQualifiedExpression(Expression expr) { return; } String attrName = qualifiedExpr.name().name(); - if (!allowedSlots.contains(attrName)) { + if (!allowedSlots.contains(attrName) && !allowedSlots.contains(mangledName(attrName))) { ctx.addIssue(qualifiedExpr.name(), String.format(MESSAGE, attrName)); } } + + /** + * Returns the name-mangled form of a private attribute name within this class. + * Python mangles names starting with two underscores (but not ending with two underscores) + * by stripping leading underscores from the class name and prepending "_ClassName". + * For example, "__den" in class "_Rat" becomes "_Rat__den" (not "__Rat__den"). + * See: https://docs.python.org/3/reference/expressions.html#atom-identifiers + */ + private String mangledName(String attrName) { + if (attrName.startsWith("__") && !attrName.endsWith("__")) { + return "_" + className.replaceAll("^_+", "") + attrName; + } + return attrName; + } } } diff --git a/python-checks/src/test/resources/checks/slotsAssignment.py b/python-checks/src/test/resources/checks/slotsAssignment.py index e827d7455..8ca0a732e 100644 --- a/python-checks/src/test/resources/checks/slotsAssignment.py +++ b/python-checks/src/test/resources/checks/slotsAssignment.py @@ -802,3 +802,31 @@ class ConcatenatedSlots: def __init__(self): self.x = 1 self.missing = 2 # FN: __slots__ is a binary expression, not a literal + +# Compliant: __slots__ uses mangled names and assignments use double-underscore syntax +class Rat(object): + __slots__ = ['_Rat__num', '_Rat__den'] + + def __init__(self, num=0, den=1): + self.__num = num # Compliant: stored as _Rat__num, which is in __slots__ + self.__den = den # Compliant: stored as _Rat__den, which is in __slots__ + + +# Issue raised when attribute is not in slots even with partial mangled entries +class RatMissing(object): + __slots__ = ['_RatMissing__num'] + + def __init__(self, num=0, den=1): + self.__num = num # Compliant: stored as _RatMissing__num, which is in __slots__ + self.__den = den # Noncompliant {{Add "__den" to the class's "__slots__".}} +# ^^^^^ + + +# Compliant: class name starts with underscore — mangling strips leading underscores from class name +# Python mangles _Rat.__den to _Rat__den (not __Rat__den) +class _Rat(object): + __slots__ = ['_Rat__num', '_Rat__den'] + + def __init__(self, num=0, den=1): + self.__num = num # Compliant: stored as _Rat__num, which is in __slots__ + self.__den = den # Compliant: stored as _Rat__den, which is in __slots__ From 01f328c7e781e8306f279e0be3011f151148130b Mon Sep 17 00:00:00 2001 From: "sonar-nigel[bot]" <247337653+sonar-nigel[bot]@users.noreply.github.com> Date: Tue, 7 Apr 2026 17:18:33 +0200 Subject: [PATCH 074/322] SONARPY-3987 Fix S117 false positive for UPPERCASE params in marimo cell functions (#1030) Co-authored-by: Vibe Bot GitOrigin-RevId: a779359a4b9af41c23550f4d479b3b94070fb65e --- ...riableAndParameterNameConventionCheck.java | 3 +- ...VariableAndParameterNameIncompatibility.py | 28 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/LocalVariableAndParameterNameConventionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/LocalVariableAndParameterNameConventionCheck.java index b56168f92..ee374a68c 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/LocalVariableAndParameterNameConventionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/LocalVariableAndParameterNameConventionCheck.java @@ -40,6 +40,7 @@ import org.sonar.plugins.python.api.tree.SubscriptionExpression; import org.sonar.plugins.python.api.tree.Tree; import org.sonar.plugins.python.api.types.v2.PythonType; +import org.sonar.python.checks.utils.MarimoUtils; import org.sonar.python.semantic.SymbolUtils; import org.sonar.python.tree.TreeUtils; import org.sonar.python.types.v2.TypeCheckBuilder; @@ -170,7 +171,7 @@ private void raiseIssueForNameAndUsage(SubscriptionContext ctx, String name, Usa if (name.length() <= 1) { return; } - } else if (kind == UsageV2.Kind.PARAMETER && isParameterNameFromOverriddenMethod(usage, name)) { + } else if (kind == UsageV2.Kind.PARAMETER && (isParameterNameFromOverriddenMethod(usage, name) || MarimoUtils.isTreeInMarimoDecoratedFunction(usage.tree(), ctx))) { return; } ctx.addIssue(usage.tree(), String.format(MESSAGE, type, name, format)); diff --git a/python-checks/src/test/resources/checks/localVariableAndParameterNameIncompatibility.py b/python-checks/src/test/resources/checks/localVariableAndParameterNameIncompatibility.py index 3e63fc558..63baf38b4 100644 --- a/python-checks/src/test/resources/checks/localVariableAndParameterNameIncompatibility.py +++ b/python-checks/src/test/resources/checks/localVariableAndParameterNameIncompatibility.py @@ -145,3 +145,31 @@ def execute(self): class DerivedLongerSignature(BaseShortSignature): def execute(self, ExtraParam): # Noncompliant pass + + +import marimo + +app = marimo.App() + + +@app.cell +def _(): + TSHIRT_ORDER = ["XS", "S", "M", "L", "XL", "XXL"] + return TSHIRT_ORDER, + + +@app.cell +def _(TSHIRT_ORDER): + filtered = [size for size in TSHIRT_ORDER if size != "XXL"] + return filtered, + + +@app.cell(hide_code=True) +def _(API_KEY, DB_CONFIG): + connection_string = f"host={DB_CONFIG['host']}?key={API_KEY}" + return connection_string, + + +@app.function +def helper(INPUT_DATA): + return INPUT_DATA From 8111b33c75a9b87699143c9fd2a186ab9de0eae4 Mon Sep 17 00:00:00 2001 From: Guillaume Dequenne Date: Wed, 8 Apr 2026 16:45:20 +0200 Subject: [PATCH 075/322] Update rules metadata (#1049) GitOrigin-RevId: 5ad303c240cb4f260a5618f58d6c23872e59819f --- .../org/sonar/l10n/py/rules/python/S6863.html | 2 +- .../org/sonar/l10n/py/rules/python/S8521.html | 13 +++++++++---- .../org/sonar/l10n/py/rules/python/S8521.json | 15 ++++++++++++--- .../py/rules/python/Sonar_agentic_AI_profile.json | 1 + .../l10n/py/rules/python/Sonar_way_profile.json | 3 ++- sonarpedia.json | 2 +- 6 files changed, 26 insertions(+), 10 deletions(-) diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6863.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6863.html index 8dbca05aa..0d8c6cd41 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6863.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6863.html @@ -1,4 +1,4 @@ -

      This is an issue when a Flask error handler returns a response without explicitly specifying the HTTP status code.

      +

      This rule raises an issue when a Flask error handler returns a response without explicitly specifying the HTTP status code.

      Why is this an issue?

      Flask error handlers do not automatically set the HTTP status code based on the error type they handle. When you register an error handler with @app.errorhandler(404), Flask does not automatically return a 404 status code from that handler.

      diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8521.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8521.html index 61df253c7..1d718a935 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8521.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8521.html @@ -4,14 +4,18 @@

      Why is this an issue?

      key in dict.keys(), you are being unnecessarily verbose.

      The expression key in dict is the idiomatic Python way to check for key membership. It is:

        -
      • more readable: the intent is clearer and the code is shorter
      • -
      • slightly more efficient: it avoids creating an intermediate dictionary view object
      • -
      • more Pythonic: it follows Python's principle of having one obvious way to do it
      • +
      • more readable: the intent is clearer and the code is shorter
      • +
      • slightly more efficient: it avoids creating an intermediate dictionary view object
      • +
      • more Pythonic: it follows Python’s principle of having one obvious way to do it

      The .keys() method exists primarily for cases where you need to perform set operations on dictionary keys or when you need an explicit view object. For simple membership testing, it is redundant because dictionaries are designed to support the in operator directly.

      +

      What is the potential impact?

      +

      Unnecessarily verbose code patterns accumulate over a codebase and reduce readability. Following Python idioms makes code easier to review and +maintain, and helps new contributors understand the codebase faster.

      How to fix it

      -

      Remove the .keys() call and use direct membership testing on the dictionary.

      +

      Remove the .keys() call and use direct membership testing on the dictionary. This is the standard Python idiom for checking if a key +exists in a dictionary.

      Code examples

      Noncompliant code example

      @@ -33,3 +37,4 @@ 

      Documentation

    • Python Documentation - Mapping Types — dict
    • Python Documentation - Dictionary view objects
    + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8521.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8521.json index 0ae7d3ab3..f904a5109 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8521.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8521.json @@ -4,12 +4,21 @@ "status": "ready", "remediation": { "func": "Constant\/Issue", - "constantCost": "2min" + "constantCost": "1 min" }, - "tags": [], + "tags": [ + "pythonic", + "idiom" + ], "defaultSeverity": "Minor", "ruleSpecification": "RSPEC-8521", "sqKey": "S8521", "scope": "All", - "quickfix": "unknown" + "quickfix": "unknown", + "code": { + "impacts": { + "MAINTAINABILITY": "LOW" + }, + "attribute": "CONVENTIONAL" + } } diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_agentic_AI_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_agentic_AI_profile.json index b38549ac9..d1208cf0d 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_agentic_AI_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_agentic_AI_profile.json @@ -225,6 +225,7 @@ "S6795", "S6796", "S6799", + "S6863", "S6882", "S6883", "S6887", diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 051065e42..9d9f36aed 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -329,6 +329,7 @@ "S8414", "S8415", "S8504", - "S8517" + "S8517", + "S8521" ] } diff --git a/sonarpedia.json b/sonarpedia.json index 6e9d765b3..98a2c79b3 100644 --- a/sonarpedia.json +++ b/sonarpedia.json @@ -3,7 +3,7 @@ "languages": [ "PY" ], - "latest-update": "2026-03-31T15:01:06.932657Z", + "latest-update": "2026-04-08T07:34:47.747313Z", "options": { "no-language-in-filenames": true, "preserve-filenames": true From 4feaeccee84e465740ca1e6f6627b842b15c3882 Mon Sep 17 00:00:00 2001 From: Guillaume Dequenne Date: Thu, 9 Apr 2026 10:20:36 +0200 Subject: [PATCH 076/322] NO-JIRA Update rules metadata (#1054) GitOrigin-RevId: 29bb749ca8ba868066f5ba113eb43307ee1547ff --- .../org/sonar/l10n/py/rules/python/S2092.html | 69 ++++++++++--------- .../org/sonar/l10n/py/rules/python/S2092.json | 5 +- .../org/sonar/l10n/py/rules/python/S8494.html | 34 +++++++-- .../org/sonar/l10n/py/rules/python/S8494.json | 21 +++--- .../org/sonar/l10n/py/rules/python/S8495.html | 26 ++++++- .../org/sonar/l10n/py/rules/python/S8495.json | 11 ++- .../py/rules/python/Sonar_way_profile.json | 2 + sonarpedia.json | 2 +- 8 files changed, 113 insertions(+), 57 deletions(-) diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2092.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2092.html index 32641d7cc..c77cffa43 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2092.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2092.html @@ -1,43 +1,29 @@

    When a cookie is protected with the secure attribute set to true it will not be send by the browser over an unencrypted HTTP request and thus cannot be observed by an unauthorized person during a man-in-the-middle attack.

    -

    Ask Yourself Whether

    -
      -
    • the cookie is for instance a session-cookie not designed to be sent over non-HTTPS communication.
    • -
    • it’s not sure that the website contains mixed content or not - (ie HTTPS everywhere or not)
    • -
    -

    There is a risk if you answered yes to any of those questions.

    -

    Recommended Secure Coding Practices

    -
      -
    • It is recommended to use HTTPs everywhere so setting the secure flag to true should be the default behaviour - when creating cookies.
    • -
    • Set the secure flag to true for session-cookies.
    • -
    -

    Sensitive Code Example

    -

    Using Flask:

    -
    +

    Why is this an issue?

    +

    When a cookie is created without the secure attribute set to true, browsers will transmit it over unencrypted HTTP +connections as well as HTTPS. An attacker who can observe or intercept network traffic—for example on a public Wi-Fi network—can read the cookie value +in cleartext.

    +

    What is the potential impact?

    +

    Session hijacking

    +

    If a session cookie is transmitted over an unencrypted HTTP connection, an attacker who can intercept the traffic can steal it. With a valid +session cookie, the attacker can impersonate the victim and gain full access to their account without knowing their password. Even on sites that +primarily use HTTPS, a single HTTP request containing the session cookie is enough to expose it.

    +

    How to fix it in Flask

    +

    Pass secure=True to set_cookie to prevent the cookie from being transmitted over unencrypted HTTP connections.

    +

    Code examples

    +

    Noncompliant code example

    +
     from flask import Response
     
     @app.route('/')
     def index():
         response = Response()
    -    response.set_cookie('key', 'value')  # Sensitive
    +    response.set_cookie('key', 'value')  # Noncompliant
         return response
     
    -

    Using FastAPI:

    -
    -from fastapi import FastAPI, Response
    -
    -app = FastAPI()
    -
    -@app.get('/')
    -async def index(response: Response):
    -    response.set_cookie('key', 'value')  # Sensitive
    -    return {"message": "Hello world!"}
    -
    -

    Compliant Solution

    -

    Using Flask:

    -
    +

    Compliant solution

    +
     from flask import Response
     
     @app.route('/')
    @@ -46,8 +32,22 @@ 

    Compliant Solution

    response.set_cookie('key', 'value', secure=True) return response
    -

    Using FastAPI:

    -
    +

    How to fix it in FastAPI

    +

    Pass secure=True to set_cookie to prevent the cookie from being transmitted over unencrypted HTTP connections.

    +

    Code examples

    +

    Noncompliant code example

    +
    +from fastapi import FastAPI, Response
    +
    +app = FastAPI()
    +
    +@app.get('/')
    +async def index(response: Response):
    +    response.set_cookie('key', 'value')  # Noncompliant
    +    return {"message": "Hello world!"}
    +
    +

    Compliant solution

    +
     from fastapi import FastAPI, Response
     
     app = FastAPI()
    @@ -57,7 +57,8 @@ 

    Compliant Solution

    response.set_cookie('key', 'value', secure=True) return {"message": "Hello world!"}
    -

    See

    +

    Resources

    +

    Standards

    • OWASP - Top 10 2021 Category A4 - Insecure Design
    • OWASP - Top 10 2021 Category A5 - Security Misconfiguration
    • diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2092.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2092.json index 33f99cba2..60369ea47 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2092.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2092.json @@ -1,6 +1,7 @@ { - "title": "Creating cookies without the \"secure\" flag is security-sensitive", - "type": "SECURITY_HOTSPOT", + "title": "Cookies should have the \"secure\" flag", + "type": "VULNERABILITY", + "quickfix": "unknown", "code": { "impacts": { "SECURITY": "LOW" diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8494.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8494.html index 0623e7f3e..feaf967e5 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8494.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8494.html @@ -1,10 +1,33 @@ -

      This rule raises an issue when code assigns a value to an attribute that is not listed in the class's __slots__ declaration.

      +

      This rule raises an issue when code assigns a value to an attribute that is not listed in the class’s __slots__ declaration.

      Why is this an issue?

      -

      In Python, the __slots__ class attribute is used to explicitly declare which instance attributes a class can have. When a class defines -__slots__, Python restricts instances to only those attributes, preventing the creation of new attributes dynamically.

      -

      Assigning to an attribute that is not in __slots__ causes Python to raise an AttributeError at runtime.

      +

      In Python, the __slots__ class attribute is used to explicitly declare which instance attributes a class can have. When a class +defines __slots__, Python restricts instances to only those attributes, preventing the creation of new attributes dynamically.

      +

      This restriction serves several purposes:

      +
        +
      • memory efficiency: instances use less memory because Python does not create a __dict__ for each instance
      • +
      • faster attribute access: attribute lookups are faster with __slots__
      • +
      • explicit interface: the class clearly declares which attributes it supports
      • +
      +

      Assigning to an attribute that is not in __slots__ causes Python to raise an AttributeError at runtime:

      +
      +class Point:
      +    __slots__ = ['x', 'y']
      +
      +p = Point()
      +p.x = 10  # OK
      +p.z = 20  # Raises AttributeError: 'Point' object has no attribute 'z'
      +
      +

      What is the potential impact?

      +

      When code attempts to assign to an attribute not in __slots__, the application will crash with an AttributeError at +runtime. This can lead to:

      +
        +
      • application crashes: the error will terminate the current operation unless properly handled
      • +
      • data loss: if the assignment happens during a data processing operation, partial results may be lost
      • +
      • poor user experience: users may encounter unexpected errors during normal operations
      • +
      • difficult debugging: the error may only occur in specific scenarios, making it hard to reproduce and fix
      • +

      How to fix it

      -

      Add the missing attribute to the __slots__ declaration.

      +

      If the attribute should be part of the class’s interface, add it to the __slots__ declaration.

      Code examples

      Noncompliant code example

      @@ -31,3 +54,4 @@ 

      Documentation

      + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8494.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8494.json index 15f6e916d..d59eda7e6 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8494.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8494.json @@ -1,21 +1,24 @@ { "title": "Attributes should only be assigned if they are declared in \"__slots__\"", "type": "BUG", - "code": { - "impacts": { - "RELIABILITY": "BLOCKER" - }, - "attribute": "LOGICAL" - }, "status": "ready", "remediation": { "func": "Constant\/Issue", - "constantCost": "5min" + "constantCost": "5 min" }, - "tags": [], + "tags": [ + "pitfall", + "slots" + ], "defaultSeverity": "Blocker", "ruleSpecification": "RSPEC-8494", "sqKey": "S8494", "scope": "All", - "quickfix": "unknown" + "quickfix": "unknown", + "code": { + "impacts": { + "RELIABILITY": "BLOCKER" + }, + "attribute": "LOGICAL" + } } diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8495.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8495.html index 9d4833cd6..24cca90ef 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8495.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8495.html @@ -10,6 +10,7 @@

      Why is this an issue?

      else: return (value, value * 2) # Returns a 2-tuple +# Caller has no reliable way to unpack this result = process_data(10) x, y = result # ValueError if value > 0!
      @@ -20,8 +21,8 @@

      What is the potential impact?

      Runtime errors from tuple unpacking may not surface during initial testing if certain code paths are not fully exercised, leading to production failures. The need for defensive length-checking also increases the maintenance burden and makes the API harder to document for new team members.

      How to fix it

      -

      Make all return statements return tuples of the same length. Add placeholder values (like None or 0) to shorter tuples -to maintain consistency.

      +

      Make all return statements return tuples of the same length. Add placeholder values (like None or 0) to shorter tuples to +maintain consistency.

      Code examples

      Noncompliant code example

      @@ -41,9 +42,28 @@ 

      Compliant solution

      average = total / len(numbers) return (total, average)
      +

      Going the extra mile

      +

      For complex return types, consider using typing.NamedTuple to make the return value self-documenting. Named tuples provide clear field +names and enforce a consistent structure, making the API easier to use and understand.

      +
      +from typing import NamedTuple
      +
      +class Stats(NamedTuple):
      +    total: float
      +    average: float
      +
      +def calculate_stats(numbers) -> Stats:
      +    if not numbers:
      +        return Stats(total=0, average=0)
      +    total = sum(numbers)
      +    average = total / len(numbers)
      +    return Stats(total=total, average=average)
      +

      Resources

      Documentation

      + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8495.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8495.json index 6eba8fc87..200899a21 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8495.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8495.json @@ -4,9 +4,13 @@ "status": "ready", "remediation": { "func": "Constant\/Issue", - "constantCost": "5min" + "constantCost": "10 min" }, - "tags": [], + "tags": [ + "pitfall", + "api-design", + "type-system" + ], "defaultSeverity": "Major", "ruleSpecification": "RSPEC-8495", "sqKey": "S8495", @@ -14,8 +18,9 @@ "quickfix": "unknown", "code": { "impacts": { + "RELIABILITY": "HIGH", "MAINTAINABILITY": "HIGH" }, - "attribute": "CONVENTIONAL" + "attribute": "CLEAR" } } diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 9d9f36aed..fb8d99c74 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -328,6 +328,8 @@ "S8413", "S8414", "S8415", + "S8494", + "S8495", "S8504", "S8517", "S8521" diff --git a/sonarpedia.json b/sonarpedia.json index 98a2c79b3..042efe1a2 100644 --- a/sonarpedia.json +++ b/sonarpedia.json @@ -3,7 +3,7 @@ "languages": [ "PY" ], - "latest-update": "2026-04-08T07:34:47.747313Z", + "latest-update": "2026-04-09T08:05:06.976620Z", "options": { "no-language-in-filenames": true, "preserve-filenames": true From 045364832a2eb8c2e8ad0de8ef53cd8dd96cf266 Mon Sep 17 00:00:00 2001 From: "hashicorp-vault-sonar-prod[bot]" <111297361+hashicorp-vault-sonar-prod[bot]@users.noreply.github.com> Date: Thu, 9 Apr 2026 14:13:42 +0200 Subject: [PATCH 077/322] Prepare for next development iteration (#1055) Co-authored-by: guillaume-dequenne <54781802+guillaume-dequenne@users.noreply.github.com> GitOrigin-RevId: 61e92e955a284152e682afea5094a7a597b4741d --- docs/pom.xml | 2 +- docs/python-custom-rules-example/pom.xml | 2 +- its/commons/pom.xml | 2 +- its/plugin/it-python-plugin-test/pom.xml | 2 +- its/plugin/pom.xml | 2 +- its/plugin/python-custom-rules-plugin/pom.xml | 2 +- its/pom.xml | 2 +- pom.xml | 2 +- python-checks-testkit/pom.xml | 2 +- python-checks/pom.xml | 2 +- python-commons/pom.xml | 2 +- python-frontend/pom.xml | 2 +- sonar-python-plugin/pom.xml | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/pom.xml b/docs/pom.xml index 5d47b5eb7..9905e4b70 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.python python - 5.21-SNAPSHOT + 5.22-SNAPSHOT docs diff --git a/docs/python-custom-rules-example/pom.xml b/docs/python-custom-rules-example/pom.xml index ac2a78120..9064ddb1c 100644 --- a/docs/python-custom-rules-example/pom.xml +++ b/docs/python-custom-rules-example/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python docs - 5.21-SNAPSHOT + 5.22-SNAPSHOT python-custom-rules-example diff --git a/its/commons/pom.xml b/its/commons/pom.xml index 61efaa5c5..0fd22e90b 100644 --- a/its/commons/pom.xml +++ b/its/commons/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python python-its - 5.21-SNAPSHOT + 5.22-SNAPSHOT Python :: ITs :: Commons diff --git a/its/plugin/it-python-plugin-test/pom.xml b/its/plugin/it-python-plugin-test/pom.xml index a8a8f9065..39398d10a 100644 --- a/its/plugin/it-python-plugin-test/pom.xml +++ b/its/plugin/it-python-plugin-test/pom.xml @@ -7,7 +7,7 @@ it-python-plugin org.sonarsource.python - 5.21-SNAPSHOT + 5.22-SNAPSHOT it-python-plugin-test diff --git a/its/plugin/pom.xml b/its/plugin/pom.xml index 5b8f257d7..63dfd0502 100644 --- a/its/plugin/pom.xml +++ b/its/plugin/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.python python-its - 5.21-SNAPSHOT + 5.22-SNAPSHOT diff --git a/its/plugin/python-custom-rules-plugin/pom.xml b/its/plugin/python-custom-rules-plugin/pom.xml index d524a08f5..0ffa9db98 100644 --- a/its/plugin/python-custom-rules-plugin/pom.xml +++ b/its/plugin/python-custom-rules-plugin/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python it-python-plugin - 5.21-SNAPSHOT + 5.22-SNAPSHOT python-custom-rules-plugin diff --git a/its/pom.xml b/its/pom.xml index 22a5f2cae..066032741 100644 --- a/its/pom.xml +++ b/its/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.python python - 5.21-SNAPSHOT + 5.22-SNAPSHOT python-its diff --git a/pom.xml b/pom.xml index febc85c9c..5d56ed11c 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ org.sonarsource.python python - 5.21-SNAPSHOT + 5.22-SNAPSHOT pom Python diff --git a/python-checks-testkit/pom.xml b/python-checks-testkit/pom.xml index 48d7eb5c0..b1d0afe70 100644 --- a/python-checks-testkit/pom.xml +++ b/python-checks-testkit/pom.xml @@ -6,7 +6,7 @@ python org.sonarsource.python - 5.21-SNAPSHOT + 5.22-SNAPSHOT python-checks-testkit diff --git a/python-checks/pom.xml b/python-checks/pom.xml index c642e8a86..353af290e 100644 --- a/python-checks/pom.xml +++ b/python-checks/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.python python - 5.21-SNAPSHOT + 5.22-SNAPSHOT python-checks diff --git a/python-commons/pom.xml b/python-commons/pom.xml index beaed920f..2cd107c94 100644 --- a/python-commons/pom.xml +++ b/python-commons/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python python - 5.21-SNAPSHOT + 5.22-SNAPSHOT python-commons diff --git a/python-frontend/pom.xml b/python-frontend/pom.xml index 395bf937a..a0f1674cf 100644 --- a/python-frontend/pom.xml +++ b/python-frontend/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python python - 5.21-SNAPSHOT + 5.22-SNAPSHOT python-frontend diff --git a/sonar-python-plugin/pom.xml b/sonar-python-plugin/pom.xml index efbec4770..f8ae2ea8e 100644 --- a/sonar-python-plugin/pom.xml +++ b/sonar-python-plugin/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python python - 5.21-SNAPSHOT + 5.22-SNAPSHOT sonar-python-plugin From 8744029d5842cf7485ccff1b192242e1044feaae Mon Sep 17 00:00:00 2001 From: "sonar-nigel[bot]" <247337653+sonar-nigel[bot]@users.noreply.github.com> Date: Thu, 9 Apr 2026 14:31:02 +0200 Subject: [PATCH 078/322] SONARPY-3960 Rule S8502 "set.update()" should be used instead of a for-loop with "add()" (#997) Co-authored-by: Marc Jasper GitOrigin-RevId: fe167c270ae6ebb80df1f9e804c3671a1680c168 --- .../python/checks/OpenSourceCheckList.java | 1 + .../checks/SetUpdateOverForLoopCheck.java | 142 +++++++++++++++ .../org/sonar/l10n/py/rules/python/S8502.html | 30 ++++ .../org/sonar/l10n/py/rules/python/S8502.json | 21 +++ .../checks/SetUpdateOverForLoopCheckTest.java | 78 +++++++++ .../resources/checks/setUpdateOverForLoop.py | 161 ++++++++++++++++++ 6 files changed, 433 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/SetUpdateOverForLoopCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8502.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8502.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/SetUpdateOverForLoopCheckTest.java create mode 100644 python-checks/src/test/resources/checks/setUpdateOverForLoop.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index de7d36ca7..a7d68da89 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -397,6 +397,7 @@ public Stream> getChecks() { SecureModeEncryptionAlgorithmsCheck.class, SelfAssignmentCheck.class, SetDuplicateKeyCheck.class, + SetUpdateOverForLoopCheck.class, SideEffectInTfFunctionCheck.class, SillyEqualityCheck.class, SillyIdentityCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/SetUpdateOverForLoopCheck.java b/python-checks/src/main/java/org/sonar/python/checks/SetUpdateOverForLoopCheck.java new file mode 100644 index 000000000..3059173a9 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/SetUpdateOverForLoopCheck.java @@ -0,0 +1,142 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.quickfix.PythonQuickFix; +import org.sonar.plugins.python.api.symbols.v2.SymbolV2; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.ExpressionStatement; +import org.sonar.plugins.python.api.tree.ForStatement; +import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.QualifiedExpression; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.tree.UnpackingExpression; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.quickfix.TextEditUtils; +import org.sonar.python.tree.TreeUtils; + +@Rule(key = "S8502") +public class SetUpdateOverForLoopCheck extends PythonSubscriptionCheck { + + private static final TypeMatcher SET_TYPE_MATCHER = TypeMatchers.isObjectOfType("builtins.set"); + + private static final String MESSAGE = "Use \"set.update()\" instead of a for-loop with \"add()\"."; + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.FOR_STMT, SetUpdateOverForLoopCheck::checkForStatement); + } + + private static void checkForStatement(SubscriptionContext ctx) { + ForStatement forStatement = (ForStatement) ctx.syntaxNode(); + + if (forStatement.expressions().size() != 1) { + return; + } + if (forStatement.elseClause() != null) { + return; + } + Expression loopVarExpr = forStatement.expressions().get(0); + if (!(loopVarExpr instanceof Name loopVar)) { + return; + } + if (forStatement.testExpressions().size() != 1) { + return; + } + Expression iterable = forStatement.testExpressions().get(0); + + CallExpression callExpr = extractSingleBodyCallExpression(forStatement); + if (callExpr == null) { + return; + } + if (!(callExpr.callee() instanceof QualifiedExpression qualifiedExpr)) { + return; + } + // TypeMatchers operate on types, not method names; the callee name must be checked syntactically + if (!"add".equals(qualifiedExpr.name().name())) { + return; + } + Expression receiver = qualifiedExpr.qualifier(); + + // Exclude transient objects like get_set().add(item) + if (receiver instanceof CallExpression) { + return; + } + if (!SET_TYPE_MATCHER.isTrueFor(receiver, ctx)) { + return; + } + if (!isLoopVariableTheOnlyArgument(callExpr, loopVar)) { + return; + } + + PreciseIssue issue = ctx.addIssue(qualifiedExpr, MESSAGE); + addQuickFix(issue, forStatement, receiver, iterable); + } + + private static boolean isLoopVariableTheOnlyArgument(CallExpression callExpr, Name loopVar) { + if (callExpr.arguments().size() != 1) { + return false; + } + if (!(callExpr.arguments().get(0) instanceof RegularArgument regularArgument)) { + return false; + } + if (regularArgument.keywordArgument() != null) { + return false; + } + Expression argExpr = regularArgument.expression(); + if (argExpr instanceof UnpackingExpression || !(argExpr instanceof Name argName)) { + return false; + } + SymbolV2 loopVarSymbol = loopVar.symbolV2(); + return loopVarSymbol != null && loopVarSymbol.equals(argName.symbolV2()); + } + + private static CallExpression extractSingleBodyCallExpression(ForStatement forStatement) { + if (forStatement.body().statements().size() != 1) { + return null; + } + if (!(forStatement.body().statements().get(0) instanceof ExpressionStatement exprStmt)) { + return null; + } + if (exprStmt.expressions().size() != 1) { + return null; + } + if (!(exprStmt.expressions().get(0) instanceof CallExpression callExpr)) { + return null; + } + return callExpr; + } + + private static void addQuickFix(PreciseIssue issue, ForStatement forStatement, Expression receiver, Expression iterable) { + String receiverText = TreeUtils.treeToString(receiver, false); + String iterableText = TreeUtils.treeToString(iterable, false); + if (receiverText == null || iterableText == null) { + return; + } + + String replacement = receiverText + ".update(" + iterableText + ")"; + + PythonQuickFix quickFix = PythonQuickFix.newQuickFix("Use \"set.update()\" instead", TextEditUtils.replace(forStatement, replacement)); + issue.addQuickFix(quickFix); + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8502.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8502.html new file mode 100644 index 000000000..069f13775 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8502.html @@ -0,0 +1,30 @@ +

      This rule raises an issue when a for-loop is used to add all elements from one collection to a set using the add() method.

      +

      Why is this an issue?

      +

      Adding elements to a set one at a time in a loop is unnecessary when the update() method exists. The update() method +combines all additions into a single call and avoids the overhead of repeated add() invocations. Using update() improves +readability and removes redundant method call overhead. In loops or performance-critical code, the difference can become measurable.

      +

      How to fix it

      +

      Replace the for-loop with a single update() call. The method accepts any iterable.

      +

      Code examples

      +

      Noncompliant code example

      +
      +my_set = {1, 2, 3}
      +other_collection = [4, 5, 6]
      +
      +for element in other_collection:
      +    my_set.add(element)  # Noncompliant
      +
      +

      Compliant solution

      +
      +my_set = {1, 2, 3}
      +other_collection = [4, 5, 6]
      +
      +my_set.update(other_collection)
      +
      +

      Resources

      +

      Documentation

      + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8502.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8502.json new file mode 100644 index 000000000..74322bd6b --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8502.json @@ -0,0 +1,21 @@ +{ + "title": "\"set.update()\" should be used instead of a for-loop with \"add()\"", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [], + "defaultSeverity": "Minor", + "ruleSpecification": "RSPEC-8502", + "sqKey": "S8502", + "scope": "All", + "quickfix": "targeted", + "code": { + "impacts": { + "MAINTAINABILITY": "LOW" + }, + "attribute": "CONVENTIONAL" + } +} diff --git a/python-checks/src/test/java/org/sonar/python/checks/SetUpdateOverForLoopCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/SetUpdateOverForLoopCheckTest.java new file mode 100644 index 000000000..c07c2dcc0 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/SetUpdateOverForLoopCheckTest.java @@ -0,0 +1,78 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.junit.jupiter.api.Test; +import org.sonar.python.checks.quickfix.PythonQuickFixVerifier; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class SetUpdateOverForLoopCheckTest { + + private static final SetUpdateOverForLoopCheck check = new SetUpdateOverForLoopCheck(); + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/setUpdateOverForLoop.py", check); + } + + @Test + void test_quick_fix() { + String codeWithIssue = """ + my_set = set() + other_collection = [4, 5, 6] + for element in other_collection: + my_set.add(element) + """; + + PythonQuickFixVerifier.verifyQuickFixMessages(check, codeWithIssue, "Use \"set.update()\" instead"); + + String correctCode = """ + my_set = set() + other_collection = [4, 5, 6] + my_set.update(other_collection)"""; + + PythonQuickFixVerifier.verify(check, codeWithIssue, correctCode); + } + + @Test + void test_no_quick_fix_on_multiline_iterable() { + String codeWithIssue = """ + my_set = set() + for element in [ + 1, + 2, + 3, + ]: + my_set.add(element) + """; + + PythonQuickFixVerifier.verifyNoQuickFixes(check, codeWithIssue); + } + + @Test + void test_no_quick_fix_on_multiline_receiver() { + String codeWithIssue = """ + my_set = set() + items = [1, 2, 3] + for element in items: + (my_set + ).add(element) + """; + + PythonQuickFixVerifier.verifyNoQuickFixes(check, codeWithIssue); + } +} diff --git a/python-checks/src/test/resources/checks/setUpdateOverForLoop.py b/python-checks/src/test/resources/checks/setUpdateOverForLoop.py new file mode 100644 index 000000000..f209ca155 --- /dev/null +++ b/python-checks/src/test/resources/checks/setUpdateOverForLoop.py @@ -0,0 +1,161 @@ + +def noncompliant_basic(): + my_set = {1, 2, 3} + other_collection = [4, 5, 6] + for element in other_collection: + my_set.add(element) # Noncompliant {{Use "set.update()" instead of a for-loop with "add()".}} + # ^^^^^^^^^^ + + +def noncompliant_multiline_iterable(): + my_set = set() + for element in [ + 1, + 2, + 3, + ]: + my_set.add(element) # Noncompliant + # ^^^^^^^^^^ + + +def noncompliant_multiline_receiver(): + my_set = set() + items = [1, 2, 3] + for item in items: + (my_set # Noncompliant + ).add(item) + + +def compliant_tuple_unpacking_loop_var(): + my_set = set() + pairs = [(1, "a"), (2, "b")] + for k, v in pairs: + my_set.add(k) + + +def compliant_tuple_pattern_loop_var(): + my_set = set() + pairs = [(1, 2), (3, 4)] + for (a, b) in pairs: + my_set.add(a) + + +def compliant_multiple_iterables(): + my_set = set() + a = [1, 2] + b = [3, 4] + for x in a, b: + my_set.add(x) + + +def compliant_multiple_body_statements(): + my_set = set() + log = [] + items = [1, 2, 3] + for item in items: + log.append(item) + my_set.add(item) + + +def compliant_conditional_in_body(): + my_set = set() + items = range(10) + for item in items: + if item % 2 == 0: + my_set.add(item) + + +def compliant_expression_tuple_in_body(): + my_set = set() + items = [1, 2, 3] + for item in items: + item, item + + +def compliant_non_call_in_body(): + my_set = set() + items = [1, 2, 3] + for item in items: + item + + +def compliant_bare_function_call(): + my_set = set() + items = [1, 2, 3] + for item in items: + print(item) + + +def compliant_method_not_add(): + my_set = set() + items = [1, 2, 3] + for item in items: + my_set.discard(item) + + +def get_set(): + return set() + + +def compliant_receiver_is_call(): + items = [1, 2, 3] + for item in items: + get_set().add(item) + + +def compliant_unknown_receiver_type(unknown_receiver, items): + for item in items: + unknown_receiver.add(item) + + +def compliant_no_argument(): + my_set = set() + for item in [1, 2, 3]: + my_set.add() + + +def compliant_starred_argument(): + my_set = set() + args = (1,) + for item in [1, 2, 3]: + my_set.add(*args) + + +def compliant_keyword_argument(): + my_set = set() + for item in [1, 2, 3]: + my_set.add(elem=item) + + +def compliant_transformed_argument(): + my_set = set() + items = [1, 2, 3] + for item in items: + my_set.add(item * 2) + + +def compliant_different_variable(): + my_set = set() + other = "fixed_value" + items = [1, 2, 3] + for item in items: + my_set.add(other) + + +def compliant_for_else(): + my_set = set() + items = [1, 2, 3] + for item in items: + my_set.add(item) + else: + fallback() + + +class MyClass: + def __init__(self): + self.seen: set = set() + + def process(self, items): + # FN: instance attribute type not inferred across methods + for item in items: + self.seen.add(item) From cc5343658b2308a64e813b825f6f8a4a4e6c2b58 Mon Sep 17 00:00:00 2001 From: "sonar-nigel[bot]" <247337653+sonar-nigel[bot]@users.noreply.github.com> Date: Thu, 9 Apr 2026 14:30:31 +0000 Subject: [PATCH 079/322] SONARPY-3985 Fix S3457 false positive for f-strings in marimo SQL cells (#1043) Co-authored-by: Vibe Bot Co-authored-by: Sebastian Zumbrunn GitOrigin-RevId: 0f0c179885f2f4b46af00c1ae9b8afcffebdff17 --- .../checks/StringFormatCorrectnessCheck.java | 24 ++++++++++++++++++- .../checks/stringFormatCorrectness.py | 23 ++++++++++++++++++ .../types/custom_protobuf/marimo.protobuf | 7 ++++++ .../checksums/custom.checksum | 4 ++-- .../resources/custom/marimo/__init__.pyi | 2 ++ 5 files changed, 57 insertions(+), 3 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/StringFormatCorrectnessCheck.java b/python-checks/src/main/java/org/sonar/python/checks/StringFormatCorrectnessCheck.java index 1959df13b..ac24c85b3 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/StringFormatCorrectnessCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/StringFormatCorrectnessCheck.java @@ -26,6 +26,9 @@ import org.sonar.check.Rule; import org.sonar.plugins.python.api.SubscriptionContext; import org.sonar.plugins.python.api.symbols.Symbol; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.plugins.python.api.tree.ArgList; import org.sonar.plugins.python.api.tree.BinaryExpression; import org.sonar.plugins.python.api.tree.CallExpression; import org.sonar.plugins.python.api.tree.DictionaryLiteral; @@ -44,6 +47,8 @@ @Rule(key = "S3457") public class StringFormatCorrectnessCheck extends AbstractStringFormatCheck { + private static final TypeMatcher MARIMO_SQL_MATCHER = TypeMatchers.isType("marimo.sql"); + private static final Set LOGGER_FULL_NAMES = new HashSet<>(Arrays.asList( "logging.debug", "logging.info", "logging.warning", "logging.error", "logging.critical", "logging.Logger.debug", "logging.Logger.info", "logging.Logger.warning", "logging.Logger.error", "logging.Logger.critical" @@ -114,11 +119,28 @@ private static void checkFStringLiteral(SubscriptionContext ctx) { .filter(stringElement -> stringElement.prefix().toLowerCase(Locale.ENGLISH).contains("f")) .toList(); - if (!fStrings.isEmpty() && fStrings.stream().allMatch(str -> str.formattedExpressions().isEmpty())) { + if (!fStrings.isEmpty() && fStrings.stream().allMatch(str -> str.formattedExpressions().isEmpty()) + && !isMarimoSqlArgument(literal, ctx)) { ctx.addIssue(literal, "Add replacement fields or use a normal string instead of an f-string."); } } + private static boolean isMarimoSqlArgument(StringLiteral literal, SubscriptionContext ctx) { + Tree parent = literal.parent(); + if (!(parent instanceof RegularArgument)) { + return false; + } + Tree argList = parent.parent(); + if (!(argList instanceof ArgList)) { + return false; + } + Tree callParent = argList.parent(); + if (!(callParent instanceof CallExpression callExpression)) { + return false; + } + return MARIMO_SQL_MATCHER.isTrueFor(callExpression.callee(), ctx); + } + private static void checkLoggerLog(SubscriptionContext ctx, CallExpression callExpression) { if (callExpression.arguments().isEmpty() || callExpression.arguments().stream().anyMatch(argument -> !argument.is(Tree.Kind.REGULAR_ARGUMENT))) { return; diff --git a/python-checks/src/test/resources/checks/stringFormatCorrectness.py b/python-checks/src/test/resources/checks/stringFormatCorrectness.py index c88ac4ece..0592c8686 100644 --- a/python-checks/src/test/resources/checks/stringFormatCorrectness.py +++ b/python-checks/src/test/resources/checks/stringFormatCorrectness.py @@ -119,3 +119,26 @@ def edge_case(): no_such_function('hello') l4 = no_such_function('') l4.error("Foo %s", "Bar", "too many") + + +import marimo as mo + +def marimo_sql(): + mo.sql(f"SELECT * FROM table") + mo.sql( + f""" + SELECT plugin_rule_key, COUNT(*) as cnt + FROM issues + GROUP BY plugin_rule_key + """ + ) + engine = None + mo.sql( + f""" + SELECT id, name + FROM users + WHERE active = 1 + """, + engine=engine + ) + diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/marimo.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/marimo.protobuf index aaf0cdc2c..5a4252c35 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/marimo.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/marimo.protobuf @@ -31,6 +31,13 @@ marimo.App* args Any* kwargs +AnyX +sql +marimo.sql" +Any*' +query + builtins.str" builtins.str* +kwargs Any*g __path__marimo.__path__J builtins.list[builtins.str] diff --git a/python-frontend/typeshed_serializer/checksums/custom.checksum b/python-frontend/typeshed_serializer/checksums/custom.checksum index c326e1dbe..909367350 100644 --- a/python-frontend/typeshed_serializer/checksums/custom.checksum +++ b/python-frontend/typeshed_serializer/checksums/custom.checksum @@ -1,2 +1,2 @@ -669032ff87c6a7027931d1987597a4371fc80b9da0f7817762518ec75d1fa357 -8a2fb0e2abba9b8e562913a29440ec31c7fd322f0c31d2d64d9a6c9591b444ed \ No newline at end of file +4ed5a5d152958ba1e643059b3f9957815405f44596c64d268aa525aab7c74b5e +4394f7b9850885f1aab48413ba65f330a2c5c83a626202c0075d44b217f37643 diff --git a/python-frontend/typeshed_serializer/resources/custom/marimo/__init__.pyi b/python-frontend/typeshed_serializer/resources/custom/marimo/__init__.pyi index 7a173b7e1..c1e9c4923 100644 --- a/python-frontend/typeshed_serializer/resources/custom/marimo/__init__.pyi +++ b/python-frontend/typeshed_serializer/resources/custom/marimo/__init__.pyi @@ -5,3 +5,5 @@ class App(CustomStubBase): def __init__(self, *args: Any, **kwargs: Any) -> None: ... def cell(self, *args: Any, **kwargs: Any) -> Any: ... def function(self, *args: Any, **kwargs: Any) -> Any: ... + +def sql(query: str, **kwargs: Any) -> Any: ... From f1db8bd288312f612aa9487bcdf66e07e9fb0d46 Mon Sep 17 00:00:00 2001 From: "sonar-nigel[bot]" <247337653+sonar-nigel[bot]@users.noreply.github.com> Date: Fri, 10 Apr 2026 09:25:30 +0200 Subject: [PATCH 080/322] SONARPY-3976 Rule S8520 "sum()" should not be used with an empty list to concatenate lists (#1012) Co-authored-by: Marc Jasper GitOrigin-RevId: fd5138cf008f8139622f3a830a86663d9fe73325 --- .../python/checks/OpenSourceCheckList.java | 1 + .../checks/SumListConcatenationCheck.java | 63 +++++++++++++++++++ .../org/sonar/l10n/py/rules/python/S8520.html | 38 +++++++++++ .../org/sonar/l10n/py/rules/python/S8520.json | 24 +++++++ .../py/rules/python/Sonar_way_profile.json | 1 + .../checks/SumListConcatenationCheckTest.java | 29 +++++++++ .../resources/checks/sumListConcatenation.py | 44 +++++++++++++ 7 files changed, 200 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/SumListConcatenationCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8520.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8520.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/SumListConcatenationCheckTest.java create mode 100644 python-checks/src/test/resources/checks/sumListConcatenation.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index a7d68da89..7c48fa2bf 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -418,6 +418,7 @@ public Stream> getChecks() { StringLiteralDuplicationCheck.class, StringReplaceCheck.class, StrongCryptographicKeysCheck.class, + SumListConcatenationCheck.class, SklearnCachedPipelineDontAccessTransformersCheck.class, MissingHyperParameterCheck.class, NetworkCallsWithoutTimeoutsInLambdaCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/SumListConcatenationCheck.java b/python-checks/src/main/java/org/sonar/python/checks/SumListConcatenationCheck.java new file mode 100644 index 000000000..11fc05e27 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/SumListConcatenationCheck.java @@ -0,0 +1,63 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import javax.annotation.Nullable; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.ListLiteral; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.tree.TreeUtils; + +@Rule(key = "S8520") +public class SumListConcatenationCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Use \"itertools.chain.from_iterable()\" instead of \"sum()\" to flatten or concatenate lists."; + private static final TypeMatcher SUM_MATCHER = TypeMatchers.isType("sum"); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, SumListConcatenationCheck::checkCall); + } + + private static void checkCall(SubscriptionContext ctx) { + CallExpression call = (CallExpression) ctx.syntaxNode(); + if (!SUM_MATCHER.isTrueFor(call.callee(), ctx)) { + return; + } + RegularArgument startArgument = TreeUtils.nthArgumentOrKeyword(1, "start", call.arguments()); + if (isEmptyListLiteral(startArgument)) { + ctx.addIssue(call, MESSAGE); + } + } + + private static boolean isEmptyListLiteral(@Nullable RegularArgument argument) { + if (argument == null) { + return false; + } + if (!argument.expression().is(Tree.Kind.LIST_LITERAL)) { + return false; + } + ListLiteral listLiteral = (ListLiteral) argument.expression(); + return listLiteral.elements().expressions().isEmpty(); + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8520.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8520.html new file mode 100644 index 000000000..fb3b285ec --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8520.html @@ -0,0 +1,38 @@ +

      This rule raises an issue when sum() is called with an empty list ([]) as the start parameter to concatenate or flatten +lists.

      +

      Why is this an issue?

      +

      Using sum(list_of_lists, []) to concatenate lists is a common anti-pattern in Python. Because each + concatenation +creates a new list and copies all previous elements into it, the overall operation has quadratic time complexity O(n2) instead of the +linear O(n) that proper alternatives achieve.

      +

      Additionally, sum() is designed for numeric addition, not list operations. Using it for lists is semantically unclear and may confuse +other developers reading the code.

      +

      What is the potential impact?

      +
        +
      • performance degradation: operations that should take milliseconds can take seconds or even minutes with large datasets
      • +
      • memory pressure: each intermediate concatenation allocates a new list, creating unnecessary memory overhead
      • +
      • scalability issues: code that works fine in development with small datasets may become unusable in production
      • +
      +

      How to fix it

      +

      Code examples

      +

      Noncompliant code example

      +
      +list_of_lists = [[1, 2], [3, 4], [5, 6]]
      +result = sum(list_of_lists, [])  # Noncompliant
      +
      +

      Compliant solution

      +
      +import itertools
      +
      +list_of_lists = [[1, 2], [3, 4], [5, 6]]
      +result = list(itertools.chain.from_iterable(list_of_lists))
      +
      +

      How does this work?

      +

      itertools.chain.from_iterable() creates an iterator that yields elements from each sub-list in sequence without creating intermediate +list copies. This avoids the repeated copying that causes the quadratic behavior of sum() and results in linear O(n) time complexity.

      +

      Resources

      +

      Documentation

      + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8520.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8520.json new file mode 100644 index 000000000..7e638c3e6 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8520.json @@ -0,0 +1,24 @@ +{ + "title": "\"sum()\" should not be used with an empty list to concatenate lists", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "performance", + "pitfall" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-8520", + "sqKey": "S8520", + "scope": "All", + "quickfix": "unknown", + "code": { + "impacts": { + "RELIABILITY": "HIGH" + }, + "attribute": "EFFICIENT" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index fb8d99c74..231a4b032 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -332,6 +332,7 @@ "S8495", "S8504", "S8517", + "S8520", "S8521" ] } diff --git a/python-checks/src/test/java/org/sonar/python/checks/SumListConcatenationCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/SumListConcatenationCheckTest.java new file mode 100644 index 000000000..015e97721 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/SumListConcatenationCheckTest.java @@ -0,0 +1,29 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.junit.jupiter.api.Test; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class SumListConcatenationCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/sumListConcatenation.py", new SumListConcatenationCheck()); + } + +} diff --git a/python-checks/src/test/resources/checks/sumListConcatenation.py b/python-checks/src/test/resources/checks/sumListConcatenation.py new file mode 100644 index 000000000..b5d9bff4c --- /dev/null +++ b/python-checks/src/test/resources/checks/sumListConcatenation.py @@ -0,0 +1,44 @@ +list_of_lists = [[1, 2], [3, 4]] + + +def noncompliant_empty_list_as_start(): + sum(list_of_lists, []) # Noncompliant {{Use "itertools.chain.from_iterable()" instead of "sum()" to flatten or concatenate lists.}} +# ^^^^^^^^^^^^^^^^^^^^^^ + + +def noncompliant_start_keyword_argument(): + sum(list_of_lists, start=[]) # Noncompliant {{Use "itertools.chain.from_iterable()" instead of "sum()" to flatten or concatenate lists.}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +def compliant_callee_is_not_builtin_sum(other_sum): + def sum(iterable, start): + result = start + for item in iterable: + result = result + item + return result + + sum([[1, 2]], []) + other_sum([[1, 2]], []) + + +def compliant_no_start_argument(): + sum([1, 2, 3]) + sum() + + +def compliant_start_not_empty_list_literal(): + sum(list_of_lists, [0]) + + +def compliant_start_not_list_literal(): + sum(list_of_lists, 10) + + +def fn_start_not_syntactic_empty_list(): # FN: only literal []; Name, list(), **kwargs, starred unpack + empty = [] + sum(list_of_lists, empty) + sum(list_of_lists, list()) + kwargs = {"start": []} + sum(list_of_lists, **kwargs) + sum(list_of_lists, *[[]]) From 84cfd402a455724f4ec5c4573158da11e9a9dcce Mon Sep 17 00:00:00 2001 From: Guillaume Dequenne Date: Fri, 10 Apr 2026 14:45:46 +0200 Subject: [PATCH 081/322] SONARPY-4039 Fix nondeterminism in AWS lambda handler indexing (#1057) GitOrigin-RevId: 49b51d11d4f47b20f992dac1ac231904dae9b111 --- .../python/project/config/ProjectConfigurationBuilder.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/python-frontend/src/main/java/org/sonar/python/project/config/ProjectConfigurationBuilder.java b/python-frontend/src/main/java/org/sonar/python/project/config/ProjectConfigurationBuilder.java index c53863d1f..46ecca9c9 100644 --- a/python-frontend/src/main/java/org/sonar/python/project/config/ProjectConfigurationBuilder.java +++ b/python-frontend/src/main/java/org/sonar/python/project/config/ProjectConfigurationBuilder.java @@ -17,7 +17,6 @@ package org.sonar.python.project.config; import java.util.Collection; -import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -38,7 +37,7 @@ public ProjectConfigurationBuilder() { } public ProjectConfigurationBuilder addAwsLambdaHandler(String packageName, String fullyQualifiedName) { - awsLambdaHandlersByPackage.computeIfAbsent(packageName, k -> new HashSet<>()).add(fullyQualifiedName); + awsLambdaHandlersByPackage.computeIfAbsent(packageName, k -> ConcurrentHashMap.newKeySet()).add(fullyQualifiedName); return this; } From 387356320f132eded4df5451f01fc7ba9e18fd9c Mon Sep 17 00:00:00 2001 From: Marc Jasper Date: Mon, 13 Apr 2026 09:16:54 +0200 Subject: [PATCH 082/322] SONARPY-4028 Fix valueAsLong() in NumericLiteralImpl to work for floating point values such as 0.0 (#1056) GitOrigin-RevId: 715a6f8d99450bb09dedf604154c7090107998e1 --- .../FastAPIHTTPExceptionDocumentedCheck.java | 6 ++++- .../python/checks/FilePermissionsCheck.java | 6 ++++- ...ectParameterDatetimeConstructorsCheck.java | 22 +++++++++++-------- .../UnnecessarySubscriptReversalCheck.java | 22 +++++++++++-------- .../checks/UseStartsWithEndsWithCheck.java | 14 +++++++++--- .../VerifiedSslTlsCertificateCheck.java | 6 ++++- .../sonar/python/checks/cdk/CdkPredicate.java | 11 +++++++++- .../org/sonar/python/checks/cdk/CdkUtils.java | 2 +- .../hotspots/CommonValidationUtils.java | 8 +++++-- .../tests/UnconditionalAssertionCheck.java | 6 ++++- .../unrestrictedAdministration_Connections.py | 1 + .../checks/fastAPIHTTPExceptionDocumented.py | 5 +++++ .../fastHashingOrPlainText.py | 1 + .../checks/hotspots/filePermissions.py | 2 ++ ...rrectParameterDatetimeConstructorsCheck.py | 1 + .../unconditionalAssertion.py | 2 ++ .../checks/unnecessarySubscriptReversal.py | 1 + .../checks/useStartsWithEndsWithCheck.py | 1 + .../checks/verifiedSslTlsCertificateCheck.py | 1 + .../sonar/python/tree/NumericLiteralImpl.java | 12 ++++++++++ .../python/tree/PythonTreeMakerTest.java | 12 ++++++++++ 21 files changed, 113 insertions(+), 29 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/FastAPIHTTPExceptionDocumentedCheck.java b/python-checks/src/main/java/org/sonar/python/checks/FastAPIHTTPExceptionDocumentedCheck.java index 799292700..1e9cdf6c1 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/FastAPIHTTPExceptionDocumentedCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/FastAPIHTTPExceptionDocumentedCheck.java @@ -261,7 +261,11 @@ private static Optional extractStatusCode(Expression statusCodeExpr) { return extractStatusCode(singleAssignedValue); } } else if (statusCodeExpr instanceof NumericLiteral numericLiteral) { - return Optional.of((int) numericLiteral.valueAsLong()); + try { + return Optional.of((int) numericLiteral.valueAsLong()); + } catch (NumberFormatException e) { + return Optional.empty(); + } } else if (statusCodeExpr instanceof StringLiteral stringLiteral) { try { return Optional.of(Integer.parseInt(stringLiteral.trimmedQuotesValue())); diff --git a/python-checks/src/main/java/org/sonar/python/checks/FilePermissionsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/FilePermissionsCheck.java index da85127e0..3bf0d93d3 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/FilePermissionsCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/FilePermissionsCheck.java @@ -99,7 +99,11 @@ private static boolean isUnsafeExpression(Expression expression, int safeModulo, } if (expression.is(Tree.Kind.NUMERIC_LITERAL)) { NumericLiteral numericLiteral = (NumericLiteral) expression; - return numericLiteral.valueAsLong() % 8 != safeModulo; + try { + return numericLiteral.valueAsLong() % 8 != safeModulo; + } catch (NumberFormatException nfe) { + return false; + } } if (expression.is(Tree.Kind.NAME)) { Expression singleAssignedValue = Expressions.singleAssignedValue(((Name) expression)); diff --git a/python-checks/src/main/java/org/sonar/python/checks/IncorrectParameterDatetimeConstructorsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/IncorrectParameterDatetimeConstructorsCheck.java index df8df7cba..f4022b6a0 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/IncorrectParameterDatetimeConstructorsCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/IncorrectParameterDatetimeConstructorsCheck.java @@ -102,16 +102,20 @@ public Tree expression() { } private static ValueWithExpression getValue(Expression expression) { - if (expression.is(Tree.Kind.NUMERIC_LITERAL)) { - return new ValueWithExpression(((NumericLiteral) expression).valueAsLong(), expression); - } else if (expression.is(Tree.Kind.UNARY_MINUS)) { - UnaryExpression unaryExpression = (UnaryExpression) expression; - if (!unaryExpression.expression().is(Tree.Kind.NUMERIC_LITERAL)) { - return null; + try { + if (expression.is(Tree.Kind.NUMERIC_LITERAL)) { + return new ValueWithExpression(((NumericLiteral) expression).valueAsLong(), expression); + } else if (expression.is(Tree.Kind.UNARY_MINUS)) { + UnaryExpression unaryExpression = (UnaryExpression) expression; + if (!unaryExpression.expression().is(Tree.Kind.NUMERIC_LITERAL)) { + return null; + } + return new ValueWithExpression(-((NumericLiteral) unaryExpression.expression()).valueAsLong(), unaryExpression); + } else if (expression.is(Tree.Kind.NAME)) { + return Expressions.singleAssignedNonNameValue((Name) expression).map(IncorrectParameterDatetimeConstructorsCheck::getValue).orElse(null); } - return new ValueWithExpression(-((NumericLiteral) unaryExpression.expression()).valueAsLong(), unaryExpression); - } else if (expression.is(Tree.Kind.NAME)) { - return Expressions.singleAssignedNonNameValue((Name) expression).map(IncorrectParameterDatetimeConstructorsCheck::getValue).orElse(null); + } catch (NumberFormatException nfe) { + return null; } return null; } diff --git a/python-checks/src/main/java/org/sonar/python/checks/UnnecessarySubscriptReversalCheck.java b/python-checks/src/main/java/org/sonar/python/checks/UnnecessarySubscriptReversalCheck.java index 9e82f571a..234c8d422 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/UnnecessarySubscriptReversalCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/UnnecessarySubscriptReversalCheck.java @@ -88,15 +88,19 @@ private boolean isSensitiveCall(CallExpression callExpression) { } private static boolean isSubscriptReversal(@Nullable Tree expression) { - return expression instanceof SliceExpression sliceExpression - && sliceExpression.sliceList().slices().size() == 1 - && sliceExpression.sliceList().slices().get(0) instanceof SliceItem sliceItem - && sliceItem.lowerBound() == null - && sliceItem.upperBound() == null - && sliceItem.stride() instanceof UnaryExpression unaryExpression - && unaryExpression.is(Tree.Kind.UNARY_MINUS) - && unaryExpression.expression() instanceof NumericLiteral numericLiteral - && numericLiteral.valueAsLong() == 1; + try { + return expression instanceof SliceExpression sliceExpression + && sliceExpression.sliceList().slices().size() == 1 + && sliceExpression.sliceList().slices().get(0) instanceof SliceItem sliceItem + && sliceItem.lowerBound() == null + && sliceItem.upperBound() == null + && sliceItem.stride() instanceof UnaryExpression unaryExpression + && unaryExpression.is(Tree.Kind.UNARY_MINUS) + && unaryExpression.expression() instanceof NumericLiteral numericLiteral + && numericLiteral.valueAsLong() == 1; + } catch (NumberFormatException nfe) { + return false; + } } private static int getUsageCount(Name name) { diff --git a/python-checks/src/main/java/org/sonar/python/checks/UseStartsWithEndsWithCheck.java b/python-checks/src/main/java/org/sonar/python/checks/UseStartsWithEndsWithCheck.java index c227dc295..19c30d853 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/UseStartsWithEndsWithCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/UseStartsWithEndsWithCheck.java @@ -123,9 +123,7 @@ private static SliceType fromSliceItem(SliceItem sliceItem) { // then we don't check the rule. if (stride != null && !stride.type().mustBeOrExtend(BuiltinTypes.NONE_TYPE) && - !(stride.is(Tree.Kind.NUMERIC_LITERAL) && - stride.type().mustBeOrExtend(BuiltinTypes.INT) && - ((NumericLiteral) stride).valueAsLong() == 1)) { + !isIntLiteralEqualTo(stride, 1)) { return SliceType.COMPLEX; } @@ -153,6 +151,16 @@ private static boolean isEmptyBound(@CheckForNull Expression bound) { } } + private static boolean isIntLiteralEqualTo(Expression expression, long expected) { + try { + return expression.is(Tree.Kind.NUMERIC_LITERAL) + && expression.type().mustBeOrExtend(BuiltinTypes.INT) + && ((NumericLiteral) expression).valueAsLong() == expected; + } catch (NumberFormatException nfe) { + return false; + } + } + private enum OperatorType { EQUALS, NOT_EQUALS, diff --git a/python-checks/src/main/java/org/sonar/python/checks/VerifiedSslTlsCertificateCheck.java b/python-checks/src/main/java/org/sonar/python/checks/VerifiedSslTlsCertificateCheck.java index 5f99c20d5..e5b79ece4 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/VerifiedSslTlsCertificateCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/VerifiedSslTlsCertificateCheck.java @@ -433,7 +433,11 @@ private static boolean isFalsyRange(CallExpression callExpr, String fqn) { Expression firstArgExpr = regArg.expression(); if (firstArgExpr.is(Tree.Kind.NUMERIC_LITERAL)) { NumericLiteral num = (NumericLiteral) firstArgExpr; - return num.valueAsLong() == 0L; + try { + return num.valueAsLong() == 0L; + } catch (NumberFormatException nfe) { + return false; + } } } } diff --git a/python-checks/src/main/java/org/sonar/python/checks/cdk/CdkPredicate.java b/python-checks/src/main/java/org/sonar/python/checks/cdk/CdkPredicate.java index 88baf2ec3..31e2fcd27 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/cdk/CdkPredicate.java +++ b/python-checks/src/main/java/org/sonar/python/checks/cdk/CdkPredicate.java @@ -194,7 +194,16 @@ private static boolean anyValueInInterval(Collection values, long min, lon } public static Predicate isNumeric(Set vals) { - return expression -> expression.is(Tree.Kind.NUMERIC_LITERAL) && vals.contains(((NumericLiteral) expression).valueAsLong()); + return expression -> { + if (!expression.is(Tree.Kind.NUMERIC_LITERAL)) { + return false; + } + try { + return vals.contains(((NumericLiteral) expression).valueAsLong()); + } catch (NumberFormatException nfe) { + return false; + } + }; } } diff --git a/python-checks/src/main/java/org/sonar/python/checks/cdk/CdkUtils.java b/python-checks/src/main/java/org/sonar/python/checks/cdk/CdkUtils.java index dea9ad81b..d56e6336b 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/cdk/CdkUtils.java +++ b/python-checks/src/main/java/org/sonar/python/checks/cdk/CdkUtils.java @@ -55,7 +55,7 @@ private CdkUtils() { public static Optional getInt(Expression expression) { try { return Optional.of((int)((NumericLiteral) expression).valueAsLong()); - } catch (ClassCastException e) { + } catch (ClassCastException | NumberFormatException e) { return Optional.empty(); } } diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/CommonValidationUtils.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/CommonValidationUtils.java index 2f01125ce..7020508ad 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/CommonValidationUtils.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/CommonValidationUtils.java @@ -61,8 +61,12 @@ public static boolean isMoreThan(Expression expression, int number) { static boolean isLessThanExponent(Expression expression, int exponent) { if (expression.is(Tree.Kind.SHIFT_EXPR)) { var shiftExpression = (BinaryExpression) expression; - return shiftExpression.leftOperand().is(Tree.Kind.NUMERIC_LITERAL) && (((NumericLiteral) shiftExpression.leftOperand()).valueAsLong() == 1) - && isLessThan(shiftExpression.rightOperand(), exponent); + try { + return shiftExpression.leftOperand().is(Tree.Kind.NUMERIC_LITERAL) && (((NumericLiteral) shiftExpression.leftOperand()).valueAsLong() == 1) + && isLessThan(shiftExpression.rightOperand(), exponent); + } catch (NumberFormatException nfe) { + return false; + } } if (expression.is(Tree.Kind.NAME)) { return Expressions.singleAssignedNonNameValue(((Name) expression)) diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/UnconditionalAssertionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/UnconditionalAssertionCheck.java index ece10619a..186e17990 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/UnconditionalAssertionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/UnconditionalAssertionCheck.java @@ -103,7 +103,11 @@ private static boolean isFalseOrZeroLiteral(Expression expression) { return "False".equals(((Name) expression).name()); } if (expression.is(NUMERIC_LITERAL)) { - return ((NumericLiteral) expression).valueAsLong() == 0; + try { + return ((NumericLiteral) expression).valueAsLong() == 0; + } catch (NumberFormatException nfe) { + return false; + } } return false; } diff --git a/python-checks/src/test/resources/checks/cdk/unrestrictedAdministration_Connections.py b/python-checks/src/test/resources/checks/cdk/unrestrictedAdministration_Connections.py index 605f5c9d5..1aad013c5 100644 --- a/python-checks/src/test/resources/checks/cdk/unrestrictedAdministration_Connections.py +++ b/python-checks/src/test/resources/checks/cdk/unrestrictedAdministration_Connections.py @@ -62,6 +62,7 @@ def test_bad_port_variant(var): conn.allow_from(ec2.Peer.any_ipv4(), ec2.Port.all_tcp) conn.allow_from(ec2.Peer.any_ipv4(), ec2.Port.tcp(50)) + conn.allow_from(ec2.Peer.any_ipv4(), ec2.Port.tcp(9223372036854775808)) # Compliant (port literal does not parse to long) conn.allow_from(ec2.Peer.any_ipv4(), ec2.Port.tcp(variable=3389)) conn.allow_from(ec2.Peer.any_ipv4(), ec2.Port.tcp(port="3389")) conn.allow_from(ec2.Peer.any_ipv4(), ec2.Port.tcp_range(start_port=30, end_port=40)) diff --git a/python-checks/src/test/resources/checks/fastAPIHTTPExceptionDocumented.py b/python-checks/src/test/resources/checks/fastAPIHTTPExceptionDocumented.py index ed889f076..b6fa40de9 100644 --- a/python-checks/src/test/resources/checks/fastAPIHTTPExceptionDocumented.py +++ b/python-checks/src/test/resources/checks/fastAPIHTTPExceptionDocumented.py @@ -76,6 +76,11 @@ def positional_status_code_argument(): # ^^^^^^^^^^^^^ +@app.get("/overflow-status") +def positional_status_code_overflow_literal(): + raise HTTPException(9223372036854775808, detail="not a representable status code") + + @app.post("/create") def post_method_undocumented(): raise HTTPException(status_code=409, detail="Conflict") # Noncompliant diff --git a/python-checks/src/test/resources/checks/fastHashingOrPlainText/fastHashingOrPlainText.py b/python-checks/src/test/resources/checks/fastHashingOrPlainText/fastHashingOrPlainText.py index cb4459254..a3ed7582f 100644 --- a/python-checks/src/test/resources/checks/fastHashingOrPlainText/fastHashingOrPlainText.py +++ b/python-checks/src/test/resources/checks/fastHashingOrPlainText/fastHashingOrPlainText.py @@ -8,6 +8,7 @@ def non_hashlib(): scrypt.hash(password, salt, buflen=31) # Noncompliant scrypt.hash(password, salt, buflen=32) scrypt.hash(password, salt, N=1 << 12) # Noncompliant + scrypt.hash(password, salt, N=9223372036854775808 << 1) # Compliant (invalid long: isLessThanExponent handles NFE) exp = 7 scrypt.hash(password, salt, N=1 << exp) # Noncompliant exp_2 = 1 << 3 diff --git a/python-checks/src/test/resources/checks/hotspots/filePermissions.py b/python-checks/src/test/resources/checks/hotspots/filePermissions.py index be0aaea3a..0c2e8fb73 100644 --- a/python-checks/src/test/resources/checks/hotspots/filePermissions.py +++ b/python-checks/src/test/resources/checks/hotspots/filePermissions.py @@ -62,6 +62,8 @@ os.chmod("/tmp/fs", 256) # Compliant -r-------- os.chmod("/tmp/fs", 0) # Compliant ---------- +os.chmod("/tmp/fs", 9223372036854775808) # Compliant (mode literal does not parse to long) + os.chmod("/tmp/fs", 4) # Noncompliant os.chmod("/tmp/fs", 260) # Noncompliant diff --git a/python-checks/src/test/resources/checks/incorrectParameterDatetimeConstructorsCheck.py b/python-checks/src/test/resources/checks/incorrectParameterDatetimeConstructorsCheck.py index b7c5d724d..99e3430e0 100644 --- a/python-checks/src/test/resources/checks/incorrectParameterDatetimeConstructorsCheck.py +++ b/python-checks/src/test/resources/checks/incorrectParameterDatetimeConstructorsCheck.py @@ -4,6 +4,7 @@ def compliant_examples(): datetime.time(12, 30, 0, 0) datetime.date(2024, 3, 1) datetime.datetime(2024, 3, 1, 12, 30, 0, 0) + datetime.date(9223372036854775808, 1, 1) # Compliant (year literal does not parse to long) def non_compliant_examples(): datetime.date(2024, 3, 32) # Noncompliant {{Provide a correct value for the `day` parameter.}} diff --git a/python-checks/src/test/resources/checks/unconditionalAssertion/unconditionalAssertion.py b/python-checks/src/test/resources/checks/unconditionalAssertion/unconditionalAssertion.py index 04227b1fd..6ace5f208 100644 --- a/python-checks/src/test/resources/checks/unconditionalAssertion/unconditionalAssertion.py +++ b/python-checks/src/test/resources/checks/unconditionalAssertion/unconditionalAssertion.py @@ -59,6 +59,8 @@ def test_assert_statement_used_for_test_failure(self): # Should be raised by another rule assert False assert 0 + assert 9223372036854775808 # Noncompliant {{Replace this expression; its boolean value is constant.}} + # ^^^^^^^^^^^^^^^^^^^ def test_constant_assert_true_with_unpacking(self): diff --git a/python-checks/src/test/resources/checks/unnecessarySubscriptReversal.py b/python-checks/src/test/resources/checks/unnecessarySubscriptReversal.py index 8ac695874..a373d2b5e 100644 --- a/python-checks/src/test/resources/checks/unnecessarySubscriptReversal.py +++ b/python-checks/src/test/resources/checks/unnecessarySubscriptReversal.py @@ -35,6 +35,7 @@ def case4(): set(data[::-2]) set(data[::1]) set(data[::-b]) + sorted(data[::-9223372036854775808]) # Compliant (stride literal does not parse to long) list(data[::-1]) def case5(): diff --git a/python-checks/src/test/resources/checks/useStartsWithEndsWithCheck.py b/python-checks/src/test/resources/checks/useStartsWithEndsWithCheck.py index eaaafade9..a374d66c1 100644 --- a/python-checks/src/test/resources/checks/useStartsWithEndsWithCheck.py +++ b/python-checks/src/test/resources/checks/useStartsWithEndsWithCheck.py @@ -61,6 +61,7 @@ def f(): foobar[3:6:0x1] == 'bar' # Same foobar[-3:] == 'bar' # Noncompliant {{Use `endswith` here.}} foobar[:-3] == 'foo' # Noncompliant {{Use `startswith` here.}} + foobar[::9223372036854775808] == 'foo' # Compliant (stride literal: isIntLiteralEqualTo handles NFE) # If an index is not a plain number, we can not say for sure if it is negative/positive. Hence, we should suggest startswith and endswith foobar[:unknownA()] == 'foo' # Noncompliant {{Use `startswith` here.}} diff --git a/python-checks/src/test/resources/checks/verifiedSslTlsCertificateCheck.py b/python-checks/src/test/resources/checks/verifiedSslTlsCertificateCheck.py index f112e5447..8cff3675f 100644 --- a/python-checks/src/test/resources/checks/verifiedSslTlsCertificateCheck.py +++ b/python-checks/src/test/resources/checks/verifiedSslTlsCertificateCheck.py @@ -89,6 +89,7 @@ def requestsTests(): # ^^^^^ requests.request('GET', 'https://example.domain', verify=range(0)) # Noncompliant {{Enable server certificate validation on this SSL/TLS connection.}} # ^^^^^^^^ + requests.request('GET', 'https://example.domain', verify=range(9223372036854775808)) # Compliant (stop literal does not parse to long) requests.request(verify=False, method='GET', url='https://example.domain') # Noncompliant {{Enable server certificate validation on this SSL/TLS connection.}} # ^^^^^ diff --git a/python-frontend/src/main/java/org/sonar/python/tree/NumericLiteralImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/NumericLiteralImpl.java index 8912c425a..4c2fe88df 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/NumericLiteralImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/NumericLiteralImpl.java @@ -16,6 +16,7 @@ */ package org.sonar.python.tree; +import java.math.BigDecimal; import java.util.Collections; import java.util.List; import java.util.Locale; @@ -61,6 +62,17 @@ public long valueAsLong() { return Integer.valueOf(literalValue.substring(2), 8); } else if (literalValue.startsWith("0x") || literalValue.startsWith("0X")) { return Integer.valueOf(literalValue.substring(2), 16); + } else if (numericKind() == NumericKind.FLOAT) { + // Decimal floats (e.g. 0.0, 1e3) must be handled before legacy octal (0-prefixed), + // otherwise tokens like "0.0" match the octal branch and ".0" is parsed as base 8. + try { + return new BigDecimal(literalValue).longValueExact(); + } catch (ArithmeticException e) { + NumberFormatException nfe = new NumberFormatException( + "Not an integral floating-point literal: " + literalValue); + nfe.initCause(e); + throw nfe; + } } else if (literalValue.startsWith("0") && literalValue.length() > 1) { // Python 2 syntax (https://www.python.org/dev/peps/pep-3127/#removal-of-old-octal-syntax) return Integer.valueOf(literalValue.substring(1), 8); diff --git a/python-frontend/src/test/java/org/sonar/python/tree/PythonTreeMakerTest.java b/python-frontend/src/test/java/org/sonar/python/tree/PythonTreeMakerTest.java index 4b2ece264..8a965828f 100644 --- a/python-frontend/src/test/java/org/sonar/python/tree/PythonTreeMakerTest.java +++ b/python-frontend/src/test/java/org/sonar/python/tree/PythonTreeMakerTest.java @@ -2070,6 +2070,18 @@ void numeric_literal_expression() { testNumericLiteral("0777", 511L); testNumericLiteral("0x28", 0x28L); testNumericLiteral("0X28", 0x28L); + testNumericLiteral("0.0", 0L); + testNumericLiteral("42.0", 42L); + testNumericLiteral("1e3", 1000L); + testNumericLiteral("3_0.0", 30L); + } + + @Test + void numeric_literal_float_non_integral_valueAsLong_throws() { + setRootRule(PythonGrammar.ATOM); + Expression expression = parse("0.5", treeMaker::expression); + assertThat(expression.is(Tree.Kind.NUMERIC_LITERAL)).isTrue(); + assertThatThrownBy(((NumericLiteral) expression)::valueAsLong).isInstanceOf(NumberFormatException.class); } private void testNumericLiteral(String code, Long expectedValue) { From 90364f0a444a5b3ac637eeacf7a8294025072f4a Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Mon, 13 Apr 2026 10:29:07 +0200 Subject: [PATCH 083/322] SONARPY-4016 Rule S8511 Multiple inheritance should not create Method Resolution Order (MRO) conflicts (#1046) Co-authored-by: Marc Jasper GitOrigin-RevId: 162f6b70593e6b0898303e9f1909388427d190f6 --- .../MultipleInheritanceMROConflictCheck.java | 173 ++++++++++++++++++ .../python/checks/OpenSourceCheckList.java | 1 + .../org/sonar/l10n/py/rules/python/S8511.html | 53 ++++++ .../org/sonar/l10n/py/rules/python/S8511.json | 21 +++ ...ltipleInheritanceMROConflictCheckTest.java | 29 +++ .../checks/multipleInheritanceMROConflict.py | 70 +++++++ .../python/api/types/v2/ClassType.java | 35 ++++ .../api/types/v2/ClassTypeMroUtils.java | 167 +++++++++++++++++ .../python/api/types/v2/ClassTypeTest.java | 149 +++++++++++++++ 9 files changed, 698 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/MultipleInheritanceMROConflictCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8511.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8511.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/MultipleInheritanceMROConflictCheckTest.java create mode 100644 python-checks/src/test/resources/checks/multipleInheritanceMROConflict.py create mode 100644 python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/ClassTypeMroUtils.java diff --git a/python-checks/src/main/java/org/sonar/python/checks/MultipleInheritanceMROConflictCheck.java b/python-checks/src/main/java/org/sonar/python/checks/MultipleInheritanceMROConflictCheck.java new file mode 100644 index 000000000..83a101169 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/MultipleInheritanceMROConflictCheck.java @@ -0,0 +1,173 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Deque; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import javax.annotation.CheckForNull; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.ArgList; +import org.sonar.plugins.python.api.tree.Argument; +import org.sonar.plugins.python.api.tree.ClassDef; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.ClassType; +import org.sonar.plugins.python.api.types.v2.PythonType; +import org.sonar.plugins.python.api.types.v2.TypeWrapper; + +@Rule(key = "S8511") +public class MultipleInheritanceMROConflictCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Reorder or remove base classes to fix this MRO conflict."; + private static final String SECONDARY_MESSAGE = "This base class is an ancestor of another listed base class appearing after it."; + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.CLASSDEF, MultipleInheritanceMROConflictCheck::checkClassDef); + } + + private static void checkClassDef(SubscriptionContext ctx) { + ClassDef classDef = (ClassDef) ctx.syntaxNode(); + ArgList argList = classDef.args(); + if (argList == null) { + return; + } + + List bases = collectPositionalBases(argList); + if (bases.size() < 2) { + return; + } + + List types = new ArrayList<>(); + for (Expression base : bases) { + types.add(resolveClassType(base)); + } + + int conflictIndex = findAncestorConflictIndex(types); + if (hasMroConflict(types, conflictIndex)) { + PreciseIssue issue = ctx.addIssue(classDef.name(), MESSAGE); + if (conflictIndex >= 0) { + issue.secondary(bases.get(conflictIndex), SECONDARY_MESSAGE); + } + } + } + + private static List collectPositionalBases(ArgList argList) { + List bases = new ArrayList<>(); + for (Argument argument : argList.arguments()) { + if (argument instanceof RegularArgument regularArgument && regularArgument.keywordArgument() == null) { + bases.add(regularArgument.expression()); + } + } + return bases; + } + + /** + * Detects an MRO conflict: either via C3 when every base is fully resolved, or otherwise only + * when {@link #findAncestorConflictIndex} finds an earlier base that is a strict superclass of a + * later base in our type graph (same structural issue as {@code class C(A, B)} with {@code B} + * subclassing {@code A}). + */ + private static boolean hasMroConflict(List types, int conflictIndex) { + return isFullyResolved(types) + ? !ClassType.wouldHaveValidMro(types) + : (conflictIndex >= 0); + } + + /** + * Returns {@code true} if every base class is fully resolved (non-null, with a fully known type + * hierarchy). Only when this is true can we run the complete C3 algorithm safely. + */ + private static boolean isFullyResolved(List types) { + for (ClassType type : types) { + if (type == null || type.hasUnresolvedHierarchy()) { + return false; + } + } + return true; + } + + /** + * Returns the index {@code i} of the first base class that is an ancestor of some later base + * class at index {@code j > i}, or {@code -1} if no such pair exists. + */ + private static int findAncestorConflictIndex(List types) { + for (int i = 0; i < types.size() - 1; i++) { + if (laterBaseExtendsEarlier(types, i)) { + return i; + } + } + return -1; + } + + private static boolean laterBaseExtendsEarlier(List types, int i) { + ClassType typeI = types.get(i); + if (typeI == null) { + return false; + } + for (int j = i + 1; j < types.size(); j++) { + ClassType typeJ = types.get(j); + if (typeJ != null && isOrExtendsClass(typeJ, typeI)) { + return true; + } + } + return false; + } + + /** + * Returns {@code true} if {@code candidate} is or extends {@code ancestor} (i.e., {@code ancestor} + * appears anywhere in {@code candidate}'s type hierarchy). Uses reference equality since + * {@link ClassType} instances are canonical singletons within a single analysis. + */ + private static boolean isOrExtendsClass(ClassType candidate, ClassType ancestor) { + Set visited = new HashSet<>(); + Deque queue = new ArrayDeque<>(); + queue.add(candidate); + while (!queue.isEmpty()) { + PythonType current = queue.poll(); + if (!visited.add(current)) { + continue; + } + if (current == ancestor) { + return true; + } + if (current instanceof ClassType ct) { + enqueueDirectSuperclasses(ct, queue); + } + } + return false; + } + + private static void enqueueDirectSuperclasses(ClassType ct, Deque queue) { + for (TypeWrapper sw : ct.superClasses()) { + queue.add(sw.type()); + } + } + + @CheckForNull + private static ClassType resolveClassType(Expression expression) { + PythonType type = expression.typeV2(); + return (type instanceof ClassType classType) ? classType : null; + } +} diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 7c48fa2bf..bb6462010 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -319,6 +319,7 @@ public Stream> getChecks() { MissingNewlineAtEndOfFileCheck.class, ModifiedParameterValueCheck.class, ModuleNameCheck.class, + MultipleInheritanceMROConflictCheck.class, MultipleWhitespaceCheck.class, MutableDefaultValueCheck.class, NeedlessPassCheck.class, diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8511.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8511.html new file mode 100644 index 000000000..19076adfb --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8511.html @@ -0,0 +1,53 @@ +

      This rule raises an issue when a class definition with multiple inheritance results in an unresolvable Method Resolution Order (MRO).

      +

      Why is this an issue?

      +

      Python uses the C3 linearization algorithm to determine the Method Resolution Order (MRO) — the order in which base classes are searched when +looking up methods and attributes. When a class is created with multiple inheritance, Python must be able to construct a valid MRO. If the inheritance +structure violates the C3 linearization rules, Python raises a TypeError at class definition time, preventing the class from being +created at all.

      +

      The C3 algorithm enforces these key constraints:

      +
        +
      • Local precedence ordering: If class C inherits from A then B, then A must + appear before B in the MRO.
      • +
      • Monotonicity: If class A appears before class B in the MRO of a parent class, then A + must also appear before B in the MRO of any child class.
      • +
      +

      MRO inconsistencies cause immediate runtime failures. The class cannot be instantiated or used, breaking the application at import time.

      +

      How to fix it

      +

      Restructure the inheritance hierarchy to respect the C3 linearization rules. Remove redundant base classes from the inheritance list, as a class +does not need to directly inherit from a grandparent if it is already inherited through a parent.

      +

      Code examples

      +

      Noncompliant code example

      +
      +class A:
      +    pass
      +
      +class B(A):
      +    pass
      +
      +class C(A):
      +    pass
      +
      +class D(B, A, C):  # Noncompliant: explicitly inheriting from A violates local precedence
      +    pass
      +
      +

      Compliant solution

      +
      +class A:
      +    pass
      +
      +class B(A):
      +    pass
      +
      +class C(A):
      +    pass
      +
      +class D(B, C):  # Compliant: A is inherited through B and C
      +    pass
      +
      +

      Resources

      +

      Documentation

      + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8511.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8511.json new file mode 100644 index 000000000..ed55262d8 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8511.json @@ -0,0 +1,21 @@ +{ + "title": "Multiple inheritance should not create Method Resolution Order (MRO) conflicts", + "type": "BUG", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "15 min" + }, + "tags": [], + "defaultSeverity": "Critical", + "ruleSpecification": "RSPEC-8511", + "sqKey": "S8511", + "scope": "Main", + "quickfix": "unknown", + "code": { + "impacts": { + "RELIABILITY": "HIGH" + }, + "attribute": "LOGICAL" + } +} diff --git a/python-checks/src/test/java/org/sonar/python/checks/MultipleInheritanceMROConflictCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/MultipleInheritanceMROConflictCheckTest.java new file mode 100644 index 000000000..c25ad656a --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/MultipleInheritanceMROConflictCheckTest.java @@ -0,0 +1,29 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.junit.jupiter.api.Test; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class MultipleInheritanceMROConflictCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/multipleInheritanceMROConflict.py", new MultipleInheritanceMROConflictCheck()); + } + +} diff --git a/python-checks/src/test/resources/checks/multipleInheritanceMROConflict.py b/python-checks/src/test/resources/checks/multipleInheritanceMROConflict.py new file mode 100644 index 000000000..5ae15906d --- /dev/null +++ b/python-checks/src/test/resources/checks/multipleInheritanceMROConflict.py @@ -0,0 +1,70 @@ +class Base: + pass + +class Mid(Base): + pass + +class Leaf(Mid): + pass + + +class Broken(Base, Leaf): # Noncompliant {{Reorder or remove base classes to fix this MRO conflict.}} +# ^^^^^^ ^^^^< {{This base class is an ancestor of another listed base class appearing after it.}} + pass + + +class CommonRoot: + pass + +class LeftChild(CommonRoot): + pass + +class RightChild(CommonRoot): + pass + +class LeftFirst(LeftChild, RightChild): + pass + +class RightFirst(RightChild, LeftChild): + pass + +class C3Conflict(LeftFirst, RightFirst): # Noncompliant {{Reorder or remove base classes to fix this MRO conflict.}} + pass + + +def not_a_class(): + pass + + +class CompliantPartialResolution(not_a_class, Base): + pass + + +class OnlyMetaclass(metaclass=type): + pass + + +class CompliantC3Order(LeftFirst, RightChild): + pass + + +# --- Super types not fully resolved (heuristic path; full C3 is skipped) --- +from unknown_module import ExternalMixin, ExternalOther + + +# Compliant: later base not fully resolved for C3 (unknown import / incomplete hierarchy), and the +# heuristic does not show it extending Base. +class MidWithUnresolvedMixin(Base, ExternalMixin): + pass + + +# Compliant: two unrelated imported bases (incomplete hierarchies); no "earlier ancestor of later" pair in the model +class CompliantTwoUnresolvedPeers(ExternalMixin, ExternalOther): + pass + + +# Bases not fully resolved for C3 (second base has incomplete hierarchy), yet the heuristic still +# finds that the second base subclasses Base — flagged without running full C3. +class ConflictMid(Base, MidWithUnresolvedMixin): # Noncompliant {{Reorder or remove base classes to fix this MRO conflict.}} +# ^^^^^^^^^^^ ^^^^< {{This base class is an ancestor of another listed base class appearing after it.}} + pass diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/ClassType.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/ClassType.java index 4d9a50b50..58f2ab399 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/ClassType.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/ClassType.java @@ -184,6 +184,41 @@ public boolean hasUnresolvedHierarchy() { ); } + /** + * Computes the C3 linearization (Method Resolution Order) for this class. + * + *

      Returns {@code Optional.empty()} if: + *

        + *
      • the type hierarchy is unresolved ({@link #hasUnresolvedHierarchy()} is {@code true}), or
      • + *
      • the MRO cannot be computed because the base class ordering creates a conflict + * (i.e. what Python raises as a {@code TypeError} at class definition time).
      • + *
      + * + *

      The returned list starts with {@code this} and ends with the most-distant ancestor. + * + * @see Python MRO documentation + */ + public Optional> mro() { + if (hasUnresolvedHierarchy()) { + return Optional.empty(); + } + return ClassTypeMroUtils.compute(this); + } + + /** + * Returns whether C3 linearization would succeed for a hypothetical class whose direct bases are + * exactly {@code bases} in order. + * + *

      Precondition: every element of {@code bases} is non-null and fully resolved (no unresolved + * hierarchy), matching what {@link #mro()} requires for each base. + * + *

      If any base has an empty {@link #mro()} because an ancestor's hierarchy is invalid, this + * returns {@code true} — the failure is not attributable to the merge of these bases alone. + */ + public static boolean wouldHaveValidMro(List bases) { + return ClassTypeMroUtils.wouldHaveValidMro(bases); + } + @Override public TriBool hasMember(String memberName) { // a ClassType is an object of class type, it has the same members as those present on any type diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/ClassTypeMroUtils.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/ClassTypeMroUtils.java new file mode 100644 index 000000000..73f5cd00c --- /dev/null +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/ClassTypeMroUtils.java @@ -0,0 +1,167 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.plugins.python.api.types.v2; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import javax.annotation.CheckForNull; + +/** + * C3 linearization (Method Resolution Order) for {@link ClassType}. + */ +final class ClassTypeMroUtils { + + private ClassTypeMroUtils() { + } + + /** + * Computes the C3 MRO for {@code cls}, using a fresh memoisation cache. + */ + static Optional> compute(ClassType cls) { + return compute(cls, new HashMap<>(), new HashSet<>()); + } + + /** + * Returns whether C3 linearization would succeed for a hypothetical class whose direct bases are + * exactly {@code bases} in order — same behaviour as {@link ClassType#wouldHaveValidMro(List)}. + */ + static boolean wouldHaveValidMro(List bases) { + List> lists = new ArrayList<>(); + for (ClassType base : bases) { + Optional> mro = base.mro(); + if (mro.isEmpty()) { + return true; + } + lists.add(new ArrayList<>(mro.get())); + } + lists.add(new ArrayList<>(bases)); + return c3Merge(lists) != null; + } + + /** + * Recursively computes the C3 MRO for {@code cls}, memoising results in {@code cache}. + * {@code visiting} guards against cycles. + */ + private static Optional> compute( + ClassType cls, + Map>> cache, + Set visiting + ) { + if (cache.containsKey(cls)) { + return cache.get(cls); + } + if (!visiting.add(cls)) { + // Cycle detected — treat as failure. + return Optional.empty(); + } + + List parentTypes = new ArrayList<>(); + for (TypeWrapper wrapper : cls.superClasses()) { + if (wrapper.type() instanceof ClassType parent) { + parentTypes.add(parent); + } + // Non-ClassType superclass is already filtered out by hasUnresolvedHierarchy() + } + + List> lists = new ArrayList<>(); + for (ClassType parent : parentTypes) { + Optional> parentMro = compute(parent, cache, visiting); + if (parentMro.isEmpty()) { + // A parent itself has an invalid MRO — Python would have raised TypeError + // when that parent was defined, so this class is not the root cause. + visiting.remove(cls); + cache.put(cls, Optional.empty()); + return Optional.empty(); + } + lists.add(new ArrayList<>(parentMro.get())); + } + lists.add(new ArrayList<>(parentTypes)); + + List merged = c3Merge(lists); + Optional> result; + if (merged == null) { + result = Optional.empty(); + } else { + merged.add(0, cls); + result = Optional.of(merged); + } + + visiting.remove(cls); + cache.put(cls, result); + return result; + } + + /** + * Performs the C3 merge of the given lists. Returns the merged sequence, or {@code null} if no + * valid merge exists (i.e. the MRO has a conflict). + */ + @CheckForNull + private static List c3Merge(List> lists) { + List result = new ArrayList<>(); + while (true) { + lists.removeIf(List::isEmpty); + if (lists.isEmpty()) { + return result; + } + ClassType candidate = findFirstValidMergeHead(lists); + if (candidate == null) { + return null; + } + result.add(candidate); + removeHeadFromLists(lists, candidate); + } + } + + /** + * Returns the first list head that does not appear as a non-head entry in any list, or {@code null} + * if no such head exists (merge failure). + */ + @CheckForNull + private static ClassType findFirstValidMergeHead(List> lists) { + for (List list : lists) { + ClassType head = list.get(0); + if (!headAppearsAsNonHeadInAnyList(head, lists)) { + return head; + } + } + return null; + } + + private static boolean headAppearsAsNonHeadInAnyList(ClassType head, List> lists) { + for (List other : lists) { + for (int k = 1; k < other.size(); k++) { + if (other.get(k) == head) { + return true; + } + } + } + return false; + } + + private static void removeHeadFromLists(List> lists, ClassType chosen) { + for (List list : lists) { + if (!list.isEmpty() && list.get(0) == chosen) { + list.remove(0); + } + } + } +} diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/ClassTypeTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/ClassTypeTest.java index d94d69243..f650aa559 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/ClassTypeTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/ClassTypeTest.java @@ -869,6 +869,155 @@ void type_annotations_scope() { } + // ------------------------------------------------------------------------- + // mro() tests + // ------------------------------------------------------------------------- + + @Test + void mro_no_parents() { + ClassType classC = classType("class C: ..."); + assertThat(classC.mro()).isPresent().get().asInstanceOf( + org.assertj.core.api.InstanceOfAssertFactories.list(ClassType.class)) + .containsExactly(classC); + } + + @Test + void mro_single_parent() { + List types = classTypes( + "class Base: ...", + "class Child(Base): ..." + ); + ClassType base = types.get(0); + ClassType child = types.get(1); + assertThat(child.mro()).isPresent().get().asInstanceOf( + org.assertj.core.api.InstanceOfAssertFactories.list(ClassType.class)) + .containsExactly(child, base); + } + + @Test + void mro_linear_chain() { + List types = classTypes( + "class A: ...", + "class B(A): ...", + "class C(B): ..." + ); + ClassType a = types.get(0); + ClassType b = types.get(1); + ClassType c = types.get(2); + assertThat(c.mro()).isPresent().get().asInstanceOf( + org.assertj.core.api.InstanceOfAssertFactories.list(ClassType.class)) + .containsExactly(c, b, a); + } + + @Test + void mro_valid_diamond() { + // Classic diamond: D(B, C), B(A), C(A) + // MRO: D, B, C, A + List types = classTypes( + "class A: ...", + "class B(A): ...", + "class C(A): ...", + "class D(B, C): ..." + ); + ClassType a = types.get(0); + ClassType b = types.get(1); + ClassType c = types.get(2); + ClassType d = types.get(3); + assertThat(d.mro()).isPresent().get().asInstanceOf( + org.assertj.core.api.InstanceOfAssertFactories.list(ClassType.class)) + .containsExactly(d, b, c, a); + } + + @Test + void mro_conflict_returns_empty() { + // class Leaf(Base): ... + // class Broken(Base, Leaf): ... <- MRO conflict + List types = classTypes( + "class Base: ...", + "class Leaf(Base): ...", + "class Broken(Base, Leaf): ..." + ); + ClassType broken = types.get(2); + assertThat(broken.mro()).isEmpty(); + } + + @Test + void wouldHaveValidMro_returns_false_when_merge_fails() { + // Same hierarchy as mro_conflict_returns_empty: merging Base with Leaf (Leaf extends Base) fails. + List types = classTypes( + "class Base: ...", + "class Leaf(Base): ...", + "class Broken(Base, Leaf): ..." + ); + ClassType base = types.get(0); + ClassType leaf = types.get(1); + assertThat(ClassType.wouldHaveValidMro(List.of(base, leaf))).isFalse(); + } + + @Test + void wouldHaveValidMro_returns_true_for_diamond_inheritance_bases() { + List types = classTypes( + "class A: ...", + "class B(A): ...", + "class C(A): ...", + "class D(B, C): ..." + ); + ClassType b = types.get(1); + ClassType c = types.get(2); + assertThat(ClassType.wouldHaveValidMro(List.of(b, c))).isTrue(); + } + + @Test + void mro_unresolved_hierarchy_returns_empty() { + // class Child(Unknown): ... <- unresolved parent + List types = classTypes( + "class Child(Unknown): ..." + ); + ClassType child = types.get(0); + assertThat(child.mro()).isEmpty(); + } + + @Test + void mro_with_builtin_parent() { + List types = classTypes( + "class MyError(BaseException): ..." + ); + ClassType myError = types.get(0); + var mro = myError.mro(); + assertThat(mro).isPresent(); + assertThat(mro.get().get(0)).isSameAs(myError); + assertThat(mro.get().stream().map(ClassType::name)).contains("BaseException"); + } + + @Test + void mro_c3_ordering() { + // From https://docs.python.org/3/howto/mro.html + // class F: ... + // class E: ... + // class D: ... + // class C(D, F): ... + // class B(D, E): ... + // class A(B, C): ... + // MRO(A) = A, B, C, D, E, F + List types = classTypes( + "class F: ...", + "class E: ...", + "class D: ...", + "class C(D, F): ...", + "class B(D, E): ...", + "class A(B, C): ..." + ); + ClassType f = types.get(0); + ClassType e = types.get(1); + ClassType d = types.get(2); + ClassType c = types.get(3); + ClassType b = types.get(4); + ClassType a = types.get(5); + assertThat(a.mro()).isPresent().get().asInstanceOf( + org.assertj.core.api.InstanceOfAssertFactories.list(ClassType.class)) + .containsExactly(a, b, c, d, e, f); + } + @Test void builder() { ClassTypeBuilder classTypeBuilder = new ClassTypeBuilder("A", "mod.A"); From 918238341bac2b30bb5c78f6b6b5b8f8a9715e97 Mon Sep 17 00:00:00 2001 From: "sonar-nigel[bot]" <247337653+sonar-nigel[bot]@users.noreply.github.com> Date: Tue, 14 Apr 2026 09:34:01 +0200 Subject: [PATCH 084/322] SONARPY-3900 Rule S8490 Enum classes should not be decorated with "@dataclass" (#955) Co-authored-by: Sonar Vibe Bot Co-authored-by: Guillaume Dequenne GitOrigin-RevId: 2ea7d69e608246c14839314a1b539e1e06db7457 --- .../python/checks/DataClassOnEnumCheck.java | 72 +++++++ .../python/checks/OpenSourceCheckList.java | 1 + .../org/sonar/l10n/py/rules/python/S8490.html | 51 +++++ .../org/sonar/l10n/py/rules/python/S8490.json | 24 +++ .../py/rules/python/Sonar_way_profile.json | 1 + .../checks/DataClassOnEnumCheckTest.java | 28 +++ .../test/resources/checks/dataClassOnEnum.py | 193 ++++++++++++++++++ 7 files changed, 370 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/DataClassOnEnumCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8490.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8490.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/DataClassOnEnumCheckTest.java create mode 100644 python-checks/src/test/resources/checks/dataClassOnEnum.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/DataClassOnEnumCheck.java b/python-checks/src/main/java/org/sonar/python/checks/DataClassOnEnumCheck.java new file mode 100644 index 000000000..45df3120a --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/DataClassOnEnumCheck.java @@ -0,0 +1,72 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.ClassDef; +import org.sonar.plugins.python.api.tree.Decorator; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; + +@Rule(key = "S8490") +public class DataClassOnEnumCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Remove this \"@dataclass\" decorator; it is incompatible with Enum classes."; + + private static final TypeMatcher IS_ENUM_MATCHER = TypeMatchers.any( + TypeMatchers.isOrExtendsType("enum.Enum"), + TypeMatchers.isOrExtendsType("enum.IntEnum"), + TypeMatchers.isOrExtendsType("enum.IntFlag")); + private static final TypeMatcher IS_DATACLASS_MATCHER = TypeMatchers.isType("dataclasses.dataclass"); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.CLASSDEF, DataClassOnEnumCheck::checkClassDef); + } + + private static void checkClassDef(SubscriptionContext ctx) { + ClassDef classDef = (ClassDef) ctx.syntaxNode(); + + if (classDef.decorators().isEmpty()) { + return; + } + + if (!IS_ENUM_MATCHER.isTrueFor(classDef.name(), ctx)) { + return; + } + + for (Decorator decorator : classDef.decorators()) { + Expression decoratorExpr = getDecoratorFunctionExpression(decorator); + if (IS_DATACLASS_MATCHER.isTrueFor(decoratorExpr, ctx)) { + ctx.addIssue(decorator, MESSAGE); + } + } + } + + private static Expression getDecoratorFunctionExpression(Decorator decorator) { + Expression expr = decorator.expression(); + if (expr instanceof CallExpression callExpr) { + return callExpr.callee(); + } + return expr; + } +} diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index bb6462010..4c7eb692a 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -181,6 +181,7 @@ public Stream> getChecks() { CorsCheck.class, CorsMiddlewareOrderingCheck.class, CsrfDisabledCheck.class, + DataClassOnEnumCheck.class, DataEncryptionCheck.class, DbNoPasswordCheck.class, DeadStoreCheck.class, diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8490.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8490.html new file mode 100644 index 000000000..e10d0d619 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8490.html @@ -0,0 +1,51 @@ +

      This is an issue when a class inherits from Enum and is also decorated with @dataclass.

      +

      Why is this an issue?

      +

      The @dataclass decorator and Enum classes are incompatible and should not be used together.

      +

      The @dataclass decorator automatically generates special methods like __init__, __repr__, and +__eq__ for regular classes. It modifies the class definition to add these methods based on the class attributes.

      +

      However, Enum classes use a special metaclass called EnumMeta that controls how enum members are created and behave. Enum +members are not regular instances - they are singleton constants that are created when the class is defined.

      +

      When you try to combine these two features, several problems occur:

      +
        +
      • The @dataclass decorator tries to modify the class in ways that conflict with the Enum metaclass
      • +
      • The automatic __init__ generation from @dataclass interferes with how Enum members are instantiated
      • +
      • At runtime, this typically results in a TypeError because the modifications are incompatible
      • +
      +

      Enums are designed to represent a fixed set of named constants, while dataclasses are meant to hold data with potentially varying values. These are +fundamentally different purposes that should not be mixed.

      +

      What is the potential impact?

      +

      This code pattern will cause a TypeError at runtime when Python attempts to create the class. The application will fail to start or +the module will fail to import, preventing the code from running at all.

      +

      This is a critical reliability issue that blocks normal program execution.

      +

      How to fix it

      +

      Remove the @dataclass decorator from the Enum class. Enums work perfectly fine without it and have their own mechanisms for defining +members.

      +

      Code examples

      +

      Noncompliant code example

      +
      +from dataclasses import dataclass
      +from enum import Enum
      +
      +@dataclass  # Noncompliant
      +class Status(Enum):
      +    PENDING = 1
      +    APPROVED = 2
      +    REJECTED = 3
      +
      +

      Compliant solution

      +
      +from enum import Enum
      +
      +class Status(Enum):
      +    PENDING = 1
      +    APPROVED = 2
      +    REJECTED = 3
      +
      +

      Resources

      +

      Documentation

      + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8490.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8490.json new file mode 100644 index 000000000..efde2bc5a --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8490.json @@ -0,0 +1,24 @@ +{ + "title": "Enum classes should not be decorated with \"@dataclass\"", + "type": "BUG", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "pitfall", + "enum" + ], + "defaultSeverity": "Blocker", + "ruleSpecification": "RSPEC-8490", + "sqKey": "S8490", + "scope": "All", + "quickfix": "unknown", + "code": { + "impacts": { + "RELIABILITY": "BLOCKER" + }, + "attribute": "LOGICAL" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 231a4b032..595b178bd 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -328,6 +328,7 @@ "S8413", "S8414", "S8415", + "S8490", "S8494", "S8495", "S8504", diff --git a/python-checks/src/test/java/org/sonar/python/checks/DataClassOnEnumCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/DataClassOnEnumCheckTest.java new file mode 100644 index 000000000..58f61247a --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/DataClassOnEnumCheckTest.java @@ -0,0 +1,28 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.junit.jupiter.api.Test; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class DataClassOnEnumCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/dataClassOnEnum.py", new DataClassOnEnumCheck()); + } +} diff --git a/python-checks/src/test/resources/checks/dataClassOnEnum.py b/python-checks/src/test/resources/checks/dataClassOnEnum.py new file mode 100644 index 000000000..6a0af2282 --- /dev/null +++ b/python-checks/src/test/resources/checks/dataClassOnEnum.py @@ -0,0 +1,193 @@ +from dataclasses import dataclass +from enum import Enum, IntEnum, Flag, IntFlag, StrEnum +import dataclasses + + +# @dataclass on Enum - Noncompliant cases + +@dataclass # Noncompliant {{Remove this "@dataclass" decorator; it is incompatible with Enum classes.}} +class Status(Enum): + PENDING = 1 + APPROVED = 2 + REJECTED = 3 + + +# @dataclass with arguments + +@dataclass(frozen=True) # Noncompliant +class Color(Enum): + RED = 1 + GREEN = 2 + BLUE = 3 + + +# Using dataclasses.dataclass qualified name + +@dataclasses.dataclass # Noncompliant +class Direction(Enum): + NORTH = "N" + SOUTH = "S" + EAST = "E" + WEST = "W" + + +@dataclasses.dataclass(eq=True, order=True) # Noncompliant +class Priority(Enum): + LOW = 1 + MEDIUM = 2 + HIGH = 3 + + +# @dataclass on IntEnum and Flag (transitively extend Enum) + +@dataclass # Noncompliant +class ErrorCode(IntEnum): + NOT_FOUND = 404 + SERVER_ERROR = 500 + + +@dataclass # Noncompliant +class Permission(Flag): + READ = 1 + WRITE = 2 + EXECUTE = 4 + + +@dataclass # Noncompliant +class FileMode(IntFlag): + READ = 4 + WRITE = 2 + EXECUTE = 1 + + +# @dataclass on StrEnum (Python 3.11+) + +@dataclass # Noncompliant +class HttpMethod(StrEnum): + GET = "GET" + POST = "POST" + + +# @dataclass on an indirect Enum subclass + +class BaseStatus(Enum): + pass + +@dataclass # Noncompliant +class ExtendedStatus(BaseStatus): + PENDING = 1 + ACTIVE = 2 + + +# @dataclass among multiple decorators + +def my_decorator(cls): + return cls + +@my_decorator +@dataclass # Noncompliant +class State(Enum): + OPEN = "open" + CLOSED = "closed" + + +@dataclass # Noncompliant +@my_decorator +class Stage(Enum): + START = 1 + END = 2 + + +# @dataclass with multiple keyword arguments + +@dataclass(repr=False, eq=False) # Noncompliant +class Suit(Enum): + HEARTS = 1 + DIAMONDS = 2 + CLUBS = 3 + SPADES = 4 + + +# @dataclass on class with multiple bases including Enum + +class Mixin: + pass + +@dataclass # Noncompliant +class Mixed(Mixin, Enum): + FIRST = 1 + SECOND = 2 + + +# Compliant: Enum without @dataclass + +class CompliantStatus(Enum): + PENDING = 1 + APPROVED = 2 + REJECTED = 3 + + +class CompliantErrorCode(IntEnum): + NOT_FOUND = 404 + SERVER_ERROR = 500 + + +class CompliantPermission(Flag): + READ = 1 + WRITE = 2 + EXECUTE = 4 + + +class CompliantHttpMethod(StrEnum): + GET = "GET" + POST = "POST" + + +# Compliant: @dataclass on a plain class (not Enum) + +@dataclass +class Point: + x: float + y: float + + +@dataclass(frozen=True) +class Config: + host: str + port: int + + +@dataclasses.dataclass +class Rectangle: + width: float + height: float + + +# Compliant: custom (non-dataclass) decorator on an Enum + +@my_decorator +class DecoratedStatus(Enum): + ACTIVE = 1 + INACTIVE = 2 + + +# Compliant: Enum subclass without @dataclass + +class CompliantExtended(BaseStatus): + ACTIVE = 1 + INACTIVE = 2 + + +# Compliant: unknown base class — cannot confirm Enum inheritance + +@dataclass +class UnknownBase(UnknownParent): + value: int = 0 + + +# Compliant: unknown decorator on an Enum — not a dataclass + +@unknown_decorator +class StatusWithUnknownDecorator(Enum): + ACTIVE = 1 + INACTIVE = 2 From 912c3629f48a415e2094f19ba30269bf0899ecfd Mon Sep 17 00:00:00 2001 From: "sonar-nigel[bot]" <247337653+sonar-nigel[bot]@users.noreply.github.com> Date: Tue, 14 Apr 2026 09:40:15 +0000 Subject: [PATCH 085/322] SONARPY-3912 Rule S8493 "StopIteration" should not be raised inside generators (#957) GitOrigin-RevId: d2513cf9afb9167f8a7d2431ed871efa9e137ca0 --- .../python/checks/OpenSourceCheckList.java | 1 + .../checks/StopIterationInGeneratorCheck.java | 63 ++++++ .../org/sonar/l10n/py/rules/python/S8493.html | 52 +++++ .../org/sonar/l10n/py/rules/python/S8493.json | 25 +++ .../py/rules/python/Sonar_way_profile.json | 3 +- .../StopIterationInGeneratorCheckTest.java | 29 +++ .../checks/stopIterationInGenerator.py | 203 ++++++++++++++++++ 7 files changed, 375 insertions(+), 1 deletion(-) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/StopIterationInGeneratorCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8493.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8493.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/StopIterationInGeneratorCheckTest.java create mode 100644 python-checks/src/test/resources/checks/stopIterationInGenerator.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 4c7eb692a..2e9164d7d 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -414,6 +414,7 @@ public Stream> getChecks() { SpecialMethodReturnTypeCheck.class, SQLQueriesCheck.class, StandardInputCheck.class, + StopIterationInGeneratorCheck.class, StrftimeConfusingHourSystemCheck.class, StringFormatCorrectnessCheck.class, StringFormatMisuseCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/StopIterationInGeneratorCheck.java b/python-checks/src/main/java/org/sonar/python/checks/StopIterationInGeneratorCheck.java new file mode 100644 index 000000000..04caf1840 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/StopIterationInGeneratorCheck.java @@ -0,0 +1,63 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.FunctionDef; +import org.sonar.plugins.python.api.tree.RaiseStatement; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.tree.TreeUtils; + +@Rule(key = "S8493") +public class StopIterationInGeneratorCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Replace this \"raise StopIteration\" with a \"return\" statement."; + + private final TypeMatcher stopIterationMatcher = TypeMatchers.any( + TypeMatchers.isObjectOfType("StopIteration"), + TypeMatchers.isType("StopIteration") + ); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.RAISE_STMT, this::checkRaise); + } + + private void checkRaise(SubscriptionContext ctx) { + RaiseStatement raiseStatement = (RaiseStatement) ctx.syntaxNode(); + if (raiseStatement.expressions().isEmpty()) { + return; + } + Expression expression = raiseStatement.expressions().get(0); + if (!stopIterationMatcher.isTrueFor(expression, ctx)) { + return; + } + FunctionDef enclosingFunction = (FunctionDef) TreeUtils.firstAncestorOfKind(raiseStatement, Tree.Kind.FUNCDEF); + if (enclosingFunction == null) { + return; + } + if (!ReturnCheckUtils.ReturnStmtCollector.collect(enclosingFunction).containsYield()) { + return; + } + ctx.addIssue(raiseStatement, MESSAGE); + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8493.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8493.html new file mode 100644 index 000000000..d92d437f1 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8493.html @@ -0,0 +1,52 @@ +

      This rule raises an issue when StopIteration is explicitly raised within a generator function, that is, a function containing +yield.

      +

      Why is this an issue?

      +

      In Python, generators are special functions that use the yield keyword to produce a sequence of values lazily. They implement the +iterator protocol and are used to create iterators in a concise way.

      +

      Traditionally, raising StopIteration was the standard way to signal that an iterator had no more values to produce. However, this +could lead to subtle bugs when StopIteration exceptions from nested iterators or function calls accidentally propagated up and terminated +the generator unexpectedly.

      +

      To address this issue, PEP 479 changed the behavior in Python 3.7+. Now, when +StopIteration is raised inside a generator function, Python automatically converts it to a RuntimeError. This conversion +happens at the point where the exception would leave the generator.

      +

      This means code that explicitly raises StopIteration in a generator will fail with a RuntimeError at runtime in Python +3.7 and later versions. The error message will indicate that the StopIteration exception was raised inside a generator.

      +

      The proper way to terminate a generator is to use a return statement, optionally with a value. When a generator executes a +return, Python automatically raises StopIteration behind the scenes, but does so in a way that is compatible with PEP +479.

      +

      What is the potential impact?

      +

      When StopIteration is raised inside a generator in Python 3.7+, it causes a RuntimeError at runtime. This can lead +to:

      +
        +
      • application crashes or unexpected failures
      • +
      • difficult-to-debug errors, especially in production environments
      • +
      • code that works in older Python versions but breaks when upgraded
      • +
      • inconsistent behavior across different Python versions
      • +
      +

      How to fix it

      +

      Replace the raise StopIteration statement with a return statement. In generators, return is the proper way +to signal completion. If you need to return a value when the generator completes, you can use return value, though note that this value +is not yielded but becomes the exception value of the StopIteration that is automatically raised.

      +

      Code examples

      +

      Noncompliant code example

      +
      +def my_generator():
      +    yield 1
      +    yield 2
      +    raise StopIteration  # Noncompliant
      +
      +

      Compliant solution

      +
      +def my_generator():
      +    yield 1
      +    yield 2
      +    return  # Properly terminates the generator
      +
      +

      Resources

      +

      Documentation

      + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8493.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8493.json new file mode 100644 index 000000000..bb764c394 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8493.json @@ -0,0 +1,25 @@ +{ + "title": "\"StopIteration\" should not be raised inside generators", + "type": "BUG", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5 min" + }, + "tags": [ + "pitfall", + "python3" + ], + "defaultSeverity": "Blocker", + "ruleSpecification": "RSPEC-8493", + "sqKey": "S8493", + "scope": "Main", + "quickfix": "unknown", + "code": { + "impacts": { + "RELIABILITY": "BLOCKER", + "MAINTAINABILITY": "HIGH" + }, + "attribute": "LOGICAL" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 595b178bd..e8aa9f852 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -334,6 +334,7 @@ "S8504", "S8517", "S8520", - "S8521" + "S8521", + "S8493" ] } diff --git a/python-checks/src/test/java/org/sonar/python/checks/StopIterationInGeneratorCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/StopIterationInGeneratorCheckTest.java new file mode 100644 index 000000000..8c824a317 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/StopIterationInGeneratorCheckTest.java @@ -0,0 +1,29 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.junit.jupiter.api.Test; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class StopIterationInGeneratorCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/stopIterationInGenerator.py", new StopIterationInGeneratorCheck()); + } + +} diff --git a/python-checks/src/test/resources/checks/stopIterationInGenerator.py b/python-checks/src/test/resources/checks/stopIterationInGenerator.py new file mode 100644 index 000000000..09a886460 --- /dev/null +++ b/python-checks/src/test/resources/checks/stopIterationInGenerator.py @@ -0,0 +1,203 @@ +def generator_basic(): + yield 1 + yield 2 + raise StopIteration # Noncompliant {{Replace this "raise StopIteration" with a "return" statement.}} + +def generator_with_int_arg(): + yield 1 + raise StopIteration(42) # Noncompliant {{Replace this "raise StopIteration" with a "return" statement.}} + +def generator_with_str_arg(): + yield 1 + raise StopIteration("message") # Noncompliant {{Replace this "raise StopIteration" with a "return" statement.}} + +def generator_raise_in_if(condition): + yield 1 + if condition: + raise StopIteration # Noncompliant + +def generator_raise_in_else(condition): + yield 1 + if condition: + pass + else: + raise StopIteration # Noncompliant + +def generator_raise_in_for(items): + for item in items: + if item is None: + raise StopIteration # Noncompliant + yield item + +def generator_raise_in_while(): + count = 0 + while count < 10: + if count == 5: + raise StopIteration # Noncompliant + yield count + count += 1 + +def generator_raise_in_try(): + yield 1 + try: + raise StopIteration # Noncompliant + except ValueError: + pass + +def generator_raise_in_except(): + yield 1 + try: + pass + except StopIteration: + raise StopIteration # Noncompliant + +def generator_raise_in_finally(): + yield 1 + try: + pass + finally: + raise StopIteration # Noncompliant + +def generator_raise_chained(): + yield 1 + raise StopIteration from ValueError("cause") # Noncompliant + +async def async_generator_raise(): + yield 1 + raise StopIteration # Noncompliant + +def generator_after_yield_from(): + yield from range(3) + raise StopIteration # Noncompliant + +def generator_nested_control_flow(data): + for item in data: + yield item + if item > 100: + if item > 1000: + raise StopIteration # Noncompliant + + +def generator_return(): + yield 1 + yield 2 + return + +def generator_return_value(): + yield 1 + return 42 + +def generator_natural_exhaustion(): + yield 1 + yield 2 + +def regular_function(): + raise StopIteration + +class ManualIterator: + def __init__(self): + self.count = 0 + + def __next__(self): + self.count += 1 + if self.count > 3: + raise StopIteration + return self.count + +def helper_raises(): + raise StopIteration + +def generator_calls_helper(): + yield 1 + helper_raises() + +def outer_generator_nested_helper(): + def inner_helper(): + raise StopIteration + yield 1 + inner_helper() + +def generator_catches_stop_iteration(): + yield 1 + try: + pass + except StopIteration: + return + +def generator_raises_value_error(): + yield 1 + raise ValueError("not a stop iteration") + +def generator_bare_raise(): + yield 1 + try: + pass + except Exception: + raise + +raise StopIteration + +def generator_deeply_nested_helper(): + def inner_non_generator(): + def innermost(): + raise StopIteration + innermost() + yield 1 + inner_non_generator() + +async def async_generator_catches(): + yield 1 + try: + pass + except StopIteration: + return + + +class IteratorClass: + def generator_method(self): + yield 1 + raise StopIteration # Noncompliant + + +def nested_generators(): + def inner_generator(): + yield 10 + raise StopIteration # Noncompliant + yield 1 + raise StopIteration # Noncompliant + + +class CustomStopIteration(StopIteration): + pass + +def generator_raises_stop_iteration_subclass(): + yield 1 + raise CustomStopIteration + + +def generator_raises_stop_iteration_subclass_instance(): + yield 1 + raise CustomStopIteration("done") + + +def generator_raise_assigned_variable(): + yield 1 + exc = StopIteration("error") + raise exc # Noncompliant + + +async def async_generator_yield_from(): + yield from range(3) + raise StopIteration # Noncompliant + + +def generator_yield_in_nested_loop(items, stop_early): + # Real-world pattern: yield inside nested for loop, raise StopIteration in elif branch + for item in items: + if isinstance(item, list): + for x in item: + yield x + elif stop_early: + raise StopIteration # Noncompliant + else: + yield item From 11925f41b0fe7e09f7411d9273e4f49aa5290669 Mon Sep 17 00:00:00 2001 From: "sonar-nigel[bot]" <247337653+sonar-nigel[bot]@users.noreply.github.com> Date: Tue, 14 Apr 2026 09:55:31 +0000 Subject: [PATCH 086/322] SONARPY-4011 Rule S8507 TypeVar, ParamSpec, and NewType names should match their assigned variable names (#1040) GitOrigin-RevId: 6c637df3b657e7959d17bda21463f8ce4a4bb3f7 --- .../python/checks/OpenSourceCheckList.java | 1 + .../checks/TypeVarNamingConventionCheck.java | 84 +++++++ .../org/sonar/l10n/py/rules/python/S8507.html | 41 ++++ .../org/sonar/l10n/py/rules/python/S8507.json | 25 +++ .../py/rules/python/Sonar_way_profile.json | 1 + .../TypeVarNamingConventionCheckTest.java | 30 +++ .../checks/typeVarNamingConvention.py | 212 ++++++++++++++++++ 7 files changed, 394 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/TypeVarNamingConventionCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8507.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8507.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/TypeVarNamingConventionCheckTest.java create mode 100644 python-checks/src/test/resources/checks/typeVarNamingConvention.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 2e9164d7d..7aa325b7e 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -451,6 +451,7 @@ public Stream> getChecks() { TrailingWhitespaceCheck.class, TypeAliasAnnotationCheck.class, TypeVarCovariantAndContravariantCheck.class, + TypeVarNamingConventionCheck.class, TfFunctionDependOnOutsideVariableCheck.class, TfFunctionRecursivityCheck.class, TfInputShapeOnModelSubclassCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/TypeVarNamingConventionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/TypeVarNamingConventionCheck.java new file mode 100644 index 000000000..adca3049d --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/TypeVarNamingConventionCheck.java @@ -0,0 +1,84 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.AssignmentStatement; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.ExpressionList; +import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.StringLiteral; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.tree.TreeUtils; + +@Rule(key = "S8507") +public class TypeVarNamingConventionCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Rename this string to match the variable name \"%s\"."; + + private static final TypeMatcher TYPING_CONSTRUCT_MATCHER = TypeMatchers.any( + TypeMatchers.isType("typing.TypeVar"), + TypeMatchers.isType("typing_extensions.TypeVar"), + TypeMatchers.isType("typing.ParamSpec"), + TypeMatchers.isType("typing_extensions.ParamSpec"), + TypeMatchers.isType("typing.NewType"), + TypeMatchers.isType("typing_extensions.NewType") + ); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, TypeVarNamingConventionCheck::checkCall); + } + + private static void checkCall(SubscriptionContext ctx) { + CallExpression call = (CallExpression) ctx.syntaxNode(); + if (!TYPING_CONSTRUCT_MATCHER.isTrueFor(call.callee(), ctx)) { + return; + } + RegularArgument firstArg = TreeUtils.nthArgumentOrKeyword(0, "name", call.arguments()); + if (firstArg == null || !firstArg.expression().is(Tree.Kind.STRING_LITERAL)) { + return; + } + StringLiteral stringLiteral = (StringLiteral) firstArg.expression(); + String stringName = stringLiteral.trimmedQuotesValue(); + + Tree parent = call.parent(); + if (!(parent instanceof AssignmentStatement assignment)) { + return; + } + if (assignment.lhsExpressions().size() != 1) { + return; + } + ExpressionList lhsExprList = assignment.lhsExpressions().get(0); + if (lhsExprList.expressions().size() != 1) { + return; + } + Tree lhsExpr = lhsExprList.expressions().get(0); + if (!lhsExpr.is(Tree.Kind.NAME)) { + return; + } + String variableName = ((Name) lhsExpr).name(); + if (!stringName.equals(variableName)) { + ctx.addIssue(stringLiteral, String.format(MESSAGE, variableName)); + } + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8507.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8507.html new file mode 100644 index 000000000..86bf4e441 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8507.html @@ -0,0 +1,41 @@ +

      This rule raises an issue when a TypeVar, ParamSpec, or NewType is assigned to a variable whose name does +not match the string name passed to its constructor.

      +

      Why is this an issue?

      +

      In Python’s typing system, TypeVar, ParamSpec, and NewType are special constructs used to define generic +types and type aliases. When creating these objects, you provide a string name as the first argument to the constructor. The convention is that this +string name should match the variable name to which the type is assigned.

      +

      When the names do not match, type checkers and runtime error messages use the string name from the constructor, which can make error messages +confusing. IDEs and other development tools may also rely on this naming convention to provide accurate type information.

      +

      What is the potential impact?

      +

      Mismatched names create confusion for developers reading the code and make error messages harder to understand. This can slow down debugging and +make code reviews more difficult, reducing overall development efficiency.

      +

      In larger codebases with multiple type variables, mismatched names can lead to mistakes when refactoring or extending generic classes and +functions.

      +

      How to fix it

      +

      Ensure the string name passed to the constructor matches the variable name it is assigned to.

      +

      Code examples

      +

      Noncompliant code example

      +
      +from typing import TypeVar, ParamSpec, NewType
      +
      +MyType = TypeVar("T")  # Noncompliant: variable is "MyType" but string is "T"
      +MyParams = ParamSpec("P")  # Noncompliant: variable is "MyParams" but string is "P"
      +MyInt = NewType("Integer", int)  # Noncompliant: variable is "MyInt" but string is "Integer"
      +
      +

      Compliant solution

      +
      +from typing import TypeVar, ParamSpec, NewType
      +
      +MyType = TypeVar("MyType")  # Compliant: names match
      +MyParams = ParamSpec("MyParams")  # Compliant: names match
      +MyInt = NewType("MyInt", int)  # Compliant: names match
      +
      +

      Resources

      +

      Documentation

      + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8507.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8507.json new file mode 100644 index 000000000..5ba073ad0 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8507.json @@ -0,0 +1,25 @@ +{ + "title": "TypeVar, ParamSpec, and NewType names should match their assigned variable names", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "convention", + "type-hint", + "readability" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-8507", + "sqKey": "S8507", + "scope": "All", + "quickfix": "targeted", + "code": { + "impacts": { + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "CLEAR" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index e8aa9f852..27ffeaab5 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -332,6 +332,7 @@ "S8494", "S8495", "S8504", + "S8507", "S8517", "S8520", "S8521", diff --git a/python-checks/src/test/java/org/sonar/python/checks/TypeVarNamingConventionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/TypeVarNamingConventionCheckTest.java new file mode 100644 index 000000000..1387767c5 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/TypeVarNamingConventionCheckTest.java @@ -0,0 +1,30 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.junit.jupiter.api.Test; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class TypeVarNamingConventionCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify( + "src/test/resources/checks/typeVarNamingConvention.py", + new TypeVarNamingConventionCheck()); + } +} diff --git a/python-checks/src/test/resources/checks/typeVarNamingConvention.py b/python-checks/src/test/resources/checks/typeVarNamingConvention.py new file mode 100644 index 000000000..ea9973a2b --- /dev/null +++ b/python-checks/src/test/resources/checks/typeVarNamingConvention.py @@ -0,0 +1,212 @@ +from typing import TypeVar, ParamSpec, NewType +from typing import TypeVar as TV +from typing import ParamSpec as PS +from typing import NewType as NT +from typing_extensions import TypeVar as ExtTV +from typing_extensions import ParamSpec as ExtPS +from typing_extensions import NewType as ExtNewType +import typing +import typing_extensions + +MyType = TypeVar("T") # Noncompliant {{Rename this string to match the variable name "MyType".}} +# ^^^ + +MyParams = ParamSpec("P") # Noncompliant {{Rename this string to match the variable name "MyParams".}} +# ^^^ + +MyInt = NewType("Integer", int) # Noncompliant {{Rename this string to match the variable name "MyInt".}} +# ^^^^^^^^^ + +AnotherType = typing.TypeVar("T") # Noncompliant {{Rename this string to match the variable name "AnotherType".}} +# ^^^ + +MyPS = typing.ParamSpec("P") # Noncompliant {{Rename this string to match the variable name "MyPS".}} +# ^^^ + +MyNewType = typing.NewType("OtherName", int) # Noncompliant +# ^^^^^^^^^^^ + +MyExtType = typing_extensions.TypeVar("E") # Noncompliant +# ^^^ + +MyExtParams = typing_extensions.ParamSpec("P") # Noncompliant +# ^^^ + +MyExtInt = typing_extensions.NewType("ExtInteger", int) # Noncompliant +# ^^^^^^^^^^^^ + +MyAliasType = TV("T") # Noncompliant +# ^^^ + +MyAliasParams = PS("Params") # Noncompliant +# ^^^^^^^^ + +MyAliasInt = NT("UserId", int) # Noncompliant +# ^^^^^^^^ + +MyExtAliasType = ExtTV("E") # Noncompliant +# ^^^ + +MyExtAliasParams = ExtPS("Params") # Noncompliant +# ^^^^^^^^ + +MyExtAliasInt = ExtNewType("OtherName", int) # Noncompliant +# ^^^^^^^^^^^ + +MyVar = TypeVar("myVar") # Noncompliant +# ^^^^^^^ + +T_co = TypeVar("T_contra") # Noncompliant +# ^^^^^^^^^^ + +UserId = NewType("UserID", int) # Noncompliant +# ^^^^^^^^ + +ElementType = TypeVar("E") # Noncompliant +# ^^^ + +NewName = TypeVar("OldName") # Noncompliant +# ^^^^^^^^^ + +NumberType = TypeVar("Num", int, float) # Noncompliant +# ^^^^^ + +ComparableType = TypeVar("Comparable", bound=int) # Noncompliant +# ^^^^^^^^^^^^ + +MyCovariantType = TypeVar("T_co", covariant=True) # Noncompliant +# ^^^^^^ + +MyContraType = TypeVar("T_contra", contravariant=True) # Noncompliant +# ^^^^^^^^^^ + +EmptyStr = TypeVar("") # Noncompliant +# ^^ + +MySingleQuoteType = TypeVar('MySingleQuoteTypo') # Noncompliant +# ^^^^^^^^^^^^^^^^^^^ + + +def noncompliant_inside_function(): + InnerType = TypeVar("T") # Noncompliant +# ^^^ + InnerParams = ParamSpec("P") # Noncompliant +# ^^^ + InnerNew = NewType("OtherName", int) # Noncompliant +# ^^^^^^^^^^^ + + +class MyGenericClass: + ClassVar1 = TypeVar("T") # Noncompliant +# ^^^ + ClassVar2 = ParamSpec("P") # Noncompliant +# ^^^ + ClassVar3 = NewType("OtherName", int) # Noncompliant +# ^^^^^^^^^^^ + + +T = TypeVar("T") +P = ParamSpec("P") +UserId2 = NewType("UserId2", int) + +MyType2 = TypeVar("MyType2") +MyParams2 = ParamSpec("MyParams2") +MyInt2 = NewType("MyInt2", int) + +T_co2 = TypeVar("T_co2", covariant=True) +T_contra2 = TypeVar("T_contra2", contravariant=True) + +T_bound = TypeVar("T_bound", bound=int) +T_constrained = TypeVar("T_constrained", int, str) + +AnotherType2 = typing.TypeVar("AnotherType2") +MyPS2 = typing.ParamSpec("MyPS2") +MyNT2 = typing.NewType("MyNT2", str) + +MyExtType2 = typing_extensions.TypeVar("MyExtType2") +MyExtParams2 = typing_extensions.ParamSpec("MyExtParams2") +MyExtInt2 = typing_extensions.NewType("MyExtInt2", int) + +T_alias = TV("T_alias") +P_alias = PS("P_alias") +NT_alias = NT("NT_alias", int) +ExtT_alias = ExtTV("ExtT_alias") +ExtP_alias = ExtPS("ExtP_alias") +ExtNT_alias = ExtNewType("ExtNT_alias", int) + +MySingleQuoteType2 = TypeVar('MySingleQuoteType2') + +MyRawType = TypeVar(r"MyRawType") +MyTripleType = TypeVar("""MyTripleType""") + +MyRawTypeBad = TypeVar(r"WrongRaw") # Noncompliant {{Rename this string to match the variable name "MyRawTypeBad".}} +# ^^^^^^^^^^^ +MyTripleTypeBad = TypeVar("""WrongTriple""") # Noncompliant {{Rename this string to match the variable name "MyTripleTypeBad".}} +# ^^^^^^^^^^^^^^^^^ + +_name = "T" +T_dynamic = TypeVar(_name) + +T_computed = TypeVar("T".lower()) + +result = list(TypeVar("T")) + + +def make_typevar(): + return TypeVar("T") + + +def compliant_inside_function(): + InnerT = TypeVar("InnerT") + InnerP = ParamSpec("InnerP") + InnerNT = NewType("InnerNT", int) + + +class CompliantGenericClass: + ClassT = TypeVar("ClassT") + ClassP = ParamSpec("ClassP") + ClassNT = NewType("ClassNT", int) + + +try: + T_noargs = TypeVar() # noqa +except TypeError: + pass + +_kwargs = {"covariant": True} +T_unpacked = TypeVar(**_kwargs) + +A = B = TypeVar("A") + +C, D = TypeVar("C"), TypeVar("D") + +(G, H) = TypeVar("T") + +I, J = TypeVar("T") + +_d = {} +_d["key"] = TypeVar("T") + + +class _Holder: + pass + + +_obj = _Holder() +_obj.attr = TypeVar("T") + +_flag = True +T_ternary = TypeVar("T_ternary") if _flag else TypeVar("T_ternary") + +E, F = TypeVar("T"), TypeVar("T") + +T_keyword_match = TypeVar(name="T_keyword_match") +T_keyword_mismatch = TypeVar(name="WrongName") # Noncompliant {{Rename this string to match the variable name "T_keyword_mismatch".}} +# ^^^^^^^^^^^ + +import typing as _typing +# Annotated assignments (AnnotatedAssignment node) are not AssignmentStatement, so they are skipped. +T_annotated: _typing.TypeAlias = TypeVar("WrongName") + +if walrus := TypeVar("T"): + pass From 1a254431f27d12d6058a5b0355de1e4e49fd2a19 Mon Sep 17 00:00:00 2001 From: "sonar-nigel[bot]" <247337653+sonar-nigel[bot]@users.noreply.github.com> Date: Thu, 16 Apr 2026 09:50:28 +0200 Subject: [PATCH 087/322] SONARPY-3975 Rule S8519 "list(...)[0]" should not be used to get the first element (#1011) Co-authored-by: Marc Jasper GitOrigin-RevId: 8e7c0b37c56887d7ed66e8693af4504223faa0de --- .../checks/ListIterableFirstElementCheck.java | 98 +++++++++++++++++++ .../python/checks/OpenSourceCheckList.java | 1 + .../org/sonar/l10n/py/rules/python/S8519.html | 56 +++++++++++ .../org/sonar/l10n/py/rules/python/S8519.json | 24 +++++ .../py/rules/python/Sonar_way_profile.json | 1 + .../ListIterableFirstElementCheckTest.java | 70 +++++++++++++ .../checks/listIterableFirstElement.py | 51 ++++++++++ 7 files changed, 301 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/ListIterableFirstElementCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8519.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8519.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/ListIterableFirstElementCheckTest.java create mode 100644 python-checks/src/test/resources/checks/listIterableFirstElement.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/ListIterableFirstElementCheck.java b/python-checks/src/main/java/org/sonar/python/checks/ListIterableFirstElementCheck.java new file mode 100644 index 000000000..9476c1f79 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/ListIterableFirstElementCheck.java @@ -0,0 +1,98 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.quickfix.PythonQuickFix; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.NumericLiteral; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.SubscriptionExpression; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.quickfix.TextEditUtils; +import org.sonar.python.tree.NumericLiteralImpl; +import org.sonar.python.tree.TreeUtils; + +@Rule(key = "S8519") +public class ListIterableFirstElementCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Replace \"list(...)[0]\" with \"next(iter(...))\" to avoid materializing the entire iterable."; + private static final TypeMatcher IS_LIST = TypeMatchers.isType("list"); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.SUBSCRIPTION, ListIterableFirstElementCheck::checkSubscription); + } + + private static void checkSubscription(SubscriptionContext ctx) { + SubscriptionExpression subscriptionExpression = (SubscriptionExpression) ctx.syntaxNode(); + + var subscripts = subscriptionExpression.subscripts(); + if (!subscripts.commas().isEmpty() || subscripts.expressions().size() != 1) { + return; + } + + var subscript = subscripts.expressions().get(0); + if (!(subscript instanceof NumericLiteral numericLiteral)) { + return; + } + if (!isIntegerLiteralSubscript(numericLiteral)) { + return; + } + long indexValue; + try { + indexValue = numericLiteral.valueAsLong(); + } catch (NumberFormatException e) { + return; + } + if (indexValue != 0L) { + return; + } + + if (!(subscriptionExpression.object() instanceof CallExpression listCall)) { + return; + } + + if (!IS_LIST.isTrueFor(listCall.callee(), ctx)) { + return; + } + + if (listCall.arguments().size() != 1 || !(listCall.arguments().get(0) instanceof RegularArgument regularArg)) { + return; + } + + PreciseIssue issue = ctx.addIssue(listCall.callee(), MESSAGE); + + String argText = TreeUtils.treeToString(regularArg.expression(), false); + if (argText != null && !argText.contains("\n")) { + PythonQuickFix quickFix = PythonQuickFix.newQuickFix("Replace with \"next(iter(...))\"", + TextEditUtils.replace(subscriptionExpression, "next(iter(" + argText + "))")); + issue.addQuickFix(quickFix); + } + } + + private static boolean isIntegerLiteralSubscript(NumericLiteral literal) { + if (literal instanceof NumericLiteralImpl impl) { + return impl.numericKind() == NumericLiteralImpl.NumericKind.INT; + } + return false; + } +} diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 7aa325b7e..3d51a4b3f 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -306,6 +306,7 @@ public Stream> getChecks() { LambdaAssignmentCheck.class, LdapAuthenticationCheck.class, LineLengthCheck.class, + ListIterableFirstElementCheck.class, LocalVariableAndParameterNameConventionCheck.class, LoggersConfigurationCheck.class, LongIntegerWithLowercaseSuffixUsageCheck.class, diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8519.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8519.html new file mode 100644 index 000000000..4fe9011c7 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8519.html @@ -0,0 +1,56 @@ +

      This rule raises an issue when code uses list(iterable)[0] to retrieve the first element of an iterable.

      +

      Why is this an issue?

      +

      Using list(iterable)[0] to get the first element of an iterable is inefficient because it materializes the entire iterable into a list +in memory before accessing the first element.

      +

      This approach has two main problems:

      +
        +
      • Memory overhead: The entire iterable is converted to a list, consuming memory proportional to its size. For large iterables or + generators, this can waste significant memory.
      • +
      • Time complexity: Creating the list is an O(n) operation, where n is the number of elements in the iterable. You pay the cost of + iterating through all elements even though you only need the first one.
      • +
      +

      The pattern is particularly problematic with:

      +
        +
      • large datasets or database query results
      • +
      • generator expressions and generator functions
      • +
      • file readers or network streams
      • +
      • infinite iterables, which will cause the program to hang or crash
      • +
      +

      What is the potential impact?

      +
        +
      • applications may become unresponsive or crash due to out-of-memory errors when processing large datasets
      • +
      • execution time increases unnecessarily, degrading user experience in performance-critical paths
      • +
      • infinite iterables cannot be consumed at all, causing the program to hang
      • +
      • infrastructure costs grow as data size increases due to wasted memory and CPU cycles
      • +
      +

      How to fix it

      +

      Replace list(iterable)[0] with next(iter(iterable)) to retrieve only the first element without materializing the entire +iterable into a list. The iter() function creates an iterator, and next() retrieves the next item from that iterator, in +O(1) time and without allocating memory for the entire collection.

      +

      Note that the two expressions differ in the exception raised when the iterable is empty: list(iterable)[0] raises +IndexError, while next(iter(iterable)) raises StopIteration. If the surrounding code catches +IndexError, update the handler after applying this fix.

      +

      Code examples

      +

      Noncompliant code example

      +
      +def get_first_user(users):
      +    return list(users)[0]  # Noncompliant
      +
      +

      Compliant solution

      +
      +def get_first_user(users):
      +    return next(iter(users))
      +
      +

      Resources

      +

      Documentation

      + +

      External coding guidelines

      + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8519.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8519.json new file mode 100644 index 000000000..5f18b7d0c --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8519.json @@ -0,0 +1,24 @@ +{ + "title": "\"list(...)[0]\" should not be used to get the first element", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "performance", + "pythonic" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-8519", + "sqKey": "S8519", + "scope": "All", + "quickfix": "targeted", + "code": { + "impacts": { + "RELIABILITY": "MEDIUM" + }, + "attribute": "EFFICIENT" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 27ffeaab5..cdfc4e65d 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -334,6 +334,7 @@ "S8504", "S8507", "S8517", + "S8519", "S8520", "S8521", "S8493" diff --git a/python-checks/src/test/java/org/sonar/python/checks/ListIterableFirstElementCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/ListIterableFirstElementCheckTest.java new file mode 100644 index 000000000..a429550fa --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/ListIterableFirstElementCheckTest.java @@ -0,0 +1,70 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import java.util.stream.Stream; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.sonar.python.checks.quickfix.PythonQuickFixVerifier; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class ListIterableFirstElementCheckTest { + + private static final ListIterableFirstElementCheck check = new ListIterableFirstElementCheck(); + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/listIterableFirstElement.py", check); + } + + static Stream quickFixTestCases() { + return Stream.of( + Arguments.of("list(get_users())[0]", "next(iter(get_users()))"), + Arguments.of("list(users)[0]", "next(iter(users))"), + Arguments.of("list(x for x in range(10))[0]", "next(iter(x for x in range(10)))"), + Arguments.of("list(filter(None, items))[0]", "next(iter(filter(None, items)))") + ); + } + + @ParameterizedTest + @MethodSource("quickFixTestCases") + void test_quick_fix(String codeWithIssue, String correctCode) { + PythonQuickFixVerifier.verify(check, codeWithIssue, correctCode); + } + + @Test + void test_quick_fix_message() { + String codeWithIssue = "list(get_users())[0]"; + + PythonQuickFixVerifier.verifyQuickFixMessages(check, codeWithIssue, "Replace with \"next(iter(...))\""); + } + + @Test + void test_no_quick_fix_multiline_argument_expression() { + String codeWithIssue = """ + list( + get_items( + arg + ) + )[0] + """; + + PythonQuickFixVerifier.verifyNoQuickFixes(check, codeWithIssue); + } +} diff --git a/python-checks/src/test/resources/checks/listIterableFirstElement.py b/python-checks/src/test/resources/checks/listIterableFirstElement.py new file mode 100644 index 000000000..e0b5de285 --- /dev/null +++ b/python-checks/src/test/resources/checks/listIterableFirstElement.py @@ -0,0 +1,51 @@ + +def noncompliant_materialize_first(users): + return list(users)[0] # Noncompliant {{Replace "list(...)[0]" with "next(iter(...))" to avoid materializing the entire iterable.}} +# ^^^^ + + +def compliant_next_iter(users): + return next(iter(users)) + +def compliant_nonzero_index(items): + return list(items)[1] + +def compliant_float_subscript(items): + return list(items)[0.0] + +def compliant_float_scientific_zero(items): + return list(items)[0e0] + +def compliant_complex_subscript(items): + return list(items)[0j] + +def compliant_negative_index(items): + return list(items)[-1] + +def compliant_slice(items): + return list(items)[0:1] + +def compliant_tuple_subscript(items): + return list(items)[0, 1] + +def compliant_starred(args): + return list(*args)[0] + +def compliant_multiple_args(): + return list([], [])[0] + +def compliant_direct_index(items): + return items[0] + +def compliant_two_step_list(items): + all_items = list(items) + return all_items[0] # out of scope: [0] applies to a Name, not to list(...) call + +def compliant_shadowed_list(items): + list = lambda x: x + return list(items)[0] + + +def fn_subscript_not_literal_zero(items): + zero = 0 + return list(items)[zero] # FN: subscript must be numeric literal 0 From 1e4c9bd68ef611d56256d85acddb2bc6af0c4eda Mon Sep 17 00:00:00 2001 From: "sonar-nigel[bot]" <247337653+sonar-nigel[bot]@users.noreply.github.com> Date: Mon, 20 Apr 2026 08:51:23 +0200 Subject: [PATCH 088/322] SONARPY-3992 Rule S8513 "startswith" and "endswith" calls should use tuples instead of multiple "or" operators (#1016) Co-authored-by: Marc Jasper GitOrigin-RevId: ccff1f73850e2d46e33a778430deca03a4117cf4 --- .../python/checks/OpenSourceCheckList.java | 1 + .../checks/StartsWithEndsWithTupleCheck.java | 224 ++++++++++++++++++ .../org/sonar/l10n/py/rules/python/S8513.html | 41 ++++ .../org/sonar/l10n/py/rules/python/S8513.json | 17 ++ .../py/rules/python/Sonar_way_profile.json | 1 + .../StartsWithEndsWithTupleCheckTest.java | 135 +++++++++++ .../checks/startsWithEndsWithTupleCheck.py | 133 +++++++++++ 7 files changed, 552 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/StartsWithEndsWithTupleCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8513.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8513.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/StartsWithEndsWithTupleCheckTest.java create mode 100644 python-checks/src/test/resources/checks/startsWithEndsWithTupleCheck.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 3d51a4b3f..22c210602 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -415,6 +415,7 @@ public Stream> getChecks() { SpecialMethodReturnTypeCheck.class, SQLQueriesCheck.class, StandardInputCheck.class, + StartsWithEndsWithTupleCheck.class, StopIterationInGeneratorCheck.class, StrftimeConfusingHourSystemCheck.class, StringFormatCorrectnessCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/StartsWithEndsWithTupleCheck.java b/python-checks/src/main/java/org/sonar/python/checks/StartsWithEndsWithTupleCheck.java new file mode 100644 index 000000000..988e30b52 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/StartsWithEndsWithTupleCheck.java @@ -0,0 +1,224 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.TriBool; +import org.sonar.plugins.python.api.quickfix.PythonQuickFix; +import org.sonar.plugins.python.api.tree.Argument; +import org.sonar.plugins.python.api.tree.BinaryExpression; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.QualifiedExpression; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.checks.utils.CheckUtils; +import org.sonar.python.checks.utils.Expressions; +import org.sonar.python.quickfix.TextEditUtils; +import org.sonar.python.tree.TreeUtils; + +@Rule(key = "S8513") +public class StartsWithEndsWithTupleCheck extends PythonSubscriptionCheck { + + private static final String STARTSWITH = "startswith"; + private static final String ENDSWITH = "endswith"; + + private static final TypeMatcher STR_BYTES_OR_BYTEARRAY_METHOD_MATCHER = TypeMatchers.isFunctionOwnerSatisfying( + TypeMatchers.any( + TypeMatchers.isOrExtendsType("builtins.str"), + TypeMatchers.isOrExtendsType("builtins.bytes"), + TypeMatchers.isOrExtendsType("builtins.bytearray"))); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.OR, StartsWithEndsWithTupleCheck::checkOrExpression); + } + + private static void checkOrExpression(SubscriptionContext ctx) { + BinaryExpression orExpr = (BinaryExpression) ctx.syntaxNode(); + Tree ancestor = orExpr.parent(); + while (ancestor instanceof Expression expr && Expressions.removeParentheses(expr) != expr) { + ancestor = ancestor.parent(); + } + if (ancestor != null && ancestor.is(Tree.Kind.OR)) { + return; + } + + List operands = flattenOrChain(orExpr); + if (operands.size() < 2) { + return; + } + + Optional> maybeCalls = extractCalls(operands, ctx); + if (maybeCalls.isEmpty()) { + return; + } + List calls = maybeCalls.get(); + + String methodName = extractUniformMethodName(calls); + if (methodName == null) { + return; + } + + if (!allSameReceiver(calls)) { + return; + } + + if (anyReceiverHasNestedCall(calls)) { + return; + } + + Optional> maybeArgTexts = extractStringLiteralArgs(calls); + if (maybeArgTexts.isEmpty()) { + return; + } + List argTexts = maybeArgTexts.get(); + + String message = String.format("Replace chained \"%s\" calls with a single call using a tuple argument.", methodName); + String receiverText = receiverSourceText(calls.get(0)); + if (receiverText == null) { + return; + } + String replacement = receiverText + "." + methodName + "((" + String.join(", ", argTexts) + "))"; + PythonQuickFix quickFix = PythonQuickFix.newQuickFix("Replace with a single call using a tuple argument", + TextEditUtils.replace(orExpr, replacement)); + ctx.addIssue(orExpr, message).addQuickFix(quickFix); + } + + private static List flattenOrChain(BinaryExpression orExpr) { + List result = new ArrayList<>(); + flattenOrChainInto(orExpr, result); + return result; + } + + private static void flattenOrChainInto(Expression expr, List result) { + Expression stripped = Expressions.removeParentheses(expr); + if (stripped.is(Tree.Kind.OR)) { + BinaryExpression binExpr = (BinaryExpression) stripped; + flattenOrChainInto(binExpr.leftOperand(), result); + flattenOrChainInto(binExpr.rightOperand(), result); + } else { + result.add(stripped); + } + } + + private static Optional> extractCalls(List operands, SubscriptionContext ctx) { + List calls = new ArrayList<>(); + for (Expression operand : operands) { + Expression stripped = Expressions.removeParentheses(operand); + if (!stripped.is(Tree.Kind.CALL_EXPR)) { + return Optional.empty(); + } + CallExpression call = (CallExpression) stripped; + if (!isStartsWithOrEndsWith(call, ctx)) { + return Optional.empty(); + } + calls.add(call); + } + return Optional.of(calls); + } + + private static boolean isStartsWithOrEndsWith(CallExpression call, SubscriptionContext ctx) { + if (!call.callee().is(Tree.Kind.QUALIFIED_EXPR)) { + return false; + } + QualifiedExpression callee = (QualifiedExpression) call.callee(); + String name = callee.name().name(); + if (!STARTSWITH.equals(name) && !ENDSWITH.equals(name)) { + return false; + } + return STR_BYTES_OR_BYTEARRAY_METHOD_MATCHER.evaluateFor(callee, ctx) != TriBool.FALSE; + } + + private static String extractUniformMethodName(List calls) { + String methodName = null; + for (CallExpression call : calls) { + QualifiedExpression callee = (QualifiedExpression) call.callee(); + String name = callee.name().name(); + if (methodName == null) { + methodName = name; + } else if (!methodName.equals(name)) { + return null; + } + } + return methodName; + } + + private static boolean allSameReceiver(List calls) { + Expression firstReceiver = getReceiver(calls.get(0)); + for (int i = 1; i < calls.size(); i++) { + Expression receiver = getReceiver(calls.get(i)); + if (!CheckUtils.areEquivalent(firstReceiver, receiver)) { + return false; + } + } + return true; + } + + private static Expression getReceiver(CallExpression call) { + return ((QualifiedExpression) call.callee()).qualifier(); + } + + private static boolean anyReceiverHasNestedCall(List calls) { + for (CallExpression call : calls) { + Expression receiver = getReceiver(call); + if (receiver.is(Tree.Kind.CALL_EXPR) || TreeUtils.hasDescendant(receiver, t -> t.is(Tree.Kind.CALL_EXPR))) { + return true; + } + } + return false; + } + + private static Optional> extractStringLiteralArgs(List calls) { + List argTexts = new ArrayList<>(); + for (CallExpression call : calls) { + List args = call.arguments(); + if (args.size() != 1) { + return Optional.empty(); + } + Argument arg = args.get(0); + if (!(arg instanceof RegularArgument regularArg)) { + return Optional.empty(); + } + if (regularArg.keywordArgument() != null) { + return Optional.empty(); + } + Expression argExpr = regularArg.expression(); + if (!argExpr.is(Tree.Kind.STRING_LITERAL)) { + return Optional.empty(); + } + String argSource = TreeUtils.treeToString(argExpr, false); + if (argSource == null) { + return Optional.empty(); + } + argTexts.add(argSource); + } + return Optional.of(argTexts); + } + + private static String receiverSourceText(CallExpression call) { + Expression receiver = getReceiver(call); + return TreeUtils.treeToString(receiver, false); + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8513.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8513.html new file mode 100644 index 000000000..9ddf8e0c7 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8513.html @@ -0,0 +1,41 @@ +

      This rule raises an issue when multiple startswith() or endswith() calls on the same string are chained with the +or operator to check for different prefixes or suffixes.

      +

      Why is this an issue?

      +

      When you need to check if a string starts or ends with one of several possible values, chaining multiple startswith() or +endswith() calls with the or operator creates unnecessary verbosity. Both methods accept a tuple of strings as their first +argument, so a single call with a tuple is both more concise and more readable.

      +

      How to fix it

      +

      Replace multiple startswith() or endswith() calls connected by or operators with a single call that uses a +tuple containing all the prefixes or suffixes.

      +

      Code examples

      +

      Noncompliant code example

      +
      +if s.startswith("http://") or s.startswith("https://"):  # Noncompliant
      +    process_url(s)
      +
      +

      Compliant solution

      +
      +if s.startswith(("http://", "https://")):
      +    process_url(s)
      +
      +

      Noncompliant code example

      +
      +if filename.endswith(".jpg") or filename.endswith(".png") or filename.endswith(".gif"):  # Noncompliant
      +    display_image(filename)
      +
      +

      Compliant solution

      +
      +if filename.endswith((".jpg", ".png", ".gif")):
      +    display_image(filename)
      +
      +

      Resources

      +

      Documentation

      + +

      Related rules

      +
        +
      • {rule:python:S6659} - startswith or endswith methods should be used instead of string slicing in condition + expressions
      • +
      diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8513.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8513.json new file mode 100644 index 000000000..31bb2cc32 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8513.json @@ -0,0 +1,17 @@ +{ + "title": "\"startswith\" and \"endswith\" calls should use tuples instead of multiple \"or\" operators", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "convention" + ], + "defaultSeverity": "Minor", + "ruleSpecification": "RSPEC-8513", + "sqKey": "S8513", + "scope": "All", + "quickfix": "covered" +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index cdfc4e65d..097785f13 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -333,6 +333,7 @@ "S8495", "S8504", "S8507", + "S8513", "S8517", "S8519", "S8520", diff --git a/python-checks/src/test/java/org/sonar/python/checks/StartsWithEndsWithTupleCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/StartsWithEndsWithTupleCheckTest.java new file mode 100644 index 000000000..274c1bb7f --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/StartsWithEndsWithTupleCheckTest.java @@ -0,0 +1,135 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import java.util.stream.Stream; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.sonar.python.checks.quickfix.PythonQuickFixVerifier; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class StartsWithEndsWithTupleCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/startsWithEndsWithTupleCheck.py", new StartsWithEndsWithTupleCheck()); + } + + static Stream quickFixTestCases() { + return Stream.of( + Arguments.of( + """ + s = "https://example.com" + s.startswith("http://") or s.startswith("https://") + """, + """ + s = "https://example.com" + s.startswith(("http://", "https://")) + """, + "Replace with a single call using a tuple argument"), + Arguments.of( + """ + filename = "photo.jpg" + filename.endswith(".jpg") or filename.endswith(".png") + """, + """ + filename = "photo.jpg" + filename.endswith((".jpg", ".png")) + """, + "Replace with a single call using a tuple argument"), + Arguments.of( + """ + data = b"hello world" + data.startswith(b"hello") or data.startswith(b"hi") + """, + """ + data = b"hello world" + data.startswith((b"hello", b"hi")) + """, + "Replace with a single call using a tuple argument"), + Arguments.of( + """ + paths = ["/usr/bin", "/etc/conf"] + paths[0].startswith("/usr") or paths[0].startswith("/etc") + """, + """ + paths = ["/usr/bin", "/etc/conf"] + paths[0].startswith(("/usr", "/etc")) + """, + "Replace with a single call using a tuple argument"), + Arguments.of( + """ + filename = "report.pdf" + filename.endswith(".pdf") or filename.endswith(".doc") or filename.endswith(".txt") + """, + """ + filename = "report.pdf" + filename.endswith((".pdf", ".doc", ".txt")) + """, + "Replace with a single call using a tuple argument"), + Arguments.of( + """ + class MyClass: + def check(self): + self.name.startswith("a") or self.name.startswith("b") + """, + """ + class MyClass: + def check(self): + self.name.startswith(("a", "b")) + """, + "Replace with a single call using a tuple argument"), + Arguments.of( + """ + s = "https://example.com" + if (s.startswith("http://") + or s.startswith("https://")): + pass + """, + """ + s = "https://example.com" + if (s.startswith(("http://", "https://"))): + pass + """, + "Replace with a single call using a tuple argument"), + Arguments.of( + """ + s = "https://example.com" + if s.startswith("http://") \\ + or s.startswith("https://"): + pass + """, + """ + s = "https://example.com" + if s.startswith(("http://", "https://")): + pass + """, + "Replace with a single call using a tuple argument") + ); + } + + @ParameterizedTest + @MethodSource("quickFixTestCases") + void testQuickFix(String before, String after, String expectedMessage) { + var check = new StartsWithEndsWithTupleCheck(); + PythonQuickFixVerifier.verify(check, before, after); + PythonQuickFixVerifier.verifyQuickFixMessages(check, before, expectedMessage); + } + +} diff --git a/python-checks/src/test/resources/checks/startsWithEndsWithTupleCheck.py b/python-checks/src/test/resources/checks/startsWithEndsWithTupleCheck.py new file mode 100644 index 000000000..1094513ae --- /dev/null +++ b/python-checks/src/test/resources/checks/startsWithEndsWithTupleCheck.py @@ -0,0 +1,133 @@ +def noncompliant_chained_startswith(): + s = "https://example.com" + if s.startswith("http://") or s.startswith("https://"): # Noncompliant {{Replace chained "startswith" calls with a single call using a tuple argument.}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + pass + + +def noncompliant_chained_startswith_parenthesized_subgroup(): + s = "https://example.com" + if (s.startswith("http://") or s.startswith("https://")) or s.startswith("ftp://"): # Noncompliant {{Replace chained "startswith" calls with a single call using a tuple argument.}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + pass + + +def noncompliant_chained_endswith(): + filename = "report.pdf" + if filename.endswith(".pdf") or filename.endswith(".doc"): # Noncompliant {{Replace chained "endswith" calls with a single call using a tuple argument.}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + pass + + +class MyClass: + def noncompliant_attribute_receiver(self): + if self.name.startswith("a") or self.name.startswith("b"): # Noncompliant {{Replace chained "startswith" calls with a single call using a tuple argument.}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + pass + + +def compliant_different_receivers(): + a = "hello" + b = "world" + if a.startswith("he") or b.startswith("wo"): + pass + + +def compliant_mixed_methods(): + filename = "photo.jpg" + if filename.startswith("photo") or filename.endswith(".jpg"): + pass + + +def compliant_mixed_startswith_endswith_three_calls(): + s = "example.txt" + if s.startswith("ex") or s.endswith(".txt") or s.startswith("test"): + pass + + +def compliant_operand_not_chainable(): + s = "https://example.com" + if s.lower() or s.startswith("https://"): + pass + + if s.startswith("http://") or s.upper(): + pass + + +def compliant_dynamic_argument(): + prefix = "http" + s = "https://example.com" + if s.startswith(prefix) or s.startswith("https://"): + pass + + +def compliant_negated_calls(): + filename = "report.pdf" + if not filename.endswith(".tmp") or not filename.endswith(".bak"): + pass + + +def compliant_different_function_call_receivers(): + def get_value(): + return "https://example.com" + def get_other(): + return "ftp://example.com" + if get_value().startswith("http://") or get_other().startswith("https://"): + pass + + +def compliant_extra_argument(): + s = "https://example.com" + if s.startswith("http://") or s.startswith("https://", 0): + pass + + +def compliant_no_argument(): + s = "https://example.com" + if s.startswith() or s.startswith("https://"): + pass + + +def compliant_function_call_receiver(): + def get_url(): + return "https://example.com" + if get_url().startswith("http://") or get_url().startswith("https://"): + pass + + +def compliant_nested_call_in_receiver(): + class Obj: + def inner(self): + return "https://example.com" + def outer(): + return Obj() + if outer().inner().startswith("http://") or outer().inner().startswith("https://"): + pass + + +def compliant_unpacked_argument(): + prefixes = ("http://",) + s = "https://example.com" + if s.startswith(*prefixes) or s.startswith("https://"): + pass + + +def compliant_unqualified_call_operand(): + s = "https://example.com" + if startswith("http://") or startswith("https://"): + pass + + +def compliant_keyword_argument(): + s = "https://example.com" + if s.startswith("http://") or s.startswith(prefix="https://"): + pass + + +def compliant_custom_startswith_on_non_string_type(): + class MyMatcher: + def startswith(self, prefix): + return False + m = MyMatcher() + if m.startswith("foo") or m.startswith("bar"): + pass From 21653e89e1cd572fe67f79e3333aea06cf639321 Mon Sep 17 00:00:00 2001 From: "sonar-nigel[bot]" <247337653+sonar-nigel[bot]@users.noreply.github.com> Date: Mon, 20 Apr 2026 17:28:25 +0200 Subject: [PATCH 089/322] SONARPY-4051 Rule S8505 "@singledispatch" and "@singledispatchmethod" should not be confused (#1060) Co-authored-by: Marc Jasper GitOrigin-RevId: 7b91ea27e57ef4b847944f9075d67db89d2faac3 --- .../python/checks/OpenSourceCheckList.java | 1 + .../checks/SingleDispatchMixupCheck.java | 77 +++++++++ .../org/sonar/l10n/py/rules/python/S8505.html | 153 ++++++++++++++++++ .../org/sonar/l10n/py/rules/python/S8505.json | 25 +++ .../py/rules/python/Sonar_way_profile.json | 1 + .../checks/SingleDispatchMixupCheckTest.java | 29 ++++ .../resources/checks/singleDispatchMixup.py | 64 ++++++++ 7 files changed, 350 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/SingleDispatchMixupCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8505.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8505.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/SingleDispatchMixupCheckTest.java create mode 100644 python-checks/src/test/resources/checks/singleDispatchMixup.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 22c210602..433ca4908 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -406,6 +406,7 @@ public Stream> getChecks() { SillyIdentityCheck.class, SingleCharacterAlternationCheck.class, SingleCharCharacterClassCheck.class, + SingleDispatchMixupCheck.class, SkippedTestNoReasonCheck.class, SkLearnEstimatorDontInitializeEstimatedValuesCheck.class, SleepZeroInAsyncCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/SingleDispatchMixupCheck.java b/python-checks/src/main/java/org/sonar/python/checks/SingleDispatchMixupCheck.java new file mode 100644 index 000000000..cd2ddfab1 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/SingleDispatchMixupCheck.java @@ -0,0 +1,77 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import java.util.List; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.Decorator; +import org.sonar.plugins.python.api.tree.FunctionDef; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; + +@Rule(key = "S8505") +public class SingleDispatchMixupCheck extends PythonSubscriptionCheck { + + private static final TypeMatcher SINGLEDISPATCH_MATCHER = TypeMatchers.isType("functools.singledispatch"); + private static final TypeMatcher SINGLEDISPATCHMETHOD_MATCHER = TypeMatchers.isType("functools.singledispatchmethod"); + private static final TypeMatcher STATICMETHOD_MATCHER = TypeMatchers.isType("builtins.staticmethod"); + + private static final String MSG_USE_SINGLEDISPATCHMETHOD = + "Use \"@singledispatchmethod\" instead of \"@singledispatch\" on methods defined in a class body."; + private static final String MSG_USE_SINGLEDISPATCH = + "Use \"@singledispatch\" instead of \"@singledispatchmethod\" on standalone functions."; + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.FUNCDEF, SingleDispatchMixupCheck::checkFunctionDef); + } + + private static void checkFunctionDef(SubscriptionContext ctx) { + FunctionDef functionDef = (FunctionDef) ctx.syntaxNode(); + List decorators = functionDef.decorators(); + if (decorators.isEmpty()) { + return; + } + + boolean isMethod = functionDef.isMethodDefinition(); + + for (int i = 0; i < decorators.size(); i++) { + Decorator decorator = decorators.get(i); + if (SINGLEDISPATCH_MATCHER.isTrueFor(decorator.expression(), ctx)) { + // @singledispatch on a method is broken: dispatch happens on self's/cls's type. + // The only valid combination on a method is @staticmethod applied as an outer decorator + if (isMethod && !isWrappedByOuterStaticmethod(decorators, i, ctx)) { + ctx.addIssue(decorator, MSG_USE_SINGLEDISPATCHMETHOD); + } + } else if (SINGLEDISPATCHMETHOD_MATCHER.isTrueFor(decorator.expression(), ctx) && !isMethod) { + ctx.addIssue(decorator, MSG_USE_SINGLEDISPATCH); + } + } + } + + private static boolean isWrappedByOuterStaticmethod(List decorators, int innerIndex, SubscriptionContext ctx) { + for (int i = 0; i < innerIndex; i++) { + if (STATICMETHOD_MATCHER.isTrueFor(decorators.get(i).expression(), ctx)) { + return true; + } + } + return false; + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8505.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8505.html new file mode 100644 index 000000000..8d07f5463 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8505.html @@ -0,0 +1,153 @@ +

      This rule raises an issue when @singledispatch is used on a class method instead of @singledispatchmethod, or when +@singledispatchmethod is used on a standalone function instead of @singledispatch.

      +

      Why is this an issue?

      +

      The @singledispatch and @singledispatchmethod decorators from functools serve different purposes and are not +interchangeable.

      +

      @singledispatch is designed for standalone functions. It dispatches based on the type of the first argument. When applied to an +instance method, the first argument is self, so dispatch is performed on the type of the instance instead of on the actual data argument. +The registered type implementations (for example, for int or str) are therefore never selected based on the data, and the +behavior depends on the receiver:

      +
        +
      • When called on an instance of the class where the method is defined, the base implementation is invoked regardless of the data argument’s + type.
      • +
      • When called on an instance of a subclass, dispatch may resolve to a different registered implementation depending on the + subclass’s MRO, so the same call can produce different results in different parts of a class hierarchy. This is typically worse than always falling + back to the base implementation, because the bug becomes intermittent and hierarchy-dependent.
      • +
      +

      @singledispatchmethod is designed for instance methods and class methods. It returns a non-callable descriptor that relies on the +descriptor protocol to bind to an instance or class. When applied to a standalone function, the resulting object cannot be invoked at all, and calling +it raises TypeError: 'singledispatchmethod' object is not callable.

      +

      This rule also flags @singledispatch applied to a method decorated with @classmethod. In that case, the dispatcher +attempts to call a classmethod object directly and raises TypeError at call time.

      +

      In all of these cases, no error or warning is raised at decoration time, making the bug silent and hard to detect by reading the code alone.

      +

      Exceptions

      +

      The rule’s behavior with @staticmethod depends on the decorator order:

      +
        +
      • @singledispatch placed above @staticmethod is flagged. In that order, + @singledispatch wraps the staticmethod descriptor object, which prevents it from working as a static method and breaks + dispatch on instances (MyClass().process(value) raises TypeError).
      • +
      • @staticmethod placed above @singledispatch is not flagged, because + @singledispatch is then applied to a regular function and @staticmethod simply prevents Python from binding + self, so dispatch correctly happens on the data argument.
      • +
      +

      Note that even the non-flagged order is uncommon and easy to misuse: stacked decorators must be ordered carefully, and a future refactor that swaps +the order silently reintroduces the bug. Prefer using @singledispatch on a module-level function, or @singledispatchmethod +when the dispatcher needs to live on a class.

      +

      What is the potential impact?

      +

      Confusing these two decorators causes the type dispatch mechanism to behave incorrectly:

      +
        +
      • registered type implementations will not be called for the expected argument
      • +
      • with @singledispatch on an instance method, calls on subclasses may resolve to different registered + implementations than calls on the base class, so the same call site can produce different results depending on the receiver’s type
      • +
      • the code may appear to work in simple tests but fail or behave inconsistently in production with different input types or in larger class + hierarchies
      • +
      • debugging is difficult because no error or warning is raised at decoration time
      • +
      • the application may process data incorrectly, potentially leading to data corruption or security issues if type-specific validation or + sanitization is bypassed
      • +
      • combining @singledispatch with @classmethod raises a TypeError at call time
      • +
      +

      How to fix it

      +

      Code examples

      +

      Noncompliant code example

      +

      Using @singledispatch on a class method:

      +
      +from functools import singledispatch
      +
      +class Processor:
      +    @singledispatch  # Noncompliant: should use @singledispatchmethod for methods
      +    def process(self, data):
      +        return f"Processing: {data}"
      +
      +    @process.register(int)
      +    def _(self, data):
      +        return f"Processing int: {data}"
      +
      +    @process.register(str)
      +    def _(self, data):
      +        return f"Processing str: {data}"
      +
      +

      Compliant solution

      +
      +from functools import singledispatchmethod
      +
      +class Processor:
      +    @singledispatchmethod
      +    def process(self, data):
      +        return f"Processing: {data}"
      +
      +    @process.register(int)
      +    def _(self, data):
      +        return f"Processing int: {data}"
      +
      +    @process.register(str)
      +    def _(self, data):
      +        return f"Processing str: {data}"
      +
      +

      Noncompliant code example

      +

      Using @singledispatchmethod on a standalone function:

      +
      +from functools import singledispatchmethod
      +
      +@singledispatchmethod  # Noncompliant: should use @singledispatch for standalone functions
      +def process(data):
      +    return f"Processing: {data}"
      +
      +@process.register(int)
      +def _(data):
      +    return f"Processing int: {data}"
      +
      +@process.register(str)
      +def _(data):
      +    return f"Processing str: {data}"
      +
      +

      Compliant solution

      +
      +from functools import singledispatch
      +
      +@singledispatch
      +def process(data):
      +    return f"Processing: {data}"
      +
      +@process.register(int)
      +def _(data):
      +    return f"Processing int: {data}"
      +
      +@process.register(str)
      +def _(data):
      +    return f"Processing str: {data}"
      +
      +

      How does this work?

      +

      Use @singledispatch for standalone, module-level functions and @singledispatchmethod for instance methods and class +methods. The @singledispatch decorator dispatches on the first argument, while @singledispatchmethod skips self +or cls and dispatches on the next argument.

      +

      When combining @singledispatchmethod with @classmethod, @singledispatchmethod must remain the outermost +decorator so that the registration mechanism (process.register) is still available. @classmethod is then applied to the base +implementation and to each registered overload:

      +
      +from functools import singledispatchmethod
      +
      +class Processor:
      +    @singledispatchmethod
      +    @classmethod
      +    def process(cls, data):
      +        return f"Processing: {data}"
      +
      +    @process.register
      +    @classmethod
      +    def _(cls, data: int):
      +        return f"Processing int: {data}"
      +
      +

      For static methods, prefer turning the function into a module-level function decorated with @singledispatch. If the dispatcher must +live on the class, place @staticmethod above @singledispatch so that @singledispatch wraps a +regular function rather than a staticmethod descriptor; the inverse order breaks dispatch on instance calls and is reported by this +rule.

      +

      Resources

      +

      Documentation

      + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8505.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8505.json new file mode 100644 index 000000000..dca991af2 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8505.json @@ -0,0 +1,25 @@ +{ + "title": "\"@singledispatch\" and \"@singledispatchmethod\" should not be confused", + "type": "BUG", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "pitfall", + "confusing" + ], + "defaultSeverity": "Blocker", + "ruleSpecification": "RSPEC-8505", + "sqKey": "S8505", + "scope": "Main", + "quickfix": "no", + "code": { + "impacts": { + "RELIABILITY": "BLOCKER", + "MAINTAINABILITY": "HIGH" + }, + "attribute": "LOGICAL" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 097785f13..6381d27c4 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -332,6 +332,7 @@ "S8494", "S8495", "S8504", + "S8505", "S8507", "S8513", "S8517", diff --git a/python-checks/src/test/java/org/sonar/python/checks/SingleDispatchMixupCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/SingleDispatchMixupCheckTest.java new file mode 100644 index 000000000..77bd24569 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/SingleDispatchMixupCheckTest.java @@ -0,0 +1,29 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.junit.jupiter.api.Test; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class SingleDispatchMixupCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/singleDispatchMixup.py", new SingleDispatchMixupCheck()); + } + +} diff --git a/python-checks/src/test/resources/checks/singleDispatchMixup.py b/python-checks/src/test/resources/checks/singleDispatchMixup.py new file mode 100644 index 000000000..053d0cdef --- /dev/null +++ b/python-checks/src/test/resources/checks/singleDispatchMixup.py @@ -0,0 +1,64 @@ +from functools import singledispatch, singledispatchmethod + + +class WithSingledispatch: + @singledispatch # Noncompliant {{Use "@singledispatchmethod" instead of "@singledispatch" on methods defined in a class body.}} + #^^^^^^^^^^^^^^^ + def process(self, data): + pass + + +class WithWrongStaticmethodOrder: + @singledispatch # Noncompliant {{Use "@singledispatchmethod" instead of "@singledispatch" on methods defined in a class body.}} + @staticmethod + def handle(data): + pass + + +@singledispatchmethod # Noncompliant {{Use "@singledispatch" instead of "@singledispatchmethod" on standalone functions.}} +#^[sc=1;ec=21] +def process_standalone(data): + pass + + +@singledispatch +def compliant_standalone(data): + pass + + +class WithSingledispatchmethod: + @singledispatchmethod + def process(self, data): + pass + + +class WithValidStaticmethodOrder: + @staticmethod + @singledispatch + def process(data): + pass + + +class WithClassmethodAndSingledispatch: + @singledispatch # Noncompliant {{Use "@singledispatchmethod" instead of "@singledispatch" on methods defined in a class body.}} + @classmethod + def handle(cls, data): + pass + + +class WithSingledispatchmethodAndClassmethod: + @singledispatchmethod + @classmethod + def process(cls, data): + pass + + +class WithNestedFunction: + def outer(self): + @singledispatch # Compliant: nested function, not a method definition + def inner(data): + pass + + +def no_dispatch(data): + pass From e317068aa6e9a8516bc947d28c91526ad3db2feb Mon Sep 17 00:00:00 2001 From: Marc Jasper Date: Tue, 21 Apr 2026 12:40:08 +0200 Subject: [PATCH 090/322] SONARPY-4016 Fix S8511 FP on built-in containers with ABC bases (e.g. dict/MutableMapping) (#1066) GitOrigin-RevId: db4db4ef4f05d00eda8061cde8d8e9ef536e08d7 --- .../MultipleInheritanceMROConflictCheck.java | 29 +++--- .../checks/multipleInheritanceMROConflict.py | 95 +++++++++++++++++++ .../python/api/types/v2/ClassType.java | 17 +++- .../api/types/v2/ClassTypeMroUtils.java | 60 ++++++++---- .../python/api/types/v2/ClassTypeTest.java | 61 ++++++++++++ 5 files changed, 227 insertions(+), 35 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/MultipleInheritanceMROConflictCheck.java b/python-checks/src/main/java/org/sonar/python/checks/MultipleInheritanceMROConflictCheck.java index 83a101169..ef729fe4d 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/MultipleInheritanceMROConflictCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/MultipleInheritanceMROConflictCheck.java @@ -86,13 +86,14 @@ private static List collectPositionalBases(ArgList argList) { /** * Detects an MRO conflict: either via C3 when every base is fully resolved, or otherwise only * when {@link #findAncestorConflictIndex} finds an earlier base that is a strict superclass of a - * later base in our type graph (same structural issue as {@code class C(A, B)} with {@code B} - * subclassing {@code A}). + * later base. Both paths use a runtime-faithful view of built-in containers — see + * {@link ClassType#wouldHaveValidMro(List)}. */ private static boolean hasMroConflict(List types, int conflictIndex) { - return isFullyResolved(types) - ? !ClassType.wouldHaveValidMro(types) - : (conflictIndex >= 0); + if (isFullyResolved(types)) { + return !ClassType.wouldHaveValidMro(types); + } + return conflictIndex >= 0; } /** @@ -110,7 +111,10 @@ private static boolean isFullyResolved(List types) { /** * Returns the index {@code i} of the first base class that is an ancestor of some later base - * class at index {@code j > i}, or {@code -1} if no such pair exists. + * class at index {@code j > i}, or {@code -1} if no such pair exists. Paths from any later base + * that pass through a virtual-ABC-subclassing builtin are cut off, so typeshed-only ABC edges + * (e.g. {@code dict → MutableMapping}) are not treated as real ancestry — see + * {@link #isOrExtendsClassAtRuntime(ClassType, ClassType)}. */ private static int findAncestorConflictIndex(List types) { for (int i = 0; i < types.size() - 1; i++) { @@ -128,7 +132,7 @@ private static boolean laterBaseExtendsEarlier(List types, int i) { } for (int j = i + 1; j < types.size(); j++) { ClassType typeJ = types.get(j); - if (typeJ != null && isOrExtendsClass(typeJ, typeI)) { + if (typeJ != null && isOrExtendsClassAtRuntime(typeJ, typeI)) { return true; } } @@ -136,11 +140,12 @@ private static boolean laterBaseExtendsEarlier(List types, int i) { } /** - * Returns {@code true} if {@code candidate} is or extends {@code ancestor} (i.e., {@code ancestor} - * appears anywhere in {@code candidate}'s type hierarchy). Uses reference equality since - * {@link ClassType} instances are canonical singletons within a single analysis. + * Returns {@code true} if {@code ancestor} appears in {@code candidate}'s runtime type hierarchy. + * Traversal stops at virtual-ABC-subclassing builtins so their typeshed-only ABC parents are not + * reachable; see {@link ClassType#wouldHaveValidMro(List)}. Uses reference equality + * since {@link ClassType} instances are canonical within a single analysis. */ - private static boolean isOrExtendsClass(ClassType candidate, ClassType ancestor) { + private static boolean isOrExtendsClassAtRuntime(ClassType candidate, ClassType ancestor) { Set visited = new HashSet<>(); Deque queue = new ArrayDeque<>(); queue.add(candidate); @@ -152,7 +157,7 @@ private static boolean isOrExtendsClass(ClassType candidate, ClassType ancestor) if (current == ancestor) { return true; } - if (current instanceof ClassType ct) { + if (current instanceof ClassType ct && !ct.isVirtualAbcSubclassingBuiltin()) { enqueueDirectSuperclasses(ct, queue); } } diff --git a/python-checks/src/test/resources/checks/multipleInheritanceMROConflict.py b/python-checks/src/test/resources/checks/multipleInheritanceMROConflict.py index 5ae15906d..d1c54ed55 100644 --- a/python-checks/src/test/resources/checks/multipleInheritanceMROConflict.py +++ b/python-checks/src/test/resources/checks/multipleInheritanceMROConflict.py @@ -68,3 +68,98 @@ class CompliantTwoUnresolvedPeers(ExternalMixin, ExternalOther): class ConflictMid(Base, MidWithUnresolvedMixin): # Noncompliant {{Reorder or remove base classes to fix this MRO conflict.}} # ^^^^^^^^^^^ ^^^^< {{This base class is an ancestor of another listed base class appearing after it.}} pass + + +# --- typeshed lies about built-in containers inheriting from collections.abc ABCs --- +# At runtime these built-ins only inherit from `object` and are merely virtual-subclass-registered +# against the corresponding ABCs (via abc.ABCMeta.register). Python's MRO computation succeeds, so +# the rule must NOT flag these. +from collections.abc import ( + MutableMapping, + Mapping, + MutableSequence, + Sequence, + MutableSet, + Set as AbstractSet, +) + + +class CompliantDictMixin(MutableMapping, dict): + pass + + +class CompliantMappingDict(Mapping, dict): + pass + + +class CompliantListMixin(MutableSequence, list): + pass + + +class CompliantTupleMixin(Sequence, tuple): + pass + + +class CompliantSetMixin(MutableSet, set): + pass + + +class CompliantFrozenSetMixin(AbstractSet, frozenset): + pass + + +class CompliantBytearrayMixin(MutableSequence, bytearray): + pass + + +# Smoke tests for str/bytes — typeshed lists extra ABCs (Sequence, Hashable, …) that don't appear +# in their runtime MRO. +class CompliantStrMixin(Sequence, str): + pass + + +class CompliantBytesMixin(Sequence, bytes): + pass + + +# collections.deque has the same typeshed-vs-runtime mismatch as the builtin containers: +# typeshed declares `class deque(MutableSequence[_T])` but at runtime deque.__bases__ == (object,), +# with MutableSequence registered as a virtual subclass via abc.ABCMeta.register(). +from collections import deque + + +class CompliantDequeMixin(MutableSequence, deque): + pass + + +# Real conflict that involves a built-in container must still be flagged: dict before its own +# user subclass is a genuine "earlier-is-ancestor-of-later" situation that Python rejects. +class _UserDictSubclass(dict): + pass + + +class StillBrokenWithUserDict(dict, _UserDictSubclass): # Noncompliant {{Reorder or remove base classes to fix this MRO conflict.}} +# ^^^^^^^^^^^^^^^^^^^^^^^ ^^^^< {{This base class is an ancestor of another listed base class appearing after it.}} + pass + + +# The reverse order is valid Python (dict comes after its subclass) and must not be flagged. +class CompliantUserDictThenDict(_UserDictSubclass, dict): + pass + + +# Compliant: ABC paired with a user-defined dict subclass. typeshed (falsely) lists MutableMapping +# as ancestor of dict; the rule must not infer the same ancestry through `_UserDictSubclass`. +# Fully-resolved bases — exercises the C3 path (wouldHaveValidMro). +class CompliantAbcThenUserDict(MutableMapping, _UserDictSubclass): + pass + + +# Same scenario but with an extra unresolved external mixin to force the heuristic path +# (findAncestorConflictIndex / isOrExtendsClassAtRuntime). +class _UserDictWithUnresolvedMixin(dict, ExternalMixin): + pass + + +class CompliantAbcThenUserDictUnresolved(MutableMapping, _UserDictWithUnresolvedMixin): + pass diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/ClassType.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/ClassType.java index 58f2ab399..ed0368d89 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/ClassType.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/ClassType.java @@ -206,8 +206,12 @@ public Optional> mro() { } /** - * Returns whether C3 linearization would succeed for a hypothetical class whose direct bases are - * exactly {@code bases} in order. + * Returns whether C3 linearization would succeed at runtime for a hypothetical class whose direct + * bases are exactly {@code bases} in order. Uses Python's runtime view of built-in containers: + * typeshed-only inheritance edges from {@code dict}/{@code list}/{@code set}/… to their + * {@code collections.abc} / {@code typing} ABCs (which at runtime are + * {@code abc.ABCMeta.register()} virtual subclasses, not real bases) are ignored. This way, valid + * Python code such as {@code class N(MutableMapping, dict): pass} is not flagged. * *

      Precondition: every element of {@code bases} is non-null and fully resolved (no unresolved * hierarchy), matching what {@link #mro()} requires for each base. @@ -219,6 +223,15 @@ public static boolean wouldHaveValidMro(List bases) { return ClassTypeMroUtils.wouldHaveValidMro(bases); } + /** + * Returns {@code true} for built-in containers whose typeshed declaration includes fictional + * ABC inheritance that does not exist at runtime (e.g. {@code dict}, {@code list}, {@code set}). + * See {@link #wouldHaveValidMro(List)}. + */ + public boolean isVirtualAbcSubclassingBuiltin() { + return ClassTypeMroUtils.isVirtualAbcSubclassingBuiltin(this); + } + @Override public TriBool hasMember(String memberName) { // a ClassType is an object of class type, it has the same members as those present on any type diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/ClassTypeMroUtils.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/ClassTypeMroUtils.java index 73f5cd00c..a38b006e5 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/ClassTypeMroUtils.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/ClassTypeMroUtils.java @@ -27,27 +27,36 @@ /** * C3 linearization (Method Resolution Order) for {@link ClassType}. + * + *

      Built-in containers listed in {@link #VIRTUAL_ABC_SUBCLASSING_BUILTIN_FQNS} have typeshed + * declarations that lie about their bases (e.g. {@code class dict(MutableMapping, Generic)}), + * but at runtime they only inherit from {@code object} and the ABC relationship is a + * virtual-subclass registration via {@code abc.ABCMeta.register()}. {@link #compute(ClassType)} + * preserves the typeshed view (used by {@link ClassType#mro()}), while + * {@link #wouldHaveValidMro(List)} honours the runtime view (used to detect real MRO conflicts). */ final class ClassTypeMroUtils { + private static final Set VIRTUAL_ABC_SUBCLASSING_BUILTIN_FQNS = Set.of( + "dict", "list", "tuple", "set", "frozenset", "str", "bytes", "bytearray", "collections.deque" + ); + private ClassTypeMroUtils() { } - /** - * Computes the C3 MRO for {@code cls}, using a fresh memoisation cache. - */ static Optional> compute(ClassType cls) { - return compute(cls, new HashMap<>(), new HashSet<>()); + return compute(cls, new HashMap<>(), new HashSet<>(), false); } /** - * Returns whether C3 linearization would succeed for a hypothetical class whose direct bases are - * exactly {@code bases} in order — same behaviour as {@link ClassType#wouldHaveValidMro(List)}. + * Returns whether C3 would succeed at runtime for a hypothetical class whose direct bases are + * exactly {@code bases} in order. Backs {@link ClassType#wouldHaveValidMro(List)}. */ static boolean wouldHaveValidMro(List bases) { + Map>> cache = new HashMap<>(); List> lists = new ArrayList<>(); for (ClassType base : bases) { - Optional> mro = base.mro(); + Optional> mro = compute(base, cache, new HashSet<>(), true); if (mro.isEmpty()) { return true; } @@ -57,18 +66,34 @@ static boolean wouldHaveValidMro(List bases) { return c3Merge(lists) != null; } + static boolean isVirtualAbcSubclassingBuiltin(ClassType cls) { + String fqn = cls.fullyQualifiedName(); + return fqn != null && VIRTUAL_ABC_SUBCLASSING_BUILTIN_FQNS.contains(fqn); + } + /** - * Recursively computes the C3 MRO for {@code cls}, memoising results in {@code cache}. - * {@code visiting} guards against cycles. + * Recursively computes the C3 MRO for {@code cls}. {@code cache} memoises results across the + * traversal (callers may pass a fresh map); {@code visiting} guards against inheritance cycles. */ private static Optional> compute( ClassType cls, Map>> cache, - Set visiting + Set visiting, + boolean stripVirtualAbcInheritance ) { if (cache.containsKey(cls)) { return cache.get(cls); } + if (stripVirtualAbcInheritance && isVirtualAbcSubclassingBuiltin(cls)) { + // Runtime view: ignore the typeshed-declared parents but still keep {@code object} as the tail, + // so C3 rejects orderings like {@code class X(object, dict)} (object must come after dict). + // {@code object} is, by construction, the last element of {@code cls}'s non-stripped MRO. + Optional> fullMro = compute(cls, new HashMap<>(), new HashSet<>(), false); + List mro = fullMro.map(m -> List.of(cls, m.get(m.size() - 1))).orElseGet(() -> List.of(cls)); + Optional> result = Optional.of(mro); + cache.put(cls, result); + return result; + } if (!visiting.add(cls)) { // Cycle detected — treat as failure. return Optional.empty(); @@ -84,10 +109,9 @@ private static Optional> compute( List> lists = new ArrayList<>(); for (ClassType parent : parentTypes) { - Optional> parentMro = compute(parent, cache, visiting); + Optional> parentMro = compute(parent, cache, visiting, stripVirtualAbcInheritance); if (parentMro.isEmpty()) { - // A parent itself has an invalid MRO — Python would have raised TypeError - // when that parent was defined, so this class is not the root cause. + // A parent's MRO is invalid — Python would have raised TypeError there, not here. visiting.remove(cls); cache.put(cls, Optional.empty()); return Optional.empty(); @@ -110,10 +134,7 @@ private static Optional> compute( return result; } - /** - * Performs the C3 merge of the given lists. Returns the merged sequence, or {@code null} if no - * valid merge exists (i.e. the MRO has a conflict). - */ + /** Returns the C3 merge of {@code lists}, or {@code null} if no valid merge exists. */ @CheckForNull private static List c3Merge(List> lists) { List result = new ArrayList<>(); @@ -131,10 +152,7 @@ private static List c3Merge(List> lists) { } } - /** - * Returns the first list head that does not appear as a non-head entry in any list, or {@code null} - * if no such head exists (merge failure). - */ + /** Returns the first list head that doesn't appear as a non-head in any list, or {@code null}. */ @CheckForNull private static ClassType findFirstValidMergeHead(List> lists) { for (List list : lists) { diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/ClassTypeTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/ClassTypeTest.java index f650aa559..40c81a7ff 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/ClassTypeTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/ClassTypeTest.java @@ -967,6 +967,67 @@ void wouldHaveValidMro_returns_true_for_diamond_inheritance_bases() { assertThat(ClassType.wouldHaveValidMro(List.of(b, c))).isTrue(); } + @Test + void wouldHaveValidMro_ignores_typeshed_virtual_abc_inheritance_for_dict() { + // typeshed declares `class dict(MutableMapping[_KT, _VT], Generic[_KT, _VT])`, but at runtime + // dict only inherits from `object` and the MutableMapping relationship is a virtual-subclass + // registration via `abc.ABCMeta.register()`. C3 succeeds at runtime for class N(MutableMapping, dict). + List types = classTypes( + "from collections.abc import MutableMapping", + "class Holder(MutableMapping, dict): ..." + ); + ClassType holder = types.get(0); + assertThat(holder.superClasses()).hasSize(2); + var bases = holder.superClasses().stream() + .map(sw -> (ClassType) sw.type()) + .toList(); + assertThat(ClassType.wouldHaveValidMro(bases)).isTrue(); + } + + @Test + void wouldHaveValidMro_handles_user_subclass_of_builtin_container() { + // class MyDict(dict): ...; class X(MutableMapping, MyDict): ... is valid at runtime because + // MyDict's runtime MRO is [MyDict, dict, object] (no MutableMapping) — the typeshed link from + // dict to MutableMapping is fictional. + List types = classTypes( + "from collections.abc import MutableMapping", + "class MyDict(dict): ...", + "class X(MutableMapping, MyDict): ..." + ); + ClassType x = types.get(1); + var bases = x.superClasses().stream() + .map(sw -> (ClassType) sw.type()) + .toList(); + assertThat(ClassType.wouldHaveValidMro(bases)).isTrue(); + } + + @Test + void wouldHaveValidMro_still_detects_real_conflict_with_builtin_container() { + // class MyDict(dict): ...; class X(dict, MyDict): ... is rejected at runtime because dict + // appears before its own subclass. + List types = classTypes( + "class MyDict(dict): ...", + "class X(dict, MyDict): ..." + ); + ClassType x = types.get(1); + var bases = x.superClasses().stream() + .map(sw -> (ClassType) sw.type()) + .toList(); + assertThat(ClassType.wouldHaveValidMro(bases)).isFalse(); + } + + @Test + void wouldHaveValidMro_rejects_object_before_builtin_container() { + // class X(object, dict): ... is rejected at runtime ("Cannot create a consistent MRO …") because + // dict.__mro__ ends with object, so object must come after dict. The runtime-view MRO must keep + // the object tail to catch this — otherwise stripping dict's typeshed parents to just [dict] + // would let the merge succeed (false negative). + var objectType = (ClassType) PROJECT_LEVEL_TYPE_TABLE.getType("object"); + var dictType = (ClassType) PROJECT_LEVEL_TYPE_TABLE.getType("dict"); + assertThat(ClassType.wouldHaveValidMro(List.of(objectType, dictType))).isFalse(); + assertThat(ClassType.wouldHaveValidMro(List.of(dictType, objectType))).isTrue(); + } + @Test void mro_unresolved_hierarchy_returns_empty() { // class Child(Unknown): ... <- unresolved parent From 6fb1a2ca67996f79cf2127942218299bb3760f4e Mon Sep 17 00:00:00 2001 From: "sonar-nigel[bot]" <247337653+sonar-nigel[bot]@users.noreply.github.com> Date: Wed, 22 Apr 2026 10:03:13 +0200 Subject: [PATCH 091/322] SONARPY-3971 Rule S8518 "enumerate()" values should be unpacked instead of using index lookups (#1010) GitOrigin-RevId: 00eba0c1ece4f51bda64e9a76c74a5445ffe476f --- .../checks/EnumerateUnpackingCheck.java | 136 +++++++++++++++++ .../python/checks/OpenSourceCheckList.java | 1 + .../org/sonar/l10n/py/rules/python/S8518.html | 24 +++ .../org/sonar/l10n/py/rules/python/S8518.json | 21 +++ .../checks/EnumerateUnpackingCheckTest.java | 29 ++++ .../resources/checks/enumerateUnpacking.py | 141 ++++++++++++++++++ 6 files changed, 352 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/EnumerateUnpackingCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8518.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8518.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/EnumerateUnpackingCheckTest.java create mode 100644 python-checks/src/test/resources/checks/enumerateUnpacking.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/EnumerateUnpackingCheck.java b/python-checks/src/main/java/org/sonar/python/checks/EnumerateUnpackingCheck.java new file mode 100644 index 000000000..5035df65d --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/EnumerateUnpackingCheck.java @@ -0,0 +1,136 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.symbols.v2.SymbolV2; +import org.sonar.plugins.python.api.tree.AnnotatedAssignment; +import org.sonar.plugins.python.api.tree.AssignmentStatement; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.CompoundAssignmentStatement; +import org.sonar.plugins.python.api.tree.DelStatement; +import org.sonar.plugins.python.api.tree.ExpressionList; +import org.sonar.plugins.python.api.tree.ForStatement; +import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.NumericLiteral; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.SubscriptionExpression; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.tree.TreeUtils; + +@Rule(key = "S8518") +public class EnumerateUnpackingCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Unpack the value from 'enumerate()' directly instead of using an index lookup."; + private static final TypeMatcher ENUMERATE_MATCHER = TypeMatchers.isType("enumerate"); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.FOR_STMT, EnumerateUnpackingCheck::check); + } + + private static void check(SubscriptionContext ctx) { + ForStatement forStatement = (ForStatement) ctx.syntaxNode(); + + if (forStatement.testExpressions().size() != 1) { + return; + } + if (!(forStatement.testExpressions().get(0) instanceof CallExpression call)) { + return; + } + if (!ENUMERATE_MATCHER.isTrueFor(call.callee(), ctx)) { + return; + } + if (forStatement.expressions().size() != 2) { + return; + } + if (!(forStatement.expressions().get(0) instanceof Name indexName)) { + return; + } + SymbolV2 indexSymbol = indexName.symbolV2(); + if (indexSymbol == null) { + return; + } + + RegularArgument startArg = TreeUtils.nthArgumentOrKeyword(1, "start", call.arguments()); + if (startArg != null && !(startArg.expression() instanceof NumericLiteral num && "0".equals(num.valueAsString()))) { + return; + } + + RegularArgument iterableArg = TreeUtils.nthArgumentOrKeyword(0, "iterable", call.arguments()); + if (iterableArg == null || !(iterableArg.expression() instanceof Name iterableName)) { + return; + } + SymbolV2 iterableSymbol = iterableName.symbolV2(); + if (iterableSymbol == null) { + return; + } + + boolean hasSubscriptWriteTarget = TreeUtils.hasDescendant(forStatement.body(), + node -> isMatchingSubscript(node, indexSymbol, iterableSymbol) + && isSubscriptWriteTarget((SubscriptionExpression) node)); + + if (hasSubscriptWriteTarget) { + return; + } + + boolean hasRedundantSubscript = TreeUtils.hasDescendant(forStatement.body(), + node -> isMatchingSubscript(node, indexSymbol, iterableSymbol)); + + if (hasRedundantSubscript) { + ctx.addIssue(call, MESSAGE); + } + } + + private static boolean isMatchingSubscript(Tree node, SymbolV2 indexSymbol, SymbolV2 iterableSymbol) { + if (!(node instanceof SubscriptionExpression subscription)) { + return false; + } + if (subscription.subscripts().expressions().size() != 1) { + return false; + } + if (!(subscription.subscripts().expressions().get(0) instanceof Name subscriptName)) { + return false; + } + if (!indexSymbol.equals(subscriptName.symbolV2())) { + return false; + } + if (!(subscription.object() instanceof Name objectName)) { + return false; + } + return iterableSymbol.equals(objectName.symbolV2()); + } + + private static boolean isSubscriptWriteTarget(SubscriptionExpression subscription) { + Tree parent = subscription.parent(); + if (parent instanceof DelStatement) { + return true; + } + if (parent instanceof CompoundAssignmentStatement compound) { + return compound.lhsExpression() == subscription; + } + if (parent instanceof AnnotatedAssignment annotated) { + return annotated.variable() == subscription; + } + return parent instanceof ExpressionList exprList + && exprList.parent() instanceof AssignmentStatement; + } +} diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 433ca4908..bea8df64d 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -217,6 +217,7 @@ public Stream> getChecks() { EmptyFunctionCheck.class, EmptyNestedBlockCheck.class, EmptyStringRepetitionCheck.class, + EnumerateUnpackingCheck.class, ExceptionGroupCheck.class, ExceptionCauseTypeCheck.class, ExceptionNotThrownCheck.class, diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8518.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8518.html new file mode 100644 index 000000000..d25c1734d --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8518.html @@ -0,0 +1,24 @@ +

      This rule raises an issue when a loop iterates over enumerate() but accesses list elements by index instead of unpacking the value directly from the enumeration.

      +

      Why is this an issue?

      +

      The enumerate() function provides both the index and the value of each element when iterating over a sequence. When you only unpack the index and then use it to subscript the original list, the value is already available from enumerate() and the subscript operation is redundant.

      +

      This pattern results in unnecessary operations and reduced readability.

      +

      Code examples

      +

      Noncompliant code example

      +
      +fruits = ['apple', 'banana', 'cherry']
      +
      +for i, _ in enumerate(fruits):
      +    print(f"Index {i}: {fruits[i]}")  # Noncompliant
      +
      +

      Compliant solution

      +
      +fruits = ['apple', 'banana', 'cherry']
      +
      +for i, fruit in enumerate(fruits):
      +    print(f"Index {i}: {fruit}")
      +
      +

      Resources

      +

      Documentation

      + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8518.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8518.json new file mode 100644 index 000000000..995b5bf3a --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8518.json @@ -0,0 +1,21 @@ +{ + "title": "\"enumerate()\" values should be unpacked instead of using index lookups", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "2min" + }, + "tags": [], + "defaultSeverity": "Minor", + "ruleSpecification": "RSPEC-8518", + "sqKey": "S8518", + "scope": "All", + "quickfix": "unknown", + "code": { + "impacts": { + "MAINTAINABILITY": "LOW" + }, + "attribute": "CONVENTIONAL" + } +} diff --git a/python-checks/src/test/java/org/sonar/python/checks/EnumerateUnpackingCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/EnumerateUnpackingCheckTest.java new file mode 100644 index 000000000..b99f62e83 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/EnumerateUnpackingCheckTest.java @@ -0,0 +1,29 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.junit.jupiter.api.Test; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class EnumerateUnpackingCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/enumerateUnpacking.py", new EnumerateUnpackingCheck()); + } + +} diff --git a/python-checks/src/test/resources/checks/enumerateUnpacking.py b/python-checks/src/test/resources/checks/enumerateUnpacking.py new file mode 100644 index 000000000..9e7c30634 --- /dev/null +++ b/python-checks/src/test/resources/checks/enumerateUnpacking.py @@ -0,0 +1,141 @@ + +def noncompliant_basic(): + lst = ['apple', 'banana', 'cherry'] + for i, _ in enumerate(lst): # Noncompliant {{Unpack the value from 'enumerate()' directly instead of using an index lookup.}} +# ^^^^^^^^^^^^^^ + print(lst[i]) + + +def noncompliant_start_zero_keyword(): + colors = ['red', 'green', 'blue'] + for i, _ in enumerate(colors, start=0): # Noncompliant + print(colors[i]) + + +def noncompliant_rhs_of_augmented_assignment(): + items = "abcdef" + result = "" + for ind, _ in enumerate(items): # Noncompliant + result += items[ind] + + +def compliant_proper_unpacking(): + fruits = ['apple', 'banana', 'cherry'] + for i, fruit in enumerate(fruits): + print(f"Index {i}: {fruit}") + + +def compliant_multiple_iterables(): + lst = [1, 2, 3] + for i in lst, lst: + print(i) + + +def compliant_plain_iterable_not_call(): + pairs = [(1, 'a'), (2, 'b'), (3, 'c')] + for i, v in pairs: + print(i, v) + + +def compliant_non_enumerate_call(): + items = [1, 2, 3] + others = [4, 5, 6] + for i, v in zip(items, others): + print(items[i]) + + +def compliant_single_loop_variable(): + items = ['a', 'b', 'c'] + for item in enumerate(items): + print(item) + + +def compliant_tuple_unpacking_first_var(): + pairs = [(1, 'a'), (2, 'b')] + for (a, b), value in enumerate(pairs): + print(a, b, value) + + +def compliant_nonzero_start(): + items = ['a', 'b', 'c'] + for i, _ in enumerate(items, start=1): + print(items[i - 1]) + + +def compliant_variable_start(): + items = ['a', 'b', 'c'] + n = 0 + for i, _ in enumerate(items, n): + print(items[i]) + + +def compliant_no_arguments(): + for i, _ in enumerate(): + print(i) + + +def compliant_inline_literal_iterable(): + for i, _ in enumerate([1, 2, 3]): + pass + + +def compliant_undeclared_iterable(): + for i, _ in enumerate(undeclared_var): + print(undeclared_var[i]) + + +def compliant_write_assignment(): + items = ['a', 'b', 'c'] + for i, item in enumerate(items): + items[i] = item.upper() + + +def compliant_write_augmented_assignment(): + counts = [0, 0, 0] + for i, val in enumerate(counts): + counts[i] += 1 + + +def compliant_write_del(): + items = ['a', 'b', 'c'] + for i, item in enumerate(items): + if item == 'b': + del items[i] + break + + +def compliant_different_list(): + keys = ['x', 'y', 'z'] + values = [1, 2, 3] + for i, key in enumerate(keys): + print(values[i]) + + +def compliant_different_index_var(): + lst = ['a', 'b', 'c'] + j = 0 + for i, _ in enumerate(lst): + print(lst[j]) + + +def compliant_modified_index(): + items = ['a', 'b', 'c'] + for i, _ in enumerate(items): + if i + 1 < len(items): + print(items[i + 1]) + + +def compliant_multi_index_subscript(): + import numpy as np + matrix = np.array([[1, 2], [3, 4]]) + items = [10, 20] + for i, _ in enumerate(items): + print(matrix[i, 0]) + + +def compliant_subscript_object_not_name(): + def get_list(): + return ['x', 'y', 'z'] + lst = ['a', 'b', 'c'] + for i, _ in enumerate(lst): + print(get_list()[i]) From 5496a22fa4c8ae5b629e7ef8de14828530e69451 Mon Sep 17 00:00:00 2001 From: Sebastian Zumbrunn Date: Wed, 22 Apr 2026 11:30:26 +0200 Subject: [PATCH 092/322] SONARPY-4032 Fix verify-fix-version.sh script (#1052) GitOrigin-RevId: b024bf79a1e6c0ba4337354eaa0890f1abb27b6b --- .github/scripts/verify-fix-versions.sh | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/.github/scripts/verify-fix-versions.sh b/.github/scripts/verify-fix-versions.sh index 1d93e1009..fb364717f 100644 --- a/.github/scripts/verify-fix-versions.sh +++ b/.github/scripts/verify-fix-versions.sh @@ -46,8 +46,20 @@ get_commits_since_tag() { extract_jira_tickets() { local commits="$1" + local tickets + local extract_exit_code=0 # Extract SONARPY-XXXX patterns, remove duplicates, and sort - echo "$commits" | grep -oE "${JIRA_PROJECT_KEY}-[0-9]+" | sort -u + set +e + tickets=$(printf '%s\n' "$commits" | grep -oE "${JIRA_PROJECT_KEY}-[0-9]+" | sort -u) + extract_exit_code=$? + set -e + + if [[ "$extract_exit_code" -gt 1 ]]; then + echo "Error: Failed to extract Jira tickets from commits" >&2 + exit 1 + fi + + printf '%s' "$tickets" } build_jql_query() { @@ -293,4 +305,3 @@ main() { main "$@" - From 0c9e7f7287ab7aa1b10f86ddac7757e352d58edf Mon Sep 17 00:00:00 2001 From: "sonar-nigel[bot]" <247337653+sonar-nigel[bot]@users.noreply.github.com> Date: Wed, 22 Apr 2026 16:49:04 +0200 Subject: [PATCH 093/322] SONARPY-3953 Rule S8516 Group iterators from "itertools.groupby" should not be reused (#994) Co-authored-by: David Kunzmann Co-authored-by: Marc Jasper GitOrigin-RevId: c6df072122dd7d5eb397d5c5c260a574e84bfa7d --- .../checks/GroupByIteratorReuseCheck.java | 198 ++++++++++++ .../python/checks/OpenSourceCheckList.java | 1 + .../org/sonar/l10n/py/rules/python/S8516.html | 51 +++ .../org/sonar/l10n/py/rules/python/S8516.json | 24 ++ .../py/rules/python/Sonar_way_profile.json | 5 +- .../checks/GroupByIteratorReuseCheckTest.java | 126 ++++++++ .../resources/checks/groupByIteratorReuse.py | 297 ++++++++++++++++++ .../groupByIteratorReuseMultipleReads.py | 14 + ...pByIteratorReuseUnsafeWithSafeLaterRead.py | 12 + 9 files changed, 726 insertions(+), 2 deletions(-) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/GroupByIteratorReuseCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8516.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8516.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/GroupByIteratorReuseCheckTest.java create mode 100644 python-checks/src/test/resources/checks/groupByIteratorReuse.py create mode 100644 python-checks/src/test/resources/checks/groupByIteratorReuseMultipleReads.py create mode 100644 python-checks/src/test/resources/checks/groupByIteratorReuseUnsafeWithSafeLaterRead.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/GroupByIteratorReuseCheck.java b/python-checks/src/main/java/org/sonar/python/checks/GroupByIteratorReuseCheck.java new file mode 100644 index 000000000..65bc928b3 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/GroupByIteratorReuseCheck.java @@ -0,0 +1,198 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import java.util.List; +import java.util.Optional; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.quickfix.PythonQuickFix; +import org.sonar.plugins.python.api.symbols.v2.SymbolV2; +import org.sonar.plugins.python.api.symbols.v2.UsageV2; +import org.sonar.plugins.python.api.tree.ArgList; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.ComprehensionFor; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.ForStatement; +import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.quickfix.TextEditUtils; +import org.sonar.python.tree.TreeUtils; + +@Rule(key = "S8516") +public class GroupByIteratorReuseCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Convert this group iterator to a list."; + private static final String QUICK_FIX_MESSAGE = "Wrap with \"list()\""; + + private static final TypeMatcher GROUPBY_MATCHER = TypeMatchers.isType("itertools.groupby"); + + // SAFE_CONSUMER_MATCHER and CLASS_MATCHER are matched leniently (TRUE or UNKNOWN both pass) so + // unresolved callees don't trigger false positives. + private static final TypeMatcher SAFE_CONSUMER_MATCHER = TypeMatchers.any( + TypeMatchers.isType("list"), + TypeMatchers.isType("tuple"), + TypeMatchers.isType("set"), + TypeMatchers.isType("frozenset"), + TypeMatchers.isType("sorted"), + TypeMatchers.isType("sum"), + TypeMatchers.isType("max"), + TypeMatchers.isType("min"), + TypeMatchers.isType("any"), + TypeMatchers.isType("all") + ); + + // Any class constructor that accepts an iterable invariably materializes it inside __init__ + private static final TypeMatcher CLASS_MATCHER = TypeMatchers.isObjectOfType("type"); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.FOR_STMT, GroupByIteratorReuseCheck::checkForStatement); + } + + private static void checkForStatement(SubscriptionContext ctx) { + ForStatement forStatement = (ForStatement) ctx.syntaxNode(); + + if (forStatement.testExpressions().size() != 1) { + return; + } + + if (!(forStatement.testExpressions().get(0) instanceof CallExpression callExpr)) { + return; + } + + if (!GROUPBY_MATCHER.isTrueFor(callExpr.callee(), ctx)) { + return; + } + + if (forStatement.expressions().size() != 2) { + return; + } + + if (!(forStatement.expressions().get(1) instanceof Name groupName)) { + return; + } + + SymbolV2 groupSymbol = groupName.symbolV2(); + if (groupSymbol == null) { + return; + } + + Tree loopBody = forStatement.body(); + + // If `group` is rebound anywhere in the loop body (e.g. `group = list(group)`), we can't + // tell from the AST alone which reads see the original iterator. We conservatively skip. + boolean isReboundInLoopBody = groupSymbol.usages().stream() + .filter(usage -> usage.kind() == UsageV2.Kind.ASSIGNMENT_LHS) + .map(UsageV2::tree) + .flatMap(TreeUtils.toStreamInstanceOfMapper(Name.class)) + .anyMatch(reboundName -> isInside(reboundName, loopBody)); + if (isReboundInLoopBody) { + return; + } + + List loopBodyReads = groupSymbol.usages().stream() + .filter(usage -> !usage.isBindingUsage()) + .map(UsageV2::tree) + .flatMap(TreeUtils.toStreamInstanceOfMapper(Name.class)) + .filter(nameUsage -> isInside(nameUsage, loopBody)) + .toList(); + + List unsafeReads = loopBodyReads.stream() + .filter(nameUsage -> !isSafeUsage(nameUsage, forStatement, ctx)) + .toList(); + + // The quickfix wraps a single occurrence in `list(...)`. We only attach it when there is + // exactly one read of `group` in the loop body — this does not affecting any other consumer. + boolean canOfferQuickFix = loopBodyReads.size() == 1 && unsafeReads.size() == 1; + for (Name nameUsage : unsafeReads) { + var issue = ctx.addIssue(nameUsage, MESSAGE); + if (canOfferQuickFix) { + PythonQuickFix quickFix = PythonQuickFix.newQuickFix(QUICK_FIX_MESSAGE) + .addTextEdit(TextEditUtils.insertBefore(nameUsage, "list(")) + .addTextEdit(TextEditUtils.insertAfter(nameUsage, ")")) + .build(); + issue.addQuickFix(quickFix); + } + } + } + + private static boolean isSafeUsage(Name nameUsage, ForStatement enclosingForStatement, SubscriptionContext ctx) { + // A usage inside a nested function or lambda defined in the loop body is always unsafe + if (isInsideNestedFunctionOrLambda(nameUsage, enclosingForStatement)) { + return false; + } + + if (nameUsage.parent() instanceof ComprehensionFor compFor && compFor.iterable() == nameUsage) { + return true; + } + + if (nameUsage.parent() instanceof ForStatement nestedFor + && nestedFor.testExpressions().stream().anyMatch(e -> e == nameUsage)) { + return true; + } + + if (nameUsage.parent() instanceof RegularArgument regularArg && regularArg.keywordArgument() == null) { + return hasSafeConsumerAncestor(regularArg, ctx); + } + + return false; + } + + // We raise when the group iterator escapes the current iteration and is read after the outer + // `groupby` advances. A positional-arg call chain ending in a safe consumer cannot escape. + private static boolean hasSafeConsumerAncestor(RegularArgument regularArg, SubscriptionContext ctx) { + Optional currentCall = owningCall(regularArg); + while (currentCall.isPresent()) { + CallExpression call = currentCall.get(); + if (isSafeConsumerCallee(call.callee(), ctx)) { + return true; + } + if (!(call.parent() instanceof RegularArgument outerArg) || outerArg.keywordArgument() != null) { + return false; + } + currentCall = owningCall(outerArg); + } + return false; + } + + private static boolean isSafeConsumerCallee(Expression callee, SubscriptionContext ctx) { + return !SAFE_CONSUMER_MATCHER.evaluateFor(callee, ctx).isFalse() + || !CLASS_MATCHER.evaluateFor(callee, ctx).isFalse(); + } + + private static boolean isInsideNestedFunctionOrLambda(Name nameUsage, ForStatement enclosingForStatement) { + Tree functionLikeAncestor = TreeUtils.firstAncestorOfKind(nameUsage, Tree.Kind.FUNCDEF, Tree.Kind.LAMBDA); + return functionLikeAncestor != null + && isInside(functionLikeAncestor, enclosingForStatement.body()); + } + + private static boolean isInside(Tree tree, Tree container) { + return TreeUtils.firstAncestor(tree, ancestor -> ancestor == container) != null; + } + + private static Optional owningCall(RegularArgument regularArg) { + if (regularArg.parent() instanceof ArgList argList && argList.parent() instanceof CallExpression callExpr) { + return Optional.of(callExpr); + } + return Optional.empty(); + } +} diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index bea8df64d..8f20b3758 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -263,6 +263,7 @@ public Stream> getChecks() { GraphemeClustersInClassesCheck.class, GraphQLDenialOfServiceCheck.class, GraphQLIntrospectionCheck.class, + GroupByIteratorReuseCheck.class, GroupReplacementCheck.class, HardCodedCredentialsCheck.class, HardCodedCredentialsEntropyCheck.class, diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8516.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8516.html new file mode 100644 index 000000000..cef43e574 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8516.html @@ -0,0 +1,51 @@ +

      This rule raises an issue when a group iterator returned by itertools.groupby() is stored and reused after the groupby +object has advanced to the next group.

      +

      Why is this an issue?

      +

      The itertools.groupby() function groups consecutive items from an iterable based on a key function. It returns pairs of (key, +group_iterator) where each group_iterator is a sub-iterator that yields items for that specific group.

      +

      A critical characteristic of these group iterators is that they are consumed when the main groupby iterator advances to the next +group. This means if you store a reference to a group iterator and try to use it later, it will be empty and yield no results.

      +

      This behavior occurs because groupby uses lazy evaluation for efficiency. The group iterators share the same underlying data source, +and advancing the main iterator invalidates previous group iterators. The problem typically manifests when storing group iterators in a collection for +later use or when trying to iterate over the same group iterator more than once.

      +

      What is the potential impact?

      +

      When group iterators are reused, they yield no items. Your code will process empty sequences instead of the actual grouped data, leading to +incorrect results, silent failures, and data loss. These issues can be difficult to debug because the code does not raise exceptions but simply +produces wrong output.

      +

      How to fix it

      +

      Convert the group iterator to a list immediately when processing each group. This materializes the data and stores it in memory, allowing you to +reuse it later.

      +

      Code examples

      +

      Noncompliant code example

      +
      +from itertools import groupby
      +
      +data = [1, 1, 2, 2, 3]
      +groups = {}
      +
      +for key, group in groupby(data):
      +    groups[key] = group  # Noncompliant
      +
      +for key, group in groups.items():
      +    print(f"{key}: {list(group)}")  # Empty results
      +
      +

      Compliant solution

      +
      +from itertools import groupby
      +
      +data = [1, 1, 2, 2, 3]
      +groups = {}
      +
      +for key, group in groupby(data):
      +    groups[key] = list(group)  # Convert to list immediately
      +
      +for key, group in groups.items():
      +    print(f"{key}: {group}")  # Correct results
      +
      +

      Resources

      +

      Documentation

      + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8516.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8516.json new file mode 100644 index 000000000..df7badc1c --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8516.json @@ -0,0 +1,24 @@ +{ + "title": "Group iterators from \"itertools.groupby\" should not be reused", + "type": "BUG", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "pitfall", + "confusing" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-8516", + "sqKey": "S8516", + "scope": "All", + "quickfix": "targeted", + "code": { + "impacts": { + "RELIABILITY": "HIGH" + }, + "attribute": "LOGICAL" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 6381d27c4..640b1c33b 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -329,16 +329,17 @@ "S8414", "S8415", "S8490", + "S8493", "S8494", "S8495", "S8504", "S8505", "S8507", "S8513", + "S8516", "S8517", "S8519", "S8520", - "S8521", - "S8493" + "S8521" ] } diff --git a/python-checks/src/test/java/org/sonar/python/checks/GroupByIteratorReuseCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/GroupByIteratorReuseCheckTest.java new file mode 100644 index 000000000..53f8a2091 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/GroupByIteratorReuseCheckTest.java @@ -0,0 +1,126 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import java.io.File; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import org.junit.jupiter.api.Test; +import org.sonar.plugins.python.api.PythonCheck.PreciseIssue; +import org.sonar.plugins.python.api.PythonVisitorContext; +import org.sonar.python.SubscriptionVisitor; +import org.sonar.python.TestPythonVisitorRunner; +import org.sonar.python.checks.quickfix.PythonQuickFixVerifier; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.sonar.python.checks.utils.CodeTestUtils.code; + +class GroupByIteratorReuseCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/groupByIteratorReuse.py", new GroupByIteratorReuseCheck()); + } + + @Test + void quick_fix_subscript_assignment() { + String before = code( + "from itertools import groupby", + "data = [1, 1, 2, 2, 3]", + "groups = {}", + "for key, group in groupby(data):", + " groups[key] = group"); + String after = code( + "from itertools import groupby", + "data = [1, 1, 2, 2, 3]", + "groups = {}", + "for key, group in groupby(data):", + " groups[key] = list(group)"); + GroupByIteratorReuseCheck check = new GroupByIteratorReuseCheck(); + PythonQuickFixVerifier.verify(check, before, after); + PythonQuickFixVerifier.verifyQuickFixMessages(check, before, "Wrap with \"list()\""); + } + + @Test + void quick_fix_direct_variable_assignment() { + String before = code( + "from itertools import groupby", + "data = [1, 1, 2, 2, 3]", + "for key, group in groupby(data):", + " saved = group"); + String after = code( + "from itertools import groupby", + "data = [1, 1, 2, 2, 3]", + "for key, group in groupby(data):", + " saved = list(group)"); + PythonQuickFixVerifier.verify(new GroupByIteratorReuseCheck(), before, after); + } + + @Test + void no_quick_fix_when_multiple_reads_in_loop_body() { + GroupByIteratorReuseCheck check = new GroupByIteratorReuseCheck(); + PythonVisitorContext context = TestPythonVisitorRunner + .createContext(new File("src/test/resources/checks/groupByIteratorReuseMultipleReads.py")); + SubscriptionVisitor.analyze(Collections.singletonList(check), context); + + // Sort issues by source position to make the test independent of the framework's internal ordering. + List issues = context.getIssues().stream() + .sorted(Comparator.comparingInt((PreciseIssue i) -> i.primaryLocation().startLine()) + .thenComparingInt(i -> i.primaryLocation().startLineOffset())) + .toList(); + + assertThat(issues).hasSize(3); + assertThat(issues).extracting(i -> i.primaryLocation().startLine()).containsExactly(12, 13, 14); + assertThat(issues).extracting(i -> i.primaryLocation().message()) + .containsOnly("Convert this group iterator to a list."); + + // See fixture file header for the rationale on why no quickfix is attached. + assertThat(issues).allSatisfy(issue -> assertThat(issue.quickFixes()).isEmpty()); + } + + @Test + void no_quick_fix_when_safe_read_follows_unsafe_one() { + GroupByIteratorReuseCheck check = new GroupByIteratorReuseCheck(); + PythonVisitorContext context = TestPythonVisitorRunner + .createContext(new File("src/test/resources/checks/groupByIteratorReuseUnsafeWithSafeLaterRead.py")); + SubscriptionVisitor.analyze(Collections.singletonList(check), context); + + List issues = context.getIssues(); + // See fixture file header for the rationale on why no quickfix is attached. + assertThat(issues).hasSize(1); + assertThat(issues.get(0).quickFixes()).isEmpty(); + } + + @Test + void quick_fix_append_to_list() { + String before = code( + "from itertools import groupby", + "data = [1, 1, 2, 2, 3]", + "result = []", + "for key, group in groupby(data):", + " result.append(group)"); + String after = code( + "from itertools import groupby", + "data = [1, 1, 2, 2, 3]", + "result = []", + "for key, group in groupby(data):", + " result.append(list(group))"); + PythonQuickFixVerifier.verify(new GroupByIteratorReuseCheck(), before, after); + } +} diff --git a/python-checks/src/test/resources/checks/groupByIteratorReuse.py b/python-checks/src/test/resources/checks/groupByIteratorReuse.py new file mode 100644 index 000000000..09ece6de8 --- /dev/null +++ b/python-checks/src/test/resources/checks/groupByIteratorReuse.py @@ -0,0 +1,297 @@ +from itertools import groupby + + +def noncompliant_stored_in_dict(): + data = [1, 1, 2, 2, 3] + groups = {} + for key, group in groupby(data): + groups[key] = group # Noncompliant {{Convert this group iterator to a list.}} +# ^^^^^ + + +def noncompliant_as_regular_argument(): + data = [1, 1, 2, 2, 3] + result = [] + for key, group in groupby(data): + result.append(group) # Noncompliant {{Convert this group iterator to a list.}} +# ^^^^^ + + +def noncompliant_map_without_safe_wrapper(): + from operator import itemgetter + data = [1, 1, 2, 2, 3] + for key, group in groupby(data): + it = map(itemgetter(0), group) # Noncompliant + + +def fn_group_as_map_callable(): + # FN: passing `group` as the callable to `map`/`filter` (instead of as the iterable) is a + # clear bug, but it would also fail at runtime with a TypeError when the callable is invoked. + data = [1, 1, 2, 2, 3] + for key, group in groupby(data): + result = list(map(group, [1, 2, 3])) + + +def fp_lazy_passthrough_as_keyword_arg(): + # FP: `list(iterable=map(...))` materializes `map(...)` synchronously, so `group` does not + # escape — but the ancestor walk stops at the keyword-arg boundary because we don't resolve + # parameter names to confirm `iterable` is the materializing slot. + from operator import itemgetter + data = [(1, "a"), (1, "b"), (2, "c")] + for key, group in groupby(data): + result = list(iterable=map(itemgetter(0), group)) # Noncompliant + + +def compliant_group_as_non_first_arg_of_safe_consumer(): + # Passing `group` at a non-iterable slot (e.g. as `key=` to sorted) is a TypeError at runtime + data = [1, 1, 2, 2, 3] + for key, group in groupby(data): + result = sorted(key, group) + + +def compliant_nested_in_non_lazy_call(): + # `str(group)` doesn't advance or retain `group` (it just calls __repr__) and the reference + # is dropped at end of statement, so `group` never escapes. + data = [1, 1, 2, 2, 3] + for key, group in groupby(data): + result = list(str(group)) + + +def noncompliant_inside_lambda(): + data = [1, 1, 2, 2, 3] + fns = [] + for key, group in groupby(data): + fns.append(lambda: list(group)) # Noncompliant +# ^^^^^ + + +def noncompliant_groupby_alias(): + from itertools import groupby as gb + data = [1, 1, 2, 2, 3] + groups = {} + for key, group in gb(data): + groups[key] = group # Noncompliant + + +def noncompliant_unsafe_with_safe_sibling(): + data = [1, 1, 2, 2, 3] + groups = {} + for key, group in groupby(data): + groups[key] = group # Noncompliant + for item in group: + print(item) + + +def fp_group_as_keyword_arg(): + # FP: `list(iterable=group)` is semantically equivalent to `list(group)` and materializes + # `group` synchronously, so it does not escape — but the rule conservatively rejects keyword + # args because we don't resolve parameter names to confirm `iterable` is the materializing slot. + data = [1, 1, 2, 2, 3] + for key, group in groupby(data): + result = list(iterable=group) # Noncompliant + + +def compliant_immediate_list(): + data = [1, 1, 2, 2, 3] + groups = {} + for key, group in groupby(data): + groups[key] = list(group) + + +def compliant_safe_consumers(): + # Exercises every entry of SAFE_CONSUMER_MATCHER to catch a potential type-resolution regression + data = [1, 1, 2, 2, 3] + for key, group in groupby(data): + as_tuple = tuple(group) + for key, group in groupby(data): + as_set = set(group) + for key, group in groupby(data): + as_frozenset = frozenset(group) + for key, group in groupby(data): + ordered = sorted(group) + for key, group in groupby(data): + total = sum(group) + for key, group in groupby(data): + biggest = max(group) + for key, group in groupby(data): + smallest = min(group) + for key, group in groupby(data): + has_any = any(group) + for key, group in groupby(data): + has_all = all(group) + + +def compliant_generator_expression(): + data = [1, 1, 2, 2, 3] + for key, group in groupby(data): + count = sum(1 for _ in group) + + +def compliant_nested_for(): + data = [1, 1, 2, 2, 3] + for key, group in groupby(data): + for item in group: + print(item) + + +def compliant_not_a_call(): + data = [(1, [10, 11]), (2, [20, 21])] + groups = {} + for key, group in data: + groups[key] = group + + +def compliant_non_groupby_call(): + def my_groupby(data): + return iter([]) + + data = [1, 1, 2, 2, 3] + groups = {} + for key, group in my_groupby(data): + groups[key] = group + + +def compliant_groupby_full_module_path(): + import itertools + data = [1, 1, 2, 2, 3] + groups = {} + for key, group in itertools.groupby(data): + groups[key] = list(group) + + +def compliant_list_of_map(): + from operator import itemgetter + data = [(1, "a"), (1, "b"), (2, "c")] + for key, group in groupby(data): + keys = list(map(itemgetter(0), group)) + + +def compliant_list_of_filter(): + data = [1, 1, 2, 2, 3] + for key, group in groupby(data): + odd = list(filter(lambda x: x % 2, group)) + + +def compliant_list_of_map_of_filter(): + data = [1, 1, 2, 2, 3] + for key, group in groupby(data): + result = list(map(str, filter(bool, group))) + + +def compliant_list_of_zip_of_enumerate(): + data = [1, 1, 2, 2, 3] + for key, group in groupby(data): + result = list(zip([10, 20], enumerate(group))) + + +def compliant_list_of_enumerate(): + data = [1, 1, 2, 2, 3] + for key, group in groupby(data): + indexed = list(enumerate(group)) + + +def compliant_list_of_zip_first_arg(): + data = [1, 1, 2, 2, 3] + for key, group in groupby(data): + zipped = list(zip(group, [10, 20, 30])) + + +def compliant_list_of_zip_second_arg(): + data = [1, 1, 2, 2, 3] + for key, group in groupby(data): + zipped = list(zip([10, 20, 30], group)) + + +def compliant_list_of_islice(): + from itertools import islice + data = [1, 1, 2, 2, 3] + for key, group in groupby(data): + head = list(islice(group, 2)) + + +def noncompliant_enumerate_without_safe_wrapper(): + data = [1, 1, 2, 2, 3] + for key, group in groupby(data): + it = enumerate(group) # Noncompliant + + +def compliant_enumerate_at_wrong_arg_index(): + # `list(...)` materializes synchronously so `group` cannot escape + data = [1, 1, 2, 2, 3] + for key, group in groupby(data): + result = list(enumerate([10, 20], group)) + + +def compliant_group_passed_to_variable_class(): + data = [1, 1, 2, 2, 3] + container_class = type([]) + for key, group in groupby(data): + container = container_class(group) + + +def compliant_group_rebound(): + data = [1, 1, 2, 2, 3] + for key, group in groupby(data): + group = list(group) + print(group) + + +def compliant_multiple_iterables(): + data1 = [1, 1, 2] + data2 = [3, 3, 4] + for key, group in groupby(data1), groupby(data2): + saved = group + + +def compliant_tuple_pattern_loop_var(): + data = [(1, "a"), (1, "b"), (2, "c")] + for key, (a, b) in groupby(data): + saved = a + + +def compliant_single_loop_variable(): + data = [(1, 2), (1, 3)] + for pair in groupby(data): + saved = pair + + +def fn_unresolved_callee(): # FN: unresolved callee assumed safe to avoid false positives + from nonexistent_module import safe_consumer + data = [1, 1, 2, 2, 3] + for key, group in groupby(data): + result = safe_consumer(group) + + +def fn_groupby_in_dict_comprehension(): # FN: check only handles FOR_STMT + data = [1, 1, 2, 2, 3] + groups = {k: g for k, g in groupby(data)} + + +def fp_outer_group_consumed_by_nested_groupby(): + # FP: the inner `for ... in groupby(group):` fully consumes `group` before the outer + # iterator advances, so it does not escape — but `itertools.groupby` is not a safe consumer, + # so the ancestor walk does not recognize the chain as safe. + data = [(1, "a"), (1, "b"), (2, "c")] + for key, group in groupby(data): + for subkey, subgroup in groupby(group): # Noncompliant + print(subkey, list(subgroup)) + + +def fn_rebinding_in_conditional_branch(cond): + # FN: as soon as `group` is rebound anywhere in the loop body, the rule conservatively + # skips the loop to keep the rule purely AST-based. + data = [1, 1, 2, 2, 3] + groups = {} + for key, group in groupby(data): + if cond: + group = list(group) + groups[key] = group # FN: on the `cond is False` path, this stores the raw iterator + + +def fn_unsafe_read_before_unconditional_rebinding(): + # FN: same reasoning as above. + data = [1, 1, 2, 2, 3] + groups = {} + for key, group in groupby(data): + groups[key] = group # FN: real bug, but suppressed by the rebinding below + group = list(group) diff --git a/python-checks/src/test/resources/checks/groupByIteratorReuseMultipleReads.py b/python-checks/src/test/resources/checks/groupByIteratorReuseMultipleReads.py new file mode 100644 index 000000000..10333a26d --- /dev/null +++ b/python-checks/src/test/resources/checks/groupByIteratorReuseMultipleReads.py @@ -0,0 +1,14 @@ +from itertools import groupby + +# Used by GroupByIteratorReuseCheckTest.no_quick_fix_when_multiple_reads_in_loop_body +# Asserts every unsafe read is reported and none get a quickfix (it would exhaust the iterator +# before the remaining reads execute). + +data = [1, 1, 2, 2, 3] +first = [] +second = [] +third = [] +for key, group in groupby(data): + first.append(group) # Noncompliant + second.append(group) # Noncompliant + third.append(group) # Noncompliant diff --git a/python-checks/src/test/resources/checks/groupByIteratorReuseUnsafeWithSafeLaterRead.py b/python-checks/src/test/resources/checks/groupByIteratorReuseUnsafeWithSafeLaterRead.py new file mode 100644 index 000000000..39f23a2ad --- /dev/null +++ b/python-checks/src/test/resources/checks/groupByIteratorReuseUnsafeWithSafeLaterRead.py @@ -0,0 +1,12 @@ +from itertools import groupby + +# Used by GroupByIteratorReuseCheckTest.no_quick_fix_when_safe_read_follows_unsafe_one +# Wrapping the unsafe read in list() would exhaust the iterator and silently break +# the subsequent `for item in group:` loop, so no quickfix should be attached. + +data = [1, 1, 2, 2, 3] +groups = {} +for key, group in groupby(data): + groups[key] = group # Noncompliant + for item in group: + print(item) From c2d1910bbebcce814835bee467230b22a7b9e847 Mon Sep 17 00:00:00 2001 From: Sebastian Zumbrunn Date: Thu, 23 Apr 2026 13:16:07 +0200 Subject: [PATCH 094/322] SONARPY-4050 Fix Cobertura source path resolving (#1061) GitOrigin-RevId: c7c8ff06ab0e3f046cf936c4656b4185c1012161 --- .../app/coverage.xml | 20 ++++ .../app/src/prod.py | 1 + .../sonar/python/it/plugin/CoverageTest.java | 26 +++++ .../python/coverage/CoberturaParser.java | 3 +- .../coverage/PythonCoverageSensorTest.java | 99 ++++++++++++++++++- .../coverage.4.4.2-multi-sources.xml | 4 +- .../coverage-reports/coverage.4.4.2.xml | 2 +- .../coverage_source_invalid_directory.xml | 4 +- ...coverage_with_unresolved_absolute_path.xml | 6 +- .../coverage_with_unresolved_path.xml | 6 +- 10 files changed, 155 insertions(+), 16 deletions(-) create mode 100644 its/plugin/it-python-plugin-test/projects/coverage_project_projectbasedir/app/coverage.xml create mode 100644 its/plugin/it-python-plugin-test/projects/coverage_project_projectbasedir/app/src/prod.py diff --git a/its/plugin/it-python-plugin-test/projects/coverage_project_projectbasedir/app/coverage.xml b/its/plugin/it-python-plugin-test/projects/coverage_project_projectbasedir/app/coverage.xml new file mode 100644 index 000000000..0b21d1a5f --- /dev/null +++ b/its/plugin/it-python-plugin-test/projects/coverage_project_projectbasedir/app/coverage.xml @@ -0,0 +1,20 @@ + + + + + src + + + + + + + + + + + + + + diff --git a/its/plugin/it-python-plugin-test/projects/coverage_project_projectbasedir/app/src/prod.py b/its/plugin/it-python-plugin-test/projects/coverage_project_projectbasedir/app/src/prod.py new file mode 100644 index 000000000..7d4290a11 --- /dev/null +++ b/its/plugin/it-python-plugin-test/projects/coverage_project_projectbasedir/app/src/prod.py @@ -0,0 +1 @@ +x = 1 diff --git a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/CoverageTest.java b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/CoverageTest.java index df9aece4a..5e35b8e34 100644 --- a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/CoverageTest.java +++ b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/CoverageTest.java @@ -33,10 +33,12 @@ public class CoverageTest { private static final String COVERAGE_PROJECT = "projects/coverage_project"; + private static final String COVERAGE_PROJECT_PROJECT_BASEDIR = "projects/coverage_project_projectbasedir"; @RegisterExtension public static final ConcurrentOrchestratorExtension ORCHESTRATOR = TestsUtils.dynamicOrchestrator; private static final String PROJECT_KEY = "coverage_project"; + private static final String PROJECT_BASEDIR_KEY = "coverage_project_projectbasedir"; private static final String LINES_TO_COVER = "lines_to_cover"; private static final String COVERAGE = "coverage"; private static final String LINE_COVERAGE = "line_coverage"; @@ -123,4 +125,28 @@ void empty_coverage_report() { assertThat(TestsUtils.getMeasureAsDouble(PROJECT_KEY, COVERAGE)).isZero(); } + @Test + void relative_source_paths_are_resolved_from_project_base_dir() { + File projectDir = new File(COVERAGE_PROJECT_PROJECT_BASEDIR); + File projectBaseDir = new File(projectDir, "app"); + SonarScanner build = ORCHESTRATOR.createSonarScanner() + .setProjectDir(projectDir) + .setProperty("sonar.projectKey", PROJECT_BASEDIR_KEY) + .setProperty("sonar.projectName", PROJECT_BASEDIR_KEY) + .setProperty("sonar.projectVersion", "1") + .setProperty("sonar.sourceEncoding", "UTF8") + .setProperty("sonar.projectBaseDir", projectBaseDir.getAbsolutePath()) + .setProperty("sonar.sources", "src") + .setProperty(COVERAGE_REPORT_PATHS, "coverage.xml"); + + ORCHESTRATOR.executeBuild(build); + + Map expected = new HashMap<>(); + expected.put(LINES_TO_COVER, 1); + expected.put(COVERAGE, 100); + expected.put(LINE_COVERAGE, 100); + expected.put(BRANCH_COVERAGE, null); + TestsUtils.assertProjectMeasures(PROJECT_BASEDIR_KEY, expected); + } + } diff --git a/python-commons/src/main/java/org/sonar/plugins/python/coverage/CoberturaParser.java b/python-commons/src/main/java/org/sonar/plugins/python/coverage/CoberturaParser.java index e3bf736f0..ed1fa5fc5 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/coverage/CoberturaParser.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/coverage/CoberturaParser.java @@ -80,7 +80,8 @@ private List extractBaseDirectories(SMInputCursor sources, File defaultBas while (source.getNext() != null) { String path = FilenameUtils.normalize(source.collectDescendantText()); if (!StringUtils.isBlank(path)) { - File baseDirectory = new File(path); + File sourcePath = new File(path); + File baseDirectory = sourcePath.isAbsolute() ? sourcePath : new File(defaultBaseDirectory, path); if (baseDirectory.isDirectory()) { baseDirectories.add(baseDirectory); } else { diff --git a/python-commons/src/test/java/org/sonar/plugins/python/coverage/PythonCoverageSensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/coverage/PythonCoverageSensorTest.java index 6fdd6f863..b42c5bd4a 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/coverage/PythonCoverageSensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/coverage/PythonCoverageSensorTest.java @@ -316,14 +316,105 @@ void should_warn_on_invalid_basedir() { } } + @Test + void should_resolve_relative_source_against_project_base_dir() throws Exception { + Path projectBaseDir = tmpDir.resolve(".tests/resources/python-app"); + Path sourceDir = Files.createDirectories(projectBaseDir.resolve("my_app")); + Path sourceFile = sourceDir.resolve("__init__.py"); + Files.writeString(sourceFile, "print('hello')\n", UTF_8); + + Path report = projectBaseDir.resolve("coverage.xml"); + Files.writeString(report, """ + + + + my_app + + + + + + + + + + + + + + """, UTF_8); + + SensorContextTester sensorContext = SensorContextTester.create(projectBaseDir.toFile()); + MapSettings sensorSettings = new MapSettings(); + sensorSettings.setProperty(PythonCoverageSensor.REPORT_PATHS_KEY, "coverage.xml"); + sensorContext.setSettings(sensorSettings); + + DefaultInputFile inputFile = TestInputFileBuilder.create("moduleKey", "my_app/__init__.py") + .setModuleBaseDir(projectBaseDir) + .setLanguage("py") + .setType(Type.MAIN) + .initMetadata(TestUtils.fileContent(sourceFile.toFile(), StandardCharsets.UTF_8)) + .build(); + sensorContext.fileSystem().add(inputFile); + + coverageSensor.execute(sensorContext); + + assertThat(sensorContext.lineHits("moduleKey:my_app/__init__.py", 1)).isOne(); + } + + @Test + void should_resolve_absolute_source_path_independently_of_project_base_dir() throws Exception { + Path projectBaseDir = tmpDir.resolve(".tests/resources/python-app-abs"); + Path sourceDir = Files.createDirectories(projectBaseDir.resolve("my_app")); + Path sourceFile = sourceDir.resolve("__init__.py"); + Files.writeString(sourceFile, "print('hello')\n", UTF_8); + + String absoluteSourceDir = sourceDir.toAbsolutePath().toString(); + Path report = projectBaseDir.resolve("coverage.xml"); + Files.writeString(report, """ + + + + %s + + + + + + + + + + + + + + """.formatted(absoluteSourceDir), UTF_8); + + SensorContextTester sensorContext = SensorContextTester.create(projectBaseDir.toFile()); + MapSettings sensorSettings = new MapSettings(); + sensorSettings.setProperty(PythonCoverageSensor.REPORT_PATHS_KEY, "coverage.xml"); + sensorContext.setSettings(sensorSettings); + + DefaultInputFile inputFile = TestInputFileBuilder.create("moduleKey", "my_app/__init__.py") + .setModuleBaseDir(projectBaseDir) + .setLanguage("py") + .setType(Type.MAIN) + .initMetadata(TestUtils.fileContent(sourceFile.toFile(), StandardCharsets.UTF_8)) + .build(); + sensorContext.fileSystem().add(inputFile); + + coverageSensor.execute(sensorContext); + + assertThat(sensorContext.lineHits("moduleKey:my_app/__init__.py", 1)).isOne(); + } + @Test void should_warn_if_source_is_not_directory() { settings.setProperty(PythonCoverageSensor.REPORT_PATHS_KEY, "coverage_source_invalid_directory.xml"); coverageSensor.execute(context); - File file1 = new File("src/test/resources/org/sonar/plugins/python/coverage-reports/sources/file1.py"); - File file2 = new File("src/test/resources/org/sonar/plugins/python/coverage-reports/sources/file2.py"); - String message1 = "Invalid directory path in 'source' element: " + file1.getPath(); - String message2 = "Invalid directory path in 'source' element: " + file2.getPath(); + String message1 = "Invalid directory path in 'source' element: sources" + File.separator + "file1.py"; + String message2 = "Invalid directory path in 'source' element: sources" + File.separator + "file2.py"; assertThat(logTester.logs(Level.WARN)).contains(message1); assertThat(logTester.logs(Level.WARN)).contains(message2); verify(analysisWarnings, times(1)).addUnique("The following error(s) occurred while trying to import coverage report:" + System.lineSeparator() + message1 + System.lineSeparator() + message2); diff --git a/python-commons/src/test/resources/org/sonar/plugins/python/coverage-reports/coverage.4.4.2-multi-sources.xml b/python-commons/src/test/resources/org/sonar/plugins/python/coverage-reports/coverage.4.4.2-multi-sources.xml index b3c177bdb..2e07a57c2 100644 --- a/python-commons/src/test/resources/org/sonar/plugins/python/coverage-reports/coverage.4.4.2-multi-sources.xml +++ b/python-commons/src/test/resources/org/sonar/plugins/python/coverage-reports/coverage.4.4.2-multi-sources.xml @@ -3,8 +3,8 @@ - src/test/resources/org/sonar/plugins/python/coverage-reports/sources/folder2 - src/test/resources/org/sonar/plugins/python/coverage-reports/sources/folder1 + sources/folder2 + sources/folder1 diff --git a/python-commons/src/test/resources/org/sonar/plugins/python/coverage-reports/coverage.4.4.2.xml b/python-commons/src/test/resources/org/sonar/plugins/python/coverage-reports/coverage.4.4.2.xml index d669c716c..8afe063c7 100644 --- a/python-commons/src/test/resources/org/sonar/plugins/python/coverage-reports/coverage.4.4.2.xml +++ b/python-commons/src/test/resources/org/sonar/plugins/python/coverage-reports/coverage.4.4.2.xml @@ -3,7 +3,7 @@ - src/test/resources/org/sonar/plugins/python/coverage-reports/sources + sources diff --git a/python-commons/src/test/resources/org/sonar/plugins/python/coverage-reports/coverage_source_invalid_directory.xml b/python-commons/src/test/resources/org/sonar/plugins/python/coverage-reports/coverage_source_invalid_directory.xml index e29e35cbe..97aa89d23 100644 --- a/python-commons/src/test/resources/org/sonar/plugins/python/coverage-reports/coverage_source_invalid_directory.xml +++ b/python-commons/src/test/resources/org/sonar/plugins/python/coverage-reports/coverage_source_invalid_directory.xml @@ -3,8 +3,8 @@ - src/test/resources/org/sonar/plugins/python/coverage-reports/sources/file1.py - src/test/resources/org/sonar/plugins/python/coverage-reports/sources/file2.py + sources/file1.py + sources/file2.py diff --git a/python-commons/src/test/resources/org/sonar/plugins/python/coverage-reports/coverage_with_unresolved_absolute_path.xml b/python-commons/src/test/resources/org/sonar/plugins/python/coverage-reports/coverage_with_unresolved_absolute_path.xml index 9b2255816..d8735570e 100644 --- a/python-commons/src/test/resources/org/sonar/plugins/python/coverage-reports/coverage_with_unresolved_absolute_path.xml +++ b/python-commons/src/test/resources/org/sonar/plugins/python/coverage-reports/coverage_with_unresolved_absolute_path.xml @@ -3,7 +3,7 @@ SYSTEM 'http://cobertura.sourceforge.net/xml/coverage-03.dtd'> - src/test/resources/org/sonar/plugins/python/coverage-reports + sources @@ -21,7 +21,7 @@ - + @@ -33,7 +33,7 @@ - + diff --git a/python-commons/src/test/resources/org/sonar/plugins/python/coverage-reports/coverage_with_unresolved_path.xml b/python-commons/src/test/resources/org/sonar/plugins/python/coverage-reports/coverage_with_unresolved_path.xml index abb4ed538..cfb719d14 100644 --- a/python-commons/src/test/resources/org/sonar/plugins/python/coverage-reports/coverage_with_unresolved_path.xml +++ b/python-commons/src/test/resources/org/sonar/plugins/python/coverage-reports/coverage_with_unresolved_path.xml @@ -3,12 +3,12 @@ SYSTEM 'http://cobertura.sourceforge.net/xml/coverage-03.dtd'> - src/test/resources/org/sonar/plugins/python/coverage-reports + sources - + @@ -20,7 +20,7 @@ - + From 1c81a499e8a610355b058169ded70808de158618 Mon Sep 17 00:00:00 2001 From: "sonar-nigel[bot]" <247337653+sonar-nigel[bot]@users.noreply.github.com> Date: Thu, 23 Apr 2026 14:14:59 +0200 Subject: [PATCH 095/322] SONARPY-3986 Fix S905 false positive for bare expressions as marimo cell output (#1044) Co-authored-by: Vibe Bot Co-authored-by: Sebastian Zumbrunn GitOrigin-RevId: 5b9a81eca800422b6ad02a846ecbe2b018851fcc --- .../python/checks/UselessStatementCheck.java | 27 +++++++- .../python/checks/utils/MarimoUtils.java | 24 ++++++- .../checks/UselessStatementCheckTest.java | 6 ++ .../uselessStatementMarimo.py | 65 +++++++++++++++++++ 4 files changed, 119 insertions(+), 3 deletions(-) create mode 100644 python-checks/src/test/resources/checks/uselessStatement/uselessStatementMarimo.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/UselessStatementCheck.java b/python-checks/src/main/java/org/sonar/python/checks/UselessStatementCheck.java index 628b2e5c9..04ae5e784 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/UselessStatementCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/UselessStatementCheck.java @@ -47,6 +47,7 @@ import org.sonar.plugins.python.api.tree.UnaryExpression; import org.sonar.plugins.python.api.tree.WithItem; import org.sonar.plugins.python.api.tree.WithStatement; +import org.sonar.python.checks.utils.MarimoUtils; import org.sonar.python.tree.TreeUtils; @Rule(key = "S905") @@ -136,18 +137,42 @@ private static void checkNode(SubscriptionContext ctx) { if (isAnAirflowException((Expression) tree, ctx)) { return; } + if (isAMarimoException((Expression) tree, ctx)) { + return; + } ctx.addIssue(tree, MESSAGE); } private static boolean isAnAirflowException(Expression expression, SubscriptionContext ctx) { if (isWithinAirflowContext(expression, ctx)) { StatementList statementList = (StatementList) TreeUtils.firstAncestorOfKind(expression, Kind.STATEMENT_LIST); - return Optional.ofNullable(statementList).map(StatementList::statements).map(statements -> statements.get(statements.size() - 1)) + return Optional.ofNullable(statementList) + .map(StatementList::statements) + .map(statements -> statements.get(statements.size() - 1)) .filter(lastStatement -> lastStatement.equals(TreeUtils.firstAncestorOfKind(expression, Kind.EXPRESSION_STMT))).isPresent(); } return false; } + private static boolean isAMarimoException(Expression expression, SubscriptionContext ctx) { + return MarimoUtils.isTreeInMarimoCell(expression, ctx) && isLastExpressionInFunction(expression); + } + + private static boolean isLastExpressionInFunction(Expression expr) { + FunctionDef functionDef = TreeUtils.firstAncestorOfClass(expr, FunctionDef.class); + if (functionDef == null) { + return false; + } + StatementList statementList = functionDef.body(); + + Tree expressionStmt = TreeUtils.firstAncestorOfKind(expr, Kind.EXPRESSION_STMT); + return statementList.statements().stream() + .filter(s -> s.is(Kind.EXPRESSION_STMT)) + .reduce((first, second) -> second) + .filter(lastExprStmt -> lastExprStmt.equals(expressionStmt)) + .isPresent(); + } + private static boolean isWithinIgnoredContext(Tree tree, SubscriptionContext ctx) { Tree withParent = TreeUtils.firstAncestorOfKind(tree, Kind.WITH_STMT); if (withParent != null) { diff --git a/python-checks/src/main/java/org/sonar/python/checks/utils/MarimoUtils.java b/python-checks/src/main/java/org/sonar/python/checks/utils/MarimoUtils.java index 322d12b14..d92962e9d 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/utils/MarimoUtils.java +++ b/python-checks/src/main/java/org/sonar/python/checks/utils/MarimoUtils.java @@ -43,11 +43,31 @@ public static boolean isTreeInMarimoDecoratedFunction(Tree tree, SubscriptionCon return functionDef.decorators().stream().anyMatch(decorator -> isAppCellDecorator(decorator, ctx)); } + public static boolean isTreeInMarimoCell(Tree tree, SubscriptionContext ctx) { + FunctionDef functionDef = (FunctionDef) TreeUtils.firstAncestorOfKind(tree, Kind.FUNCDEF); + if (functionDef == null) { + return false; + } + return functionDef.decorators().stream().anyMatch(d -> isAppCell(d, ctx)); + } + + private static boolean isAppCell(Decorator decorator, SubscriptionContext ctx) { + return APP_CELL_MATCHER.isTrueFor(resolveDecoratorExpression(decorator), ctx); + } + + private static boolean isAppFunction(Decorator decorator, SubscriptionContext ctx) { + return APP_FUNCTION_MATCHER.isTrueFor(resolveDecoratorExpression(decorator), ctx); + } + private static boolean isAppCellDecorator(Decorator decorator, SubscriptionContext ctx) { + return isAppCell(decorator, ctx) || isAppFunction(decorator, ctx); + } + + private static Expression resolveDecoratorExpression(Decorator decorator) { Expression expr = decorator.expression(); if (expr instanceof CallExpression callExpr) { - expr = callExpr.callee(); + return callExpr.callee(); } - return APP_CELL_MATCHER.isTrueFor(expr, ctx) || APP_FUNCTION_MATCHER.isTrueFor(expr, ctx); + return expr; } } diff --git a/python-checks/src/test/java/org/sonar/python/checks/UselessStatementCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/UselessStatementCheckTest.java index 5a0f6c35a..b1ff9a974 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/UselessStatementCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/UselessStatementCheckTest.java @@ -47,4 +47,10 @@ void test_import() { void test_ignore_manifest() { PythonCheckVerifier.verifyNoIssue("src/test/resources/checks/__manifest__.py", new UselessStatementCheck()); } + + @Test + void test_marimo() { + PythonCheckVerifier.verify("src/test/resources/checks/uselessStatement/uselessStatementMarimo.py", new UselessStatementCheck()); + } + } diff --git a/python-checks/src/test/resources/checks/uselessStatement/uselessStatementMarimo.py b/python-checks/src/test/resources/checks/uselessStatement/uselessStatementMarimo.py new file mode 100644 index 000000000..d4e703152 --- /dev/null +++ b/python-checks/src/test/resources/checks/uselessStatement/uselessStatementMarimo.py @@ -0,0 +1,65 @@ +import marimo + +app = marimo.App() + + +@app.cell +def _(combined_df): + combined_df + return + + +@app.cell +def _(_fig): + _fig + return + + +@app.cell(hide_code=True) +def _(result_df): + result_df + return + + +@app.cell +def _(df): + df + + +@app.cell +def _(x, y): + x # Noncompliant + y + return + + +@app.cell +def _(df): + df + if True: # control flow after cell output + pass + + +@app.cell +def _(x, y): + x # Noncompliant + if True: # control flow after non-last expression + pass + y + + +@app.cell +def _(x): + if True: + x # Noncompliant + + +@app.function +def helper(x): + x # Noncompliant + return x + + +def not_marimo(x): + x # Noncompliant + return x From 649526ad0a4c62d5845c4eea754f1de820bc9756 Mon Sep 17 00:00:00 2001 From: Guillaume Dequenne Date: Thu, 23 Apr 2026 16:06:53 +0200 Subject: [PATCH 096/322] SONARPY-4108 Implement S8503: Membership tests should not use empty collections (#1070) GitOrigin-RevId: f752954d92186ed151b82c3c52f91df153b06786 --- .../EmptyCollectionMembershipTestCheck.java | 72 +++++++++++++++++++ .../python/checks/OpenSourceCheckList.java | 1 + .../org/sonar/l10n/py/rules/python/S8503.html | 65 +++++++++++++++++ .../org/sonar/l10n/py/rules/python/S8503.json | 25 +++++++ .../py/rules/python/Sonar_way_profile.json | 1 + ...mptyCollectionMembershipTestCheckTest.java | 28 ++++++++ .../checks/emptyCollectionMembershipTest.py | 71 ++++++++++++++++++ 7 files changed, 263 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/EmptyCollectionMembershipTestCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8503.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8503.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/EmptyCollectionMembershipTestCheckTest.java create mode 100644 python-checks/src/test/resources/checks/emptyCollectionMembershipTest.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/EmptyCollectionMembershipTestCheck.java b/python-checks/src/main/java/org/sonar/python/checks/EmptyCollectionMembershipTestCheck.java new file mode 100644 index 000000000..e385b1c6d --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/EmptyCollectionMembershipTestCheck.java @@ -0,0 +1,72 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.DictionaryLiteral; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.InExpression; +import org.sonar.plugins.python.api.tree.ListLiteral; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.tree.Tuple; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; + +@Rule(key = "S8503") +public class EmptyCollectionMembershipTestCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Remove this membership test on an empty collection; it will always be the same value."; + + private static final TypeMatcher EMPTY_COLLECTION_CONSTRUCTOR = TypeMatchers.any( + TypeMatchers.isType("builtins.set"), + TypeMatchers.isType("builtins.tuple"), + TypeMatchers.isType("builtins.frozenset") + ); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.IN, EmptyCollectionMembershipTestCheck::checkInExpression); + } + + private static void checkInExpression(SubscriptionContext ctx) { + InExpression inExpression = (InExpression) ctx.syntaxNode(); + Expression rightOperand = inExpression.rightOperand(); + if (isEmptyCollection(rightOperand, ctx)) { + ctx.addIssue(inExpression, MESSAGE); + } + } + + private static boolean isEmptyCollection(Expression expression, SubscriptionContext ctx) { + if (expression instanceof ListLiteral listLiteral) { + return listLiteral.elements().expressions().isEmpty(); + } + if (expression instanceof DictionaryLiteral dictionaryLiteral) { + return dictionaryLiteral.elements().isEmpty(); + } + if (expression instanceof Tuple tuple) { + return tuple.elements().isEmpty(); + } + if (expression instanceof CallExpression callExpression) { + return callExpression.arguments().isEmpty() + && EMPTY_COLLECTION_CONSTRUCTOR.isTrueFor(callExpression.callee(), ctx); + } + return false; + } +} diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 8f20b3758..e47195300 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -213,6 +213,7 @@ public Stream> getChecks() { EmailSendingCheck.class, EmptyAlternativeCheck.class, EmptyCollectionConstructorCheck.class, + EmptyCollectionMembershipTestCheck.class, EmptyGroupCheck.class, EmptyFunctionCheck.class, EmptyNestedBlockCheck.class, diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8503.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8503.html new file mode 100644 index 000000000..234a3d02c --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8503.html @@ -0,0 +1,65 @@ +

      This rule raises an issue when a membership test using in or not in is performed on an empty collection literal such as +[], {}, set(), tuple(), or frozenset().

      +

      Why is this an issue?

      +

      In Python, the membership operators in and not in test whether a value exists in a collection. When the collection is +empty, these tests always produce predictable results:

      +
        +
      • x in [] is always False because the value cannot exist in an empty collection
      • +
      • x not in [] is always True because the value is indeed not in an empty collection
      • +
      +

      This pattern typically indicates one of three problems:

      +
        +
      • dead code: the check serves no purpose and should be removed
      • +
      • logic error: the collection should have been populated before the membership test
      • +
      • incomplete implementation: the code was started but never finished
      • +
      +

      Consider this example:

      +
      +if user_id in []:
      +    grant_access()
      +
      +

      This condition will never be true, so grant_access() will never be called. The code is either incomplete, meaning the list should +contain authorized user IDs, or the check is unnecessary and should be removed.

      +

      The issue applies to all Python collection types:

      +
        +
      • empty list: []
      • +
      • empty dict: {}, which creates an empty dictionary, not a set. When used with in, it tests keys.
      • +
      • empty set: set()
      • +
      • empty tuple: () or tuple()
      • +
      • empty frozenset: frozenset()
      • +
      +

      What is the potential impact?

      +

      This issue can lead to bugs where conditions never evaluate as expected, causing:

      +
        +
      • dead code paths: code that can never be reached
      • +
      • security vulnerabilities: authorization checks that never pass or always pass
      • +
      • logic errors: incorrect program behavior due to conditions that do not work as intended
      • +
      +

      The severity depends on the context. An authorization check that always fails could be a critical security issue, while a redundant check might +only affect code maintainability.

      +

      How to fix it

      +

      If the collection should contain values, populate it with the appropriate elements before performing the membership test.

      +

      Code examples

      +

      Noncompliant code example

      +
      +if user_id in []:  # Noncompliant: empty list
      +    grant_access()
      +
      +

      Compliant solution

      +
      +if user_id in ["admin", "user123", "moderator"]:
      +    grant_access()
      +
      +

      Resources

      +

      Documentation

      + +

      Related rules

      +
        +
      • {rule:python:S2583} - Conditionals should not always evaluate to the same value
      • +
      • {rule:python:S1145} - Useless "if(true) {…​}" and "if(false){…​}" blocks should be removed
      • +
      + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8503.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8503.json new file mode 100644 index 000000000..70e7f641c --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8503.json @@ -0,0 +1,25 @@ +{ + "title": "Membership tests should not use empty collections", + "type": "BUG", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5 min" + }, + "tags": [ + "pitfall", + "suspicious" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-8503", + "sqKey": "S8503", + "scope": "All", + "quickfix": "unknown", + "code": { + "impacts": { + "RELIABILITY": "MEDIUM", + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "LOGICAL" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 640b1c33b..dbdae5ce3 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -332,6 +332,7 @@ "S8493", "S8494", "S8495", + "S8503", "S8504", "S8505", "S8507", diff --git a/python-checks/src/test/java/org/sonar/python/checks/EmptyCollectionMembershipTestCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/EmptyCollectionMembershipTestCheckTest.java new file mode 100644 index 000000000..7746976e8 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/EmptyCollectionMembershipTestCheckTest.java @@ -0,0 +1,28 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.junit.jupiter.api.Test; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class EmptyCollectionMembershipTestCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/emptyCollectionMembershipTest.py", new EmptyCollectionMembershipTestCheck()); + } +} diff --git a/python-checks/src/test/resources/checks/emptyCollectionMembershipTest.py b/python-checks/src/test/resources/checks/emptyCollectionMembershipTest.py new file mode 100644 index 000000000..5ba38d556 --- /dev/null +++ b/python-checks/src/test/resources/checks/emptyCollectionMembershipTest.py @@ -0,0 +1,71 @@ +def empty_literals(x): + if x in []: ... # Noncompliant {{Remove this membership test on an empty collection; it will always be the same value.}} + # ^^^^^^^ + if x in {}: ... # Noncompliant + # ^^^^^^^ + if x in (): ... # Noncompliant + # ^^^^^^^ + if x not in []: ... # Noncompliant + # ^^^^^^^^^^^ + if x not in {}: ... # Noncompliant + if x not in (): ... # Noncompliant + + +def empty_constructor_calls(x): + if x in set(): ... # Noncompliant + # ^^^^^^^^^^ + if x in tuple(): ... # Noncompliant + if x in frozenset(): ... # Noncompliant + if x not in set(): ... # Noncompliant + if x not in tuple(): ... # Noncompliant + if x not in frozenset(): ... # Noncompliant + + +def outside_conditions(x, values): + # The rule fires on any membership test, not only those used as a condition. + result = x in [] # Noncompliant + flag = x not in set() # Noncompliant + values = [y for y in range(10) if y in ()] # Noncompliant + + +def compliant_non_empty_literals(x): + if x in [1, 2, 3]: ... + if x in {"a": 1}: ... + if x in {1, 2}: ... + if x in (1,): ... + if x in (1, 2): ... + if x not in [1, 2, 3]: ... + + +def compliant_constructor_calls_with_arguments(x, iterable): + if x in set(iterable): ... + if x in tuple(iterable): ... + if x in frozenset(iterable): ... + if x in list(iterable): ... + if x in dict(iterable): ... + + +def compliant_list_dict_builtin_calls(x): + # list() / dict() are not covered by this rule. Use [] / {} instead. + if x in list(): ... + if x in dict(): ... + + +def compliant_variables(x, values): + if x in values: ... + my_list = [] + if x in my_list: ... # Empty but through a variable - out of scope here + + +def compliant_unpacking(x, p1, p2): + if x in [*p1, *p2]: ... + if x in {**p1}: ... + if x in {*p1}: ... + if x in (*p1,): ... + + +def compliant_shadowed_builtins(x): + def set(): # user-defined function, shadows builtin + return [1, 2] + + if x in set(): ... # Not the builtin set From aad70330c5b60f1e256239deb567069f014d9edc Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Fri, 24 Apr 2026 09:14:50 +0200 Subject: [PATCH 097/322] SONARPY-4082 Refactoring PyProject and Setup.py parsing to PackageRootResolver. (#1067) GitOrigin-RevId: ca3a6b024c0484fcde49cf2cd3611a9c873057b3 --- .../python/indexer/PackageRootResolver.java | 215 ++++++++++-- .../plugins/python/indexer/PythonIndexer.java | 196 +---------- .../indexer/PackageRootResolverTest.java | 311 +++++++++++------- .../python/indexer/PythonIndexerTest.java | 102 ------ .../indexer/SonarQubePythonIndexerTest.java | 29 ++ 5 files changed, 411 insertions(+), 442 deletions(-) diff --git a/python-commons/src/main/java/org/sonar/plugins/python/indexer/PackageRootResolver.java b/python-commons/src/main/java/org/sonar/plugins/python/indexer/PackageRootResolver.java index 926d662df..feb070c43 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/indexer/PackageRootResolver.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/indexer/PackageRootResolver.java @@ -16,19 +16,39 @@ */ package org.sonar.plugins.python.indexer; +import com.google.common.annotations.VisibleForTesting; import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Optional; +import java.util.function.BiFunction; +import java.util.stream.Stream; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.sonar.api.batch.fs.FileSystem; import org.sonar.api.config.Configuration; /** * Resolves package root directories for Python projects. * - *

      This class validates and resolves package roots extracted from build system configurations - * (e.g., pyproject.toml) and provides fallback resolution when no roots are configured. + *

      This class is the single source of truth for package root resolution. It handles: + *

        + *
      • Extraction from pyproject.toml build system configurations
      • + *
      • Extraction from setup.py configurations
      • + *
      • Fallback when build files exist but provide no roots: conventional folders (src/, lib/), + * then sonar.sources, then base directory
      • + *
      • Fallback when no build files exist: sonar.sources, then conventional folders (src/, lib/), + * then base directory
      • + *
      */ public class PackageRootResolver { + + private static final Logger LOG = LoggerFactory.getLogger(PackageRootResolver.class); + static final String SONAR_SOURCES_KEY = "sonar.sources"; static final List CONVENTIONAL_FOLDERS = List.of("src", "lib"); @@ -36,56 +56,117 @@ private PackageRootResolver() { } /** - * Resolves package root directories. + * Resolves package root directories for the project. * - *

      If extracted roots from build system configuration are provided (already as absolute paths - * resolved relative to their config file locations), returns them directly. - * Otherwise, applies a fallback chain to determine appropriate roots. + *

      Attempts to extract source roots from pyproject.toml and setup.py build system configurations. + * Falls back to different priority orders depending on whether build files exist: when build files + * are present but provide no source roots, conventional folders take priority over sonar.sources; + * when no build files exist at all, sonar.sources takes priority over conventional folders. * - * @param extractedRoots roots extracted from build system config, already as absolute paths - * @param config the Sonar configuration to read sonar.sources property - * @param baseDir the project base directory (used only for fallback resolution) - * @return list of resolved package root absolute paths + * @param fileSystem the Sonar file system providing the base directory + * @param config the Sonar configuration + * @return resolution result including resolved root absolute paths and method information */ - public static List resolve(List extractedRoots, Configuration config, File baseDir) { - if (!extractedRoots.isEmpty()) { - // Extracted roots are already absolute paths (resolved relative to config file location) - return extractedRoots; + public static PackageResolutionResult resolve(FileSystem fileSystem, Configuration config) { + File baseDir = fileSystem.baseDir(); + + // Discover build config files + List pyprojectFiles = findFilesRecursively(fileSystem, "pyproject.toml"); + List setupPyFiles = findFilesRecursively(fileSystem, "setup.py"); + boolean hasBuildConfigFiles = !pyprojectFiles.isEmpty() || !setupPyFiles.isEmpty(); + + // Extract source roots from discovered files + List pyprojectResults = pyprojectFiles.stream() + .map(PyProjectTomlSourceRoots::extractWithBuildSystem) + .filter(PyProjectExtractionResult::hasRoots) + .toList(); + List setupPyRoots = setupPyFiles.stream() + .map(SetupPySourceRoots::extractWithLocation) + .filter(csr -> !csr.relativeRoots().isEmpty()) + .toList(); + + boolean hasPyproject = pyprojectResults.stream().anyMatch(PyProjectExtractionResult::hasRoots); + boolean hasSetupPy = !setupPyRoots.isEmpty(); + + List combinedRoots = Stream.concat( + pyprojectResults.stream().map(PyProjectExtractionResult::configRoots).flatMap(crs -> crs.toAbsolutePaths().stream()), + setupPyRoots.stream().flatMap(csr -> csr.toAbsolutePaths().stream())) + .distinct() + .toList(); + + List adjustedRoots = adjustRoots(combinedRoots, baseDir); + LOG.debug("Resolved package roots from build configuration: {}", adjustedRoots); + + if (hasPyproject && hasSetupPy) { + return PackageResolutionResult.fromBothPyProjectAndSetupPy(adjustedRoots, getCombinedBuildSystem(pyprojectResults)); + } + + if (hasPyproject) { + return PackageResolutionResult.fromPyProjectToml(adjustedRoots, getCombinedBuildSystem(pyprojectResults)); } - return resolveFallback(config, baseDir); + + if (hasSetupPy) { + return PackageResolutionResult.fromSetupPy(adjustedRoots); + } + + return resolveFallback(config, baseDir, hasBuildConfigFiles); } /** - * Resolves fallback package roots when no build system configuration is available. + * Resolves fallback package roots when no build system configuration provides source roots. * - *

      Fallback priority: - *

        - *
      1. sonar.sources property if set
      2. - *
      3. "src" and/or "lib" folders if they exist
      4. - *
      5. Project base directory absolute path as last resort
      6. - *
      + *

      When build config files (pyproject.toml / setup.py) exist but provide no source roots, + * the priority order is: conventional folders (src/, lib/), then sonar.sources, then base directory. * - * @param config the Sonar configuration - * @param baseDir the project base directory - * @return list of fallback package root absolute paths + *

      When NO build config files exist at all, the priority order is: sonar.sources, then + * conventional folders (src/, lib/), then base directory. */ - static List resolveFallback(Configuration config, File baseDir) { + private static PackageResolutionResult resolveFallback(Configuration config, File baseDir, boolean hasBuildConfigFiles) { + List>> candidates = hasBuildConfigFiles + ? List.of(PackageRootResolver::tryConventionalFolders, PackageRootResolver::trySonarSources) + : List.of(PackageRootResolver::trySonarSources, PackageRootResolver::tryConventionalFolders); + + for (BiFunction> candidate : candidates) { + Optional result = candidate.apply(config, baseDir); + if (result.isPresent()) { + return result.get(); + } + } + + LOG.debug("Using project base directory as package root (fallback)"); + return PackageResolutionResult.fromBaseDir(List.of(baseDir.getAbsolutePath())); + } + + private static Optional tryConventionalFolders(Configuration config, File baseDir) { List conventionalFolders = findConventionalFolders(baseDir); - if (!conventionalFolders.isEmpty()) { - return toAbsolutePaths(conventionalFolders, baseDir); + if (conventionalFolders.isEmpty()) { + return Optional.empty(); } + List adjustedRoots = adjustRoots(toAbsolutePaths(conventionalFolders, baseDir), baseDir); + LOG.debug("Resolved package roots from fallback (conventional folders): {}", adjustedRoots); + return Optional.of(PackageResolutionResult.fromConventionalFolders(adjustedRoots)); + } + private static Optional trySonarSources(Configuration config, File baseDir) { String[] sonarSources = config.getStringArray(SONAR_SOURCES_KEY); - if (sonarSources.length > 0) { - return toAbsolutePaths(Arrays.asList(sonarSources), baseDir); + if (sonarSources.length == 0) { + return Optional.empty(); } - - return List.of(baseDir.getAbsolutePath()); + List adjustedRoots = adjustRoots(toAbsolutePaths(Arrays.asList(sonarSources), baseDir), baseDir); + LOG.debug("Resolved package roots from fallback (sonar.sources): {}", adjustedRoots); + return Optional.of(PackageResolutionResult.fromSonarSources(adjustedRoots)); } - private static List toAbsolutePaths(List paths, File baseDir) { + /** + * Converts relative path strings to normalized absolute paths under the given base directory. + * + *

      Uses {@link Path#normalize()} to resolve {@code .} and {@code ..} components without + * performing any I/O, so that {@code sonar.sources=.} correctly resolves to the base directory + * rather than producing an un-normalized path like {@code /project/.}. + */ + static List toAbsolutePaths(List paths, File baseDir) { return paths.stream() - .map(path -> new File(baseDir, path).getAbsolutePath()) + .map(path -> new File(baseDir, path).toPath().normalize().toString()) .toList(); } @@ -99,5 +180,69 @@ private static List findConventionalFolders(File baseDir) { } return folders; } -} + private static List adjustRoots(List roots, File baseDir) { + return roots.stream() + .map(root -> { + File rootFile = new File(root).isAbsolute() ? new File(root) : new File(baseDir, root); + return adjustPackageRoot(rootFile, baseDir); + }) + .distinct() + .toList(); + } + + /** + * Adjusts a package root by walking up the directory tree if it contains __init__.py. + * + *

      If the root directory contains __init__.py, it's part of a package, not the package root. + * We walk up to find the first parent directory without __init__.py. + * + * @param root the potential package root directory + * @param baseDir the project base directory (we don't walk above this) + * @return the adjusted package root absolute path + */ + @VisibleForTesting + static String adjustPackageRoot(File root, File baseDir) { + File current = root; + String baseDirPath = baseDir.getAbsolutePath(); + while (current != null && !current.getAbsolutePath().equals(baseDirPath)) { + File initFile = new File(current, "__init__.py"); + if (!initFile.exists()) { + break; + } + current = current.getParentFile(); + } + if (current == null) { + return baseDirPath; + } + return current.getAbsolutePath(); + } + + /** + * Recursively finds files with the given filename under the project base directory. + */ + private static List findFilesRecursively(FileSystem fileSystem, String filename) { + try (Stream stream = Files.walk(fileSystem.baseDir().toPath())) { + return stream + .filter(Files::isRegularFile) + .filter(path -> filename.equals(path.getFileName().toString())) + .map(Path::toFile) + .toList(); + } catch (IOException e) { + return List.of(); + } + } + + /** + * Determines the combined build system across multiple pyproject.toml results. + * If multiple files report different build systems, returns MULTIPLE. + */ + private static PackageResolutionResult.BuildSystem getCombinedBuildSystem(List pyprojectResults) { + return pyprojectResults.stream() + .map(PyProjectExtractionResult::buildSystem) + .filter(bs -> bs != PackageResolutionResult.BuildSystem.NONE) + .distinct() + .reduce((a, b) -> PackageResolutionResult.BuildSystem.MULTIPLE) + .orElse(PackageResolutionResult.BuildSystem.NONE); + } +} diff --git a/python-commons/src/main/java/org/sonar/plugins/python/indexer/PythonIndexer.java b/python-commons/src/main/java/org/sonar/plugins/python/indexer/PythonIndexer.java index 25e12f7da..2935b9bea 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/indexer/PythonIndexer.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/indexer/PythonIndexer.java @@ -16,23 +16,18 @@ */ package org.sonar.plugins.python.indexer; -import com.google.common.annotations.VisibleForTesting; import com.sonar.sslr.api.AstNode; import java.io.File; import java.io.IOException; import java.net.URI; -import java.nio.file.Files; -import java.nio.file.Path; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; -import java.util.stream.Stream; import javax.annotation.CheckForNull; import javax.annotation.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.sonar.api.batch.fs.FileSystem; import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.sensor.SensorContext; import org.sonar.plugins.python.PythonInputFile; @@ -109,203 +104,18 @@ public List packageRoots() { /** * Resolves package root directories for the project. * - *

      Attempts to extract source roots from pyproject.toml and setup.py build system configurations. - * Falls back to sonar.sources property, conventional folders (src/, lib/), or the project base directory. + *

      Delegates entirely to {@link PackageRootResolver}, which is the single source of truth + * for package root resolution (pyproject.toml, setup.py, fallback chain). * * @param context the sensor context containing filesystem and configuration * @return list of resolved package root absolute paths */ protected List resolvePackageRoots(SensorContext context) { - PackageResolutionResult result = resolvePackageRootsWithMethod(context); + PackageResolutionResult result = PackageRootResolver.resolve(context.fileSystem(), context.config()); this.packageResolutionResult = result; return result.roots(); } - /** - * Resolves package root directories and tracks the resolution method used. - * - * @param context the sensor context containing filesystem and configuration - * @return resolution result including roots and method information - */ - protected PackageResolutionResult resolvePackageRootsWithMethod(SensorContext context) { - FileSystem fileSystem = context.fileSystem(); - File baseDir = fileSystem.baseDir(); - - // Try both pyproject.toml and setup.py - List pyprojectResults = extractSourceRootsFromPyProjectTomlWithBuildSystem(fileSystem); - List setupPyRoots = extractSourceRootsFromSetupPy(fileSystem); - - boolean hasPyproject = pyprojectResults.stream().anyMatch(PyProjectExtractionResult::hasRoots); - boolean hasSetupPy = !setupPyRoots.isEmpty(); - List combinedRoots = Stream.concat( - pyprojectResults.stream().map(PyProjectExtractionResult::configRoots).flatMap( crs -> crs.toAbsolutePaths().stream()), - setupPyRoots.stream().flatMap(csr -> csr.toAbsolutePaths().stream()) - ) - .distinct() - .toList(); - - List adjustedRoots = adjustRoots(combinedRoots, baseDir); - LOG.debug("Resolved package roots from build configuration: {}", adjustedRoots); - - if (hasPyproject && hasSetupPy) { - return PackageResolutionResult.fromBothPyProjectAndSetupPy(adjustedRoots, getCombinedBuildSystem(pyprojectResults)); - } - - if (hasPyproject) { - return PackageResolutionResult.fromPyProjectToml(adjustedRoots, getCombinedBuildSystem(pyprojectResults)); - } - - if (hasSetupPy) { - return PackageResolutionResult.fromSetupPy(adjustedRoots); - } - - // Fallback to PackageRootResolver - return resolveFallback(context.config(), baseDir); - } - - /** - * Determine the build system (if multiple files have different build systems, use MULTIPLE) - * @param pyprojectResults the list of pyproject extraction results to analyze - * @return the combined build system result for the project - */ - private static PackageResolutionResult.BuildSystem getCombinedBuildSystem(List pyprojectResults) { - return pyprojectResults.stream() - .map(PyProjectExtractionResult::buildSystem) - .filter(bs -> bs != PackageResolutionResult.BuildSystem.NONE) - .distinct() - .reduce((a, b) -> PackageResolutionResult.BuildSystem.MULTIPLE) - .orElse(PackageResolutionResult.BuildSystem.NONE); - } - - /** - * Resolves fallback package roots when no build configuration is available. - */ - private static PackageResolutionResult resolveFallback(org.sonar.api.config.Configuration config, File baseDir) { - String[] sonarSources = config.getStringArray(PackageRootResolver.SONAR_SOURCES_KEY); - if (sonarSources.length > 0) { - List roots = toAbsolutePaths(java.util.Arrays.asList(sonarSources), baseDir); - List adjustedRoots = adjustRoots(roots, baseDir); - LOG.debug("Resolved package roots from fallback (sonar.sources or conventional folders): {}", adjustedRoots); - return PackageResolutionResult.fromSonarSources(adjustedRoots); - } - - List conventionalFolders = findConventionalFolders(baseDir); - if (!conventionalFolders.isEmpty()) { - List roots = toAbsolutePaths(conventionalFolders, baseDir); - List adjustedRoots = adjustRoots(roots, baseDir); - LOG.debug("Resolved package roots from fallback (sonar.sources or conventional folders): {}", adjustedRoots); - return PackageResolutionResult.fromConventionalFolders(adjustedRoots); - } - - List baseDirRoots = List.of(baseDir.getAbsolutePath()); - LOG.debug("Using project base directory as package root (fallback)"); - return PackageResolutionResult.fromBaseDir(baseDirRoots); - } - - private static List adjustRoots(List roots, File baseDir) { - return roots.stream() - .map(root -> { - File rootFile = new File(root).isAbsolute() ? new File(root) : new File(baseDir, root); - return adjustPackageRoot(rootFile, baseDir); - }) - .distinct() - .toList(); - } - - private static List toAbsolutePaths(List paths, File baseDir) { - return paths.stream() - .map(path -> new File(baseDir, path).getAbsolutePath()) - .toList(); - } - - private static List findConventionalFolders(File baseDir) { - List folders = new java.util.ArrayList<>(); - for (String folderName : PackageRootResolver.CONVENTIONAL_FOLDERS) { - File folder = new File(baseDir, folderName); - if (folder.exists() && folder.isDirectory()) { - folders.add(folderName); - } - } - return folders; - } - - /** - * Adjusts a package root by walking up the directory tree if it contains __init__.py. - * - *

      If the root directory contains __init__.py, it's part of a package, not the package root. - * We walk up to find the first parent directory without __init__.py. - * - * @param root the potential package root directory - * @param baseDir the project base directory (we don't walk above this) - * @return the adjusted package root absolute path - */ - @VisibleForTesting - static String adjustPackageRoot(File root, File baseDir) { - File current = root; - String baseDirPath = baseDir.getAbsolutePath(); - while (current != null && !current.getAbsolutePath().equals(baseDirPath)) { - File initFile = new File(current, "__init__.py"); - if (!initFile.exists()) { - break; - } - current = current.getParentFile(); - } - if (current == null) { - return baseDirPath; - } - return current.getAbsolutePath(); - } - - /** - * Recursively finds files with the given filename in the project directory. - * - * @param fileSystem the file system to search in - * @param filename the filename to search for (e.g., "pyproject.toml", "setup.py") - * @return stream of matching files - */ - private static Stream findFilesRecursively(FileSystem fileSystem, String filename) { - try { - return Files.walk(fileSystem.baseDir().toPath()) - .filter(Files::isRegularFile) - .filter(path -> filename.equals(path.getFileName().toString())) - .map(Path::toFile); - } catch (IOException e) { - return Stream.empty(); - } - } - - /** - * Extracts source root directories from pyproject.toml files in the project. - * - * @param fileSystem the file system to search for pyproject.toml - * @return extraction result with source roots and build system info - */ - private static List extractSourceRootsFromPyProjectTomlWithBuildSystem(FileSystem fileSystem) { - List results = findFilesRecursively(fileSystem, "pyproject.toml") - .map(PyProjectTomlSourceRoots::extractWithBuildSystem) - .filter(PyProjectExtractionResult::hasRoots) - .toList(); - - if (results.isEmpty()) { - return List.of(); - } - - return results; - } - - /** - * Extracts source root directories from setup.py files in the project. - * - * @param fileSystem the file system to search for setup.py - * @return list of ConfigSourceRoots containing config file locations and their relative roots - */ - private static List extractSourceRootsFromSetupPy(FileSystem fileSystem) { - return findFilesRecursively(fileSystem, "setup.py") - .map(SetupPySourceRoots::extractWithLocation) - .filter(csr -> !csr.relativeRoots().isEmpty()) - .toList(); - } - public void collectPackageNames(List inputFiles) { for (PythonInputFile inputFile : inputFiles) { String packageName = pythonPackageName(inputFile.wrappedFile().file(), packageRoots, projectBaseDirAbsolutePath); diff --git a/python-commons/src/test/java/org/sonar/plugins/python/indexer/PackageRootResolverTest.java b/python-commons/src/test/java/org/sonar/plugins/python/indexer/PackageRootResolverTest.java index 1a4d0e515..8b0fd9dc6 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/indexer/PackageRootResolverTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/indexer/PackageRootResolverTest.java @@ -23,6 +23,7 @@ import java.util.List; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; +import org.sonar.api.batch.fs.FileSystem; import org.sonar.api.config.Configuration; import static org.assertj.core.api.Assertions.assertThat; @@ -34,128 +35,170 @@ class PackageRootResolverTest { @TempDir Path tempDir; - @Test - void resolve_withExtractedRoots_returnsThemDirectly() { - // Extracted roots are now expected to be already absolute paths - // (resolved relative to the config file location by PythonIndexer) + // ─── Helper ──────────────────────────────────────────────────────────────── + + private FileSystem mockFileSystem(File baseDir) { + FileSystem fs = mock(FileSystem.class); + when(fs.baseDir()).thenReturn(baseDir); + return fs; + } + + private Configuration noSonarSources() { Configuration config = mock(Configuration.class); when(config.getStringArray("sonar.sources")).thenReturn(new String[0]); + return config; + } + + private Configuration sonarSources(String... values) { + Configuration config = mock(Configuration.class); + when(config.getStringArray("sonar.sources")).thenReturn(values); + return config; + } + + // ─── resolve() — fallback: conventional folders ─────────────────────────── + @Test + void resolve_noConfigFiles_fallsBackToSrcFolder() throws IOException { + Files.createDirectory(tempDir.resolve("src")); File baseDir = tempDir.toFile(); - List extractedRoots = List.of( - new File(baseDir, "subproject/src").getAbsolutePath(), - new File(baseDir, "subproject/lib").getAbsolutePath() - ); - List result = PackageRootResolver.resolve(extractedRoots, config, baseDir); - // Should return the paths as-is since they're already absolute - assertThat(result).containsExactly( - new File(baseDir, "subproject/src").getAbsolutePath(), - new File(baseDir, "subproject/lib").getAbsolutePath()); + PackageResolutionResult result = PackageRootResolver.resolve(mockFileSystem(baseDir), noSonarSources()); + + assertThat(result.roots()).containsExactly(new File(baseDir, "src").getAbsolutePath()); + assertThat(result.method()).isEqualTo(PackageResolutionResult.ResolutionMethod.CONVENTIONAL_FOLDERS); } @Test - void resolve_withExtractedRoots_ignoresSonarSources() { - Configuration config = mock(Configuration.class); - when(config.getStringArray("sonar.sources")).thenReturn(new String[]{"other"}); + void resolve_noConfigFiles_fallsBackToLibFolder() throws IOException { + Files.createDirectory(tempDir.resolve("lib")); + File baseDir = tempDir.toFile(); + PackageResolutionResult result = PackageRootResolver.resolve(mockFileSystem(baseDir), noSonarSources()); + + assertThat(result.roots()).containsExactly(new File(baseDir, "lib").getAbsolutePath()); + assertThat(result.method()).isEqualTo(PackageResolutionResult.ResolutionMethod.CONVENTIONAL_FOLDERS); + } + + @Test + void resolve_noConfigFiles_fallsBackToBothSrcAndLib() throws IOException { + Files.createDirectory(tempDir.resolve("src")); + Files.createDirectory(tempDir.resolve("lib")); File baseDir = tempDir.toFile(); - // Extracted roots are already absolute paths - List extractedRoots = List.of(new File(baseDir, "app/src").getAbsolutePath()); - List result = PackageRootResolver.resolve(extractedRoots, config, baseDir); - // Should return the extracted root as-is, ignoring sonar.sources - assertThat(result).containsExactly(new File(baseDir, "app/src").getAbsolutePath()); + PackageResolutionResult result = PackageRootResolver.resolve(mockFileSystem(baseDir), noSonarSources()); + + assertThat(result.roots()).containsExactly( + new File(baseDir, "src").getAbsolutePath(), + new File(baseDir, "lib").getAbsolutePath()); + assertThat(result.method()).isEqualTo(PackageResolutionResult.ResolutionMethod.CONVENTIONAL_FOLDERS); } @Test - void resolve_emptyExtractedRoots_fallsBackToSonarSources() { - Configuration config = mock(Configuration.class); - when(config.getStringArray("sonar.sources")).thenReturn(new String[]{"sources", "lib"}); + void resolve_noConfigFiles_sonarSourcesWinsOverConventionalFolders() throws IOException { + // src/ exists AND sonar.sources is set — sonar.sources should win (no build files) + Files.createDirectory(tempDir.resolve("src")); + File baseDir = tempDir.toFile(); + PackageResolutionResult result = PackageRootResolver.resolve(mockFileSystem(baseDir), sonarSources("app")); + + assertThat(result.roots()).containsExactly(new File(baseDir, "app").getAbsolutePath()); + assertThat(result.method()).isEqualTo(PackageResolutionResult.ResolutionMethod.SONAR_SOURCES); + } + + // ─── resolve() — fallback: sonar.sources ────────────────────────────────── + + @Test + void resolve_noConfigFilesNoConventionalFolders_fallsBackToSonarSources() { File baseDir = tempDir.toFile(); - List result = PackageRootResolver.resolve(List.of(), config, baseDir); - assertThat(result).containsExactly( + PackageResolutionResult result = PackageRootResolver.resolve(mockFileSystem(baseDir), sonarSources("sources", "lib")); + + assertThat(result.roots()).containsExactly( new File(baseDir, "sources").getAbsolutePath(), new File(baseDir, "lib").getAbsolutePath()); + assertThat(result.method()).isEqualTo(PackageResolutionResult.ResolutionMethod.SONAR_SOURCES); } @Test - void resolve_emptyExtractedRootsAndNoSonarSources_fallsBackToSrcFolder() throws IOException { - Configuration config = mock(Configuration.class); - when(config.getStringArray("sonar.sources")).thenReturn(new String[0]); - + void resolve_dotSonarSources_returnsBaseDirAbsolutePath() { + // sonar.sources=. must normalize to baseDir, not produce "/baseDir/." File baseDir = tempDir.toFile(); - Files.createDirectory(tempDir.resolve("src")); - List result = PackageRootResolver.resolve(List.of(), config, baseDir); + PackageResolutionResult result = PackageRootResolver.resolve(mockFileSystem(baseDir), sonarSources(".")); - assertThat(result).containsExactly(new File(baseDir, "src").getAbsolutePath()); + assertThat(result.roots()).containsExactly(baseDir.getAbsolutePath()); + assertThat(result.method()).isEqualTo(PackageResolutionResult.ResolutionMethod.SONAR_SOURCES); } - @Test - void resolve_emptyExtractedRootsAndNoSonarSources_fallsBackToLibFolder() throws IOException { - Configuration config = mock(Configuration.class); - when(config.getStringArray("sonar.sources")).thenReturn(new String[0]); + // ─── resolve() — fallback: base directory ───────────────────────────────── + @Test + void resolve_noConfigFilesNoConventionalFoldersNoSonarSources_fallsBackToBaseDir() { File baseDir = tempDir.toFile(); - Files.createDirectory(tempDir.resolve("lib")); - List result = PackageRootResolver.resolve(List.of(), config, baseDir); + PackageResolutionResult result = PackageRootResolver.resolve(mockFileSystem(baseDir), noSonarSources()); - assertThat(result).containsExactly(new File(baseDir, "lib").getAbsolutePath()); + assertThat(result.roots()).containsExactly(baseDir.getAbsolutePath()); + assertThat(result.method()).isEqualTo(PackageResolutionResult.ResolutionMethod.BASE_DIR); } @Test - void resolve_emptyExtractedRootsAndNoSonarSources_fallsBackToBothSrcAndLib() throws IOException { - Configuration config = mock(Configuration.class); - when(config.getStringArray("sonar.sources")).thenReturn(new String[0]); - + void resolve_srcExistsAsFile_fallsBackToSonarSourcesThenBaseDir() throws IOException { + // src is a file, not a dir — conventional folder check fails + Files.createFile(tempDir.resolve("src")); File baseDir = tempDir.toFile(); - Files.createDirectory(tempDir.resolve("src")); - Files.createDirectory(tempDir.resolve("lib")); - List result = PackageRootResolver.resolve(List.of(), config, baseDir); + PackageResolutionResult result = PackageRootResolver.resolve(mockFileSystem(baseDir), noSonarSources()); - assertThat(result).containsExactly( - new File(baseDir, "src").getAbsolutePath(), - new File(baseDir, "lib").getAbsolutePath()); + assertThat(result.roots()).containsExactly(baseDir.getAbsolutePath()); + assertThat(result.method()).isEqualTo(PackageResolutionResult.ResolutionMethod.BASE_DIR); } @Test - void resolve_emptyExtractedRootsNoSonarSourcesNoSrcFolder_fallsBackToBaseDirAbsolutePath() { - Configuration config = mock(Configuration.class); - when(config.getStringArray("sonar.sources")).thenReturn(new String[0]); - + void resolve_buildFileExistsNoRoots_conventionalFoldersTakePriorityOverSonarSources() throws IOException { + // pyproject.toml exists but provides no source roots; src/ exists; sonar.sources set + // => conventional folders should win (build file present path) + Files.createDirectory(tempDir.resolve("src")); + Files.writeString(tempDir.resolve("pyproject.toml"), "[project]\nname = \"myproject\"\n"); File baseDir = tempDir.toFile(); - List result = PackageRootResolver.resolve(List.of(), config, baseDir); - assertThat(result).containsExactly(baseDir.getAbsolutePath()); + PackageResolutionResult result = PackageRootResolver.resolve(mockFileSystem(baseDir), sonarSources("app")); + + assertThat(result.roots()).containsExactly(new File(baseDir, "src").getAbsolutePath()); + assertThat(result.method()).isEqualTo(PackageResolutionResult.ResolutionMethod.CONVENTIONAL_FOLDERS); } @Test - void resolve_srcExistsAsFile_fallsBackToBaseDirAbsolutePath() throws IOException { - Configuration config = mock(Configuration.class); - when(config.getStringArray("sonar.sources")).thenReturn(new String[0]); + void resolve_buildFileExistsNoRoots_fallsBackToSonarSources() throws IOException { + // pyproject.toml exists but provides no source roots; no conventional folders; sonar.sources set + Files.writeString(tempDir.resolve("pyproject.toml"), "[project]\nname = \"myproject\"\n"); + File baseDir = tempDir.toFile(); - Files.createFile(tempDir.resolve("src")); + PackageResolutionResult result = PackageRootResolver.resolve(mockFileSystem(baseDir), sonarSources("mysrc")); + assertThat(result.roots()).containsExactly(new File(baseDir, "mysrc").getAbsolutePath()); + assertThat(result.method()).isEqualTo(PackageResolutionResult.ResolutionMethod.SONAR_SOURCES); + } + + @Test + void resolve_setupPyExistsNoRoots_conventionalFoldersTakePriorityOverSonarSources() throws IOException { + // setup.py exists but provides no source roots; src/ exists; sonar.sources set + Files.createDirectory(tempDir.resolve("src")); + Files.writeString(tempDir.resolve("setup.py"), "# empty\n"); File baseDir = tempDir.toFile(); - List result = PackageRootResolver.resolve(List.of(), config, baseDir); - assertThat(result).containsExactly(baseDir.getAbsolutePath()); + PackageResolutionResult result = PackageRootResolver.resolve(mockFileSystem(baseDir), sonarSources("app")); + + assertThat(result.roots()).containsExactly(new File(baseDir, "src").getAbsolutePath()); + assertThat(result.method()).isEqualTo(PackageResolutionResult.ResolutionMethod.CONVENTIONAL_FOLDERS); } - // Tests for resolveFallback method directly + // ─── toAbsolutePaths() — normalization ──────────────────────────────────── @Test - void resolveFallback_withSonarSources_returnsAbsolutePaths() { - Configuration config = mock(Configuration.class); - when(config.getStringArray("sonar.sources")).thenReturn(new String[]{"app", "core"}); - + void toAbsolutePaths_normalPaths_resolvedCorrectly() { File baseDir = tempDir.toFile(); - List result = PackageRootResolver.resolveFallback(config, baseDir); + List result = PackageRootResolver.toAbsolutePaths(List.of("app", "core"), baseDir); assertThat(result).containsExactly( new File(baseDir, "app").getAbsolutePath(), @@ -163,70 +206,114 @@ void resolveFallback_withSonarSources_returnsAbsolutePaths() { } @Test - void resolveFallback_noSonarSourcesButSrcExists_returnsAbsolutePath() throws IOException { - Configuration config = mock(Configuration.class); - when(config.getStringArray("sonar.sources")).thenReturn(new String[0]); - + void toAbsolutePaths_dotPath_normalizedToBaseDir() { File baseDir = tempDir.toFile(); - Files.createDirectory(tempDir.resolve("src")); - - List result = PackageRootResolver.resolveFallback(config, baseDir); + List result = PackageRootResolver.toAbsolutePaths(List.of("."), baseDir); - assertThat(result).containsExactly(new File(baseDir, "src").getAbsolutePath()); + // "." must normalize to baseDir, not "/baseDir/." + assertThat(result).containsExactly(baseDir.getAbsolutePath()); + assertThat(result.get(0)).doesNotEndWith("/."); + assertThat(result.get(0)).doesNotEndWith("\\."); } - @Test - void resolveFallback_noSonarSourcesButLibExists_returnsAbsolutePath() throws IOException { - Configuration config = mock(Configuration.class); - when(config.getStringArray("sonar.sources")).thenReturn(new String[0]); + // ─── adjustPackageRoot() — migrated from PythonIndexerTest ──────────────── - File baseDir = tempDir.toFile(); - Files.createDirectory(tempDir.resolve("lib")); - - List result = PackageRootResolver.resolveFallback(config, baseDir); + @Test + void adjustPackageRoot_noInitPy(@TempDir Path localTempDir) { + File baseDir = localTempDir.toFile(); + File srcDir = new File(baseDir, "src"); + srcDir.mkdir(); - assertThat(result).containsExactly(new File(baseDir, "lib").getAbsolutePath()); + String result = PackageRootResolver.adjustPackageRoot(srcDir, baseDir); + assertThat(result).isEqualTo(srcDir.getAbsolutePath()); } @Test - void resolveFallback_noSonarSourcesBothSrcAndLibExist_returnsAbsolutePaths() throws IOException { - Configuration config = mock(Configuration.class); - when(config.getStringArray("sonar.sources")).thenReturn(new String[0]); - - File baseDir = tempDir.toFile(); - Files.createDirectory(tempDir.resolve("src")); - Files.createDirectory(tempDir.resolve("lib")); - - List result = PackageRootResolver.resolveFallback(config, baseDir); + void adjustPackageRoot_withInitPy_walksUp(@TempDir Path localTempDir) throws Exception { + File baseDir = localTempDir.toFile(); + File srcDir = new File(baseDir, "src"); + File packageDir = new File(srcDir, "mypackage"); + packageDir.mkdirs(); + new File(packageDir, "__init__.py").createNewFile(); + + String result = PackageRootResolver.adjustPackageRoot(packageDir, baseDir); + assertThat(result).isEqualTo(srcDir.getAbsolutePath()); + } - assertThat(result).containsExactly( - new File(baseDir, "src").getAbsolutePath(), - new File(baseDir, "lib").getAbsolutePath()); + @Test + void adjustPackageRoot_nestedPackagesWithInitPy(@TempDir Path localTempDir) throws Exception { + File baseDir = localTempDir.toFile(); + File srcDir = new File(baseDir, "src"); + File level1 = new File(srcDir, "level1"); + File level2 = new File(level1, "level2"); + File level3 = new File(level2, "level3"); + level3.mkdirs(); + + new File(level1, "__init__.py").createNewFile(); + new File(level2, "__init__.py").createNewFile(); + new File(level3, "__init__.py").createNewFile(); + + String result = PackageRootResolver.adjustPackageRoot(level3, baseDir); + assertThat(result).isEqualTo(srcDir.getAbsolutePath()); } @Test - void resolveFallback_noSonarSourcesNoSrcNoLib_returnsBaseDirAbsolutePath() { - Configuration config = mock(Configuration.class); - when(config.getStringArray("sonar.sources")).thenReturn(new String[0]); + void adjustPackageRoot_stopsAtBaseDir(@TempDir Path localTempDir) throws Exception { + File baseDir = localTempDir.toFile(); + File level1 = new File(baseDir, "level1"); + File level2 = new File(level1, "level2"); + level2.mkdirs(); + new File(baseDir, "__init__.py").createNewFile(); + new File(level1, "__init__.py").createNewFile(); + new File(level2, "__init__.py").createNewFile(); + + String result = PackageRootResolver.adjustPackageRoot(level2, baseDir); + assertThat(result).isEqualTo(baseDir.getAbsolutePath()); + } - File baseDir = tempDir.toFile(); - List result = PackageRootResolver.resolveFallback(config, baseDir); + @Test + void adjustPackageRoot_rootEqualsBaseDir(@TempDir Path localTempDir) throws Exception { + File baseDir = localTempDir.toFile(); + new File(baseDir, "__init__.py").createNewFile(); - assertThat(result).containsExactly(baseDir.getAbsolutePath()); + String result = PackageRootResolver.adjustPackageRoot(baseDir, baseDir); + assertThat(result).isEqualTo(baseDir.getAbsolutePath()); } @Test - void resolveFallback_srcAndLibExistAsFiles_returnsBaseDirAbsolutePath() throws IOException { - Configuration config = mock(Configuration.class); - when(config.getStringArray("sonar.sources")).thenReturn(new String[0]); + void adjustPackageRoot_partialInitPyChain(@TempDir Path localTempDir) throws Exception { + File baseDir = localTempDir.toFile(); + File srcDir = new File(baseDir, "src"); + File withInit = new File(srcDir, "withInit"); + File withoutInit = new File(withInit, "withoutInit"); + File deepPackage = new File(withoutInit, "deepPackage"); + deepPackage.mkdirs(); + + new File(withInit, "__init__.py").createNewFile(); + new File(deepPackage, "__init__.py").createNewFile(); + + String result = PackageRootResolver.adjustPackageRoot(deepPackage, baseDir); + assertThat(result).isEqualTo(withoutInit.getAbsolutePath()); + } - Files.createFile(tempDir.resolve("src")); - Files.createFile(tempDir.resolve("lib")); + @Test + void adjustPackageRoot_emptyDirectory(@TempDir Path localTempDir) { + File baseDir = localTempDir.toFile(); + File emptyDir = new File(baseDir, "empty"); + emptyDir.mkdir(); - File baseDir = tempDir.toFile(); - List result = PackageRootResolver.resolveFallback(config, baseDir); + String result = PackageRootResolver.adjustPackageRoot(emptyDir, baseDir); + assertThat(result).isEqualTo(emptyDir.getAbsolutePath()); + } - assertThat(result).containsExactly(baseDir.getAbsolutePath()); + @Test + void adjustPackageRoot_singleLevelWithInitPy(@TempDir Path localTempDir) throws Exception { + File baseDir = localTempDir.toFile(); + File packageDir = new File(baseDir, "mypackage"); + packageDir.mkdir(); + new File(packageDir, "__init__.py").createNewFile(); + + String result = PackageRootResolver.adjustPackageRoot(packageDir, baseDir); + assertThat(result).isEqualTo(baseDir.getAbsolutePath()); } } - diff --git a/python-commons/src/test/java/org/sonar/plugins/python/indexer/PythonIndexerTest.java b/python-commons/src/test/java/org/sonar/plugins/python/indexer/PythonIndexerTest.java index 8a0f260da..ccf86f531 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/indexer/PythonIndexerTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/indexer/PythonIndexerTest.java @@ -16,10 +16,7 @@ */ package org.sonar.plugins.python.indexer; -import java.io.File; -import java.nio.file.Path; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.TempDir; import org.sonar.api.batch.sensor.SensorContext; import org.sonar.plugins.python.api.caching.CacheContext; import org.sonar.python.caching.CacheContextImpl; @@ -38,105 +35,6 @@ void test_projectLevelTypeTableIsCached() { assertThat(typeTable).isInstanceOf(CachedTypeTable.class); } - @Test - void test_adjustPackageRoot_noInitPy(@TempDir Path tempDir) { - File baseDir = tempDir.toFile(); - File srcDir = new File(baseDir, "src"); - srcDir.mkdir(); - - String result = PythonIndexer.adjustPackageRoot(srcDir, baseDir); - assertThat(result).isEqualTo(srcDir.getAbsolutePath()); - } - - @Test - void test_adjustPackageRoot_withInitPy_walksUp(@TempDir Path tempDir) throws Exception { - File baseDir = tempDir.toFile(); - File srcDir = new File(baseDir, "src"); - File packageDir = new File(srcDir, "mypackage"); - packageDir.mkdirs(); - new File(packageDir, "__init__.py").createNewFile(); - - String result = PythonIndexer.adjustPackageRoot(packageDir, baseDir); - assertThat(result).isEqualTo(srcDir.getAbsolutePath()); - } - - @Test - void test_adjustPackageRoot_nestedPackagesWithInitPy(@TempDir Path tempDir) throws Exception { - File baseDir = tempDir.toFile(); - File srcDir = new File(baseDir, "src"); - File level1 = new File(srcDir, "level1"); - File level2 = new File(level1, "level2"); - File level3 = new File(level2, "level3"); - level3.mkdirs(); - - new File(level1, "__init__.py").createNewFile(); - new File(level2, "__init__.py").createNewFile(); - new File(level3, "__init__.py").createNewFile(); - - String result = PythonIndexer.adjustPackageRoot(level3, baseDir); - assertThat(result).isEqualTo(srcDir.getAbsolutePath()); - } - - @Test - void test_adjustPackageRoot_stopsAtBaseDir(@TempDir Path tempDir) throws Exception { - File baseDir = tempDir.toFile(); - File level1 = new File(baseDir, "level1"); - File level2 = new File(level1, "level2"); - level2.mkdirs(); - new File(baseDir, "__init__.py").createNewFile(); - new File(level1, "__init__.py").createNewFile(); - new File(level2, "__init__.py").createNewFile(); - - String result = PythonIndexer.adjustPackageRoot(level2, baseDir); - assertThat(result).isEqualTo(baseDir.getAbsolutePath()); - } - - @Test - void test_adjustPackageRoot_rootEqualsBaseDir(@TempDir Path tempDir) throws Exception { - File baseDir = tempDir.toFile(); - new File(baseDir, "__init__.py").createNewFile(); - - String result = PythonIndexer.adjustPackageRoot(baseDir, baseDir); - assertThat(result).isEqualTo(baseDir.getAbsolutePath()); - } - - @Test - void test_adjustPackageRoot_partialInitPyChain(@TempDir Path tempDir) throws Exception { - File baseDir = tempDir.toFile(); - File srcDir = new File(baseDir, "src"); - File withInit = new File(srcDir, "withInit"); - File withoutInit = new File(withInit, "withoutInit"); - File deepPackage = new File(withoutInit, "deepPackage"); - deepPackage.mkdirs(); - - new File(withInit, "__init__.py").createNewFile(); - new File(deepPackage, "__init__.py").createNewFile(); - - String result = PythonIndexer.adjustPackageRoot(deepPackage, baseDir); - assertThat(result).isEqualTo(withoutInit.getAbsolutePath()); - } - - @Test - void test_adjustPackageRoot_emptyDirectory(@TempDir Path tempDir) { - File baseDir = tempDir.toFile(); - File emptyDir = new File(baseDir, "empty"); - emptyDir.mkdir(); - - String result = PythonIndexer.adjustPackageRoot(emptyDir, baseDir); - assertThat(result).isEqualTo(emptyDir.getAbsolutePath()); - } - - @Test - void test_adjustPackageRoot_singleLevelWithInitPy(@TempDir Path tempDir) throws Exception { - File baseDir = tempDir.toFile(); - File packageDir = new File(baseDir, "mypackage"); - packageDir.mkdir(); - new File(packageDir, "__init__.py").createNewFile(); - - String result = PythonIndexer.adjustPackageRoot(packageDir, baseDir); - assertThat(result).isEqualTo(baseDir.getAbsolutePath()); - } - private static class TestPythonIndexer extends PythonIndexer { protected TestPythonIndexer(ProjectConfigurationBuilder projectConfigurationBuilder) { diff --git a/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexerTest.java b/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexerTest.java index 43f061282..5b464378d 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexerTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexerTest.java @@ -596,6 +596,35 @@ void test_package_roots_fallback_to_base_dir() throws IOException { assertThat(packageName).isEqualTo("mypackage"); } + @Test + void test_package_roots_from_sonar_sources_dot() throws IOException { + // sonar.sources=. means "scan from the project root" — must resolve to baseDir, not "/baseDir/." + Path tempDir = Files.createTempDirectory("sonar_sources_dot_test").toRealPath(); + Path pkgDir = Files.createDirectories(tempDir.resolve("mypackage")); + Files.writeString(pkgDir.resolve("module.py"), "x = 1"); + + SensorContextTester tempContext = SensorContextTester.create(tempDir.toFile()); + tempContext.fileSystem().setWorkDir(Files.createTempDirectory("workDir")); + tempContext.settings().setProperty("sonar.python.skipUnchanged", false); + tempContext.settings().setProperty("sonar.sources", "."); + + PythonInputFile moduleFile = createInputFile(tempDir.toFile(), + "mypackage/module.py", + InputFile.Status.ADDED, InputFile.Type.MAIN); + List inputFiles = List.of(moduleFile); + + CacheContextImpl noCacheContext = new CacheContextImpl(false, new PythonWriteCacheImpl(new TestWriteCache()), new PythonReadCacheImpl(new TestReadCache())); + SonarQubePythonIndexer indexer = new SonarQubePythonIndexer(inputFiles, noCacheContext, tempContext, new ProjectConfigurationBuilder()); + + // Package root must be the base dir, not the un-normalized "/baseDir/." + String expectedRoot = tempDir.toFile().getAbsolutePath(); + assertThat(indexer.packageRoots()).containsExactly(expectedRoot); + + // FQN should be computed correctly using the base dir as root + String packageName = indexer.packageName(moduleFile); + assertThat(packageName).isEqualTo("mypackage"); + } + @Test void test_package_roots_from_sonar_sources() throws IOException { // Create a temp directory with custom sources folder From ea0af4f014ef06e05e0c0c629e5c338c389dc87c Mon Sep 17 00:00:00 2001 From: "sonar-nigel[bot]" <247337653+sonar-nigel[bot]@users.noreply.github.com> Date: Fri, 24 Apr 2026 15:20:23 +0200 Subject: [PATCH 098/322] SONARPY-4111 Fix S3457 false positive for injected Marimo mo.sql calls (#1073) Co-authored-by: Vibe Bot GitOrigin-RevId: 7bdde59ec9c6b50dfd3d7e32d6e61c1cabd0c302 --- .../checks/StringFormatCorrectnessCheck.java | 41 ++++++++++++- .../StringFormatCorrectnessCheckTest.java | 44 ++++++++++++++ .../checks/stringFormatCorrectness.py | 59 +++++++++++++++++++ 3 files changed, 141 insertions(+), 3 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/StringFormatCorrectnessCheck.java b/python-checks/src/main/java/org/sonar/python/checks/StringFormatCorrectnessCheck.java index ac24c85b3..905f62b0e 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/StringFormatCorrectnessCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/StringFormatCorrectnessCheck.java @@ -20,6 +20,7 @@ import java.util.HashSet; import java.util.List; import java.util.Locale; +import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.stream.IntStream; @@ -34,8 +35,10 @@ import org.sonar.plugins.python.api.tree.DictionaryLiteral; import org.sonar.plugins.python.api.tree.DictionaryLiteralElement; import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.FunctionDef; import org.sonar.plugins.python.api.tree.KeyValuePair; import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.Parameter; import org.sonar.plugins.python.api.tree.QualifiedExpression; import org.sonar.plugins.python.api.tree.RegularArgument; import org.sonar.plugins.python.api.tree.StringElement; @@ -43,6 +46,8 @@ import org.sonar.plugins.python.api.tree.Token; import org.sonar.plugins.python.api.tree.Tree; import org.sonar.python.checks.utils.Expressions; +import org.sonar.python.checks.utils.MarimoUtils; +import org.sonar.python.tree.TreeUtils; @Rule(key = "S3457") public class StringFormatCorrectnessCheck extends AbstractStringFormatCheck { @@ -126,19 +131,49 @@ private static void checkFStringLiteral(SubscriptionContext ctx) { } private static boolean isMarimoSqlArgument(StringLiteral literal, SubscriptionContext ctx) { + return enclosingCallExpression(literal) + .filter(callExpression -> MARIMO_SQL_MATCHER.isTrueFor(callExpression.callee(), ctx) + || isInjectedMarimoSqlCall(callExpression, literal, ctx)) + .isPresent(); + } + + private static Optional enclosingCallExpression(StringLiteral literal) { Tree parent = literal.parent(); if (!(parent instanceof RegularArgument)) { - return false; + return Optional.empty(); } Tree argList = parent.parent(); if (!(argList instanceof ArgList)) { - return false; + return Optional.empty(); } Tree callParent = argList.parent(); if (!(callParent instanceof CallExpression callExpression)) { + return Optional.empty(); + } + return Optional.of(callExpression); + } + + private static boolean isInjectedMarimoSqlCall(CallExpression callExpression, StringLiteral literal, SubscriptionContext ctx) { + if (!isMoSqlCall(callExpression) || !MarimoUtils.isTreeInMarimoCell(literal, ctx)) { + return false; + } + return Optional.ofNullable(TreeUtils.firstAncestorOfClass(literal, FunctionDef.class)) + .map(FunctionDef::parameters) + .stream() + .flatMap(parameters -> parameters.nonTuple().stream()) + .map(Parameter::name) + .filter(Objects::nonNull) + .anyMatch(name -> "mo".equals(name.name())); + } + + private static boolean isMoSqlCall(CallExpression callExpression) { + if (!(callExpression.callee() instanceof QualifiedExpression qualifiedExpression)) { + return false; + } + if (!"sql".equals(qualifiedExpression.name().name())) { return false; } - return MARIMO_SQL_MATCHER.isTrueFor(callExpression.callee(), ctx); + return qualifiedExpression.qualifier() instanceof Name qualifier && "mo".equals(qualifier.name()); } private static void checkLoggerLog(SubscriptionContext ctx, CallExpression callExpression) { diff --git a/python-checks/src/test/java/org/sonar/python/checks/StringFormatCorrectnessCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/StringFormatCorrectnessCheckTest.java index 4703d935e..2c139129d 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/StringFormatCorrectnessCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/StringFormatCorrectnessCheckTest.java @@ -16,13 +16,57 @@ */ package org.sonar.python.checks; +import java.lang.reflect.Method; +import java.util.Optional; import org.junit.jupiter.api.Test; +import org.sonar.plugins.python.api.tree.ArgList; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.StringLiteral; +import org.sonar.plugins.python.api.tree.Tree; import org.sonar.python.checks.utils.PythonCheckVerifier; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + class StringFormatCorrectnessCheckTest { @Test void test() { PythonCheckVerifier.verify("src/test/resources/checks/stringFormatCorrectness.py", new StringFormatCorrectnessCheck()); } + + @Test + void enclosing_call_expression_returns_empty_when_regular_argument_parent_is_not_arg_list() throws Exception { + StringLiteral literal = mock(StringLiteral.class); + RegularArgument argument = mock(RegularArgument.class); + Tree nonArgListParent = mock(Tree.class); + + when(literal.parent()).thenReturn(argument); + when(argument.parent()).thenReturn(nonArgListParent); + + assertThat(invokeEnclosingCallExpression(literal)).isEmpty(); + } + + @Test + void enclosing_call_expression_returns_empty_when_arg_list_parent_is_not_call_expression() throws Exception { + StringLiteral literal = mock(StringLiteral.class); + RegularArgument argument = mock(RegularArgument.class); + ArgList argList = mock(ArgList.class); + Tree nonCallParent = mock(Tree.class); + + when(literal.parent()).thenReturn(argument); + when(argument.parent()).thenReturn(argList); + when(argList.parent()).thenReturn(nonCallParent); + + assertThat(invokeEnclosingCallExpression(literal)).isEmpty(); + } + + @SuppressWarnings("unchecked") + private static Optional invokeEnclosingCallExpression(StringLiteral literal) throws Exception { + Method method = StringFormatCorrectnessCheck.class.getDeclaredMethod("enclosingCallExpression", StringLiteral.class); + method.setAccessible(true); + return (Optional) method.invoke(null, literal); + } } diff --git a/python-checks/src/test/resources/checks/stringFormatCorrectness.py b/python-checks/src/test/resources/checks/stringFormatCorrectness.py index 0592c8686..c8d2bc9ce 100644 --- a/python-checks/src/test/resources/checks/stringFormatCorrectness.py +++ b/python-checks/src/test/resources/checks/stringFormatCorrectness.py @@ -142,3 +142,62 @@ def marimo_sql(): engine=engine ) + +import marimo + +app = marimo.App() + + +@app.cell +def _(): + import marimo as mo + + engine = None + return engine, mo + + +# Previously flagged FP: marimo injects `mo` into a later cell parameter. +@app.cell +def _(engine, mo): + mo.sql( + f""" + SELECT id + FROM users + """, + engine=engine + ) + + +@app.cell +def _(engine, mo): + mo.query( + f"SELECT id FROM users" # Noncompliant {{Add replacement fields or use a normal string instead of an f-string.}} + ) + + +@app.cell +def _(engine, session): + session.sql( + f"SELECT id FROM users" # Noncompliant {{Add replacement fields or use a normal string instead of an f-string.}} + ) + + +def not_marimo_cell(engine, mo): + mo.sql( + f"SELECT id FROM users" # Noncompliant {{Add replacement fields or use a normal string instead of an f-string.}} + ) + + +@app.cell +def _(engine, mo): + alias = mo + alias.sql( + f"SELECT id FROM users" # Noncompliant {{Add replacement fields or use a normal string instead of an f-string.}} + ) + + +@app.cell +def _(engine, mo): + sql( + f"SELECT id FROM users" # Noncompliant {{Add replacement fields or use a normal string instead of an f-string.}} + ) From 600fe6bf9c8fd87b761d3a59e297f05fb33b2533 Mon Sep 17 00:00:00 2001 From: Thomas Serre <118730793+thomas-serre-sonarsource@users.noreply.github.com> Date: Fri, 24 Apr 2026 15:53:12 +0200 Subject: [PATCH 099/322] SONARPY-4112 Fix QG by removing unused import (#1074) GitOrigin-RevId: 72bcf89f9996f9c5021b7c663a4f6b6ed39e4eda --- .../java/org/sonar/plugins/python/indexer/PythonIndexer.java | 1 - 1 file changed, 1 deletion(-) diff --git a/python-commons/src/main/java/org/sonar/plugins/python/indexer/PythonIndexer.java b/python-commons/src/main/java/org/sonar/plugins/python/indexer/PythonIndexer.java index 2935b9bea..ee7f387b5 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/indexer/PythonIndexer.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/indexer/PythonIndexer.java @@ -17,7 +17,6 @@ package org.sonar.plugins.python.indexer; import com.sonar.sslr.api.AstNode; -import java.io.File; import java.io.IOException; import java.net.URI; import java.util.List; From 5f20d98f8d14b32a1beef714577f17aeb9080f81 Mon Sep 17 00:00:00 2001 From: Guillaume Dequenne Date: Fri, 24 Apr 2026 18:03:00 +0200 Subject: [PATCH 100/322] =?UTF-8?q?SONARPY-4110=20Rule=20S8492:=20"set.dis?= =?UTF-8?q?card()"=20should=20be=20used=20instead=20of=20checking=20member?= =?UTF-8?q?=E2=80=A6=20(#1072)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GitOrigin-RevId: 1a980aea27cec87786435de44534bfa1a6bad843 --- .../python/checks/OpenSourceCheckList.java | 1 + .../checks/SetDiscardOverRemoveCheck.java | 102 ++++++++++ .../org/sonar/l10n/py/rules/python/S8492.html | 48 +++++ .../org/sonar/l10n/py/rules/python/S8492.json | 25 +++ .../py/rules/python/Sonar_way_profile.json | 1 + .../checks/SetDiscardOverRemoveCheckTest.java | 38 ++++ .../resources/checks/setDiscardOverRemove.py | 191 ++++++++++++++++++ 7 files changed, 406 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/SetDiscardOverRemoveCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8492.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8492.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/SetDiscardOverRemoveCheckTest.java create mode 100644 python-checks/src/test/resources/checks/setDiscardOverRemove.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index e47195300..9d937b10a 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -402,6 +402,7 @@ public Stream> getChecks() { SecureCookieCheck.class, SecureModeEncryptionAlgorithmsCheck.class, SelfAssignmentCheck.class, + SetDiscardOverRemoveCheck.class, SetDuplicateKeyCheck.class, SetUpdateOverForLoopCheck.class, SideEffectInTfFunctionCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/SetDiscardOverRemoveCheck.java b/python-checks/src/main/java/org/sonar/python/checks/SetDiscardOverRemoveCheck.java new file mode 100644 index 000000000..81bd579ae --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/SetDiscardOverRemoveCheck.java @@ -0,0 +1,102 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import java.util.List; +import java.util.Optional; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.quickfix.PythonQuickFix; +import org.sonar.plugins.python.api.tree.Argument; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.ExpressionStatement; +import org.sonar.plugins.python.api.tree.IfStatement; +import org.sonar.plugins.python.api.tree.InExpression; +import org.sonar.plugins.python.api.tree.QualifiedExpression; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.Statement; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.checks.utils.CheckUtils; +import org.sonar.python.quickfix.TextEditUtils; +import org.sonar.python.tree.TreeUtils; + +@Rule(key = "S8492") +public class SetDiscardOverRemoveCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Use \"discard()\" instead of checking membership before calling \"remove()\"."; + private static final String QUICK_FIX_MESSAGE = "Replace with \"discard()\""; + private static final String REMOVE_METHOD_NAME = "remove"; + private static final TypeMatcher SET_TYPE_MATCHER = TypeMatchers.isObjectInstanceOf("builtins.set"); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.IF_STMT, SetDiscardOverRemoveCheck::checkIfStatement); + } + + private static void checkIfStatement(SubscriptionContext ctx) { + IfStatement ifStatement = (IfStatement) ctx.syntaxNode(); + if (ifStatement.isElif() + || ifStatement.elseBranch() != null + || !ifStatement.elifBranches().isEmpty()) { + return; + } + if (!(ifStatement.condition() instanceof InExpression inExpression) || inExpression.notToken() != null) { + return; + } + List statements = ifStatement.body().statements(); + if (statements.size() != 1 || !(statements.get(0) instanceof ExpressionStatement expressionStatement)) { + return; + } + if (expressionStatement.expressions().size() != 1 + || !(expressionStatement.expressions().get(0) instanceof CallExpression callExpression)) { + return; + } + if (!(callExpression.callee() instanceof QualifiedExpression qualifiedExpression) + || !REMOVE_METHOD_NAME.equals(qualifiedExpression.name().name())) { + return; + } + List arguments = callExpression.arguments(); + if (arguments.size() != 1 || !(arguments.get(0) instanceof RegularArgument regularArgument) + || regularArgument.keywordArgument() != null) { + return; + } + if (!CheckUtils.areEquivalent(qualifiedExpression.qualifier(), inExpression.rightOperand()) + || !CheckUtils.areEquivalent(regularArgument.expression(), inExpression.leftOperand())) { + return; + } + if (!SET_TYPE_MATCHER.isTrueFor(qualifiedExpression.qualifier(), ctx)) { + return; + } + var issue = ctx.addIssue(inExpression, MESSAGE); + createQuickFix(ifStatement, qualifiedExpression, regularArgument).ifPresent(issue::addQuickFix); + } + + private static Optional createQuickFix(IfStatement ifStatement, QualifiedExpression qualifiedExpression, RegularArgument argument) { + String qualifierText = TreeUtils.treeToString(qualifiedExpression.qualifier(), false); + String argumentText = TreeUtils.treeToString(argument.expression(), false); + if (qualifierText == null || argumentText == null) { + return Optional.empty(); + } + String replacement = "%s.discard(%s)".formatted(qualifierText, argumentText); + return Optional.of(PythonQuickFix.newQuickFix(QUICK_FIX_MESSAGE) + .addTextEdit(TextEditUtils.replace(ifStatement, replacement)) + .build()); + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8492.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8492.html new file mode 100644 index 000000000..d87c255df --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8492.html @@ -0,0 +1,48 @@ +

      This rule raises an issue when code checks if an element exists in a set using the in operator before calling remove() on +that element.

      +

      Why is this an issue?

      +

      Checking whether an element exists in a set before removing it is unnecessary:

      +
      +if x in my_set:
      +    my_set.remove(x)
      +
      +

      This pattern has two problems:

      +
        +
      1. double lookup: the code performs two hash table lookups - one for the membership check (in) and another for the + removal (remove()). Each lookup has a cost.
      2. +
      3. less idiomatic: Python provides the discard() method specifically for this use case. Using it makes the code more + Pythonic and signals intent more clearly.
      4. +
      +

      The discard() method combines both operations into a single call. It removes the element if it exists and does nothing otherwise:

      +
      +my_set.discard(x)  # Single lookup, no exception if x is not present
      +
      +

      What is the potential impact?

      +

      Using discard() improves readability and removes a redundant hash table lookup. In loops or performance-critical code, eliminating +these extra lookups can provide measurable improvements.

      +

      How to fix it

      +

      Replace the conditional check and remove() call with a single discard() call. The discard() method safely +removes the element if it exists and does nothing if it does not, without raising an exception.

      +

      Code examples

      +

      Noncompliant code example

      +
      +my_set = {1, 2, 3, 4, 5}
      +value = 3
      +
      +if value in my_set:  # Noncompliant
      +    my_set.remove(value)
      +
      +

      Compliant solution

      +
      +my_set = {1, 2, 3, 4, 5}
      +value = 3
      +
      +my_set.discard(value)
      +
      +

      Resources

      +

      Documentation

      + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8492.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8492.json new file mode 100644 index 000000000..1dc60286f --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8492.json @@ -0,0 +1,25 @@ +{ + "title": "\"set.discard()\" should be used instead of checking membership before removal", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "2 min" + }, + "tags": [ + "performance", + "pythonic", + "idiom" + ], + "defaultSeverity": "Minor", + "ruleSpecification": "RSPEC-8492", + "sqKey": "S8492", + "scope": "All", + "quickfix": "targeted", + "code": { + "impacts": { + "MAINTAINABILITY": "LOW" + }, + "attribute": "CLEAR" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index dbdae5ce3..1cd13527a 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -329,6 +329,7 @@ "S8414", "S8415", "S8490", + "S8492", "S8493", "S8494", "S8495", diff --git a/python-checks/src/test/java/org/sonar/python/checks/SetDiscardOverRemoveCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/SetDiscardOverRemoveCheckTest.java new file mode 100644 index 000000000..6c7dd87b3 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/SetDiscardOverRemoveCheckTest.java @@ -0,0 +1,38 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.junit.jupiter.api.Test; +import org.sonar.python.checks.quickfix.PythonQuickFixVerifier; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class SetDiscardOverRemoveCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/setDiscardOverRemove.py", new SetDiscardOverRemoveCheck()); + } + + @Test + void quickFixTest() { + String before = "my_set = {1, 2, 3}\nif x in my_set:\n my_set.remove(x)\n"; + String after = "my_set = {1, 2, 3}\nmy_set.discard(x)"; + var check = new SetDiscardOverRemoveCheck(); + PythonQuickFixVerifier.verify(check, before, after); + PythonQuickFixVerifier.verifyQuickFixMessages(check, before, "Replace with \"discard()\""); + } +} diff --git a/python-checks/src/test/resources/checks/setDiscardOverRemove.py b/python-checks/src/test/resources/checks/setDiscardOverRemove.py new file mode 100644 index 000000000..2bcfa6544 --- /dev/null +++ b/python-checks/src/test/resources/checks/setDiscardOverRemove.py @@ -0,0 +1,191 @@ +def basic_set_literal(x): + my_set = {1, 2, 3} + if x in my_set: # Noncompliant {{Use "discard()" instead of checking membership before calling "remove()".}} + # ^^^^^^^^^^^ + my_set.remove(x) + + +def basic_set_constructor(x): + my_set = set([1, 2, 3]) + if x in my_set: # Noncompliant + my_set.remove(x) + + +def multiple_operations_in_body(x): + my_set = {1, 2, 3} + if x in my_set: + my_set.remove(x) + print("removed") # additional logic + + +def else_branch_present(x): + my_set = {1, 2, 3} + if x in my_set: + my_set.remove(x) + else: + print("not found") + + +def elif_branch_present(x, y): + my_set = {1, 2, 3} + if x in my_set: + my_set.remove(x) + elif y in my_set: + my_set.remove(y) + + +def not_in_condition(x): + my_set = {1, 2, 3} + if x not in my_set: + my_set.remove(x) + + +def different_objects(x): + set_a = {1, 2, 3} + set_b = {4, 5, 6} + if x in set_a: + set_b.remove(x) + + +def different_elements(x, y): + my_set = {1, 2, 3} + if x in my_set: + my_set.remove(y) + + +def list_not_set(x): + my_list = [1, 2, 3] + if x in my_list: + my_list.remove(x) + + +def dict_not_set(x): + my_dict = {"a": 1} + if x in my_dict: + my_dict.pop(x) + + +def frozenset_type(x): + my_fset = frozenset([1, 2, 3]) + if x in my_fset: # frozenset has no remove() + ... + + +def not_a_remove_call(x): + my_set = {1, 2, 3} + if x in my_set: + my_set.add(x + 1) + + +def complex_condition(x, flag): + my_set = {1, 2, 3} + if x in my_set and flag: + my_set.remove(x) + + +def set_from_parameter(my_set: set, x): + if x in my_set: # Noncompliant + my_set.remove(x) + + +def set_subclass(x): + class MySet(set): + pass + s = MySet() + if x in s: # Noncompliant + s.remove(x) + + +def method_call_on_self(x): + class Container: + def __init__(self): + self.items = {1, 2, 3} + + def remove_item(self, value): + if value in self.items: # FN: type of self.items attribute is not inferred + self.items.remove(value) + + +def nested_attribute_access(x): + class Container: + pass + c = Container() + c.items = {1, 2, 3} + if x in c.items: # FN: type of c.items attribute is not inferred + c.items.remove(x) + + +def remove_with_wrong_number_of_args(x, y): + my_set = {1, 2, 3} + if x in my_set: + my_set.remove(x, y) # FN: invalid set.remove call, but not our rule's concern + + +def complex_element_expression(items, i): + my_set = {1, 2, 3} + if items[i] in my_set: # Noncompliant + my_set.remove(items[i]) + + +def body_is_not_expression_statement(x): + my_set = {1, 2, 3} + if x in my_set: + return + + +def body_is_pass_statement(x): + my_set = {1, 2, 3} + if x in my_set: + pass + + +def body_is_assignment(x): + my_set = {1, 2, 3} + if x in my_set: + y = my_set.remove(x) + + +def body_has_multiple_expressions(x): + my_set = {1, 2, 3} + def foo(): ... + if x in my_set: + my_set.remove(x), foo() + + +def bare_remove_call(x): + def remove(value): ... + my_set = {1, 2, 3} + if x in my_set: + remove(x) + + +def remove_with_unpacking_argument(x): + my_set = {1, 2, 3} + args = (x,) + if x in my_set: + my_set.remove(*args) + + +def remove_with_keyword_argument(x): + my_set = {1, 2, 3} + if x in my_set: + my_set.remove(element=x) + + +def multiline_qualifier(x, cond): + my_set = {1, 2, 3} + other_set = {4, 5, 6} + if x in (my_set # Noncompliant + if cond else + other_set): + (my_set + if cond else + other_set).remove(x) + + +def multiline_argument(items, i): + my_set = {1, 2, 3} + if items[ # Noncompliant + i] in my_set: + my_set.remove(items[ + i]) From 72910be41d7307383f87d92a49c7080dda450c18 Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Mon, 27 Apr 2026 11:20:40 +0200 Subject: [PATCH 101/322] SONARPY-4120 Ruling Diff Comment: support rule with legacy key (#1081) GitOrigin-RevId: 6f838e0f5531078e6f595cdfece99a0b06b404ad --- .../ruling_diff_core_lib/ruling_diff_logic.py | 4 ++-- .../ruling-diff-comment/test_ruling_diff.py | 23 ++++++++++++++----- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/.github/actions/ruling-diff-comment/ruling_diff_core_lib/ruling_diff_logic.py b/.github/actions/ruling-diff-comment/ruling_diff_core_lib/ruling_diff_logic.py index e958ae146..e77ee245e 100644 --- a/.github/actions/ruling-diff-comment/ruling_diff_core_lib/ruling_diff_logic.py +++ b/.github/actions/ruling-diff-comment/ruling_diff_core_lib/ruling_diff_logic.py @@ -44,8 +44,8 @@ def parse_rule_filename(filename: str) -> tuple[str, str]: repository, rule_key = basename.rsplit("-", 1) if not repository: raise ValueError(f"Missing repo in filename: {filename}") - if not rule_key.startswith("S") or not rule_key[1:].isdigit(): - raise ValueError(f"Invalid rule key in filename: {filename}") + if not rule_key: + raise ValueError(f"Missing rule key in filename: {filename}") return repository, rule_key diff --git a/.github/actions/ruling-diff-comment/test_ruling_diff.py b/.github/actions/ruling-diff-comment/test_ruling_diff.py index 459f6f43d..5b7ed077b 100644 --- a/.github/actions/ruling-diff-comment/test_ruling_diff.py +++ b/.github/actions/ruling-diff-comment/test_ruling_diff.py @@ -56,6 +56,21 @@ def test_parse_ruling_path_with_pythonenterprise(self) -> None: core.parse_ruling_path(path), ) + def test_parse_ruling_path_with_legacy_key(self) -> None: + path = "private/its-enterprise/ruling/src/test/resources/expected_ruling/scikit-learn/python-LineLength.json" + self.assertEqual( + ("scikit-learn", "python", "LineLength"), + core.parse_ruling_path(path), + ) + + def test_parse_rule_filename_rejects_empty_rule_key(self) -> None: + with self.assertRaises(ValueError): + core.parse_rule_filename("python-.json") + + def test_parse_rule_filename_rejects_empty_repository(self) -> None: + with self.assertRaises(ValueError): + core.parse_rule_filename("-S1066.json") + class DiffLogicTest(unittest.TestCase): def test_diff_ruling_jsons_added_issues(self) -> None: @@ -408,9 +423,7 @@ def test_resolve_source_path_for_project_rulings_falls_back_to_sources_child(sel io_impl.resolve_source_path("project", "S1716.py"), ) - def test_resolve_source_path_for_project_rulings_falls_back_to_sources_internal( - self, - ) -> None: + def test_resolve_source_path_for_project_rulings_falls_back_to_sources_internal(self) -> None: io_impl = io.GitHubActionIO() with tempfile.TemporaryDirectory() as tmp_dir: sources_ruling = f"{tmp_dir}/sources_ruling" @@ -432,9 +445,7 @@ def test_resolve_source_path_for_project_rulings_falls_back_to_sources_internal( ): self.assertEqual(target, io_impl.resolve_source_path("project", "foo.py")) - def test_resolve_source_path_for_project_rulings_falls_back_to_namespace_child( - self, - ) -> None: + def test_resolve_source_path_for_project_rulings_falls_back_to_namespace_child(self) -> None: io_impl = io.GitHubActionIO() with tempfile.TemporaryDirectory() as tmp_dir: sources_ruling = f"{tmp_dir}/sources_ruling" From 1931ce31d0fe0ed6f7f8d1528928ab51a6c14eac Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Mon, 27 Apr 2026 15:51:22 +0200 Subject: [PATCH 102/322] SONARPY-4125 Fixing PackageRootResolver behavior when no config files are found (#1079) GitOrigin-RevId: 9361ed36ee5be37e72c76d57e7e2625f2696dc49 --- .../sonar/plugins/python/PythonSensor.java | 2 + .../indexer/PackageResolutionResult.java | 8 +- .../python/indexer/PackageRootResolver.java | 36 ++++---- .../python/telemetry/TelemetryMetricKey.java | 1 + .../plugins/python/PythonSensorTest.java | 82 +++++++++++++++-- .../indexer/PackageResolutionResultTest.java | 3 +- .../indexer/PackageRootResolverTest.java | 88 +++---------------- .../indexer/SonarQubePythonIndexerTest.java | 18 ++-- .../python/sensor/python-version/__init__.py | 0 9 files changed, 130 insertions(+), 108 deletions(-) create mode 100644 python-commons/src/test/resources/org/sonar/plugins/python/sensor/python-version/__init__.py diff --git a/python-commons/src/main/java/org/sonar/plugins/python/PythonSensor.java b/python-commons/src/main/java/org/sonar/plugins/python/PythonSensor.java index 49fb74564..4ae131c48 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/PythonSensor.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/PythonSensor.java @@ -247,12 +247,14 @@ private void updateResolutionMethodTelemetry(NamespacePackageTelemetry telemetry boolean usedSonarSources = method == PackageResolutionResult.ResolutionMethod.SONAR_SOURCES; boolean usedConventionalFolders = method == PackageResolutionResult.ResolutionMethod.CONVENTIONAL_FOLDERS; boolean usedBaseDir = method == PackageResolutionResult.ResolutionMethod.BASE_DIR; + boolean usedLegacyInitPy = method == PackageResolutionResult.ResolutionMethod.LEGACY_INIT_PY; sensorTelemetryStorage.updateMetric(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_PYPROJECT_TOML, usedPyproject ? 1 : 0); sensorTelemetryStorage.updateMetric(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_SETUP_PY, usedSetupPy ? 1 : 0); sensorTelemetryStorage.updateMetric(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_SONAR_SOURCES, usedSonarSources ? 1 : 0); sensorTelemetryStorage.updateMetric(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_CONVENTIONAL_FOLDERS, usedConventionalFolders ? 1 : 0); sensorTelemetryStorage.updateMetric(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_BASE_DIR, usedBaseDir ? 1 : 0); + sensorTelemetryStorage.updateMetric(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_LEGACY_INIT_PY, usedLegacyInitPy ? 1 : 0); } private void updateBuildSystemTelemetry(NamespacePackageTelemetry telemetry) { diff --git a/python-commons/src/main/java/org/sonar/plugins/python/indexer/PackageResolutionResult.java b/python-commons/src/main/java/org/sonar/plugins/python/indexer/PackageResolutionResult.java index 88c6b701b..7ee4df58e 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/indexer/PackageResolutionResult.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/indexer/PackageResolutionResult.java @@ -46,7 +46,9 @@ public enum ResolutionMethod { /** Resolved from conventional folders (src/, lib/) */ CONVENTIONAL_FOLDERS, /** Fallback to project base directory */ - BASE_DIR + BASE_DIR, + /** No build config files found; FQN resolution uses legacy __init__.py detection */ + LEGACY_INIT_PY } /** @@ -89,4 +91,8 @@ public static PackageResolutionResult fromConventionalFolders(List roots public static PackageResolutionResult fromBaseDir(List roots) { return new PackageResolutionResult(roots, ResolutionMethod.BASE_DIR, BuildSystem.NONE); } + + public static PackageResolutionResult fromLegacyInitPy() { + return new PackageResolutionResult(List.of(), ResolutionMethod.LEGACY_INIT_PY, BuildSystem.NONE); + } } diff --git a/python-commons/src/main/java/org/sonar/plugins/python/indexer/PackageRootResolver.java b/python-commons/src/main/java/org/sonar/plugins/python/indexer/PackageRootResolver.java index feb070c43..583c38e3c 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/indexer/PackageRootResolver.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/indexer/PackageRootResolver.java @@ -39,10 +39,11 @@ *
        *
      • Extraction from pyproject.toml build system configurations
      • *
      • Extraction from setup.py configurations
      • + *
      • When no build config files exist: returns empty roots so that FQN resolution falls back + * to legacy __init__.py-based detection (see + * {@link org.sonar.python.semantic.SymbolUtils#pythonPackageName})
      • *
      • Fallback when build files exist but provide no roots: conventional folders (src/, lib/), * then sonar.sources, then base directory
      • - *
      • Fallback when no build files exist: sonar.sources, then conventional folders (src/, lib/), - * then base directory
      • *
      */ public class PackageRootResolver { @@ -59,9 +60,9 @@ private PackageRootResolver() { * Resolves package root directories for the project. * *

      Attempts to extract source roots from pyproject.toml and setup.py build system configurations. - * Falls back to different priority orders depending on whether build files exist: when build files - * are present but provide no source roots, conventional folders take priority over sonar.sources; - * when no build files exist at all, sonar.sources takes priority over conventional folders. + * When no build config files exist, returns empty roots so that FQN resolution falls back to + * legacy __init__.py-based detection. When build config files exist but provide no source roots, + * conventional folders take priority over sonar.sources, then base directory as last resort. * * @param fileSystem the Sonar file system providing the base directory * @param config the Sonar configuration @@ -75,6 +76,13 @@ public static PackageResolutionResult resolve(FileSystem fileSystem, Configurati List setupPyFiles = findFilesRecursively(fileSystem, "setup.py"); boolean hasBuildConfigFiles = !pyprojectFiles.isEmpty() || !setupPyFiles.isEmpty(); + // When no build config files exist, FQN resolution relies on legacy __init__.py detection. + // Returning empty roots causes SymbolUtils.pythonPackageName to use pythonPackageNameLegacy(). + if (!hasBuildConfigFiles) { + LOG.debug("No build config files found; using legacy __init__.py-based package detection"); + return PackageResolutionResult.fromLegacyInitPy(); + } + // Extract source roots from discovered files List pyprojectResults = pyprojectFiles.stream() .map(PyProjectTomlSourceRoots::extractWithBuildSystem) @@ -109,23 +117,17 @@ public static PackageResolutionResult resolve(FileSystem fileSystem, Configurati return PackageResolutionResult.fromSetupPy(adjustedRoots); } - return resolveFallback(config, baseDir, hasBuildConfigFiles); + return resolveFallback(config, baseDir); } /** - * Resolves fallback package roots when no build system configuration provides source roots. + * Resolves fallback package roots when build config files exist but provide no source roots. * - *

      When build config files (pyproject.toml / setup.py) exist but provide no source roots, - * the priority order is: conventional folders (src/, lib/), then sonar.sources, then base directory. - * - *

      When NO build config files exist at all, the priority order is: sonar.sources, then - * conventional folders (src/, lib/), then base directory. + *

      Priority order: conventional folders (src/, lib/), then sonar.sources, then base directory. */ - private static PackageResolutionResult resolveFallback(Configuration config, File baseDir, boolean hasBuildConfigFiles) { - List>> candidates = hasBuildConfigFiles - ? List.of(PackageRootResolver::tryConventionalFolders, PackageRootResolver::trySonarSources) - : List.of(PackageRootResolver::trySonarSources, PackageRootResolver::tryConventionalFolders); - + private static PackageResolutionResult resolveFallback(Configuration config, File baseDir) { + List>> candidates = + List.of(PackageRootResolver::tryConventionalFolders, PackageRootResolver::trySonarSources); for (BiFunction> candidate : candidates) { Optional result = candidate.apply(config, baseDir); if (result.isPresent()) { diff --git a/python-commons/src/main/java/org/sonar/plugins/python/telemetry/TelemetryMetricKey.java b/python-commons/src/main/java/org/sonar/plugins/python/telemetry/TelemetryMetricKey.java index 24dbed70a..9884426af 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/telemetry/TelemetryMetricKey.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/telemetry/TelemetryMetricKey.java @@ -47,6 +47,7 @@ public enum TelemetryMetricKey { PYTHON_PACKAGE_RESOLVED_VIA_SONAR_SOURCES("python.packages.resolved_via_sonar_sources"), PYTHON_PACKAGE_RESOLVED_VIA_CONVENTIONAL_FOLDERS("python.packages.resolved_via_conventional_folders"), PYTHON_PACKAGE_RESOLVED_VIA_BASE_DIR("python.packages.resolved_via_base_dir"), + PYTHON_PACKAGE_RESOLVED_VIA_LEGACY_INIT_PY("python.packages.resolved_via_legacy_init_py"), // Build system flags (1 = detected, 0 = not detected) - only applicable when pyproject.toml is used PYTHON_PACKAGE_BUILD_SYSTEM_SETUPTOOLS("python.packages.build_system.setuptools"), PYTHON_PACKAGE_BUILD_SYSTEM_POETRY("python.packages.build_system.poetry"), diff --git a/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java index ac19b3699..77873543b 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java @@ -1860,6 +1860,7 @@ void send_telemetry_resolution_method_pyproject_toml() throws IOException { verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_SONAR_SOURCES.key(), "0"); verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_CONVENTIONAL_FOLDERS.key(), "0"); verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_BASE_DIR.key(), "0"); + verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_LEGACY_INIT_PY.key(), "0"); // Verify build system flags verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_PACKAGE_BUILD_SYSTEM_SETUPTOOLS.key(), "1"); @@ -1915,20 +1916,67 @@ void send_telemetry_resolution_method_setup_py() throws IOException { verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_SONAR_SOURCES.key(), "0"); verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_CONVENTIONAL_FOLDERS.key(), "0"); verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_BASE_DIR.key(), "0"); + verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_LEGACY_INIT_PY.key(), "0"); + } + + @Test + void send_telemetry_resolution_method_legacy_init_py() throws IOException { + // No build config files → LEGACY_INIT_PY regardless of sonar.sources or conventional folders + Path tempDir = Files.createTempDirectory("legacy_init_py_telemetry_test").toRealPath(); + Path pkgDir = Files.createDirectories(tempDir.resolve("mypackage")); + Files.writeString(pkgDir.resolve("__init__.py"), ""); + Files.writeString(pkgDir.resolve("module.py"), "x = 1"); + + SensorContextTester tempContext = SensorContextTester.create(tempDir.toFile()); + tempContext.fileSystem().setWorkDir(Files.createTempDirectory("workDir")); + + DefaultInputFile moduleFile = TestInputFileBuilder.create("moduleKey", tempDir.toFile(), pkgDir.resolve("module.py").toFile()) + .setLanguage("py") + .setType(Type.MAIN) + .setCharset(StandardCharsets.UTF_8) + .build(); + tempContext.fileSystem().add(moduleFile); + + activeRules = new ActiveRulesBuilder() + .addRule(new NewActiveRule.Builder() + .setRuleKey(RuleKey.of(PythonRuleRepository.REPOSITORY_KEY, "S930")) + .build()) + .build(); + + var contextSpy = spy(tempContext); + PythonSensor sensor = sensor(CUSTOM_RULES, null, analysisWarning, architectureUDGBuilderWrapper, new ProjectConfigurationBuilder()); + sensor.execute(contextSpy); + + // Verify resolution method flags - should use legacy __init__.py detection + verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_PYPROJECT_TOML.key(), "0"); + verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_SETUP_PY.key(), "0"); + verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_SONAR_SOURCES.key(), "0"); + verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_CONVENTIONAL_FOLDERS.key(), "0"); + verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_BASE_DIR.key(), "0"); + verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_LEGACY_INIT_PY.key(), "1"); } @Test void send_telemetry_resolution_method_sonar_sources() throws IOException { + // Build config file exists but provides no roots; sonar.sources wins over conventional folders Path tempDir = Files.createTempDirectory("sonar_sources_telemetry_test").toRealPath(); Path customDir = Files.createDirectories(tempDir.resolve(Path.of("custom_src", "mypackage"))); Files.writeString(customDir.resolve("__init__.py"), ""); Files.writeString(customDir.resolve("module.py"), "x = 1"); - // No pyproject.toml, setup.py, or conventional src folder - but sonar.sources is set + // Minimal pyproject.toml with no package configuration so roots cannot be extracted + Files.writeString(tempDir.resolve("pyproject.toml"), "[project]\nname = \"myproject\"\n"); SensorContextTester tempContext = SensorContextTester.create(tempDir.toFile()); tempContext.fileSystem().setWorkDir(Files.createTempDirectory("workDir")); tempContext.settings().setProperty("sonar.sources", "custom_src"); + DefaultInputFile pyprojectFile = TestInputFileBuilder.create("moduleKey", tempDir.toFile(), tempDir.resolve("pyproject.toml").toFile()) + .setLanguage("py") + .setType(Type.MAIN) + .setCharset(StandardCharsets.UTF_8) + .build(); + tempContext.fileSystem().add(pyprojectFile); + DefaultInputFile moduleFile = TestInputFileBuilder.create("moduleKey", tempDir.toFile(), customDir.resolve("module.py").toFile()) .setLanguage("py") .setType(Type.MAIN) @@ -1946,25 +1994,35 @@ void send_telemetry_resolution_method_sonar_sources() throws IOException { PythonSensor sensor = sensor(CUSTOM_RULES, null, analysisWarning, architectureUDGBuilderWrapper, new ProjectConfigurationBuilder()); sensor.execute(contextSpy); - // Verify resolution method flags - should use sonar.sources + // Verify resolution method flags - build config exists but no roots: sonar.sources wins verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_PYPROJECT_TOML.key(), "0"); verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_SETUP_PY.key(), "0"); verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_SONAR_SOURCES.key(), "1"); verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_CONVENTIONAL_FOLDERS.key(), "0"); verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_BASE_DIR.key(), "0"); + verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_LEGACY_INIT_PY.key(), "0"); } @Test void send_telemetry_resolution_method_conventional_folders() throws IOException { + // Build config file exists but provides no roots; conventional src/ folder wins Path tempDir = Files.createTempDirectory("conventional_telemetry_test").toRealPath(); Path srcDir = Files.createDirectories(tempDir.resolve(Path.of("src", "mypackage"))); Files.writeString(srcDir.resolve("__init__.py"), ""); Files.writeString(srcDir.resolve("module.py"), "x = 1"); - // No pyproject.toml or setup.py - should use conventional folder fallback + // Minimal pyproject.toml with no package configuration so roots cannot be extracted + Files.writeString(tempDir.resolve("pyproject.toml"), "[project]\nname = \"myproject\"\n"); SensorContextTester tempContext = SensorContextTester.create(tempDir.toFile()); tempContext.fileSystem().setWorkDir(Files.createTempDirectory("workDir")); + DefaultInputFile pyprojectFile = TestInputFileBuilder.create("moduleKey", tempDir.toFile(), tempDir.resolve("pyproject.toml").toFile()) + .setLanguage("py") + .setType(Type.MAIN) + .setCharset(StandardCharsets.UTF_8) + .build(); + tempContext.fileSystem().add(pyprojectFile); + DefaultInputFile moduleFile = TestInputFileBuilder.create("moduleKey", tempDir.toFile(), srcDir.resolve("module.py").toFile()) .setLanguage("py") .setType(Type.MAIN) @@ -1982,25 +2040,35 @@ void send_telemetry_resolution_method_conventional_folders() throws IOException PythonSensor sensor = sensor(CUSTOM_RULES, null, analysisWarning, architectureUDGBuilderWrapper, new ProjectConfigurationBuilder()); sensor.execute(contextSpy); - // Verify resolution method flags - should use conventional folders (src exists) + // Verify resolution method flags - build config exists but no roots: conventional folders wins verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_PYPROJECT_TOML.key(), "0"); verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_SETUP_PY.key(), "0"); verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_SONAR_SOURCES.key(), "0"); verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_CONVENTIONAL_FOLDERS.key(), "1"); verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_BASE_DIR.key(), "0"); + verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_LEGACY_INIT_PY.key(), "0"); } @Test void send_telemetry_resolution_method_base_dir() throws IOException { + // Build config file exists but provides no roots; no conventional folders, no sonar.sources → base dir Path tempDir = Files.createTempDirectory("basedir_telemetry_test").toRealPath(); Path pkgDir = Files.createDirectories(tempDir.resolve("mypackage")); Files.writeString(pkgDir.resolve("__init__.py"), ""); Files.writeString(pkgDir.resolve("module.py"), "x = 1"); - // No pyproject.toml, setup.py, or src folder - should use base dir fallback + // Minimal pyproject.toml with no package configuration so roots cannot be extracted + Files.writeString(tempDir.resolve("pyproject.toml"), "[project]\nname = \"myproject\"\n"); SensorContextTester tempContext = SensorContextTester.create(tempDir.toFile()); tempContext.fileSystem().setWorkDir(Files.createTempDirectory("workDir")); + DefaultInputFile pyprojectFile = TestInputFileBuilder.create("moduleKey", tempDir.toFile(), tempDir.resolve("pyproject.toml").toFile()) + .setLanguage("py") + .setType(Type.MAIN) + .setCharset(StandardCharsets.UTF_8) + .build(); + tempContext.fileSystem().add(pyprojectFile); + DefaultInputFile moduleFile = TestInputFileBuilder.create("moduleKey", tempDir.toFile(), pkgDir.resolve("module.py").toFile()) .setLanguage("py") .setType(Type.MAIN) @@ -2018,12 +2086,13 @@ void send_telemetry_resolution_method_base_dir() throws IOException { PythonSensor sensor = sensor(CUSTOM_RULES, null, analysisWarning, architectureUDGBuilderWrapper, new ProjectConfigurationBuilder()); sensor.execute(contextSpy); - // Verify resolution method flags - should use base dir fallback + // Verify resolution method flags - build config exists but no roots, no fallback: base dir verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_PYPROJECT_TOML.key(), "0"); verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_SETUP_PY.key(), "0"); verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_SONAR_SOURCES.key(), "0"); verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_CONVENTIONAL_FOLDERS.key(), "0"); verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_BASE_DIR.key(), "1"); + verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_LEGACY_INIT_PY.key(), "0"); } @Test @@ -2089,6 +2158,7 @@ void send_telemetry_resolution_method_both_pyproject_and_setup_py() throws IOExc verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_SONAR_SOURCES.key(), "0"); verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_CONVENTIONAL_FOLDERS.key(), "0"); verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_BASE_DIR.key(), "0"); + verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_LEGACY_INIT_PY.key(), "0"); // Verify build system flags - Poetry should be detected verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_PACKAGE_BUILD_SYSTEM_SETUPTOOLS.key(), "0"); diff --git a/python-commons/src/test/java/org/sonar/plugins/python/indexer/PackageResolutionResultTest.java b/python-commons/src/test/java/org/sonar/plugins/python/indexer/PackageResolutionResultTest.java index 908ca4aa7..20b146801 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/indexer/PackageResolutionResultTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/indexer/PackageResolutionResultTest.java @@ -96,7 +96,8 @@ void all_resolution_methods_exist() { PackageResolutionResult.ResolutionMethod.PYPROJECT_AND_SETUP_PY, PackageResolutionResult.ResolutionMethod.SONAR_SOURCES, PackageResolutionResult.ResolutionMethod.CONVENTIONAL_FOLDERS, - PackageResolutionResult.ResolutionMethod.BASE_DIR + PackageResolutionResult.ResolutionMethod.BASE_DIR, + PackageResolutionResult.ResolutionMethod.LEGACY_INIT_PY ); } diff --git a/python-commons/src/test/java/org/sonar/plugins/python/indexer/PackageRootResolverTest.java b/python-commons/src/test/java/org/sonar/plugins/python/indexer/PackageRootResolverTest.java index 8b0fd9dc6..e005196c5 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/indexer/PackageRootResolverTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/indexer/PackageRootResolverTest.java @@ -55,103 +55,39 @@ private Configuration sonarSources(String... values) { return config; } - // ─── resolve() — fallback: conventional folders ─────────────────────────── + // ─── resolve() — no build config files → LEGACY_INIT_PY ────────────────── @Test - void resolve_noConfigFiles_fallsBackToSrcFolder() throws IOException { - Files.createDirectory(tempDir.resolve("src")); - File baseDir = tempDir.toFile(); - - PackageResolutionResult result = PackageRootResolver.resolve(mockFileSystem(baseDir), noSonarSources()); - - assertThat(result.roots()).containsExactly(new File(baseDir, "src").getAbsolutePath()); - assertThat(result.method()).isEqualTo(PackageResolutionResult.ResolutionMethod.CONVENTIONAL_FOLDERS); - } - - @Test - void resolve_noConfigFiles_fallsBackToLibFolder() throws IOException { - Files.createDirectory(tempDir.resolve("lib")); + void resolve_noBuildConfigFiles_returnsLegacyInitPy() { File baseDir = tempDir.toFile(); PackageResolutionResult result = PackageRootResolver.resolve(mockFileSystem(baseDir), noSonarSources()); - assertThat(result.roots()).containsExactly(new File(baseDir, "lib").getAbsolutePath()); - assertThat(result.method()).isEqualTo(PackageResolutionResult.ResolutionMethod.CONVENTIONAL_FOLDERS); + assertThat(result.roots()).isEmpty(); + assertThat(result.method()).isEqualTo(PackageResolutionResult.ResolutionMethod.LEGACY_INIT_PY); } @Test - void resolve_noConfigFiles_fallsBackToBothSrcAndLib() throws IOException { + void resolve_noBuildConfigFiles_srcFolderPresent_stillReturnsLegacyInitPy() throws IOException { + // Conventional folders are ignored when no build config files exist Files.createDirectory(tempDir.resolve("src")); - Files.createDirectory(tempDir.resolve("lib")); File baseDir = tempDir.toFile(); PackageResolutionResult result = PackageRootResolver.resolve(mockFileSystem(baseDir), noSonarSources()); - assertThat(result.roots()).containsExactly( - new File(baseDir, "src").getAbsolutePath(), - new File(baseDir, "lib").getAbsolutePath()); - assertThat(result.method()).isEqualTo(PackageResolutionResult.ResolutionMethod.CONVENTIONAL_FOLDERS); + assertThat(result.roots()).isEmpty(); + assertThat(result.method()).isEqualTo(PackageResolutionResult.ResolutionMethod.LEGACY_INIT_PY); } @Test - void resolve_noConfigFiles_sonarSourcesWinsOverConventionalFolders() throws IOException { - // src/ exists AND sonar.sources is set — sonar.sources should win (no build files) - Files.createDirectory(tempDir.resolve("src")); - File baseDir = tempDir.toFile(); - - PackageResolutionResult result = PackageRootResolver.resolve(mockFileSystem(baseDir), sonarSources("app")); - - assertThat(result.roots()).containsExactly(new File(baseDir, "app").getAbsolutePath()); - assertThat(result.method()).isEqualTo(PackageResolutionResult.ResolutionMethod.SONAR_SOURCES); - } - - // ─── resolve() — fallback: sonar.sources ────────────────────────────────── - - @Test - void resolve_noConfigFilesNoConventionalFolders_fallsBackToSonarSources() { - File baseDir = tempDir.toFile(); - - PackageResolutionResult result = PackageRootResolver.resolve(mockFileSystem(baseDir), sonarSources("sources", "lib")); - - assertThat(result.roots()).containsExactly( - new File(baseDir, "sources").getAbsolutePath(), - new File(baseDir, "lib").getAbsolutePath()); - assertThat(result.method()).isEqualTo(PackageResolutionResult.ResolutionMethod.SONAR_SOURCES); - } - - @Test - void resolve_dotSonarSources_returnsBaseDirAbsolutePath() { - // sonar.sources=. must normalize to baseDir, not produce "/baseDir/." + void resolve_noBuildConfigFiles_sonarSourcesIgnored() { + // sonar.sources is also irrelevant when no build config files exist File baseDir = tempDir.toFile(); PackageResolutionResult result = PackageRootResolver.resolve(mockFileSystem(baseDir), sonarSources(".")); - assertThat(result.roots()).containsExactly(baseDir.getAbsolutePath()); - assertThat(result.method()).isEqualTo(PackageResolutionResult.ResolutionMethod.SONAR_SOURCES); - } - - // ─── resolve() — fallback: base directory ───────────────────────────────── - - @Test - void resolve_noConfigFilesNoConventionalFoldersNoSonarSources_fallsBackToBaseDir() { - File baseDir = tempDir.toFile(); - - PackageResolutionResult result = PackageRootResolver.resolve(mockFileSystem(baseDir), noSonarSources()); - - assertThat(result.roots()).containsExactly(baseDir.getAbsolutePath()); - assertThat(result.method()).isEqualTo(PackageResolutionResult.ResolutionMethod.BASE_DIR); - } - - @Test - void resolve_srcExistsAsFile_fallsBackToSonarSourcesThenBaseDir() throws IOException { - // src is a file, not a dir — conventional folder check fails - Files.createFile(tempDir.resolve("src")); - File baseDir = tempDir.toFile(); - - PackageResolutionResult result = PackageRootResolver.resolve(mockFileSystem(baseDir), noSonarSources()); - - assertThat(result.roots()).containsExactly(baseDir.getAbsolutePath()); - assertThat(result.method()).isEqualTo(PackageResolutionResult.ResolutionMethod.BASE_DIR); + assertThat(result.roots()).isEmpty(); + assertThat(result.method()).isEqualTo(PackageResolutionResult.ResolutionMethod.LEGACY_INIT_PY); } @Test diff --git a/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexerTest.java b/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexerTest.java index 5b464378d..0740bc9e6 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexerTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexerTest.java @@ -536,11 +536,12 @@ void test_package_roots_from_pyproject_toml_setuptools() throws IOException { @Test void test_package_roots_fallback_to_src_folder() throws IOException { // Create a temp directory with src folder but no pyproject.toml - Path tempDir = Files.createTempDirectory("src_fallback_test"); + Path tempDir = Files.createTempDirectory("src_fallback_test").toRealPath(); Path srcDir = tempDir.resolve(Path.of("src", "mypackage")); Files.createDirectories(srcDir); Files.writeString(srcDir.resolve("__init__.py"), ""); Files.writeString(srcDir.resolve("module.py"), "x = 1"); + Files.writeString(tempDir.resolve("pyproject.toml"), ""); SensorContextTester tempContext = SensorContextTester.create(tempDir.toFile()); tempContext.fileSystem().setWorkDir(Files.createTempDirectory("workDir")); @@ -569,10 +570,11 @@ void test_package_roots_fallback_to_src_folder() throws IOException { @Test void test_package_roots_fallback_to_base_dir() throws IOException { // Create a temp directory without src folder or pyproject.toml - Path tempDir = Files.createTempDirectory("basedir_fallback_test"); + Path tempDir = Files.createTempDirectory("basedir_fallback_test").toRealPath(); Path pkgDir = Files.createDirectories(tempDir.resolve("mypackage")); Files.writeString(pkgDir.resolve("__init__.py"), ""); Files.writeString(pkgDir.resolve("module.py"), "x = 1"); + Files.writeString(tempDir.resolve("pyproject.toml"), ""); SensorContextTester tempContext = SensorContextTester.create(tempDir.toFile()); tempContext.fileSystem().setWorkDir(Files.createTempDirectory("workDir")); @@ -602,6 +604,7 @@ void test_package_roots_from_sonar_sources_dot() throws IOException { Path tempDir = Files.createTempDirectory("sonar_sources_dot_test").toRealPath(); Path pkgDir = Files.createDirectories(tempDir.resolve("mypackage")); Files.writeString(pkgDir.resolve("module.py"), "x = 1"); + Files.writeString(tempDir.resolve("pyproject.toml"), ""); SensorContextTester tempContext = SensorContextTester.create(tempDir.toFile()); tempContext.fileSystem().setWorkDir(Files.createTempDirectory("workDir")); @@ -628,8 +631,9 @@ void test_package_roots_from_sonar_sources_dot() throws IOException { @Test void test_package_roots_from_sonar_sources() throws IOException { // Create a temp directory with custom sources folder - Path tempDir = Files.createTempDirectory("sonar_sources_test"); - Path libDir = tempDir.resolve(Path.of("lib", "mylib")); + Path tempDir = Files.createTempDirectory("sonar_sources_test").toRealPath(); + Files.writeString(tempDir.resolve("pyproject.toml"), ""); + Path libDir = tempDir.resolve(Path.of("some_lib", "mylib")); Files.createDirectories(libDir); Files.writeString(libDir.resolve("__init__.py"), ""); Files.writeString(libDir.resolve("utils.py"), "x = 1"); @@ -637,10 +641,10 @@ void test_package_roots_from_sonar_sources() throws IOException { SensorContextTester tempContext = SensorContextTester.create(tempDir.toFile()); tempContext.fileSystem().setWorkDir(Files.createTempDirectory("workDir")); tempContext.settings().setProperty("sonar.python.skipUnchanged", false); - tempContext.settings().setProperty("sonar.sources", "lib"); + tempContext.settings().setProperty("sonar.sources", "some_lib"); PythonInputFile utilsFile = createInputFile(tempDir.toFile(), - "lib/mylib/utils.py", + "some_lib/mylib/utils.py", InputFile.Status.ADDED, InputFile.Type.MAIN); List inputFiles = List.of(utilsFile); @@ -649,7 +653,7 @@ void test_package_roots_from_sonar_sources() throws IOException { // Package roots should come from sonar.sources // Use File.getAbsolutePath() for both sides to ensure consistent path representation on Windows - String expectedRoot = new File(tempDir.toFile(), "lib").getAbsolutePath(); + String expectedRoot = new File(tempDir.toFile(), "some_lib").getAbsolutePath(); assertThat(indexer.packageRoots()).containsExactly(expectedRoot); // FQN should be computed correctly diff --git a/python-commons/src/test/resources/org/sonar/plugins/python/sensor/python-version/__init__.py b/python-commons/src/test/resources/org/sonar/plugins/python/sensor/python-version/__init__.py new file mode 100644 index 000000000..e69de29bb From 07b1c7d5ac99593ce5cc3577beaedef54ea96f10 Mon Sep 17 00:00:00 2001 From: Guillaume Dequenne Date: Mon, 27 Apr 2026 16:48:35 +0200 Subject: [PATCH 103/322] SONARPY-4113 Improve issue reporting for S8518 (#1075) GitOrigin-RevId: faaa6ec657ff23b9b2a50f4d4651444ad5d1bbf1 --- .../checks/EnumerateUnpackingCheck.java | 31 ++++++++++++------- .../resources/checks/enumerateUnpacking.py | 22 +++++++++++++ 2 files changed, 41 insertions(+), 12 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/EnumerateUnpackingCheck.java b/python-checks/src/main/java/org/sonar/python/checks/EnumerateUnpackingCheck.java index 5035df65d..e3a9b17c0 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/EnumerateUnpackingCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/EnumerateUnpackingCheck.java @@ -16,6 +16,8 @@ */ package org.sonar.python.checks; +import java.util.ArrayList; +import java.util.List; import org.sonar.check.Rule; import org.sonar.plugins.python.api.PythonSubscriptionCheck; import org.sonar.plugins.python.api.SubscriptionContext; @@ -40,6 +42,7 @@ public class EnumerateUnpackingCheck extends PythonSubscriptionCheck { private static final String MESSAGE = "Unpack the value from 'enumerate()' directly instead of using an index lookup."; + private static final String SECONDARY_MESSAGE = "Replace this index lookup with the unpacked value."; private static final TypeMatcher ENUMERATE_MATCHER = TypeMatchers.isType("enumerate"); @Override @@ -84,26 +87,30 @@ private static void check(SubscriptionContext ctx) { return; } - boolean hasSubscriptWriteTarget = TreeUtils.hasDescendant(forStatement.body(), - node -> isMatchingSubscript(node, indexSymbol, iterableSymbol) - && isSubscriptWriteTarget((SubscriptionExpression) node)); + List matchingSubscripts = new ArrayList<>(); + collectMatchingSubscripts(forStatement.body(), indexSymbol, iterableSymbol, matchingSubscripts); - if (hasSubscriptWriteTarget) { + if (matchingSubscripts.isEmpty()) { + return; + } + if (matchingSubscripts.stream().anyMatch(EnumerateUnpackingCheck::isSubscriptWriteTarget)) { return; } - boolean hasRedundantSubscript = TreeUtils.hasDescendant(forStatement.body(), - node -> isMatchingSubscript(node, indexSymbol, iterableSymbol)); + PreciseIssue issue = ctx.addIssue(call, MESSAGE); + matchingSubscripts.forEach(subscript -> issue.secondary(subscript, SECONDARY_MESSAGE)); + } - if (hasRedundantSubscript) { - ctx.addIssue(call, MESSAGE); + private static void collectMatchingSubscripts(Tree tree, SymbolV2 indexSymbol, SymbolV2 iterableSymbol, List result) { + for (Tree child : tree.children()) { + if (child instanceof SubscriptionExpression subscription && isMatchingSubscript(subscription, indexSymbol, iterableSymbol)) { + result.add(subscription); + } + collectMatchingSubscripts(child, indexSymbol, iterableSymbol, result); } } - private static boolean isMatchingSubscript(Tree node, SymbolV2 indexSymbol, SymbolV2 iterableSymbol) { - if (!(node instanceof SubscriptionExpression subscription)) { - return false; - } + private static boolean isMatchingSubscript(SubscriptionExpression subscription, SymbolV2 indexSymbol, SymbolV2 iterableSymbol) { if (subscription.subscripts().expressions().size() != 1) { return false; } diff --git a/python-checks/src/test/resources/checks/enumerateUnpacking.py b/python-checks/src/test/resources/checks/enumerateUnpacking.py index 9e7c30634..aacf02615 100644 --- a/python-checks/src/test/resources/checks/enumerateUnpacking.py +++ b/python-checks/src/test/resources/checks/enumerateUnpacking.py @@ -4,19 +4,34 @@ def noncompliant_basic(): for i, _ in enumerate(lst): # Noncompliant {{Unpack the value from 'enumerate()' directly instead of using an index lookup.}} # ^^^^^^^^^^^^^^ print(lst[i]) +# ^^^^^^< {{Replace this index lookup with the unpacked value.}} def noncompliant_start_zero_keyword(): colors = ['red', 'green', 'blue'] for i, _ in enumerate(colors, start=0): # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^^^^^^^ print(colors[i]) +# ^^^^^^^^^< {{Replace this index lookup with the unpacked value.}} def noncompliant_rhs_of_augmented_assignment(): items = "abcdef" result = "" for ind, _ in enumerate(items): # Noncompliant +# ^^^^^^^^^^^^^^^^ result += items[ind] +# ^^^^^^^^^^< {{Replace this index lookup with the unpacked value.}} + + +def noncompliant_multiple_usages(): + lst = ['a', 'b', 'c'] + for i, _ in enumerate(lst): # Noncompliant +# ^^^^^^^^^^^^^^ + print(lst[i]) +# ^^^^^^< {{Replace this index lookup with the unpacked value.}} + print(lst[i].upper()) +# ^^^^^^< {{Replace this index lookup with the unpacked value.}} def compliant_proper_unpacking(): @@ -90,6 +105,13 @@ def compliant_write_assignment(): items[i] = item.upper() +def compliant_mixed_read_and_write(): + items = ['a', 'b', 'c'] + for i, _ in enumerate(items): + print(items[i]) + items[i] = items[i].upper() + + def compliant_write_augmented_assignment(): counts = [0, 0, 0] for i, val in enumerate(counts): From 8e896fc4b6235a93a42f514912db88c9c2925568 Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Mon, 27 Apr 2026 16:56:28 +0200 Subject: [PATCH 104/322] SONARPY-4124 Fixing absolute path resolution on windows during package root resolution (#1084) GitOrigin-RevId: ee21e5d2291dbf903c193e0d3e84c2566ed96724 --- .../python/indexer/PackageRootResolver.java | 37 ++++++++++++++-- .../indexer/PackageRootResolverTest.java | 44 +++++++++++++++++++ 2 files changed, 77 insertions(+), 4 deletions(-) diff --git a/python-commons/src/main/java/org/sonar/plugins/python/indexer/PackageRootResolver.java b/python-commons/src/main/java/org/sonar/plugins/python/indexer/PackageRootResolver.java index 583c38e3c..312d6f7d8 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/indexer/PackageRootResolver.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/indexer/PackageRootResolver.java @@ -160,7 +160,11 @@ private static Optional trySonarSources(Configuration c } /** - * Converts relative path strings to normalized absolute paths under the given base directory. + * Converts path strings to normalized absolute paths. + * + *

      Relative paths are resolved against the given base directory. Windows-style absolute paths + * (e.g. {@code C:\path\to\src} or {@code C:/path/to/src}) are used as-is without prepending the + * base directory, which would otherwise produce a nonsensical path on non-Windows systems. * *

      Uses {@link Path#normalize()} to resolve {@code .} and {@code ..} components without * performing any I/O, so that {@code sonar.sources=.} correctly resolves to the base directory @@ -168,10 +172,24 @@ private static Optional trySonarSources(Configuration c */ static List toAbsolutePaths(List paths, File baseDir) { return paths.stream() - .map(path -> new File(baseDir, path).toPath().normalize().toString()) + .map(path -> { + File file = isWindowsAbsolutePath(path) ? new File(path) : new File(baseDir, path); + return file.toPath().normalize().toString(); + }) .toList(); } + /** + * Returns {@code true} if the given path is a Windows-style absolute path (e.g. {@code C:\...} + * or {@code C:/...}), regardless of the current operating system. + */ + private static boolean isWindowsAbsolutePath(String path) { + return path.length() >= 3 + && Character.isLetter(path.charAt(0)) + && path.charAt(1) == ':' + && (path.charAt(2) == '\\' || path.charAt(2) == '/'); + } + private static List findConventionalFolders(File baseDir) { List folders = new ArrayList<>(); for (String folderName : CONVENTIONAL_FOLDERS) { @@ -186,8 +204,19 @@ private static List findConventionalFolders(File baseDir) { private static List adjustRoots(List roots, File baseDir) { return roots.stream() .map(root -> { - File rootFile = new File(root).isAbsolute() ? new File(root) : new File(baseDir, root); - return adjustPackageRoot(rootFile, baseDir); + File rootAsFile = new File(root); + if (rootAsFile.isAbsolute()) { + // Native absolute path (works on any OS, including Windows running on Windows). + return adjustPackageRoot(rootAsFile, baseDir); + } + if (isWindowsAbsolutePath(root)) { + // Windows-style absolute path (e.g. C:\src) on a non-Windows system: File.isAbsolute() + // returns false, so we must not pass it to new File(baseDir, root) or getAbsolutePath() + // would prepend the JVM working directory. Return as-is; __init__.py traversal is not + // meaningful for a foreign-OS path. + return root; + } + return adjustPackageRoot(new File(baseDir, root), baseDir); }) .distinct() .toList(); diff --git a/python-commons/src/test/java/org/sonar/plugins/python/indexer/PackageRootResolverTest.java b/python-commons/src/test/java/org/sonar/plugins/python/indexer/PackageRootResolverTest.java index e005196c5..36e3b7c0c 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/indexer/PackageRootResolverTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/indexer/PackageRootResolverTest.java @@ -152,6 +152,50 @@ void toAbsolutePaths_dotPath_normalizedToBaseDir() { assertThat(result.get(0)).doesNotEndWith("\\."); } + // ─── toAbsolutePaths() — Windows path handling ─────────────────────────── + + @Test + void toAbsolutePaths_windowsAbsolutePath_notPrependedWithBaseDir() { + // When sonar.sources contains a Windows-style absolute path (e.g. from a Windows scanner), + // it must NOT be prepended with the base directory on a non-Windows system. + File baseDir = new File("/project/base"); + String windowsAbsPath = "C:\\Users\\user\\mixed-language-build"; + + List result = PackageRootResolver.toAbsolutePaths(List.of(windowsAbsPath), baseDir); + + // Must not produce "/project/base/" prepended to the Windows path + assertThat(result).containsExactly("C:\\Users\\user\\mixed-language-build"); + } + + @Test + void toAbsolutePaths_windowsAbsolutePathWithForwardSlashes_notPrependedWithBaseDir() { + // Windows paths may also use forward slashes; they are normalised by Path.normalize() + File baseDir = new File("/project/base"); + String windowsAbsPath = "C:/Users/user/mixed-language-build"; + + List result = PackageRootResolver.toAbsolutePaths(List.of(windowsAbsPath), baseDir); + + // Must not produce "/project/base/" prepended to the Windows path + // Forward slashes are preserved as-is by Path.normalize() on non-Windows systems + assertThat(result).hasSize(1); + assertThat(result.get(0)).isIn("C:\\Users\\user\\mixed-language-build","C:/Users/user/mixed-language-build"); + } + + @Test + void trySonarSources_windowsAbsolutePath_usedDirectlyNotPrependedWithBaseDir() throws IOException { + // Full integration: build file exists, sonar.sources has a Windows absolute path. + // The resolved root should be derived from the Windows path, not baseDir + Windows path. + Files.writeString(tempDir.resolve("pyproject.toml"), "[project]\nname = \"myproject\"\n"); + File baseDir = tempDir.toFile(); + String windowsAbsPath = "C:\\Users\\user\\mixed-language-build"; + + PackageResolutionResult result = PackageRootResolver.resolve(mockFileSystem(baseDir), sonarSources(windowsAbsPath)); + + assertThat(result.method()).isEqualTo(PackageResolutionResult.ResolutionMethod.SONAR_SOURCES); + assertThat(result.roots()).hasSize(1); + assertThat(result.roots()).containsExactly("C:\\Users\\user\\mixed-language-build"); + } + // ─── adjustPackageRoot() — migrated from PythonIndexerTest ──────────────── @Test From 1c26e0b6947d919b2c3f5ef07ce89239c98f39db Mon Sep 17 00:00:00 2001 From: "sonar-nigel[bot]" <247337653+sonar-nigel[bot]@users.noreply.github.com> Date: Mon, 27 Apr 2026 17:32:58 +0200 Subject: [PATCH 105/322] SONARPY-4048 Rule S8572 "logging.exception()" should be used instead of "logging.error()" in exception handlers (#1082) Co-authored-by: Sonar Vibe Bot Co-authored-by: Sebastian Zumbrunn GitOrigin-RevId: 4fc8aefd30f88d7c07e91a68255fecb9732a6ce4 --- .../python/checks/LoggingExceptionCheck.java | 80 +++++++++ .../python/checks/OpenSourceCheckList.java | 1 + .../org/sonar/l10n/py/rules/python/S8572.html | 76 ++++++++ .../org/sonar/l10n/py/rules/python/S8572.json | 24 +++ .../py/rules/python/Sonar_way_profile.json | 3 +- .../checks/LoggingExceptionCheckTest.java | 30 ++++ .../test/resources/checks/loggingException.py | 162 ++++++++++++++++++ 7 files changed, 375 insertions(+), 1 deletion(-) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/LoggingExceptionCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8572.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8572.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/LoggingExceptionCheckTest.java create mode 100644 python-checks/src/test/resources/checks/loggingException.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/LoggingExceptionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/LoggingExceptionCheck.java new file mode 100644 index 000000000..79749bc7c --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/LoggingExceptionCheck.java @@ -0,0 +1,80 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.QualifiedExpression; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.checks.utils.Expressions; +import org.sonar.python.tree.TreeUtils; + +@Rule(key = "S8572") +public class LoggingExceptionCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Use \"logging.exception()\" or explicitly pass \"exc_info=False\"."; + + private static final TypeMatcher LOGGING_ERROR_MATCHER = TypeMatchers.any( + TypeMatchers.isType("logging.error"), + TypeMatchers.isType("logging.Logger.error"), + TypeMatchers.isType("logging.LoggerAdapter.error") + ); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, LoggingExceptionCheck::checkCall); + } + + private static void checkCall(SubscriptionContext ctx) { + CallExpression callExpr = (CallExpression) ctx.syntaxNode(); + if (!(callExpr.callee() instanceof QualifiedExpression qualifiedCallee)) { + return; + } + if (!LOGGING_ERROR_MATCHER.isTrueFor(qualifiedCallee, ctx)) { + return; + } + if (!isDirectlyInsideExceptClause(callExpr)) { + return; + } + RegularArgument excInfoArg = TreeUtils.argumentByKeyword("exc_info", callExpr.arguments()); + if (excInfoArg != null && !Expressions.isTruthy(excInfoArg.expression())) { + return; + } + Name errorName = qualifiedCallee.name(); + ctx.addIssue(errorName, MESSAGE); + } + + private static boolean isDirectlyInsideExceptClause(Tree tree) { + Tree parent = tree.parent(); + while (parent != null) { + if (parent.is(Tree.Kind.FUNCDEF, Tree.Kind.LAMBDA)) { + return false; + } + if (parent.is(Tree.Kind.EXCEPT_CLAUSE, Tree.Kind.EXCEPT_GROUP_CLAUSE)) { + return true; + } + parent = parent.parent(); + } + return false; + } +} diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 9d937b10a..8ac273aa7 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -312,6 +312,7 @@ public Stream> getChecks() { ListIterableFirstElementCheck.class, LocalVariableAndParameterNameConventionCheck.class, LoggersConfigurationCheck.class, + LoggingExceptionCheck.class, LongIntegerWithLowercaseSuffixUsageCheck.class, LoopExecutingAtMostOnceCheck.class, LoopOverDictKeyValuesCheck.class, diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8572.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8572.html new file mode 100644 index 000000000..56cc3f6c9 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8572.html @@ -0,0 +1,76 @@ +

      This rule raises an issue when logging.error() is used within an exception handler (except block) to log exception +information.

      +

      Why is this an issue?

      +

      When handling exceptions in Python, it’s important to capture not just the error message, but also the full traceback. The traceback shows the +sequence of function calls that led to the exception, which is essential for understanding what went wrong and where.

      +

      The logging module provides two methods that might seem similar:

      +
        +
      • logging.error(): Logs an error message at the ERROR level
      • +
      • logging.exception(): Logs an error message at the ERROR level AND automatically includes the full exception traceback
      • +
      +

      When you’re inside an exception handler (except block), you’re dealing with an exception that just occurred. In this context, +logging.exception() is the appropriate choice because:

      +
        +
      • It automatically captures the traceback without requiring exc_info=True
      • +
      • It clearly signals to other developers that you’re logging an exception
      • +
      • It follows Python’s principle of being explicit about intent
      • +
      +

      Using logging.error() in an exception handler means you’re either:

      +
        +
      • Missing the traceback entirely (if you don’t pass exc_info=True), making debugging much harder
      • +
      • Writing more verbose code (if you do pass exc_info=True) when a simpler, more idiomatic option exists
      • +
      +

      The logging.exception() method is specifically designed for this use case and is the established Python idiom for logging +exceptions.

      +

      If omitting the traceback is intentional, explicitly passing exc_info=False (or exc_info=None) makes that intent clear +and is therefore not flagged.

      +

      What is the potential impact?

      +

      Using logging.error() instead of logging.exception() in exception handlers reduces code maintainability and makes +debugging more difficult.

      +

      When traceback information is missing from logs, developers must spend additional time reproducing issues to understand their root cause. In +production environments, where issues may be intermittent or difficult to reproduce, missing traceback information can make it nearly impossible to +diagnose problems effectively.

      +

      Additionally, using logging.error() with exc_info=True instead of the more idiomatic logging.exception() +makes the code less readable and may confuse developers who are unfamiliar with this pattern.

      +

      How to fix it

      +

      Replace logging.error() with logging.exception() when logging within an exception handler. If you were using +exc_info=True, you can remove it since logging.exception() includes traceback information by default.

      +

      If you intentionally do not want to log the traceback, explicitly pass exc_info=False to logging.error() to signal that +intent.

      +

      Code examples

      +

      Noncompliant code example

      +
      +import logging
      +
      +try:
      +    raise ValueError("Invalid value")
      +except ValueError:
      +    logging.error("Exception occurred", exc_info=True)  # Noncompliant
      +
      +

      Compliant solution

      +
      +import logging
      +
      +try:
      +    raise ValueError("Invalid value")
      +except ValueError:
      +    logging.exception("Exception occurred")
      +
      +

      If logging the traceback is not desired, explicitly opt out with exc_info=False:

      +
      +import logging
      +
      +try:
      +    raise ValueError("Invalid value")
      +except ValueError:
      +    logging.error("Exception occurred", exc_info=False)
      +
      +

      Resources

      +

      Documentation

      + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8572.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8572.json new file mode 100644 index 000000000..0546ca1f7 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8572.json @@ -0,0 +1,24 @@ +{ + "title": "\"logging.exception()\" should be used instead of \"logging.error()\" in exception handlers", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5 min" + }, + "tags": [ + "logging", + "exception" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-8572", + "sqKey": "S8572", + "scope": "Main", + "quickfix": "unknown", + "code": { + "impacts": { + "MAINTAINABILITY": "HIGH" + }, + "attribute": "COMPLETE" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 1cd13527a..f8398d22f 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -342,6 +342,7 @@ "S8517", "S8519", "S8520", - "S8521" + "S8521", + "S8572" ] } diff --git a/python-checks/src/test/java/org/sonar/python/checks/LoggingExceptionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/LoggingExceptionCheckTest.java new file mode 100644 index 000000000..9db91e5d1 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/LoggingExceptionCheckTest.java @@ -0,0 +1,30 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.junit.jupiter.api.Test; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class LoggingExceptionCheckTest { + + private final LoggingExceptionCheck check = new LoggingExceptionCheck(); + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/loggingException.py", check); + } +} diff --git a/python-checks/src/test/resources/checks/loggingException.py b/python-checks/src/test/resources/checks/loggingException.py new file mode 100644 index 000000000..243dbff15 --- /dev/null +++ b/python-checks/src/test/resources/checks/loggingException.py @@ -0,0 +1,162 @@ +import logging +import sys + +logger = logging.getLogger(__name__) + + +def noncompliant_bare_except(): + try: + risky() + except: + logging.error("Something went wrong") # Noncompliant {{Use "logging.exception()" or explicitly pass "exc_info=False".}} + + +def noncompliant_typed_except(): + try: + raise ValueError("bad value") + except ValueError: + logging.error("Value error occurred") # Noncompliant + + +def noncompliant_with_exc_info_true(): + try: + raise RuntimeError("runtime error") + except RuntimeError: + logging.error("Runtime error occurred", exc_info=True) # Noncompliant + + +def compliant_with_exc_info_sys(): + try: + risky() + except Exception: + logging.error("Exception occurred", exc_info=sys.exc_info()) + + +def compliant_with_exc_info_variable(some_var): + try: + risky() + except Exception: + logging.error("Exception occurred", exc_info=some_var) + + +def compliant_with_exc_info_function_call(): + try: + risky() + except Exception: + logging.error("Exception occurred", exc_info=should_log_traceback()) + + +def noncompliant_named_logger(): + try: + risky() + except Exception: + logger.error("Named logger error") # Noncompliant {{Use "logging.exception()" or explicitly pass "exc_info=False".}} + + +def noncompliant_named_logger_exc_info(): + try: + risky() + except Exception: + logger.error("Named logger error", exc_info=True) # Noncompliant + + +def noncompliant_nested_except(): + try: + risky() + except ValueError: + try: + other() + except TypeError: + logging.error("Nested error") # Noncompliant + + +def noncompliant_except_group(): + try: + risky() + except* ValueError: + logging.error("Grouped error") # Noncompliant + + +class MyService: + def noncompliant_in_method(self): + try: + risky() + except Exception: + logging.error("Error in method") # Noncompliant + + +def compliant_logging_exception(): + try: + risky() + except Exception: + logging.exception("Exception occurred") + + +def compliant_named_logger_exception(): + try: + risky() + except Exception: + logger.exception("Named logger exception") + + +def compliant_error_outside_except(): + logging.error("Not inside an except block") + if some_condition: + logging.error("Error in conditional") + + +def compliant_other_log_levels_in_except(): + try: + risky() + except Exception: + logging.warning("Warning") + logging.debug("Debug info") + logging.critical("Critical failure") + logging.info("Informational message") + + +def compliant_error_in_finally(): + try: + risky() + except Exception: + logging.exception("Caught exception") + finally: + logging.error("Cleanup step") + + +def compliant_error_in_nested_function(): + try: + risky() + except Exception: + def handle(): + logging.error("Inside nested function, not directly in except") + handle() + + +def compliant_error_in_lambda(): + try: + risky() + except Exception: + handler = lambda: logging.error("Inside lambda, not directly in except") + handler() + + +def compliant_exc_info_false(): + try: + risky() + except Exception: + logging.error("No traceback wanted", exc_info=False) + + +def compliant_named_logger_exc_info_false(): + try: + risky() + except Exception: + logger.error("No traceback wanted", exc_info=False) + + +def compliant_exc_info_none(): + try: + risky() + except Exception: + logging.error("No traceback wanted", exc_info=None) From 54573f4dbcc6b0266a420cd1511e3ba6912aa830 Mon Sep 17 00:00:00 2001 From: Sebastian Zumbrunn Date: Tue, 28 Apr 2026 11:32:54 +0200 Subject: [PATCH 106/322] SONARPY-4127 Fix sq issues (#1086) GitOrigin-RevId: 3b0780d9424ae60ab30504a174d674f08873ffcb --- .../java/org/sonar/python/checks/PredictableSaltCheck.java | 2 +- .../java/org/sonar/python/cfg/ControlFlowGraphBuilder.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/PredictableSaltCheck.java b/python-checks/src/main/java/org/sonar/python/checks/PredictableSaltCheck.java index b433fdbbc..777c86467 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/PredictableSaltCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/PredictableSaltCheck.java @@ -161,7 +161,7 @@ private static boolean hasRaisedOnSameSaltAndDerivedKeyMaterial(RegularArgument return false; } var issue = ctx.addIssue(argument, DIFFERENT_SALT_THAN_KEY_MATERIAL_MESSAGE); - usagesInDeriveCall.stream().forEach(arg -> issue.secondary(arg, SALT_IS_USED_HERE_MESSAGE)); + usagesInDeriveCall.forEach(arg -> issue.secondary(arg, SALT_IS_USED_HERE_MESSAGE)); return true; } diff --git a/python-frontend/src/main/java/org/sonar/python/cfg/ControlFlowGraphBuilder.java b/python-frontend/src/main/java/org/sonar/python/cfg/ControlFlowGraphBuilder.java index f8048f853..d38ecb830 100644 --- a/python-frontend/src/main/java/org/sonar/python/cfg/ControlFlowGraphBuilder.java +++ b/python-frontend/src/main/java/org/sonar/python/cfg/ControlFlowGraphBuilder.java @@ -192,13 +192,13 @@ private PythonCfgBlock build(Statement statement, PythonCfgBlock currentBlock) { private PythonCfgBlock buildClassDefStatement(ClassDef classDef, PythonCfgBlock currentBlock) { PythonCfgBlock block = build(classDef.body().statements(), currentBlock); block.addElement(classDef); - classDef.decorators().stream().forEach(currentBlock::addElement); + classDef.decorators().forEach(currentBlock::addElement); return block; } private static PythonCfgBlock buildFuncDefStatement(FunctionDef functionDef, PythonCfgBlock currentBlock) { currentBlock.addElement(functionDef); - functionDef.decorators().stream().forEach(currentBlock::addElement); + functionDef.decorators().forEach(currentBlock::addElement); return currentBlock; } From 58e2125fc26b8adaee28c86e06fb9a4e481ea832 Mon Sep 17 00:00:00 2001 From: Sebastian Zumbrunn Date: Wed, 29 Apr 2026 13:32:46 +0200 Subject: [PATCH 107/322] SONARPY-4129 S8572: Reduce FPs when logging.error was most likely intentional (#1089) GitOrigin-RevId: 095b7889b8f111175e984d1b707467285d7902e6 --- .../python/checks/LoggingExceptionCheck.java | 48 +++- .../test/resources/checks/loggingException.py | 266 ++++++++++++++---- 2 files changed, 251 insertions(+), 63 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/LoggingExceptionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/LoggingExceptionCheck.java index 79749bc7c..dc78f5e72 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/LoggingExceptionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/LoggingExceptionCheck.java @@ -16,10 +16,15 @@ */ package org.sonar.python.checks; +import javax.annotation.Nullable; import org.sonar.check.Rule; import org.sonar.plugins.python.api.PythonSubscriptionCheck; import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.symbols.v2.SymbolV2; import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.ExceptClause; +import org.sonar.plugins.python.api.tree.FunctionDef; +import org.sonar.plugins.python.api.tree.LambdaExpression; import org.sonar.plugins.python.api.tree.Name; import org.sonar.plugins.python.api.tree.QualifiedExpression; import org.sonar.plugins.python.api.tree.RegularArgument; @@ -32,7 +37,7 @@ @Rule(key = "S8572") public class LoggingExceptionCheck extends PythonSubscriptionCheck { - private static final String MESSAGE = "Use \"logging.exception()\" or explicitly pass \"exc_info=False\"."; + private static final String MESSAGE = "Use \"logging.exception()\" instead."; private static final TypeMatcher LOGGING_ERROR_MATCHER = TypeMatchers.any( TypeMatchers.isType("logging.error"), @@ -40,6 +45,8 @@ public class LoggingExceptionCheck extends PythonSubscriptionCheck { TypeMatchers.isType("logging.LoggerAdapter.error") ); + private static final TypeMatcher TRACEBACK_FORMAT_EXC_MATCHER = TypeMatchers.isType("traceback.format_exc"); + @Override public void initialize(Context context) { context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, LoggingExceptionCheck::checkCall); @@ -53,28 +60,51 @@ private static void checkCall(SubscriptionContext ctx) { if (!LOGGING_ERROR_MATCHER.isTrueFor(qualifiedCallee, ctx)) { return; } - if (!isDirectlyInsideExceptClause(callExpr)) { + ExceptClause exceptClause = findEnclosingExceptClause(callExpr); + if (exceptClause == null) { return; } RegularArgument excInfoArg = TreeUtils.argumentByKeyword("exc_info", callExpr.arguments()); - if (excInfoArg != null && !Expressions.isTruthy(excInfoArg.expression())) { + if (excInfoArg != null) { + if (!Expressions.isTruthy(excInfoArg.expression())) { + return; + } + } else if (!isExceptionLoggedInArgs(callExpr, exceptClause, ctx)) { return; } Name errorName = qualifiedCallee.name(); ctx.addIssue(errorName, MESSAGE); } - private static boolean isDirectlyInsideExceptClause(Tree tree) { + @Nullable + private static ExceptClause findEnclosingExceptClause(Tree tree) { Tree parent = tree.parent(); while (parent != null) { - if (parent.is(Tree.Kind.FUNCDEF, Tree.Kind.LAMBDA)) { - return false; + if (parent instanceof FunctionDef || parent instanceof LambdaExpression) { + return null; } - if (parent.is(Tree.Kind.EXCEPT_CLAUSE, Tree.Kind.EXCEPT_GROUP_CLAUSE)) { - return true; + if (parent instanceof ExceptClause exceptClause) { + return exceptClause; } parent = parent.parent(); } - return false; + return null; + } + + private static boolean isExceptionLoggedInArgs(CallExpression callExpr, ExceptClause exceptClause, SubscriptionContext ctx) { + SymbolV2 exceptionSymbol = exceptClause.exceptionInstance() instanceof Name name ? name.symbolV2() : null; + return callExpr.arguments().stream().anyMatch(arg -> logsException(arg, exceptionSymbol, ctx)); + } + + private static boolean logsException(Tree tree, @Nullable SymbolV2 exceptionSymbol, SubscriptionContext ctx) { + return matchesExceptionLogging(tree, exceptionSymbol, ctx) + || TreeUtils.hasDescendant(tree, t -> matchesExceptionLogging(t, exceptionSymbol, ctx)); + } + + private static boolean matchesExceptionLogging(Tree tree, @Nullable SymbolV2 exceptionSymbol, SubscriptionContext ctx) { + if (exceptionSymbol != null && tree instanceof Name name && exceptionSymbol.equals(name.symbolV2())) { + return true; + } + return tree instanceof CallExpression call && TRACEBACK_FORMAT_EXC_MATCHER.isTrueFor(call.callee(), ctx); } } diff --git a/python-checks/src/test/resources/checks/loggingException.py b/python-checks/src/test/resources/checks/loggingException.py index 243dbff15..213c34e0e 100644 --- a/python-checks/src/test/resources/checks/loggingException.py +++ b/python-checks/src/test/resources/checks/loggingException.py @@ -1,30 +1,218 @@ import logging import sys +import traceback logger = logging.getLogger(__name__) -def noncompliant_bare_except(): +# ---------- Noncompliant: exc_info=True ---------- + +def noncompliant_with_exc_info_true(): + try: + raise RuntimeError("runtime error") + except RuntimeError: + logging.error("Runtime error occurred", exc_info=True) # Noncompliant {{Use "logging.exception()" instead.}} + + +def noncompliant_named_logger_exc_info_true(): try: risky() - except: - logging.error("Something went wrong") # Noncompliant {{Use "logging.exception()" or explicitly pass "exc_info=False".}} + except Exception: + logger.error("Named logger error", exc_info=True) # Noncompliant + + +def noncompliant_exc_info_true_with_as(): + try: + risky() + except Exception as ex: + logging.error("Error", exc_info=True) # Noncompliant + + +# ---------- Noncompliant: exception object referenced in args ---------- + +def noncompliant_fstring_reference(): + try: + risky() + except Exception as ex: + logging.error(f"Error: {ex}") # Noncompliant {{Use "logging.exception()" instead.}} + + +def noncompliant_percent_s_positional(): + try: + risky() + except ValueError as ex: + logging.error("Error: %s", ex) # Noncompliant + + +def noncompliant_percent_formatting(): + try: + risky() + except ValueError as ex: + logging.error("Error: %s" % ex) # Noncompliant + + +def noncompliant_format_method(): + try: + risky() + except ValueError as ex: + logging.error("Error: {}".format(ex)) # Noncompliant + + +def noncompliant_direct_pass(): + try: + risky() + except Exception as ex: + logging.error(ex) # Noncompliant + + +def noncompliant_str_call_in_concat(): + try: + risky() + except Exception as ex: + logging.error("Error: " + str(ex)) # Noncompliant + + +def noncompliant_nested_in_call(): + try: + risky() + except Exception as ex: + logging.error(format_exception(ex)) # Noncompliant + + +def noncompliant_except_group_with_as(): + try: + risky() + except* ValueError as eg: + logging.error(f"Grouped error: {eg}") # Noncompliant + + +def noncompliant_named_logger_with_ref(): + try: + risky() + except Exception as ex: + logger.error(f"Named logger: {ex}") # Noncompliant + + +def noncompliant_with_extra_kwargs(): + try: + risky() + except Exception as ex: + logging.error(f"Error: {ex}", extra={"key": "val"}) # Noncompliant + + +def noncompliant_in_nested_except_with_ref(): + try: + risky() + except ValueError: + try: + other() + except TypeError as ex: + logging.error(f"Nested: {ex}") # Noncompliant + + +class MyService: + def noncompliant_in_method_with_ref(self): + try: + risky() + except Exception as ex: + logging.error("Error in method: %s", ex) # Noncompliant + + +# ---------- Noncompliant: traceback.format_exc() in args ---------- + +def noncompliant_traceback_format_exc(): + try: + risky() + except Exception: + logger.error(traceback.format_exc()) # Noncompliant + + +def noncompliant_traceback_format_exc_in_fstring(): + try: + risky() + except Exception: + logger.error(f"Error: {traceback.format_exc()}") # Noncompliant + + +def noncompliant_traceback_format_exc_positional(): + try: + risky() + except Exception: + logging.error("Error: %s", traceback.format_exc()) # Noncompliant + +def noncompliant_traceback_format_exc_no_as(): + # No `as` clause, but traceback.format_exc() is logged → still raise. + try: + risky() + except ValueError: + logging.error(traceback.format_exc()) # Noncompliant -def noncompliant_typed_except(): + +# ---------- Compliant: no exception involvement (FP fix anchor) ---------- + +def compliant_no_exception_ref_with_as(): + try: + risky() + except Exception as ex: + logging.error("Cleanup failed") + + +def compliant_typed_except_no_as(): try: raise ValueError("bad value") except ValueError: - logging.error("Value error occurred") # Noncompliant + logging.error("Value error occurred") -def noncompliant_with_exc_info_true(): +def compliant_bare_except(): try: - raise RuntimeError("runtime error") - except RuntimeError: - logging.error("Runtime error occurred", exc_info=True) # Noncompliant + risky() + except: + logging.error("Something went wrong") + + +def compliant_except_group_no_as(): + try: + risky() + except* ValueError: + logging.error("Grouped error") + + +def compliant_nested_except_no_as(): + try: + risky() + except ValueError: + try: + other() + except TypeError: + logging.error("Nested error") + + +def compliant_named_logger_no_ref(): + try: + risky() + except Exception: + logger.error("Named logger error") + + +class MyServiceCompliant: + def compliant_in_method_no_ref(self): + try: + risky() + except Exception: + logging.error("Error in method") + + +def compliant_name_shadow(ex): + try: + risky() + except Exception: + logging.error(f"Context: {ex}") +# ---------- Compliant: exc_info explicitly falsy or unknown ---------- + def compliant_with_exc_info_sys(): try: risky() @@ -46,44 +234,35 @@ def compliant_with_exc_info_function_call(): logging.error("Exception occurred", exc_info=should_log_traceback()) -def noncompliant_named_logger(): +def compliant_exc_info_false(): try: risky() except Exception: - logger.error("Named logger error") # Noncompliant {{Use "logging.exception()" or explicitly pass "exc_info=False".}} + logging.error("No traceback wanted", exc_info=False) -def noncompliant_named_logger_exc_info(): +def compliant_named_logger_exc_info_false(): try: risky() except Exception: - logger.error("Named logger error", exc_info=True) # Noncompliant + logger.error("No traceback wanted", exc_info=False) -def noncompliant_nested_except(): +def compliant_exc_info_none(): try: risky() - except ValueError: - try: - other() - except TypeError: - logging.error("Nested error") # Noncompliant + except Exception: + logging.error("No traceback wanted", exc_info=None) -def noncompliant_except_group(): +def compliant_exc_info_false_with_ref(): try: risky() - except* ValueError: - logging.error("Grouped error") # Noncompliant + except Exception as ex: + logging.error(f"Error: {ex}", exc_info=False) -class MyService: - def noncompliant_in_method(self): - try: - risky() - except Exception: - logging.error("Error in method") # Noncompliant - +# ---------- Compliant: not directly inside an except clause ---------- def compliant_logging_exception(): try: @@ -127,36 +306,15 @@ def compliant_error_in_finally(): def compliant_error_in_nested_function(): try: risky() - except Exception: + except Exception as ex: def handle(): - logging.error("Inside nested function, not directly in except") + logging.error(f"Inside nested function: {ex}") handle() def compliant_error_in_lambda(): try: risky() - except Exception: - handler = lambda: logging.error("Inside lambda, not directly in except") + except Exception as ex: + handler = lambda: logging.error(f"Inside lambda: {ex}") handler() - - -def compliant_exc_info_false(): - try: - risky() - except Exception: - logging.error("No traceback wanted", exc_info=False) - - -def compliant_named_logger_exc_info_false(): - try: - risky() - except Exception: - logger.error("No traceback wanted", exc_info=False) - - -def compliant_exc_info_none(): - try: - risky() - except Exception: - logging.error("No traceback wanted", exc_info=None) From 8a45969f1b7a9a930aac010d753b13dba93d2755 Mon Sep 17 00:00:00 2001 From: "sonar-nigel[bot]" <247337653+sonar-nigel[bot]@users.noreply.github.com> Date: Wed, 29 Apr 2026 13:45:31 +0200 Subject: [PATCH 108/322] SONARPY-3972 Rule S8500 Comparison methods should be defined completely (#1034) Co-authored-by: Sonar Vibe Bot Co-authored-by: Sebastian Zumbrunn GitOrigin-RevId: d90cd70b2e2a570011900f7278b29f98b6c83142 --- .../IncompleteComparisonMethodsCheck.java | 128 +++++++ .../python/checks/OpenSourceCheckList.java | 1 + .../org/sonar/l10n/py/rules/python/S8500.html | 108 ++++++ .../org/sonar/l10n/py/rules/python/S8500.json | 25 ++ .../py/rules/python/Sonar_way_profile.json | 1 + .../IncompleteComparisonMethodsCheckTest.java | 28 ++ .../checks/incompleteComparisonMethods.py | 360 ++++++++++++++++++ 7 files changed, 651 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/IncompleteComparisonMethodsCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8500.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8500.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/IncompleteComparisonMethodsCheckTest.java create mode 100644 python-checks/src/test/resources/checks/incompleteComparisonMethods.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/IncompleteComparisonMethodsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/IncompleteComparisonMethodsCheck.java new file mode 100644 index 000000000..b8b3d0718 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/IncompleteComparisonMethodsCheck.java @@ -0,0 +1,128 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.AnnotatedAssignment; +import org.sonar.plugins.python.api.tree.AssignmentStatement; +import org.sonar.plugins.python.api.tree.BaseTreeVisitor; +import org.sonar.plugins.python.api.tree.ClassDef; +import org.sonar.plugins.python.api.tree.Decorator; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.ExpressionList; +import org.sonar.plugins.python.api.tree.FunctionDef; +import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; + +@Rule(key = "S8500") +public class IncompleteComparisonMethodsCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Add the missing comparison methods or use \"functools.total_ordering\"."; + private static final String SECONDARY_MESSAGE = "\"%s\" is defined here."; + + private static final Set ORDERING_METHODS = Set.of("__lt__", "__le__", "__gt__", "__ge__"); + + private static final TypeMatcher TOTAL_ORDERING_MATCHER = TypeMatchers.withFQN("functools.total_ordering"); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.CLASSDEF, IncompleteComparisonMethodsCheck::checkClassDef); + } + + private static void checkClassDef(SubscriptionContext ctx) { + ClassDef classDef = (ClassDef) ctx.syntaxNode(); + + CollectOrderingMethodNamesVisitor visitor = new CollectOrderingMethodNamesVisitor(); + classDef.body().accept(visitor); + + if (visitor.definitions.isEmpty() || visitor.definitions.size() == ORDERING_METHODS.size()) { + return; + } + + for (Decorator decorator : classDef.decorators()) { + if (TOTAL_ORDERING_MATCHER.isTrueFor(decorator.expression(), ctx)) { + return; + } + } + + PreciseIssue issue = ctx.addIssue(classDef.name(), MESSAGE); + visitor.definitions.forEach((name, tree) -> issue.secondary(tree, String.format(SECONDARY_MESSAGE, name))); + } + + /** + * Collects ordering methods defined at the top level of a class body, whether they are + * introduced by a {@code def} or by an assignment such as {@code __lt__ = lambda ...}. + * The map preserves the first occurrence per name in source order, which keeps secondary + * locations stable when a method is shadowed. + * Mirrors the recursion-control pattern of {@code TreeUtils.CollectFunctionDefsVisitor}: + * does not descend into nested classes or nested functions. + */ + private static class CollectOrderingMethodNamesVisitor extends BaseTreeVisitor { + private final Map definitions = new LinkedHashMap<>(); + + @Override + public void visitClassDef(ClassDef nestedClass) { + // Do not descend into nested classes + } + + @Override + public void visitFunctionDef(FunctionDef functionDef) { + Name name = functionDef.name(); + if (ORDERING_METHODS.contains(name.name())) { + definitions.putIfAbsent(name.name(), name); + } + // Do not descend into nested functions + } + + @Override + public void visitAssignmentStatement(AssignmentStatement assignment) { + assignmentTargetName(assignment) + .filter(name -> ORDERING_METHODS.contains(name.name())) + .ifPresent(name -> definitions.putIfAbsent(name.name(), name)); + super.visitAssignmentStatement(assignment); + } + + @Override + public void visitAnnotatedAssignment(AnnotatedAssignment annotated) { + if (annotated.assignedValue() != null && annotated.variable() instanceof Name name && ORDERING_METHODS.contains(name.name())) { + definitions.putIfAbsent(name.name(), name); + } + super.visitAnnotatedAssignment(annotated); + } + + private static Optional assignmentTargetName(AssignmentStatement assignment) { + List lhsList = assignment.lhsExpressions(); + if (lhsList.size() != 1) { + return Optional.empty(); + } + List expressions = lhsList.get(0).expressions(); + if (expressions.size() == 1 && expressions.get(0) instanceof Name name) { + return Optional.of(name); + } + return Optional.empty(); + } + } +} diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 8ac273aa7..8734e9c9c 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -286,6 +286,7 @@ public Stream> getChecks() { ImpossibleBoundariesCheck.class, IncompatibleOperandsCheck.class, InconsistentTupleReturnCheck.class, + IncompleteComparisonMethodsCheck.class, InconsistentTypeHintCheck.class, IncorrectExceptionTypeCheck.class, IncorrectParameterDatetimeConstructorsCheck.class, diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8500.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8500.html new file mode 100644 index 000000000..848e3c36a --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8500.html @@ -0,0 +1,108 @@ +

      This rule raises an issue when a class defines one or more rich comparison methods (__lt__, __le__, __gt__, +__ge__) without using the functools.total_ordering decorator or defining all of them.

      +

      Why is this an issue?

      +

      Python classes can implement rich comparison methods to enable sorting and comparison operations. These methods include:

      +
        +
      • __lt__ for less than (<)
      • +
      • __le__ for less than or equal to (<=)
      • +
      • __gt__ for greater than (>)
      • +
      • __ge__ for greater than or equal to (>=)
      • +
      • __eq__ for equality (==)
      • +
      • __ne__ for inequality (!=)
      • +
      +

      When you define only some of these methods, Python cannot automatically infer the missing ones. This leads to inconsistent behavior:

      +
        +
      • sorting algorithms may fail or produce incorrect results
      • +
      • comparison operations may raise TypeError exceptions
      • +
      • code that expects symmetric comparisons, such as a < b being true implying b > a is also true, may behave + unexpectedly
      • +
      +

      For example, if a class defines only __lt__, then a < b will work, but a > b will fall back to +Python’s default behavior of comparing object identities, which is almost never what you want.

      +

      Python provides the functools.total_ordering decorator specifically to solve this problem. It allows you to define just +__eq__ and one other comparison method, and it automatically generates the rest. This ensures consistent and correct comparison behavior +across all operations.

      +

      What is the potential impact?

      +

      Incomplete comparison method implementations can cause several problems:

      +
        +
      • Sorting failures: built-in functions like sorted() or list methods like sort() may raise exceptions + or produce incorrect ordering
      • +
      • Unexpected comparison results: code that relies on comparison symmetry may produce wrong results, leading to logic errors
      • +
      • Maintenance difficulties: future developers may not realize that certain comparison operations are missing, leading to bugs + when they use those operations
      • +
      • Container behavior: data structures like heaps or priority queues that depend on comparisons may malfunction
      • +
      +

      While this typically will not cause security vulnerabilities, it can lead to application logic errors that are difficult to diagnose and debug.

      +

      How to fix it

      +

      Either use the @functools.total_ordering decorator and define __eq__ and one ordering method, typically +__lt__, or define all four ordering methods (__lt__, __le__, __gt__, __ge__) +explicitly.

      +

      Code examples

      +

      Noncompliant code example

      +
      +class Person:
      +    def __init__(self, name, age):
      +        self.name = name
      +        self.age = age
      +
      +    def __lt__(self, other):  # Noncompliant
      +        return self.age < other.age
      +
      +

      Compliant solution

      +
      +from functools import total_ordering
      +
      +@total_ordering
      +class Person:
      +    def __init__(self, name, age):
      +        self.name = name
      +        self.age = age
      +
      +    def __eq__(self, other):
      +        return self.age == other.age
      +
      +    def __lt__(self, other):
      +        return self.age < other.age
      +
      +

      Noncompliant code example

      +
      +class Point:
      +    def __init__(self, x, y):
      +        self.x = x
      +        self.y = y
      +
      +    def __lt__(self, other):  # Noncompliant
      +        return self.x < other.x
      +
      +

      Compliant solution

      +
      +class Point:
      +    def __init__(self, x, y):
      +        self.x = x
      +        self.y = y
      +
      +    def __lt__(self, other):
      +        return self.x < other.x
      +
      +    def __le__(self, other):
      +        return self.x <= other.x
      +
      +    def __gt__(self, other):
      +        return self.x > other.x
      +
      +    def __ge__(self, other):
      +        return self.x >= other.x
      +
      +

      How does this work?

      +

      The @functools.total_ordering decorator automatically generates all missing comparison methods from the ones you define. This ensures +consistent and correct comparison behavior across all operations.

      +

      Resources

      +

      Documentation

      + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8500.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8500.json new file mode 100644 index 000000000..8f10a3067 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8500.json @@ -0,0 +1,25 @@ +{ + "title": "Comparison methods should be defined completely", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5 min" + }, + "tags": [ + "pitfall", + "comparison" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-8500", + "sqKey": "S8500", + "scope": "All", + "quickfix": "unknown", + "code": { + "impacts": { + "RELIABILITY": "HIGH", + "MAINTAINABILITY": "HIGH" + }, + "attribute": "COMPLETE" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index f8398d22f..825cc9934 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -333,6 +333,7 @@ "S8493", "S8494", "S8495", + "S8500", "S8503", "S8504", "S8505", diff --git a/python-checks/src/test/java/org/sonar/python/checks/IncompleteComparisonMethodsCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/IncompleteComparisonMethodsCheckTest.java new file mode 100644 index 000000000..c65373976 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/IncompleteComparisonMethodsCheckTest.java @@ -0,0 +1,28 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.junit.jupiter.api.Test; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class IncompleteComparisonMethodsCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/incompleteComparisonMethods.py", new IncompleteComparisonMethodsCheck()); + } +} diff --git a/python-checks/src/test/resources/checks/incompleteComparisonMethods.py b/python-checks/src/test/resources/checks/incompleteComparisonMethods.py new file mode 100644 index 000000000..1eed9791b --- /dev/null +++ b/python-checks/src/test/resources/checks/incompleteComparisonMethods.py @@ -0,0 +1,360 @@ +class OnlyLt: # Noncompliant {{Add the missing comparison methods or use "functools.total_ordering".}} +# ^^^^^^ + def __lt__(self, other): +# ^^^^^^< {{"__lt__" is defined here.}} + return self.age < other.age + + +class OnlyGt: # Noncompliant + def __gt__(self, other): + return self.value > other.value + + +class OnlyLe: # Noncompliant + def __le__(self, other): + return self.value <= other.value + + +class OnlyGe: # Noncompliant + def __ge__(self, other): + return self.value >= other.value + + +class TwoMethods: # Noncompliant +# ^^^^^^^^^^ + def __lt__(self, other): +# ^^^^^^< {{"__lt__" is defined here.}} + return self.value < other.value + + def __gt__(self, other): +# ^^^^^^< {{"__gt__" is defined here.}} + return self.value > other.value + + +class ThreeMethods: # Noncompliant + def __lt__(self, other): + return self.value < other.value + + def __le__(self, other): + return self.value <= other.value + + def __gt__(self, other): + return self.value > other.value + + +class EqPlusOneLt: # Noncompliant + def __eq__(self, other): + return self.id == other.id + + def __lt__(self, other): + return self.id < other.id + + +class WithUnrelated: # Noncompliant + def __len__(self): + return 0 + + def __lt__(self, other): + return len(self) < len(other) + + +class OuterWithInner: + class Inner: # Noncompliant + def __lt__(self, other): + return self.x < other.x + + +class WithStaticMethod: # Noncompliant + @staticmethod + def __lt__(other): + return False + + +# A non-functools decorator does not suppress the rule +def my_ordering(cls): + return cls + +@my_ordering +class WithNonFunctoolsDecorator: # Noncompliant + def __lt__(self, other): + return self.x < other.x + + +# Compliant: @total_ordering from functools +from functools import total_ordering + +@total_ordering +class CompliantWithImport: + def __eq__(self, other): + return self.age == other.age + + def __lt__(self, other): + return self.age < other.age + + +# Compliant: @functools.total_ordering (qualified) +import functools + +@functools.total_ordering +class CompliantQualified: + def __eq__(self, other): + return self.degrees == other.degrees + + def __lt__(self, other): + return self.degrees < other.degrees + + +# Compliant: @ft.total_ordering via aliased import +import functools as ft + +@ft.total_ordering +class CompliantAlias: + def __eq__(self, other): + return self.x == other.x + + def __lt__(self, other): + return self.x < other.x + + +class AllFourMethods: + def __lt__(self, other): + return self.value < other.value + + def __le__(self, other): + return self.value <= other.value + + def __gt__(self, other): + return self.value > other.value + + def __ge__(self, other): + return self.value >= other.value + + +class NoOrderingMethods: + def __eq__(self, other): + return self.x == other.x + + def __ne__(self, other): + return self.x != other.x + + +class EmptyClass: + pass + + +class OuterCompliant: + @total_ordering + class Inner: + def __eq__(self, other): + return self.x == other.x + + def __lt__(self, other): + return self.x < other.x + + +class WithInnerFunction: # Noncompliant + def __lt__(self, other): + def helper(): + pass + return self.x < other.x + + +class ThreeMethodsWithGe: # Noncompliant + def __lt__(self, other): + return self.value < other.value + + def __gt__(self, other): + return self.value > other.value + + def __ge__(self, other): + return self.value >= other.value + + +@my_ordering +@total_ordering +class MultipleDecoratorsCompliant: + def __eq__(self, other): + return self.x == other.x + + def __lt__(self, other): + return self.x < other.x + + +@total_ordering +@my_ordering +class TotalOrderingFirstCompliant: + def __eq__(self, other): + return self.x == other.x + + def __lt__(self, other): + return self.x < other.x + + +class ParentWithAllFour: + def __lt__(self, other): + return self.value < other.value + + def __le__(self, other): + return self.value <= other.value + + def __gt__(self, other): + return self.value > other.value + + def __ge__(self, other): + return self.value >= other.value + + +class ChildDefiningOnlyLt(ParentWithAllFour): # Noncompliant + def __lt__(self, other): + return self.value < other.value + + +@my_ordering +@my_ordering +class TwoNonFunctoolsDecorators: # Noncompliant + def __lt__(self, other): + return self.x < other.x + + +# Compliant: __lt__ and __gt__ defined as lambda assignments, __le__ and __ge__ as `def`. +# Real-world example: nltk/probability.py (FreqDist). +class MixedDefAndLambda: + def __le__(self, other): + return self.value <= other.value + + def __ge__(self, other): + return self.value >= other.value + + __lt__ = lambda self, other: self <= other and not self.value == other.value + __gt__ = lambda self, other: self >= other and not self.value == other.value + + +# Compliant: one `def`-defined method and three lambda-assigned methods. +# Real-world example: nltk/tree/tree.py (Tree). +class OneDefThreeLambdas: + def __lt__(self, other): + return self.value < other.value + + __gt__ = lambda self, other: not (self < other or self.value == other.value) + __le__ = lambda self, other: self < other or self.value == other.value + __ge__ = lambda self, other: not self < other + + +# Compliant: all four methods defined via assignments (e.g. function references or partials). +def _lt(self, other): return self.value < other.value +def _le(self, other): return self.value <= other.value +def _gt(self, other): return self.value > other.value +def _ge(self, other): return self.value >= other.value + +class AllFourViaAssignments: + __lt__ = _lt + __le__ = _le + __gt__ = _gt + __ge__ = _ge + + +# Compliant: annotated assignments with lambdas count toward the four. +from typing import Callable + +class AnnotatedLambdaAssignments: + __lt__: Callable = lambda self, other: self.value < other.value + __le__: Callable = lambda self, other: self.value <= other.value + __gt__: Callable = lambda self, other: self.value > other.value + __ge__: Callable = lambda self, other: self.value >= other.value + + +# Only one distinct ordering method name even with a duplicate `def` and lambda — should raise. +# The `def` definition is collected first, so it carries the secondary location. +class OneDistinctNameWithDuplicates: # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + def __lt__(self, other): +# ^^^^^^< {{"__lt__" is defined here.}} + return self.value < other.value + + __lt__ = lambda self, other: self.value < other.value + + +# Duplicate `__lt__` definitions — three distinct names total — should still raise. +# Only the first occurrence of `__lt__` carries a secondary location. +class DuplicateLtMissingGe: # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^ + def __lt__(self, other): +# ^^^^^^< {{"__lt__" is defined here.}} + return self.value < other.value + + def __lt__(self, other): + return self.value < other.value + + def __le__(self, other): +# ^^^^^^< {{"__le__" is defined here.}} + return self.value <= other.value + + def __gt__(self, other): +# ^^^^^^< {{"__gt__" is defined here.}} + return self.value > other.value + + +# Compliant: duplicate `__lt__` definitions plus all four distinct names — must not raise. +class DuplicateLtAllFourPresent: + def __lt__(self, other): + return self.value < other.value + + def __lt__(self, other): + return self.value < other.value + + def __le__(self, other): + return self.value <= other.value + + def __gt__(self, other): + return self.value > other.value + + def __ge__(self, other): + return self.value >= other.value + + +# Known FP: rule does not consider comparison methods inherited from parent classes. +# Real-world example: nltk/tree/probabilistic.py (ProbabilisticTree) overrides only __lt__ +# while inheriting __gt__/__le__/__ge__ as lambdas from its parent — all four comparisons +# are consistent at runtime, but the rule sees only one method in the subclass body. +# Tracked as a follow-up of SONARPY-3972. +class SubclassOverridingLtWithLambdaParent(MixedDefAndLambda): # Noncompliant + def __lt__(self, other): + return self.value < other.value + + +# Class-body assignments that are not single-name targets must not affect detection. +# Chained assignments, tuple unpacking, and attribute targets exercise the early-return +# branches in the assignment-target name extraction. +class _Holder: + attr = 0 + +class WithUnusualAssignments: + a = b = 10 + x, y = 1, 2 + _Holder.attr = 5 + _Holder.annotated_attr: int = 5 + + def __lt__(self, other): + return self.value < other.value + + def __le__(self, other): + return self.value <= other.value + + def __gt__(self, other): + return self.value > other.value + + def __ge__(self, other): + return self.value >= other.value + + +# Annotated assignment without an assigned value: must be ignored (treated as no ordering method). +class AnnotatedWithoutValue: + __lt__: Callable + + +# Annotated assignment with a non-ordering method name: must not affect detection. +class AnnotatedNonOrdering: # Noncompliant + counter: int = 0 + + def __lt__(self, other): + return self.value < other.value From 9a904956de8b2f90f756b28f8b4fe0b7da9bcdb2 Mon Sep 17 00:00:00 2001 From: "sonar-nigel[bot]" <247337653+sonar-nigel[bot]@users.noreply.github.com> Date: Wed, 29 Apr 2026 13:56:46 +0200 Subject: [PATCH 109/322] SONARPY-4043 Rule S8554 Logging statements should follow Python best practices (#1085) Co-authored-by: Sonar Vibe Bot Co-authored-by: Sebastian Zumbrunn GitOrigin-RevId: c27ebb0da4f66b0bb54a3429d55eb262654b80a0 --- .../checks/LoggingBestPracticesCheck.java | 148 ++++++++++++++++++ .../python/checks/OpenSourceCheckList.java | 1 + .../org/sonar/l10n/py/rules/python/S8554.html | 69 ++++++++ .../org/sonar/l10n/py/rules/python/S8554.json | 26 +++ .../py/rules/python/Sonar_way_profile.json | 1 + .../checks/LoggingBestPracticesCheckTest.java | 28 ++++ .../resources/checks/loggingBestPractices.py | 131 ++++++++++++++++ 7 files changed, 404 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/LoggingBestPracticesCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8554.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8554.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/LoggingBestPracticesCheckTest.java create mode 100644 python-checks/src/test/resources/checks/loggingBestPractices.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/LoggingBestPracticesCheck.java b/python-checks/src/main/java/org/sonar/python/checks/LoggingBestPracticesCheck.java new file mode 100644 index 000000000..034a002fb --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/LoggingBestPracticesCheck.java @@ -0,0 +1,148 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.Set; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.BinaryExpression; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.DictionaryLiteral; +import org.sonar.plugins.python.api.tree.DictionaryLiteralElement; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.KeyValuePair; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.StringLiteral; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.tree.TreeUtils; + +@Rule(key = "S8554") +public class LoggingBestPracticesCheck extends PythonSubscriptionCheck { + + private static final TypeMatcher LOGGING_CALL_MATCHER = TypeMatchers.any( + TypeMatchers.isType("logging.debug"), + TypeMatchers.isType("logging.info"), + TypeMatchers.isType("logging.warning"), + TypeMatchers.isType("logging.warn"), + TypeMatchers.isType("logging.error"), + TypeMatchers.isType("logging.exception"), + TypeMatchers.isType("logging.critical"), + TypeMatchers.isType("logging.Logger.debug"), + TypeMatchers.isType("logging.Logger.info"), + TypeMatchers.isType("logging.Logger.warning"), + TypeMatchers.isType("logging.Logger.warn"), + TypeMatchers.isType("logging.Logger.error"), + TypeMatchers.isType("logging.Logger.exception"), + TypeMatchers.isType("logging.Logger.critical") + ); + + private static final TypeMatcher DEPRECATED_WARN_MATCHER = TypeMatchers.any( + TypeMatchers.isType("logging.warn"), + TypeMatchers.isType("logging.Logger.warn") + ); + + private static final TypeMatcher STR_FORMAT_MATCHER = TypeMatchers.isType("str.format"); + + private static final Set LOG_RECORD_ATTRIBUTES = new HashSet<>(Arrays.asList( + "name", "msg", "args", "created", "filename", "funcName", "levelname", "levelno", + "lineno", "module", "msecs", "message", "pathname", "process", "processName", + "relativeCreated", "thread", "threadName", "exc_info", "exc_text", "stack_info", + "taskName", "asctime" + )); + + private static final String EAGER_FORMAT_MESSAGE = + "Pass formatting arguments to the logging call instead of pre-formatting the message string."; + private static final String DEPRECATED_WARN_MESSAGE = + "Use \"warning\" instead of the deprecated \"warn\" method."; + private static final String EXTRA_COLLISION_MESSAGE = + "Remove or rename this key; it overrides a built-in LogRecord attribute."; + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, LoggingBestPracticesCheck::checkLoggingCall); + } + + private static void checkLoggingCall(SubscriptionContext ctx) { + CallExpression call = (CallExpression) ctx.syntaxNode(); + if (!LOGGING_CALL_MATCHER.isTrueFor(call.callee(), ctx)) { + return; + } + + if (DEPRECATED_WARN_MATCHER.isTrueFor(call.callee(), ctx)) { + ctx.addIssue(call.callee(), DEPRECATED_WARN_MESSAGE); + } + + List positionalArgs = call.arguments().stream() + .flatMap(TreeUtils.toStreamInstanceOfMapper(RegularArgument.class)) + .filter(arg -> arg.keywordArgument() == null) + .toList(); + + if (!positionalArgs.isEmpty()) { + checkEagerFormatting(ctx, positionalArgs.get(0).expression()); + } + + checkExtraAttributeCollision(ctx, call); + } + + private static void checkEagerFormatting(SubscriptionContext ctx, Expression expr) { + if (expr instanceof StringLiteral literal) { + boolean isFString = literal.stringElements().stream() + .anyMatch(e -> e.prefix().toLowerCase(Locale.ENGLISH).contains("f") && !e.formattedExpressions().isEmpty()); + if (isFString) { + ctx.addIssue(expr, EAGER_FORMAT_MESSAGE); + } + } else if (expr instanceof CallExpression innerCall && STR_FORMAT_MATCHER.isTrueFor(innerCall.callee(), ctx)) { + ctx.addIssue(expr, EAGER_FORMAT_MESSAGE); + } else if (expr.is(Tree.Kind.MODULO) && containsStringLiteral(((BinaryExpression) expr).leftOperand())) { + ctx.addIssue(expr, EAGER_FORMAT_MESSAGE); + } else if (expr.is(Tree.Kind.PLUS) && containsStringLiteral(expr)) { + ctx.addIssue(expr, EAGER_FORMAT_MESSAGE); + } + } + + private static boolean containsStringLiteral(Expression expr) { + if (expr instanceof StringLiteral) { + return true; + } + if (expr.is(Tree.Kind.PLUS)) { + BinaryExpression plus = (BinaryExpression) expr; + return containsStringLiteral(plus.leftOperand()) || containsStringLiteral(plus.rightOperand()); + } + return false; + } + + private static void checkExtraAttributeCollision(SubscriptionContext ctx, CallExpression call) { + RegularArgument extraArg = TreeUtils.argumentByKeyword("extra", call.arguments()); + if (extraArg == null || !(extraArg.expression() instanceof DictionaryLiteral dict)) { + return; + } + for (DictionaryLiteralElement element : dict.elements()) { + if (element instanceof KeyValuePair kvp + && kvp.key() instanceof StringLiteral key + && LOG_RECORD_ATTRIBUTES.contains(key.trimmedQuotesValue())) { + ctx.addIssue(key, EXTRA_COLLISION_MESSAGE); + } + } + } +} diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 8734e9c9c..14b97f244 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -314,6 +314,7 @@ public Stream> getChecks() { LocalVariableAndParameterNameConventionCheck.class, LoggersConfigurationCheck.class, LoggingExceptionCheck.class, + LoggingBestPracticesCheck.class, LongIntegerWithLowercaseSuffixUsageCheck.class, LoopExecutingAtMostOnceCheck.class, LoopOverDictKeyValuesCheck.class, diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8554.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8554.html new file mode 100644 index 000000000..2d7db3566 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8554.html @@ -0,0 +1,69 @@ +

      This rule raises an issue when logging statements violate established Python logging best practices, including using eager string formatting, +deprecated methods, or attribute name collisions in the 'extra' parameter.

      +

      Why is this an issue?

      +

      Python’s logging module has specific patterns that ensure correctness, performance, and maintainability. Violating these patterns can lead to +several problems:

      +

      Eager String Formatting

      +

      When you format strings before passing them to logging methods (using f-strings, .format(), % operator, or + +concatenation), Python performs the string formatting operation immediately, even if the log message won’t be output due to the current log level. +This wastes CPU cycles on string operations that may never be used.

      +

      The logging module supports lazy formatting by accepting format arguments as separate parameters. The formatting only occurs when the logging +framework confirms the message will actually be logged based on the configured log level.

      +

      Deprecated Methods

      +

      The logging.warn() and logging.Logger.warn() methods are deprecated. While they still function, they may be removed in +future Python versions. The recommended methods are logging.warning() and logging.Logger.warning(), which are functionally +equivalent.

      +

      Attribute Name Collisions

      +

      The logging module’s extra keyword argument allows passing additional values to be included in log records. However, if the keys in +the extra dictionary clash with built-in LogRecord attributes (such as 'name', 'msg', 'args', 'created', 'filename', +'funcName', 'levelname', 'levelno', 'lineno', 'module', 'msecs', 'message', 'pathname', 'process', 'processName', 'relativeCreated', 'thread', +'threadName'), a KeyError will be raised when the LogRecord is constructed, causing the logging statement to fail at +runtime.

      +

      What is the potential impact?

      +

      Performance Degradation

      +

      Eager string formatting can significantly impact application performance, especially in code paths with frequent logging statements. When log +levels are configured to filter out certain messages (e.g., DEBUG messages in production), the application still pays the cost of formatting strings +that will never be logged.

      +

      Runtime Errors

      +

      Attribute name collisions in the extra parameter raise KeyError exceptions, causing logging statements to fail +unexpectedly.

      +

      Maintenance Issues

      +

      Using deprecated methods creates technical debt. When these methods are eventually removed from Python, code using them will break. Additionally, +mixing deprecated and non-deprecated methods across a codebase creates inconsistency and confusion.

      +

      Inconsistent Logging

      +

      Eager formatting can lead to inconsistent behavior across different log handlers. When using lazy formatting with the extra parameter, +all handlers receive the same structured data and can format it consistently according to their configuration.

      +

      How to fix it

      +

      Use lazy formatting by passing format arguments as separate parameters to logging methods instead of formatting strings before the call. Replace +f-strings, .format(), % operator, and + concatenation with %-style placeholders and separate arguments.

      +

      Code examples

      +

      Noncompliant code example

      +
      +import logging
      +
      +user = "Maria"
      +logging.info(f"{user} - Something happened")  # Noncompliant: f-string formatting
      +
      +logging.info("{} - Something happened".format(user))  # Noncompliant: .format() method
      +
      +logging.info("%s - Something happened" % user)  # Noncompliant: % operator formatting
      +
      +logging.info(user + " - Something happened")  # Noncompliant: string concatenation
      +
      +

      Compliant solution

      +
      +import logging
      +
      +user = "Maria"
      +logging.info("%s - Something happened", user)  # Compliant: lazy formatting with separate argument
      +
      +

      Resources

      +

      Documentation

      + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8554.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8554.json new file mode 100644 index 000000000..550aae68b --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8554.json @@ -0,0 +1,26 @@ +{ + "title": "Logging statements should follow Python best practices", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "convention", + "performance", + "pitfall" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-8554", + "sqKey": "S8554", + "scope": "All", + "quickfix": "unknown", + "code": { + "impacts": { + "RELIABILITY": "LOW", + "MAINTAINABILITY": "HIGH" + }, + "attribute": "CONVENTIONAL" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 825cc9934..0b91a6bcd 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -344,6 +344,7 @@ "S8519", "S8520", "S8521", + "S8554", "S8572" ] } diff --git a/python-checks/src/test/java/org/sonar/python/checks/LoggingBestPracticesCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/LoggingBestPracticesCheckTest.java new file mode 100644 index 000000000..1e35aa629 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/LoggingBestPracticesCheckTest.java @@ -0,0 +1,28 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.junit.jupiter.api.Test; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class LoggingBestPracticesCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/loggingBestPractices.py", new LoggingBestPracticesCheck()); + } +} diff --git a/python-checks/src/test/resources/checks/loggingBestPractices.py b/python-checks/src/test/resources/checks/loggingBestPractices.py new file mode 100644 index 000000000..00dba19f6 --- /dev/null +++ b/python-checks/src/test/resources/checks/loggingBestPractices.py @@ -0,0 +1,131 @@ +import logging + +logger = logging.getLogger(__name__) + +user = "Maria" +count = 42 + + +# ==== Eager string formatting: f-string ==== + +logging.info(f"{user} - Something happened") # Noncompliant {{Pass formatting arguments to the logging call instead of pre-formatting the message string.}} +logger.info(f"{user} logged in") # Noncompliant {{Pass formatting arguments to the logging call instead of pre-formatting the message string.}} + + +# ==== Eager string formatting: .format() ==== + +logging.debug("{} - Something happened".format(user)) # Noncompliant {{Pass formatting arguments to the logging call instead of pre-formatting the message string.}} +logger.debug("{}".format(user)) # Noncompliant {{Pass formatting arguments to the logging call instead of pre-formatting the message string.}} + + +# ==== Eager string formatting: % operator ==== + +logging.warning("%s - Something happened" % user) # Noncompliant {{Pass formatting arguments to the logging call instead of pre-formatting the message string.}} +logger.warning("%s err" % user) # Noncompliant {{Pass formatting arguments to the logging call instead of pre-formatting the message string.}} + + +# ==== Eager string formatting: + concatenation ==== + +logging.error("Error: " + user) # Noncompliant {{Pass formatting arguments to the logging call instead of pre-formatting the message string.}} +logging.critical(user + " triggered critical") # Noncompliant {{Pass formatting arguments to the logging call instead of pre-formatting the message string.}} +logger.error("User: " + user + " failed") # Noncompliant {{Pass formatting arguments to the logging call instead of pre-formatting the message string.}} + + +# ==== Deprecated warn method ==== + +logging.warn("Something happened") # Noncompliant {{Use "warning" instead of the deprecated "warn" method.}} +logger.warn("Something happened") # Noncompliant {{Use "warning" instead of the deprecated "warn" method.}} + + +# ==== Extra attribute name collisions ==== + +logging.info("msg", extra={"name": "override"}) # Noncompliant {{Remove or rename this key; it overrides a built-in LogRecord attribute.}} +logging.info("msg", extra={"message": "val"}) # Noncompliant {{Remove or rename this key; it overrides a built-in LogRecord attribute.}} +logging.info("msg", extra={"levelname": "DEBUG"}) # Noncompliant {{Remove or rename this key; it overrides a built-in LogRecord attribute.}} +logging.info("msg", extra={"filename": "app.py"}) # Noncompliant {{Remove or rename this key; it overrides a built-in LogRecord attribute.}} +logging.info("msg", extra={"lineno": 42}) # Noncompliant {{Remove or rename this key; it overrides a built-in LogRecord attribute.}} +logging.info("msg", extra={"thread": 1}) # Noncompliant {{Remove or rename this key; it overrides a built-in LogRecord attribute.}} +logging.info("msg", extra={"process": 2}) # Noncompliant {{Remove or rename this key; it overrides a built-in LogRecord attribute.}} +logging.info("msg", extra={"exc_text": "custom"}) # Noncompliant {{Remove or rename this key; it overrides a built-in LogRecord attribute.}} +logging.info("msg", extra={"stack_info": "custom"}) # Noncompliant {{Remove or rename this key; it overrides a built-in LogRecord attribute.}} +logging.info("msg", extra={"asctime": "custom"}) # Noncompliant {{Remove or rename this key; it overrides a built-in LogRecord attribute.}} + + +# ==== logging.exception ==== + +logging.exception(f"{user} failed") # Noncompliant {{Pass formatting arguments to the logging call instead of pre-formatting the message string.}} +logger.exception("Error: " + user) # Noncompliant {{Pass formatting arguments to the logging call instead of pre-formatting the message string.}} +logging.exception("msg", extra={"name": "override"}) # Noncompliant {{Remove or rename this key; it overrides a built-in LogRecord attribute.}} + + +# ==== Compliant: lazy formatting ==== + +logging.info("%s - Something happened", user) +logging.debug("User %s did %d actions", user, count) +logging.warning("Count is %d", count) +logger.info("%s logged in", user) +logger.debug("User %s did %d actions", user, count) +logger.error("Error for %s", user) +logger.critical("Critical for %s", user) + + +# ==== Compliant: plain string messages ==== + +logging.info("Application started") +logging.error("An unexpected error occurred") +logger.warning("Low memory warning") + + +# ==== Compliant: non-deprecated methods ==== + +logging.warning("Something happened") +logger.warning("Something happened") + + +# ==== Compliant: valid format specifiers ==== + +logging.info("Value: %s", user) +logging.debug("Count: %d, ratio: %f", count, 3.14) +logging.info("Hex: %x, oct: %o", count, count) +logging.debug("Repr: %r", user) +logging.info("100%% done") + + +# ==== Compliant: extra with custom (non-reserved) keys ==== + +logging.info("Request processed", extra={"request_id": "abc123", "duration_ms": 42}) +logger.info("User action", extra={"user_id": 99, "action": "login"}) + + +# ==== Compliant: exc_info keyword argument ==== + +try: + pass +except Exception: + logging.error("Something failed", exc_info=True) + + +# ==== Compliant: no positional arguments ==== + +logging.info() +logging.debug("Static message with no format args") + + +# ==== Compliant: extra with ** unpacking (FN accepted) ==== + +extra_data = {"name": "override"} +logging.info("msg", extra=extra_data) +logging.info("msg", extra={**extra_data}) + + +# ==== Compliant: + with non-string operands ==== + +a = 1 +b = 2 +logging.info("%d", a + b) +logging.info("%d", a % b) + + +# ==== Compliant: empty f-string (no formatted expressions) ==== + +logging.info(f"static message") From 45b742e222a2d1f776f2857820ec099b1d8be76a Mon Sep 17 00:00:00 2001 From: "sonar-nigel[bot]" <247337653+sonar-nigel[bot]@users.noreply.github.com> Date: Wed, 29 Apr 2026 15:17:53 +0200 Subject: [PATCH 110/322] SONARPY-3991 Rule S8514 Dataclass attributes should use type annotations (#1017) GitOrigin-RevId: 3535711f601fecbb4368b28f8f07e1632c74d2a5 --- .../checks/DataclassFieldDefinitionCheck.java | 70 +++++++ .../python/checks/OpenSourceCheckList.java | 1 + .../org/sonar/l10n/py/rules/python/S8514.html | 42 ++++ .../org/sonar/l10n/py/rules/python/S8514.json | 25 +++ .../py/rules/python/Sonar_way_profile.json | 1 + .../DataclassFieldDefinitionCheckTest.java | 29 +++ .../checks/dataclassFieldDefinition.py | 195 ++++++++++++++++++ 7 files changed, 363 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/DataclassFieldDefinitionCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8514.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8514.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/DataclassFieldDefinitionCheckTest.java create mode 100644 python-checks/src/test/resources/checks/dataclassFieldDefinition.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/DataclassFieldDefinitionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/DataclassFieldDefinitionCheck.java new file mode 100644 index 000000000..f0d517a79 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/DataclassFieldDefinitionCheck.java @@ -0,0 +1,70 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.AssignmentStatement; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.ClassDef; +import org.sonar.plugins.python.api.tree.Decorator; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; + +@Rule(key = "S8514") +public class DataclassFieldDefinitionCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE_MISSING_ANNOTATION = "Add a type annotation to this dataclass attribute."; + + private static final TypeMatcher IS_DATACLASS = TypeMatchers.isType("dataclasses.dataclass"); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.CLASSDEF, DataclassFieldDefinitionCheck::checkClassDef); + } + + private static void checkClassDef(SubscriptionContext ctx) { + ClassDef classDef = (ClassDef) ctx.syntaxNode(); + + if (!isDataclass(classDef, ctx)) { + return; + } + + classDef.body().statements().forEach(statement -> checkStatement(ctx, statement)); + } + + private static boolean isDataclass(ClassDef classDef, SubscriptionContext ctx) { + return classDef.decorators().stream().anyMatch(decorator -> isDataclassDecorator(decorator, ctx)); + } + + private static boolean isDataclassDecorator(Decorator decorator, SubscriptionContext ctx) { + Expression expression = decorator.expression(); + if (expression instanceof CallExpression callExpr) { + return IS_DATACLASS.isTrueFor(callExpr.callee(), ctx); + } + return IS_DATACLASS.isTrueFor(expression, ctx); + } + + private static void checkStatement(SubscriptionContext ctx, Tree statement) { + if (statement instanceof AssignmentStatement assignmentStatement) { + ctx.addIssue(assignmentStatement, MESSAGE_MISSING_ANNOTATION); + } + } +} diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 14b97f244..9e542dc3e 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -182,6 +182,7 @@ public Stream> getChecks() { CorsMiddlewareOrderingCheck.class, CsrfDisabledCheck.class, DataClassOnEnumCheck.class, + DataclassFieldDefinitionCheck.class, DataEncryptionCheck.class, DbNoPasswordCheck.class, DeadStoreCheck.class, diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8514.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8514.html new file mode 100644 index 000000000..0a8d9c4bf --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8514.html @@ -0,0 +1,42 @@ +

      This rule raises an issue when a dataclass contains attributes without type annotations.

      +

      Why is this an issue?

      +

      The @dataclass decorator only processes attributes that have type annotations. Attributes without annotations are silently excluded +from dataclass processing and become regular class variables instead of instance attributes. This means:

      +
        +
      • they are not included in the generated \__init__ method
      • +
      • they are not part of \__repr__ or \__eq__
      • +
      • they behave as class variables, not instance variables
      • +
      +

      What is the potential impact?

      +

      Unannotated attributes are silently excluded from initialization, \__repr__, and \__eq__, making them invisible to the +dataclass contract. These bugs are difficult to trace because the class appears to work normally, but the affected attributes do not participate in +any of the generated methods.

      +

      How to fix it

      +

      Add type annotations to all attributes that should be dataclass fields. If you intend an attribute to be a class variable shared across instances, +move it outside the dataclass or document this intention clearly.

      +

      Code examples

      +

      Noncompliant code example

      +
      +from dataclasses import dataclass
      +
      +@dataclass
      +class Config:
      +    timeout = 30  # Noncompliant: missing type annotation
      +    retries = 3   # Noncompliant: missing type annotation
      +
      +

      Compliant solution

      +
      +from dataclasses import dataclass
      +
      +@dataclass
      +class Config:
      +    timeout: int = 30
      +    retries: int = 3
      +
      +

      Resources

      +

      Documentation

      + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8514.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8514.json new file mode 100644 index 000000000..bcf007808 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8514.json @@ -0,0 +1,25 @@ +{ + "title": "Dataclass attributes should use type annotations", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "pitfall", + "confusing" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-8514", + "sqKey": "S8514", + "scope": "All", + "quickfix": "targeted", + "code": { + "impacts": { + "RELIABILITY": "HIGH", + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "CONVENTIONAL" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 0b91a6bcd..a03595653 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -339,6 +339,7 @@ "S8505", "S8507", "S8513", + "S8514", "S8516", "S8517", "S8519", diff --git a/python-checks/src/test/java/org/sonar/python/checks/DataclassFieldDefinitionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/DataclassFieldDefinitionCheckTest.java new file mode 100644 index 000000000..386430568 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/DataclassFieldDefinitionCheckTest.java @@ -0,0 +1,29 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.junit.jupiter.api.Test; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class DataclassFieldDefinitionCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/dataclassFieldDefinition.py", new DataclassFieldDefinitionCheck()); + } + +} diff --git a/python-checks/src/test/resources/checks/dataclassFieldDefinition.py b/python-checks/src/test/resources/checks/dataclassFieldDefinition.py new file mode 100644 index 000000000..1f77c4430 --- /dev/null +++ b/python-checks/src/test/resources/checks/dataclassFieldDefinition.py @@ -0,0 +1,195 @@ +from dataclasses import dataclass, field, InitVar +from datetime import datetime +from typing import ClassVar, Optional + + +# ======================= +# Issues +# ======================= + +@dataclass +class SingleUnannotatedAttribute: + timeout = 30 # Noncompliant {{Add a type annotation to this dataclass attribute.}} +# ^^^^^^^^^^^^ + + +@dataclass +class MultipleUnannotatedAttributes: + timeout = 30 # Noncompliant {{Add a type annotation to this dataclass attribute.}} +# ^^^^^^^^^^^^ + retries = 3 # Noncompliant {{Add a type annotation to this dataclass attribute.}} +# ^^^^^^^^^^^ + + +@dataclass +class MixedAnnotatedAndUnannotated: + name: str = "default" + timeout = 30 # Noncompliant +# ^^^^^^^^^^^^ + + +@dataclass(frozen=True) +class FrozenDataclassUnannotated: + timeout = 30 # Noncompliant + + +@dataclass +class MultipleViolations: + unannotated = 42 # Noncompliant + other = "value" # Noncompliant + + +import dataclasses + +@dataclasses.dataclass +class QualifiedDecoratorNoncompliant: + unannotated = 42 # Noncompliant + + +@dataclass +class ChildDataclassWithViolation: + unannotated = 99 # Noncompliant + extra: int = 0 + + +def outer_function(): + # FN: type inference resolves `@dataclass` to Unknown when the decorated class is nested in a function + @dataclass + class InnerDataclass: + value = 10 + name: str = "" + + +# ======================= +# Compliant +# ======================= + +class RegularClassWithUnannotatedAttrs: + timeout = 30 + retries = 3 + + +@dataclass +class ImmutableScalarDefaults: + count: int = 0 + name: str = "" + flag: bool = False + ratio: float = 1.0 + + +@dataclass +class NoneDefault: + opt: Optional[str] = None + + +@dataclass +class MutableDefaultsAreNotFlagged: + members: list = [] + config: dict = {} + tags: set = {1, 2} + + +@dataclass +class CallDefaultsAreNotFlagged: + items: list = list() + config: dict = dict() + buffer: bytearray = bytearray() + created_at: datetime = datetime.now() + allowed: frozenset = frozenset([1, 2, 3]) + tags: set = set() + + +@dataclass +class FieldDefaultFactoryCompliant: + members: list = field(default_factory=list) + config: dict = field(default_factory=dict) + created_at: datetime = field(default_factory=datetime.now) + + +@dataclass +class FieldDefaultCompliant: + count: int = field(default=0) + name: str = field(default="hello") + derived: int = field(init=False, default=0) + + +@dataclass +class ClassVarAnnotations: + count: ClassVar[int] = 5 + items: ClassVar[list] = [] + metadata: ClassVar[dict] = {} + + +@dataclass +class ClassVarBareForm: + count: ClassVar = 0 + + +@dataclass +class InitVarAnnotations: + init_value: InitVar[int] = 1 + init_param: InitVar[str] = "default" + + +@dataclass +class NoDefaultAnnotatedFields: + x: float + y: int + name: str + + +@dataclass +class OptionalWithNoneDefault: + label: Optional[str] = None + + +@dataclass(frozen=True) +class FrozenDataclassCompliant: + name: str = "" + items: list = field(default_factory=list) + + +@dataclasses.dataclass +class QualifiedDecoratorCompliant: + name: str = "" + count: int = 0 + + +def make_default_list(): + return [] + +@dataclass +class CustomFactoryCompliant: + items: list = field(default_factory=make_default_list) + + +@dataclass +class TupleLiteralDefault: + coords: tuple = (0, 0) + + +@dataclass +class NestedCallDefault: + value: str = str(object()) + + +@dataclass +class EmptyDataclass: + pass + + +@dataclass +class DataclassWithOnlyMethods: + name: str + + def get_name(self) -> str: + return self.name + + +@dataclass +class ParentDataclass: + name: str = "" + + +class NonDataclassChild(ParentDataclass): + unannotated = 99 From 3825a6177e0dc3d4b45b23c1e5125cee4a387ac3 Mon Sep 17 00:00:00 2001 From: Guillaume Dequenne Date: Thu, 30 Apr 2026 09:47:47 +0200 Subject: [PATCH 111/322] SONARPY-4109 Implement S8685 Function calls should not be used as default values in dataclass attributes (#1071) GitOrigin-RevId: c50f02aec7cc528ce74f47465ab571ef44bb8b02 --- .../DataClassFunctionCallDefaultCheck.java | 224 ++++++++++++++ .../python/checks/OpenSourceCheckList.java | 1 + .../org/sonar/l10n/py/rules/python/S8685.html | 72 +++++ .../org/sonar/l10n/py/rules/python/S8685.json | 24 ++ .../py/rules/python/Sonar_way_profile.json | 3 +- ...DataClassFunctionCallDefaultCheckTest.java | 28 ++ .../checks/dataClassFunctionCallDefault.py | 292 ++++++++++++++++++ 7 files changed, 643 insertions(+), 1 deletion(-) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/DataClassFunctionCallDefaultCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8685.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8685.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/DataClassFunctionCallDefaultCheckTest.java create mode 100644 python-checks/src/test/resources/checks/dataClassFunctionCallDefault.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/DataClassFunctionCallDefaultCheck.java b/python-checks/src/main/java/org/sonar/python/checks/DataClassFunctionCallDefaultCheck.java new file mode 100644 index 000000000..91444c853 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/DataClassFunctionCallDefaultCheck.java @@ -0,0 +1,224 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import java.util.Set; +import java.util.stream.Stream; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.AnnotatedAssignment; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.ClassDef; +import org.sonar.plugins.python.api.tree.Decorator; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.QualifiedExpression; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.SubscriptionExpression; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.tree.TypeAnnotation; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.tree.TreeUtils; + +@Rule(key = "S8685") +public class DataClassFunctionCallDefaultCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Use \"field(default_factory=...)\" instead of a function call as a default value."; + private static final String DEFAULT_KEYWORD = "default"; + + private static final TypeMatcher IS_DATACLASS_DECORATOR = TypeMatchers.isType("dataclasses.dataclass"); + private static final TypeMatcher IS_DATACLASSES_FIELD = TypeMatchers.isType("dataclasses.field"); + private static final TypeMatcher IS_CLASS_VAR = TypeMatchers.isType("typing.ClassVar"); + + // Allowlist of callables whose result should be re-evaluated per dataclass instance. + // Calls to anything outside this list are assumed safe (e.g. user-defined helpers, frozen-dataclass + // constructors, wrappers around dataclasses.field(default_factory=...)) — we prefer FNs over FPs here. + // + // NOTE: random.* top-level functions are intentionally absent. In typeshed they are aliased from a + // module-level Random() instance (`randint = _inst.randint`, ...) and the V2 typeshed serializer + // flattens the bound-method type to CallableType[builtins.function], so isType("random.randint") + // resolves through Unknown. They are matched separately below via the random module qualifier. + private static final TypeMatcher IS_PROBLEMATIC_FACTORY = TypeMatchers.any(Stream.of( + // Current time / clock readings + "datetime.datetime.now", + "datetime.datetime.utcnow", + "datetime.datetime.today", + "datetime.datetime.fromtimestamp", + "datetime.datetime.utcfromtimestamp", + "datetime.date.today", + "datetime.date.fromtimestamp", + "time.time", + "time.time_ns", + "time.monotonic", + "time.monotonic_ns", + "time.perf_counter", + "time.perf_counter_ns", + "time.process_time", + "time.process_time_ns", + "time.localtime", + "time.gmtime", + // UUIDs + "uuid.uuid1", + "uuid.uuid3", + "uuid.uuid4", + "uuid.uuid5", + // Secrets + "secrets.token_hex", + "secrets.token_bytes", + "secrets.token_urlsafe", + "secrets.choice", + "secrets.randbelow", + "secrets.randbits", + // OS randomness + "os.urandom", + // Mutable container constructors — shared across all instances otherwise + "builtins.list", + "builtins.dict", + "builtins.set", + "builtins.bytearray", + "collections.defaultdict", + "collections.OrderedDict", + "collections.Counter", + "collections.deque").map(TypeMatchers::isType)); + + // The random module type itself is known, even though its top-level function members all resolve + // to Unknown (see NOTE on IS_PROBLEMATIC_FACTORY). We match `.` syntactically. + private static final TypeMatcher IS_RANDOM_MODULE = TypeMatchers.isType("random"); + + private static final Set RANDOM_PROBLEMATIC_FUNCTION_NAMES = Set.of( + "random", + "randint", + "randrange", + "choice", + "choices", + "sample", + "uniform", + "gauss", + "normalvariate", + "triangular", + "betavariate", + "expovariate", + "gammavariate", + "lognormvariate", + "paretovariate", + "vonmisesvariate", + "weibullvariate", + "getrandbits", + "randbytes"); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.CLASSDEF, DataClassFunctionCallDefaultCheck::checkClassDef); + } + + private static void checkClassDef(SubscriptionContext ctx) { + ClassDef classDef = (ClassDef) ctx.syntaxNode(); + if (!isDataclass(classDef, ctx)) { + return; + } + classDef.body().statements().stream() + .flatMap(TreeUtils.toStreamInstanceOfMapper(AnnotatedAssignment.class)) + .forEach(annotatedAssignment -> checkField(ctx, annotatedAssignment)); + } + + private static boolean isDataclass(ClassDef classDef, SubscriptionContext ctx) { + for (Decorator decorator : classDef.decorators()) { + Expression decoratorExpr = getDecoratorFunctionExpression(decorator); + if (IS_DATACLASS_DECORATOR.isTrueFor(decoratorExpr, ctx)) { + return true; + } + } + return false; + } + + private static Expression getDecoratorFunctionExpression(Decorator decorator) { + Expression expr = decorator.expression(); + if (expr instanceof CallExpression callExpr) { + return callExpr.callee(); + } + return expr; + } + + private static void checkField(SubscriptionContext ctx, AnnotatedAssignment annotatedAssignment) { + Expression assignedValue = annotatedAssignment.assignedValue(); + if (assignedValue == null || isClassVar(annotatedAssignment.annotation(), ctx)) { + return; + } + if (isMutableLiteral(assignedValue)) { + ctx.addIssue(assignedValue, MESSAGE); + return; + } + if (assignedValue instanceof CallExpression callExpression) { + Tree problematic = problematicCall(callExpression, ctx); + if (problematic != null) { + ctx.addIssue(problematic, MESSAGE); + } + } + } + + private static boolean isMutableLiteral(Expression expression) { + return expression.is(Tree.Kind.LIST_LITERAL, Tree.Kind.DICTIONARY_LITERAL, Tree.Kind.SET_LITERAL); + } + + // Returns the expression to flag, or null. Handles all of: + // x: T = datetime.now() -> the outer call + // x: T = field(default=datetime.now()) -> the inner default argument + // x: T = field(default=[]) -> the inner mutable literal + private static Tree problematicCall(CallExpression callExpression, SubscriptionContext ctx) { + if (isProblematicFactoryCall(callExpression, ctx)) { + return callExpression; + } + if (IS_DATACLASSES_FIELD.isTrueFor(callExpression.callee(), ctx)) { + RegularArgument defaultArg = TreeUtils.argumentByKeyword(DEFAULT_KEYWORD, callExpression.arguments()); + if (defaultArg != null) { + Expression defaultExpr = defaultArg.expression(); + if (isMutableLiteral(defaultExpr)) { + return defaultExpr; + } + if (defaultExpr instanceof CallExpression innerCall && isProblematicFactoryCall(innerCall, ctx)) { + return innerCall; + } + } + } + return null; + } + + private static boolean isProblematicFactoryCall(CallExpression callExpression, SubscriptionContext ctx) { + Expression callee = callExpression.callee(); + return IS_PROBLEMATIC_FACTORY.isTrueFor(callee, ctx) || isRandomModuleFunctionCall(callee, ctx); + } + + // Workaround for the random.* alias gap in the V2 typeshed serializer (see NOTE on + // IS_PROBLEMATIC_FACTORY): the random module type itself is known, so we recognise + // a problematic call by checking the qualifier's type and the syntactic name. + private static boolean isRandomModuleFunctionCall(Expression callee, SubscriptionContext ctx) { + if (!(callee instanceof QualifiedExpression qualifiedExpression)) { + return false; + } + return RANDOM_PROBLEMATIC_FUNCTION_NAMES.contains(qualifiedExpression.name().name()) + && IS_RANDOM_MODULE.isTrueFor(qualifiedExpression.qualifier(), ctx); + } + + private static boolean isClassVar(TypeAnnotation annotation, SubscriptionContext ctx) { + Expression annotationExpr = annotation.expression(); + if (annotationExpr instanceof SubscriptionExpression subscriptionExpr) { + return IS_CLASS_VAR.isTrueFor(subscriptionExpr.object(), ctx); + } + return IS_CLASS_VAR.isTrueFor(annotationExpr, ctx); + } +} diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 9e542dc3e..085de8675 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -181,6 +181,7 @@ public Stream> getChecks() { CorsCheck.class, CorsMiddlewareOrderingCheck.class, CsrfDisabledCheck.class, + DataClassFunctionCallDefaultCheck.class, DataClassOnEnumCheck.class, DataclassFieldDefinitionCheck.class, DataEncryptionCheck.class, diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8685.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8685.html new file mode 100644 index 000000000..ed00e53b5 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8685.html @@ -0,0 +1,72 @@ +

      Using a mutable or stateful value as a default for a dataclass attribute is rarely what developers intend. The value is evaluated only once, when +the class is defined, so every instance shares the same object.

      +

      Why is this an issue?

      +

      Default values for dataclass attributes are evaluated once when the class is defined, not each time an instance is created. This is a fundamental +aspect of how Python evaluates default values.

      +

      When the default is produced by calling a function such as datetime.now() or uuid.uuid4(), or by a mutable container like +[] or list(), the value is computed once and reused across every instance of the dataclass. Every instance therefore ends up +with the same object.

      +
      +@dataclass
      +class Event:
      +    timestamp: datetime = datetime.now()  # Noncompliant
      +    tags: list = []  # Noncompliant
      +
      +event1 = Event()
      +event2 = Event()
      +event1.tags.append("x")
      +# event2.tags is also ["x"] — tags is the same list object.
      +# event1.timestamp and event2.timestamp are both the class-definition time.
      +
      +

      In this example, event1 and event2 share the same tags list and the same timestamp.

      +

      What is the potential impact?

      +

      Using such defaults can cause reliability issues:

      +
        +
      • Broken uniqueness: attributes meant to be unique per instance, such as UUIDs or timestamps, become identical across all + instances.
      • +
      • State sharing bugs: mutating the default through one instance silently affects every other instance and every instance created + in the future.
      • +
      • Incorrect business logic: time-sensitive operations use a stale timestamp captured at class definition, which leads to + incorrect ordering, expiration, or logging.
      • +
      • Hard-to-diagnose bugs: the issue may not be visible in short-lived tests, but appears in production where instances are created + over a longer period of time or mutate their state.
      • +
      +

      How to fix it

      +

      Use field(default_factory=…​) instead. The default_factory parameter accepts a callable, without parentheses, that is +invoked each time a new instance is created, so each instance receives a fresh value.

      +

      The default_factory expects a callable with no arguments. If the function requires arguments, wrap it in a lambda or use +functools.partial.

      +

      Code examples

      +

      Noncompliant code example

      +
      +@dataclass
      +class Event:
      +    timestamp: datetime = datetime.now()  # Noncompliant
      +    event_id: uuid.UUID = uuid.uuid4()  # Noncompliant
      +    tags: list = []  # Noncompliant
      +
      +

      Compliant solution

      +
      +from dataclasses import dataclass, field
      +
      +@dataclass
      +class Event:
      +    timestamp: datetime = field(default_factory=datetime.now)
      +    event_id: uuid.UUID = field(default_factory=uuid.uuid4)
      +    tags: list = field(default_factory=list)
      +
      +

      Resources

      +

      Documentation

      + +

      Related rules

      +
        +
      • {rule:python:S6891} - Mutable objects should not be used as default parameter values
      • +
      + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8685.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8685.json new file mode 100644 index 000000000..d10637e75 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8685.json @@ -0,0 +1,24 @@ +{ + "title": "Mutable or stateful values should not be used as default values in dataclass attributes", + "type": "BUG", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "dataclass", + "pitfall" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-8685", + "sqKey": "S8685", + "scope": "Main", + "quickfix": "unknown", + "code": { + "impacts": { + "RELIABILITY": "MEDIUM" + }, + "attribute": "LOGICAL" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index a03595653..00941e787 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -346,6 +346,7 @@ "S8520", "S8521", "S8554", - "S8572" + "S8572", + "S8685" ] } diff --git a/python-checks/src/test/java/org/sonar/python/checks/DataClassFunctionCallDefaultCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/DataClassFunctionCallDefaultCheckTest.java new file mode 100644 index 000000000..5ed5e0f29 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/DataClassFunctionCallDefaultCheckTest.java @@ -0,0 +1,28 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.junit.jupiter.api.Test; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class DataClassFunctionCallDefaultCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/dataClassFunctionCallDefault.py", new DataClassFunctionCallDefaultCheck()); + } +} diff --git a/python-checks/src/test/resources/checks/dataClassFunctionCallDefault.py b/python-checks/src/test/resources/checks/dataClassFunctionCallDefault.py new file mode 100644 index 000000000..a04c40501 --- /dev/null +++ b/python-checks/src/test/resources/checks/dataClassFunctionCallDefault.py @@ -0,0 +1,292 @@ +import dataclasses +import random +import uuid +import time +import secrets +import os +from dataclasses import dataclass, field +from datetime import datetime, date +from typing import ClassVar + + +# Known problematic factory calls are flagged + +@dataclass +class Event: + timestamp: datetime = datetime.now() # Noncompliant {{Use "field(default_factory=...)" instead of a function call as a default value.}} +# ^^^^^^^^^^^^^^ + event_id: str = uuid.uuid4() # Noncompliant + today: date = date.today() # Noncompliant + started_at: float = time.time() # Noncompliant + token: str = secrets.token_hex(16) # Noncompliant + rand_bytes: bytes = os.urandom(16) # Noncompliant + + +# random.* top-level functions are aliased from a Random() instance in typeshed +# (`randint = _inst.randint`), so isType("random.randint") resolves to Unknown. +# We work around this by matching on the random module qualifier and the function name. + +@dataclass +class EventWithRandom: + number: int = random.randint(1, 100) # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^^^ + pick: int = random.choice([1, 2, 3]) # Noncompliant + coin: float = random.random() # Noncompliant + + +# Aliased imports: `from random import randint as r` makes the callee just `r`, +# not a QualifiedExpression on the random module — accepted FN. + +from random import randint as _aliased_randint + +@dataclass +class EventWithAliasedRandom: + number: int = _aliased_randint(1, 100) # Compliant: accepted FN (no random qualifier) + + +# Method calls on a Random() instance: the callee qualifier is not the random module, +# so the syntactic workaround does not fire. The full type chain DOES resolve here +# (random.Random.randint is a known FunctionType) but it is not in the allowlist. + +@dataclass +class EventWithRandomInstance: + rng: random.Random = random.Random() # Compliant: constructor of a frozen-ish helper + n: int = random.Random().randint(1, 100) # Compliant: accepted FN (qualifier is a Random instance) + + +# Mutable container constructor calls are flagged — each instance would share the same container + +@dataclass +class EventWithContainers: + items: list = list() # Noncompliant + mapping: dict = dict() # Noncompliant + tags: set = set() # Noncompliant + buffer: bytearray = bytearray() # Noncompliant + + +# Mutable literal defaults are flagged + +@dataclass +class EventWithLiterals: + items: list = [] # Noncompliant +# ^^ + mapping: dict = {} # Noncompliant + tags: set = {1, 2, 3} # Noncompliant + + +# dataclasses.dataclass qualified name + +@dataclasses.dataclass +class Record: + created: datetime = datetime.now() # Noncompliant + + +# dataclass with arguments (frozen, eq, ...) + +@dataclass(frozen=True) +class FrozenEvent: + timestamp: datetime = datetime.now() # Noncompliant + + +@dataclasses.dataclass(eq=True, order=True) +class OrderedEvent: + created: datetime = datetime.now() # Noncompliant + + +# Compliant: call to a user-defined function — not in the allowlist. +# The allowlist-based approach accepts FNs here in exchange for FP-free behavior. + +def compute_default(): + return 42 + +@dataclass +class WithUserCall: + value: int = compute_default() # Compliant: accepted FN + + +# Compliant: field(default_factory=...) + +@dataclass +class CompliantEvent: + timestamp: datetime = field(default_factory=datetime.now) + event_id: str = field(default_factory=lambda: str(uuid.uuid4())) + items: list = field(default_factory=list) + + +# Compliant: field(default=...) with a constant + +@dataclass +class FieldWithDefault: + value: int = field(default=0) + name: str = field(default="foo") + + +# field(default=problematic_call()) is flagged — the inner call is evaluated once at +# class definition, same bug as writing the call directly + +@dataclass +class FieldWithProblematicDefault: + timestamp: datetime = field(default=datetime.now()) # Noncompliant +# ^^^^^^^^^^^^^^ + event_id: str = field(default=uuid.uuid4()) # Noncompliant + today: date = dataclasses.field(default=date.today()) # Noncompliant + items: list = field(default=[]) # Noncompliant + mapping: dict = field(default={}) # Noncompliant + more_items: list = field(default=list()) # Noncompliant + number: int = field(default=random.randint(1, 100)) # Noncompliant + + +# Compliant: field(default=...) with a non-problematic call (user-defined helper not in allowlist) + +@dataclass +class FieldWithSafeDefault: + value: int = field(default=compute_default()) # Compliant: accepted FN + + +# Compliant: dataclasses.field(...) qualified + +@dataclass +class QualifiedField: + value: int = dataclasses.field(default_factory=int) + + +# Compliant: constant default values + +@dataclass +class Constants: + integer: int = 0 + string: str = "hello" + flag: bool = True + nothing: None = None + floating: float = 1.5 + tuple_val: tuple = () + + +# Compliant: no default value + +@dataclass +class NoDefault: + name: str + age: int + + +# Compliant: non-dataclass class — rule only applies to dataclasses + +class RegularClass: + timestamp: datetime = datetime.now() + event_id: str = str(uuid.uuid4()) + + +# Compliant: class variable (ClassVar) — intentionally class-level + +@dataclass +class WithClassVar: + shared: ClassVar[datetime] = datetime.now() + + +# Nested dataclass + +@dataclass +class Outer: + name: str = "foo" + + @dataclass + class Inner: + timestamp: datetime = datetime.now() # Noncompliant + + +# Compliant: attribute access (not a call) on a call result is not the top-level expression + +CONSTANT = 42 + +@dataclass +class WithAttributeAccess: + value: int = CONSTANT + + +# Compliant: arithmetic on constants + +@dataclass +class WithBinaryOps: + value: int = 1 + 2 + other: int = -1 + + +# Method body: only attributes annotated at class level are considered + +@dataclass +class NoAnnotation: + name: str = "foo" + + def method(self): + local_var = datetime.now() + return local_var + + +# Unknown decorator (not dataclass) — compliant + +@unknown_decorator +class NotADataclass: + timestamp: datetime = datetime.now() + + +# Regular assignment (not annotated) — no type annotation, not a dataclass field + +@dataclass +class RegularAssignment: + x = datetime.now() # Compliant: without type annotation, not a dataclass field + + +# Compliant: user-defined classmethod helper named "field" that wraps +# dataclasses.field(default_factory=...). Common in LibCST (CSTNode.field). +# Under the allowlist philosophy, this is naturally compliant because the callee's +# FQN is not in the problematic list. + +class Base: + @classmethod + def field(cls, *args, **kwargs): + return field(default_factory=lambda: cls(*args, **kwargs)) + + +@dataclass(frozen=True) +class Derived(Base): + value: str = "" + + +@dataclass +class UsingFieldHelper: + derived: Derived = Derived.field("") # Compliant: wrapper around dataclasses.field + other: Derived = Base.field("") # Compliant: wrapper around dataclasses.field + + +# Compliant: constructor call (user-defined frozen dataclass). The constructor is not in +# the allowlist, so we accept this as an FN. Frozen dataclass instances are immutable, +# so sharing the default across instances is usually safe anyway. + +@dataclass(frozen=True) +class Shared: + name: str = "x" + + +@dataclass +class UsesShared: + inner: Shared = Shared() # Compliant: accepted FN + + +# Time via aliased import is still flagged — FQN still resolves to time.time + +from time import time as now_ts + +@dataclass +class WithAliasedTime: + started: float = now_ts() # Noncompliant + + +# Compliant: function call whose FQN cannot be resolved — unknown callee means no match + +def _maker(): + return datetime.now() + +@dataclass +class WithUnknownCallee: + ts: datetime = _maker() # Compliant: accepted FN (callee not in allowlist) From 9d83f3d6b8e5e7589948d174da65fc01a102d478 Mon Sep 17 00:00:00 2001 From: Sebastian Zumbrunn Date: Thu, 30 Apr 2026 17:27:21 +0200 Subject: [PATCH 112/322] SONARPY-4136 Remove S8554 from SonarWay (#1094) GitOrigin-RevId: 2df1c5931179d3d38d450fc936ab0412a97367d6 --- .../org/sonar/l10n/py/rules/python/S8554.html | 28 ++++++++----------- .../py/rules/python/Sonar_way_profile.json | 1 - 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8554.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8554.html index 2d7db3566..73021deb2 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8554.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8554.html @@ -3,36 +3,32 @@

      Why is this an issue?

      Python’s logging module has specific patterns that ensure correctness, performance, and maintainability. Violating these patterns can lead to several problems:

      -

      Eager String Formatting

      +

      Eager String Formatting

      When you format strings before passing them to logging methods (using f-strings, .format(), % operator, or + concatenation), Python performs the string formatting operation immediately, even if the log message won’t be output due to the current log level. This wastes CPU cycles on string operations that may never be used.

      The logging module supports lazy formatting by accepting format arguments as separate parameters. The formatting only occurs when the logging framework confirms the message will actually be logged based on the configured log level.

      -

      Deprecated Methods

      +

      Deprecated Methods

      The logging.warn() and logging.Logger.warn() methods are deprecated. While they still function, they may be removed in future Python versions. The recommended methods are logging.warning() and logging.Logger.warning(), which are functionally equivalent.

      -

      Attribute Name Collisions

      +

      Attribute Name Collisions

      The logging module’s extra keyword argument allows passing additional values to be included in log records. However, if the keys in the extra dictionary clash with built-in LogRecord attributes (such as 'name', 'msg', 'args', 'created', 'filename', 'funcName', 'levelname', 'levelno', 'lineno', 'module', 'msecs', 'message', 'pathname', 'process', 'processName', 'relativeCreated', 'thread', 'threadName'), a KeyError will be raised when the LogRecord is constructed, causing the logging statement to fail at runtime.

      What is the potential impact?

      -

      Performance Degradation

      -

      Eager string formatting can significantly impact application performance, especially in code paths with frequent logging statements. When log -levels are configured to filter out certain messages (e.g., DEBUG messages in production), the application still pays the cost of formatting strings -that will never be logged.

      -

      Runtime Errors

      -

      Attribute name collisions in the extra parameter raise KeyError exceptions, causing logging statements to fail -unexpectedly.

      -

      Maintenance Issues

      -

      Using deprecated methods creates technical debt. When these methods are eventually removed from Python, code using them will break. Additionally, -mixing deprecated and non-deprecated methods across a codebase creates inconsistency and confusion.

      -

      Inconsistent Logging

      -

      Eager formatting can lead to inconsistent behavior across different log handlers. When using lazy formatting with the extra parameter, -all handlers receive the same structured data and can format it consistently according to their configuration.

      +

      Performance degradation: Eager string formatting can significantly impact application performance, especially in code paths with frequent logging +statements. When log levels are configured to filter out certain messages (for example, DEBUG messages in production), the application still pays the +cost of formatting strings that will never be logged.

      +

      Runtime errors: Attribute name collisions in the extra parameter raise KeyError exceptions, causing logging statements to +fail unexpectedly.

      +

      Maintenance issues: Using deprecated methods creates technical debt. When these methods are eventually removed from Python, code using them will +break. Additionally, mixing deprecated and non-deprecated methods across a codebase creates inconsistency and confusion.

      +

      Inconsistent logging: Eager formatting can lead to inconsistent behavior across different log handlers. When using lazy formatting with the +extra parameter, all handlers receive the same structured data and can format it consistently according to their configuration.

      How to fix it

      Use lazy formatting by passing format arguments as separate parameters to logging methods instead of formatting strings before the call. Replace f-strings, .format(), % operator, and + concatenation with %-style placeholders and separate arguments.

      diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 00941e787..73e93e38f 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -345,7 +345,6 @@ "S8519", "S8520", "S8521", - "S8554", "S8572", "S8685" ] From 956b3c6e80372550e49e057c2b3f1c9a1a0a8997 Mon Sep 17 00:00:00 2001 From: Guillaume Dequenne Date: Mon, 4 May 2026 10:23:37 +0200 Subject: [PATCH 113/322] SONARPY-4138 Avoid raising S8514 when the class variable is likely intentional (#1096) GitOrigin-RevId: 25997a4ff0b42970deaafdad60f7f69a1f1a4f2f --- .../checks/DataclassFieldDefinitionCheck.java | 34 ++++++++++++++++++- .../org/sonar/l10n/py/rules/python/S8514.html | 27 +++++++++++++-- .../checks/dataclassFieldDefinition.py | 18 ++++++++++ 3 files changed, 75 insertions(+), 4 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/DataclassFieldDefinitionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/DataclassFieldDefinitionCheck.java index f0d517a79..f00de87a2 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/DataclassFieldDefinitionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/DataclassFieldDefinitionCheck.java @@ -16,6 +16,7 @@ */ package org.sonar.python.checks; +import java.util.List; import org.sonar.check.Rule; import org.sonar.plugins.python.api.PythonSubscriptionCheck; import org.sonar.plugins.python.api.SubscriptionContext; @@ -24,6 +25,8 @@ import org.sonar.plugins.python.api.tree.ClassDef; import org.sonar.plugins.python.api.tree.Decorator; import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.ExpressionList; +import org.sonar.plugins.python.api.tree.Name; import org.sonar.plugins.python.api.tree.Tree; import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; @@ -63,8 +66,37 @@ private static boolean isDataclassDecorator(Decorator decorator, SubscriptionCon } private static void checkStatement(SubscriptionContext ctx, Tree statement) { - if (statement instanceof AssignmentStatement assignmentStatement) { + if (statement instanceof AssignmentStatement assignmentStatement && !isLikelyIntentionalClassVar(assignmentStatement)) { ctx.addIssue(assignmentStatement, MESSAGE_MISSING_ANNOTATION); } } + + private static boolean isLikelyIntentionalClassVar(AssignmentStatement assignment) { + List lhsList = assignment.lhsExpressions(); + if (lhsList.size() != 1) { + return false; + } + List expressions = lhsList.get(0).expressions(); + if (expressions.size() != 1 || !expressions.get(0).is(Tree.Kind.NAME)) { + return false; + } + String name = ((Name) expressions.get(0)).name(); + return name.startsWith("_") || isAllCaps(name); + } + + // ALL_CAPS names follow the Python constant convention — they are intentional class-level attributes. + private static boolean isAllCaps(String name) { + if (name.isEmpty()) { + return false; + } + boolean hasUpperCase = false; + for (char c : name.toCharArray()) { + if (Character.isUpperCase(c)) { + hasUpperCase = true; + } else if (!Character.isDigit(c) && c != '_') { + return false; + } + } + return hasUpperCase; + } } diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8514.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8514.html index 0a8d9c4bf..f5507fe20 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8514.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8514.html @@ -1,4 +1,5 @@ -

      This rule raises an issue when a dataclass contains attributes without type annotations.

      +

      This rule raises an issue when a dataclass attribute is assigned a value without a type annotation, suggesting the developer likely intended an +instance field but silently created a class variable instead.

      Why is this an issue?

      The @dataclass decorator only processes attributes that have type annotations. Attributes without annotations are silently excluded from dataclass processing and become regular class variables instead of instance attributes. This means:

      @@ -12,8 +13,10 @@

      What is the potential impact?

      dataclass contract. These bugs are difficult to trace because the class appears to work normally, but the affected attributes do not participate in any of the generated methods.

      How to fix it

      -

      Add type annotations to all attributes that should be dataclass fields. If you intend an attribute to be a class variable shared across instances, -move it outside the dataclass or document this intention clearly.

      +

      Add type annotations to all attributes that should be dataclass fields.

      +

      If you intentionally want a class variable shared across all instances, annotate it with typing.ClassVar[T]. This is the idiomatic +Python way to declare class variables inside a dataclass — it makes the intent explicit and ensures the attribute is excluded from all generated +dataclass methods.

      Code examples

      Noncompliant code example

      @@ -33,10 +36,28 @@ 

      Compliant solution

      timeout: int = 30 retries: int = 3
      +

      Noncompliant code example

      +
      +from dataclasses import dataclass
      +
      +@dataclass
      +class Registry:
      +    instance_count = 0  # Noncompliant: intended as a class variable, but not explicit
      +
      +

      Compliant solution

      +
      +from dataclasses import dataclass
      +from typing import ClassVar
      +
      +@dataclass
      +class Registry:
      +    instance_count: ClassVar[int] = 0  # Explicit class variable, excluded from __init__
      +

      Resources

      Documentation

      diff --git a/python-checks/src/test/resources/checks/dataclassFieldDefinition.py b/python-checks/src/test/resources/checks/dataclassFieldDefinition.py index 1f77c4430..10ed93cff 100644 --- a/python-checks/src/test/resources/checks/dataclassFieldDefinition.py +++ b/python-checks/src/test/resources/checks/dataclassFieldDefinition.py @@ -193,3 +193,21 @@ class ParentDataclass: class NonDataclassChild(ParentDataclass): unannotated = 99 + + +# ALL_CAPS names follow the Python constant convention and are intentional class-level attributes +@dataclass +class AllCapsConstants: + MAX_RETRIES = 5 + DEFAULT_TIMEOUT = 30 + BASE_URL = "https://example.com" + + +# Names starting with _ are considered intentional private/special attributes +@dataclass +class UnderscorePrefixedAttributes: + _private = "value" + __slots__ = ['x', 'y'] + __tablename__ = "users" + __abstract__ = True + _PRIVATE_CONST = 42 From 57349a050d0ab923fd5efcdfd94b9b1c2044f94f Mon Sep 17 00:00:00 2001 From: Guillaume Dequenne Date: Mon, 4 May 2026 12:13:58 +0200 Subject: [PATCH 114/322] SONARPY-4047 Extend S5714 to more bitwise boolean expression types (#1080) GitOrigin-RevId: 5dd8a75e6de674990c541c2c789684c271ac57b5 --- .../BooleanExpressionInExceptCheck.java | 8 ++- .../BooleanExpressionInExceptCheckTest.java | 48 ++++++++++++++++ .../checks/booleanExpressionInExcept.py | 57 +++++++++++++++++++ 3 files changed, 111 insertions(+), 2 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/BooleanExpressionInExceptCheck.java b/python-checks/src/main/java/org/sonar/python/checks/BooleanExpressionInExceptCheck.java index 22b88dabb..6c37c0678 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/BooleanExpressionInExceptCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/BooleanExpressionInExceptCheck.java @@ -41,6 +41,10 @@ public class BooleanExpressionInExceptCheck extends PythonSubscriptionCheck { public static final String MESSAGE = "Rewrite this \"except\" expression as a tuple of exception classes."; public static final String QUICK_FIX_MESSAGE = "Replace with a tuple"; + private static final Kind[] FLAGGED_BINARY_KINDS = { + Kind.OR, Kind.AND, Kind.BITWISE_OR, Kind.BITWISE_AND + }; + @Override public void initialize(Context context) { context.registerSyntaxNodeConsumer(Kind.EXCEPT_CLAUSE, BooleanExpressionInExceptCheck::checkExceptClause); @@ -52,7 +56,7 @@ private static void checkExceptClause(SubscriptionContext ctx) { Optional.of(except) .map(ExceptClause::exception) .map(Expressions::removeParentheses) - .filter(exception -> exception.is(Kind.OR, Kind.AND)) + .filter(exception -> exception.is(FLAGGED_BINARY_KINDS)) .ifPresent(exception -> { var issue = ctx.addIssue(exception, MESSAGE); addQuickFix(issue, exception); @@ -61,7 +65,7 @@ private static void checkExceptClause(SubscriptionContext ctx) { private static List collectNames(Expression expression) { expression = Expressions.removeParentheses(expression); - if (expression.is(Kind.OR, Kind.AND)) { + if (expression.is(FLAGGED_BINARY_KINDS)) { var binaryExpression = (BinaryExpression) expression; var leftExceptions = collectNames(binaryExpression.leftOperand()); var rightExceptions = collectNames(binaryExpression.rightOperand()); diff --git a/python-checks/src/test/java/org/sonar/python/checks/BooleanExpressionInExceptCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/BooleanExpressionInExceptCheckTest.java index 68c03afe4..7f356d62b 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/BooleanExpressionInExceptCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/BooleanExpressionInExceptCheckTest.java @@ -74,6 +74,54 @@ void nestedQuickFixTest() { verifyQuickFix(before, after); } + @Test + void bitwiseOrQuickFixTest() { + var before = """ + try: + foo() + except ValueError | TypeError | SomeError: + pass"""; + + var after = """ + try: + foo() + except (ValueError, TypeError, SomeError): + pass"""; + verifyQuickFix(before, after); + } + + @Test + void bitwiseAndQuickFixTest() { + var before = """ + try: + foo() + except ValueError & TypeError & SomeError: + pass"""; + + var after = """ + try: + foo() + except (ValueError, TypeError, SomeError): + pass"""; + verifyQuickFix(before, after); + } + + @Test + void mixedOperatorsQuickFixTest() { + var before = """ + try: + foo() + except (ValueError | TypeError) and SomeError: + pass"""; + + var after = """ + try: + foo() + except (ValueError, TypeError, SomeError): + pass"""; + verifyQuickFix(before, after); + } + @Test void noQuickFixTest() { var before = """ diff --git a/python-checks/src/test/resources/checks/booleanExpressionInExcept.py b/python-checks/src/test/resources/checks/booleanExpressionInExcept.py index 01aef04e2..e5774b9a4 100644 --- a/python-checks/src/test/resources/checks/booleanExpressionInExcept.py +++ b/python-checks/src/test/resources/checks/booleanExpressionInExcept.py @@ -29,3 +29,60 @@ pass except* (ValueError): pass + +# === `|` bitwise OR === +try: + foo() +except ValueError | TypeError: # Noncompliant + pass +except ValueError | TypeError as e: # Noncompliant + pass +except (ValueError | TypeError): # Noncompliant + pass +except ConnectionError | TimeoutError | OSError: # Noncompliant + pass + +# === `&` bitwise AND === +try: + foo() +except ValueError & TypeError: # Noncompliant + pass +except ValueError & TypeError as e: # Noncompliant + pass +except (ValueError & TypeError): # Noncompliant + pass + +# === `except*` variants for bitwise operators === +try: + foo() +except* ValueError | TypeError: # Noncompliant + pass +except* ValueError & TypeError: # Noncompliant + pass + +# === Mixed: one valid handler, one with a bitwise operator === +try: + foo() +except TypeError: + pass +except ValueError | KeyError: # Noncompliant + pass + +try: + foo() +except* TypeError: + pass +except* ValueError | KeyError: # Noncompliant + pass + +# === Arithmetic operators are out of scope (e.g. tuple + tuple is valid Python) === +connection_errors = (ConnectionError, OSError) +channel_errors = (KeyError,) +try: + foo() +except connection_errors + channel_errors as exc: + pass +except connection_errors + channel_errors: + pass +except (connection_errors + channel_errors): + pass From 742621c4623d15111536ce7734a2ebc9d6376584 Mon Sep 17 00:00:00 2001 From: Marc Jasper Date: Mon, 4 May 2026 14:47:41 +0200 Subject: [PATCH 115/322] SONARPY-4107 Fix S8516 FPs by detecting only known unsafe sinks (#1092) GitOrigin-RevId: 71e8ff65acf05e269337957bccc0716d11efb013 --- .../checks/GroupByIteratorReuseCheck.java | 157 ++++++------ .../org/sonar/l10n/py/rules/python/S8516.html | 22 +- .../org/sonar/l10n/py/rules/python/S8516.json | 2 +- .../checks/GroupByIteratorReuseCheckTest.java | 2 +- .../resources/checks/groupByIteratorReuse.py | 239 ++++++------------ 5 files changed, 176 insertions(+), 246 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/GroupByIteratorReuseCheck.java b/python-checks/src/main/java/org/sonar/python/checks/GroupByIteratorReuseCheck.java index 65bc928b3..078897d30 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/GroupByIteratorReuseCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/GroupByIteratorReuseCheck.java @@ -18,6 +18,9 @@ import java.util.List; import java.util.Optional; +import java.util.Set; +import java.util.function.Predicate; +import java.util.stream.Stream; import org.sonar.check.Rule; import org.sonar.plugins.python.api.PythonSubscriptionCheck; import org.sonar.plugins.python.api.SubscriptionContext; @@ -25,13 +28,16 @@ import org.sonar.plugins.python.api.symbols.v2.SymbolV2; import org.sonar.plugins.python.api.symbols.v2.UsageV2; import org.sonar.plugins.python.api.tree.ArgList; +import org.sonar.plugins.python.api.tree.AssignmentStatement; import org.sonar.plugins.python.api.tree.CallExpression; -import org.sonar.plugins.python.api.tree.ComprehensionFor; import org.sonar.plugins.python.api.tree.Expression; import org.sonar.plugins.python.api.tree.ForStatement; import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.QualifiedExpression; import org.sonar.plugins.python.api.tree.RegularArgument; import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.tree.YieldExpression; +import org.sonar.plugins.python.api.tree.YieldStatement; import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; import org.sonar.python.quickfix.TextEditUtils; @@ -40,13 +46,11 @@ @Rule(key = "S8516") public class GroupByIteratorReuseCheck extends PythonSubscriptionCheck { - private static final String MESSAGE = "Convert this group iterator to a list."; + private static final String MESSAGE = "Consume this group iterator inside the loop, or materialize it into a collection."; private static final String QUICK_FIX_MESSAGE = "Wrap with \"list()\""; private static final TypeMatcher GROUPBY_MATCHER = TypeMatchers.isType("itertools.groupby"); - // SAFE_CONSUMER_MATCHER and CLASS_MATCHER are matched leniently (TRUE or UNKNOWN both pass) so - // unresolved callees don't trigger false positives. private static final TypeMatcher SAFE_CONSUMER_MATCHER = TypeMatchers.any( TypeMatchers.isType("list"), TypeMatchers.isType("tuple"), @@ -57,11 +61,21 @@ public class GroupByIteratorReuseCheck extends PythonSubscriptionCheck { TypeMatchers.isType("max"), TypeMatchers.isType("min"), TypeMatchers.isType("any"), - TypeMatchers.isType("all") + TypeMatchers.isType("all"), + TypeMatchers.isType("next"), + TypeMatchers.isType("len"), + TypeMatchers.isType("str.join"), + TypeMatchers.isType("bytes.join") ); - // Any class constructor that accepts an iterable invariably materializes it inside __init__ - private static final TypeMatcher CLASS_MATCHER = TypeMatchers.isObjectOfType("type"); + // Matches class objects produced at runtime via `type(...)` (e.g. `Cls = type(obj); Cls(group)`). + // Direct class references (`MyClass`) are NOT matched here + private static final TypeMatcher RUNTIME_CLASS_OBJECT_MATCHER = TypeMatchers.isObjectOfType("type"); + + // Container methods that store their argument *as a single element* without iterating it. + private static final Set STORING_METHOD_NAMES = Set.of( + "append", "add", "setdefault" + ); @Override public void initialize(Context context) { @@ -70,27 +84,10 @@ public void initialize(Context context) { private static void checkForStatement(SubscriptionContext ctx) { ForStatement forStatement = (ForStatement) ctx.syntaxNode(); - - if (forStatement.testExpressions().size() != 1) { - return; - } - - if (!(forStatement.testExpressions().get(0) instanceof CallExpression callExpr)) { + Name groupName = extractGroupByLoopVariable(forStatement, ctx).orElse(null); + if (groupName == null) { return; } - - if (!GROUPBY_MATCHER.isTrueFor(callExpr.callee(), ctx)) { - return; - } - - if (forStatement.expressions().size() != 2) { - return; - } - - if (!(forStatement.expressions().get(1) instanceof Name groupName)) { - return; - } - SymbolV2 groupSymbol = groupName.symbolV2(); if (groupSymbol == null) { return; @@ -98,30 +95,22 @@ private static void checkForStatement(SubscriptionContext ctx) { Tree loopBody = forStatement.body(); - // If `group` is rebound anywhere in the loop body (e.g. `group = list(group)`), we can't - // tell from the AST alone which reads see the original iterator. We conservatively skip. - boolean isReboundInLoopBody = groupSymbol.usages().stream() - .filter(usage -> usage.kind() == UsageV2.Kind.ASSIGNMENT_LHS) - .map(UsageV2::tree) - .flatMap(TreeUtils.toStreamInstanceOfMapper(Name.class)) - .anyMatch(reboundName -> isInside(reboundName, loopBody)); + // Bail on any rebinding of `group` in the body to avoid requiring a CFG + boolean isReboundInLoopBody = namesInLoopBody(groupSymbol, loopBody, + usage -> usage.kind() == UsageV2.Kind.ASSIGNMENT_LHS).findAny().isPresent(); if (isReboundInLoopBody) { return; } - List loopBodyReads = groupSymbol.usages().stream() - .filter(usage -> !usage.isBindingUsage()) - .map(UsageV2::tree) - .flatMap(TreeUtils.toStreamInstanceOfMapper(Name.class)) - .filter(nameUsage -> isInside(nameUsage, loopBody)) - .toList(); + List loopBodyReads = namesInLoopBody(groupSymbol, loopBody, + usage -> !usage.isBindingUsage()).toList(); List unsafeReads = loopBodyReads.stream() - .filter(nameUsage -> !isSafeUsage(nameUsage, forStatement, ctx)) + .filter(nameUsage -> isUnsafeRead(nameUsage, forStatement, ctx)) .toList(); - // The quickfix wraps a single occurrence in `list(...)`. We only attach it when there is - // exactly one read of `group` in the loop body — this does not affecting any other consumer. + // Quickfix only when there is a single read in the body: wrapping `group` in `list()` + // consumes the iterator and would silently break any other read. boolean canOfferQuickFix = loopBodyReads.size() == 1 && unsafeReads.size() == 1; for (Name nameUsage : unsafeReads) { var issue = ctx.addIssue(nameUsage, MESSAGE); @@ -135,54 +124,80 @@ private static void checkForStatement(SubscriptionContext ctx) { } } - private static boolean isSafeUsage(Name nameUsage, ForStatement enclosingForStatement, SubscriptionContext ctx) { - // A usage inside a nested function or lambda defined in the loop body is always unsafe - if (isInsideNestedFunctionOrLambda(nameUsage, enclosingForStatement)) { - return false; + // Matches `for key, group in groupby(...):` and returns the `group` name + private static Optional extractGroupByLoopVariable(ForStatement forStatement, SubscriptionContext ctx) { + if (forStatement.testExpressions().size() != 1 + || !(forStatement.testExpressions().get(0) instanceof CallExpression callExpr) + || !GROUPBY_MATCHER.isTrueFor(callExpr.callee(), ctx) + || forStatement.expressions().size() != 2 + || !(forStatement.expressions().get(1) instanceof Name groupName)) { + return Optional.empty(); } + return Optional.of(groupName); + } - if (nameUsage.parent() instanceof ComprehensionFor compFor && compFor.iterable() == nameUsage) { + // Recognized escape sinks: lambda/nested-function capture, assignment rvalue, yield, and + // positional argument of a known storing-method. Anything else is treated as safe. + private static boolean isUnsafeRead(Name nameUsage, ForStatement enclosingForStatement, SubscriptionContext ctx) { + if (isCapturedByNestedFunctionOrLambda(nameUsage, enclosingForStatement)) { return true; } + return reachesSink(nameUsage, ctx); + } - if (nameUsage.parent() instanceof ForStatement nestedFor - && nestedFor.testExpressions().stream().anyMatch(e -> e == nameUsage)) { + private static boolean reachesSink(Expression expression, SubscriptionContext ctx) { + Tree parent = expression.parent(); + if (parent instanceof AssignmentStatement assign && assign.assignedValue() == expression) { return true; } - - if (nameUsage.parent() instanceof RegularArgument regularArg && regularArg.keywordArgument() == null) { - return hasSafeConsumerAncestor(regularArg, ctx); + if (parent instanceof YieldExpression || parent instanceof YieldStatement) { + return true; + } + // Keyword arguments are skipped (treated as safe): mapping them to the callee's parameter would + // require signature resolution, and iterators are overwhelmingly passed positionally in practice. + if (parent instanceof RegularArgument regularArg && regularArg.keywordArgument() == null) { + return chainReachesSink(regularArg, ctx); } - return false; } - // We raise when the group iterator escapes the current iteration and is read after the outer - // `groupby` advances. A positional-arg call chain ending in a safe consumer cannot escape. - private static boolean hasSafeConsumerAncestor(RegularArgument regularArg, SubscriptionContext ctx) { - Optional currentCall = owningCall(regularArg); - while (currentCall.isPresent()) { - CallExpression call = currentCall.get(); - if (isSafeConsumerCallee(call.callee(), ctx)) { - return true; - } - if (!(call.parent() instanceof RegularArgument outerArg) || outerArg.keywordArgument() != null) { - return false; - } - currentCall = owningCall(outerArg); + private static boolean chainReachesSink(RegularArgument arg, SubscriptionContext ctx) { + CallExpression call = owningCall(arg).orElse(null); + if (call == null) { + return false; } - return false; + if (isSafeConsumerCallee(call.callee(), ctx)) { + return false; + } + if (isStoringMethodCall(call)) { + return true; + } + return reachesSink(call, ctx); } private static boolean isSafeConsumerCallee(Expression callee, SubscriptionContext ctx) { return !SAFE_CONSUMER_MATCHER.evaluateFor(callee, ctx).isFalse() - || !CLASS_MATCHER.evaluateFor(callee, ctx).isFalse(); + || !RUNTIME_CLASS_OBJECT_MATCHER.evaluateFor(callee, ctx).isFalse(); + } + + // Name-only on purpose: gating on the receiver type would silently miss the case where the + // receiver's type cannot be resolved. Middle ground between FP risk and raising actual issues. + private static boolean isStoringMethodCall(CallExpression call) { + return call.callee() instanceof QualifiedExpression qualified + && STORING_METHOD_NAMES.contains(qualified.name().name()); } - private static boolean isInsideNestedFunctionOrLambda(Name nameUsage, ForStatement enclosingForStatement) { + private static boolean isCapturedByNestedFunctionOrLambda(Name nameUsage, ForStatement enclosingForStatement) { Tree functionLikeAncestor = TreeUtils.firstAncestorOfKind(nameUsage, Tree.Kind.FUNCDEF, Tree.Kind.LAMBDA); - return functionLikeAncestor != null - && isInside(functionLikeAncestor, enclosingForStatement.body()); + return functionLikeAncestor != null && isInside(functionLikeAncestor, enclosingForStatement.body()); + } + + private static Stream namesInLoopBody(SymbolV2 symbol, Tree loopBody, Predicate usageFilter) { + return symbol.usages().stream() + .filter(usageFilter) + .map(UsageV2::tree) + .flatMap(TreeUtils.toStreamInstanceOfMapper(Name.class)) + .filter(name -> isInside(name, loopBody)); } private static boolean isInside(Tree tree, Tree container) { diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8516.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8516.html index cef43e574..32c6a1b70 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8516.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8516.html @@ -1,20 +1,23 @@ -

      This rule raises an issue when a group iterator returned by itertools.groupby() is stored and reused after the groupby -object has advanced to the next group.

      +

      This rule raises an issue when a group iterator returned by itertools.groupby() is stored outside the loop body for later use, instead +of being consumed immediately.

      Why is this an issue?

      The itertools.groupby() function groups consecutive items from an iterable based on a key function. It returns pairs of (key, group_iterator) where each group_iterator is a sub-iterator that yields items for that specific group.

      -

      A critical characteristic of these group iterators is that they are consumed when the main groupby iterator advances to the next -group. This means if you store a reference to a group iterator and try to use it later, it will be empty and yield no results.

      -

      This behavior occurs because groupby uses lazy evaluation for efficiency. The group iterators share the same underlying data source, -and advancing the main iterator invalidates previous group iterators. The problem typically manifests when storing group iterators in a collection for -later use or when trying to iterate over the same group iterator more than once.

      +

      A critical characteristic of these group iterators is that they share the same underlying data source as the main groupby iterator. +Every time the outer loop advances to the next group, the previous group iterator is immediately invalidated — regardless of whether it has been +iterated or not. Storing a raw group iterator and consuming it after the loop has moved on will always yield an empty sequence.

      What is the potential impact?

      When group iterators are reused, they yield no items. Your code will process empty sequences instead of the actual grouped data, leading to incorrect results, silent failures, and data loss. These issues can be difficult to debug because the code does not raise exceptions but simply produces wrong output.

      How to fix it

      -

      Convert the group iterator to a list immediately when processing each group. This materializes the data and stores it in memory, allowing you to -reuse it later.

      +

      There are two correct approaches:

      +
        +
      • Consume the group iterator immediately inside the loop body, never storing the raw iterator at all. This is the simplest + pattern and avoids any risk of reuse.
      • +
      • Materialize the group iterator into a concrete collection (list, tuple, set, etc.) + before the loop advances. This allows the data to be stored and accessed later.
      • +

      Code examples

      Noncompliant code example

      @@ -46,6 +49,5 @@ 

      Resources

      Documentation

      diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8516.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8516.json index df7badc1c..fddc58720 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8516.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8516.json @@ -14,7 +14,7 @@ "ruleSpecification": "RSPEC-8516", "sqKey": "S8516", "scope": "All", - "quickfix": "targeted", + "quickfix": "partial", "code": { "impacts": { "RELIABILITY": "HIGH" diff --git a/python-checks/src/test/java/org/sonar/python/checks/GroupByIteratorReuseCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/GroupByIteratorReuseCheckTest.java index 53f8a2091..ff4575d72 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/GroupByIteratorReuseCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/GroupByIteratorReuseCheckTest.java @@ -88,7 +88,7 @@ void no_quick_fix_when_multiple_reads_in_loop_body() { assertThat(issues).hasSize(3); assertThat(issues).extracting(i -> i.primaryLocation().startLine()).containsExactly(12, 13, 14); assertThat(issues).extracting(i -> i.primaryLocation().message()) - .containsOnly("Convert this group iterator to a list."); + .containsOnly("Consume this group iterator inside the loop, or materialize it into a collection."); // See fixture file header for the rationale on why no quickfix is attached. assertThat(issues).allSatisfy(issue -> assertThat(issue.quickFixes()).isEmpty()); diff --git a/python-checks/src/test/resources/checks/groupByIteratorReuse.py b/python-checks/src/test/resources/checks/groupByIteratorReuse.py index 09ece6de8..2b2b5ba56 100644 --- a/python-checks/src/test/resources/checks/groupByIteratorReuse.py +++ b/python-checks/src/test/resources/checks/groupByIteratorReuse.py @@ -1,68 +1,54 @@ from itertools import groupby -def noncompliant_stored_in_dict(): +def noncompliant_assigned_to_dict_subscript(): data = [1, 1, 2, 2, 3] groups = {} for key, group in groupby(data): - groups[key] = group # Noncompliant {{Convert this group iterator to a list.}} + groups[key] = group # Noncompliant {{Consume this group iterator inside the loop, or materialize it into a collection.}} # ^^^^^ -def noncompliant_as_regular_argument(): +def noncompliant_yielded(): data = [1, 1, 2, 2, 3] - result = [] for key, group in groupby(data): - result.append(group) # Noncompliant {{Convert this group iterator to a list.}} -# ^^^^^ + yield group # Noncompliant -def noncompliant_map_without_safe_wrapper(): - from operator import itemgetter +def noncompliant_inside_lambda_captured_by_outer_storage(): data = [1, 1, 2, 2, 3] + fns = [] for key, group in groupby(data): - it = map(itemgetter(0), group) # Noncompliant + fns.append(lambda: list(group)) # Noncompliant +# ^^^^^ -def fn_group_as_map_callable(): - # FN: passing `group` as the callable to `map`/`filter` (instead of as the iterable) is a - # clear bug, but it would also fail at runtime with a TypeError when the callable is invoked. +def noncompliant_chain_top_lands_at_sink(): data = [1, 1, 2, 2, 3] for key, group in groupby(data): - result = list(map(group, [1, 2, 3])) - - -def fp_lazy_passthrough_as_keyword_arg(): - # FP: `list(iterable=map(...))` materializes `map(...)` synchronously, so `group` does not - # escape — but the ancestor walk stops at the keyword-arg boundary because we don't resolve - # parameter names to confirm `iterable` is the materializing slot. - from operator import itemgetter - data = [(1, "a"), (1, "b"), (2, "c")] - for key, group in groupby(data): - result = list(iterable=map(itemgetter(0), group)) # Noncompliant + it = enumerate(group) # Noncompliant -def compliant_group_as_non_first_arg_of_safe_consumer(): - # Passing `group` at a non-iterable slot (e.g. as `key=` to sorted) is a TypeError at runtime +def noncompliant_set_add(): data = [1, 1, 2, 2, 3] + seen = set() for key, group in groupby(data): - result = sorted(key, group) + seen.add(group) # Noncompliant -def compliant_nested_in_non_lazy_call(): - # `str(group)` doesn't advance or retain `group` (it just calls __repr__) and the reference - # is dropped at end of statement, so `group` never escapes. +def noncompliant_dict_setdefault(): data = [1, 1, 2, 2, 3] + cache = {} for key, group in groupby(data): - result = list(str(group)) + cache.setdefault(key, group) # Noncompliant -def noncompliant_inside_lambda(): - data = [1, 1, 2, 2, 3] - fns = [] +def noncompliant_lazy_passthrough_to_storing_method(): + from operator import itemgetter + data = [(1, "a"), (1, "b"), (2, "c")] + out = [] for key, group in groupby(data): - fns.append(lambda: list(group)) # Noncompliant -# ^^^^^ + out.append(map(itemgetter(0), group)) # Noncompliant def noncompliant_groupby_alias(): @@ -73,24 +59,6 @@ def noncompliant_groupby_alias(): groups[key] = group # Noncompliant -def noncompliant_unsafe_with_safe_sibling(): - data = [1, 1, 2, 2, 3] - groups = {} - for key, group in groupby(data): - groups[key] = group # Noncompliant - for item in group: - print(item) - - -def fp_group_as_keyword_arg(): - # FP: `list(iterable=group)` is semantically equivalent to `list(group)` and materializes - # `group` synchronously, so it does not escape — but the rule conservatively rejects keyword - # args because we don't resolve parameter names to confirm `iterable` is the materializing slot. - data = [1, 1, 2, 2, 3] - for key, group in groupby(data): - result = list(iterable=group) # Noncompliant - - def compliant_immediate_list(): data = [1, 1, 2, 2, 3] groups = {} @@ -98,138 +66,73 @@ def compliant_immediate_list(): groups[key] = list(group) -def compliant_safe_consumers(): - # Exercises every entry of SAFE_CONSUMER_MATCHER to catch a potential type-resolution regression - data = [1, 1, 2, 2, 3] - for key, group in groupby(data): - as_tuple = tuple(group) - for key, group in groupby(data): - as_set = set(group) - for key, group in groupby(data): - as_frozenset = frozenset(group) - for key, group in groupby(data): - ordered = sorted(group) - for key, group in groupby(data): - total = sum(group) - for key, group in groupby(data): - biggest = max(group) +def compliant_str_join(): + data = ["a", "a", "b"] for key, group in groupby(data): - smallest = min(group) - for key, group in groupby(data): - has_any = any(group) - for key, group in groupby(data): - has_all = all(group) + joined = ",".join(group) -def compliant_generator_expression(): +def compliant_group_passed_to_runtime_class_object(): data = [1, 1, 2, 2, 3] + container_class = type([]) for key, group in groupby(data): - count = sum(1 for _ in group) + container = container_class(group) -def compliant_nested_for(): +def compliant_for_loop_iterable(): data = [1, 1, 2, 2, 3] for key, group in groupby(data): for item in group: print(item) -def compliant_not_a_call(): - data = [(1, [10, 11]), (2, [20, 21])] - groups = {} - for key, group in data: - groups[key] = group - - -def compliant_non_groupby_call(): - def my_groupby(data): - return iter([]) - - data = [1, 1, 2, 2, 3] - groups = {} - for key, group in my_groupby(data): - groups[key] = group - - -def compliant_groupby_full_module_path(): - import itertools - data = [1, 1, 2, 2, 3] - groups = {} - for key, group in itertools.groupby(data): - groups[key] = list(group) - - -def compliant_list_of_map(): - from operator import itemgetter +def compliant_outer_group_consumed_by_nested_groupby(): data = [(1, "a"), (1, "b"), (2, "c")] for key, group in groupby(data): - keys = list(map(itemgetter(0), group)) - - -def compliant_list_of_filter(): - data = [1, 1, 2, 2, 3] - for key, group in groupby(data): - odd = list(filter(lambda x: x % 2, group)) - - -def compliant_list_of_map_of_filter(): - data = [1, 1, 2, 2, 3] - for key, group in groupby(data): - result = list(map(str, filter(bool, group))) - - -def compliant_list_of_zip_of_enumerate(): - data = [1, 1, 2, 2, 3] - for key, group in groupby(data): - result = list(zip([10, 20], enumerate(group))) + for subkey, subgroup in groupby(group): + print(subkey, list(subgroup)) -def compliant_list_of_enumerate(): +def compliant_print(): data = [1, 1, 2, 2, 3] for key, group in groupby(data): - indexed = list(enumerate(group)) + print(group) -def compliant_list_of_zip_first_arg(): - data = [1, 1, 2, 2, 3] +def compliant_lazy_passthrough_consumed_by_outer_safe_consumer_map(): + from operator import itemgetter + data = [(1, "a"), (1, "b"), (2, "c")] for key, group in groupby(data): - zipped = list(zip(group, [10, 20, 30])) + keys = list(map(itemgetter(0), group)) -def compliant_list_of_zip_second_arg(): +def compliant_group_as_keyword_arg(): data = [1, 1, 2, 2, 3] for key, group in groupby(data): - zipped = list(zip([10, 20, 30], group)) + result = list(iterable=group) -def compliant_list_of_islice(): - from itertools import islice +def compliant_extended_into_list(): data = [1, 1, 2, 2, 3] + out = [] for key, group in groupby(data): - head = list(islice(group, 2)) - + out.extend(group) -def noncompliant_enumerate_without_safe_wrapper(): - data = [1, 1, 2, 2, 3] - for key, group in groupby(data): - it = enumerate(group) # Noncompliant - -def compliant_enumerate_at_wrong_arg_index(): - # `list(...)` materializes synchronously so `group` cannot escape - data = [1, 1, 2, 2, 3] +def compliant_dict_updated_with_group(): + data = [(1, "a"), (1, "b"), (2, "c")] + mapping = {} for key, group in groupby(data): - result = list(enumerate([10, 20], group)) + mapping.update(group) -def compliant_group_passed_to_variable_class(): +def compliant_returned(): data = [1, 1, 2, 2, 3] - container_class = type([]) for key, group in groupby(data): - container = container_class(group) + return group -def compliant_group_rebound(): +def compliant_group_rebound_in_loop_body(): data = [1, 1, 2, 2, 3] for key, group in groupby(data): group = list(group) @@ -255,6 +158,23 @@ def compliant_single_loop_variable(): saved = pair +def compliant_not_a_call(): + data = [(1, [10, 11]), (2, [20, 21])] + groups = {} + for key, group in data: + groups[key] = group + + +def compliant_non_groupby_call(): + def my_groupby(data): + return iter([]) + + data = [1, 1, 2, 2, 3] + groups = {} + for key, group in my_groupby(data): + groups[key] = group + + def fn_unresolved_callee(): # FN: unresolved callee assumed safe to avoid false positives from nonexistent_module import safe_consumer data = [1, 1, 2, 2, 3] @@ -267,31 +187,24 @@ def fn_groupby_in_dict_comprehension(): # FN: check only handles FOR_STMT groups = {k: g for k, g in groupby(data)} -def fp_outer_group_consumed_by_nested_groupby(): - # FP: the inner `for ... in groupby(group):` fully consumes `group` before the outer - # iterator advances, so it does not escape — but `itertools.groupby` is not a safe consumer, - # so the ancestor walk does not recognize the chain as safe. - data = [(1, "a"), (1, "b"), (2, "c")] +def fn_in_container_literal(): # FN: container-literal sinks are not analyzed + data = [1, 1, 2, 2, 3] for key, group in groupby(data): - for subkey, subgroup in groupby(group): # Noncompliant - print(subkey, list(subgroup)) + return [group] -def fn_rebinding_in_conditional_branch(cond): - # FN: as soon as `group` is rebound anywhere in the loop body, the rule conservatively - # skips the loop to keep the rule purely AST-based. +def fn_in_else_clause(): # FN: only the for-statement body is analyzed data = [1, 1, 2, 2, 3] - groups = {} + saved = None for key, group in groupby(data): - if cond: - group = list(group) - groups[key] = group # FN: on the `cond is False` path, this stores the raw iterator + pass + else: + saved = group -def fn_unsafe_read_before_unconditional_rebinding(): - # FN: same reasoning as above. +def fn_with_any_rebinding(): # FN: any rebinding of `group` in the body causes us to skip the loop data = [1, 1, 2, 2, 3] groups = {} for key, group in groupby(data): - groups[key] = group # FN: real bug, but suppressed by the rebinding below + groups[key] = group group = list(group) From 1298c1953f658e0e01d36509645d621876cf6f35 Mon Sep 17 00:00:00 2001 From: Guillaume Dequenne Date: Wed, 6 May 2026 13:26:54 +0200 Subject: [PATCH 116/322] SONARPY-4149 Update rules metadata (#1101) GitOrigin-RevId: 0810083f257b39127f369f634a29d48ff04d1575 --- .../python/checks/OpenSourceCheckList.java | 2 - .../python/checks/hotspots/OsExecCheck.java | 74 ------------- .../org/sonar/l10n/py/rules/python/S1313.html | 75 ++++++------- .../org/sonar/l10n/py/rules/python/S1313.json | 8 +- .../org/sonar/l10n/py/rules/python/S1523.html | 6 +- .../org/sonar/l10n/py/rules/python/S2068.json | 3 +- .../org/sonar/l10n/py/rules/python/S2092.json | 3 +- .../org/sonar/l10n/py/rules/python/S2257.html | 33 ++++-- .../org/sonar/l10n/py/rules/python/S2257.json | 8 +- .../org/sonar/l10n/py/rules/python/S2612.html | 2 +- .../org/sonar/l10n/py/rules/python/S2612.json | 3 +- .../org/sonar/l10n/py/rules/python/S4426.html | 4 +- .../org/sonar/l10n/py/rules/python/S4721.html | 96 ++++------------- .../org/sonar/l10n/py/rules/python/S4721.json | 13 +-- .../org/sonar/l10n/py/rules/python/S4828.html | 54 +++++----- .../org/sonar/l10n/py/rules/python/S4828.json | 14 ++- .../org/sonar/l10n/py/rules/python/S5042.html | 87 +++++++-------- .../org/sonar/l10n/py/rules/python/S5042.json | 14 +-- .../org/sonar/l10n/py/rules/python/S5122.html | 102 ++++++++++-------- .../org/sonar/l10n/py/rules/python/S5122.json | 16 ++- .../org/sonar/l10n/py/rules/python/S5247.json | 3 +- .../org/sonar/l10n/py/rules/python/S5443.html | 84 ++++++++------- .../org/sonar/l10n/py/rules/python/S5443.json | 12 ++- .../org/sonar/l10n/py/rules/python/S6265.html | 63 ++++++----- .../org/sonar/l10n/py/rules/python/S6265.json | 8 +- .../org/sonar/l10n/py/rules/python/S6270.html | 38 ++++--- .../org/sonar/l10n/py/rules/python/S6270.json | 8 +- .../org/sonar/l10n/py/rules/python/S6275.html | 67 +++++------- .../org/sonar/l10n/py/rules/python/S6275.json | 12 ++- .../org/sonar/l10n/py/rules/python/S6302.html | 48 +++++---- .../org/sonar/l10n/py/rules/python/S6302.json | 9 +- .../org/sonar/l10n/py/rules/python/S6303.html | 91 +++++----------- .../org/sonar/l10n/py/rules/python/S6303.json | 8 +- .../org/sonar/l10n/py/rules/python/S6308.html | 72 +++++-------- .../org/sonar/l10n/py/rules/python/S6308.json | 8 +- .../org/sonar/l10n/py/rules/python/S6319.html | 54 +++++----- .../org/sonar/l10n/py/rules/python/S6319.json | 10 +- .../org/sonar/l10n/py/rules/python/S6330.html | 39 +++---- .../org/sonar/l10n/py/rules/python/S6330.json | 8 +- .../org/sonar/l10n/py/rules/python/S6332.html | 44 ++++---- .../org/sonar/l10n/py/rules/python/S6332.json | 8 +- .../org/sonar/l10n/py/rules/python/S6418.html | 4 +- .../org/sonar/l10n/py/rules/python/S6418.json | 3 +- .../org/sonar/l10n/py/rules/python/S6463.html | 49 +++++---- .../org/sonar/l10n/py/rules/python/S6463.json | 8 +- .../org/sonar/l10n/py/rules/python/S6985.html | 15 ++- .../org/sonar/l10n/py/rules/python/S6985.json | 10 +- .../org/sonar/l10n/py/rules/python/S8409.json | 4 +- .../org/sonar/l10n/py/rules/python/S8410.json | 4 +- .../org/sonar/l10n/py/rules/python/S8500.html | 2 - .../org/sonar/l10n/py/rules/python/S8502.html | 18 +++- .../org/sonar/l10n/py/rules/python/S8502.json | 12 ++- .../org/sonar/l10n/py/rules/python/S8505.html | 82 ++++++++------ .../org/sonar/l10n/py/rules/python/S8505.json | 2 +- .../org/sonar/l10n/py/rules/python/S8508.html | 59 +++++++--- .../org/sonar/l10n/py/rules/python/S8508.json | 10 +- .../org/sonar/l10n/py/rules/python/S8509.html | 26 ++++- .../org/sonar/l10n/py/rules/python/S8509.json | 22 ++-- .../org/sonar/l10n/py/rules/python/S8510.html | 42 +++++++- .../org/sonar/l10n/py/rules/python/S8510.json | 22 ++-- .../org/sonar/l10n/py/rules/python/S8511.html | 30 +++--- .../org/sonar/l10n/py/rules/python/S8511.json | 12 ++- .../org/sonar/l10n/py/rules/python/S8512.html | 27 +++-- .../org/sonar/l10n/py/rules/python/S8512.json | 20 ++-- .../org/sonar/l10n/py/rules/python/S8513.html | 30 ++++-- .../org/sonar/l10n/py/rules/python/S8513.json | 15 ++- .../org/sonar/l10n/py/rules/python/S8514.html | 2 +- .../org/sonar/l10n/py/rules/python/S8515.html | 7 +- .../org/sonar/l10n/py/rules/python/S8515.json | 14 ++- .../org/sonar/l10n/py/rules/python/S8516.html | 4 +- .../org/sonar/l10n/py/rules/python/S8518.html | 31 +++++- .../org/sonar/l10n/py/rules/python/S8518.json | 12 ++- .../org/sonar/l10n/py/rules/python/S8572.html | 23 +--- .../python/Sonar_agentic_AI_profile.json | 2 - .../py/rules/python/Sonar_way_profile.json | 10 +- .../checks/OpenSourceCheckListTest.java | 2 +- .../checks/hotspots/OsExecCheckTest.java | 27 ----- .../test/resources/checks/hotspots/osExec.py | 49 --------- .../python/PythonRuleRepositoryTest.java | 16 +-- sonarpedia.json | 2 +- 80 files changed, 1036 insertions(+), 1004 deletions(-) delete mode 100644 python-checks/src/main/java/org/sonar/python/checks/hotspots/OsExecCheck.java delete mode 100644 python-checks/src/test/java/org/sonar/python/checks/hotspots/OsExecCheckTest.java delete mode 100644 python-checks/src/test/resources/checks/hotspots/osExec.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 085de8675..aebf2a44b 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -60,7 +60,6 @@ import org.sonar.python.checks.hotspots.HttpOnlyCookieCheck; import org.sonar.python.checks.hotspots.LoggersConfigurationCheck; import org.sonar.python.checks.hotspots.NonStandardCryptographicAlgorithmCheck; -import org.sonar.python.checks.hotspots.OsExecCheck; import org.sonar.python.checks.hotspots.ProcessSignallingCheck; import org.sonar.python.checks.hotspots.PseudoRandomCheck; import org.sonar.python.checks.hotspots.PubliclyWritableDirectoriesCheck; @@ -359,7 +358,6 @@ public Stream> getChecks() { UnusedGroupNamesCheck.class, OctalEscapeCheck.class, OneStatementPerLineCheck.class, - OsExecCheck.class, OverwrittenCollectionEntryCheck.class, PandasAddMergeParametersCheck.class, PandasChainInstructionCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/OsExecCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/OsExecCheck.java deleted file mode 100644 index d0eb3205e..000000000 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/OsExecCheck.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * SonarQube Python Plugin - * Copyright (C) SonarSource Sàrl - * mailto:info AT sonarsource DOT com - * - * You can redistribute and/or modify this program under the terms of - * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the Sonar Source-Available License for more details. - * - * You should have received a copy of the Sonar Source-Available License - * along with this program; if not, see https://sonarsource.com/license/ssal/ - */ -package org.sonar.python.checks.hotspots; - -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; -import org.sonar.check.Rule; -import org.sonar.python.checks.AbstractCallExpressionCheck; - -@Rule(key = OsExecCheck.CHECK_KEY) -public class OsExecCheck extends AbstractCallExpressionCheck { - - public static final String CHECK_KEY = "S4721"; - private static final String MESSAGE = "Make sure that executing this OS command is safe here."; - - private static final Set questionableFunctions = new HashSet<>(Arrays.asList("subprocess.run", - "subprocess.Popen", - "subprocess.call", - "subprocess.check_call", - "subprocess.check_output", - "subprocess.getstatusoutput", - "subprocess.getoutput", - "os.system", - "os.spawnl", - "os.spawnle", - "os.spawnlp", - "os.spawnlpe", - "os.spawnv", - "os.spawnve", - "os.spawnvp", - "os.spawnvpe", - "os.popen", - "os.startfile", - "os.execl", - "os.execle", - "os.execlp", - "os.execlpe", - "os.execv", - "os.execve", - "os.execvp", - "os.execvpe", - "os.popen2", - "os.popen3", - "os.popen4", - "popen2.popen2", - "popen2.popen3", - "popen2.popen4" - )); - - @Override - protected Set functionsToCheck() { - return questionableFunctions; - } - - @Override - protected String message() { - return MESSAGE; - } -} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1313.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1313.html index bf034f2e1..b2eacdeda 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1313.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1313.html @@ -1,44 +1,23 @@ -

      Hardcoding IP addresses is security-sensitive. It has led in the past to the following vulnerabilities:

      +

      IP addresses hardcoded in source code couple the application to a specific infrastructure configuration. Today’s services have an ever-changing +architecture due to their scaling and redundancy needs. When an IP address changes, every hardcoded occurrence must be found and updated, which has an +impact on development, delivery, and deployment:

        -
      • CVE-2006-5901
      • -
      • CVE-2005-3725
      • +
      • Developers must fix the code every time the address changes, instead of having an operations team update a configuration file.
      • +
      • It leads to using the same address in every environment (dev, staging, QA, production).
      -

      Today’s services have an ever-changing architecture due to their scaling and redundancy needs. It is a mistake to think that a service will always -have the same IP address. When it does change, the hardcoded IP will have to be modified too. This will have an impact on the product development, -delivery, and deployment:

      -
        -
      • The developers will have to do a rapid fix every time this happens, instead of having an operation team change a configuration file.
      • -
      • It misleads to use the same address in every environment (dev, sys, qa, prod).
      • -
      -

      Last but not least it has an effect on application security. Attackers might be able to decompile the code and thereby discover a potentially -sensitive address. They can perform a Denial of Service attack on the service, try to get access to the system, or try to spoof the IP address to -bypass security checks. Such attacks can always be possible, but in the case of a hardcoded IP address solving the issue will take more time, which -will increase an attack’s impact.

      -

      Ask Yourself Whether

      -

      The disclosed IP address is sensitive, e.g.:

      -
        -
      • Can give information to an attacker about the network topology.
      • -
      • It’s a personal (assigned to an identifiable person) IP address.
      • -
      -

      There is a risk if you answered yes to any of these questions.

      -

      Recommended Secure Coding Practices

      -

      Don’t hard-code the IP address in the source code, instead make it configurable with environment variables, configuration files, or a similar -approach. Alternatively, if confidentially is not required a domain name can be used since it allows to change the destination quickly without having -to rebuild the software.

      -

      Sensitive Code Example

      -
      -ip = '192.168.12.42'
      -sock = socket.socket()
      -sock.bind((ip, 9090))
      -
      -

      Compliant Solution

      -
      -ip = config.get(section, ipAddress)
      -sock = socket.socket()
      -sock.bind((ip, 9090))
      -
      -

      Exceptions

      -

      No issue is reported for the following cases because they are not considered sensitive:

      +

      Why is this an issue?

      +

      Hardcoding an IP address embeds infrastructure configuration directly into the application. This means any change to the network environment—such +as moving a service to a different host or scaling horizontally—requires a code modification and a full redeployment. Unlike a domain name, a +hardcoded address also makes it harder to use different values across environments such as development, staging, and production.

      +

      What is the potential impact?

      +

      Environment coupling

      +

      A hardcoded IP address is the same in every environment the application runs in. This makes it difficult to point development, staging, and +production builds at different infrastructure without modifying the source code.

      +

      Increased deployment friction

      +

      Any change to the target host—such as migrating a service, scaling out, or rotating infrastructure—requires a code change and a full redeployment +cycle. This prevents operational teams from making infrastructure adjustments independently and slows down incident response.

      +

      Exceptions

      +

      No issue is reported for the following well-known, special-purpose addresses, as they do not represent configurable infrastructure endpoints:

      • Loopback addresses 127.0.0.0/8 in CIDR notation (from 127.0.0.0 to 127.255.255.255)
      • Broadcast address 255.255.255.255
      • @@ -50,7 +29,23 @@

        Exceptions

      • Addresses in the range 2001:db8::/32, reserved for documentation purposes by RFC 3849
      -

      See

      +

      How to fix it

      +

      Code examples

      +

      The following code contains a hardcoded IP address instead of reading it from configuration or environment variables.

      +

      Noncompliant code example

      +
      +ip = '192.168.12.42' # Noncompliant
      +sock = socket.socket()
      +sock.bind((ip, 9090))
      +
      +

      Compliant solution

      +
      +ip = config.get(section, ipAddress)
      +sock = socket.socket()
      +sock.bind((ip, 9090))
      +
      +

      Resources

      +

      Standards

      • OWASP - Top 10 2021 Category A1 - Broken Access Control
      • OWASP - Top 10 2017 Category A3 - Sensitive Data diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1313.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1313.json index a0192b2b4..218cac75b 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1313.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1313.json @@ -1,6 +1,6 @@ { - "title": "Using hardcoded IP addresses is security-sensitive", - "type": "SECURITY_HOTSPOT", + "title": "IP addresses should not be hardcoded", + "type": "CODE_SMELL", "code": { "impacts": { "SECURITY": "LOW" @@ -13,9 +13,11 @@ "constantCost": "30min" }, "tags": [ - "bad-practice" + "bad-practice", + "former-hotspot" ], "defaultSeverity": "Minor", + "quickfix": "unknown", "ruleSpecification": "RSPEC-1313", "sqKey": "S1313", "scope": "Main", diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1523.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1523.html index 9678a7b2e..68478d04f 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1523.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1523.html @@ -20,9 +20,9 @@

        Recommended Secure Coding Practices

        Regarding the execution of unknown code, the best solution is to not run code provided by an untrusted source. If you really need to do it, run the code in a sandboxed environment. Use jails, firewalls and whatever means your operating system and programming language provide (example: Security Managers in java, iframes and same-origin -policy for javascript in a web browser).

        +href="https://cmu-sei.github.io/secure-coding-standards/sei-cert-oracle-coding-standard-for-java/recommendations/platform-security-sec/sec54-j">Security +Managers in java, iframes and same-origin policy for javascript in a web browser).

        Do not try to create a blacklist of dangerous code. It is impossible to cover all attacks that way.

        Avoid using dynamic code APIs whenever possible. Hard-coded code is always safer.

        Sensitive Code Example

        diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2068.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2068.json index f9d8468af..a1abd7e14 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2068.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2068.json @@ -14,7 +14,8 @@ }, "quickfix": "infeasible", "tags": [ - "cwe" + "cwe", + "former-hotspot" ], "defaultSeverity": "Major", "ruleSpecification": "RSPEC-2068", diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2092.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2092.json index 60369ea47..c021c4d24 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2092.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2092.json @@ -18,7 +18,8 @@ "privacy", "fastapi", "django", - "flask" + "flask", + "former-hotspot" ], "defaultSeverity": "Minor", "ruleSpecification": "RSPEC-2092", diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2257.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2257.html index 2ff7e1b67..8eb93538f 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2257.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2257.html @@ -1,16 +1,27 @@ -

        The use of a non-standard algorithm is dangerous because a determined attacker may be able to break the algorithm and compromise whatever data has -been protected. Standard algorithms like Argon2PasswordHasher, BCryptPasswordHasher, …​ should be used instead.

        -

        This rule tracks creation of BasePasswordHasher subclasses for Django applications.

        -

        Recommended Secure Coding Practices

        -
          -
        • Use a standard algorithm instead of creating a custom one.
        • -
        -

        Sensitive Code Example

        -
        -class CustomPasswordHasher(BasePasswordHasher):  # Sensitive
        +

        Cryptographic operations should use proven, standard algorithms rather than custom implementations.

        +

        Why is this an issue?

        +

        Non-standard cryptographic algorithms are those that have not been publicly vetted by the security community or that implement cryptographic +primitives in a custom way. Creating a custom cryptographic algorithm by subclassing standard cryptographic base classes bypasses the rigorous testing +and peer review that established algorithms undergo. Custom implementations are likely to contain subtle flaws that could be exploited to break the +protection the algorithm is supposed to provide.

        +

        What is the potential impact?

        +

        Data compromise

        +

        When an attacker discovers a flaw in a custom cryptographic algorithm, they may be able to decrypt any data protected by it. Depending on the +application, this could expose passwords, personal data, financial records, or other sensitive information.

        +

        How to fix it

        +

        This rule detects custom implementations of BasePasswordHasher subclasses for Django applications.

        +

        Code examples

        +

        Noncompliant code example

        +
        +class CustomPasswordHasher(BasePasswordHasher):  # Noncompliant
             # ...
         
        -

        See

        +

        Compliant solution

        +
        +from django.contrib.auth.hashers import Argon2PasswordHasher
        +
        +

        Resources

        +

        Standards

        diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4721.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4721.html index e7021b3a5..8f4b8f6dd 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4721.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4721.html @@ -1,81 +1,29 @@ -

        This rule is deprecated, and will eventually be removed.

        Arbitrary OS command injection vulnerabilities are more likely when a shell is spawned rather than a new process, indeed shell meta-chars can be used (when parameters are user-controlled for instance) to inject OS commands.

        -

        Ask Yourself Whether

        -
          -
        • OS command name or parameters are user-controlled.
        • -
        -

        There is a risk if you answered yes to this question.

        -

        Recommended Secure Coding Practices

        -

        Use functions that don’t spawn a shell.

        -

        Sensitive Code Example

        -

        Python 3

        -
        -subprocess.run(cmd, shell=True)  # Sensitive
        -subprocess.Popen(cmd, shell=True)  # Sensitive
        -subprocess.call(cmd, shell=True)  # Sensitive
        -subprocess.check_call(cmd, shell=True)  # Sensitive
        -subprocess.check_output(cmd, shell=True)  # Sensitive
        -os.system(cmd)  # Sensitive: a shell is always spawn
        -
        -

        Python 2

        -
        -cmd = "when a string is passed through these function, a shell is spawn"
        -(_, child_stdout, _) = os.popen2(cmd)  # Sensitive
        -(_, child_stdout, _) = os.popen3(cmd)  # Sensitive
        -(_, child_stdout) = os.popen4(cmd)  # Sensitive
        -
        -
        -(child_stdout, _) = popen2.popen2(cmd)  # Sensitive
        -(child_stdout, _, _) = popen2.popen3(cmd)  # Sensitive
        -(child_stdout, _) = popen2.popen4(cmd)  # Sensitive
        +

        Why is this an issue?

        +

        When a shell interpreter is used to execute OS commands, shell meta-characters in user-controlled input can be exploited to inject additional +commands. Functions that spawn a shell process—such as os.system() in Python, exec() in JavaScript, or +Runtime.exec() in Java—create an attack surface for OS command injection that would not exist if a new process were spawned directly +without a shell. This is especially dangerous when the command name or parameters are derived from user input.

        +

        What is the potential impact?

        +

        An attacker who can control the OS command name or its parameters can inject arbitrary OS commands that execute with the privileges of the +application. This can lead to complete system compromise, unauthorized data access, or the installation of malware on the host.

        +

        How to fix it in Python Standard Library

        +

        Code examples

        +

        Noncompliant code example

        +
        +subprocess.run(cmd, shell=True)  # Noncompliant
        +subprocess.Popen(cmd, shell=True)  # Noncompliant
        +os.system(cmd)  # Noncompliant: a shell is always spawned
         
        -

        Compliant Solution

        -

        Python 3

        -
        -# by default shell=False, a shell is not spawn
        -subprocess.run(cmd)  # Compliant
        -subprocess.Popen(cmd)  # Compliant
        -subprocess.call(cmd)  # Compliant
        -subprocess.check_call(cmd)  # Compliant
        -subprocess.check_output(cmd)  # Compliant
        -
        -# always in a subprocess:
        -os.spawnl(mode, path, *cmd)  # Compliant
        -os.spawnle(mode, path, *cmd, env)  # Compliant
        -os.spawnlp(mode, file, *cmd)  # Compliant
        -os.spawnlpe(mode, file, *cmd, env)  # Compliant
        -os.spawnv(mode, path, cmd)  # Compliant
        -os.spawnve(mode, path, cmd, env)  # Compliant
        -os.spawnvp(mode, file, cmd)  # Compliant
        -os.spawnvpe(mode, file, cmd, env)  # Compliant
        -
        -(child_stdout) = os.popen(cmd, mode, 1)  # Compliant
        -(_, output) = subprocess.getstatusoutput(cmd)  # Compliant
        -out = subprocess.getoutput(cmd)  # Compliant
        -os.startfile(path)  # Compliant
        -os.execl(path, *cmd)  # Compliant
        -os.execle(path, *cmd, env)  # Compliant
        -os.execlp(file, *cmd)  # Compliant
        -os.execlpe(file, *cmd, env)  # Compliant
        -os.execv(path, cmd)  # Compliant
        -os.execve(path, cmd, env)  # Compliant
        -os.execvp(file, cmd)  # Compliant
        -os.execvpe(file, cmd, env)  # Compliant
        -
        -

        Python 2

        -
        -cmdsargs = ("use", "a", "sequence", "to", "directly", "start", "a", "subprocess")
        -
        -(_, child_stdout) = os.popen2(cmdsargs)  # Compliant
        -(_, child_stdout, _) = os.popen3(cmdsargs)  # Compliant
        -(_, child_stdout) = os.popen4(cmdsargs)  # Compliant
        -
        -(child_stdout, _) = popen2.popen2(cmdsargs)  # Compliant
        -(child_stdout, _, _) = popen2.popen3(cmdsargs)  # Compliant
        -(child_stdout, _) = popen2.popen4(cmdsargs)  # Compliant
        +

        Compliant solution

        +
        +# shell=False by default; no shell is spawned
        +subprocess.run(cmd)
        +subprocess.Popen(cmd)
         
        -

        See

        +

        Resources

        +

        Standards

        • OWASP - Top 10 2021 Category A3 - Injection
        • OWASP - Top 10 2017 Category A1 - Injection
        • diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4721.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4721.json index 9d984fa93..679d1bcd1 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4721.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4721.json @@ -1,19 +1,21 @@ { - "title": "Using shell interpreter when executing OS commands is security-sensitive", - "type": "SECURITY_HOTSPOT", + "title": "OS commands should not be executed using a shell interpreter", + "type": "VULNERABILITY", + "quickfix": "unknown", "code": { "impacts": { "SECURITY": "MEDIUM" }, "attribute": "TRUSTWORTHY" }, - "status": "deprecated", + "status": "closed", "remediation": { "func": "Constant\/Issue", "constantCost": "30min" }, "tags": [ - "deprecated" + "cwe", + "former-hotspot" ], "defaultSeverity": "Major", "ruleSpecification": "RSPEC-4721", @@ -33,6 +35,5 @@ "12.3.5", "5.3.8" ] - }, - "quickfix": "unknown" + } } diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4828.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4828.html index 6e8764ac1..b80da7ad0 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4828.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4828.html @@ -1,37 +1,31 @@ -

          Signaling processes or process groups can seriously affect the stability of this application or other applications on the same system.

          -

          Accidentally setting an incorrect PID or signal or allowing untrusted sources to assign arbitrary values to these -parameters may result in a denial of service.

          -

          Also, the system treats the signal differently if the destination PID is less than or equal to 0. This different behavior may affect -multiple processes with the same (E)UID simultaneously if the call is left uncontrolled.

          -

          Ask Yourself Whether

          -
            -
          • The parameters pid and sig are untrusted (they come from an external source).
          • -
          • This function is triggered by non-administrators.
          • -
          • Signal handlers on the target processes stop important functions.
          • -
          -

          There is a risk if you answered yes to any of those questions.

          -

          Recommended Secure Coding Practices

          -
            -
          • For stateful applications with user management, ensure that only administrators trigger this code.
          • -
          • Verify that the pid and sig parameters are correct before using them.
          • -
          • Ensure that the process sending the signals runs with as few OS privileges as possible.
          • -
          • Isolate the process on the system based on its (E)UID.
          • -
          • Ensure that the signal does not interrupt any essential functions when intercepted by a target’s signal handlers.
          • -
          -

          Sensitive Code Example

          -
          +

          This rule is deprecated, and will eventually be removed.

          +

          Sending OS signals without validating the target process ID or signal type can seriously affect the stability of the application or other processes +on the system.

          +

          Why is this an issue?

          +

          OS signals control process execution: they can pause, terminate, or interrupt a process. When the destination PID or signal type are +derived from untrusted input without validation, an attacker can target arbitrary processes, including processes they do not own. Additionally, using +a non-positive PID sends the signal to an entire process group simultaneously, multiplying the impact of an uncontrolled call.

          +

          What is the potential impact?

          +

          Denial of service

          +

          An attacker who controls the PID or signal value can terminate or interrupt arbitrary processes, including critical system services. +This can crash the application, destabilize the host, or deny service to all other users of the system.

          +

          How to fix it

          +

          Code examples

          +

          The following code passes a process identifier received directly from user input to the signal function.

          +

          Noncompliant code example

          +
           import os
           
           @app.route("/kill-pid/<pid>")
           def send_signal(pid):
          -    os.kill(pid, 9)  # Sensitive
          +    os.kill(pid, 9)  # Noncompliant
           
           @app.route("/kill-pgid/<pgid>")
           def send_signal(pgid):
          -    os.killpg(pgid, 9)  # Sensitive
          +    os.killpg(pgid, 9)  # Noncompliant
           
          -

          Compliant Solution

          -
          +

          Compliant solution

          +
           import os
           
           @app.route("/kill-pid/<pid>")
          @@ -48,10 +42,14 @@ 

          Compliant Solution

          if is_valid_pgid(pgid): os.kill(pgid, 9)
          -

          See

          +

          Resources

          +

          Documentation

          +

          Standards

          + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4828.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4828.json index 26f9422d6..a7c9d73cc 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4828.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4828.json @@ -1,15 +1,21 @@ { - "title": "Signaling processes is security-sensitive", - "type": "SECURITY_HOTSPOT", + "title": "OS process signal parameters should be validated", + "type": "CODE_SMELL", "code": { "impacts": { "SECURITY": "HIGH" }, "attribute": "CONVENTIONAL" }, - "status": "ready", + "status": "deprecated", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "30min" + }, + "quickfix": "unknown", "tags": [ - "cwe" + "cwe", + "former-hotspot" ], "defaultSeverity": "Critical", "ruleSpecification": "RSPEC-4828", diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5042.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5042.html index 320f97e59..b007ab645 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5042.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5042.html @@ -1,48 +1,34 @@ +

          This rule is deprecated, and will eventually be removed.

          Successful Zip Bomb attacks occur when an application expands untrusted archive files without controlling the size of the expanded data, which can lead to denial of service. A Zip bomb is usually a malicious archive file of a few kilobytes of compressed data but turned into gigabytes of uncompressed data. To achieve this extreme compression ratio, attackers will compress irrelevant data (eg: a long string of repeated bytes).

          -

          Ask Yourself Whether

          -

          Archives to expand are untrusted and:

          -
            -
          • There is no validation of the number of entries in the archive.
          • -
          • There is no validation of the total size of the uncompressed data.
          • -
          • There is no validation of the ratio between the compressed and uncompressed archive entry.
          • -
          -

          There is a risk if you answered yes to any of those questions.

          -

          Recommended Secure Coding Practices

          -
            -
          • Define and control the ratio between compressed and uncompressed data, in general the data compression ratio for most of the legit archives is 1 - to 3.
          • -
          • Define and control the threshold for maximum total size of the uncompressed data.
          • -
          • Count the number of file entries extracted from the archive and abort the extraction if their number is greater than a predefined threshold, in - particular it’s not recommended to recursively expand archives (an entry of an archive could be also an archive).
          • -
          -

          Sensitive Code Example

          -

          For tarfile module:

          -
          +

          Why is this an issue?

          +

          Expanding archive files without controlling the size of the extracted data can lead to denial of service. A Zip bomb is a malicious archive of a +few kilobytes of compressed data that expands into gigabytes of uncompressed data by compressing highly repetitive content. Applications that fail to +validate the number of entries, total uncompressed size, or compression ratio of an archive are vulnerable to this attack.

          +

          What is the potential impact?

          +

          Denial of service

          +

          An attacker who can supply a malicious archive can exhaust the server’s disk space, memory, or CPU by triggering unbounded decompression. This can +make the application completely unavailable to legitimate users and may require manual intervention to recover the affected system.

          +

          How to fix it in tarfile

          +

          Validate the number of entries and total uncompressed size when extracting archive files. Note that the tarfile module does not expose +compressed entry sizes, so compression ratio checking is not applicable here.

          +

          Code examples

          +

          Noncompliant code example

          +
           import tarfile
           
           tfile = tarfile.open("TarBomb.tar")
          -tfile.extractall('./tmp/')  # Sensitive
          +tfile.extractall('./tmp/')  # Noncompliant
           tfile.close()
           
          -

          For zipfile module:

          -
          -import zipfile
          -
          -zfile = zipfile.ZipFile('ZipBomb.zip', 'r')
          -zfile.extractall('./tmp/') # Sensitive
          -zfile.close()
          -
          -

          Compliant Solution

          -

          For tarfile module:

          -
          +

          Compliant solution

          +
           import tarfile
           
           THRESHOLD_ENTRIES = 10000
           THRESHOLD_SIZE = 1000000000
          -THRESHOLD_RATIO = 10
           
           totalSizeArchive = 0;
           totalEntryArchive = 0;
          @@ -50,6 +36,8 @@ 

          Compliant Solution

          tfile = tarfile.open("TarBomb.tar") for entry in tfile: tarinfo = tfile.extractfile(entry) + if tarinfo is None: + continue # skip directories, symlinks, etc. totalEntryArchive += 1 sizeEntry = 0 @@ -58,9 +46,8 @@

          Compliant Solution

          sizeEntry += 1024 totalSizeArchive += 1024 - ratio = sizeEntry / entry.size - if ratio > THRESHOLD_RATIO: - # ratio between compressed and uncompressed data is highly suspicious, looks like a Zip Bomb Attack + if totalSizeArchive > THRESHOLD_SIZE: + # the uncompressed data size is too much for the application resource capacity break chunk = tarinfo.read(1024) @@ -73,14 +60,24 @@

          Compliant Solution

          # too much entries in this archive, can lead to inodes exhaustion of the system break - if totalSizeArchive > THRESHOLD_SIZE: - # the uncompressed data size is too much for the application resource capacity - break - tfile.close()
          -

          For zipfile module:

          -
          +

          How to fix it in zipfile

          +

          Validate the number of entries, total uncompressed size, and compression ratio when extracting archive files. Note that zfile.read() +fully decompresses each entry into memory before the size check runs, since the zipfile module has no streaming per-entry extraction API. +This pattern protects against entry-count attacks but cannot prevent a single malicious entry from causing an out-of-memory condition before the check +fires.

          +

          Code examples

          +

          Noncompliant code example

          +
          +import zipfile
          +
          +zfile = zipfile.ZipFile('ZipBomb.zip', 'r')
          +zfile.extractall('./tmp/') # Noncompliant
          +zfile.close()
          +
          +

          Compliant solution

          +
           import zipfile
           
           THRESHOLD_ENTRIES = 10000
          @@ -113,7 +110,12 @@ 

          Compliant Solution

          zfile.close()
          -

          See

          +

          Resources

          +

          Articles & blog posts

          + +

          Standards

          diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5042.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5042.json index 073e73bd0..66bfa02dd 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5042.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5042.json @@ -1,21 +1,23 @@ { - "title": "Expanding archive files without controlling resource consumption is security-sensitive", - "type": "SECURITY_HOTSPOT", + "title": "Expanding archive files should not be done without controlling resource consumption", + "type": "CODE_SMELL", + "quickfix": "unknown", "code": { "impacts": { - "SECURITY": "HIGH" + "RELIABILITY": "MEDIUM" }, "attribute": "COMPLETE" }, - "status": "ready", + "status": "deprecated", "remediation": { "func": "Constant\/Issue", "constantCost": "10min" }, "tags": [ - "cwe" + "cwe", + "former-hotspot" ], - "defaultSeverity": "Critical", + "defaultSeverity": "Major", "ruleSpecification": "RSPEC-5042", "sqKey": "S5042", "scope": "Main", diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5122.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5122.html index e6fcac91d..5fb61e713 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5122.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5122.html @@ -1,77 +1,85 @@ -

          Having a permissive Cross-Origin Resource Sharing policy is security-sensitive. It has led in the past to the following vulnerabilities:

          - -

          Same origin policy in browsers prevents, by default and for -security-reasons, a javascript frontend to perform a cross-origin HTTP request to a resource that has a different origin (domain, protocol, or port) -from its own. The requested target can append additional HTTP headers in response, called CORS, that act like directives for the browser and change the access control policy -/ relax the same origin policy.

          -

          Ask Yourself Whether

          -
            -
          • You don’t trust the origin specified, example: Access-Control-Allow-Origin: untrustedwebsite.com.
          • -
          • Access control policy is entirely disabled: Access-Control-Allow-Origin: *
          • -
          • Your access control policy is dynamically defined by a user-controlled input like origin header.
          • -
          -

          There is a risk if you answered yes to any of those questions.

          -

          Recommended Secure Coding Practices

          -
            -
          • The Access-Control-Allow-Origin header should be set only for a trusted origin and for specific resources.
          • -
          • Allow only selected, trusted domains in the Access-Control-Allow-Origin header. Prefer whitelisting domains over blacklisting or - allowing any domain (do not use * wildcard nor blindly return the Origin header content without any checks).
          • -
          -

          Sensitive Code Example

          -

          Django:

          -
          -CORS_ORIGIN_ALLOW_ALL = True # Sensitive
          +

          Setting an overly permissive Cross-Origin Resource Sharing (CORS) policy allows malicious websites to read responses from your application on +behalf of authenticated users.

          +

          Why is this an issue?

          +

          Same-origin policy in browsers prevents JavaScript from +making cross-origin HTTP requests to resources with a different origin (domain, protocol, or port). The Cross-Origin Resource Sharing (CORS) mechanism allows servers to relax this +restriction by including Access-Control-Allow-Origin response headers that tell browsers which origins are permitted.

          +

          Setting the Access-Control-Allow-Origin header to a wildcard (*) or dynamically reflecting a user-supplied +Origin header without validation completely disables same-origin protection for the affected resource.

          +

          What is the potential impact?

          +

          Sensitive data exposure

          +

          When CORS restrictions are disabled, a malicious website visited by an authenticated user can issue cross-origin requests to the vulnerable +application and read the responses. This allows attackers to steal sensitive data accessible to the victim, such as account details, API keys, or +private application data.

          +

          Account takeover

          +

          If the application is also configured with Access-Control-Allow-Credentials: true, the browser will include cookies and HTTP +authentication headers in cross-origin requests. Attackers can then perform authenticated operations on behalf of the victim, potentially leading to +full account takeover or unauthorized data modification.

          +

          How to fix it in Django

          +

          Set CORS_ORIGIN_ALLOW_ALL to False and configure specific allowed origins.

          +

          Code examples

          +

          Noncompliant code example

          +
          +CORS_ORIGIN_ALLOW_ALL = True # Noncompliant
           
          -

          Flask:

          -
          +

          Compliant solution

          +
          +CORS_ORIGIN_ALLOW_ALL = False
          +
          +

          How to fix it in Flask

          +

          Configure the CORS extension with specific allowed origins and validate user-supplied origins against an allow-list.

          +

          Code examples

          +

          Noncompliant code example

          +
           from flask import Flask
           from flask_cors import CORS
           
           app = Flask(__name__)
          -CORS(app, resources={r"/*": {"origins": "*", "send_wildcard": "True"}}) # Sensitive
          +CORS(app, resources={r"/*": {"origins": "*"}}) # Noncompliant
           

          User-controlled origin:

          -
          +
           origin = request.headers['ORIGIN']
           resp = Response()
          -resp.headers['Access-Control-Allow-Origin'] = origin # Sensitive
          -
          -

          Compliant Solution

          -

          Django:

          -
          -CORS_ORIGIN_ALLOW_ALL = False # Compliant
          +resp.headers['Access-Control-Allow-Origin'] = origin # Noncompliant
           
          -

          Flask:

          -
          +

          Compliant solution

          +
           from flask import Flask
           from flask_cors import CORS
           
           app = Flask(__name__)
          -CORS(app, resources={r"/*": {"origins": "*", "send_wildcard": "False"}}) # Compliant
          +
          +TRUSTED_ORIGINS = [
          +    "https://example.com",
          +]
          +
          +CORS(app, resources={r"/*": {"origins": TRUSTED_ORIGINS}})
           

          User-controlled origin validated with an allow-list:

          -
          +
          +TRUSTED_ORIGINS = ["https://example.com"]
           origin = request.headers['ORIGIN']
           resp = Response()
           if origin in TRUSTED_ORIGINS:
              resp.headers['Access-Control-Allow-Origin'] = origin
           
          -

          See

          +

          Resources

          +

          Documentation

          + +

          Standards

          diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5122.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5122.json index 5b1f378f2..bd501a67b 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5122.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5122.json @@ -1,19 +1,25 @@ { - "title": "Having a permissive Cross-Origin Resource Sharing policy is security-sensitive", - "type": "SECURITY_HOTSPOT", + "title": "Cross-Origin Resource Sharing (CORS) policy should be restricted to trusted origins", + "type": "VULNERABILITY", "code": { "impacts": { - "SECURITY": "LOW" + "SECURITY": "MEDIUM" }, "attribute": "COMPLETE" }, "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "4h" + }, + "quickfix": "unknown", "tags": [ "cwe", "django", - "flask" + "flask", + "former-hotspot" ], - "defaultSeverity": "Minor", + "defaultSeverity": "Major", "ruleSpecification": "RSPEC-5122", "sqKey": "S5122", "scope": "Main", diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5247.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5247.json index b3e90ed2a..3df7bfb86 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5247.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5247.json @@ -14,7 +14,8 @@ }, "tags": [ "cwe", - "django" + "django", + "former-hotspot" ], "defaultSeverity": "Major", "ruleSpecification": "RSPEC-5247", diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5443.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5443.html index f2ee17d97..4a7be804d 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5443.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5443.html @@ -1,14 +1,11 @@ -

          Operating systems have global directories where any user has write access. Those folders are mostly used as temporary storage areas like -/tmp in Linux based systems. An application manipulating files from these folders is exposed to race conditions on filenames: a malicious -user can try to create a file with a predictable name before the application does. A successful attack can result in other files being accessed, -modified, corrupted or deleted. This risk is even higher if the application runs with elevated permissions.

          -

          In the past, it has led to the following vulnerabilities:

          - -

          This rule raises an issue whenever it detects a hard-coded path to a publicly writable directory like /tmp (see examples below). It -also detects access to environment variables that point to publicly writable directories, e.g., TMP and TMPDIR.

          +

          Using publicly writable directories such as /tmp to store temporary files exposes an application to race condition +vulnerabilities.

          +

          Why is this an issue?

          +

          Operating systems provide globally writable directories—such as /tmp on Linux or \Windows\Temp on Windows—where any user +can create, read, and modify files. When an application creates files in these directories with predictable names, it becomes vulnerable to race +conditions: an attacker can create a file with the same name before the application does, potentially causing the application to read or write +attacker-controlled content.

          +

          This rule raises an issue when it detects hard-coded paths to publicly writable directories, such as:

          • /tmp
          • /var/tmp
          • @@ -24,39 +21,50 @@
          • \Windows\Temp
          • \Temp
          • \TMP
          • +
          • %USERPROFILE%\AppData\Local\Temp
          -

          Ask Yourself Whether

          -
            -
          • Files are read from or written into a publicly writable folder
          • -
          • The application creates files with predictable names into a publicly writable folder
          • -
          -

          There is a risk if you answered yes to any of those questions.

          -

          Recommended Secure Coding Practices

          -
            -
          • Use a dedicated sub-folder with tightly controlled permissions
          • -
          • Use secure-by-design APIs to create temporary files. Such API will make sure: -
              -
            • The generated filename is unpredictable
            • -
            • The file is readable and writable only by the creating user ID
            • -
            • The file descriptor is not inherited by child processes
            • -
            • The file will be destroyed as soon as it is closed
            • -
          • -
          -

          Sensitive Code Example

          -
          -file = open("/tmp/temporary_file","w+") # Sensitive
          +

          It also raises an issue when it detects reads of environment variables that point to publicly writable directories: TMP, +TMPDIR, and TEMP.

          +

          What is the potential impact?

          +

          Information disclosure

          +

          By winning the race condition, an attacker can access files written by the application to a publicly writable directory. If those files contain +sensitive data—credentials, session tokens, or personal information—the attacker can read them before the application removes them.

          +

          Data tampering

          +

          An attacker can replace or modify a file before the application reads it, causing the application to process attacker-controlled content. This can +result in data corruption, unexpected behavior, or indirect code execution. The risk is significantly higher when the application runs with elevated +privileges.

          +

          How to fix it in Python Standard Library

          +

          Use the tempfile module, which creates temporary files with unpredictable names in a secure location.

          +

          Code examples

          +

          Noncompliant code example

          +
          +file = open("/tmp/temporary_file","w+") # Noncompliant
           
          -
          -tmp_dir = os.environ.get('TMPDIR') # Sensitive
          +
          +tmp_dir = os.environ.get('TMPDIR') # Noncompliant
           file = open(tmp_dir+"/temporary_file","w+")
           
          -

          Compliant Solution

          -
          +

          Compliant solution

          +
          +import tempfile
          +
          +file = tempfile.TemporaryFile(dir="/tmp/my_subdirectory", mode="w+") # Compliant
          +
          +
           import tempfile
           
          -file = tempfile.TemporaryFile(dir="/tmp/my_subdirectory", mode='"w+") # Compliant
          +file = tempfile.TemporaryFile()
           
          -

          See

          +

          Resources

          +

          Documentation

          + +

          Articles & blog posts

          + +

          Standards

          diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5443.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5443.json index c172271b2..9c72428fe 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5443.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5443.json @@ -1,6 +1,7 @@ { - "title": "Using publicly writable directories is security-sensitive", - "type": "SECURITY_HOTSPOT", + "title": "Temporary files should not be created in publicly writable directories", + "type": "VULNERABILITY", + "quickfix": "unknown", "code": { "impacts": { "SECURITY": "HIGH" @@ -8,8 +9,13 @@ "attribute": "COMPLETE" }, "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "30min" + }, "tags": [ - "cwe" + "cwe", + "former-hotspot" ], "defaultSeverity": "Critical", "ruleSpecification": "RSPEC-5443", diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6265.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6265.html index 9598a9184..06c6ba103 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6265.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6265.html @@ -1,52 +1,63 @@

          Predefined permissions, also known as canned ACLs, -are an easy way to grant large privileges to predefined groups or users.

          +are an easy way to grant broad privileges to predefined groups or users.

          The following canned ACLs are security-sensitive:

            -
          • PUBLIC_READ, PUBLIC_READ_WRITE grant respectively "read" and "read and write" privileges to everyone in the world +
          • PublicRead, PublicReadWrite grant respectively "read" and "read and write" privileges to everyone in the world (AllUsers group).
          • -
          • AUTHENTICATED_READ grants "read" privilege to all authenticated users (AuthenticatedUsers group).
          • +
          • AuthenticatedRead grants "read" privilege to all authenticated users (AuthenticatedUsers group).
          -

          Ask Yourself Whether

          -
            -
          • The S3 bucket stores sensitive data.
          • -
          • The S3 bucket is not used to store static resources of websites (images, css …​).
          • -
          -

          There is a risk if you answered yes to any of those questions.

          -

          Recommended Secure Coding Practices

          -

          It’s recommended to implement the least privilege policy, i.e., to grant necessary permissions only to users for their required tasks. In the -context of canned ACL, set it to PRIVATE (the default one), and if needed more granularity then use an appropriate S3 policy.

          -

          Sensitive Code Example

          -

          All users (ie: anyone in the world authenticated or not) have read and write permissions with the PUBLIC_READ_WRITE access -control:

          -
          +

          Why is this an issue?

          +

          When an S3 bucket is configured with a canned ACL such as PublicRead, PublicReadWrite, or AuthenticatedRead, +it grants broad read or write access to either all internet users or all authenticated AWS users, far beyond what is typically required.

          +

          What is the potential impact?

          +

          Unauthorized data access

          +

          When an S3 bucket is publicly readable, any user on the internet can enumerate and download its contents. This can expose sensitive business data, +personally identifiable information (PII), credentials, or configuration files to unauthorized parties.

          +

          Data tampering

          +

          When an S3 bucket is publicly writable (e.g., PublicReadWrite), attackers can upload malicious files, overwrite existing objects, or +delete bucket content, leading to data integrity loss or supply chain attacks if the bucket serves application assets.

          +

          How to fix it in AWS CDK

          +

          Set the access_control property to PRIVATE (the default) to restrict bucket access to the owner only. For more granular +access control, use an appropriate S3 bucket policy instead of canned ACLs.

          +

          Code examples

          +

          Noncompliant code example

          +
          +import aws_cdk.aws_s3 as s3
          +import aws_cdk.aws_s3_deployment as s3deploy
          +
           bucket = s3.Bucket(self, "bucket",
          -    access_control=s3.BucketAccessControl.PUBLIC_READ_WRITE     # Sensitive
          +    access_control=s3.BucketAccessControl.PUBLIC_READ_WRITE     # Noncompliant
           )
           
           s3deploy.BucketDeployment(self, "DeployWebsite",
          -    access_control=s3.BucketAccessControl.PUBLIC_READ_WRITE     # Sensitive
          +    access_control=s3.BucketAccessControl.PUBLIC_READ_WRITE     # Noncompliant
           )
           
          -

          Compliant Solution

          -

          With the PRIVATE access control (default), only the bucket owner has the read/write permissions on the buckets and its ACL.

          -
          +

          Compliant solution

          +
          +import aws_cdk.aws_s3 as s3
          +import aws_cdk.aws_s3_deployment as s3deploy
          +
           bucket = s3.Bucket(self, "bucket",
          -    access_control=s3.BucketAccessControl.PRIVATE       # Compliant
          +    access_control=s3.BucketAccessControl.PRIVATE
           )
           
          -# Another example
           s3deploy.BucketDeployment(self, "DeployWebsite",
          -    access_control=s3.BucketAccessControl.PRIVATE       # Compliant
          +    access_control=s3.BucketAccessControl.PRIVATE
           )
           
          -

          See

          +

          Resources

          +

          Documentation

          +

          Standards

          + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6265.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6265.json index 8dc2b8d2c..46e0baa37 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6265.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6265.json @@ -1,6 +1,6 @@ { - "title": "Granting access to S3 buckets to all or authenticated users is security-sensitive", - "type": "SECURITY_HOTSPOT", + "title": "S3 buckets should not grant access to all users or authenticated users", + "type": "VULNERABILITY", "code": { "impacts": { "SECURITY": "BLOCKER" @@ -8,13 +8,15 @@ "attribute": "CONVENTIONAL" }, "status": "ready", + "quickfix": "unknown", "remediation": { "func": "Constant\/Issue", "constantCost": "5min" }, "tags": [ "aws", - "cwe" + "cwe", + "former-hotspot" ], "defaultSeverity": "Blocker", "ruleSpecification": "RSPEC-6265", diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6270.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6270.html index 612078b15..213a6ff3d 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6270.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6270.html @@ -1,16 +1,17 @@

          Resource-based policies granting access to all users can lead to information leakage.

          -

          Ask Yourself Whether

          -
            -
          • The AWS resource stores or processes sensitive data.
          • -
          • The AWS resource is designed to be private.
          • -
          -

          There is a risk if you answered yes to any of those questions.

          -

          Recommended Secure Coding Practices

          -

          It’s recommended to implement the least privilege principle, i.e. to grant necessary permissions only to users for their required tasks. In the -context of resource-based policies, list the principals that need the access and grant to them only the required privileges.

          -

          Sensitive Code Example

          -

          This policy allows all users, including anonymous ones, to access an S3 bucket:

          -
          +

          Why is this an issue?

          +

          Resource-based policies in AWS define who can access a resource and what actions they can perform. When the Principal element of a +policy is set to "*", access is granted to all users, including anonymous and unauthenticated ones. This violates the principle of least +privilege and can expose sensitive data or operations to unauthorized parties.

          +

          What is the potential impact?

          +

          Unauthorized data access

          +

          When a resource-based policy grants access to all principals, any user on the internet can read, modify, or delete the resource’s contents. This +can lead to data breaches, exposure of sensitive information, and potential misuse of cloud resources.

          +

          How to fix it in AWS CDK

          +

          Use a specific principal such as AccountRootPrincipal instead of AnyPrincipal.

          +

          Code examples

          +

          Noncompliant code example

          +
           from aws_cdk.aws_iam import PolicyStatement, AnyPrincipal, Effect
           from aws_cdk.aws_s3 import Bucket
           
          @@ -20,12 +21,11 @@ 

          Sensitive Code Example

          effect=Effect.ALLOW, actions=["s3:*"], resources=[bucket.arn_for_objects("*")], - principals=[AnyPrincipal()] # Sensitive + principals=[AnyPrincipal()] # Noncompliant ))
          -

          Compliant Solution

          -

          This policy allows only the authorized users:

          -
          +

          Compliant solution

          +
           from aws_cdk.aws_iam import PolicyStatement, AccountRootPrincipal, Effect
           from aws_cdk.aws_s3 import Bucket
           
          @@ -38,10 +38,14 @@ 

          Compliant Solution

          principals=[AccountRootPrincipal()] ))
          -

          See

          +

          Resources

          +

          Documentation

          +

          Standards

          +
          • CWE - CWE-732 - Incorrect Permission Assignment for Critical Resource
          • CWE - CWE-284 - Improper Access Control
          • STIG Viewer - Application Security and diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6270.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6270.json index 1e245b985..2870a61c4 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6270.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6270.json @@ -1,6 +1,6 @@ { - "title": "Policies authorizing public access to resources are security-sensitive", - "type": "SECURITY_HOTSPOT", + "title": "AWS resource-based policies should not grant public access", + "type": "VULNERABILITY", "code": { "impacts": { "SECURITY": "BLOCKER" @@ -8,13 +8,15 @@ "attribute": "CONVENTIONAL" }, "status": "ready", + "quickfix": "unknown", "remediation": { "func": "Constant\/Issue", "constantCost": "5min" }, "tags": [ "aws", - "cwe" + "cwe", + "former-hotspot" ], "defaultSeverity": "Blocker", "ruleSpecification": "RSPEC-6270", diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6275.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6275.html index 4f658aac2..1857084d7 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6275.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6275.html @@ -1,22 +1,19 @@ -

            Amazon Elastic Block Store (EBS) is a block-storage service for Amazon Elastic Compute Cloud (EC2). EBS volumes can be encrypted, ensuring the -security of both data-at-rest and data-in-transit between an instance and its attached EBS storage. In the case that adversaries gain physical access -to the storage medium they are not able to access the data. Encryption can be enabled for specific volumes or for all new volumes and snapshots. Volumes created -from snapshots inherit their encryption configuration. A volume created from an encrypted snapshot will also be encrypted by default.

            -

            Ask Yourself Whether

            -
              -
            • The disk contains sensitive data that could cause harm when leaked.
            • -
            • There are compliance requirements for the service to store data encrypted.
            • -
            -

            There is a risk if you answered yes to any of those questions.

            -

            Recommended Secure Coding Practices

            -

            It’s recommended to encrypt EBS volumes that contain sensitive information. Encryption and decryption are handled transparently by EC2, so no -further modifications to the application are necessary. Instead of enabling encryption for every volume, it is also possible to enable encryption -globally for a specific region. While creating volumes from encrypted snapshots will result in them being encrypted, explicitly enabling this security -parameter will prevent any future unexpected security downgrade.

            -

            Sensitive Code Example

            -

            For aws_cdk.aws_ec2.Volume:

            -
            +

            Amazon Elastic Block Store (EBS) is a block-storage service for Amazon EC2 that supports encryption of data at rest and in transit.

            +

            Why is this an issue?

            +

            When EBS volume encryption is disabled, data stored on the volume is not protected cryptographically. If an attacker gains access to the underlying +storage — for example, through a misconfigured snapshot or a compromised AWS account — the data is exposed in plaintext. Encryption and decryption are +handled transparently by EC2, so enabling it requires no modifications to the application.

            +

            What is the potential impact?

            +

            Exposure of sensitive data

            +

            Unencrypted EBS volumes can expose all data they contain if the underlying storage is accessed without authorization. This includes database files, +application data, logs, and other sensitive information that an attacker could read, copy, or exfiltrate, leading to data breaches and regulatory +non-compliance.

            +

            How to fix it

            +

            Code examples

            +

            EBS volume encryption is disabled, either explicitly by setting the encryption attribute to false or implicitly by omitting it when +the default encryption setting is not enabled.

            +

            Noncompliant code example

            +
             from aws_cdk.aws_ec2 import Volume
             
             class EBSVolumeStack(Stack):
            @@ -24,28 +21,13 @@ 

            Sensitive Code Example

            def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) Volume(self, - "unencrypted-explicit", - availability_zone="eu-west-1a", - size=Size.gibibytes(1), - encrypted=False # Sensitive - ) -
            -
            -from aws_cdk.aws_ec2 import Volume
            -
            -class EBSVolumeStack(Stack):
            -
            -    def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
            -        super().__init__(scope, construct_id, **kwargs)
            -        Volume(self,
            -            "unencrypted-implicit",
            +            "example-volume",
                         availability_zone="eu-west-1a",
                         size=Size.gibibytes(1)
            -        ) # Sensitive as encryption is disabled by default
            +        ) # Noncompliant: encryption is disabled by default
             
            -

            Compliant Solution

            -

            For aws_cdk.aws_ec2.Volume:

            -
            +

            Compliant solution

            +
             from aws_cdk.aws_ec2 import Volume
             
             class EBSVolumeStack(Stack):
            @@ -53,15 +35,20 @@ 

            Compliant Solution

            def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) Volume(self, - "encrypted-explicit", + "example-volume", availability_zone="eu-west-1a", size=Size.gibibytes(1), encrypted=True )
            -

            See

            +

            Resources

            +

            Documentation

            +

            Standards

            + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6275.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6275.json index 08beb104e..bf39e09e3 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6275.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6275.json @@ -1,6 +1,6 @@ { - "title": "Using unencrypted EBS volumes is security-sensitive", - "type": "SECURITY_HOTSPOT", + "title": "EBS volumes should be encrypted", + "type": "VULNERABILITY", "code": { "impacts": { "SECURITY": "MEDIUM" @@ -8,9 +8,15 @@ "attribute": "TRUSTWORTHY" }, "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "30min" + }, + "quickfix": "unknown", "tags": [ "aws", - "cwe" + "cwe", + "former-hotspot" ], "defaultSeverity": "Major", "ruleSpecification": "RSPEC-6275", diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6302.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6302.html index 8db9ac338..8b8370b8d 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6302.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6302.html @@ -1,32 +1,30 @@ -

            A policy that grants all permissions may indicate an improper access control, which violates the principle of least privilege. Suppose an identity is granted full -permissions to a resource even though it only requires read permission to work as expected. In this case, an unintentional overwriting of resources -may occur and therefore result in loss of information.

            -

            Ask Yourself Whether

            -

            Identities obtaining all the permissions:

            -
              -
            • only require a subset of these permissions to perform the intended function.
            • -
            • have monitored activity showing that only a subset of these permissions is actually used.
            • -
            -

            There is a risk if you answered yes to any of those questions.

            -

            Recommended Secure Coding Practices

            -

            It’s recommended to apply the least privilege principle, i.e. by only granting the necessary permissions to identities. A good practice is to start -with the very minimum set of permissions and to refine the policy over time. In order to fix overly permissive policies already deployed in -production, a strategy could be to review the monitored activity in order to reduce the set of permissions to those most used.

            -

            Sensitive Code Example

            -

            A customer-managed policy that grants all permissions by using the wildcard (*) in the Action property:

            -
            +

            Policies that grant all permissions violate the principle of least privilege.

            +

            Why is this an issue?

            +

            Policies that grant all permissions — for example by using a wildcard (*) in the action field or by assigning an overly permissive +role such as roles/owner — give an identity unrestricted access to all operations on a resource. Following the principle of least +privilege, policies should grant only the minimum set of permissions required for the identity to perform its intended function. Overly permissive +policies increase the risk of unintentional data modification, data exposure, or full cloud environment compromise if an identity is misused or +stolen.

            +

            What is the potential impact?

            +

            Privilege escalation and data exposure

            +

            An attacker who gains control of an identity with full permissions can perform any operation on any resource, including reading, modifying, or +deleting sensitive data. They can also escalate privileges by creating new identities or modifying other policies, potentially leading to a full +compromise of the cloud environment.

            +

            How to fix it

            +

            Code examples

            +

            The following code grants full permissions to identities instead of limiting them to only those required.

            +

            Noncompliant code example

            +
             from aws_cdk.aws_iam import PolicyStatement, Effect
             
             PolicyStatement(
                 effect=Effect.ALLOW,
            -    actions=["*"], # Sensitive
            +    actions=["*"], # Noncompliant
                 resources=["arn:aws:iam:::user/*"]
             )
             
            -

            Compliant Solution

            -

            A customer-managed policy that grants only the required permissions:

            -
            +

            Compliant solution

            +
             from aws_cdk.aws_iam import PolicyStatement, Effect
             
             PolicyStatement(
            @@ -35,11 +33,15 @@ 

            Compliant Solution

            resources=["arn:aws:iam:::user/*"] )
            -

            See

            +

            Resources

            +

            Documentation

            +

            Standards

            + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6302.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6302.json index 1b7b778c7..c99f49932 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6302.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6302.json @@ -1,6 +1,6 @@ { - "title": "Policies granting all privileges are security-sensitive", - "type": "SECURITY_HOTSPOT", + "title": "Policies should not grant all privileges", + "type": "VULNERABILITY", "code": { "impacts": { "SECURITY": "BLOCKER" @@ -8,13 +8,16 @@ "attribute": "CONVENTIONAL" }, "status": "ready", + "quickfix": "unknown", "remediation": { "func": "Constant\/Issue", "constantCost": "5min" }, "tags": [ "cwe", - "aws" + "aws", + "gcp", + "former-hotspot" ], "defaultSeverity": "Blocker", "ruleSpecification": "RSPEC-6302", diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6303.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6303.html index 7c9c6cccb..7c5b839f1 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6303.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6303.html @@ -1,32 +1,26 @@ -

            Using unencrypted RDS DB resources exposes data to unauthorized access. -
            - This includes database data, logs, automatic backups, read replicas, snapshots, and cluster metadata.

            -

            This situation can occur in a variety of scenarios, such as:

            -
              -
            • A malicious insider working at the cloud provider gains physical access to the storage device.
            • -
            • Unknown attackers penetrate the cloud provider’s logical infrastructure and systems.
            • -
            -

            After a successful intrusion, the underlying applications are exposed to:

            -
              -
            • theft of intellectual property and/or personal data
            • -
            • extortion
            • -
            • denial of services and security bypasses via data corruption or deletion
            • -
            -

            AWS-managed encryption at rest reduces this risk with a simple switch.

            -

            Ask Yourself Whether

            -
              -
            • The database contains sensitive data that could cause harm when leaked.
            • -
            • There are compliance requirements for the service to store data encrypted.
            • -
            -

            There is a risk if you answered yes to any of those questions.

            -

            Recommended Secure Coding Practices

            -

            It is recommended to enable encryption at rest on any RDS DB resource, regardless of the engine. -
            - In any case, no further maintenance is required as encryption at rest is fully managed by AWS.

            -

            Sensitive Code Example

            +

            AWS Relational Database Service (RDS) supports encryption at rest using AWS Key Management Service (KMS) to protect database instances and +clusters.

            +

            Why is this an issue?

            +

            When RDS database instances and clusters are not encrypted at rest, all data stored on disk is exposed to anyone who gains access to the underlying +storage. This includes database data, logs, automatic backups, read replicas, snapshots, and cluster metadata. The rule flags explicit disabling of +storage encryption as well as configurations where the property is omitted and encryption is disabled by default. AWS-managed encryption at rest +reduces this risk with a simple configuration change and requires no further maintenance.

            +

            What is the potential impact?

            +

            Unauthorized Data Access

            +

            If an attacker or malicious insider gains access to unencrypted RDS storage — whether through a breach of the cloud provider’s infrastructure or +physical access to storage devices — all stored data is readable in plaintext. This exposes sensitive information such as personal data, financial +records, or proprietary business data.

            +

            Data Theft and Compliance Violations

            +

            Theft of unencrypted data can result in regulatory fines, reputational damage, and legal liability, particularly for data subject to compliance +requirements such as PCI DSS.

            +

            How to fix it in AWS CDK

            +

            Code examples

            +

            The following examples create RDS resources with storageEncrypted set to false or omitted, which leaves all database +data, logs, automatic backups, read replicas, and snapshots unprotected at rest.

            +

            Noncompliant code example

            For aws_cdk.aws_rds.DatabaseCluster and aws_cdk.aws_rds.DatabaseInstance:

            -
            +
             from aws_cdk import (
                 aws_rds as rds
             )
            @@ -34,30 +28,15 @@ 

            Sensitive Code Example

            class DatabaseStack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) - rds.DatabaseCluster( # Sensitive, unencrypted by default + rds.DatabaseCluster( # Noncompliant, unencrypted by default self, "example" )
            -

            For aws_cdk.aws_rds.CfnDBCluster and aws_cdk.aws_rds.CfnDBInstance:

            -
            -from aws_cdk import (
            -    aws_rds as rds
            -)
            -
            -class DatabaseStack(Stack):
            -    def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
            -        super().__init__(scope, construct_id, **kwargs)
            -        rds.CfnDBCluster( # Sensitive, unencrypted by default
            -            self,
            -            "example"
            -        )
            -
            -

            Compliant Solution

            +

            Compliant solution

            For aws_cdk.aws_rds.DatabaseCluster and aws_cdk.aws_rds.DatabaseInstance:

            -
            +
             from aws_cdk import (
                 aws_rds as rds
             )
            @@ -71,26 +50,14 @@ 

            Compliant Solution

            storage_encrypted=True )
            -

            For aws_cdk.aws_rds.CfnDBCluster and aws_cdk.aws_rds.CfnDBInstance:

            -
            -from aws_cdk import (
            -    aws_rds as rds
            -)
            -
            -class DatabaseStack(Stack):
            -    def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
            -        super().__init__(scope, construct_id, **kwargs)
            -        rds.CfnDBCluster(
            -            self,
            -            "example",
            -            storage_encrypted=True
            -        )
            -
            -

            See

            +

            Resources

            +

            Documentation

            +

            Standards

            +
            • CWE - CWE-311 - Missing Encryption of Sensitive Data
            • STIG Viewer - Application Security and Development: V-222588 - The application must implement approved cryptographic mechanisms to prevent unauthorized modification of information at diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6303.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6303.json index 9ab08ea92..b87b14e7e 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6303.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6303.json @@ -1,6 +1,6 @@ { - "title": "Using unencrypted RDS DB resources is security-sensitive", - "type": "SECURITY_HOTSPOT", + "title": "Amazon RDS resources should be encrypted at rest", + "type": "VULNERABILITY", "code": { "impacts": { "SECURITY": "MEDIUM" @@ -8,13 +8,15 @@ "attribute": "TRUSTWORTHY" }, "status": "ready", + "quickfix": "unknown", "remediation": { "func": "Constant\/Issue", "constantCost": "10min" }, "tags": [ "aws", - "cwe" + "cwe", + "former-hotspot" ], "defaultSeverity": "Major", "ruleSpecification": "RSPEC-6303", diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6308.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6308.html index 62b25c7dc..3cb423545 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6308.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6308.html @@ -9,74 +9,56 @@
            • automated snapshots

            Thus, adversaries cannot access the data if they gain physical access to the storage medium.

            -

            Ask Yourself Whether

            -
              -
            • The database contains sensitive data that could cause harm when leaked.
            • -
            • There are compliance requirements for the service to store data encrypted.
            • -
            -

            There is a risk if you answered yes to any of those questions.

            -

            Recommended Secure Coding Practices

            -

            It is recommended to encrypt OpenSearch domains that contain sensitive information.

            -

            OpenSearch handles encryption and decryption transparently, so no further modifications to the application are necessary.

            -

            Sensitive Code Example

            -

            For aws_cdk.aws_opensearchservice.Domain:

            -
            +

            Why is this an issue?

            +

            OpenSearch domains store indexed data that may contain sensitive information. Without encryption at rest, this data is stored in plain text and can +be accessed by anyone with physical or administrative access to the underlying storage. This rule detects OpenSearch domain configurations where +encryption at rest is disabled or not explicitly enabled.

            +

            What is the potential impact?

            +

            Disabling encryption at rest leaves stored data vulnerable if the storage medium is compromised.

            +

            Unauthorized access to sensitive data

            +

            An attacker who gains physical access to the storage medium, or unauthorized administrative access, can read all indexed data in plain text. This +may include sensitive business data, personal information, or credentials that can be exploited for further attacks or cause regulatory compliance +failures.

            +

            How to fix it

            +

            Enable encryption at rest by setting encryption_at_rest with enabled=True.

            +

            Code examples

            +

            Noncompliant code example

            +
             from aws_cdk.aws_opensearchservice import Domain, EngineVersion
             
             class DomainStack(Stack):
                 def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
                     super().__init__(scope, construct_id, **kwargs)
             
            -        Domain(self, "Sensitive",
            +        Domain(self, "ExampleDomain",
                         version=EngineVersion.OPENSEARCH_1_3
            -        ) # Sensitive, encryption is disabled by default
            +        ) # Noncompliant: encryption is disabled by default
             
            -

            For aws_cdk.aws_opensearchservice.CfnDomain:

            -
            -from aws_cdk.aws_opensearchservice import CfnDomain
            -
            -class CfnDomainStack(Stack):
            -    def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
            -        super().__init__(scope, construct_id, **kwargs)
            -
            -        CfnDomain(self, "Sensitive") # Sensitive, encryption is disabled by default
            -
            -

            Compliant Solution

            -

            For aws_cdk.aws_opensearchservice.Domain:

            -
            +

            Compliant solution

            +
             from aws_cdk.aws_opensearchservice import Domain, EncryptionAtRestOptions, EngineVersion
             
             class DomainStack(Stack):
                 def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
                     super().__init__(scope, construct_id, **kwargs)
             
            -        Domain(self, "Compliant",
            +        Domain(self, "ExampleDomain",
                         version=EngineVersion.OPENSEARCH_1_3,
                         encryption_at_rest=EncryptionAtRestOptions(
                             enabled=True
                         )
                     )
             
            -

            For aws_cdk.aws_opensearchservice.CfnDomain:

            -
            -from aws_cdk.aws_opensearchservice import CfnDomain
            -
            -class CfnDomainStack(Stack):
            -    def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
            -        super().__init__(scope, construct_id, **kwargs)
            -
            -        CfnDomain(self, "Compliant",
            -            encryption_at_rest_options=CfnDomain.EncryptionAtRestOptionsProperty(
            -                enabled=True
            -            )
            -        )
            -
            -

            See

            +

            Resources

            +

            Documentation

            +

            Standards

            +
            • CWE - CWE-311 - Missing Encryption of Sensitive Data
            • STIG Viewer - Application Security and Development: V-222588 - The application must implement approved cryptographic mechanisms to prevent unauthorized modification of information at diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6308.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6308.json index 9c1ce8692..1049bf62b 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6308.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6308.json @@ -1,6 +1,6 @@ { - "title": "Using unencrypted OpenSearch domains is security-sensitive", - "type": "SECURITY_HOTSPOT", + "title": "OpenSearch domains should have encryption at rest enabled", + "type": "VULNERABILITY", "code": { "impacts": { "SECURITY": "MEDIUM" @@ -14,9 +14,11 @@ }, "tags": [ "aws", - "cwe" + "cwe", + "former-hotspot" ], "defaultSeverity": "Major", + "quickfix": "unknown", "ruleSpecification": "RSPEC-6308", "sqKey": "S6308", "scope": "All", diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6319.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6319.html index 23d7b883e..3a1a6fc38 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6319.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6319.html @@ -1,19 +1,19 @@ -

              Amazon SageMaker is a managed machine learning service in a hosted production-ready environment. To train machine learning models, SageMaker -instances can process potentially sensitive data, such as personal information that should not be stored unencrypted. In the event that adversaries -physically access the storage media, they cannot decrypt encrypted data.

              -

              Ask Yourself Whether

              -
                -
              • The instance contains sensitive data that could cause harm when leaked.
              • -
              • There are compliance requirements for the service to store data encrypted.
              • -
              -

              There is a risk if you answered yes to any of those questions.

              -

              Recommended Secure Coding Practices

              -

              It’s recommended to encrypt SageMaker notebook instances that contain sensitive information. Encryption and decryption are handled transparently by -SageMaker, so no further modifications to the application are necessary.

              -

              Sensitive Code Example

              -

              For aws_cdk.aws_sagemaker.CfnNotebookInstance:

              -
              +

              Amazon SageMaker notebook instances can process sensitive data, such as personal information, and should encrypt this data at rest.

              +

              Why is this an issue?

              +

              Amazon SageMaker notebook instances can process potentially sensitive data, such as personal information, as part of machine learning workflows. By +default, SageMaker notebook instances do not encrypt data stored on the instance’s storage volume. This rule raises an issue when a notebook instance +is created without a KMS key configured for encryption at rest.

              +

              What is the potential impact?

              +

              Exposure of sensitive data

              +

              When a SageMaker notebook instance is not encrypted, an attacker who gains access to the underlying storage media can read all data stored on it in +plaintext. This includes training datasets, model artifacts, credentials, and any other sensitive information processed during machine learning +workflows.

              +

              How to fix it

              +

              Code examples

              +

              The following code is vulnerable because the SageMaker notebook instance is created without specifying a KMS key, leaving data stored on the +instance’s storage volume unencrypted.

              +

              Noncompliant code example

              +
               from aws_cdk import (
                   aws_sagemaker as sagemaker
               )
              @@ -23,15 +23,13 @@ 

              Sensitive Code Example

              super().__init__(scope, construct_id, **kwargs) sagemaker.CfnNotebookInstance( - self, "Sensitive", + self, "Example", instance_type="instanceType", role_arn="roleArn" - ) # Sensitive, no KMS key is set by default; thus, encryption is disabled + ) # Noncompliant: no KMS key is set by default; thus, encryption is disabled
              -

              Compliant Solution

              -

              For aws_cdk.aws_sagemaker.CfnNotebookInstance:

              -
              +

              Compliant solution

              +
               from aws_cdk import (
                   aws_sagemaker as sagemaker,
                   aws_kms as kms
              @@ -43,16 +41,22 @@ 

              Compliant Solution

              my_key = kms.Key(self, "Key") sagemaker.CfnNotebookInstance( - self, "Compliant", + self, "Example", instance_type="instanceType", role_arn="roleArn", kms_key_id=my_key.key_id )
              -

              See

              +

              Resources

              +

              Documentation

              +

              Standards

              +
                +
              • CWE - CWE-312 - Cleartext Storage of Sensitive Information
              • STIG Viewer - Application Security and Development: V-222588 - The application must implement approved cryptographic mechanisms to prevent unauthorized modification of information at rest.
              • diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6319.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6319.json index a31c7071c..578772467 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6319.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6319.json @@ -1,6 +1,7 @@ { - "title": "Using unencrypted SageMaker notebook instances is security-sensitive", - "type": "SECURITY_HOTSPOT", + "title": "SageMaker notebook instances should be encrypted at rest", + "type": "VULNERABILITY", + "quickfix": "unknown", "code": { "impacts": { "SECURITY": "MEDIUM" @@ -14,7 +15,8 @@ }, "tags": [ "aws", - "cwe" + "cwe", + "former-hotspot" ], "defaultSeverity": "Major", "ruleSpecification": "RSPEC-6319", @@ -22,7 +24,7 @@ "scope": "All", "securityStandards": { "CWE": [ - 311 + 312 ], "PCI DSS 3.2": [ "2.2", diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6330.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6330.html index 6bdf70909..d430f3736 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6330.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6330.html @@ -1,18 +1,17 @@ -

                Amazon Simple Queue Service (SQS) is a managed message queuing service for application-to-application (A2A) communication. Amazon SQS can store -messages encrypted as soon as they are received. In the case that adversaries gain physical access to the storage medium or otherwise leak a message -from the file system, for example through a vulnerability in the service, they are not able to access the data.

                -

                Ask Yourself Whether

                -
                  -
                • The queue contains sensitive data that could cause harm when leaked.
                • -
                • There are compliance requirements for the service to store data encrypted.
                • -
                -

                There is a risk if you answered yes to any of those questions.

                -

                Recommended Secure Coding Practices

                -

                It’s recommended to encrypt SQS queues that contain sensitive information. Encryption and decryption are handled transparently by SQS, so no -further modifications to the application are necessary.

                -

                Sensitive Code Example

                +

                Amazon SQS queues should be encrypted to protect sensitive message data at rest.

                +

                Why is this an issue?

                +

                Amazon Simple Queue Service (SQS) is a managed message queuing service for application-to-application communication. SQS can store messages +encrypted as soon as they are received. This rule raises an issue when an SQS queue is created with encryption explicitly disabled.

                +

                What is the potential impact?

                +

                If an adversary gains physical access to the storage medium or otherwise reads a message from the file system, for example through a vulnerability +in the service, they can access the data. This could result in the exposure of sensitive information such as personal data, credentials, or +business-critical messages.

                +

                How to fix it

                +

                Code examples

                +

                Encryption and decryption are handled transparently by SQS, so no further modifications to the application are necessary.

                +

                Noncompliant code example

                For aws_cdk.aws_sqs.CfnQueue:

                -
                +
                 from aws_cdk import (
                     aws_sqs as sqs
                 )
                @@ -23,12 +22,12 @@ 

                Sensitive Code Example

                sqs.CfnQueue( self, "example", - sqs_managed_sse_enabled=False # Sensitive, unencrypted + sqs_managed_sse_enabled=False # Noncompliant, unencrypted )
                -

                Compliant Solution

                +

                Compliant solution

                For aws_cdk.aws_sqs.CfnQueue:

                -
                +
                 from aws_cdk import (
                     aws_sqs as sqs
                 )
                @@ -42,10 +41,14 @@ 

                Compliant Solution

                sqs_managed_sse_enabled=True )
                -

                See

                +

                Resources

                +

                Documentation

                +

                Standards

                +
                • CWE - CWE-311 - Missing Encryption of Sensitive Data
                • STIG Viewer - Application Security and Development: V-222588 - The application must implement approved cryptographic mechanisms to prevent unauthorized modification of information at diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6330.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6330.json index b73362c49..111be6bfd 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6330.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6330.json @@ -1,6 +1,6 @@ { - "title": "Using unencrypted SQS queues is security-sensitive", - "type": "SECURITY_HOTSPOT", + "title": "SQS queues should be encrypted", + "type": "VULNERABILITY", "code": { "impacts": { "SECURITY": "MEDIUM" @@ -14,12 +14,14 @@ }, "tags": [ "aws", - "cwe" + "cwe", + "former-hotspot" ], "defaultSeverity": "Major", "ruleSpecification": "RSPEC-6330", "sqKey": "S6330", "scope": "All", + "quickfix": "unknown", "securityStandards": { "CWE": [ 311 diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6332.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6332.html index 82af6348c..c4d18e5c1 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6332.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6332.html @@ -1,19 +1,18 @@ +

                  Amazon Elastic File System (EFS) file systems should be encrypted to protect sensitive data at rest.

                  +

                  Why is this an issue?

                  Amazon Elastic File System (EFS) is a serverless file system that does not require provisioning or managing storage. Stored files can be -automatically encrypted by the service. In the case that adversaries gain physical access to the storage medium or otherwise leak a message they are -not able to access the data.

                  -

                  Ask Yourself Whether

                  -
                    -
                  • The file system contains sensitive data that could cause harm when leaked.
                  • -
                  • There are compliance requirements for the service to store data encrypted.
                  • -
                  -

                  There is a risk if you answered yes to any of those questions.

                  -

                  Recommended Secure Coding Practices

                  -

                  It’s recommended to encrypt EFS file systems that contain sensitive information. Encryption and decryption are handled transparently by EFS, so no -further modifications to the application are necessary.

                  -

                  Sensitive Code Example

                  -

                  For aws_cdk.aws_efs.FileSystem and aws_cdk.aws_efs.CfnFileSystem:

                  -
                  +automatically encrypted by the service, but this feature is not always enabled by default. This rule raises an issue when an EFS file system is
                  +created with encryption disabled.

                  +

                  What is the potential impact?

                  +

                  If adversaries gain physical access to the storage medium or otherwise read data from the file system, for example through a vulnerability in the +service, they can access the data. This could result in the exposure of sensitive information such as personal data, credentials, or business-critical +files.

                  +

                  How to fix it

                  +

                  Code examples

                  +

                  Encryption and decryption are handled transparently by EFS, so no further modifications to the application are necessary.

                  +

                  Noncompliant code example

                  +

                  For aws_cdk.aws_efs.FileSystem:

                  +
                   from aws_cdk import (
                       aws_efs as efs
                   )
                  @@ -21,13 +20,12 @@ 

                  Sensitive Code Example

                  efs.FileSystem( self, "example", - encrypted=False # Sensitive + encrypted=False # Noncompliant )
                  -

                  Compliant Solution

                  -

                  For aws_cdk.aws_efs.FileSystem and aws_cdk.aws_efs.CfnFileSystem:

                  -
                  +

                  Compliant solution

                  +

                  For aws_cdk.aws_efs.FileSystem:

                  +
                   from aws_cdk import (
                       aws_efs as efs
                   )
                  @@ -38,9 +36,13 @@ 

                  Compliant Solution

                  encrypted=True )
                  -

                  See

                  +

                  Resources

                  +

                  Documentation

                  +

                  Standards

                  + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6332.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6332.json index b13895208..03927add5 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6332.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6332.json @@ -1,6 +1,6 @@ { - "title": "Using unencrypted EFS file systems is security-sensitive", - "type": "SECURITY_HOTSPOT", + "title": "Amazon EFS file systems should be encrypted", + "type": "VULNERABILITY", "code": { "impacts": { "SECURITY": "MEDIUM" @@ -14,12 +14,14 @@ }, "tags": [ "aws", - "cwe" + "cwe", + "former-hotspot" ], "defaultSeverity": "Major", "ruleSpecification": "RSPEC-6332", "sqKey": "S6332", "scope": "All", + "quickfix": "unknown", "securityStandards": { "CWE": [ 311 diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6418.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6418.html index 17ef58718..62c5e68bb 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6418.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6418.html @@ -66,7 +66,9 @@

                  Resources

                • OWASP - Top 10 2017 Category A2 - Broken Authentication
                • CWE - CWE-798 - Use of Hard-coded Credentials
                • -
                • MSC - MSC03-J - Never hard code sensitive information
                • +
                • MSC - MSC03-J - Never + hard code sensitive information
                • AWS Secrets Manager - Code Examples
                • Azure Key Vault - Quickstart
                • diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6418.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6418.json index f7e397a71..7c8d27469 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6418.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6418.json @@ -14,7 +14,8 @@ }, "quickfix": "infeasible", "tags": [ - "cwe" + "cwe", + "former-hotspot" ], "defaultSeverity": "Blocker", "ruleSpecification": "RSPEC-6418", diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6463.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6463.html index b4ea905ce..f24a436ed 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6463.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6463.html @@ -1,36 +1,34 @@ -

                  Allowing unrestricted outbound communications can lead to data leaks.

                  +

                  Allowing unrestricted outbound communications from a security group can enable compromised resources to exfiltrate data or communicate with +attacker-controlled servers.

                  +

                  Why is this an issue?

                  When a security group allows all outbound communications, applications or services within the security group can send data to any external IP address or port without restriction. If a resource within the security group becomes compromised, attackers could send malicious traffic or exfiltrate -data to external servers. This could happen even if the resource is not directly exposed to the internet, such as in case of a supply chain -attack.

                  -

                  When deciding if outgoing connections should be limited, consider that limiting the connections results in additional administration and -maintenance work.

                  -

                  Ask Yourself Whether

                  -
                    -
                  • The resource has access to sensitive data.
                  • -
                  • The resource is part of a private network.
                  • -
                  -

                  There is a risk if you answered yes to any of those questions.

                  -

                  Recommended Secure Coding Practices

                  -

                  The principles of defence-in-depth and least privilege suggest that outbound connections should be restricted to a set of trusted destinations.

                  -

                  Consider restricting the security group egress rules so that it can only contact specific locations, such as trusted IP address ranges or other -security groups. If any resources require unrestricted outbound access, place them in their own security group.

                  -

                  Sensitive Code Example

                  -

                  For aws_cdk.aws_ec2.SecurityGroup:

                  -
                  +data to external servers. This risk exists even if the resource is not directly exposed to the internet, such as a supply chain attack.

                  +

                  What is the potential impact?

                  +

                  Data exfiltration

                  +

                  If a resource within the security group becomes compromised, unrestricted outbound access allows an attacker to silently send sensitive data such +as credentials or database contents to external servers.

                  +

                  Malicious traffic propagation

                  +

                  A compromised resource can use unrestricted outbound access to communicate with attacker-controlled command-and-control servers or participate in +DDoS attacks, probe internal network segments, or spread malware to other hosts.

                  +

                  How to fix it

                  +

                  Code examples

                  +

                  The following code example is vulnerable because the allow_all_outbound parameter is not explicitly set to False, which +causes the security group to allow all outbound traffic by default.

                  +

                  Noncompliant code example

                  +
                   from aws_cdk import (
                       aws_ec2 as ec2
                   )
                   
                  -ec2.SecurityGroup(  # Sensitive; allow_all_outbound is enabled by default
                  +ec2.SecurityGroup(  # Noncompliant: allow_all_outbound is enabled by default
                       self,
                       "example",
                       vpc=vpc
                   )
                   
                  -

                  Compliant Solution

                  -

                  For aws_cdk.aws_ec2.SecurityGroup:

                  -
                  +

                  Compliant solution

                  +
                   from aws_cdk import (
                       aws_ec2 as ec2
                   )
                  @@ -47,10 +45,15 @@ 

                  Compliant Solution

                  connection=ec2.Port.tcp(443) )
                  -

                  See

                  +

                  Resources

                  +

                  Documentation

                  +

                  Standards

                  + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6463.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6463.json index ca27b4e56..a072a09e6 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6463.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6463.json @@ -1,6 +1,6 @@ { - "title": "Allowing unrestricted outbound communications is security-sensitive", - "type": "SECURITY_HOTSPOT", + "title": "Security groups should not allow unrestricted outbound traffic", + "type": "VULNERABILITY", "code": { "impacts": { "SECURITY": "MEDIUM" @@ -8,13 +8,15 @@ "attribute": "COMPLETE" }, "status": "ready", + "quickfix": "unknown", "remediation": { "func": "Constant\/Issue", "constantCost": "60min" }, "tags": [ "aws", - "cwe" + "cwe", + "former-hotspot" ], "defaultSeverity": "Major", "ruleSpecification": "RSPEC-6463", diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6985.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6985.html index c584fd826..93a68fcbb 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6985.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6985.html @@ -1,8 +1,12 @@ -

                  This rule raises an issue when pytorch.load is used to load a model.

                  +

                  Loading serialized PyTorch models with torch.load without restricting deserialization can lead to arbitrary code execution.

                  Why is this an issue?

                  In PyTorch, it is common to load serialized models using the torch.load function. Under the hood, torch.load uses the pickle library to load the model and the weights. If the model comes from an untrusted source, an attacker could inject a malicious payload which would be executed during the deserialization.

                  +

                  What is the potential impact?

                  +

                  Remote code execution

                  +

                  An attacker who controls a model file loaded with torch.load can execute arbitrary code on the target machine. This can lead to full +system compromise, data exfiltration, or further lateral movement within a network.

                  How to fix it

                  Use a safer alternative to load the model, such as safetensors.torch.load_model. Alternatively, PyTorch can be instructed to only load the weights by setting the parameter weights_only=True. This avoids the use of the pickle library and is therefore safe. @@ -12,7 +16,7 @@

                  Noncompliant code example

                   import torch
                   
                  -model = torch.load('model.pth') # Noncompliant: torch.load is used to load the model
                  +model = torch.load('model.pth') # Noncompliant
                   

                  Compliant solution

                  @@ -25,7 +29,12 @@ 

                  Compliant solution

                  Resources

                  Documentation

                  +

                  Standards

                  + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6985.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6985.json index d21e3880f..e6a94e4e2 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6985.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6985.json @@ -1,14 +1,16 @@ { - "title": "Usage of \"torch.load\" can lead to untrusted code execution", - "type": "SECURITY_HOTSPOT", + "title": "Models should not be loaded with \"torch.load\" without restricting deserialization", + "type": "VULNERABILITY", "status": "ready", "remediation": { "func": "Constant\/Issue", "constantCost": "15min" }, "tags": [ + "cwe", "pytorch", - "machine-learning" + "machine-learning", + "former-hotspot" ], "defaultSeverity": "Critical", "ruleSpecification": "RSPEC-6985", @@ -23,7 +25,7 @@ }, "securityStandards": { "CWE": [ - 94, + 913, 502 ] } diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8409.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8409.json index d1334b904..974b647f9 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8409.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8409.json @@ -11,14 +11,14 @@ "redundant", "api" ], - "defaultSeverity": "Blocker", + "defaultSeverity": "Minor", "ruleSpecification": "RSPEC-8409", "sqKey": "S8409", "scope": "Main", "quickfix": "unknown", "code": { "impacts": { - "MAINTAINABILITY": "BLOCKER" + "MAINTAINABILITY": "LOW" }, "attribute": "CLEAR" } diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8410.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8410.json index c829f0134..630881549 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8410.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8410.json @@ -11,14 +11,14 @@ "type-hint", "convention" ], - "defaultSeverity": "Blocker", + "defaultSeverity": "Minor", "ruleSpecification": "RSPEC-8410", "sqKey": "S8410", "scope": "Main", "quickfix": "unknown", "code": { "impacts": { - "MAINTAINABILITY": "BLOCKER" + "MAINTAINABILITY": "LOW" }, "attribute": "CLEAR" } diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8500.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8500.html index 848e3c36a..daa6f5f85 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8500.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8500.html @@ -17,8 +17,6 @@

                  Why is this an issue?

                • code that expects symmetric comparisons, such as a < b being true implying b > a is also true, may behave unexpectedly
                -

                For example, if a class defines only __lt__, then a < b will work, but a > b will fall back to -Python’s default behavior of comparing object identities, which is almost never what you want.

                Python provides the functools.total_ordering decorator specifically to solve this problem. It allows you to define just __eq__ and one other comparison method, and it automatically generates the rest. This ensures consistent and correct comparison behavior across all operations.

                diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8502.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8502.html index 069f13775..a0f000b25 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8502.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8502.html @@ -1,8 +1,17 @@

                This rule raises an issue when a for-loop is used to add all elements from one collection to a set using the add() method.

                Why is this an issue?

                -

                Adding elements to a set one at a time in a loop is unnecessary when the update() method exists. The update() method -combines all additions into a single call and avoids the overhead of repeated add() invocations. Using update() improves -readability and removes redundant method call overhead. In loops or performance-critical code, the difference can become measurable.

                +

                Adding elements to a set one at a time in a loop is unnecessary when the update() method exists:

                +
                +for element in other_collection:
                +    my_set.add(element)
                +
                +

                The update() method combines all additions into a single call and avoids the overhead of repeated add() invocations:

                +
                +my_set.update(other_collection)  # Single call, more efficient
                +
                +

                What is the potential impact?

                +

                Using update() improves readability and removes redundant method call overhead. In loops or performance-critical code, the difference +can become measurable.

                How to fix it

                Replace the for-loop with a single update() call. The method accepts any iterable.

                Code examples

                @@ -25,6 +34,7 @@

                Resources

                Documentation

                diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8502.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8502.json index 74322bd6b..488417178 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8502.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8502.json @@ -4,18 +4,22 @@ "status": "ready", "remediation": { "func": "Constant\/Issue", - "constantCost": "5min" + "constantCost": "2 min" }, - "tags": [], + "tags": [ + "pythonic", + "performance", + "idiom" + ], "defaultSeverity": "Minor", "ruleSpecification": "RSPEC-8502", "sqKey": "S8502", "scope": "All", - "quickfix": "targeted", + "quickfix": "partial", "code": { "impacts": { "MAINTAINABILITY": "LOW" }, - "attribute": "CONVENTIONAL" + "attribute": "EFFICIENT" } } diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8505.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8505.html index 8d07f5463..c66bcb49c 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8505.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8505.html @@ -1,38 +1,38 @@ -

                This rule raises an issue when @singledispatch is used on a class method instead of @singledispatchmethod, or when -@singledispatchmethod is used on a standalone function instead of @singledispatch.

                +

                This rule raises an issue when @singledispatch is used on a method defined inside a class instead of +@singledispatchmethod, or when @singledispatchmethod is used on a standalone function instead of +@singledispatch. It also flags problematic combinations with @classmethod and @staticmethod.

                Why is this an issue?

                The @singledispatch and @singledispatchmethod decorators from functools serve different purposes and are not interchangeable.

                -

                @singledispatch is designed for standalone functions. It dispatches based on the type of the first argument. When applied to an -instance method, the first argument is self, so dispatch is performed on the type of the instance instead of on the actual data argument. -The registered type implementations (for example, for int or str) are therefore never selected based on the data, and the -behavior depends on the receiver:

                +

                @singledispatch is designed for standalone functions. It dispatches based on the type of the first positional argument. When applied +to an instance method, the first argument is self, so dispatch is performed on the type of the instance instead of on the actual data +argument. The registered type implementations (for example, for int or str) are therefore never selected based on the +data:

                  -
                • When called on an instance of the class where the method is defined, the base implementation is invoked regardless of the data argument’s - type.
                • -
                • When called on an instance of a subclass, dispatch may resolve to a different registered implementation depending on the - subclass’s MRO, so the same call can produce different results in different parts of a class hierarchy. This is typically worse than always falling - back to the base implementation, because the bug becomes intermittent and hierarchy-dependent.
                • +
                • In the typical case, every call falls through to the base implementation regardless of the data argument’s type, because the receiver class is + not registered as a dispatch type.
                • +
                • In the rarer case where the receiver class (or one of its ancestors in the MRO) happens to match a registered type, dispatch may resolve to a + different registered implementation depending on the receiver, so the same call site can produce different results in different + parts of a class hierarchy.

                @singledispatchmethod is designed for instance methods and class methods. It returns a non-callable descriptor that relies on the descriptor protocol to bind to an instance or class. When applied to a standalone function, the resulting object cannot be invoked at all, and calling -it raises TypeError: 'singledispatchmethod' object is not callable.

                +it raises a TypeError.

                This rule also flags @singledispatch applied to a method decorated with @classmethod. In that case, the dispatcher -attempts to call a classmethod object directly and raises TypeError at call time.

                -

                In all of these cases, no error or warning is raised at decoration time, making the bug silent and hard to detect by reading the code alone.

                +attempts to operate on a classmethod object rather than a plain function, and the call fails at runtime.

                +

                In all of these cases, no error or warning is raised at decoration time, and some failure modes only surface on the first call, making the bug +silent and hard to detect by reading the code alone.

                Exceptions

                The rule’s behavior with @staticmethod depends on the decorator order:

                • @singledispatch placed above @staticmethod is flagged. In that order, - @singledispatch wraps the staticmethod descriptor object, which prevents it from working as a static method and breaks - dispatch on instances (MyClass().process(value) raises TypeError).
                • + @singledispatch wraps the staticmethod descriptor object, which makes both registration of overloads and dispatch on + instances unreliable.
                • @staticmethod placed above @singledispatch is not flagged, because @singledispatch is then applied to a regular function and @staticmethod simply prevents Python from binding self, so dispatch correctly happens on the data argument.
                -

                Note that even the non-flagged order is uncommon and easy to misuse: stacked decorators must be ordered carefully, and a future refactor that swaps -the order silently reintroduces the bug. Prefer using @singledispatch on a module-level function, or @singledispatchmethod -when the dispatcher needs to live on a class.

                +

                Note that even the non-flagged order is uncommon and easy to misuse: a future refactor that swaps the order silently reintroduces the bug.

                What is the potential impact?

                Confusing these two decorators causes the type dispatch mechanism to behave incorrectly:

                  @@ -41,10 +41,8 @@

                  What is the potential impact?

                  implementations than calls on the base class, so the same call site can produce different results depending on the receiver’s type
                • the code may appear to work in simple tests but fail or behave inconsistently in production with different input types or in larger class hierarchies
                • -
                • debugging is difficult because no error or warning is raised at decoration time
                • -
                • the application may process data incorrectly, potentially leading to data corruption or security issues if type-specific validation or - sanitization is bypassed
                • -
                • combining @singledispatch with @classmethod raises a TypeError at call time
                • +
                • debugging is difficult because no error or warning is raised at decoration time, and broken combinations such as @singledispatch + with @classmethod or above @staticmethod typically fail only at call time

                How to fix it

                Code examples

                @@ -116,14 +114,24 @@

                Compliant solution

                def _(data): return f"Processing str: {data}"
                -

                How does this work?

                -

                Use @singledispatch for standalone, module-level functions and @singledispatchmethod for instance methods and class -methods. The @singledispatch decorator dispatches on the first argument, while @singledispatchmethod skips self -or cls and dispatches on the next argument.

                -

                When combining @singledispatchmethod with @classmethod, @singledispatchmethod must remain the outermost -decorator so that the registration mechanism (process.register) is still available. @classmethod is then applied to the base -implementation and to each registered overload:

                -
                +

                Noncompliant code example

                +

                Using @singledispatch on a @classmethod:

                +
                +from functools import singledispatch
                +
                +class Processor:
                +    @singledispatch  # Noncompliant: @singledispatch wraps a classmethod descriptor
                +    @classmethod
                +    def process(cls, data):
                +        return f"Processing: {data}"
                +
                +    @process.register(int)
                +    @classmethod
                +    def _(cls, data):
                +        return f"Processing int: {data}"
                +
                +

                Compliant solution

                +
                 from functools import singledispatchmethod
                 
                 class Processor:
                @@ -137,10 +145,18 @@ 

                How does this work?

                def _(cls, data: int): return f"Processing int: {data}"
                +

                How does this work?

                +

                Use @singledispatch for standalone, module-level functions and @singledispatchmethod for instance methods and class +methods. The @singledispatch decorator dispatches on the first argument, while @singledispatchmethod skips self +or cls and dispatches on the next argument.

                +

                When combining @singledispatchmethod with @classmethod, @singledispatchmethod must remain the outermost +decorator so that the registration mechanism (process.register) is still available. @classmethod is then applied to the base +implementation and to each registered overload.

                For static methods, prefer turning the function into a module-level function decorated with @singledispatch. If the dispatcher must live on the class, place @staticmethod above @singledispatch so that @singledispatch wraps a -regular function rather than a staticmethod descriptor; the inverse order breaks dispatch on instance calls and is reported by this -rule.

                +regular function rather than a staticmethod descriptor; the inverse order is reported by this rule. More generally, prefer +@singledispatch on a module-level function whenever the dispatcher does not need to live on a class, since stacked-decorator orders are +easy to misuse and silently regress on refactors.

                Resources

                Documentation

                  diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8505.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8505.json index dca991af2..98a5ee076 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8505.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8505.json @@ -14,7 +14,7 @@ "ruleSpecification": "RSPEC-8505", "sqKey": "S8505", "scope": "Main", - "quickfix": "no", + "quickfix": "unknown", "code": { "impacts": { "RELIABILITY": "BLOCKER", diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8508.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8508.html index cdc9b4022..1fd2175d4 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8508.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8508.html @@ -1,30 +1,44 @@ -

                  This rule raises an issue when a mutable object is used as the default value in dict.fromkeys() or contextvars.ContextVar().

                  +

                  This rule raises an issue when a mutable object is used as the default value in dict.fromkeys() or +contextvars.ContextVar().

                  Why is this an issue?

                  -

                  In Python, when you pass a mutable object as a default value to certain constructs, all instances share the same object reference rather than getting -independent copies. This creates unintended shared state that leads to subtle mutation bugs.

                  +

                  In Python, when you pass a mutable object as a default value to certain constructs, all instances share the same object reference rather than +getting independent copies. This creates unintended shared state that leads to subtle mutation bugs.

                  Python evaluates the default value expression once when the code is defined, not each time it is used. The same object instance is then reused -across all keys or contexts.

                  +across all keys or contexts. This is different from creating new instances for each use.

                  +

                  This issue is related to, but distinct from, the more commonly known problem of mutable default arguments in function definitions (e.g., def +func(items=[])), which has the same underlying cause.

                  The problem with dict.fromkeys()

                  -

                  The dict.fromkeys(keys, value) method creates a dictionary with all specified keys pointing to the same value -object. When this value is mutable (like a list or dictionary), all keys share the same object reference:

                  +

                  The dict.fromkeys(keys, value) method creates a dictionary with all specified keys pointing to the same +value object. When this value is mutable (like a list or dictionary), all keys share the same object reference:

                   keys = ['a', 'b', 'c']
                   my_dict = dict.fromkeys(keys, [])
                   my_dict['a'].append(1)
                   print(my_dict)  # {'a': [1], 'b': [1], 'c': [1]}
                   
                  +

                  Modifying the list through one key affects all other keys because they all reference the same list object in memory.

                  The problem with ContextVar()

                  -

                  When you create a ContextVar with a mutable default value, that same object is shared across all contexts, which is particularly -problematic in concurrent code.

                  +

                  Similarly, when you create a ContextVar with a mutable default value, that same object is shared across all contexts:

                  +
                  +from contextvars import ContextVar
                  +
                  +my_var = ContextVar('my_var', default=[])
                  +my_var.get().append(1)  # Modifies the shared default
                  +
                  +

                  This is particularly problematic in concurrent code where different contexts should have independent state.

                  What is the potential impact?

                  +

                  Using mutable default values in these contexts can cause serious bugs:

                    -
                  • Data corruption: changes intended for one key or context accidentally affect others
                  • -
                  • Concurrency issues: in the case of ContextVar, shared mutable defaults can cause race conditions
                  • -
                  • Test flakiness: tests may pass or fail inconsistently depending on execution order
                  • +
                  • data corruption: changes intended for one key or context accidentally affect others, leading to incorrect application + state
                  • +
                  • difficult debugging: the bug manifests indirectly, making it hard to trace the source of unexpected mutations
                  • +
                  • concurrency issues: in the case of ContextVar, shared mutable defaults can cause race conditions and data + corruption in concurrent code
                  • +
                  • test flakiness: tests may pass or fail inconsistently depending on execution order when shared state accumulates mutations

                  How to fix it

                  -

                  For dict.fromkeys(), replace it with a dictionary comprehension that creates a new instance for each key. For -ContextVar(), use a factory pattern or omit the mutable default.

                  +

                  For dict.fromkeys(), replace it with a dictionary comprehension that creates a new instance of the mutable object for each key. For +ContextVar(), use a factory pattern or set the default in context initialization rather than passing a mutable default directly.

                  Code examples

                  Noncompliant code example

                  @@ -47,14 +61,29 @@ 

                  Compliant solution

                  from contextvars import ContextVar my_var: ContextVar[list] = ContextVar('my_var') + +def get_my_var() -> list: + try: + return my_var.get() + except LookupError: + value: list = [] + my_var.set(value) + return value

                  Resources

                  Documentation

                  +

                  External coding guidelines

                  +

                  Related rules

                    -
                  • S2824 - Function parameters should not have mutable default values
                  • +
                  • {rule:python:S2824} - Function parameters should not have mutable default values
                  + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8508.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8508.json index b9a0b32cf..224719a2b 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8508.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8508.json @@ -6,7 +6,10 @@ "func": "Constant\/Issue", "constantCost": "5 min" }, - "tags": [], + "tags": [ + "pitfall", + "concurrency" + ], "defaultSeverity": "Blocker", "ruleSpecification": "RSPEC-8508", "sqKey": "S8508", @@ -14,8 +17,9 @@ "quickfix": "unknown", "code": { "impacts": { - "RELIABILITY": "BLOCKER" + "RELIABILITY": "BLOCKER", + "MAINTAINABILITY": "HIGH" }, - "attribute": "LOGICAL" + "attribute": "CLEAR" } } diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8509.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8509.html index 0a15ca383..a2c352e35 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8509.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8509.html @@ -1,9 +1,26 @@

                  This rule raises an issue when the same class appears more than once in the inheritance list of a class definition.

                  Why is this an issue?

                  -

                  In Python, a class definition can inherit from one or more base classes. When the same base class appears multiple times in the inheritance list, -it serves no purpose and is always a programming error. Python's Method Resolution Order (MRO) ensures that each class appears only once in the -inheritance chain, even if it is listed multiple times.

                  -

                  This typically happens due to copy-paste errors, misunderstanding of inheritance, or refactoring mistakes.

                  +

                  In Python, a class definition can inherit from one or more base classes. The syntax for this is straightforward:

                  +
                  +class MyClass(BaseClass1, BaseClass2):
                  +    pass
                  +
                  +

                  When the same base class appears multiple times in the inheritance list, it serves no purpose and is always a programming error. Python’s Method +Resolution Order (MRO) ensures that each class appears only once in the inheritance chain, even if it is listed multiple times.

                  +

                  This typically happens due to:

                  +
                    +
                  • copy-paste errors when defining the class
                  • +
                  • misunderstanding of how inheritance works
                  • +
                  • refactoring mistakes where duplicate entries were not cleaned up
                  • +
                  +

                  What is the potential impact?

                  +

                  This issue has minimal runtime impact since Python automatically removes duplicate base classes from the Method Resolution Order. However, it +affects code quality:

                  +
                    +
                  • Maintainability: The duplicate entries make the code confusing and harder to understand
                  • +
                  • Code clarity: It suggests the code has not been properly reviewed
                  • +
                  • Future errors: It may indicate a misunderstanding of inheritance that could lead to more serious bugs
                  • +

                  How to fix it

                  Remove the duplicate base class from the inheritance list, keeping only one occurrence.

                  Code examples

                  @@ -23,3 +40,4 @@

                  Documentation

                • Python Documentation - Multiple Inheritance
                • Python Documentation - Method Resolution Order
                + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8509.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8509.json index a8bfc1c82..f50c34ecd 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8509.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8509.json @@ -1,24 +1,24 @@ { "title": "Classes should not inherit from the same base class multiple times", "type": "CODE_SMELL", - "code": { - "impacts": { - "MAINTAINABILITY": "MEDIUM" - }, - "attribute": "CLEAR" - }, "status": "ready", "remediation": { "func": "Constant\/Issue", - "constantCost": "5min" + "constantCost": "5 min" }, "tags": [ - "confusing", - "suspicious" + "pitfall", + "confusing" ], - "defaultSeverity": "Major", + "defaultSeverity": "Critical", "ruleSpecification": "RSPEC-8509", "sqKey": "S8509", "scope": "All", - "quickfix": "unknown" + "quickfix": "unknown", + "code": { + "impacts": { + "MAINTAINABILITY": "HIGH" + }, + "attribute": "CLEAR" + } } diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8510.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8510.html index b2385e998..3c0ea9cee 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8510.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8510.html @@ -1,10 +1,36 @@ -

                This rule raises an issue when a nested loop uses the same variable name as an outer loop, causing the inner loop to shadow the outer loop variable.

                +

                This rule raises an issue when a nested loop uses the same variable name as an outer loop, causing the inner loop to shadow the outer loop +variable.

                Why is this an issue?

                In Python, loop variables persist after the loop completes and can be reassigned by inner loops without any warning. Unlike languages with -block-scoped variables, Python allows inner loops to silently overwrite outer loop variables, making the outer variable inaccessible within the -inner loop scope.

                -

                This pattern almost always indicates a programmer error. Common scenarios include copying loop patterns without changing variable names, or -confusion about Python's scoping rules. The shadowing happens silently without any compiler or runtime warning, making these bugs difficult to spot.

                +block-scoped variables, Python allows inner loops to silently overwrite outer loop variables, making the outer variable inaccessible within the inner +loop scope.

                +

                This happens because Python’s for loop assigns the loop variable in the current scope, regardless of whether a variable with that name +already exists. When you write:

                +
                +for i in range(10):
                +    for i in range(5):
                +        pass
                +
                +

                The inner loop reassigns i on each iteration, completely replacing the value from the outer loop. After the inner loop completes, +i contains the last value from the inner loop (4), not the current value from the outer loop.

                +

                This pattern almost always indicates a programmer error rather than intentional behavior. Common scenarios include:

                +
                  +
                • copying loop patterns without changing variable names
                • +
                • iterating over an object’s properties using the object’s own name
                • +
                • confusion about Python’s scoping rules
                • +
                +

                The shadowing happens silently without any compiler or runtime warning, making these bugs difficult to spot during code review and testing.

                +

                What is the potential impact?

                +

                Using the same variable in nested loops leads to logic errors that can be difficult to debug:

                +
                  +
                • Incorrect iteration behavior: any code after the inner loop but within the outer loop body will see the wrong value of the loop + variable.
                • +
                • Unexpected variable values: after the inner loop completes, the variable contains the last value from the inner loop instead of + the expected outer loop value.
                • +
                • Silent failures: the code may appear to work in simple test cases but fail in production with different data.
                • +
                • Maintenance issues: future modifications may rely on the outer loop variable, causing new bugs when it contains unexpected + values.
                • +

                How to fix it

                Use different variable names for each loop. Choose descriptive names that reflect what each variable represents.

                Code examples

                @@ -28,4 +54,10 @@

                Resources

                Documentation

                +

                Related rules

                +
                  +
                • {rule:python:S1117} - Local variables should not shadow other variables
                + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8510.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8510.json index 1417972e7..d84e7479e 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8510.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8510.json @@ -1,23 +1,25 @@ { "title": "Loop variables should not be reused in nested loops", "type": "CODE_SMELL", - "code": { - "impacts": { - "MAINTAINABILITY": "MEDIUM" - }, - "attribute": "CLEAR" - }, "status": "ready", "remediation": { "func": "Constant\/Issue", - "constantCost": "5min" + "constantCost": "2min" }, "tags": [ - "suspicious" + "confusing", + "pitfall" ], - "defaultSeverity": "Major", + "defaultSeverity": "Critical", "ruleSpecification": "RSPEC-8510", "sqKey": "S8510", "scope": "All", - "quickfix": "unknown" + "quickfix": "unknown", + "code": { + "impacts": { + "RELIABILITY": "HIGH", + "MAINTAINABILITY": "HIGH" + }, + "attribute": "CLEAR" + } } diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8511.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8511.html index 19076adfb..d9bec1973 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8511.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8511.html @@ -1,20 +1,24 @@

                This rule raises an issue when a class definition with multiple inheritance results in an unresolvable Method Resolution Order (MRO).

                Why is this an issue?

                -

                Python uses the C3 linearization algorithm to determine the Method Resolution Order (MRO) — the order in which base classes are searched when -looking up methods and attributes. When a class is created with multiple inheritance, Python must be able to construct a valid MRO. If the inheritance -structure violates the C3 linearization rules, Python raises a TypeError at class definition time, preventing the class from being -created at all.

                +

                Python uses the C3 linearization algorithm (also called C3 superclass linearization) to determine the Method Resolution Order (MRO) - the order in +which base classes are searched when looking up methods and attributes. This algorithm ensures a consistent and predictable class hierarchy.

                +

                When a class is created with multiple inheritance, Python must be able to construct a valid MRO. If the inheritance structure violates the C3 +linearization rules, Python raises a TypeError at class definition time, preventing the class from being created at all.

                +

                C3 linearization rules

                The C3 algorithm enforces these key constraints:

                  -
                • Local precedence ordering: If class C inherits from A then B, then A must - appear before B in the MRO.
                • +
                • Local precedence ordering: If class C inherits from A then B (i.e., class C(A, + B)), then A must appear before B in the MRO
                • Monotonicity: If class A appears before class B in the MRO of a parent class, then A - must also appear before B in the MRO of any child class.
                • + must also appear before B in the MRO of any child class
                -

                MRO inconsistencies cause immediate runtime failures. The class cannot be instantiated or used, breaking the application at import time.

                +

                Violating these rules creates an inconsistent hierarchy where Python cannot determine which parent class should take precedence.

                +

                What is the potential impact?

                +

                MRO inconsistencies cause immediate failures at class definition time — Python raises a TypeError and the class is never created, +breaking the application at import time.

                How to fix it

                -

                Restructure the inheritance hierarchy to respect the C3 linearization rules. Remove redundant base classes from the inheritance list, as a class -does not need to directly inherit from a grandparent if it is already inherited through a parent.

                +

                To fix MRO inconsistencies, restructure the inheritance hierarchy to respect the C3 linearization rules. Remove redundant base classes from the +inheritance list, as a class does not need to directly inherit from a grandparent if it is already inherited through a parent.

                Code examples

                Noncompliant code example

                @@ -27,7 +31,7 @@ 

                Noncompliant code example

                class C(A): pass -class D(B, A, C): # Noncompliant: explicitly inheriting from A violates local precedence +class D(B, A, C): # Noncompliant: inconsistent MRO for bases A and C; D requires A before C, but C inherits from A pass

                Compliant solution

                @@ -48,6 +52,8 @@

                Resources

                Documentation

                + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8511.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8511.json index ed55262d8..df35c3dc7 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8511.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8511.json @@ -4,17 +4,21 @@ "status": "ready", "remediation": { "func": "Constant\/Issue", - "constantCost": "15 min" + "constantCost": "30min" }, - "tags": [], - "defaultSeverity": "Critical", + "tags": [ + "design", + "inheritance", + "pitfall" + ], + "defaultSeverity": "Blocker", "ruleSpecification": "RSPEC-8511", "sqKey": "S8511", "scope": "Main", "quickfix": "unknown", "code": { "impacts": { - "RELIABILITY": "HIGH" + "RELIABILITY": "BLOCKER" }, "attribute": "LOGICAL" } diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8512.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8512.html index 23547fab0..be3988d9c 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8512.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8512.html @@ -1,15 +1,23 @@ +

                This rule raises an issue when the same class field is unconditionally assigned multiple times within a class body.

                Why is this an issue?

                When a class field is defined multiple times in the same class body, only the last assignment takes effect. All previous assignments are dead code that serve no purpose.

                -

                This pattern typically occurs due to copy-paste errors, refactoring mistakes, merge conflicts, or misunderstanding of how class attributes work.

                +

                This pattern typically occurs due to:

                +
                  +
                • copy-paste errors: duplicating code blocks without updating field names
                • +
                • refactoring mistakes: forgetting to remove old assignments when updating values
                • +
                • merge conflicts: incorrectly resolving version control conflicts
                • +
                • misunderstanding: confusion about how class attributes work
                • +

                What is the potential impact?

                  -
                • Developers may not immediately realize which value is actually used.
                • -
                • Dead code must be read, understood, and maintained even though it has no effect.
                • -
                • The duplicate definition might indicate that two different fields were intended, suggesting a naming error.
                • +
                • confusion: developers may not immediately realize which value is actually used
                • +
                • maintenance burden: dead code must be read, understood, and maintained even though it has no effect
                • +
                • hidden bugs: the duplicate definition might indicate that two different fields were intended, suggesting a naming error that + could lead to incorrect behavior

                How to fix it

                -

                Remove all but the last assignment to the class field.

                +

                Remove all but the last assignment to the class field. Keep only the final value that should be used.

                Code examples

                Noncompliant code example

                @@ -28,5 +36,12 @@ 

                Resources

                Documentation

                +

                Related rules

                +
                  +
                • {rule:python:S4143} - Collection content should not be replaced unconditionally
                • +
                • {rule:python:S1534} - Member names should not be duplicated within a class or object literal
                + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8512.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8512.json index 614bb903d..8fc75b77d 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8512.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8512.json @@ -1,23 +1,25 @@ { "title": "Class fields should not be defined multiple times", "type": "CODE_SMELL", - "code": { - "impacts": { - "MAINTAINABILITY": "MEDIUM" - }, - "attribute": "CLEAR" - }, "status": "ready", "remediation": { "func": "Constant\/Issue", "constantCost": "5min" }, "tags": [ - "suspicious" + "confusing", + "dead-code", + "pitfall" ], - "defaultSeverity": "Major", + "defaultSeverity": "Critical", "ruleSpecification": "RSPEC-8512", "sqKey": "S8512", "scope": "All", - "quickfix": "unknown" + "quickfix": "targeted", + "code": { + "impacts": { + "MAINTAINABILITY": "HIGH" + }, + "attribute": "CLEAR" + } } diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8513.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8513.html index 9ddf8e0c7..cbf8ab898 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8513.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8513.html @@ -1,16 +1,27 @@ -

                This rule raises an issue when multiple startswith() or endswith() calls on the same string are chained with the -or operator to check for different prefixes or suffixes.

                +

                This rule raises an issue when multiple startswith() or endswith() calls on the same string are chained together using +the or operator to check for different prefixes or suffixes.

                Why is this an issue?

                When you need to check if a string starts or ends with one of several possible values, chaining multiple startswith() or -endswith() calls with the or operator creates unnecessary verbosity. Both methods accept a tuple of strings as their first -argument, so a single call with a tuple is both more concise and more readable.

                +endswith() calls with the or operator creates unnecessary verbosity and redundancy. Each additional prefix or suffix +requires a separate method call and another or operator, making the condition increasingly difficult to read and maintain.

                +

                This pattern is particularly common when validating file extensions, URL protocols, or any scenario where you need to check for multiple valid +prefixes or suffixes.

                +

                What is the potential impact?

                +

                The consolidated form is easier to read and maintain, reducing the cognitive load on developers reviewing or modifying the code. The performance +gain from a single consolidated call is modest but accumulates in loops or hot paths.

                How to fix it

                Replace multiple startswith() or endswith() calls connected by or operators with a single call that uses a -tuple containing all the prefixes or suffixes.

                +tuple containing all the prefixes or suffixes to check.

                +

                Both startswith() and endswith() methods accept a tuple of strings as their first argument. When you pass a tuple, the +method checks if the string starts or ends with any of the values in that tuple. This has two main benefits:

                +
                  +
                • readability: the code is more concise and easier to understand at a glance.
                • +
                • performance: the method is called only once instead of multiple times, reducing overhead.
                • +

                Code examples

                Noncompliant code example

                -if s.startswith("http://") or s.startswith("https://"):  # Noncompliant
                +if s.startswith("http://") or s.startswith("https://"):  # Noncompliant: use a tuple argument instead
                     process_url(s)
                 

                Compliant solution

                @@ -20,7 +31,7 @@

                Compliant solution

                Noncompliant code example

                -if filename.endswith(".jpg") or filename.endswith(".png") or filename.endswith(".gif"):  # Noncompliant
                +if filename.endswith(".jpg") or filename.endswith(".png") or filename.endswith(".gif"):  # Noncompliant: use a tuple argument instead
                     display_image(filename)
                 

                Compliant solution

                @@ -31,11 +42,12 @@

                Compliant solution

                Resources

                Documentation

                Related rules

                • {rule:python:S6659} - startswith or endswith methods should be used instead of string slicing in condition expressions
                + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8513.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8513.json index 31bb2cc32..b952a54e4 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8513.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8513.json @@ -4,14 +4,21 @@ "status": "ready", "remediation": { "func": "Constant\/Issue", - "constantCost": "5min" + "constantCost": "5 min" }, "tags": [ - "convention" + "performance", + "pythonic" ], - "defaultSeverity": "Minor", + "defaultSeverity": "Major", "ruleSpecification": "RSPEC-8513", "sqKey": "S8513", "scope": "All", - "quickfix": "covered" + "quickfix": "unknown", + "code": { + "impacts": { + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "EFFICIENT" + } } diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8514.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8514.html index f5507fe20..ce32b2ae5 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8514.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8514.html @@ -15,7 +15,7 @@

                What is the potential impact?

                How to fix it

                Add type annotations to all attributes that should be dataclass fields.

                If you intentionally want a class variable shared across all instances, annotate it with typing.ClassVar[T]. This is the idiomatic -Python way to declare class variables inside a dataclass — it makes the intent explicit and ensures the attribute is excluded from all generated +Python way to declare class variables inside a dataclass. It makes the intent explicit and ensures the attribute is excluded from all generated dataclass methods.

                Code examples

                Noncompliant code example

                diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8515.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8515.html index 6358facd4..a3cb2362e 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8515.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8515.html @@ -6,7 +6,9 @@

                Why is this an issue?

              • covariant with covariant=True: the type can be replaced with a subtype
              • contravariant with contravariant=True: the type can be replaced with a supertype
              -

              These variance modes are mutually exclusive. A type variable cannot be both covariant and contravariant simultaneously because these represent opposite relationships in the type hierarchy. Python's typing module will raise a ValueError at runtime when it encounters such a declaration.

              +

              These variance modes are mutually exclusive. A type variable cannot be both covariant and contravariant simultaneously because these represent +opposite relationships in the type hierarchy. Python’s typing module will raise a ValueError at runtime when it encounters +such a declaration.

              What is the potential impact?

              • Python raises a ValueError when the module is imported, causing the application to crash immediately.
              • @@ -24,12 +26,14 @@

                Noncompliant code example

                 from typing import TypeVar
                 
                +# Invalid: cannot be both covariant and contravariant
                 T = TypeVar('T', covariant=True, contravariant=True)  # Noncompliant
                 

                Compliant solution

                 from typing import TypeVar
                 
                +# Valid: covariant type variable
                 T_co = TypeVar('T_co', covariant=True)
                 

                Resources

                @@ -39,3 +43,4 @@

                Documentation

              • PEP 484 - Covariance and Contravariance
              • Mypy - Variance of generic types
              + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8515.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8515.json index 3a429f4bc..e952e4067 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8515.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8515.json @@ -6,10 +6,20 @@ "func": "Constant\/Issue", "constantCost": "5min" }, - "tags": [], + "tags": [ + "type", + "pitfall" + ], "defaultSeverity": "Blocker", "ruleSpecification": "RSPEC-8515", "sqKey": "S8515", "scope": "All", - "quickfix": "unknown" + "quickfix": "unknown", + "code": { + "impacts": { + "RELIABILITY": "BLOCKER", + "MAINTAINABILITY": "HIGH" + }, + "attribute": "LOGICAL" + } } diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8516.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8516.html index 32c6a1b70..4cc8fbc70 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8516.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8516.html @@ -1,5 +1,5 @@ -

              This rule raises an issue when a group iterator returned by itertools.groupby() is stored outside the loop body for later use, instead -of being consumed immediately.

              +

              This rule raises an issue when a group iterator returned by itertools.groupby() is stored in a container that persists beyond the +current loop iteration, instead of being consumed immediately.

              Why is this an issue?

              The itertools.groupby() function groups consecutive items from an iterable based on a key function. It returns pairs of (key, group_iterator) where each group_iterator is a sub-iterator that yields items for that specific group.

              diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8518.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8518.html index d25c1734d..3932749ae 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8518.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8518.html @@ -1,14 +1,33 @@ -

              This rule raises an issue when a loop iterates over enumerate() but accesses list elements by index instead of unpacking the value directly from the enumeration.

              +

              This rule raises an issue when a loop iterates over enumerate() but accesses list elements by index instead of unpacking the value +directly from the enumeration.

              Why is this an issue?

              -

              The enumerate() function provides both the index and the value of each element when iterating over a sequence. When you only unpack the index and then use it to subscript the original list, the value is already available from enumerate() and the subscript operation is redundant.

              -

              This pattern results in unnecessary operations and reduced readability.

              +

              The enumerate() function in Python is designed to provide both the index and the value of each element when iterating over a sequence. +It returns tuples in the form (index, value) for each iteration.

              +

              When you use enumerate() in a loop but only unpack the index, then use that index to access the list element via subscript notation +(e.g., lst[i]), you are performing an unnecessary lookup operation. The value you are looking up is already available from +enumerate() itself - you are simply not capturing it.

              +

              This pattern does not take advantage of a built-in feature of enumerate() and results in:

              +
                +
              • unnecessary operations: the list subscript operation is redundant since enumerate() already provides the + value
              • +
              • reduced readability: the code is more verbose than necessary and obscures the intent
              • +
              • performance overhead: while minor, each subscript operation requires a lookup that could be avoided
              • +
              +

              The Pythonic approach is to unpack both values from the tuple that enumerate() returns. This makes the code clearer, more efficient, +and more idiomatic.

              +

              What is the potential impact?

              +

              Non-idiomatic code patterns increase the cognitive load for developers maintaining the codebase. Over time, redundant index lookups can also mask +bugs when the sequence is modified between the enumerate() call and the subscript access.

              +

              How to fix it

              +

              Unpack both the index and value from the enumerate() tuple directly in the loop declaration. Replace the subscript access with the +unpacked value variable.

              Code examples

              Noncompliant code example

               fruits = ['apple', 'banana', 'cherry']
               
              -for i, _ in enumerate(fruits):
              -    print(f"Index {i}: {fruits[i]}")  # Noncompliant
              +for i, fruit in enumerate(fruits):
              +    print(f"Index {i}: {fruits[i]}")  # Noncompliant: use the unpacked value instead of "fruits[i]"
               

              Compliant solution

              @@ -21,4 +40,6 @@ 

              Resources

              Documentation

              + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8518.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8518.json index 995b5bf3a..783ccbd00 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8518.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8518.json @@ -6,16 +6,20 @@ "func": "Constant\/Issue", "constantCost": "2min" }, - "tags": [], - "defaultSeverity": "Minor", + "tags": [ + "pythonic", + "readability", + "performance" + ], + "defaultSeverity": "Major", "ruleSpecification": "RSPEC-8518", "sqKey": "S8518", "scope": "All", "quickfix": "unknown", "code": { "impacts": { - "MAINTAINABILITY": "LOW" + "MAINTAINABILITY": "MEDIUM" }, - "attribute": "CONVENTIONAL" + "attribute": "CLEAR" } } diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8572.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8572.html index 56cc3f6c9..f319ee1b6 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8572.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8572.html @@ -13,7 +13,7 @@

              Why is this an issue?

              • It automatically captures the traceback without requiring exc_info=True
              • It clearly signals to other developers that you’re logging an exception
              • -
              • It follows Python’s principle of being explicit about intent
              • +
              • It is the purpose-built method for logging exceptions and is the established Python idiom for this use case

              Using logging.error() in an exception handler means you’re either:

                @@ -22,21 +22,9 @@

                Why is this an issue?

              The logging.exception() method is specifically designed for this use case and is the established Python idiom for logging exceptions.

              -

              If omitting the traceback is intentional, explicitly passing exc_info=False (or exc_info=None) makes that intent clear -and is therefore not flagged.

              -

              What is the potential impact?

              -

              Using logging.error() instead of logging.exception() in exception handlers reduces code maintainability and makes -debugging more difficult.

              -

              When traceback information is missing from logs, developers must spend additional time reproducing issues to understand their root cause. In -production environments, where issues may be intermittent or difficult to reproduce, missing traceback information can make it nearly impossible to -diagnose problems effectively.

              -

              Additionally, using logging.error() with exc_info=True instead of the more idiomatic logging.exception() -makes the code less readable and may confuse developers who are unfamiliar with this pattern.

              How to fix it

              Replace logging.error() with logging.exception() when logging within an exception handler. If you were using exc_info=True, you can remove it since logging.exception() includes traceback information by default.

              -

              If you intentionally do not want to log the traceback, explicitly pass exc_info=False to logging.error() to signal that -intent.

              Code examples

              Noncompliant code example

              @@ -56,15 +44,6 @@ 

              Compliant solution

              except ValueError: logging.exception("Exception occurred")
              -

              If logging the traceback is not desired, explicitly opt out with exc_info=False:

              -
              -import logging
              -
              -try:
              -    raise ValueError("Invalid value")
              -except ValueError:
              -    logging.error("Exception occurred", exc_info=False)
              -

              Resources

              Documentation

                diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_agentic_AI_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_agentic_AI_profile.json index d1208cf0d..946a16ce9 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_agentic_AI_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_agentic_AI_profile.json @@ -92,9 +92,7 @@ "S4502", "S4507", "S4790", - "S4828", "S4830", - "S5042", "S5122", "S5247", "S5332", diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 73e93e38f..018fc8909 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -95,9 +95,7 @@ "S4502", "S4507", "S4790", - "S4828", "S4830", - "S5042", "S5122", "S5247", "S5332", @@ -334,14 +332,22 @@ "S8494", "S8495", "S8500", + "S8502", "S8503", "S8504", "S8505", "S8507", + "S8508", + "S8509", + "S8510", + "S8511", + "S8512", "S8513", "S8514", + "S8515", "S8516", "S8517", + "S8518", "S8519", "S8520", "S8521", diff --git a/python-checks/src/test/java/org/sonar/python/checks/OpenSourceCheckListTest.java b/python-checks/src/test/java/org/sonar/python/checks/OpenSourceCheckListTest.java index baa8401b6..86469c573 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/OpenSourceCheckListTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/OpenSourceCheckListTest.java @@ -132,7 +132,7 @@ void test_no_deprecated_rule_in_default_profile() throws IOException, ParseExcep void test_locally_deprecated_rules_stay_deprecated() throws IOException { // Some rules have been deprecated only for Python. When executed, rule-api reverts those rule to "ready" status, which is incorrect. // This test is here to ensure it doesn't happen. - List locallyDeprecatedRules = Arrays.asList("S1523", "S4721"); + List locallyDeprecatedRules = Arrays.asList("S1523"); try (Stream fileStream = Files.find(METADATA_DIR, 1, (path, attr) -> path.toString().endsWith(".json"))) { Set deprecatedKeys = fileStream .filter(path -> !path.toString().endsWith("_profile.json")) diff --git a/python-checks/src/test/java/org/sonar/python/checks/hotspots/OsExecCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/hotspots/OsExecCheckTest.java deleted file mode 100644 index 5ba1b992a..000000000 --- a/python-checks/src/test/java/org/sonar/python/checks/hotspots/OsExecCheckTest.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * SonarQube Python Plugin - * Copyright (C) SonarSource Sàrl - * mailto:info AT sonarsource DOT com - * - * You can redistribute and/or modify this program under the terms of - * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the Sonar Source-Available License for more details. - * - * You should have received a copy of the Sonar Source-Available License - * along with this program; if not, see https://sonarsource.com/license/ssal/ - */ -package org.sonar.python.checks.hotspots; - -import org.junit.jupiter.api.Test; -import org.sonar.python.checks.utils.PythonCheckVerifier; - -class OsExecCheckTest { - @Test - void test() { - PythonCheckVerifier.verify("src/test/resources/checks/hotspots/osExec.py", new OsExecCheck()); - } -} diff --git a/python-checks/src/test/resources/checks/hotspots/osExec.py b/python-checks/src/test/resources/checks/hotspots/osExec.py deleted file mode 100644 index 3c518c0c3..000000000 --- a/python-checks/src/test/resources/checks/hotspots/osExec.py +++ /dev/null @@ -1,49 +0,0 @@ -import os -import subprocess -from subprocess import run, call, check_call, check_output, Popen - -# See https://docs.python.org/3/library/subprocess.html -params = ["ls", "-l"] -subprocess.run(params) # Noncompliant -run(params) # Noncompliant -subprocess.Popen(params) # Noncompliant -Popen(params) # Noncompliant - -# Older API -subprocess.call(params) # Noncompliant -call(params) # Noncompliant -subprocess.check_call(params) # Noncompliant -check_call(params) # Noncompliant -subprocess.check_output(params) # Noncompliant -check_output(params) # Noncompliant - -# See https://docs.python.org/3/library/os.html -cmd = "ls -l" -os.system(cmd) # Noncompliant -mode = os.P_WAIT -file = "ls" -path = "/bin/ls" -env = os.environ -os.spawnl(mode, path, *params) # Noncompliant -os.spawnle(mode, path, *params, env) # Noncompliant -os.spawnlp(mode, file, *params) # Noncompliant -os.spawnlpe(mode, file, *params, env) # Noncompliant -os.spawnv(mode, path, params) # Noncompliant -os.spawnve(mode, path, params, env) # Noncompliant -os.spawnvp(mode, file, params) # Noncompliant -os.spawnvpe(mode, file, params, env) # Noncompliant -mode = 'r' -(child_stdout) = os.popen(cmd, mode, 1) # Noncompliant - -# print(child_stdout.read()) -(_, output) = subprocess.getstatusoutput(cmd) # Noncompliant -out = subprocess.getoutput(cmd) # Noncompliant -os.startfile(path) # Noncompliant -os.execl(path, *params) # Noncompliant -os.execle(path, *params, env) # Noncompliant -os.execlp(file, *params) # Noncompliant -os.execlpe(file, *params, env) # Noncompliant -os.execv(path, params) # Noncompliant -os.execve(path, params, env) # Noncompliant -os.execvp(file, params) # Noncompliant -os.execvpe(file, params, env) # Noncompliant diff --git a/python-commons/src/test/java/org/sonar/plugins/python/PythonRuleRepositoryTest.java b/python-commons/src/test/java/org/sonar/plugins/python/PythonRuleRepositoryTest.java index 764a1b31e..2a038391e 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/PythonRuleRepositoryTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/PythonRuleRepositoryTest.java @@ -62,14 +62,14 @@ void createRulesTest() throws IOException { @Test void owaspSecurityStandard() { RulesDefinition.Repository repository_9_3 = buildRepository(9, 3); - RulesDefinition.Rule s4721_9_3 = repository_9_3.rule("S4721"); - assertThat(s4721_9_3).isNotNull(); - assertThat(s4721_9_3.securityStandards()).contains("owaspTop10-2021:a3"); + RulesDefinition.Rule s2077_9_3 = repository_9_3.rule("S2077"); + assertThat(s2077_9_3).isNotNull(); + assertThat(s2077_9_3.securityStandards()).contains("owaspTop10-2021:a3"); RulesDefinition.Repository repository_9_2 = buildRepository(9, 2); - RulesDefinition.Rule s4721_9_2 = repository_9_2.rule("S4721"); - assertThat(s4721_9_2).isNotNull(); - assertThat(s4721_9_2.securityStandards()).doesNotContain("owaspTop10-2021:a3"); + RulesDefinition.Rule s2077_9_2 = repository_9_2.rule("S2077"); + assertThat(s2077_9_2).isNotNull(); + assertThat(s2077_9_2.securityStandards()).doesNotContain("owaspTop10-2021:a3"); } @Test @@ -120,8 +120,8 @@ void ruleTemplates() { @Test void hotspotRules() { RulesDefinition.Repository repository = buildRepository(); - RulesDefinition.Rule hardcodedIp = repository.rule("S1313"); - assertThat(hardcodedIp.type()).isEqualTo(RuleType.SECURITY_HOTSPOT); + RulesDefinition.Rule sqlInjection = repository.rule("S2077"); + assertThat(sqlInjection.type()).isEqualTo(RuleType.SECURITY_HOTSPOT); } private static RulesDefinition.Repository buildRepository() { diff --git a/sonarpedia.json b/sonarpedia.json index 042efe1a2..b8c12a894 100644 --- a/sonarpedia.json +++ b/sonarpedia.json @@ -3,7 +3,7 @@ "languages": [ "PY" ], - "latest-update": "2026-04-09T08:05:06.976620Z", + "latest-update": "2026-05-06T08:41:50.337723Z", "options": { "no-language-in-filenames": true, "preserve-filenames": true From d6f06a461bc81ae2c33bf8c788e4c2a7b8fdcb6c Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Thu, 7 May 2026 16:21:25 +0200 Subject: [PATCH 117/322] SONARPY-917: Supporting GROUP PATTERN in match statements (#1099) GitOrigin-RevId: 16520e9871862f13084ca25968708ef92cfdb1bc --- .../test/resources/checks/consistentReturn.py | 39 ++++++++ .../python/cfg/ControlFlowGraphBuilder.java | 13 ++- .../python/api/cfg/ControlFlowGraphTest.java | 93 +++++++++++++++++++ 3 files changed, 144 insertions(+), 1 deletion(-) diff --git a/python-checks/src/test/resources/checks/consistentReturn.py b/python-checks/src/test/resources/checks/consistentReturn.py index f5c8aded2..1b3cb84eb 100644 --- a/python-checks/src/test/resources/checks/consistentReturn.py +++ b/python-checks/src/test/resources/checks/consistentReturn.py @@ -152,6 +152,45 @@ def match_irrefutable_in_middle(x): case 1: pass +def match_group_capture_is_irrefutable(x): + match x: + case 0: + return x + case (y): + return y + + +def match_group_wildcard_is_irrefutable(x): + match x: + case 0: + return x + case (_): + return 42 + + +def match_nested_group_is_irrefutable(x): + match x: + case 0: + return x + case ((y)): + return y + + +def match_guarded_group_is_refutable(x): # Noncompliant + match x: + case 0: + return x + case (y) if x > 0: + return y + + +def match_group_literal_is_refutable(x): # Noncompliant + match x: + case 0: + return x + case (42): + return 42 + # raise / assert def return_value_or_raise(x): diff --git a/python-frontend/src/main/java/org/sonar/python/cfg/ControlFlowGraphBuilder.java b/python-frontend/src/main/java/org/sonar/python/cfg/ControlFlowGraphBuilder.java index d38ecb830..87e8f5ce0 100644 --- a/python-frontend/src/main/java/org/sonar/python/cfg/ControlFlowGraphBuilder.java +++ b/python-frontend/src/main/java/org/sonar/python/cfg/ControlFlowGraphBuilder.java @@ -42,6 +42,7 @@ import org.sonar.plugins.python.api.tree.IfStatement; import org.sonar.plugins.python.api.tree.MatchStatement; import org.sonar.plugins.python.api.tree.ParameterList; +import org.sonar.plugins.python.api.tree.GroupPattern; import org.sonar.plugins.python.api.tree.Pattern; import org.sonar.plugins.python.api.tree.RaiseStatement; import org.sonar.plugins.python.api.tree.ReturnStatement; @@ -251,7 +252,17 @@ private static int findIrrefutableCaseIndex(List caseBlocks) { } private static boolean isIrrefutablePattern(CaseBlock caseBlock) { - return caseBlock.guard() == null && caseBlock.pattern().is(Tree.Kind.WILDCARD_PATTERN, Tree.Kind.CAPTURE_PATTERN); + return caseBlock.guard() == null && isIrrefutablePatternKind(caseBlock.pattern()); + } + + private static boolean isIrrefutablePatternKind(Pattern pattern) { + if (pattern.is(Tree.Kind.WILDCARD_PATTERN, Tree.Kind.CAPTURE_PATTERN)) { + return true; + } + if (pattern.is(Tree.Kind.GROUP_PATTERN)) { + return isIrrefutablePatternKind(((GroupPattern) pattern).pattern()); + } + return false; } private PythonCfgBlock buildWithStatement(WithStatement withStatement, PythonCfgBlock successor) { diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/cfg/ControlFlowGraphTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/cfg/ControlFlowGraphTest.java index 47eaa3045..9f2901872 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/cfg/ControlFlowGraphTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/cfg/ControlFlowGraphTest.java @@ -752,6 +752,99 @@ void match_statement_guarded_wildcard_is_refutable() { assertThat(guardedWildcard.falseSuccessor()).isEqualTo(barBlock); } + @Test + void match_statement_group_pattern_is_irrefutable() { + ControlFlowGraph cfg = cfg(""" + foo() """, + "match x:", + " case \"a\": y()", + " case (z): w()", + "bar()" + ); + + PythonCfgBranchingBlock start = (PythonCfgBranchingBlock) cfg.start(); + PythonCfgEndBlock end = (PythonCfgEndBlock) cfg.end(); + assertThat(end.predecessors()).hasSize(1); + CfgBlock barBlock = end.predecessors().stream().findFirst().get(); + + // case "a" false successor must be the irrefutable block (case (z)), not barBlock + PythonCfgSimpleBlock irrefutableBlock = (PythonCfgSimpleBlock) start.falseSuccessor(); + assertThat(irrefutableBlock.elements()).extracting(Tree::getKind) + .containsExactly(Kind.NAME, Kind.GROUP_PATTERN); + + CfgBlock irrefutableBody = irrefutableBlock.successors().stream().findFirst().get(); + assertThat(irrefutableBody.successors()).containsExactly(barBlock); + } + + @Test + void match_statement_group_wildcard_pattern_is_irrefutable() { + ControlFlowGraph cfg = cfg(""" + foo() """, + "match x:", + " case \"a\": y()", + " case (_): w()", + "bar()" + ); + + PythonCfgBranchingBlock start = (PythonCfgBranchingBlock) cfg.start(); + // case "a" false successor must be a simple block (irrefutable), not a branching block + PythonCfgSimpleBlock irrefutableBlock = (PythonCfgSimpleBlock) start.falseSuccessor(); + assertThat(irrefutableBlock.elements()).extracting(Tree::getKind) + .containsExactly(Kind.NAME, Kind.GROUP_PATTERN); + } + + @Test + void match_statement_nested_group_pattern_is_irrefutable() { + ControlFlowGraph cfg = cfg(""" + foo() """, + "match x:", + " case \"a\": y()", + " case ((z)): w()", + "bar()" + ); + + PythonCfgBranchingBlock start = (PythonCfgBranchingBlock) cfg.start(); + // case "a" false successor must be a simple block (irrefutable), not a branching block + PythonCfgSimpleBlock irrefutableBlock = (PythonCfgSimpleBlock) start.falseSuccessor(); + assertThat(irrefutableBlock.elements()).extracting(Tree::getKind) + .containsExactly(Kind.NAME, Kind.GROUP_PATTERN); + } + + @Test + void match_statement_group_literal_pattern_is_refutable() { + ControlFlowGraph cfg = cfg(""" + foo() """, + "match x:", + " case \"a\": y()", + " case (42): w()", + "bar()" + ); + + // Both cases are refutable — the second case must be a branching block + PythonCfgBranchingBlock start = (PythonCfgBranchingBlock) cfg.start(); + PythonCfgBranchingBlock secondCase = (PythonCfgBranchingBlock) start.falseSuccessor(); + assertThat(secondCase).isInstanceOf(PythonCfgBranchingBlock.class); + // The false path of the second case leads directly to barBlock (no-match path) + PythonCfgEndBlock end = (PythonCfgEndBlock) cfg.end(); + CfgBlock barBlock = end.predecessors().stream().findFirst().get(); + assertThat(secondCase.falseSuccessor()).isEqualTo(barBlock); + } + + @Test + void match_statement_guarded_group_pattern_is_refutable() { + ControlFlowGraph cfg = cfg(""" + foo() """, + "match x:", + " case \"a\": y()", + " case (z) if w(): v()", + "bar()" + ); + + // Both cases are refutable — the second case must be a branching block + PythonCfgBranchingBlock start = (PythonCfgBranchingBlock) cfg.start(); + assertThat(start.falseSuccessor()).isInstanceOf(PythonCfgBranchingBlock.class); + } + @Test void CFGBlock_toString() { PythonCfgEndBlock endBlock = new PythonCfgEndBlock(); From 177a2ae0de83fb1eff6bcdfd537b8077ea13cc23 Mon Sep 17 00:00:00 2001 From: "hashicorp-vault-sonar-prod[bot]" <111297361+hashicorp-vault-sonar-prod[bot]@users.noreply.github.com> Date: Mon, 11 May 2026 07:45:35 +0000 Subject: [PATCH 118/322] Prepare for next development iteration (#1103) Co-authored-by: guillaume-dequenne <54781802+guillaume-dequenne@users.noreply.github.com> GitOrigin-RevId: fba18e1787c42f545b6d456a932fb4fa7f74c5e0 --- docs/pom.xml | 2 +- docs/python-custom-rules-example/pom.xml | 2 +- its/commons/pom.xml | 2 +- its/plugin/it-python-plugin-test/pom.xml | 2 +- its/plugin/pom.xml | 2 +- its/plugin/python-custom-rules-plugin/pom.xml | 2 +- its/pom.xml | 2 +- pom.xml | 2 +- python-checks-testkit/pom.xml | 2 +- python-checks/pom.xml | 2 +- python-commons/pom.xml | 2 +- python-frontend/pom.xml | 2 +- sonar-python-plugin/pom.xml | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/pom.xml b/docs/pom.xml index 9905e4b70..e1853524d 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.python python - 5.22-SNAPSHOT + 5.23-SNAPSHOT docs diff --git a/docs/python-custom-rules-example/pom.xml b/docs/python-custom-rules-example/pom.xml index 9064ddb1c..6a9f460ce 100644 --- a/docs/python-custom-rules-example/pom.xml +++ b/docs/python-custom-rules-example/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python docs - 5.22-SNAPSHOT + 5.23-SNAPSHOT python-custom-rules-example diff --git a/its/commons/pom.xml b/its/commons/pom.xml index 0fd22e90b..0faf4ce12 100644 --- a/its/commons/pom.xml +++ b/its/commons/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python python-its - 5.22-SNAPSHOT + 5.23-SNAPSHOT Python :: ITs :: Commons diff --git a/its/plugin/it-python-plugin-test/pom.xml b/its/plugin/it-python-plugin-test/pom.xml index 39398d10a..ce202f0eb 100644 --- a/its/plugin/it-python-plugin-test/pom.xml +++ b/its/plugin/it-python-plugin-test/pom.xml @@ -7,7 +7,7 @@ it-python-plugin org.sonarsource.python - 5.22-SNAPSHOT + 5.23-SNAPSHOT it-python-plugin-test diff --git a/its/plugin/pom.xml b/its/plugin/pom.xml index 63dfd0502..6d2606084 100644 --- a/its/plugin/pom.xml +++ b/its/plugin/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.python python-its - 5.22-SNAPSHOT + 5.23-SNAPSHOT diff --git a/its/plugin/python-custom-rules-plugin/pom.xml b/its/plugin/python-custom-rules-plugin/pom.xml index 0ffa9db98..c4988d257 100644 --- a/its/plugin/python-custom-rules-plugin/pom.xml +++ b/its/plugin/python-custom-rules-plugin/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python it-python-plugin - 5.22-SNAPSHOT + 5.23-SNAPSHOT python-custom-rules-plugin diff --git a/its/pom.xml b/its/pom.xml index 066032741..beaf4709e 100644 --- a/its/pom.xml +++ b/its/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.python python - 5.22-SNAPSHOT + 5.23-SNAPSHOT python-its diff --git a/pom.xml b/pom.xml index 5d56ed11c..b58a28cdb 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ org.sonarsource.python python - 5.22-SNAPSHOT + 5.23-SNAPSHOT pom Python diff --git a/python-checks-testkit/pom.xml b/python-checks-testkit/pom.xml index b1d0afe70..eb023561c 100644 --- a/python-checks-testkit/pom.xml +++ b/python-checks-testkit/pom.xml @@ -6,7 +6,7 @@ python org.sonarsource.python - 5.22-SNAPSHOT + 5.23-SNAPSHOT python-checks-testkit diff --git a/python-checks/pom.xml b/python-checks/pom.xml index 353af290e..a55efc2d2 100644 --- a/python-checks/pom.xml +++ b/python-checks/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.python python - 5.22-SNAPSHOT + 5.23-SNAPSHOT python-checks diff --git a/python-commons/pom.xml b/python-commons/pom.xml index 2cd107c94..15cc0e5b9 100644 --- a/python-commons/pom.xml +++ b/python-commons/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python python - 5.22-SNAPSHOT + 5.23-SNAPSHOT python-commons diff --git a/python-frontend/pom.xml b/python-frontend/pom.xml index a0f1674cf..2cc13e129 100644 --- a/python-frontend/pom.xml +++ b/python-frontend/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python python - 5.22-SNAPSHOT + 5.23-SNAPSHOT python-frontend diff --git a/sonar-python-plugin/pom.xml b/sonar-python-plugin/pom.xml index f8ae2ea8e..4cc80da4b 100644 --- a/sonar-python-plugin/pom.xml +++ b/sonar-python-plugin/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python python - 5.22-SNAPSHOT + 5.23-SNAPSHOT sonar-python-plugin From 7d22c1622160a0197bbd61c33368817f13a9540d Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Mon, 11 May 2026 13:26:02 +0200 Subject: [PATCH 119/322] SONARPY-4139 Migrated the usage of inferred types to type matchers (#1098) GitOrigin-RevId: e70ef34bb7a4905a1cee5c121f032a08938af91a --- .../checks/DoublePrefixOperatorCheck.java | 6 +- ...dentityComparisonWithCachedTypesCheck.java | 2 +- .../MandatoryFunctionReturnTypeHintCheck.java | 65 +++++++++++-------- .../checks/PandasChainInstructionCheck.java | 55 +++++----------- ...edPipelineDontAccessTransformersCheck.java | 35 +++++----- .../python/checks/SlotsAssignmentCheck.java | 2 +- ...datoryFunctionReturnTypeHintCheckTest.java | 13 ++++ .../resources/checks/doublePrefixOperator.py | 2 +- .../checks/pandasChainInstructionCheck.py | 3 +- ...ached_pipeline_dont_access_transformers.py | 16 ++++- 10 files changed, 111 insertions(+), 88 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/DoublePrefixOperatorCheck.java b/python-checks/src/main/java/org/sonar/python/checks/DoublePrefixOperatorCheck.java index 4a2fbd515..cabf38be9 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/DoublePrefixOperatorCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/DoublePrefixOperatorCheck.java @@ -23,7 +23,8 @@ import org.sonar.plugins.python.api.tree.ParenthesizedExpression; import org.sonar.plugins.python.api.tree.Tree; import org.sonar.plugins.python.api.tree.UnaryExpression; -import org.sonar.python.types.InferredTypes; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; @Rule(key = "S2761") @@ -31,6 +32,7 @@ public class DoublePrefixOperatorCheck extends PythonSubscriptionCheck { private static final String MESSAGE = "Use the \"%s\" operator just once or not at all."; private static final String MESSAGE_NOT = "Use the \"bool()\" builtin function instead of calling \"not\" twice."; + private static final TypeMatcher IS_INT = TypeMatchers.isObjectOfType("builtins.int"); @Override public void initialize(Context context) { @@ -52,7 +54,7 @@ private static void doubleInversionCheck(SubscriptionContext ctx, UnaryExpressio if (invertedExpr.is(Tree.Kind.NOT)) { ctx.addIssue(original, MESSAGE_NOT); } else { - if (((UnaryExpression) invertedExpr).expression().type() == InferredTypes.INT) { + if (IS_INT.isTrueFor(((UnaryExpression) invertedExpr).expression(), ctx)) { ctx.addIssue(original, String.format(MESSAGE, original.operator().value())); } } diff --git a/python-checks/src/main/java/org/sonar/python/checks/IdentityComparisonWithCachedTypesCheck.java b/python-checks/src/main/java/org/sonar/python/checks/IdentityComparisonWithCachedTypesCheck.java index 25633144a..3dbbc899a 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/IdentityComparisonWithCachedTypesCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/IdentityComparisonWithCachedTypesCheck.java @@ -29,9 +29,9 @@ import org.sonar.plugins.python.api.tree.IsExpression; import org.sonar.plugins.python.api.tree.Name; import org.sonar.plugins.python.api.tree.Tree; -import org.sonar.plugins.python.api.types.BuiltinTypes; import org.sonar.python.quickfix.TextEditUtils; import org.sonar.python.tree.TreeUtils; +import org.sonar.plugins.python.api.types.BuiltinTypes; import org.sonar.plugins.python.api.types.v2.PythonType; import org.sonar.python.types.v2.TypeCheckBuilder; import org.sonar.python.types.v2.TypeChecker; diff --git a/python-checks/src/main/java/org/sonar/python/checks/MandatoryFunctionReturnTypeHintCheck.java b/python-checks/src/main/java/org/sonar/python/checks/MandatoryFunctionReturnTypeHintCheck.java index 0b4d11880..590f30fa2 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/MandatoryFunctionReturnTypeHintCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/MandatoryFunctionReturnTypeHintCheck.java @@ -17,11 +17,10 @@ package org.sonar.python.checks; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; -import java.util.Objects; import java.util.Optional; import java.util.Set; -import java.util.stream.Collectors; import org.sonar.check.Rule; import org.sonar.plugins.python.api.PythonSubscriptionCheck; import org.sonar.plugins.python.api.SubscriptionContext; @@ -34,22 +33,23 @@ import org.sonar.plugins.python.api.tree.Tree; import org.sonar.plugins.python.api.tree.YieldStatement; import org.sonar.plugins.python.api.types.BuiltinTypes; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; import org.sonar.python.quickfix.TextEditUtils; import org.sonar.python.tree.FunctionDefImpl; -import org.sonar.python.types.InferredTypes; @Rule(key = "S6538") public class MandatoryFunctionReturnTypeHintCheck extends PythonSubscriptionCheck { public static final String MESSAGE = "Add a return type hint to this function declaration."; public static final String CONSTRUCTOR_MESSAGE = "Annotate the return type of this constructor with `None`."; - private static final List SUPPORTED_TYPES = List.of( - BuiltinTypes.STR, - BuiltinTypes.NONE_TYPE, - BuiltinTypes.BOOL, - BuiltinTypes.COMPLEX, - BuiltinTypes.FLOAT, - BuiltinTypes.INT); + private static final List SUPPORTED_TYPES = List.of( + new SupportedReturnType(TypeMatchers.isObjectOfType("builtins.str"), BuiltinTypes.STR), + new SupportedReturnType(TypeMatchers.isObjectOfType("NoneType"), "None"), + new SupportedReturnType(TypeMatchers.isObjectOfType("builtins.bool"), BuiltinTypes.BOOL), + new SupportedReturnType(TypeMatchers.isObjectOfType("builtins.complex"), BuiltinTypes.COMPLEX), + new SupportedReturnType(TypeMatchers.isObjectOfType("builtins.float"), BuiltinTypes.FLOAT), + new SupportedReturnType(TypeMatchers.isObjectOfType("builtins.int"), BuiltinTypes.INT)); @Override public void initialize(Context context) { @@ -78,7 +78,7 @@ private static void raiseIssueForReturnType(SubscriptionContext ctx, Name functi ReturnStatementVisitor returnStatementVisitor = new ReturnStatementVisitor(); functionDef.body().accept(returnStatementVisitor); if (!returnStatementVisitor.returnStatements.isEmpty()) { - addQuickFixForReturnType(issue, functionDef, returnStatementVisitor.returnStatements); + addQuickFixForReturnType(ctx, issue, functionDef, returnStatementVisitor.returnStatements); } else if (returnStatementVisitor.yieldStatements.isEmpty()) { addQuickFixForNoneType(issue, functionDef); } @@ -91,26 +91,39 @@ private static void addQuickFixForNoneType(PreciseIssue issue, FunctionDef funct issue.addQuickFix(quickFix); } - private static void addQuickFixForReturnType(PreciseIssue issue, FunctionDef functionDef, List statements) { - Set returnTypes = statements.stream() - .flatMap(stmts -> stmts.expressions().stream()) - .map(Expression::type) - .map(InferredTypes::typeName) - .filter(Objects::nonNull) - .collect(Collectors.toSet()); + private static void addQuickFixForReturnType(SubscriptionContext ctx, PreciseIssue issue, FunctionDef functionDef, List statements) { + Set returnTypes = collectSupportedReturnTypeAnnotations(statements, ctx); if (returnTypes.size() == 1) { - String typeName = returnTypes.stream().iterator().next(); - if (SUPPORTED_TYPES.contains(typeName)) { - PythonQuickFix quickFix = PythonQuickFix.newQuickFix(MandatoryFunctionReturnTypeHintCheck.MESSAGE) - .addTextEdit(TextEditUtils.insertAfter(functionDef.rightPar(), String.format(" -> %s", fixTypeName(typeName)))) - .build(); - issue.addQuickFix(quickFix); + String annotation = returnTypes.iterator().next(); + PythonQuickFix quickFix = PythonQuickFix.newQuickFix(MandatoryFunctionReturnTypeHintCheck.MESSAGE) + .addTextEdit(TextEditUtils.insertAfter(functionDef.rightPar(), String.format(" -> %s", annotation))) + .build(); + issue.addQuickFix(quickFix); + } + } + + private static Set collectSupportedReturnTypeAnnotations(List statements, SubscriptionContext ctx) { + Set returnTypes = new HashSet<>(); + for (ReturnStatement stmt : statements) { + for (Expression expression : stmt.expressions()) { + Optional annotation = supportedReturnTypeAnnotation(expression, ctx); + if (annotation.isEmpty()) { + return Set.of(); + } + returnTypes.add(annotation.get()); } } + return returnTypes; + } + + private static Optional supportedReturnTypeAnnotation(Expression expression, SubscriptionContext ctx) { + return SUPPORTED_TYPES.stream() + .filter(supportedType -> supportedType.matcher().isTrueFor(expression, ctx)) + .map(SupportedReturnType::annotation) + .findFirst(); } - private static String fixTypeName(String typeName) { - return typeName.equals(BuiltinTypes.NONE_TYPE) ? "None" : typeName; + private record SupportedReturnType(TypeMatcher matcher, String annotation) { } private static class ReturnStatementVisitor extends BaseTreeVisitor { diff --git a/python-checks/src/main/java/org/sonar/python/checks/PandasChainInstructionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/PandasChainInstructionCheck.java index 11d1fd8b4..c0ac31682 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/PandasChainInstructionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/PandasChainInstructionCheck.java @@ -19,21 +19,19 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.List; -import java.util.Objects; import java.util.Optional; import java.util.Set; import org.sonar.check.Rule; import org.sonar.plugins.python.api.PythonSubscriptionCheck; import org.sonar.plugins.python.api.SubscriptionContext; -import org.sonar.plugins.python.api.symbols.AmbiguousSymbol; -import org.sonar.plugins.python.api.symbols.FunctionSymbol; -import org.sonar.plugins.python.api.symbols.Symbol; import org.sonar.plugins.python.api.tree.CallExpression; import org.sonar.plugins.python.api.tree.QualifiedExpression; import org.sonar.plugins.python.api.tree.SubscriptionExpression; import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; import org.sonar.python.tree.TreeUtils; -import org.sonar.python.types.InferredTypes; +import org.sonar.python.types.v2.matchers.InternalTypeMatchers; @Rule(key = "S6742") public class PandasChainInstructionCheck extends PythonSubscriptionCheck { @@ -42,6 +40,10 @@ public class PandasChainInstructionCheck extends PythonSubscriptionCheck { private static final int MAX_CHAIN_LENGTH = 7; private static final String DATAFRAME_FQN = "pandas.core.frame.DataFrame"; + private static final TypeMatcher IS_DATAFRAME = TypeMatchers.isObjectOfType(DATAFRAME_FQN); + private static final TypeMatcher IS_OR_CONTAINS_DATAFRAME = TypeMatchers.any( + IS_DATAFRAME, + InternalTypeMatchers.isAnyTypeInUnionSatisfying(IS_DATAFRAME)); private final Set visited = new HashSet<>(); @@ -54,7 +56,7 @@ public void initialize(Context context) { private void checkChainedInstructions(SubscriptionContext ctx) { QualifiedExpression expr = (QualifiedExpression) ctx.syntaxNode(); List chain = visitQualifier(expr, new ArrayList<>()); - if (chain.size() >= MAX_CHAIN_LENGTH && isValidPandasCall(chain)) { + if (chain.size() >= MAX_CHAIN_LENGTH && isValidPandasCall(chain, ctx)) { ctx.addIssue(chain.iterator().next(), MESSAGE); } } @@ -94,44 +96,21 @@ private static Optional ignoreSubscriptionAndGetCallExpr(Subscri return Optional.empty(); } - private static boolean isValidPandasCall(List chain) { + private static boolean isValidPandasCall(List chain, SubscriptionContext ctx) { QualifiedExpression firstQualifiedExpression = chain.get(chain.size() - 1); - boolean isADataFrameMethodCall = Optional.ofNullable(firstQualifiedExpression.symbol()) - .map(Symbol::fullyQualifiedName) - .filter(fqn -> fqn.startsWith(DATAFRAME_FQN)) - .isPresent(); - - boolean isAFunctionReturningADataFrame = Optional.ofNullable(firstQualifiedExpression.symbol()) - .flatMap(PandasChainInstructionCheck::isReturnTypeADataFrame) - .orElse(false); + boolean isAFunctionReturningADataFrame = firstQualifiedExpression.parent() instanceof CallExpression callExpression + && callExpression.callee() == firstQualifiedExpression + && IS_OR_CONTAINS_DATAFRAME.isTrueFor(callExpression, ctx); + // We do not resolve "DataFrame.pipe" as pipe is a generic on NDFrame. + // As we get an unknown type on typeV2 we need to use the name instead boolean doesNotContainACallToPipe = chain.stream() - .map(QualifiedExpression::symbol) - .filter(Objects::nonNull) - .map(Symbol::fullyQualifiedName) - .filter(Objects::nonNull) - .noneMatch((DATAFRAME_FQN + ".pipe")::equals); - - boolean isADataFrame = DATAFRAME_FQN.equals(InferredTypes.fullyQualifiedTypeName(firstQualifiedExpression.qualifier().type())); + .noneMatch(qe -> "pipe".equals(qe.name().name())); - return (isADataFrameMethodCall || isAFunctionReturningADataFrame || isADataFrame) && doesNotContainACallToPipe; - } + boolean isADataFrame = IS_OR_CONTAINS_DATAFRAME.isTrueFor(firstQualifiedExpression.qualifier(), ctx); - private static Optional isReturnTypeADataFrame(Symbol symbol) { - return Optional.of(symbol) - .filter(s -> s.is(Symbol.Kind.AMBIGUOUS)) - .map(AmbiguousSymbol.class::cast) - .map(s -> s.alternatives().stream() - .filter(a -> a.is(Symbol.Kind.FUNCTION)) - .map(FunctionSymbol.class::cast) - .map(FunctionSymbol::annotatedReturnTypeName) - .anyMatch(DATAFRAME_FQN::equals)) - .or(() -> Optional.of(symbol) - .filter(s -> s.is(Symbol.Kind.FUNCTION)) - .map(FunctionSymbol.class::cast) - .map(FunctionSymbol::annotatedReturnTypeName) - .map(DATAFRAME_FQN::equals)); + return (isAFunctionReturningADataFrame || isADataFrame) && doesNotContainACallToPipe; } } diff --git a/python-checks/src/main/java/org/sonar/python/checks/SklearnCachedPipelineDontAccessTransformersCheck.java b/python-checks/src/main/java/org/sonar/python/checks/SklearnCachedPipelineDontAccessTransformersCheck.java index 57fb53da1..bfa1d8a37 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/SklearnCachedPipelineDontAccessTransformersCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/SklearnCachedPipelineDontAccessTransformersCheck.java @@ -26,7 +26,7 @@ import org.sonar.plugins.python.api.PythonSubscriptionCheck; import org.sonar.plugins.python.api.SubscriptionContext; import org.sonar.plugins.python.api.quickfix.PythonQuickFix; -import org.sonar.plugins.python.api.symbols.Symbol; +import org.sonar.plugins.python.api.symbols.v2.SymbolV2; import org.sonar.plugins.python.api.tree.CallExpression; import org.sonar.plugins.python.api.tree.Expression; import org.sonar.plugins.python.api.tree.ListLiteral; @@ -35,10 +35,12 @@ import org.sonar.plugins.python.api.tree.RegularArgument; import org.sonar.plugins.python.api.tree.StringLiteral; import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.UnknownType; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; import org.sonar.python.quickfix.TextEditUtils; import org.sonar.python.tree.TreeUtils; import org.sonar.python.tree.TupleImpl; -import org.sonar.python.types.InferredTypes; import static org.sonar.python.checks.utils.Expressions.getAssignedName; @@ -48,6 +50,8 @@ public class SklearnCachedPipelineDontAccessTransformersCheck extends PythonSubs public static final String MESSAGE = "Avoid accessing transformers in a cached pipeline."; public static final String MESSAGE_SECONDARY = "The transformer is accessed here"; public static final String MESSAGE_SECONDARY_CREATION = "The Pipeline is created here"; + private static final TypeMatcher IS_PIPELINE = TypeMatchers.isType("sklearn.pipeline.Pipeline"); + private static final TypeMatcher IS_MAKE_PIPELINE = TypeMatchers.isType("sklearn.pipeline.make_pipeline"); @Override public void initialize(Context context) { @@ -56,14 +60,16 @@ public void initialize(Context context) { private static void checkCallExpr(SubscriptionContext subscriptionContext) { CallExpression callExpression = (CallExpression) subscriptionContext.syntaxNode(); - Optional pipelineCreationOptional = isPipelineCreation(callExpression); + Optional pipelineCreationOptional = isPipelineCreation(callExpression, subscriptionContext); if (pipelineCreationOptional.isEmpty()) { return; } PipelineCreation pipelineCreation = pipelineCreationOptional.get(); var memoryArgument = TreeUtils.argumentByKeyword("memory", callExpression.arguments()); - if (memoryArgument == null || memoryArgument.expression().is(Tree.Kind.NONE) || memoryArgument.expression().type() == InferredTypes.anyType()) { + if (memoryArgument == null || + memoryArgument.expression().is(Tree.Kind.NONE) || + memoryArgument.expression().typeV2() instanceof UnknownType) { return; } var stepsArgument = TreeUtils.nthArgumentOrKeyword(0, "steps", callExpression.arguments()); @@ -149,7 +155,7 @@ private static Optional getQuickFix(Name pipelineBindingVariable } private static Map symbolIsUsedInQualifiedExpression(Name name) { - Symbol symbol = name.symbol(); + SymbolV2 symbol = name.symbolV2(); if (symbol == null) { return new HashMap<>(); } @@ -166,16 +172,13 @@ private enum PipelineCreation { MAKE_PIPELINE } - private static Optional isPipelineCreation(CallExpression callExpression) { - return Optional.ofNullable(callExpression.calleeSymbol()).map(Symbol::fullyQualifiedName) - .map(fqn -> { - if ("sklearn.pipeline.Pipeline".equals(fqn)) { - return PipelineCreation.PIPELINE; - } - if ("sklearn.pipeline.make_pipeline".equals(fqn)) { - return PipelineCreation.MAKE_PIPELINE; - } - return null; - }); + private static Optional isPipelineCreation(CallExpression callExpression, SubscriptionContext ctx) { + if (IS_PIPELINE.isTrueFor(callExpression.callee(), ctx)) { + return Optional.of(PipelineCreation.PIPELINE); + } + if (IS_MAKE_PIPELINE.isTrueFor(callExpression.callee(), ctx)) { + return Optional.of(PipelineCreation.MAKE_PIPELINE); + } + return Optional.empty(); } } diff --git a/python-checks/src/main/java/org/sonar/python/checks/SlotsAssignmentCheck.java b/python-checks/src/main/java/org/sonar/python/checks/SlotsAssignmentCheck.java index 9761beffd..ce22cfa90 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/SlotsAssignmentCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/SlotsAssignmentCheck.java @@ -28,7 +28,6 @@ import org.sonar.plugins.python.api.SubscriptionContext; import org.sonar.plugins.python.api.symbols.v2.SymbolV2; import org.sonar.plugins.python.api.symbols.v2.UsageV2; -import org.sonar.plugins.python.api.types.BuiltinTypes; import org.sonar.plugins.python.api.tree.AssignmentStatement; import org.sonar.plugins.python.api.tree.BaseTreeVisitor; import org.sonar.plugins.python.api.tree.ClassDef; @@ -48,6 +47,7 @@ import org.sonar.plugins.python.api.tree.StringLiteral; import org.sonar.plugins.python.api.tree.Tree; import org.sonar.plugins.python.api.tree.Tuple; +import org.sonar.plugins.python.api.types.BuiltinTypes; import org.sonar.plugins.python.api.types.v2.ClassType; import org.sonar.plugins.python.api.types.v2.FunctionType; import org.sonar.plugins.python.api.types.v2.PythonType; diff --git a/python-checks/src/test/java/org/sonar/python/checks/MandatoryFunctionReturnTypeHintCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/MandatoryFunctionReturnTypeHintCheckTest.java index b024e0212..0696e44af 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/MandatoryFunctionReturnTypeHintCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/MandatoryFunctionReturnTypeHintCheckTest.java @@ -242,6 +242,19 @@ void no_quick_fix_generic_types() { PythonQuickFixVerifier.verifyNoQuickFixes(check, codeWithIssue); } + @Test + void no_quick_fix_mixed_supported_and_unsupported_return_types() { + String codeWithIssue = code( + "class Foo:", + " pass", + "def foo(condition: bool):", + " if condition:", + " return 42", + " return Foo()"); + MandatoryFunctionReturnTypeHintCheck check = new MandatoryFunctionReturnTypeHintCheck(); + PythonQuickFixVerifier.verifyNoQuickFixes(check, codeWithIssue); + } + @Test void no_quick_fix_ambiguous_type() { String codeWithIssue = code( diff --git a/python-checks/src/test/resources/checks/doublePrefixOperator.py b/python-checks/src/test/resources/checks/doublePrefixOperator.py index bdf661862..75a47cb1a 100644 --- a/python-checks/src/test/resources/checks/doublePrefixOperator.py +++ b/python-checks/src/test/resources/checks/doublePrefixOperator.py @@ -7,7 +7,7 @@ def start(): # ^^^ d = not (not (not (not a))) # Noncompliant 3 - e = ~~~~~a # Noncompliant + e = ~~~~~a # Noncompliant 4 f = ~(((((~a))))) # Noncompliant {{Use the "~" operator just once or not at all.}} g = not (a == b) diff --git a/python-checks/src/test/resources/checks/pandasChainInstructionCheck.py b/python-checks/src/test/resources/checks/pandasChainInstructionCheck.py index f72d55a2a..4810fc132 100644 --- a/python-checks/src/test/resources/checks/pandasChainInstructionCheck.py +++ b/python-checks/src/test/resources/checks/pandasChainInstructionCheck.py @@ -8,7 +8,7 @@ def non_compliant(df: pd.DataFrame, df2: DataFrame): # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ DataFrame().set_index("name").filter(like='joe', axis=0).groupby("team")["salary"].add(10).mean().round().to_parquet() # Noncompliant {{Refactor this long chain of instructions with "pandas.pipe"}} # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - df.set_index("name").filter(like='joe', axis=0).groupby("team")["salary"].add(10).mean().round().to_parquet() # FN see SONARPY-1503 + df.set_index("name").filter(like='joe', axis=0).groupby("team")["salary"].add(10).mean().round().to_parquet() # Noncompliant {{Refactor this long chain of instructions with "pandas.pipe"}} df2.set_index("name").filter(like='joe', axis=0).groupby("team")["salary"]["test"].add(10).mean().round().to_parquet() # Noncompliant {{Refactor this long chain of instructions with "pandas.pipe"}} # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -38,4 +38,3 @@ def compliant(df: pd.DataFrame, my_function, something, df2: DataFrame): DataFrame().set_index("name").pipe(my_function).filter(like='joe', axis=0).groupby("team")["salary"].add(10).round().mean().to_json() something.set_index("name").filter(like='joe', axis=0).groupby("team")["salary"].add(10).round().mean().to_parquet() - diff --git a/python-checks/src/test/resources/checks/sklearn_cached_pipeline_dont_access_transformers.py b/python-checks/src/test/resources/checks/sklearn_cached_pipeline_dont_access_transformers.py index 84e8dd0ae..183de0c65 100644 --- a/python-checks/src/test/resources/checks/sklearn_cached_pipeline_dont_access_transformers.py +++ b/python-checks/src/test/resources/checks/sklearn_cached_pipeline_dont_access_transformers.py @@ -4,6 +4,7 @@ from sklearn.pipeline import Pipeline, make_pipeline from sklearn.preprocessing import PolynomialFeatures from sklearn.decomposition import FastICA +from sklearn.some_import import cache def case1(): @@ -82,7 +83,7 @@ def case5(): pca3 = PCA() pipel = Pipeline([(clever_generator())]) -def case5(): +def case6(): from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from sklearn.decomposition import PCA @@ -96,3 +97,16 @@ class SomeKindOfRecord(): obj.pipeline = Pipeline([('scaler', scaler), ('pca', pca)], memory="cache") # Noncompliant scaler.szsdgf_ = 12 + + +def unknown_cache_import(): + diabetes = load_diabetes() + scaler = RobustScaler() + knn = KNeighborsRegressor(n_neighbors=5) + + pipeline = Pipeline([ + ('scaler', scaler), + ('knn', knn) + ], memory=cache) # Cannot resolve cache + + print(scaler.center_) From ac96e16fd080fa2ef515baaae4285d4bf59fabae Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Mon, 11 May 2026 17:01:01 +0200 Subject: [PATCH 120/322] Fixing flaky test when Typshed builtins are poisoned with an incomplete Python Version Set (#1111) GitOrigin-RevId: 28935d3d2f89344d3d68d5064fc21343e8a6d639 --- .../CompressionModulesFromNamespaceCheckTest.java | 8 ++++++++ .../python/checks/FStringNestingLevelCheckTest.java | 8 ++++++++ .../checks/GenericClassTypeParameterCheckTest.java | 9 +++++++++ .../GenericFunctionTypeParameterCheckTest.java | 8 ++++++++ .../python/checks/GenericTypeStatementCheckTest.java | 8 ++++++++ .../NotImplementedBooleanContextCheckTest.java | 8 ++++++++ .../org/sonar/python/checks/PytzUsageCheckTest.java | 9 +++++++++ .../checks/TemplateAndStrConcatenationCheckTest.java | 9 ++++++++- ...lateStringStructuralPatternMatchingCheckTest.java | 8 ++++++++ .../python/checks/TypeAliasAnnotationCheckTest.java | 8 ++++++++ .../python/checks/UnionTypeExpressionCheckTest.java | 2 ++ .../checks/UnprocessedTemplateStringCheckTest.java | 8 ++++++++ .../python/checks/UselessParenthesisCheckTest.java | 10 +++++++++- .../python/checks/WeakSSLProtocolCheckTest.java | 2 ++ .../java/org/sonar/python/types/TypeShedTest.java | 12 ++++++++++++ 15 files changed, 115 insertions(+), 2 deletions(-) diff --git a/python-checks/src/test/java/org/sonar/python/checks/CompressionModulesFromNamespaceCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/CompressionModulesFromNamespaceCheckTest.java index ac658321f..3ef9a8a66 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/CompressionModulesFromNamespaceCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/CompressionModulesFromNamespaceCheckTest.java @@ -17,15 +17,23 @@ package org.sonar.python.checks; import java.util.EnumSet; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import org.sonar.plugins.python.api.ProjectPythonVersion; import org.sonar.plugins.python.api.PythonVersionUtils; import org.sonar.python.checks.utils.PythonCheckVerifier; +import org.sonar.python.types.TypeShed; import static org.assertj.core.api.Assertions.assertThat; class CompressionModulesFromNamespaceCheckTest { + @AfterEach + void reset_python_version() { + ProjectPythonVersion.setCurrentVersions(PythonVersionUtils.allVersions()); + TypeShed.resetBuiltinSymbols(); + } + @Test void test() { ProjectPythonVersion.setCurrentVersions(EnumSet.of(PythonVersionUtils.Version.V_314)); diff --git a/python-checks/src/test/java/org/sonar/python/checks/FStringNestingLevelCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/FStringNestingLevelCheckTest.java index c8637bc44..dc50192d5 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/FStringNestingLevelCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/FStringNestingLevelCheckTest.java @@ -20,13 +20,21 @@ import java.util.EnumSet; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import org.sonar.plugins.python.api.ProjectPythonVersion; import org.sonar.plugins.python.api.PythonVersionUtils; import org.sonar.python.checks.utils.PythonCheckVerifier; +import org.sonar.python.types.TypeShed; class FStringNestingLevelCheckTest { + @AfterEach + void reset_python_version() { + ProjectPythonVersion.setCurrentVersions(PythonVersionUtils.allVersions()); + TypeShed.resetBuiltinSymbols(); + } + @Test void test_1() { ProjectPythonVersion.setCurrentVersions(EnumSet.of(PythonVersionUtils.Version.V_312)); diff --git a/python-checks/src/test/java/org/sonar/python/checks/GenericClassTypeParameterCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/GenericClassTypeParameterCheckTest.java index 12b88fe42..da1f87c87 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/GenericClassTypeParameterCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/GenericClassTypeParameterCheckTest.java @@ -17,14 +17,23 @@ package org.sonar.python.checks; import java.util.EnumSet; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import org.sonar.plugins.python.api.ProjectPythonVersion; import org.sonar.plugins.python.api.PythonVersionUtils; import org.sonar.python.checks.utils.PythonCheckVerifier; +import org.sonar.python.types.TypeShed; import static org.assertj.core.api.Assertions.assertThat; class GenericClassTypeParameterCheckTest { + + @AfterEach + void reset_python_version() { + ProjectPythonVersion.setCurrentVersions(PythonVersionUtils.allVersions()); + TypeShed.resetBuiltinSymbols(); + } + @Test void test_python_3_12_only() { ProjectPythonVersion.setCurrentVersions(EnumSet.of(PythonVersionUtils.Version.V_312)); diff --git a/python-checks/src/test/java/org/sonar/python/checks/GenericFunctionTypeParameterCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/GenericFunctionTypeParameterCheckTest.java index a8dbb4a3d..197d4ae47 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/GenericFunctionTypeParameterCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/GenericFunctionTypeParameterCheckTest.java @@ -17,15 +17,23 @@ package org.sonar.python.checks; import java.util.EnumSet; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import org.sonar.plugins.python.api.ProjectPythonVersion; import org.sonar.plugins.python.api.PythonVersionUtils; import org.sonar.python.checks.utils.PythonCheckVerifier; +import org.sonar.python.types.TypeShed; import static org.assertj.core.api.Assertions.assertThat; class GenericFunctionTypeParameterCheckTest { + @AfterEach + void reset_python_version() { + ProjectPythonVersion.setCurrentVersions(PythonVersionUtils.allVersions()); + TypeShed.resetBuiltinSymbols(); + } + @Test void test_1() { ProjectPythonVersion.setCurrentVersions(EnumSet.of(PythonVersionUtils.Version.V_312)); diff --git a/python-checks/src/test/java/org/sonar/python/checks/GenericTypeStatementCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/GenericTypeStatementCheckTest.java index 1358cc340..031f2cf35 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/GenericTypeStatementCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/GenericTypeStatementCheckTest.java @@ -17,10 +17,12 @@ package org.sonar.python.checks; import java.util.EnumSet; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import org.sonar.plugins.python.api.ProjectPythonVersion; import org.sonar.plugins.python.api.PythonVersionUtils; import org.sonar.python.checks.utils.PythonCheckVerifier; +import org.sonar.python.types.TypeShed; import static org.assertj.core.api.Assertions.assertThat; @@ -28,6 +30,12 @@ class GenericTypeStatementCheckTest { private static final GenericTypeStatementCheck check = new GenericTypeStatementCheck(); + @AfterEach + void reset_python_version() { + ProjectPythonVersion.setCurrentVersions(PythonVersionUtils.allVersions()); + TypeShed.resetBuiltinSymbols(); + } + @Test void test_1() { ProjectPythonVersion.setCurrentVersions(EnumSet.of(PythonVersionUtils.Version.V_312)); diff --git a/python-checks/src/test/java/org/sonar/python/checks/NotImplementedBooleanContextCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/NotImplementedBooleanContextCheckTest.java index 9fac89c90..b093f3611 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/NotImplementedBooleanContextCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/NotImplementedBooleanContextCheckTest.java @@ -17,15 +17,23 @@ package org.sonar.python.checks; import java.util.EnumSet; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import org.sonar.plugins.python.api.ProjectPythonVersion; import org.sonar.plugins.python.api.PythonVersionUtils; import org.sonar.python.checks.utils.PythonCheckVerifier; +import org.sonar.python.types.TypeShed; import static org.assertj.core.api.Assertions.assertThat; class NotImplementedBooleanContextCheckTest { + @AfterEach + void reset_python_version() { + ProjectPythonVersion.setCurrentVersions(PythonVersionUtils.allVersions()); + TypeShed.resetBuiltinSymbols(); + } + @Test void test() { ProjectPythonVersion.setCurrentVersions(EnumSet.of(PythonVersionUtils.Version.V_314)); diff --git a/python-checks/src/test/java/org/sonar/python/checks/PytzUsageCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/PytzUsageCheckTest.java index 2adffedaf..6aa1c9e5c 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/PytzUsageCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/PytzUsageCheckTest.java @@ -17,12 +17,21 @@ package org.sonar.python.checks; import java.util.EnumSet; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import org.sonar.plugins.python.api.ProjectPythonVersion; import org.sonar.plugins.python.api.PythonVersionUtils; import org.sonar.python.checks.utils.PythonCheckVerifier; +import org.sonar.python.types.TypeShed; class PytzUsageCheckTest { + + @AfterEach + void reset_python_version() { + ProjectPythonVersion.setCurrentVersions(PythonVersionUtils.allVersions()); + TypeShed.resetBuiltinSymbols(); + } + @Test void test_39_310_311_312() { ProjectPythonVersion diff --git a/python-checks/src/test/java/org/sonar/python/checks/TemplateAndStrConcatenationCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/TemplateAndStrConcatenationCheckTest.java index e234cd8a5..52f86348f 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/TemplateAndStrConcatenationCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/TemplateAndStrConcatenationCheckTest.java @@ -17,15 +17,23 @@ package org.sonar.python.checks; import java.util.EnumSet; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import org.sonar.plugins.python.api.ProjectPythonVersion; import org.sonar.plugins.python.api.PythonVersionUtils; import org.sonar.python.checks.utils.PythonCheckVerifier; +import org.sonar.python.types.TypeShed; import static org.assertj.core.api.Assertions.assertThat; class TemplateAndStrConcatenationCheckTest { + @AfterEach + void reset_python_version() { + ProjectPythonVersion.setCurrentVersions(PythonVersionUtils.allVersions()); + TypeShed.resetBuiltinSymbols(); + } + @Test void test() { ProjectPythonVersion.setCurrentVersions(EnumSet.of(PythonVersionUtils.Version.V_314)); @@ -39,4 +47,3 @@ void test_older_python_version() { assertThat(issues).isEmpty(); } } - diff --git a/python-checks/src/test/java/org/sonar/python/checks/TemplateStringStructuralPatternMatchingCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/TemplateStringStructuralPatternMatchingCheckTest.java index 30156efd6..837e5c90c 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/TemplateStringStructuralPatternMatchingCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/TemplateStringStructuralPatternMatchingCheckTest.java @@ -17,15 +17,23 @@ package org.sonar.python.checks; import java.util.EnumSet; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import org.sonar.plugins.python.api.ProjectPythonVersion; import org.sonar.plugins.python.api.PythonVersionUtils; import org.sonar.python.checks.utils.PythonCheckVerifier; +import org.sonar.python.types.TypeShed; import static org.assertj.core.api.Assertions.assertThat; class TemplateStringStructuralPatternMatchingCheckTest { + @AfterEach + void reset_python_version() { + ProjectPythonVersion.setCurrentVersions(PythonVersionUtils.allVersions()); + TypeShed.resetBuiltinSymbols(); + } + @Test void test() { ProjectPythonVersion.setCurrentVersions(EnumSet.of(PythonVersionUtils.Version.V_314)); diff --git a/python-checks/src/test/java/org/sonar/python/checks/TypeAliasAnnotationCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/TypeAliasAnnotationCheckTest.java index 911b75d85..0359bf535 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/TypeAliasAnnotationCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/TypeAliasAnnotationCheckTest.java @@ -17,15 +17,23 @@ package org.sonar.python.checks; import java.util.EnumSet; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import org.sonar.plugins.python.api.ProjectPythonVersion; import org.sonar.plugins.python.api.PythonVersionUtils; import org.sonar.python.checks.utils.PythonCheckVerifier; +import org.sonar.python.types.TypeShed; import static org.assertj.core.api.Assertions.assertThat; class TypeAliasAnnotationCheckTest { + @AfterEach + void reset_python_version() { + ProjectPythonVersion.setCurrentVersions(PythonVersionUtils.allVersions()); + TypeShed.resetBuiltinSymbols(); + } + @Test void verify_python_312_issues() { ProjectPythonVersion.setCurrentVersions(EnumSet.of(PythonVersionUtils.Version.V_312)); diff --git a/python-checks/src/test/java/org/sonar/python/checks/UnionTypeExpressionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/UnionTypeExpressionCheckTest.java index 0562c2a5c..ebd477f68 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/UnionTypeExpressionCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/UnionTypeExpressionCheckTest.java @@ -22,6 +22,7 @@ import org.sonar.plugins.python.api.ProjectPythonVersion; import org.sonar.plugins.python.api.PythonVersionUtils; import org.sonar.python.checks.utils.PythonCheckVerifier; +import org.sonar.python.types.TypeShed; import static org.assertj.core.api.Assertions.assertThat; @@ -30,6 +31,7 @@ class UnionTypeExpressionCheckTest { @AfterEach void reset_python_version() { ProjectPythonVersion.setCurrentVersions(PythonVersionUtils.allVersions()); + TypeShed.resetBuiltinSymbols(); } @Test diff --git a/python-checks/src/test/java/org/sonar/python/checks/UnprocessedTemplateStringCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/UnprocessedTemplateStringCheckTest.java index cf36f7f7b..73b341cd6 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/UnprocessedTemplateStringCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/UnprocessedTemplateStringCheckTest.java @@ -17,15 +17,23 @@ package org.sonar.python.checks; import java.util.EnumSet; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import org.sonar.plugins.python.api.ProjectPythonVersion; import org.sonar.plugins.python.api.PythonVersionUtils; import org.sonar.python.checks.utils.PythonCheckVerifier; +import org.sonar.python.types.TypeShed; import static org.assertj.core.api.Assertions.assertThat; class UnprocessedTemplateStringCheckTest { + @AfterEach + void reset_python_version() { + ProjectPythonVersion.setCurrentVersions(PythonVersionUtils.allVersions()); + TypeShed.resetBuiltinSymbols(); + } + @Test void test() { ProjectPythonVersion.setCurrentVersions(EnumSet.of(PythonVersionUtils.Version.V_314)); diff --git a/python-checks/src/test/java/org/sonar/python/checks/UselessParenthesisCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/UselessParenthesisCheckTest.java index 48c61ef03..2af45ba06 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/UselessParenthesisCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/UselessParenthesisCheckTest.java @@ -17,16 +17,24 @@ package org.sonar.python.checks; import java.util.EnumSet; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import org.sonar.plugins.python.api.ProjectPythonVersion; -import org.sonar.python.checks.quickfix.PythonQuickFixVerifier; import org.sonar.plugins.python.api.PythonVersionUtils; +import org.sonar.python.checks.quickfix.PythonQuickFixVerifier; import org.sonar.python.checks.utils.PythonCheckVerifier; +import org.sonar.python.types.TypeShed; import static org.junit.Assert.assertEquals; class UselessParenthesisCheckTest { + @AfterEach + void reset_python_version() { + ProjectPythonVersion.setCurrentVersions(PythonVersionUtils.allVersions()); + TypeShed.resetBuiltinSymbols(); + } + @Test void test() { ProjectPythonVersion.setCurrentVersions(EnumSet.of(PythonVersionUtils.Version.V_314)); diff --git a/python-checks/src/test/java/org/sonar/python/checks/WeakSSLProtocolCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/WeakSSLProtocolCheckTest.java index 1ecc47afa..f557f0089 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/WeakSSLProtocolCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/WeakSSLProtocolCheckTest.java @@ -22,12 +22,14 @@ import org.sonar.plugins.python.api.ProjectPythonVersion; import org.sonar.plugins.python.api.PythonVersionUtils; import org.sonar.python.checks.utils.PythonCheckVerifier; +import org.sonar.python.types.TypeShed; class WeakSSLProtocolCheckTest { @AfterEach void reset_python_version() { ProjectPythonVersion.setCurrentVersions(PythonVersionUtils.allVersions()); + TypeShed.resetBuiltinSymbols(); } @Test diff --git a/python-frontend/src/test/java/org/sonar/python/types/TypeShedTest.java b/python-frontend/src/test/java/org/sonar/python/types/TypeShedTest.java index edcfd7507..8cbde5be2 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/TypeShedTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/TypeShedTest.java @@ -615,4 +615,16 @@ void customDbStubs() { var pymysql = symbolsForModule("pymysql"); assertThat(pymysql.get("connect")).isInstanceOf(FunctionSymbol.class); } + + @Test + void resets_typeshed_after_python_version_change() { + setPythonVersions(Set.of(PythonVersionUtils.Version.V_310)); + + assertThat(TypeShed.typeShedClass("object").canHaveMember("__getstate__")).isFalse(); + + setPythonVersions(PythonVersionUtils.allVersions()); + + assertThat(TypeShed.typeShedClass("object").canHaveMember("__getstate__")).isTrue(); + } + } From c5b9982c6c9488097b5a94aa791f7e5a6a9aca3e Mon Sep 17 00:00:00 2001 From: Guillaume Dequenne Date: Wed, 13 May 2026 09:35:30 +0200 Subject: [PATCH 121/322] Fix ITs plugin location and update telemetry comments Fix the relative path for python-custom-rules-example in PluginLocator, and update the telemetry-disable comment to reflect the real reason (avoiding external network calls) rather than a transient ticket reference. GitOrigin-RevId: 3dcb75ee2bf81673c414af4cb7e9ee8284ff6eea --- .../src/test/java/com/sonar/python/it/PluginLocator.java | 2 +- its/commons/src/test/java/com/sonar/python/it/TestsUtils.java | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/its/commons/src/test/java/com/sonar/python/it/PluginLocator.java b/its/commons/src/test/java/com/sonar/python/it/PluginLocator.java index a96a1e061..cf391e79a 100644 --- a/its/commons/src/test/java/com/sonar/python/it/PluginLocator.java +++ b/its/commons/src/test/java/com/sonar/python/it/PluginLocator.java @@ -33,7 +33,7 @@ public enum Plugins { new LocalPlugin("../python-custom-rules-plugin/target", "python-custom-rules-plugin-*.jar"), new LocalPlugin("../../../its/plugin/python-custom-rules-plugin/target", "python-custom-rules-plugin-*.jar")), PYTHON_CUSTOM_RULES_EXAMPLE( - new LocalPlugin("../../docs/python-custom-rules-example/target", "python-custom-rules-example-*.jar"), + new LocalPlugin("../../../docs/python-custom-rules-example/target", "python-custom-rules-example-*.jar"), new LocalPlugin("../../../docs/python-custom-rules-example/target", "python-custom-rules-example-*.jar")); private final LocalPlugin ossPlugin; diff --git a/its/commons/src/test/java/com/sonar/python/it/TestsUtils.java b/its/commons/src/test/java/com/sonar/python/it/TestsUtils.java index edf343c2e..8fb3222de 100644 --- a/its/commons/src/test/java/com/sonar/python/it/TestsUtils.java +++ b/its/commons/src/test/java/com/sonar/python/it/TestsUtils.java @@ -57,10 +57,8 @@ private static ConcurrentOrchestratorExtension.ConcurrentOrchestratorExtensionBu var builder = ConcurrentOrchestratorExtension.builderEnv() .useDefaultAdminCredentialsForBuilds(true) .setSonarVersion(System.getProperty(SQ_VERSION_PROPERTY, DEFAULT_SQ_VERSION)) - // Disable telemetry waiting for ORCH-497 + // Disable telemetry to avoid external network calls during tests .setServerProperty("sonar.telemetry.enable", "false") - - // Custom rules plugin .addPlugin(Plugins.PYTHON_CUSTOM_RULES.get(isEnterprise)) .addPlugin(Plugins.PYTHON_CUSTOM_RULES_EXAMPLE.get(isEnterprise)) .restoreProfileAtStartup(FileLocation.of("profiles/profile-python-custom-rules-example.xml")) From 00a008f54ee56fe7bb7c17a8225f465208aefca3 Mon Sep 17 00:00:00 2001 From: Guillaume Dequenne Date: Wed, 13 May 2026 09:35:44 +0200 Subject: [PATCH 122/322] SONARPY-4018 Silence main-scope issues on test files when sonar.tests is not set Introduce TestFileClassifier to heuristically identify test files based on naming conventions when sonar.tests is not configured. PythonScanner now resolves an effective file type for rules so that issues raised by test-specific rules (e.g. S2699) are silenced on main-scope files that look like tests. Update IT orchestrator and ruling tests to cover the new behaviour. GitOrigin-RevId: 750d41a38353850d9b10e5b369eadbda66c8482e --- .../projects/test_code/main_src/.gitkeep | 0 .../sonar/python/it/plugin/TestRulesTest.java | 92 ++++++++- .../org/sonar/plugins/python/IPynbSensor.java | 5 +- .../sonar/plugins/python/PythonScanner.java | 74 ++++++- .../sonar/plugins/python/PythonSensor.java | 2 +- .../plugins/python/TestFileClassifier.java | 177 +++++++++++++++++ .../sonar/plugins/python/caching/Caching.java | 43 ++++ .../plugins/python/indexer/PythonIndexer.java | 8 + .../indexer/SonarQubePythonIndexer.java | 19 +- .../plugins/python/PythonSensorTest.java | 186 +++++++++++++++++- .../python/TestFileClassifierTest.java | 167 ++++++++++++++++ .../plugins/python/caching/CachingTest.java | 78 ++++++++ .../indexer/SonarQubePythonIndexerTest.java | 2 + .../python/sensor/helper_with_tests.py | 5 + .../sonar/plugins/python/sensor/test_file.py | 4 +- .../plugins/python/sensor/tests/test_file.py | 5 + 16 files changed, 845 insertions(+), 22 deletions(-) create mode 100644 its/plugin/it-python-plugin-test/projects/test_code/main_src/.gitkeep create mode 100644 python-commons/src/main/java/org/sonar/plugins/python/TestFileClassifier.java create mode 100644 python-commons/src/test/java/org/sonar/plugins/python/TestFileClassifierTest.java create mode 100644 python-commons/src/test/resources/org/sonar/plugins/python/sensor/helper_with_tests.py create mode 100644 python-commons/src/test/resources/org/sonar/plugins/python/sensor/tests/test_file.py diff --git a/its/plugin/it-python-plugin-test/projects/test_code/main_src/.gitkeep b/its/plugin/it-python-plugin-test/projects/test_code/main_src/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/TestRulesTest.java b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/TestRulesTest.java index 18781d664..e81a573ba 100644 --- a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/TestRulesTest.java +++ b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/TestRulesTest.java @@ -20,7 +20,9 @@ import com.sonar.python.it.ConcurrentOrchestratorExtension; import com.sonar.python.it.TestsUtils; import java.io.File; +import java.util.Comparator; import java.util.List; +import java.util.stream.Collectors; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -38,13 +40,14 @@ public class TestRulesTest { private static final String PROJECT_KEY = "test-rules"; private static final String PROJECT_NAME = "Test Rules"; - private static SonarScanner BUILD; - @BeforeAll static void prepare() { orchestrator.getServer().provisionProject(PROJECT_KEY, PROJECT_NAME); orchestrator.getServer().associateProjectToQualityProfile(PROJECT_KEY, "py", "python-test-rules-profile"); - BUILD = orchestrator.createSonarScanner() + } + + private SonarScanner newBuild() { + return orchestrator.createSonarScanner() .setProjectDir(new File("projects/test_code")) .setProjectKey(PROJECT_KEY) .setProjectName(PROJECT_NAME) @@ -53,9 +56,9 @@ static void prepare() { @Test void test_rules_run_on_test_files() { - BUILD.setSourceDirs("src") - .setTestDirs("tests"); - orchestrator.executeBuild(BUILD); + orchestrator.executeBuild(newBuild() + .setSourceDirs("src") + .setTestDirs("tests")); List assertOnTupleIssues = issues("python:S5905"); List dedicatedAssertionIssues = issues("python:S5906"); @@ -70,9 +73,12 @@ void test_rules_run_on_test_files() { } @Test - void declare_all_files_as_test_files() { - BUILD.setTestDirs("."); - orchestrator.executeBuild(BUILD); + void main_rules_suppressed_when_all_files_declared_as_test() { + // main_src/ is an empty placeholder so sonar.sources points to a valid path with no Python files. + // All actual Python files are under sonar.tests=src,tests → classified as TEST → S3923 (MAIN-scoped) fires nowhere. + orchestrator.executeBuild(newBuild() + .setSourceDirs("main_src") + .setTestDirs("src,tests")); List testRuleIssues = issues("python:S5905"); List mainRuleIssues = issues("python:S3923"); @@ -81,6 +87,69 @@ void declare_all_files_as_test_files() { assertThat(mainRuleIssues).isEmpty(); } + @Test + void auto_detect_test_files_when_sonar_tests_not_configured() { + // When sonar.tests is not set, all files get InputFile.Type.MAIN from the platform. + // The plugin's path-based heuristic detects files in the `tests/` directory and + // suppresses MAIN-scoped rules on them, while CheckScope.ALL and TEST-scoped rules still fire. + orchestrator.executeBuild(newBuild() + .setProperty("sonar.sources", "src,tests")); // all files are MAIN — no sonar.tests configured + + List mainRuleIssues = issues("python:S3923"); + List allFilesRuleIssues = issues("python:S5905"); + List testScopedRuleIssues = issues("python:S5906"); + + // S3923 (MAIN-scoped): fires only on src/some_code.py; heuristic silences it on tests/ + assertThat(mainRuleIssues).hasSize(1); + assertIssue(mainRuleIssues.get(0), 3, + "Remove this if statement or edit its code blocks so that they're not all the same.", + "test-rules:src/some_code.py"); + + // S5905 (CheckScope.ALL): fires on both files regardless of effective type + assertThat(allFilesRuleIssues).hasSize(2); + assertIssue(allFilesRuleIssues.get(0), 2, + "Fix this assertion on a tuple literal.", "test-rules:src/some_code.py"); + assertIssue(allFilesRuleIssues.get(1), 3, + "Fix this assertion on a tuple literal.", "test-rules:tests/test_my_code.py"); + + // S5906 (TEST-scoped): fires on heuristic-detected test file + assertThat(testScopedRuleIssues).hasSize(1); + assertIssue(testScopedRuleIssues.get(0), 14, + "Consider using \"assertEqual\" instead.", "test-rules:tests/test_my_code.py"); + } + + @Test + void sonar_tests_configured_bypasses_heuristic() { + // When sonar.tests is explicitly configured, the path-based heuristic is inactive. + // Platform typing governs: files under tests/ are TEST because sonar.tests=tests. + // Setting sonar.tests is the recommended approach — it gives explicit, predictable + // control and produces the same isolation as the heuristic. + orchestrator.executeBuild(newBuild() + .setProperty("sonar.sources", "src") + .setProperty("sonar.tests", "tests")); + + List mainRuleIssues = issues("python:S3923"); + List allFilesRuleIssues = issues("python:S5905"); + List testScopedRuleIssues = issues("python:S5906"); + + // S3923 (MAIN-scoped): tests/ files are TEST by platform typing — same suppression as heuristic + assertThat(mainRuleIssues).hasSize(1); + assertIssue(mainRuleIssues.get(0), 3, + "Remove this if statement or edit its code blocks so that they're not all the same.", + "test-rules:src/some_code.py"); + + assertThat(allFilesRuleIssues).hasSize(2); + assertIssue(allFilesRuleIssues.get(0), 2, + "Fix this assertion on a tuple literal.", "test-rules:src/some_code.py"); + assertIssue(allFilesRuleIssues.get(1), 3, + "Fix this assertion on a tuple literal.", "test-rules:tests/test_my_code.py"); + + // S5906 (TEST-scoped): fires on the explicit test file + assertThat(testScopedRuleIssues).hasSize(1); + assertIssue(testScopedRuleIssues.get(0), 14, + "Consider using \"assertEqual\" instead.", "test-rules:tests/test_my_code.py"); + } + private void assertIssue(Issues.Issue issue, int expectedLine, String expectedMessage, String expectedComponent) { assertThat(issue.getLine()).isEqualTo(expectedLine); assertThat(issue.getMessage()).isEqualTo(expectedMessage); @@ -88,6 +157,9 @@ private void assertIssue(Issues.Issue issue, int expectedLine, String expectedMe } private static List issues(String rulekey) { - return newWsClient().issues().search(new SearchRequest().setRules(singletonList(rulekey))).getIssuesList(); + return newWsClient().issues().search(new SearchRequest().setRules(singletonList(rulekey))).getIssuesList() + .stream() + .sorted(Comparator.comparing(Issues.Issue::getComponent).thenComparingInt(Issues.Issue::getLine)) + .collect(Collectors.toList()); } } diff --git a/python-commons/src/main/java/org/sonar/plugins/python/IPynbSensor.java b/python-commons/src/main/java/org/sonar/plugins/python/IPynbSensor.java index c8b9e97f3..d57f8e748 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/IPynbSensor.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/IPynbSensor.java @@ -42,6 +42,7 @@ import org.sonar.plugins.python.indexer.SonarQubePythonIndexer; import org.sonar.plugins.python.nosonar.NoSonarLineInfoCollector; import org.sonar.plugins.python.telemetry.SensorTelemetryStorage; +import org.sonar.plugins.python.warnings.AnalysisWarningsWrapper; import org.sonar.plugins.python.telemetry.TelemetryMetricKey; import org.sonar.python.caching.CacheContextImpl; import org.sonar.python.parser.PythonParser; @@ -119,7 +120,7 @@ public void execute(SensorContext context) { } if (isInSonarLintRuntime(context)) { PythonScanner scanner = new PythonScanner(context, checks, fileLinesContextFactory, noSonarFilter, PythonParser::createIPythonParser, - indexer, new DummyArchitectureCallback(), noSonarLineInfoCollector); + indexer, new DummyArchitectureCallback(), noSonarLineInfoCollector, new AnalysisWarningsWrapper()); scanner.execute(pythonFiles, context); } else { processNotebooksFiles(pythonFiles, context); @@ -139,7 +140,7 @@ private void processNotebooksFiles(List pythonFiles, SensorCont CacheContext cacheContext = CacheContextImpl.dummyCache(); PythonIndexer pythonIndexer = new SonarQubePythonIndexer(pythonFiles, cacheContext, context, projectConfigurationBuilder); PythonScanner scanner = new PythonScanner(context, checks, fileLinesContextFactory, noSonarFilter, PythonParser::createIPythonParser, - pythonIndexer, new DummyArchitectureCallback(), noSonarLineInfoCollector); + pythonIndexer, new DummyArchitectureCallback(), noSonarLineInfoCollector, new AnalysisWarningsWrapper()); scanner.execute(pythonFiles, context); sensorTelemetryStorage.updateMetric(TelemetryMetricKey.NOTEBOOK_RECOGNITION_ERROR_KEY, scanner.getRecognitionErrorCount()); updateDatabricksTelemetry(scanner); diff --git a/python-commons/src/main/java/org/sonar/plugins/python/PythonScanner.java b/python-commons/src/main/java/org/sonar/plugins/python/PythonScanner.java index d7e302373..6915aa24c 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/PythonScanner.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/PythonScanner.java @@ -19,6 +19,7 @@ import com.sonar.sslr.api.AstNode; import com.sonar.sslr.api.RecognitionException; import java.io.File; +import javax.annotation.Nullable; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; @@ -56,6 +57,7 @@ import org.sonar.plugins.python.telemetry.collectors.TestFileTelemetryCollector; import org.sonar.plugins.python.telemetry.collectors.TypeInferenceTelemetry; import org.sonar.plugins.python.telemetry.collectors.TypeInferenceTelemetryCollector; +import org.sonar.plugins.python.warnings.AnalysisWarningsWrapper; import org.sonar.python.IPythonLocation; import org.sonar.python.SubscriptionVisitor; import org.sonar.python.parser.PythonParser; @@ -85,15 +87,24 @@ public class PythonScanner extends Scanner { private final Lock lock; private final TypeInferenceTelemetryCollector typeInferenceTelemetryCollector; private final TestFileTelemetryCollector testFileTelemetryCollector; + private final boolean testSourcesConfigured; + private final AnalysisWarningsWrapper analysisWarnings; + private final AtomicBoolean heuristicWarningEmitted = new AtomicBoolean(false); + static final String UNSET_SONAR_TESTS_WARNING = "SonarPython detected files that look like test code " + + "but 'sonar.tests' is not configured. Rules targeting production code were not executed on these files. " + + "Configure 'sonar.tests' in your project properties for a more accurate analysis."; public PythonScanner( SensorContext context, PythonChecks checks, FileLinesContextFactory fileLinesContextFactory, NoSonarFilter noSonarFilter, - Supplier parserSupplier, PythonIndexer indexer, PythonFileConsumer architectureCallback, NoSonarLineInfoCollector noSonarLineInfoCollector) { + Supplier parserSupplier, PythonIndexer indexer, PythonFileConsumer architectureCallback, + NoSonarLineInfoCollector noSonarLineInfoCollector, AnalysisWarningsWrapper analysisWarnings) { super(context); this.checks = checks; this.parserSupplier = parserSupplier; this.indexer = indexer; this.noSonarLineInfoCollector = noSonarLineInfoCollector; + this.analysisWarnings = analysisWarnings; + this.testSourcesConfigured = TestFileClassifier.isTestSourceConfigured(context.config()); this.indexer.buildOnce(context); this.architectureCallback = architectureCallback; this.checksExecutedWithoutParsingByFiles = new ConcurrentHashMap<>(); @@ -125,9 +136,14 @@ protected void scanFile(PythonInputFile inputFile) throws IOException { var pythonFile = SonarQubePythonFile.create(inputFile); InputFile.Type fileType = inputFile.wrappedFile().type(); PythonVisitorContext visitorContext = createVisitorContext(inputFile, pythonFile); + InputFile.Type effectiveTypeForRules = resolveEffectiveTypeForRules( + fileType, projectRelativePath(inputFile), visitorContext.rootTree()); + if (!testSourcesConfigured && fileType == InputFile.Type.MAIN) { + indexer.writeEffectiveFileType(inputFile.wrappedFile().key(), effectiveTypeForRules); + } - executeChecks(visitorContext, checks.sonarPythonChecks(), fileType, inputFile); - executeOtherChecks(inputFile, visitorContext, fileType); + executeChecks(visitorContext, checks.sonarPythonChecks(), effectiveTypeForRules, inputFile); + executeOtherChecks(inputFile, visitorContext, effectiveTypeForRules); runLockedByRepository(ARCHITECTURE_CALLBACK_LOCK_KEY, () -> architectureCallback.scanFile(visitorContext)); @@ -241,6 +257,11 @@ private static Map getOffsetLocations(PythonInputFile @Override public boolean scanFileWithoutParsing(PythonInputFile inputFile) { InputFile.Type fileType = inputFile.wrappedFile().type(); + InputFile.Type effectiveTypeForRules = resolveEffectiveTypeForRulesFromCache( + fileType, projectRelativePath(inputFile), inputFile.wrappedFile().key()); + if (effectiveTypeForRules == null) { + return false; + } boolean result = true; PythonFile pythonFile = SonarQubePythonFile.create(inputFile.wrappedFile()); PythonInputFileContext inputFileContext = new PythonInputFileContext( @@ -251,13 +272,13 @@ public boolean scanFileWithoutParsing(PythonInputFile inputFile) { indexer.projectLevelSymbolTable() ); - result = scanFileWithoutParsingSonarPython(inputFile, fileType, inputFileContext, result); + result = scanFileWithoutParsingSonarPython(inputFile, effectiveTypeForRules, inputFileContext, result); var atomicResult = new AtomicBoolean(result); var otherChecks = checks.noSonarPythonChecks(); otherChecks.forEach((repositoryKey, repositoryChecks) -> runLockedByRepository(repositoryKey, () -> { for (var check : repositoryChecks) { - var scanResult = scanFileWithoutParsingNotSonarPython(inputFile, check, fileType, atomicResult.get(), inputFileContext); + var scanResult = scanFileWithoutParsingNotSonarPython(inputFile, check, effectiveTypeForRules, atomicResult.get(), inputFileContext); atomicResult.set(scanResult); } })); @@ -322,6 +343,49 @@ private void endOfAnalysisForRepository(String repositoryKey, List endOfAnalyses.forEach(c -> c.endOfAnalysis(indexer.cacheContext()))); } + private String projectRelativePath(PythonInputFile inputFile) { + return context.fileSystem().baseDir().toURI() + .relativize(inputFile.wrappedFile().uri()) + .toString(); + } + + private boolean isBypassed(InputFile.Type platformType) { + return testSourcesConfigured || platformType == InputFile.Type.TEST; + } + + private InputFile.Type resolveEffectiveTypeForRules(InputFile.Type platformType, String filePath, @Nullable FileInput tree) { + if (isBypassed(platformType)) { + return platformType; + } + boolean isTest = TestFileClassifier.looksLikeTestFile(filePath, tree); + if (isTest) { + maybeEmitHeuristicWarning(); + return InputFile.Type.TEST; + } + return InputFile.Type.MAIN; + } + + @Nullable + private InputFile.Type resolveEffectiveTypeForRulesFromCache(InputFile.Type platformType, String filePath, String fileKey) { + if (isBypassed(platformType)) { + return platformType; + } + InputFile.Type cached = indexer.readEffectiveFileType(fileKey); + if (cached == null) { + // Cache entry is missing while the file is unchanged — the cache is in an inconsistent state + // This should never happen in normal operation. Fall back to a full parse rather than guessing the type. + LOG.debug("No cached effective file type for '{}': triggering full parse", filePath); + } + return cached; + } + + private void maybeEmitHeuristicWarning() { + if (heuristicWarningEmitted.compareAndSet(false, true)) { + LOG.warn(UNSET_SONAR_TESTS_WARNING); + analysisWarnings.addUnique(UNSET_SONAR_TESTS_WARNING); + } + } + boolean isCheckNotApplicable(PythonCheck pythonCheck, InputFile.Type fileType) { return fileType != InputFile.Type.MAIN && pythonCheck.scope() != PythonCheck.CheckScope.ALL; } diff --git a/python-commons/src/main/java/org/sonar/plugins/python/PythonSensor.java b/python-commons/src/main/java/org/sonar/plugins/python/PythonSensor.java index 4ae131c48..dede0e2ac 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/PythonSensor.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/PythonSensor.java @@ -153,7 +153,7 @@ public void execute(SensorContext context) { pythonIndexer.setSonarLintCache(sonarLintCache); TypeShed.setProjectLevelSymbolTable(pythonIndexer.projectLevelSymbolTable()); PythonScanner scanner = new PythonScanner(context, checks, fileLinesContextFactory, noSonarFilter, PythonParser::create, - pythonIndexer, architectureCallback, noSonarLineInfoCollector); + pythonIndexer, architectureCallback, noSonarLineInfoCollector, analysisWarnings); scanner.execute(pythonFiles, context); Duration sensorTime = Duration.between(sensorStartTime, Instant.now()); diff --git a/python-commons/src/main/java/org/sonar/plugins/python/TestFileClassifier.java b/python-commons/src/main/java/org/sonar/plugins/python/TestFileClassifier.java new file mode 100644 index 000000000..6f77fe382 --- /dev/null +++ b/python-commons/src/main/java/org/sonar/plugins/python/TestFileClassifier.java @@ -0,0 +1,177 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.plugins.python; + +import java.util.Arrays; +import java.util.Locale; +import java.util.Set; +import javax.annotation.Nullable; +import org.sonar.api.config.Configuration; +import org.sonar.plugins.python.api.tree.AssertStatement; +import org.sonar.plugins.python.api.tree.BaseTreeVisitor; +import org.sonar.plugins.python.api.tree.FileInput; +import org.sonar.plugins.python.api.tree.FunctionDef; +import org.sonar.plugins.python.api.tree.ImportFrom; +import org.sonar.plugins.python.api.tree.ImportName; + +/** + * Heuristic classifier used when {@code sonar.tests} is not configured. + * Determines whether a file should be treated as a test file for rule-execution + * purposes, without affecting metric computation (which always uses the platform + * {@code InputFile#type()}). + */ +public class TestFileClassifier { + + private static final Set TEST_FRAMEWORK_MODULES = Set.of("unittest", "pytest"); + + private TestFileClassifier() { + } + + /** + * Returns {@code true} when the project configuration explicitly controls which files are test + * files, making the path-based heuristic unnecessary. Both {@link PythonScanner} and + * {@link org.sonar.plugins.python.indexer.SonarQubePythonIndexer} use this to decide whether + * to activate (and cache) the heuristic. + */ + public static boolean isTestSourceConfigured(Configuration config) { + return isPropertyConfigured(config, "sonar.tests") + || isPropertyConfigured(config, "sonar.test.inclusions") + || isPropertyConfigured(config, "sonar.test.exclusions") + || config.getBoolean("sonar.python.testFileHeuristic.disabled").orElse(false); + } + + private static boolean isPropertyConfigured(Configuration config, String key) { + return config.get(key).filter(v -> !v.isBlank()).isPresent(); + } + + /** + * Path-only check — safe to call when no parsed tree is available (e.g. cache hits). + * Matches files whose directory contains {@code test} or {@code tests}, or whose + * filename follows the standard pytest discovery patterns ({@code test_*.py} / {@code *_test.py}). + */ + static boolean looksLikeTestFileByPath(String filePath) { + if (filePath.isEmpty()) { + return false; + } + String normalizedPath = filePath.replace('\\', '/'); + String[] components = normalizedPath.split("/"); + + // Check directory components (all but the last) + boolean dirMatch = Arrays.stream(components, 0, components.length - 1) + .map(c -> c.toLowerCase(Locale.ROOT)) + .anyMatch(dir -> "test".equals(dir) || "tests".equals(dir)); + if (dirMatch) { + return true; + } + + // Check filename + String filename = components[components.length - 1].toLowerCase(Locale.ROOT); + return filename.startsWith("test_") || filename.endsWith("_test.py"); + } + + /** + * Full check — uses the parsed tree in addition to path heuristics. + * Applies when a {@link FileInput} is available (i.e. during a full parse). + */ + static boolean looksLikeTestFile(String filePath, @Nullable FileInput tree) { + if (looksLikeTestFileByPath(filePath)) { + return true; + } + if (tree == null) { + return false; + } + return isImportBasedTestFile(tree) || isPytestPatternFile(tree); + } + + private static boolean isImportBasedTestFile(FileInput tree) { + var visitor = new TestImportVisitor(); + tree.accept(visitor); + return visitor.hasTestFrameworkImport; + } + + private static boolean isPytestPatternFile(FileInput tree) { + var visitor = new PytestPatternVisitor(); + tree.accept(visitor); + return visitor.hasPytestPattern; + } + + private static class TestImportVisitor extends BaseTreeVisitor { + boolean hasTestFrameworkImport = false; + + @Override + public void visitImportName(ImportName importName) { + if (hasTestFrameworkImport) { + return; + } + for (var aliasedName : importName.modules()) { + var names = aliasedName.dottedName().names(); + if (!names.isEmpty() && TEST_FRAMEWORK_MODULES.contains(names.get(0).name())) { + hasTestFrameworkImport = true; + return; + } + } + super.visitImportName(importName); + } + + @Override + public void visitImportFrom(ImportFrom importFrom) { + if (hasTestFrameworkImport) { + return; + } + var module = importFrom.module(); + if (module != null) { + var names = module.names(); + if (!names.isEmpty() && TEST_FRAMEWORK_MODULES.contains(names.get(0).name())) { + hasTestFrameworkImport = true; + return; + } + } + super.visitImportFrom(importFrom); + } + } + + private static class PytestPatternVisitor extends BaseTreeVisitor { + boolean hasPytestPattern = false; + + @Override + public void visitFunctionDef(FunctionDef functionDef) { + if (hasPytestPattern) { + return; + } + if (functionDef.name().name().startsWith("test_") && containsAssert(functionDef)) { + hasPytestPattern = true; + return; + } + super.visitFunctionDef(functionDef); + } + + private static boolean containsAssert(FunctionDef functionDef) { + var visitor = new AssertVisitor(); + functionDef.body().accept(visitor); + return visitor.hasAssert; + } + } + + private static class AssertVisitor extends BaseTreeVisitor { + boolean hasAssert = false; + + @Override + public void visitAssertStatement(AssertStatement assertStatement) { + hasAssert = true; + } + } +} diff --git a/python-commons/src/main/java/org/sonar/plugins/python/caching/Caching.java b/python-commons/src/main/java/org/sonar/plugins/python/caching/Caching.java index e3105b3cd..7c52c7a4d 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/caching/Caching.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/caching/Caching.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Set; import javax.annotation.CheckForNull; +import org.sonar.api.batch.fs.InputFile; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.sonar.plugins.python.api.caching.CacheContext; @@ -45,6 +46,8 @@ public class Caching { public static final String CACHE_VERSION_KEY = "python:cache_version"; public static final String CPD_TOKENS_CACHE_KEY_PREFIX = "python:cpd:data:"; public static final String CPD_TOKENS_STRING_TABLE_KEY_PREFIX = "python:cpd:stringTable:"; + public static final String EFFECTIVE_FILE_TYPE_CACHE_KEY_PREFIX = "python:effective_file_type:"; + public static final String TEST_SOURCES_CONFIGURED_KEY = "python:test_sources_configured"; private static final Logger LOG = LoggerFactory.getLogger(Caching.class); @@ -89,6 +92,42 @@ public void copyFromPrevious(String fileKey) { cacheContext.getWriteCache().copyFromPrevious(importsMapCacheKey(fileKey)); cacheContext.getWriteCache().copyFromPrevious(projectSymbolTableCacheKey(fileKey)); cacheContext.getWriteCache().copyFromPrevious(fileContentHashCacheKey(fileKey)); + if (cacheContext.getReadCache().contains(effectiveFileTypeCacheKey(fileKey))) { + cacheContext.getWriteCache().copyFromPrevious(effectiveFileTypeCacheKey(fileKey)); + } + } + + public void writeEffectiveFileType(String fileKey, InputFile.Type type) { + cacheContext.getWriteCache().write(effectiveFileTypeCacheKey(fileKey), type.name().getBytes(StandardCharsets.UTF_8)); + } + + @CheckForNull + public InputFile.Type readEffectiveFileType(String fileKey) { + byte[] bytes = cacheContext.getReadCache().readBytes(effectiveFileTypeCacheKey(fileKey)); + if (bytes != null) { + try { + return InputFile.Type.valueOf(new String(bytes, StandardCharsets.UTF_8)); + } catch (IllegalArgumentException e) { + LOG.debug("Failed to deserialize cached effective file type for key: \"{}\"", fileKey); + } + } + return null; + } + + public void writeTestSourcesConfigured(boolean testSourcesConfigured) { + cacheContext.getWriteCache().write(TEST_SOURCES_CONFIGURED_KEY, String.valueOf(testSourcesConfigured).getBytes(StandardCharsets.UTF_8)); + } + + public boolean isTestSourcesConfiguredUnchanged(boolean current) { + byte[] bytes = cacheContext.getReadCache().readBytes(TEST_SOURCES_CONFIGURED_KEY); + if (bytes == null) { + return false; + } + String cached = new String(bytes, StandardCharsets.UTF_8); + if (!"true".equals(cached) && !"false".equals(cached)) { + return false; + } + return current == Boolean.parseBoolean(cached); } @CheckForNull @@ -172,4 +211,8 @@ public static String projectSymbolTableCacheKey(String key) { public static String fileContentHashCacheKey(String key) { return CONTENT_HASHES_KEY + key.replace('\\', '/'); } + + public static String effectiveFileTypeCacheKey(String key) { + return EFFECTIVE_FILE_TYPE_CACHE_KEY_PREFIX + key.replace('\\', '/'); + } } diff --git a/python-commons/src/main/java/org/sonar/plugins/python/indexer/PythonIndexer.java b/python-commons/src/main/java/org/sonar/plugins/python/indexer/PythonIndexer.java index ee7f387b5..ce32b5bfa 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/indexer/PythonIndexer.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/indexer/PythonIndexer.java @@ -206,6 +206,14 @@ public boolean canBeFullyScannedWithoutParsing(PythonInputFile inputFile) { public abstract CacheContext cacheContext(); + public void writeEffectiveFileType(String fileKey, InputFile.Type type) { + } + + @CheckForNull + public InputFile.Type readEffectiveFileType(String fileKey) { + return null; + } + class GlobalSymbolsScanner extends Scanner { protected GlobalSymbolsScanner(SensorContext context) { super(context); diff --git a/python-commons/src/main/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexer.java b/python-commons/src/main/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexer.java index f61a6a961..a0f2c576e 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexer.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexer.java @@ -31,6 +31,7 @@ import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.sensor.SensorContext; import org.sonar.plugins.python.PythonInputFile; +import org.sonar.plugins.python.TestFileClassifier; import org.sonar.plugins.python.api.caching.CacheContext; import org.sonar.plugins.python.caching.Caching; import org.sonar.python.index.Descriptor; @@ -53,6 +54,7 @@ public class SonarQubePythonIndexer extends PythonIndexer { private static final Logger LOG = LoggerFactory.getLogger(SonarQubePythonIndexer.class); private final Caching caching; + private final boolean testSourcesConfigured; private final Set fullySkippableFiles = new HashSet<>(); private final Set partiallySkippableFiles = new HashSet<>(); private final List inputFiles = new ArrayList<>(); @@ -63,6 +65,7 @@ public SonarQubePythonIndexer(List inputFiles, CacheContext cac this.projectBaseDirAbsolutePath = context.fileSystem().baseDir().getAbsolutePath(); this.packageRoots = resolvePackageRoots(context); this.caching = new Caching(cacheContext, getCacheVersion(context)); + this.testSourcesConfigured = TestFileClassifier.isTestSourceConfigured(context.config()); inputFiles.forEach(f -> { this.inputFiles.add(f); inputFileToFQN.put(f, SymbolUtils.fullyQualifiedModuleName(packageName(f), f.wrappedFile().filename())); @@ -99,7 +102,8 @@ public void postAnalysis(SensorContext context) { private boolean shouldOptimizeAnalysis(SensorContext context) { return caching.isCacheEnabled() && (context.canSkipUnchangedFiles() || context.config().getBoolean(SONAR_CAN_SKIP_UNCHANGED_FILES_KEY).orElse(false)) - && caching.isCacheVersionUpToDate(); + && caching.isCacheVersionUpToDate() + && caching.isTestSourcesConfiguredUnchanged(testSourcesConfigured); } private void computeGlobalSymbolsUsingCache(SensorContext context) { @@ -192,6 +196,7 @@ public void computeGlobalSymbols(List files, SensorContext cont saveMainFilesListInCache(new HashSet<>(inputFileToFQN.values())); // Information on used Typeshed stubs needs to be done at the end of the analysis, as it is not computed during indexing anymore caching.writeCacheVersion(); + caching.writeTestSourcesConfigured(testSourcesConfigured); } } @@ -241,6 +246,18 @@ public CacheContext cacheContext() { return caching.cacheContext(); } + @Override + public void writeEffectiveFileType(String fileKey, InputFile.Type type) { + if (caching.isCacheEnabled()) { + caching.writeEffectiveFileType(fileKey, type); + } + } + + @Override + public InputFile.Type readEffectiveFileType(String fileKey) { + return caching.readEffectiveFileType(fileKey); + } + private static String getCacheVersion(SensorContext context) { String implementationVersion = getImplementationVersion(SonarQubePythonIndexer.class); var pythonVersions = context.config().getStringArray(PYTHON_VERSION_KEY); diff --git a/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java index 77873543b..4acf5335f 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java @@ -38,6 +38,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.ValueSource; import org.mockito.Mockito; import org.slf4j.Logger; @@ -129,7 +130,9 @@ import static org.sonar.plugins.python.caching.Caching.CPD_TOKENS_STRING_TABLE_KEY_PREFIX; import static org.sonar.plugins.python.caching.Caching.IMPORTS_MAP_CACHE_KEY_PREFIX; import static org.sonar.plugins.python.caching.Caching.PROJECT_SYMBOL_TABLE_CACHE_KEY_PREFIX; +import static org.sonar.plugins.python.caching.Caching.TEST_SOURCES_CONFIGURED_KEY; import static org.sonar.plugins.python.caching.Caching.TYPESHED_MODULES_KEY; +import static org.sonar.plugins.python.caching.Caching.effectiveFileTypeCacheKey; import static org.sonar.plugins.python.caching.Caching.fileContentHashCacheKey; import static org.sonar.plugins.python.caching.Caching.importsMapCacheKey; import static org.sonar.plugins.python.caching.Caching.projectSymbolTableCacheKey; @@ -629,6 +632,110 @@ void test_ncloc_metric_not_saved_on_test_file_in_sonarlint() { assertThat(context.measure(inputFile.wrappedFile().key(), CoreMetrics.NCLOC)).isNull(); } + @Test + void test_auto_reclassify_filename_heuristic_suppresses_main_rules() { + // sonar.tests NOT set: filename test_*.py triggers heuristic → S1226 (MAIN-scoped) must not fire + activeRules = new ActiveRulesBuilder() + .addRule(new NewActiveRule.Builder() + .setRuleKey(RuleKey.of(PythonRuleRepository.REPOSITORY_KEY, "S1226")) + .build()) + .build(); + + PythonInputFile inputFile = inputFile(FILE_TEST_FILE, Type.MAIN); + sensor().execute(context); + + assertThat(context.allIssues()).isEmpty(); + // Metrics must still be computed as for a MAIN file (not just NCLOC) + assertThat(context.measure(inputFile.wrappedFile().key(), CoreMetrics.FUNCTIONS).value()).isEqualTo(1); + verify(analysisWarning).addUnique(PythonScanner.UNSET_SONAR_TESTS_WARNING); + } + + @ParameterizedTest + @CsvSource({ + "sonar.tests, tests", + "sonar.test.inclusions, tests/**", + "sonar.test.exclusions, tests/generated/**", + "sonar.python.testFileHeuristic.disabled, true" + }) + void test_auto_reclassify_bypassed_when_test_source_configured(String property, String value) { + activeRules = new ActiveRulesBuilder() + .addRule(new NewActiveRule.Builder() + .setRuleKey(RuleKey.of(PythonRuleRepository.REPOSITORY_KEY, "S1226")) + .build()) + .build(); + + context.setSettings(new MapSettings().setProperty(property.strip(), value.strip())); + inputFile(FILE_TEST_FILE, Type.MAIN); + sensor().execute(context); + + assertThat(context.allIssues()).hasSize(1); + assertThat(context.allIssues().iterator().next().ruleKey().rule()).isEqualTo("S1226"); + verify(analysisWarning, Mockito.never()).addUnique(PythonScanner.UNSET_SONAR_TESTS_WARNING); + } + + @Test + void test_auto_reclassify_not_bypassed_by_blank_sonar_tests() { + // sonar.tests set to blank string is treated as "not configured" — heuristic still fires + activeRules = new ActiveRulesBuilder() + .addRule(new NewActiveRule.Builder() + .setRuleKey(RuleKey.of(PythonRuleRepository.REPOSITORY_KEY, "S1226")) + .build()) + .build(); + + context.setSettings(new MapSettings().setProperty("sonar.tests", "")); + inputFile(FILE_TEST_FILE, Type.MAIN); + sensor().execute(context); + + assertThat(context.allIssues()).isEmpty(); + verify(analysisWarning).addUnique(PythonScanner.UNSET_SONAR_TESTS_WARNING); + } + + @Test + void test_auto_reclassify_not_bypassed_by_blank_sonar_test_inclusions() { + // blank sonar.test.inclusions is treated as "not configured" — same as not setting it + activeRules = new ActiveRulesBuilder() + .addRule(new NewActiveRule.Builder() + .setRuleKey(RuleKey.of(PythonRuleRepository.REPOSITORY_KEY, "S1226")) + .build()) + .build(); + + context.setSettings(new MapSettings().setProperty("sonar.test.inclusions", "")); + inputFile(FILE_TEST_FILE, Type.MAIN); + sensor().execute(context); + + assertThat(context.allIssues()).isEmpty(); + verify(analysisWarning).addUnique(PythonScanner.UNSET_SONAR_TESTS_WARNING); + } + + @Test + void test_auto_reclassify_path_directory_heuristic() { + // File inside a `tests/` directory classified as MAIN → heuristic fires, S1226 suppressed + activeRules = new ActiveRulesBuilder() + .addRule(new NewActiveRule.Builder() + .setRuleKey(RuleKey.of(PythonRuleRepository.REPOSITORY_KEY, "S1226")) + .build()) + .build(); + + PythonInputFile inputFile = inputFile("tests/test_file.py", Type.MAIN); + sensor().execute(context); + + assertThat(context.allIssues()).isEmpty(); + assertThat(context.measure(inputFile.wrappedFile().key(), CoreMetrics.FUNCTIONS).value()).isEqualTo(1); + verify(analysisWarning).addUnique(PythonScanner.UNSET_SONAR_TESTS_WARNING); + } + + @Test + void test_auto_reclassify_warning_emitted_once_for_multiple_heuristic_files() { + activeRules = new ActiveRulesBuilder().build(); + + inputFile(FILE_TEST_FILE, Type.MAIN); + inputFile("tests/test_file.py", Type.MAIN); + sensor().execute(context); + + // warning must be emitted exactly once regardless of how many files match the heuristic + verify(analysisWarning, times(1)).addUnique(PythonScanner.UNSET_SONAR_TESTS_WARNING); + } + @Test void test_failFast_triggered_on_main_files() { activeRules = new ActiveRulesBuilder() @@ -976,6 +1083,7 @@ void test_using_cache() throws IOException { readCache.put(CPD_TOKENS_CACHE_KEY_PREFIX + inputFile.wrappedFile().key(), cpdTokens.data); readCache.put(CPD_TOKENS_STRING_TABLE_KEY_PREFIX + inputFile.wrappedFile().key(), cpdTokens.stringTable); readCache.put(fileContentHashCacheKey(inputFile.wrappedFile().key()), inputFile.wrappedFile().md5Hash().getBytes(UTF_8)); + readCache.put(effectiveFileTypeCacheKey(inputFile.wrappedFile().key()), "MAIN".getBytes(UTF_8)); context.setPreviousCache(readCache); context.setNextCache(writeCache); context.setCacheEnabled(true); @@ -1080,6 +1188,7 @@ void test_typeshed_stub_cache_information_is_propagated() throws IOException { readCache.put(CPD_TOKENS_CACHE_KEY_PREFIX + inputFile.wrappedFile().key(), cpdTokens.data); readCache.put(CPD_TOKENS_STRING_TABLE_KEY_PREFIX + inputFile.wrappedFile().key(), cpdTokens.stringTable); readCache.put(fileContentHashCacheKey(inputFile.wrappedFile().key()), inputFile.wrappedFile().md5Hash().getBytes(UTF_8)); + readCache.put(effectiveFileTypeCacheKey(inputFile.wrappedFile().key()), "MAIN".getBytes(UTF_8)); context.setPreviousCache(readCache); context.setNextCache(writeCache); @@ -1124,6 +1233,77 @@ void test_scan_without_parsing_test_file() { assertThat(context.allIssues()).isEmpty(); } + @Test + void test_scan_without_parsing_uses_cached_effective_file_type() throws IOException { + // File whose path doesn't match path-based test heuristics (no test_ prefix, not in tests/) + // but was previously classified as TEST via AST (imports pytest + test_ function with assert). + // The cached effectiveFileType=TEST must be used during the cache hit so that S1226 (MAIN-scoped) doesn't fire. + activeRules = new ActiveRulesBuilder() + .addRule(new NewActiveRule.Builder() + .setRuleKey(RuleKey.of(PythonRuleRepository.REPOSITORY_KEY, "S1226")) + .build()) + .build(); + + PythonInputFile inputFile = inputFile("helper_with_tests.py", Type.MAIN, InputFile.Status.SAME); + byte[] serializedSymbolTable = toProtobufModuleDescriptor(Set.of(new VariableDescriptor("test_helper", "helper_with_tests.test_helper", null))).toByteArray(); + TestReadCache readCache = getValidReadCache(); + CpdSerializer.SerializationResult cpdTokens = CpdSerializer.serialize(Collections.emptyList()); + readCache.put(fileContentHashCacheKey(inputFile.wrappedFile().key()), inputFile.wrappedFile().md5Hash().getBytes(UTF_8)); + readCache.put(importsMapCacheKey(inputFile.wrappedFile().key()), "pytest".getBytes(StandardCharsets.UTF_8)); + readCache.put(projectSymbolTableCacheKey(inputFile.wrappedFile().key()), serializedSymbolTable); + readCache.put(effectiveFileTypeCacheKey(inputFile.wrappedFile().key()), "TEST".getBytes(StandardCharsets.UTF_8)); + readCache.put(CPD_TOKENS_CACHE_KEY_PREFIX + inputFile.wrappedFile().key(), cpdTokens.data); + readCache.put(CPD_TOKENS_STRING_TABLE_KEY_PREFIX + inputFile.wrappedFile().key(), cpdTokens.stringTable); + TestWriteCache writeCache = new TestWriteCache(); + writeCache.bind(readCache); + + context.setPreviousCache(readCache); + context.setNextCache(writeCache); + context.setCacheEnabled(true); + context.setSettings(new MapSettings().setProperty("sonar.python.skipUnchanged", true)); + sensor().execute(context); + + assertThat(context.allIssues()).isEmpty(); + assertThat(logTester.logs(Level.INFO)) + .contains("The Python analyzer was able to leverage cached data from previous analyses for 1 out of 1 files. These files were not parsed."); + verify(analysisWarning, Mockito.never()).addUnique(PythonScanner.UNSET_SONAR_TESTS_WARNING); + } + + @Test + void test_scan_without_parsing_falls_back_to_full_parse_when_effective_type_missing_from_cache() throws IOException { + // If the effective file type is absent from cache (inconsistent state after e.g. a plugin rollback), + // scanFileWithoutParsing must return false so the file is fully re-parsed rather than guessing the type. + activeRules = new ActiveRulesBuilder() + .addRule(new NewActiveRule.Builder() + .setRuleKey(RuleKey.of(PythonRuleRepository.REPOSITORY_KEY, "S1226")) + .build()) + .build(); + + PythonInputFile inputFile = inputFile("helper_with_tests.py", Type.MAIN, InputFile.Status.SAME); + byte[] serializedSymbolTable = toProtobufModuleDescriptor(Set.of(new VariableDescriptor("test_helper", "helper_with_tests.test_helper", null))).toByteArray(); + TestReadCache readCache = getValidReadCache(); + CpdSerializer.SerializationResult cpdTokens = CpdSerializer.serialize(Collections.emptyList()); + readCache.put(fileContentHashCacheKey(inputFile.wrappedFile().key()), inputFile.wrappedFile().md5Hash().getBytes(UTF_8)); + readCache.put(importsMapCacheKey(inputFile.wrappedFile().key()), "pytest".getBytes(StandardCharsets.UTF_8)); + readCache.put(projectSymbolTableCacheKey(inputFile.wrappedFile().key()), serializedSymbolTable); + // effectiveFileTypeCacheKey intentionally absent — simulates inconsistent cache state + readCache.put(CPD_TOKENS_CACHE_KEY_PREFIX + inputFile.wrappedFile().key(), cpdTokens.data); + readCache.put(CPD_TOKENS_STRING_TABLE_KEY_PREFIX + inputFile.wrappedFile().key(), cpdTokens.stringTable); + TestWriteCache writeCache = new TestWriteCache(); + writeCache.bind(readCache); + + context.setPreviousCache(readCache); + context.setNextCache(writeCache); + context.setCacheEnabled(true); + context.setSettings(new MapSettings().setProperty("sonar.python.skipUnchanged", true)); + sensor().execute(context); + + // File is fully re-parsed: the AST-based classifier identifies it as a test file and suppresses S1226. + assertThat(context.allIssues()).isEmpty(); + assertThat(logTester.logs(Level.INFO)) + .contains("The Python analyzer was able to leverage cached data from previous analyses for 0 out of 1 files. These files were not parsed."); + } + @Test void test_scan_without_parsing_fails_does_not_reexecute_successful_checks() { activeRules = new ActiveRulesBuilder() @@ -1236,7 +1416,8 @@ void write_cpd_tokens_to_cache() throws IOException { assertThat(writeCache.getData().keySet()).containsExactlyInAnyOrder( "python:cache_version", "python:files", "python:descriptors:moduleKey:pass.py", "python:imports:moduleKey:pass.py", - "python:cpd:data:moduleKey:pass.py", "python:cpd:stringTable:moduleKey:pass.py", "python:content_hashes:moduleKey:pass.py", "python:typeshed_modules"); + "python:cpd:data:moduleKey:pass.py", "python:cpd:stringTable:moduleKey:pass.py", "python:content_hashes:moduleKey:pass.py", + "python:typeshed_modules", "python:test_sources_configured", "python:effective_file_type:moduleKey:pass.py"); byte[] tokenData = writeCache.getData().get("python:cpd:data:moduleKey:pass.py"); byte[] stringTable = writeCache.getData().get("python:cpd:stringTable:moduleKey:pass.py"); @@ -1786,7 +1967,7 @@ private void setup_quickfix_sensor() throws IOException { ClientInputFile clientFile = mock(ClientInputFile.class); - when(clientFile.relativePath()).thenReturn(pathToQuickFixTestFile); + when(clientFile.relativePath()).thenReturn(FILE_QUICKFIX); when(clientFile.getPath()).thenReturn(file.getAbsolutePath()); when(clientFile.uri()).thenReturn(file.getAbsoluteFile().toURI()); when(clientFile.contents()).thenReturn(content); @@ -1810,6 +1991,7 @@ private void setup_quickfix_sensor() throws IOException { TestReadCache getValidReadCache() { TestReadCache testReadCache = new TestReadCache(); testReadCache.put(CACHE_VERSION_KEY, "unknownPluginVersion".getBytes(UTF_8)); + testReadCache.put(TEST_SOURCES_CONFIGURED_KEY, "false".getBytes(UTF_8)); return testReadCache; } diff --git a/python-commons/src/test/java/org/sonar/plugins/python/TestFileClassifierTest.java b/python-commons/src/test/java/org/sonar/plugins/python/TestFileClassifierTest.java new file mode 100644 index 000000000..b62b076a3 --- /dev/null +++ b/python-commons/src/test/java/org/sonar/plugins/python/TestFileClassifierTest.java @@ -0,0 +1,167 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.plugins.python; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; +import org.sonar.plugins.python.api.tree.FileInput; +import org.sonar.python.parser.PythonParser; +import org.sonar.python.tree.PythonTreeMaker; + +import static org.assertj.core.api.Assertions.assertThat; + +class TestFileClassifierTest { + + // --- looksLikeTestFileByPath --- + + @Test + void empty_path_returns_false() { + assertThat(TestFileClassifier.looksLikeTestFileByPath("")).isFalse(); + } + + @Test + void file_in_tests_directory_returns_true() { + assertThat(TestFileClassifier.looksLikeTestFileByPath("tests/foo.py")).isTrue(); + } + + @Test + void file_in_test_singular_directory_returns_true() { + assertThat(TestFileClassifier.looksLikeTestFileByPath("test/foo.py")).isTrue(); + } + + @Test + void file_in_nested_tests_directory_returns_true() { + assertThat(TestFileClassifier.looksLikeTestFileByPath("src/mypackage/tests/foo.py")).isTrue(); + } + + @Test + void test_prefix_filename_returns_true() { + assertThat(TestFileClassifier.looksLikeTestFileByPath("test_foo.py")).isTrue(); + assertThat(TestFileClassifier.looksLikeTestFileByPath("src/test_bar.py")).isTrue(); + } + + @Test + void test_suffix_filename_returns_true() { + assertThat(TestFileClassifier.looksLikeTestFileByPath("foo_test.py")).isTrue(); + assertThat(TestFileClassifier.looksLikeTestFileByPath("src/bar_test.py")).isTrue(); + } + + @Test + void regular_file_in_src_returns_false() { + assertThat(TestFileClassifier.looksLikeTestFileByPath("src/foo.py")).isFalse(); + assertThat(TestFileClassifier.looksLikeTestFileByPath("module.py")).isFalse(); + } + + @Test + void directory_named_testing_not_matched() { + // only "test" and "tests" trigger — "testing" must not + assertThat(TestFileClassifier.looksLikeTestFileByPath("testing/foo.py")).isFalse(); + } + + @Test + void windows_style_path_normalized() { + assertThat(TestFileClassifier.looksLikeTestFileByPath("src\\tests\\foo.py")).isTrue(); + } + + // --- looksLikeTestFile with null tree --- + + @Test + void null_tree_non_test_path_returns_false() { + assertThat(TestFileClassifier.looksLikeTestFile("src/regular.py", null)).isFalse(); + } + + @Test + void null_tree_test_path_returns_true() { + assertThat(TestFileClassifier.looksLikeTestFile("tests/foo.py", null)).isTrue(); + } + + // --- import-based detection (visitImportName / visitImportFrom) --- + + @ParameterizedTest + @ValueSource(strings = { + "import unittest\n", + "import pytest\n", + "from unittest import TestCase\n", + "from pytest import mark\n" + }) + void test_framework_import_detected(String code) { + FileInput tree = parse(code); + assertThat(TestFileClassifier.looksLikeTestFile("regular.py", tree)).isTrue(); + } + + @Test + void multiple_imports_early_exit_after_first_match() { + // Second `import unittest` must hit the early-exit branch (hasTestFrameworkImport already true) + FileInput tree = parse("import unittest\nimport unittest\n"); + assertThat(TestFileClassifier.looksLikeTestFile("regular.py", tree)).isTrue(); + } + + @ParameterizedTest + @ValueSource(strings = { + "import os\nimport sys\n", // non-test imports + "from . import foo\n", // relative import — null module, must not throw + "def test_something():\n pass\n", // test_ prefix but no assert + "def do_something():\n assert True\n" // assert but no test_ prefix + }) + void ast_heuristic_not_detected(String code) { + assertThat(TestFileClassifier.looksLikeTestFile("regular.py", parse(code))).isFalse(); + } + + @Test + void multiple_from_imports_early_exit_after_first_match() { + // Second from-import hits the early-exit branch (hasTestFrameworkImport already true) + FileInput tree = parse("from unittest import TestCase\nfrom unittest import mock\n"); + assertThat(TestFileClassifier.looksLikeTestFile("regular.py", tree)).isTrue(); + } + + // --- pytest pattern detection (visitFunctionDef + AssertVisitor) --- + + @Test + void test_function_with_assert_detected() { + FileInput tree = parse("def test_something():\n assert True\n"); + assertThat(TestFileClassifier.looksLikeTestFile("regular.py", tree)).isTrue(); + } + + @Test + void multiple_test_functions_early_exit_after_first_match() { + // Second test_ function hits the early-exit branch (hasPytestPattern already true) + FileInput tree = parse("def test_one():\n assert True\ndef test_two():\n assert True\n"); + assertThat(TestFileClassifier.looksLikeTestFile("regular.py", tree)).isTrue(); + } + + @Test + void path_match_short_circuits_ast_check() { + // Path already matches — tree is never examined + FileInput tree = parse("import os\n"); + assertThat(TestFileClassifier.looksLikeTestFile("tests/foo.py", tree)).isTrue(); + } + + // --- isImportBasedTestFile short-circuit (||) --- + + @Test + void import_based_short_circuits_pytest_pattern_check() { + // import unittest is true → isPytestPatternFile never called (|| short-circuit) + FileInput tree = parse("import unittest\ndef regular_function():\n pass\n"); + assertThat(TestFileClassifier.looksLikeTestFile("regular.py", tree)).isTrue(); + } + + private static FileInput parse(String code) { + var astNode = PythonParser.create().parse(code); + return new PythonTreeMaker().fileInput(astNode); + } +} diff --git a/python-commons/src/test/java/org/sonar/plugins/python/caching/CachingTest.java b/python-commons/src/test/java/org/sonar/plugins/python/caching/CachingTest.java index 616499866..1d6d530fb 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/caching/CachingTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/caching/CachingTest.java @@ -26,6 +26,7 @@ import java.util.Map; import java.util.Set; import java.util.stream.Collectors; +import org.sonar.api.batch.fs.InputFile; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; import org.mockito.Mockito; @@ -46,8 +47,10 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import static org.sonar.plugins.python.caching.Caching.EFFECTIVE_FILE_TYPE_CACHE_KEY_PREFIX; import static org.sonar.plugins.python.caching.Caching.IMPORTS_MAP_CACHE_KEY_PREFIX; import static org.sonar.plugins.python.caching.Caching.PROJECT_SYMBOL_TABLE_CACHE_KEY_PREFIX; +import static org.sonar.plugins.python.caching.Caching.effectiveFileTypeCacheKey; import static org.sonar.python.index.DescriptorsToProtobuf.fromProtobuf; class CachingTest { @@ -186,4 +189,79 @@ void corruptedDataInCache() { assertThat(caching.readProjectLevelSymbolTableEntry(module)).isNull(); assertThat(logTester.logs(Level.DEBUG)).contains("Failed to deserialize project level symbol table entry for module: \"mod\""); } + + @Test + void writeAndReadEffectiveFileType() { + TestWriteCache writeCache = new TestWriteCache(); + TestReadCache readCache = new TestReadCache(); + writeCache.bind(readCache); + CacheContextImpl cacheContext = new CacheContextImpl(true, new PythonWriteCacheImpl(writeCache), new PythonReadCacheImpl(readCache)); + + Caching caching = new Caching(cacheContext, CACHE_VERSION); + + caching.writeEffectiveFileType("module:src/helper.py", InputFile.Type.MAIN); + assertThat(writeCache.getData()).containsKey(EFFECTIVE_FILE_TYPE_CACHE_KEY_PREFIX + "module:src/helper.py"); + + caching.writeEffectiveFileType("module:src/test_helper.py", InputFile.Type.TEST); + assertThat(writeCache.getData()).containsKey(EFFECTIVE_FILE_TYPE_CACHE_KEY_PREFIX + "module:src/test_helper.py"); + + readCache.put(effectiveFileTypeCacheKey("module:src/helper.py"), "MAIN".getBytes(StandardCharsets.UTF_8)); + readCache.put(effectiveFileTypeCacheKey("module:src/test_helper.py"), "TEST".getBytes(StandardCharsets.UTF_8)); + assertThat(caching.readEffectiveFileType("module:src/helper.py")).isEqualTo(InputFile.Type.MAIN); + assertThat(caching.readEffectiveFileType("module:src/test_helper.py")).isEqualTo(InputFile.Type.TEST); + } + + @Test + void readEffectiveFileTypeMissingEntry() { + TestWriteCache writeCache = new TestWriteCache(); + TestReadCache readCache = new TestReadCache(); + CacheContextImpl cacheContext = new CacheContextImpl(true, new PythonWriteCacheImpl(writeCache), new PythonReadCacheImpl(readCache)); + + Caching caching = new Caching(cacheContext, CACHE_VERSION); + assertThat(caching.readEffectiveFileType("module:src/unknown.py")).isNull(); + } + + @Test + void isTestSourcesConfiguredUnchangedReturnsFalseForInvalidCachedValue() { + TestWriteCache writeCache = new TestWriteCache(); + TestReadCache readCache = new TestReadCache(); + CacheContextImpl cacheContext = new CacheContextImpl(true, new PythonWriteCacheImpl(writeCache), new PythonReadCacheImpl(readCache)); + Caching caching = new Caching(cacheContext, CACHE_VERSION); + + readCache.put(Caching.TEST_SOURCES_CONFIGURED_KEY, "INVALID".getBytes(StandardCharsets.UTF_8)); + // unrecognised value must never be treated as "unchanged" — always invalidate + assertThat(caching.isTestSourcesConfiguredUnchanged(false)).isFalse(); + assertThat(caching.isTestSourcesConfiguredUnchanged(true)).isFalse(); + } + + @Test + void readEffectiveFileTypeReturnsNullForInvalidCachedValue() { + TestWriteCache writeCache = new TestWriteCache(); + TestReadCache readCache = new TestReadCache(); + CacheContextImpl cacheContext = new CacheContextImpl(true, new PythonWriteCacheImpl(writeCache), new PythonReadCacheImpl(readCache)); + Caching caching = new Caching(cacheContext, CACHE_VERSION); + + readCache.put(effectiveFileTypeCacheKey("module:src/helper.py"), "INVALID_TYPE".getBytes(StandardCharsets.UTF_8)); + assertThat(caching.readEffectiveFileType("module:src/helper.py")).isNull(); + } + + @Test + void copyFromPreviousIncludesEffectiveFileType() { + TestWriteCache writeCache = new TestWriteCache(); + TestReadCache readCache = new TestReadCache(); + writeCache.bind(readCache); + CacheContextImpl cacheContext = new CacheContextImpl(true, new PythonWriteCacheImpl(writeCache), new PythonReadCacheImpl(readCache)); + + Caching caching = new Caching(cacheContext, CACHE_VERSION); + String fileKey = "module:src/helper.py"; + // copyFromPrevious copies all 4 per-file keys — all must be present in the read cache + readCache.put(Caching.importsMapCacheKey(fileKey), new byte[0]); + readCache.put(Caching.projectSymbolTableCacheKey(fileKey), new byte[0]); + readCache.put(Caching.fileContentHashCacheKey(fileKey), new byte[0]); + readCache.put(effectiveFileTypeCacheKey(fileKey), "TEST".getBytes(StandardCharsets.UTF_8)); + + caching.copyFromPrevious(fileKey); + + assertThat(writeCache.getData()).containsKey(effectiveFileTypeCacheKey(fileKey)); + } } diff --git a/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexerTest.java b/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexerTest.java index 0740bc9e6..3e2ca04ed 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexerTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexerTest.java @@ -54,6 +54,7 @@ import static org.sonar.plugins.python.TestUtils.createInputFile; import static org.sonar.plugins.python.caching.Caching.CACHE_VERSION_KEY; import static org.sonar.plugins.python.caching.Caching.PROJECT_FILES_KEY; +import static org.sonar.plugins.python.caching.Caching.TEST_SOURCES_CONFIGURED_KEY; import static org.sonar.plugins.python.caching.Caching.TYPESHED_MODULES_KEY; import static org.sonar.plugins.python.caching.Caching.fileContentHashCacheKey; import static org.sonar.plugins.python.caching.Caching.importsMapCacheKey; @@ -90,6 +91,7 @@ void init() throws IOException { writeCache.bind(readCache); cacheVersion = "unknownPluginVersion"; readCache.put(CACHE_VERSION_KEY, cacheVersion.getBytes(StandardCharsets.UTF_8)); + readCache.put(TEST_SOURCES_CONFIGURED_KEY, "false".getBytes(StandardCharsets.UTF_8)); PythonWriteCache pythonWriteCache = new PythonWriteCacheImpl(writeCache); PythonReadCache pythonReadCache = new PythonReadCacheImpl(readCache); cacheContext = new CacheContextImpl(true, pythonWriteCache, pythonReadCache); diff --git a/python-commons/src/test/resources/org/sonar/plugins/python/sensor/helper_with_tests.py b/python-commons/src/test/resources/org/sonar/plugins/python/sensor/helper_with_tests.py new file mode 100644 index 000000000..62684e3bf --- /dev/null +++ b/python-commons/src/test/resources/org/sonar/plugins/python/sensor/helper_with_tests.py @@ -0,0 +1,5 @@ +import pytest + +def test_helper(x): + x = 42 + assert x == 42 diff --git a/python-commons/src/test/resources/org/sonar/plugins/python/sensor/test_file.py b/python-commons/src/test/resources/org/sonar/plugins/python/sensor/test_file.py index 2f723359d..3f3e09b9f 100644 --- a/python-commons/src/test/resources/org/sonar/plugins/python/sensor/test_file.py +++ b/python-commons/src/test/resources/org/sonar/plugins/python/sensor/test_file.py @@ -1,3 +1,5 @@ -def test_func(x): +# Triggers the filename heuristic (test_*.py) but not the pytest-pattern heuristic. +# Used in tests that specifically exercise path-based test detection. +def regular_func(x): x = 42 assert (a, b) diff --git a/python-commons/src/test/resources/org/sonar/plugins/python/sensor/tests/test_file.py b/python-commons/src/test/resources/org/sonar/plugins/python/sensor/tests/test_file.py new file mode 100644 index 000000000..3442ca703 --- /dev/null +++ b/python-commons/src/test/resources/org/sonar/plugins/python/sensor/tests/test_file.py @@ -0,0 +1,5 @@ +# Lives under a `tests/` directory to trigger the directory-based heuristic. +# See sensor/test_file.py for the companion file used to test the filename-based heuristic. +def test_func(x): + x = 42 + assert (a, b) From ef6bd8e66bd28b3071f4bb88c4ef529921c4a7cf Mon Sep 17 00:00:00 2001 From: Guillaume Dequenne Date: Wed, 13 May 2026 15:57:52 +0200 Subject: [PATCH 123/322] SONARPY-4156 Add Maven profile to update rules metadata via rule-api (#1102) GitOrigin-RevId: d0a98be1c258fad3ca32713c8c59b78a5684f7d1 --- pom.xml | 5 ++++ python-checks/pom.xml | 64 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 68 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b58a28cdb..b06840b77 100644 --- a/pom.xml +++ b/pom.xml @@ -323,6 +323,11 @@ true + + org.codehaus.mojo + exec-maven-plugin + 3.6.3 + diff --git a/python-checks/pom.xml b/python-checks/pom.xml index a55efc2d2..e4dc37b7f 100644 --- a/python-checks/pom.xml +++ b/python-checks/pom.xml @@ -114,7 +114,6 @@ org.codehaus.mojo exec-maven-plugin - 3.6.3 run-rule-api @@ -144,6 +143,69 @@ + + updateAllRules + + + update.rules + true + + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + download-rule-api-all + generate-resources + + copy + + + + + com.sonarsource.rule-api + rule-api + ${rule.api.version} + jar + ${project.build.directory} + rule-api.jar + + + + + + + + org.codehaus.mojo + exec-maven-plugin + + + run-rule-api-all + generate-resources + + exec + + + java + ${project.basedir}/.. + + -jar + ${project.build.directory}/rule-api.jar + update + + + ${env.RULE_API_GH_TOKEN} + + + + + + + + From 850af075965d55c6d0898c02d93078492a29994d Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Fri, 15 May 2026 08:25:48 +0200 Subject: [PATCH 124/322] SONARPY-611: Resolving super() to the base class (#1093) GitOrigin-RevId: bf4a1d00ed3c1752b9d983cee871c4d6f72cbaac --- .../test/resources/checks/argumentNumber.py | 2 +- .../python/api/types/v2/ClassType.java | 2 +- .../python/api/types/v2/SuperProxyType.java | 48 ++++++ .../CallReturnTypeCalculator.java | 49 ++++++ .../semantic/v2/TypeInferenceV2Test.java | 152 ++++++++++++++++++ .../CallReturnTypeCalculatorTest.java | 100 ++++++++++++ 6 files changed, 351 insertions(+), 2 deletions(-) create mode 100644 python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/SuperProxyType.java diff --git a/python-checks/src/test/resources/checks/argumentNumber.py b/python-checks/src/test/resources/checks/argumentNumber.py index ab56f6870..e99062aec 100644 --- a/python-checks/src/test/resources/checks/argumentNumber.py +++ b/python-checks/src/test/resources/checks/argumentNumber.py @@ -160,7 +160,7 @@ def __reduce__(self, p1, p2): class B2(B1): def foo(self): super().__reduce__(1, 2) # OK, __reduce__ is not 'object.__reduce__' but B1.__reduce__ - super().__reduce__(1, 2, 3) # FN + super().__reduce__(1, 2, 3) # Noncompliant class MethodsWithKeywordArguments: @classmethod diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/ClassType.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/ClassType.java index ed0368d89..a9ed197ce 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/ClassType.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/ClassType.java @@ -147,7 +147,7 @@ private Optional resolveMember(String memberName, Set vi .or(() -> inheritedMember(memberName, visited)); } - private Optional localMember(String memberName) { + Optional localMember(String memberName) { return members.stream() .filter(m -> m.name().equals(memberName)) .map(Member::type) diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/SuperProxyType.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/SuperProxyType.java new file mode 100644 index 000000000..a1a02012a --- /dev/null +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/SuperProxyType.java @@ -0,0 +1,48 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.plugins.python.api.types.v2; + +import java.util.Optional; + +/** + * A proxy type returned by zero-argument {@code super()} calls inside a method. + * Member lookup delegates to the enclosing class's C3 MRO tail — i.e. the MRO + * starting from the first parent (skipping the class itself). + */ +public record SuperProxyType(ClassType ownerClassType) implements PythonType { + + // FQN used by the V2 type system for the builtin super class + // (builtins prefix is stripped by TypeShedUtils.normalizedFqn) + public static final String SUPER_FQN = "super"; + + @Override + public String name() { + return SUPER_FQN; + } + + @Override + public Optional resolveMember(String memberName) { + return ownerClassType.mro() + .map(mro -> mro.stream() + .skip(1) + .map(classType -> classType.localMember(memberName)) + .filter(Optional::isPresent) + .map(Optional::get) + .findFirst()) + .orElse(Optional.empty()); + } +} diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/typecalculator/CallReturnTypeCalculator.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/typecalculator/CallReturnTypeCalculator.java index 9580f9805..12e50c14d 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/typecalculator/CallReturnTypeCalculator.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/typecalculator/CallReturnTypeCalculator.java @@ -19,9 +19,11 @@ import java.util.HashSet; import java.util.Optional; import java.util.Set; +import javax.annotation.CheckForNull; import org.sonar.plugins.python.api.TriBool; import org.sonar.plugins.python.api.tree.CallExpression; import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.FunctionDef; import org.sonar.plugins.python.api.tree.Name; import org.sonar.plugins.python.api.tree.QualifiedExpression; import org.sonar.plugins.python.api.tree.RegularArgument; @@ -30,6 +32,7 @@ import org.sonar.plugins.python.api.types.v2.ObjectType; import org.sonar.plugins.python.api.types.v2.PythonType; import org.sonar.plugins.python.api.types.v2.SelfType; +import org.sonar.plugins.python.api.types.v2.SuperProxyType; import org.sonar.plugins.python.api.types.v2.TypeOrigin; import org.sonar.plugins.python.api.types.v2.TypeSource; import org.sonar.plugins.python.api.types.v2.UnionType; @@ -51,6 +54,12 @@ public static PythonType computeCallExpressionType(CallExpression callExpr, Type return getFirstArgumentType(callExpr); } + // Zero-argument super() inside a method: return a proxy type that resolves members from the parent class hierarchy. + PythonType superProxy = computeSuperProxyType(callExpr, typePredicateContext); + if (superProxy != null) { + return superProxy; + } + PythonType calleeType = callExpr.callee().typeV2(); TypeSource typeSource = computeTypeSource(calleeType, callExpr); PythonType returnType = returnTypeOfCall(calleeType); @@ -64,6 +73,46 @@ public static PythonType computeCallExpressionType(CallExpression callExpr, Type return collapseSelfTypeIfNeeded(callExpr, returnType, typePredicateContext); } + /** + * When {@code super()} is called with zero arguments inside a method, Python returns a + * proxy object that delegates attribute lookup to the parent class hierarchy (skipping the + * current class). This method computes an {@code ObjectType} backed by a proxy type that resolves + * members on the enclosing class's C3 MRO tail. + * + * @return the super proxy {@code ObjectType}, or {@code null} if the call is not a zero-arg super() + */ + @CheckForNull + private static PythonType computeSuperProxyType(CallExpression callExpr, TypePredicateContext typePredicateContext) { + // Only handle zero-argument super() calls + if (!callExpr.arguments().isEmpty()) { + return null; + } + // The callee must resolve to the builtin 'super' ClassType + var isSuper = TypeInferenceMatcher.of(TypeInferenceMatchers.isType(SuperProxyType.SUPER_FQN)).evaluate(callExpr.callee().typeV2(), typePredicateContext); + if (isSuper != TriBool.TRUE) { + return null; + } + + ClassType ownerClassType = findEnclosingMethodOwner(callExpr); + if (ownerClassType == null || ownerClassType.mro().filter(mro -> mro.size() > 1).isEmpty()) { + return null; + } + return ObjectType.fromType(new SuperProxyType(ownerClassType)); + } + + @CheckForNull + private static ClassType findEnclosingMethodOwner(CallExpression callExpr) { + FunctionDef enclosingFunctionDef = TreeUtils.firstAncestorOfClass(callExpr, FunctionDef.class); + if (enclosingFunctionDef == null) { + return null; + } + PythonType funcType = enclosingFunctionDef.name().typeV2(); + if (!(funcType instanceof FunctionType functionType) || (!functionType.isInstanceMethod() && !functionType.isClassMethod())) { + return null; + } + return functionType.owner() instanceof ClassType classType ? classType : null; + } + private static PythonType returnTypeOfCall(PythonType calleeType) { if (calleeType instanceof ClassType classType) { return ObjectType.fromType(classType); diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/TypeInferenceV2Test.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/TypeInferenceV2Test.java index fba69af43..555583857 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/TypeInferenceV2Test.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/TypeInferenceV2Test.java @@ -5188,4 +5188,156 @@ class Foo: .element(0) .is(TypesTestUtils.objectTypeOf(projectLevelIntType)); } + + @Test + void superCallMemberResolvesFromBaseClass() { + // super() inside a method should resolve members from the superclass hierarchy, + // not from the builtin super class itself. + FileInput root = inferTypes(""" + class Base: + def my_method(self, p1, p2): pass + class A(Base): + def foo(self): + super().my_method(1, 2) + """); + + // super().my_method should resolve to Base.my_method + // Find the qualified expression super().my_method + List qualifiedExprs = PythonTestUtils.getAllDescendant(root, t -> t.is(Tree.Kind.QUALIFIED_EXPR)); + QualifiedExpression superMyMethod = qualifiedExprs.stream() + .filter(qe -> "my_method".equals(qe.name().name())) + .findFirst() + .orElseThrow(() -> new AssertionError("Could not find super().my_method qualified expression")); + + PythonType memberType = superMyMethod.name().typeV2(); + + // The member should be a FunctionType for Base.my_method + assertThat(memberType).isInstanceOf(FunctionType.class); + FunctionType functionType = (FunctionType) memberType; + assertThat(functionType.fullyQualifiedName()).isEqualTo("my_package.mod.Base.my_method"); + } + + @Test + void superCallAssignedVariableMemberResolvesFromBaseClass() { + // s = super(); s.my_method should also resolve to the base class member + FileInput root = inferTypes(""" + class Base: + def my_method(self, p1, p2): pass + class A(Base): + def foo(self): + s = super() + s.my_method(1, 2) + """); + + // Find s.my_method qualified expression + List qualifiedExprs = PythonTestUtils.getAllDescendant(root, t -> t.is(Tree.Kind.QUALIFIED_EXPR)); + QualifiedExpression sMyMethod = qualifiedExprs.stream() + .filter(qe -> "my_method".equals(qe.name().name())) + .findFirst() + .orElseThrow(() -> new AssertionError("Could not find s.my_method qualified expression")); + + PythonType memberType = sMyMethod.name().typeV2(); + + assertThat(memberType).isInstanceOf(FunctionType.class); + FunctionType functionType = (FunctionType) memberType; + assertThat(functionType.fullyQualifiedName()).isEqualTo("my_package.mod.Base.my_method"); + } + + @Test + void superCallDoesNotResolveChildClassOnlyMethods() { + FileInput root = inferTypes(""" + class Base: + def base_method(self): pass + class A(Base): + def foo(self): + super().child_only_method + def child_only_method(self): pass + """); + + List qualifiedExprs = PythonTestUtils.getAllDescendant(root, t -> t.is(Tree.Kind.QUALIFIED_EXPR)); + QualifiedExpression superChildOnlyMethod = qualifiedExprs.stream() + .filter(qe -> "child_only_method".equals(qe.name().name())) + .findFirst() + .orElseThrow(() -> new AssertionError("Could not find super().child_only_method qualified expression")); + + assertThat(superChildOnlyMethod.name().typeV2()).isEqualTo(PythonType.UNKNOWN); + } + + @Test + void superCallInClassMethodResolvesFromBaseClass() { + FileInput root = inferTypes(""" + class Base: + def base_method(self): pass + class A(Base): + @classmethod + def foo(cls): + super().base_method + """); + + List qualifiedExprs = PythonTestUtils.getAllDescendant(root, t -> t.is(Tree.Kind.QUALIFIED_EXPR)); + QualifiedExpression superBaseMethod = qualifiedExprs.stream() + .filter(qe -> "base_method".equals(qe.name().name())) + .findFirst() + .orElseThrow(() -> new AssertionError("Could not find super().base_method qualified expression")); + + PythonType memberType = superBaseMethod.name().typeV2(); + + assertThat(memberType).isInstanceOf(FunctionType.class); + FunctionType functionType = (FunctionType) memberType; + assertThat(functionType.fullyQualifiedName()).isEqualTo("my_package.mod.Base.base_method"); + } + + @Test + void superCallMemberResolvesFollowingMro() { + FileInput root = inferTypes(""" + class O: + def target(self): pass + class X(O): pass + class Y(O): + def target(self): pass + class A(X, Y): + def foo(self): + super().target + """); + + List qualifiedExprs = PythonTestUtils.getAllDescendant(root, t -> t.is(Tree.Kind.QUALIFIED_EXPR)); + QualifiedExpression superTarget = qualifiedExprs.stream() + .filter(qe -> "target".equals(qe.name().name())) + .findFirst() + .orElseThrow(() -> new AssertionError("Could not find super().target qualified expression")); + + PythonType memberType = superTarget.name().typeV2(); + + assertThat(memberType).isInstanceOf(FunctionType.class); + FunctionType functionType = (FunctionType) memberType; + assertThat(functionType.fullyQualifiedName()).isEqualTo("my_package.mod.Y.target"); + } + + @Test + void superCallMemberResolvesFollowingMroWhenYNotInheritingO() { + // Y does not inherit from O. MRO of A(X, Y) is [A, X, O, Y, object]. + // super() in A skips A -> X (no target) -> O (has target) -> resolves O.target + FileInput root = inferTypes(""" + class O: + def target(self): pass + class X(O): pass + class Y: + def target(self): pass + class A(X, Y): + def foo(self): + super().target + """); + + List qualifiedExprs = PythonTestUtils.getAllDescendant(root, t -> t.is(Tree.Kind.QUALIFIED_EXPR)); + QualifiedExpression superTarget = qualifiedExprs.stream() + .filter(qe -> "target".equals(qe.name().name())) + .findFirst() + .orElseThrow(() -> new AssertionError("Could not find super().target qualified expression")); + + PythonType memberType = superTarget.name().typeV2(); + + assertThat(memberType).isInstanceOf(FunctionType.class); + FunctionType functionType = (FunctionType) memberType; + assertThat(functionType.fullyQualifiedName()).isEqualTo("my_package.mod.O.target"); + } } diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/types/typecalculator/CallReturnTypeCalculatorTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/types/typecalculator/CallReturnTypeCalculatorTest.java index 2646eb966..d8b6215db 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/types/typecalculator/CallReturnTypeCalculatorTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/types/typecalculator/CallReturnTypeCalculatorTest.java @@ -19,12 +19,14 @@ import java.util.List; import java.util.Set; import org.junit.jupiter.api.Test; +import org.sonar.plugins.python.api.TriBool; import org.sonar.plugins.python.api.tree.CallExpression; import org.sonar.plugins.python.api.tree.ClassDef; import org.sonar.plugins.python.api.tree.FileInput; import org.sonar.plugins.python.api.tree.Name; import org.sonar.plugins.python.api.tree.QualifiedExpression; import org.sonar.plugins.python.api.types.v2.ClassType; +import org.sonar.plugins.python.api.types.v2.FunctionType; import org.sonar.plugins.python.api.types.v2.ObjectType; import org.sonar.plugins.python.api.types.v2.PythonType; import org.sonar.plugins.python.api.types.v2.SelfType; @@ -91,6 +93,98 @@ void computeCallExpressionType_unknownCallee() { assertThat(result).isEqualTo(PythonType.UNKNOWN); } + @Test + void computeCallExpressionType_superCall_returnsProxyResolvingMroTail() { + FileInput fileInput = parseAndInferTypes(""" + class O(object): + def target(self): pass + class X(O): pass + class Y(O): + def target(self): pass + class A(X, Y): + def foo(self): + super() + """); + + CallExpression callExpr = getSuperCall(fileInput); + + PythonType result = CallReturnTypeCalculator.computeCallExpressionType(callExpr, typePredicateContext); + + assertThat(result).isInstanceOf(ObjectType.class); + ObjectType objectType = (ObjectType) result; + assertThat(objectType.type()).isNotInstanceOf(ClassType.class); + assertThat(objectType.type().name()).isEqualTo("super"); + assertThat(objectType.resolveMember("target")) + .hasValueSatisfying(member -> { + assertThat(member).isInstanceOf(FunctionType.class); + assertThat(((FunctionType) member).fullyQualifiedName()).isEqualTo("my_package.mod.Y.target"); + }); + assertThat(objectType.hasMember("target")).isEqualTo(TriBool.TRUE); + // ObjectType.hasMember only dispatches to ClassType.instancesHaveMember; SuperProxyType is not + // a ClassType so the fallthrough always returns UNKNOWN for unresolved members. + assertThat(objectType.hasMember("missing")).isEqualTo(TriBool.UNKNOWN); + } + + @Test + void computeCallExpressionType_superCallInClassMethod_returnsProxy() { + FileInput fileInput = parseAndInferTypes(""" + class Base: + def base_method(self): pass + class A(Base): + @classmethod + def foo(cls): + super() + """); + + CallExpression callExpr = getSuperCall(fileInput); + + PythonType result = CallReturnTypeCalculator.computeCallExpressionType(callExpr, typePredicateContext); + + assertThat(result).isInstanceOf(ObjectType.class); + ObjectType objectType = (ObjectType) result; + assertThat(objectType.type()).isNotInstanceOf(ClassType.class); + assertThat(objectType.resolveMember("base_method")) + .hasValueSatisfying(member -> { + assertThat(member).isInstanceOf(FunctionType.class); + assertThat(((FunctionType) member).fullyQualifiedName()).isEqualTo("my_package.mod.Base.base_method"); + }); + } + + @Test + void computeCallExpressionType_superCallOutsideMethod_returnsBuiltinSuperObject() { + FileInput fileInput = parseAndInferTypes(""" + super() + """); + + CallExpression callExpr = getSuperCall(fileInput); + + PythonType result = CallReturnTypeCalculator.computeCallExpressionType(callExpr, typePredicateContext); + + assertThat(result).isInstanceOf(ObjectType.class); + ObjectType objectType = (ObjectType) result; + assertThat(objectType.type()).isInstanceOfSatisfying(ClassType.class, classType -> assertThat(classType.fullyQualifiedName()).isEqualTo("super")); + } + + @Test + void computeCallExpressionType_superCallInStaticMethod_returnsBuiltinSuperObject() { + FileInput fileInput = parseAndInferTypes(""" + class Base: + def base_method(self): pass + class A(Base): + @staticmethod + def foo(): + super() + """); + + CallExpression callExpr = getSuperCall(fileInput); + + PythonType result = CallReturnTypeCalculator.computeCallExpressionType(callExpr, typePredicateContext); + + assertThat(result).isInstanceOf(ObjectType.class); + ObjectType objectType = (ObjectType) result; + assertThat(objectType.type()).isInstanceOfSatisfying(ClassType.class, classType -> assertThat(classType.fullyQualifiedName()).isEqualTo("super")); + } + @Test void computeCallExpressionType_selfType_collapsedForInstanceMethodCall() { FileInput fileInput = parseAndInferTypes(""" @@ -534,4 +628,10 @@ def reveal_type(x) -> str: assertThat(result).isInstanceOf(ObjectType.class); assertThat(((ObjectType) result).unwrappedType()).isEqualTo(TypesTestUtils.STR_TYPE); } + + private static CallExpression getSuperCall(FileInput fileInput) { + return getFirstDescendant(fileInput, tree -> tree instanceof CallExpression callExpression + && callExpression.callee() instanceof Name name + && "super".equals(name.name())); + } } From 9bb9526fe69b8830c438d2640e03b1e67edcb663 Mon Sep 17 00:00:00 2001 From: Guillaume Dequenne Date: Tue, 19 May 2026 13:49:32 +0200 Subject: [PATCH 125/322] SONARPY-4194 Fix failing caching tests (#1121) GitOrigin-RevId: 505a4f3f290d02cf533f05a5fe36152bd410aa8f --- .../java/org/sonar/plugins/python/PythonScanner.java | 6 +++++- .../java/org/sonar/plugins/python/caching/Caching.java | 3 --- .../org/sonar/plugins/python/PythonSensorTest.java | 9 +++++++++ .../org/sonar/plugins/python/caching/CachingTest.java | 10 ++++++---- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/python-commons/src/main/java/org/sonar/plugins/python/PythonScanner.java b/python-commons/src/main/java/org/sonar/plugins/python/PythonScanner.java index 6915aa24c..ace6d532f 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/PythonScanner.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/PythonScanner.java @@ -290,7 +290,11 @@ public boolean scanFileWithoutParsing(PythonInputFile inputFile) { // We must avoid pushing measures twice due to the risk of duplicate cache key error. return false; } - return restoreAndPushMeasuresIfApplicable(inputFile); + boolean success = restoreAndPushMeasuresIfApplicable(inputFile); + if (success && !testSourcesConfigured && fileType == InputFile.Type.MAIN) { + indexer.writeEffectiveFileType(inputFile.wrappedFile().key(), effectiveTypeForRules); + } + return success; } private boolean scanFileWithoutParsingNotSonarPython(PythonInputFile inputFile, PythonCheck check, InputFile.Type fileType, diff --git a/python-commons/src/main/java/org/sonar/plugins/python/caching/Caching.java b/python-commons/src/main/java/org/sonar/plugins/python/caching/Caching.java index 7c52c7a4d..0fe061436 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/caching/Caching.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/caching/Caching.java @@ -92,9 +92,6 @@ public void copyFromPrevious(String fileKey) { cacheContext.getWriteCache().copyFromPrevious(importsMapCacheKey(fileKey)); cacheContext.getWriteCache().copyFromPrevious(projectSymbolTableCacheKey(fileKey)); cacheContext.getWriteCache().copyFromPrevious(fileContentHashCacheKey(fileKey)); - if (cacheContext.getReadCache().contains(effectiveFileTypeCacheKey(fileKey))) { - cacheContext.getWriteCache().copyFromPrevious(effectiveFileTypeCacheKey(fileKey)); - } } public void writeEffectiveFileType(String fileKey, InputFile.Type type) { diff --git a/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java index 4acf5335f..26190b7d8 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java @@ -1093,6 +1093,8 @@ void test_using_cache() throws IOException { assertThat(context.allIssues()).isEmpty(); assertThat(logTester.logs(Level.INFO)) .contains("The Python analyzer was able to leverage cached data from previous analyses for 1 out of 1 files. These files were not parsed."); + assertThat(writeCache.getData()) + .containsEntry(effectiveFileTypeCacheKey(inputFile.wrappedFile().key()), "MAIN".getBytes(UTF_8)); } @Test @@ -1202,6 +1204,8 @@ void test_typeshed_stub_cache_information_is_propagated() throws IOException { byte[] bytes = writeCache.getData().get(TYPESHED_MODULES_KEY); Set resolvedTypeshedModules = new HashSet<>(Arrays.asList(new String(bytes, StandardCharsets.UTF_8).split(";"))); assertThat(resolvedTypeshedModules).containsExactlyInAnyOrder("math"); + assertThat(writeCache.getData()) + .containsEntry(effectiveFileTypeCacheKey(inputFile.wrappedFile().key()), "MAIN".getBytes(UTF_8)); } @Test @@ -1324,6 +1328,7 @@ void test_scan_without_parsing_fails_does_not_reexecute_successful_checks() { readCache.put(importsMapCacheKey(inputFile.wrappedFile().key()), String.join(";", Collections.emptyList()).getBytes(StandardCharsets.UTF_8)); readCache.put(projectSymbolTableCacheKey(inputFile.wrappedFile().key()), serializedSymbolTable); readCache.put(fileContentHashCacheKey(inputFile.wrappedFile().key()), inputFile.wrappedFile().md5Hash().getBytes(UTF_8)); + readCache.put(effectiveFileTypeCacheKey(inputFile.wrappedFile().key()), "MAIN".getBytes(UTF_8)); context.setPreviousCache(readCache); context.setNextCache(writeCache); context.setCacheEnabled(true); @@ -1356,6 +1361,7 @@ void test_partial_scan_without_parsing() { readCache.put(importsMapCacheKey(inputFile2.wrappedFile().key()), String.join(";", List.of("file1.py")).getBytes(StandardCharsets.UTF_8)); readCache.put(projectSymbolTableCacheKey(inputFile2.wrappedFile().key()), serializedSymbolTable); readCache.put(fileContentHashCacheKey(inputFile2.wrappedFile().key()), inputFile2.wrappedFile().md5Hash().getBytes(UTF_8)); + readCache.put(effectiveFileTypeCacheKey(inputFile2.wrappedFile().key()), "MAIN".getBytes(UTF_8)); context.setPreviousCache(readCache); context.setNextCache(writeCache); context.setCacheEnabled(true); @@ -1509,6 +1515,7 @@ void read_cpd_tokens_from_cache() throws IOException { readCache.put(importsMapCacheKey(inputFile.wrappedFile().key()), String.join(";", Collections.emptyList()).getBytes(StandardCharsets.UTF_8)); readCache.put(projectSymbolTableCacheKey(inputFile.wrappedFile().key()), serializedSymbolTable); readCache.put(fileContentHashCacheKey(inputFile.wrappedFile().key()), inputFile.wrappedFile().md5Hash().getBytes(UTF_8)); + readCache.put(effectiveFileTypeCacheKey(inputFile.wrappedFile().key()), "MAIN".getBytes(UTF_8)); TestWriteCache writeCache = new TestWriteCache(); writeCache.bind(readCache); @@ -1597,6 +1604,7 @@ void read_cpd_tokens_from_cache_corrupted_format() throws IOException { readCache.put(importsMapCacheKey(inputFile.wrappedFile().key()), String.join(";", Collections.emptyList()).getBytes(StandardCharsets.UTF_8)); readCache.put(projectSymbolTableCacheKey(inputFile.wrappedFile().key()), serializedSymbolTable); readCache.put(fileContentHashCacheKey(inputFile.wrappedFile().key()), inputFile.wrappedFile().md5Hash().getBytes(UTF_8)); + readCache.put(effectiveFileTypeCacheKey(inputFile.wrappedFile().key()), "MAIN".getBytes(UTF_8)); TestWriteCache writeCache = new TestWriteCache(); writeCache.bind(readCache); @@ -1670,6 +1678,7 @@ void cpd_tokens_failure_does_not_execute_checks_multiple_times() throws IOExcept readCache.put(importsMapCacheKey(inputFile.wrappedFile().key()), String.join(";", Collections.emptyList()).getBytes(StandardCharsets.UTF_8)); readCache.put(projectSymbolTableCacheKey(inputFile.wrappedFile().key()), serializedSymbolTable); readCache.put(fileContentHashCacheKey(inputFile.wrappedFile().key()), inputFile.wrappedFile().md5Hash().getBytes(UTF_8)); + readCache.put(effectiveFileTypeCacheKey(inputFile.wrappedFile().key()), "MAIN".getBytes(UTF_8)); TestWriteCache writeCache = new TestWriteCache(); writeCache.bind(readCache); diff --git a/python-commons/src/test/java/org/sonar/plugins/python/caching/CachingTest.java b/python-commons/src/test/java/org/sonar/plugins/python/caching/CachingTest.java index 1d6d530fb..3222cfa88 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/caching/CachingTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/caching/CachingTest.java @@ -246,7 +246,7 @@ void readEffectiveFileTypeReturnsNullForInvalidCachedValue() { } @Test - void copyFromPreviousIncludesEffectiveFileType() { + void copyFromPreviousCopiesThreeIndexingKeys() { TestWriteCache writeCache = new TestWriteCache(); TestReadCache readCache = new TestReadCache(); writeCache.bind(readCache); @@ -254,14 +254,16 @@ void copyFromPreviousIncludesEffectiveFileType() { Caching caching = new Caching(cacheContext, CACHE_VERSION); String fileKey = "module:src/helper.py"; - // copyFromPrevious copies all 4 per-file keys — all must be present in the read cache readCache.put(Caching.importsMapCacheKey(fileKey), new byte[0]); readCache.put(Caching.projectSymbolTableCacheKey(fileKey), new byte[0]); readCache.put(Caching.fileContentHashCacheKey(fileKey), new byte[0]); - readCache.put(effectiveFileTypeCacheKey(fileKey), "TEST".getBytes(StandardCharsets.UTF_8)); caching.copyFromPrevious(fileKey); - assertThat(writeCache.getData()).containsKey(effectiveFileTypeCacheKey(fileKey)); + assertThat(writeCache.getData()) + .containsKey(Caching.importsMapCacheKey(fileKey)) + .containsKey(Caching.projectSymbolTableCacheKey(fileKey)) + .containsKey(Caching.fileContentHashCacheKey(fileKey)) + .doesNotContainKey(effectiveFileTypeCacheKey(fileKey)); } } From 85ed26f587889bc2b626747bbf1278fd68107536 Mon Sep 17 00:00:00 2001 From: Daniel Teuchert <141642369+daniel-teuchert-sonarsource@users.noreply.github.com> Date: Wed, 20 May 2026 16:53:08 +0200 Subject: [PATCH 126/322] SONARPY-4176 S3752: Do not raise when HTTP verbs are explicitly allowed and adjust message for vulnerability format (#1117) Co-authored-by: David Kunzmann GitOrigin-RevId: b4d71eaffc04ac19802bc334d674bc79da50648f --- .../hotspots/UnsafeHttpMethodsCheck.java | 121 ++++-------------- .../hotspots/UnsafeHttpMethodsCheckTest.java | 3 +- .../unsafeHttpMethods/django/views.py | 8 +- .../hotspots/unsafeHttpMethods/flask/views.py | 6 +- .../django.views.decorators.http.protobuf | 30 +++++ .../django.views.decorators.protobuf | 10 ++ .../custom_protobuf/django.views.protobuf | 4 +- .../checksums/custom.checksum | 4 +- .../custom/django/views/__init__.pyi | 1 + .../django/views/decorators/__init__.pyi | 1 + .../custom/django/views/decorators/http.pyi | 6 + .../tests/test_serializers.py | 2 +- 12 files changed, 90 insertions(+), 106 deletions(-) create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.decorators.http.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.decorators.protobuf create mode 100644 python-frontend/typeshed_serializer/resources/custom/django/views/decorators/__init__.pyi create mode 100644 python-frontend/typeshed_serializer/resources/custom/django/views/decorators/http.pyi diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/UnsafeHttpMethodsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/UnsafeHttpMethodsCheck.java index f3e08be37..ac5f9b80b 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/UnsafeHttpMethodsCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/UnsafeHttpMethodsCheck.java @@ -16,50 +16,34 @@ */ package org.sonar.python.checks.hotspots; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Objects; import java.util.Optional; -import java.util.Set; import org.sonar.check.Rule; import org.sonar.plugins.python.api.PythonSubscriptionCheck; import org.sonar.plugins.python.api.SubscriptionContext; import org.sonar.plugins.python.api.symbols.FunctionSymbol; -import org.sonar.plugins.python.api.symbols.Symbol; -import org.sonar.plugins.python.api.tree.Argument; import org.sonar.plugins.python.api.tree.CallExpression; import org.sonar.plugins.python.api.tree.Decorator; import org.sonar.plugins.python.api.tree.Expression; -import org.sonar.plugins.python.api.tree.FileInput; import org.sonar.plugins.python.api.tree.FunctionDef; -import org.sonar.plugins.python.api.tree.ListLiteral; -import org.sonar.plugins.python.api.tree.RegularArgument; -import org.sonar.plugins.python.api.tree.StringLiteral; +import org.sonar.plugins.python.api.types.v2.UnknownType; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; import org.sonar.python.semantic.FunctionSymbolImpl; import org.sonar.python.tree.FunctionDefImpl; -import org.sonar.python.tree.TreeUtils; -import static org.sonar.plugins.python.api.tree.Tree.Kind.CALL_EXPR; -import static org.sonar.plugins.python.api.tree.Tree.Kind.FILE_INPUT; import static org.sonar.plugins.python.api.tree.Tree.Kind.FUNCDEF; -import static org.sonar.plugins.python.api.tree.Tree.Kind.LIST_LITERAL; -import static org.sonar.plugins.python.api.tree.Tree.Kind.REGULAR_ARGUMENT; -import static org.sonar.plugins.python.api.tree.Tree.Kind.STRING_LITERAL; -import static org.sonar.python.tree.TreeUtils.argumentByKeyword; -import static org.sonar.python.tree.TreeUtils.getSymbolFromTree; @Rule(key = "S3752") public class UnsafeHttpMethodsCheck extends PythonSubscriptionCheck { - private static final Set SAFE_HTTP_METHODS = new HashSet<>(Arrays.asList("GET", "HEAD", "OPTIONS")); - private static final Set UNSAFE_HTTP_METHODS = new HashSet<>(Arrays.asList("POST", "PUT", "DELETE")); - private static final Set COMPLIANT_DECORATORS = new HashSet<>(Arrays.asList( - "django.views.decorators.http.require_POST", - "django.views.decorators.http.require_GET", - "django.views.decorators.http.require_safe" - )); - private static final String MESSAGE = "Make sure allowing safe and unsafe HTTP methods is safe here."; + private static final TypeMatcher COMPLIANT_DECORATORS = TypeMatchers.any( + TypeMatchers.isType("django.views.decorators.http.require_POST"), + TypeMatchers.isType("django.views.decorators.http.require_GET"), + TypeMatchers.isType("django.views.decorators.http.require_safe")); + + private static final TypeMatcher IS_REQUIRED_HTTP_METHOD = TypeMatchers.isType("django.views.decorators.http.require_http_methods"); + + private static final String MESSAGE = "Explicitly specify the HTTP methods this endpoint accepts."; @Override public void initialize(Context context) { @@ -67,55 +51,37 @@ public void initialize(Context context) { FunctionDef functionDef = (FunctionDef) ctx.syntaxNode(); if (isDjangoView(functionDef)) { checkDjangoView(functionDef, ctx); - } else { - getFlaskViewDecorator(functionDef).ifPresent(callExpression -> checkFlaskView(callExpression, ctx)); } }); } private static void checkDjangoView(FunctionDef functionDef, SubscriptionContext ctx) { for (Decorator decorator : functionDef.decorators()) { - if (getSymbolFromTree(decorator.expression()) - .filter(symbol -> symbol.fullyQualifiedName() == null || COMPLIANT_DECORATORS.contains(symbol.fullyQualifiedName())) - .isPresent()) { + Expression decoratorExpr = decorator.expression(); + if (COMPLIANT_DECORATORS.isTrueFor(decoratorExpr, ctx) || + isCallRequiredHTTPMethod(decoratorExpr, ctx)) { return; } - if (decorator.expression().is(CALL_EXPR)) { - CallExpression callExpression = (CallExpression) decorator.expression(); - Symbol symbol = callExpression.calleeSymbol(); - if (symbol != null && "django.views.decorators.http.require_http_methods".equals(symbol.fullyQualifiedName())) { - checkRequireHttpMethodsDecorator(ctx, callExpression); - return; - } + if (!isKnownNonCompliantDjangoHttpDecorator(decoratorExpr)) { + // Not from django.views.decorators.http — unknown or user-defined decorator + // may restrict methods, so give benefit of the doubt. + return; } } ctx.addIssue(functionDef.name(), MESSAGE); } - private static void checkRequireHttpMethodsDecorator(SubscriptionContext ctx, CallExpression callExpression) { - List arguments = callExpression.arguments(); - if (!arguments.isEmpty() && hasBothUnsafeAndSafeHttpMethods(arguments.get(0))) { - ctx.addIssue(callExpression, MESSAGE); - } + private static boolean isCallRequiredHTTPMethod(Expression expression, SubscriptionContext ctx) { + return expression instanceof CallExpression callExpression && + IS_REQUIRED_HTTP_METHOD.isTrueFor(callExpression.callee(), ctx); } - private static boolean hasBothUnsafeAndSafeHttpMethods(Argument argument) { - boolean hasSafeHttpMethod = false; - boolean hasUnsafeHttpMethod = false; - if (argument.is(REGULAR_ARGUMENT) && ((RegularArgument) argument).expression().is(LIST_LITERAL)) { - ListLiteral listLiteral = (ListLiteral) ((RegularArgument) argument).expression(); - for (Expression expression : listLiteral.elements().expressions()) { - if (expression.is(STRING_LITERAL)) { - String value = ((StringLiteral) expression).trimmedQuotesValue(); - if (SAFE_HTTP_METHODS.contains(value)) { - hasSafeHttpMethod = true; - } else if (UNSAFE_HTTP_METHODS.contains(value)) { - hasUnsafeHttpMethod = true; - } - } - } - } - return hasSafeHttpMethod && hasUnsafeHttpMethod; + private static boolean isKnownNonCompliantDjangoHttpDecorator(Expression expression) { + var type = expression instanceof CallExpression callExpr + ? callExpr.callee().typeV2() + : expression.typeV2(); + return type instanceof UnknownType.UnresolvedImportType uit && + uit.importPath().startsWith("django.views.decorators.http."); } private static boolean isDjangoView(FunctionDef functionDef) { @@ -125,37 +91,4 @@ private static boolean isDjangoView(FunctionDef functionDef) { .filter(FunctionSymbolImpl::isDjangoView) .isPresent(); } - - private static Optional getFlaskViewDecorator(FunctionDef functionDef) { - return functionDef.decorators().stream() - .map(Decorator::expression) - .filter(expression -> expression.is(CALL_EXPR)) - .map(CallExpression.class::cast) - .filter(UnsafeHttpMethodsCheck::isFlaskRouteDecorator) - .findFirst(); - } - - private static boolean isFlaskRouteDecorator(CallExpression callExpression) { - Symbol calleeSymbol = callExpression.calleeSymbol(); - if (calleeSymbol == null) { - return false; - } - return "route".equals(calleeSymbol.name()); - } - - private static void checkFlaskView(CallExpression callExpression, SubscriptionContext ctx) { - RegularArgument methodsArg = argumentByKeyword("methods", callExpression.arguments()); - if (methodsArg != null && hasBothUnsafeAndSafeHttpMethods(methodsArg) && isFlaskImported(callExpression)) { - ctx.addIssue(callExpression, MESSAGE); - } - } - - private static boolean isFlaskImported(CallExpression callExpression) { - return Optional.ofNullable(TreeUtils.firstAncestorOfKind(callExpression, FILE_INPUT)) - .filter(fileInput -> ((FileInput) fileInput).globalVariables().stream() - .map(Symbol::fullyQualifiedName) - .filter(Objects::nonNull) - .anyMatch(fqn -> fqn.contains("flask"))) - .isPresent(); - } } diff --git a/python-checks/src/test/java/org/sonar/python/checks/hotspots/UnsafeHttpMethodsCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/hotspots/UnsafeHttpMethodsCheckTest.java index b1036459d..7319d0dea 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/hotspots/UnsafeHttpMethodsCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/hotspots/UnsafeHttpMethodsCheckTest.java @@ -42,7 +42,8 @@ void test_django_views_and_urls_same_file() { @Test void test_flask() { - PythonCheckVerifier.verify(Arrays.asList( + // Flask always requires explicit method specification; any explicit choice is intentional, so no issues are raised. + PythonCheckVerifier.verifyNoIssue(Arrays.asList( "src/test/resources/checks/hotspots/unsafeHttpMethods/flask/views.py", "src/test/resources/checks/hotspots/unsafeHttpMethods/flask/otherDecorator.py" ), new UnsafeHttpMethodsCheck()); diff --git a/python-checks/src/test/resources/checks/hotspots/unsafeHttpMethods/django/views.py b/python-checks/src/test/resources/checks/hotspots/unsafeHttpMethods/django/views.py index e029c7972..66b1b24d8 100644 --- a/python-checks/src/test/resources/checks/hotspots/unsafeHttpMethods/django/views.py +++ b/python-checks/src/test/resources/checks/hotspots/unsafeHttpMethods/django/views.py @@ -3,8 +3,8 @@ def sensitive1(request): # Noncompliant ... -@require_http_methods(["GET", "POST"]) # Noncompliant -def sensitive2(request): +@require_http_methods(["GET", "POST"]) # Compliant - methods explicitly specified +def compliant_explicit_methods(request): ... @require_http_methods(["POST"]) # Compliant @@ -24,12 +24,12 @@ def compliant_require_http_methods4(request): ... @unknown(["GET", "POST"]) -def compliant_require_http_methods5(request): # Noncompliant +def compliant_require_http_methods5(request): # Compliant: Unknown decorrator might rerstrict allowed HTTP verbs ... def foo(): ... @foo(["GET", "POST"]) -def compliant_require_http_methods6(request): # Noncompliant +def compliant_require_http_methods6(request): # Compliant ... @require_POST # Compliant diff --git a/python-checks/src/test/resources/checks/hotspots/unsafeHttpMethods/flask/views.py b/python-checks/src/test/resources/checks/hotspots/unsafeHttpMethods/flask/views.py index 3b84cb686..ab2ceed77 100644 --- a/python-checks/src/test/resources/checks/hotspots/unsafeHttpMethods/flask/views.py +++ b/python-checks/src/test/resources/checks/hotspots/unsafeHttpMethods/flask/views.py @@ -5,12 +5,12 @@ methods = Blueprint('methods', __name__) # 127.0.0.1:5000/methods/sensitive1 -@methods.route('/sensitive1', methods=['GET', 'POST']) # Noncompliant +@methods.route('/sensitive1', methods=['GET', 'POST']) # Compliant - methods explicitly specified def sensitive1(): return Response("Method: " + request.method, 200) # 127.0.0.1:5000/methods/sensitive1 -@other_routes.route('/sensitive1', methods=['GET', 'POST']) # Noncompliant +@other_routes.route('/sensitive1', methods=['GET', 'POST']) # Compliant - methods explicitly specified def sensitive1_other_routes(): return Response("Method: " + request.method, 200) @@ -56,7 +56,7 @@ def inside_fn(): methods = Blueprint('methods', __name__) # 127.0.0.1:5000/methods/sensitive1 - @methods.route('/sensitive1', methods=['GET', 'POST']) # Noncompliant + @methods.route('/sensitive1', methods=['GET', 'POST']) # Compliant - methods explicitly specified def sensitive1(): return Response("Method: " + request.method, 200) diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.decorators.http.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.decorators.http.protobuf new file mode 100644 index 000000000..ef927ec0d --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.decorators.http.protobuf @@ -0,0 +1,30 @@ + +django.views.decorators.http +require_http_methods1django.views.decorators.http.require_http_methods"K +CallableType[builtins.function]& +builtins.function"builtins.function*c +request_method_listJ +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.listh + require_GET(django.views.decorators.http.require_GET" +Any* +args +Any* +kwargs +Anyj + require_POST)django.views.decorators.http.require_POST" +Any* +args +Any* +kwargs +Anyj + require_safe)django.views.decorators.http.require_safe" +Any* +args +Any* +kwargs +Any* +__annotations__,django.views.decorators.http.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.decorators.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.decorators.protobuf new file mode 100644 index 000000000..abf7e4aec --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.decorators.protobuf @@ -0,0 +1,10 @@ + +django.views.decorators*x +__path__ django.views.decorators.__path__J +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list* +__annotations__'django.views.decorators.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict*& +httpdjango.views.decorators.http  \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.protobuf index f2d0faccc..b5368ffa2 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/django.views.protobuf @@ -6,5 +6,7 @@ __annotations__django.views.__annotations__W builtins.dict[builtins.str,Any] builtins.str" builtins.str -Any" builtins.dict*! +Any" builtins.dict*' + +decoratorsdjango.views.decorators *! genericdjango.views.generic  \ No newline at end of file diff --git a/python-frontend/typeshed_serializer/checksums/custom.checksum b/python-frontend/typeshed_serializer/checksums/custom.checksum index 909367350..0ba19f1e3 100644 --- a/python-frontend/typeshed_serializer/checksums/custom.checksum +++ b/python-frontend/typeshed_serializer/checksums/custom.checksum @@ -1,2 +1,2 @@ -4ed5a5d152958ba1e643059b3f9957815405f44596c64d268aa525aab7c74b5e -4394f7b9850885f1aab48413ba65f330a2c5c83a626202c0075d44b217f37643 +231f65c4b64676dc0b057a3302c8c8634d301b44cbcc30d59f482443e41c2b76 +07c11cd37bb006167a8f8aa98f17625b6463e4449f2fee3c1dd5faf820becf34 \ No newline at end of file diff --git a/python-frontend/typeshed_serializer/resources/custom/django/views/__init__.pyi b/python-frontend/typeshed_serializer/resources/custom/django/views/__init__.pyi index e194e8119..57878ba8a 100644 --- a/python-frontend/typeshed_serializer/resources/custom/django/views/__init__.pyi +++ b/python-frontend/typeshed_serializer/resources/custom/django/views/__init__.pyi @@ -1 +1,2 @@ +import django.views.decorators as decorators import django.views.generic as generic diff --git a/python-frontend/typeshed_serializer/resources/custom/django/views/decorators/__init__.pyi b/python-frontend/typeshed_serializer/resources/custom/django/views/decorators/__init__.pyi new file mode 100644 index 000000000..174741cc5 --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/django/views/decorators/__init__.pyi @@ -0,0 +1 @@ +import django.views.decorators.http as http diff --git a/python-frontend/typeshed_serializer/resources/custom/django/views/decorators/http.pyi b/python-frontend/typeshed_serializer/resources/custom/django/views/decorators/http.pyi new file mode 100644 index 000000000..74754e98d --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/django/views/decorators/http.pyi @@ -0,0 +1,6 @@ +from typing import Any, Callable, List + +def require_http_methods(request_method_list: List[str]) -> Callable[..., Any]: ... +def require_GET(*args: Any, **kwargs: Any) -> Any: ... +def require_POST(*args: Any, **kwargs: Any) -> Any: ... +def require_safe(*args: Any, **kwargs: Any) -> Any: ... diff --git a/python-frontend/typeshed_serializer/tests/test_serializers.py b/python-frontend/typeshed_serializer/tests/test_serializers.py index 6822fa577..cce7678b9 100644 --- a/python-frontend/typeshed_serializer/tests/test_serializers.py +++ b/python-frontend/typeshed_serializer/tests/test_serializers.py @@ -74,7 +74,7 @@ def test_custom_stubs_serializer(typeshed_custom_stubs): custom_stubs_serializer.serialize() assert custom_stubs_serializer.get_build_result.call_count == 1 # Not every files from "typeshed_custom_stubs" build are serialized, as some are builtins - assert symbols.save_module.call_count == 362 + assert symbols.save_module.call_count == 364 def test_importer_serializer(): From 0b9e988db2adf551067a0ffb542ae802e4557554 Mon Sep 17 00:00:00 2001 From: Guillaume Dequenne Date: Thu, 21 May 2026 09:55:32 +0200 Subject: [PATCH 127/322] SONARPY-4198 Refine heuristic to classify test files to only consider top-level imports (#1123) GitOrigin-RevId: 9eeccc8f016c1fbbde4a8fdfa66479017fde1a8e --- .../sonar/python/it/plugin/TestRulesTest.java | 3 +- .../plugins/python/TestFileClassifier.java | 83 +++++++------------ .../python/TestFileClassifierTest.java | 30 ++++--- 3 files changed, 49 insertions(+), 67 deletions(-) diff --git a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/TestRulesTest.java b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/TestRulesTest.java index e81a573ba..f4c671c5f 100644 --- a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/TestRulesTest.java +++ b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/TestRulesTest.java @@ -22,7 +22,6 @@ import java.io.File; import java.util.Comparator; import java.util.List; -import java.util.stream.Collectors; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -160,6 +159,6 @@ private static List issues(String rulekey) { return newWsClient().issues().search(new SearchRequest().setRules(singletonList(rulekey))).getIssuesList() .stream() .sorted(Comparator.comparing(Issues.Issue::getComponent).thenComparingInt(Issues.Issue::getLine)) - .collect(Collectors.toList()); + .toList(); } } diff --git a/python-commons/src/main/java/org/sonar/plugins/python/TestFileClassifier.java b/python-commons/src/main/java/org/sonar/plugins/python/TestFileClassifier.java index 6f77fe382..ac0fd5dd5 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/TestFileClassifier.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/TestFileClassifier.java @@ -27,6 +27,8 @@ import org.sonar.plugins.python.api.tree.FunctionDef; import org.sonar.plugins.python.api.tree.ImportFrom; import org.sonar.plugins.python.api.tree.ImportName; +import org.sonar.plugins.python.api.tree.Statement; +import org.sonar.plugins.python.api.tree.StatementList; /** * Heuristic classifier used when {@code sonar.tests} is not configured. @@ -98,72 +100,45 @@ static boolean looksLikeTestFile(String filePath, @Nullable FileInput tree) { } private static boolean isImportBasedTestFile(FileInput tree) { - var visitor = new TestImportVisitor(); - tree.accept(visitor); - return visitor.hasTestFrameworkImport; - } - - private static boolean isPytestPatternFile(FileInput tree) { - var visitor = new PytestPatternVisitor(); - tree.accept(visitor); - return visitor.hasPytestPattern; + StatementList statements = tree.statements(); + if (statements == null) { + return false; + } + return statements.statements().stream().anyMatch(TestFileClassifier::isTestFrameworkImport); } - private static class TestImportVisitor extends BaseTreeVisitor { - boolean hasTestFrameworkImport = false; - - @Override - public void visitImportName(ImportName importName) { - if (hasTestFrameworkImport) { - return; - } - for (var aliasedName : importName.modules()) { - var names = aliasedName.dottedName().names(); - if (!names.isEmpty() && TEST_FRAMEWORK_MODULES.contains(names.get(0).name())) { - hasTestFrameworkImport = true; - return; - } - } - super.visitImportName(importName); + private static boolean isTestFrameworkImport(Statement statement) { + if (statement instanceof ImportName importName) { + return importName.modules().stream() + .map(aliasedName -> aliasedName.dottedName().names()) + .filter(names -> !names.isEmpty()) + .anyMatch(names -> TEST_FRAMEWORK_MODULES.contains(names.get(0).name())); } - - @Override - public void visitImportFrom(ImportFrom importFrom) { - if (hasTestFrameworkImport) { - return; - } + if (statement instanceof ImportFrom importFrom) { var module = importFrom.module(); if (module != null) { var names = module.names(); - if (!names.isEmpty() && TEST_FRAMEWORK_MODULES.contains(names.get(0).name())) { - hasTestFrameworkImport = true; - return; - } + return !names.isEmpty() && TEST_FRAMEWORK_MODULES.contains(names.get(0).name()); } - super.visitImportFrom(importFrom); } + return false; } - private static class PytestPatternVisitor extends BaseTreeVisitor { - boolean hasPytestPattern = false; - - @Override - public void visitFunctionDef(FunctionDef functionDef) { - if (hasPytestPattern) { - return; - } - if (functionDef.name().name().startsWith("test_") && containsAssert(functionDef)) { - hasPytestPattern = true; - return; - } - super.visitFunctionDef(functionDef); + private static boolean isPytestPatternFile(FileInput tree) { + StatementList statements = tree.statements(); + if (statements == null) { + return false; } + return statements.statements().stream() + .filter(FunctionDef.class::isInstance) + .map(FunctionDef.class::cast) + .anyMatch(f -> f.name().name().startsWith("test_") && containsAssert(f)); + } - private static boolean containsAssert(FunctionDef functionDef) { - var visitor = new AssertVisitor(); - functionDef.body().accept(visitor); - return visitor.hasAssert; - } + private static boolean containsAssert(FunctionDef functionDef) { + var visitor = new AssertVisitor(); + functionDef.body().accept(visitor); + return visitor.hasAssert; } private static class AssertVisitor extends BaseTreeVisitor { diff --git a/python-commons/src/test/java/org/sonar/plugins/python/TestFileClassifierTest.java b/python-commons/src/test/java/org/sonar/plugins/python/TestFileClassifierTest.java index b62b076a3..7b223c56b 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/TestFileClassifierTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/TestFileClassifierTest.java @@ -105,8 +105,7 @@ void test_framework_import_detected(String code) { } @Test - void multiple_imports_early_exit_after_first_match() { - // Second `import unittest` must hit the early-exit branch (hasTestFrameworkImport already true) + void multiple_top_level_imports_both_checked() { FileInput tree = parse("import unittest\nimport unittest\n"); assertThat(TestFileClassifier.looksLikeTestFile("regular.py", tree)).isTrue(); } @@ -123,13 +122,26 @@ void ast_heuristic_not_detected(String code) { } @Test - void multiple_from_imports_early_exit_after_first_match() { - // Second from-import hits the early-exit branch (hasTestFrameworkImport already true) + void nested_import_not_detected() { + // import inside a function body must not classify the file as a test file + FileInput tree = parse("def helper():\n from unittest.mock import Mock\n return Mock()\n"); + assertThat(TestFileClassifier.looksLikeTestFile("regular.py", tree)).isFalse(); + } + + @Test + void nested_test_function_not_detected() { + // a test_* function nested inside another function must not classify the file as a test file + FileInput tree = parse("def outer():\n def test_inner():\n assert True\n"); + assertThat(TestFileClassifier.looksLikeTestFile("regular.py", tree)).isFalse(); + } + + @Test + void multiple_from_imports_all_checked() { FileInput tree = parse("from unittest import TestCase\nfrom unittest import mock\n"); assertThat(TestFileClassifier.looksLikeTestFile("regular.py", tree)).isTrue(); } - // --- pytest pattern detection (visitFunctionDef + AssertVisitor) --- + // --- pytest pattern detection (top-level functions only) --- @Test void test_function_with_assert_detected() { @@ -138,8 +150,7 @@ void test_function_with_assert_detected() { } @Test - void multiple_test_functions_early_exit_after_first_match() { - // Second test_ function hits the early-exit branch (hasPytestPattern already true) + void multiple_top_level_test_functions_checked() { FileInput tree = parse("def test_one():\n assert True\ndef test_two():\n assert True\n"); assertThat(TestFileClassifier.looksLikeTestFile("regular.py", tree)).isTrue(); } @@ -151,11 +162,8 @@ void path_match_short_circuits_ast_check() { assertThat(TestFileClassifier.looksLikeTestFile("tests/foo.py", tree)).isTrue(); } - // --- isImportBasedTestFile short-circuit (||) --- - @Test - void import_based_short_circuits_pytest_pattern_check() { - // import unittest is true → isPytestPatternFile never called (|| short-circuit) + void import_match_takes_precedence_over_pytest_pattern() { FileInput tree = parse("import unittest\ndef regular_function():\n pass\n"); assertThat(TestFileClassifier.looksLikeTestFile("regular.py", tree)).isTrue(); } From b238d36cfef617051193155054ee3f8961586066 Mon Sep 17 00:00:00 2001 From: Daniel Teuchert <141642369+daniel-teuchert-sonarsource@users.noreply.github.com> Date: Tue, 26 May 2026 09:34:07 +0200 Subject: [PATCH 128/322] SONARPY-4203 S3752 adjustments from validation results (#1127) Co-authored-by: sonar-review-alpha[bot] <266116024+sonar-review-alpha[bot]@users.noreply.github.com> GitOrigin-RevId: c574a10bdddfdd420503c62502e60d4203b9d478 --- .../hotspots/UnsafeHttpMethodsCheck.java | 71 +++++++++--- .../hotspots/unsafeHttpMethods/django/urls.py | 27 ++++- .../unsafeHttpMethods/django/views.py | 104 +++++++++++++++++- 3 files changed, 177 insertions(+), 25 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/UnsafeHttpMethodsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/UnsafeHttpMethodsCheck.java index ac5f9b80b..630d20fd0 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/UnsafeHttpMethodsCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/UnsafeHttpMethodsCheck.java @@ -21,18 +21,24 @@ import org.sonar.plugins.python.api.PythonSubscriptionCheck; import org.sonar.plugins.python.api.SubscriptionContext; import org.sonar.plugins.python.api.symbols.FunctionSymbol; +import org.sonar.plugins.python.api.symbols.v2.SymbolV2; +import org.sonar.plugins.python.api.symbols.v2.UsageV2; +import org.sonar.plugins.python.api.tree.BinaryExpression; import org.sonar.plugins.python.api.tree.CallExpression; import org.sonar.plugins.python.api.tree.Decorator; import org.sonar.plugins.python.api.tree.Expression; import org.sonar.plugins.python.api.tree.FunctionDef; +import org.sonar.plugins.python.api.tree.IfStatement; +import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.ParenthesizedExpression; +import org.sonar.plugins.python.api.tree.QualifiedExpression; +import org.sonar.plugins.python.api.tree.Tree; import org.sonar.plugins.python.api.types.v2.UnknownType; import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; import org.sonar.python.semantic.FunctionSymbolImpl; import org.sonar.python.tree.FunctionDefImpl; -import static org.sonar.plugins.python.api.tree.Tree.Kind.FUNCDEF; - @Rule(key = "S3752") public class UnsafeHttpMethodsCheck extends PythonSubscriptionCheck { @@ -47,7 +53,7 @@ public class UnsafeHttpMethodsCheck extends PythonSubscriptionCheck { @Override public void initialize(Context context) { - context.registerSyntaxNodeConsumer(FUNCDEF, ctx -> { + context.registerSyntaxNodeConsumer(Tree.Kind.FUNCDEF, ctx -> { FunctionDef functionDef = (FunctionDef) ctx.syntaxNode(); if (isDjangoView(functionDef)) { checkDjangoView(functionDef, ctx); @@ -56,19 +62,17 @@ public void initialize(Context context) { } private static void checkDjangoView(FunctionDef functionDef, SubscriptionContext ctx) { - for (Decorator decorator : functionDef.decorators()) { - Expression decoratorExpr = decorator.expression(); - if (COMPLIANT_DECORATORS.isTrueFor(decoratorExpr, ctx) || - isCallRequiredHTTPMethod(decoratorExpr, ctx)) { - return; - } - if (!isKnownNonCompliantDjangoHttpDecorator(decoratorExpr)) { - // Not from django.views.decorators.http — unknown or user-defined decorator - // may restrict methods, so give benefit of the doubt. - return; - } + boolean hasCompliantDecorator = functionDef.decorators().stream() + .map(Decorator::expression) + .anyMatch(expr -> COMPLIANT_DECORATORS.isTrueFor(expr, ctx) || isCallRequiredHTTPMethod(expr, ctx)); + + boolean hasNonDjangoDecorator = functionDef.decorators().stream() + .map(Decorator::expression) + .anyMatch(expr -> !isKnownDjangoDecorator(expr)); + + if (!hasCompliantDecorator && !hasNonDjangoDecorator && !hasRequestMethodCheck(functionDef)) { + ctx.addIssue(functionDef.name(), MESSAGE); } - ctx.addIssue(functionDef.name(), MESSAGE); } private static boolean isCallRequiredHTTPMethod(Expression expression, SubscriptionContext ctx) { @@ -76,12 +80,45 @@ private static boolean isCallRequiredHTTPMethod(Expression expression, Subscript IS_REQUIRED_HTTP_METHOD.isTrueFor(callExpression.callee(), ctx); } - private static boolean isKnownNonCompliantDjangoHttpDecorator(Expression expression) { + private static boolean isKnownDjangoDecorator(Expression expression) { var type = expression instanceof CallExpression callExpr ? callExpr.callee().typeV2() : expression.typeV2(); return type instanceof UnknownType.UnresolvedImportType uit && - uit.importPath().startsWith("django.views.decorators.http."); + uit.importPath().startsWith("django."); + } + + private static boolean hasRequestMethodCheck(FunctionDef functionDef) { + var params = functionDef.parameters(); + if (params == null || params.nonTuple().isEmpty()) { + return false; + } + Name firstParam = params.nonTuple().get(0).name(); + if (firstParam == null) { + return false; + } + SymbolV2 symbol = firstParam.symbolV2(); + if (symbol == null) { + return false; + } + return symbol.usages().stream() + .filter(usage -> usage.kind() != UsageV2.Kind.PARAMETER) + .anyMatch(UnsafeHttpMethodsCheck::isRequestMethodInIfCondition); + } + + private static boolean isRequestMethodInIfCondition(UsageV2 usage) { + if (!(usage.tree().parent() instanceof QualifiedExpression qe) || !"method".equals(qe.name().name())) { + return false; + } + if (!(qe.parent() instanceof BinaryExpression comparison) || + (!comparison.is(Tree.Kind.COMPARISON) && !comparison.is(Tree.Kind.IN))) { + return false; + } + Tree ancestor = comparison.parent(); + while (ancestor instanceof BinaryExpression || ancestor instanceof ParenthesizedExpression) { + ancestor = ancestor.parent(); + } + return ancestor instanceof IfStatement; } private static boolean isDjangoView(FunctionDef functionDef) { diff --git a/python-checks/src/test/resources/checks/hotspots/unsafeHttpMethods/django/urls.py b/python-checks/src/test/resources/checks/hotspots/unsafeHttpMethods/django/urls.py index 87202d3b1..6b219f7cf 100644 --- a/python-checks/src/test/resources/checks/hotspots/unsafeHttpMethods/django/urls.py +++ b/python-checks/src/test/resources/checks/hotspots/unsafeHttpMethods/django/urls.py @@ -4,17 +4,38 @@ from . import views_decorator_fqn_null urlpatterns = [ - path('sensitive1', views.sensitive1, name='sensitive1'), - path('sensitive2', views.sensitive2, name='sensitive2'), + path('compliant_explicit_methods', views.compliant_explicit_methods, name='compliant_explicit_methods'), path('compliant_require_http_methods', views.compliant_require_http_methods, name='compliant_require_http_methods'), path('compliant_require_http_methods2', views.compliant_require_http_methods2, name='compliant_require_http_methods2'), path('compliant_require_http_methods3', views.compliant_require_http_methods3, name='compliant_require_http_methods3'), path('compliant_require_http_methods4', views.compliant_require_http_methods4, name='compliant_require_http_methods4'), + path('compliant_non_django_import', views.compliant_non_django_import, name='compliant_non_django_import'), path('compliant_require_http_methods5', views.compliant_require_http_methods5, name='compliant_require_http_methods5'), path('compliant_require_http_methods6', views.compliant_require_http_methods6, name='compliant_require_http_methods6'), path('compliant', views_decorator_fqn_null.compliant, name='compliant'), path('compliant_require_post', views.compliant_require_post, name='compliant_require_post'), path('compliant_require_get', views.compliant_require_get, name='compliant_require_get'), path('compliant_require_safe', views.compliant_require_safe, name='compliant_require_safe'), - path('sensitive_other_dec', views.sensitive_other_dec, name='sensitive_other_dec'), + path('compliant_method_eq_check', views.compliant_method_eq_check, name='compliant_method_eq_check'), + path('compliant_method_eq_check_swapped', views.compliant_method_eq_check_swapped, name='compliant_method_eq_check_swapped'), + path('compliant_method_in_check', views.compliant_method_in_check, name='compliant_method_in_check'), + path('compliant_method_check_and_condition', views.compliant_method_check_and_condition, name='compliant_method_check_and_condition'), + path('compliant_method_check_parenthesized', views.compliant_method_check_parenthesized, name='compliant_method_check_parenthesized'), + path('compliant_method_check_elif', views.compliant_method_check_elif, name='compliant_method_check_elif'), + path('compliant_method_check_in_nested_scope', views.compliant_method_check_in_nested_scope, name='compliant_method_check_in_nested_scope'), + path('noncompliant_nested_function', views.noncompliant_nested_function, name='noncompliant_nested_function'), + path('noncompliant_lambda', views.noncompliant_lambda, name='noncompliant_lambda'), + path('noncompliant1', views.noncompliant1, name='noncompliant1'), + path('noncompliant_other_dec', views.noncompliant_other_dec, name='noncompliant_other_dec'), + path('noncompliant_login_required', views.noncompliant_login_required, name='noncompliant_login_required'), + path('noncompliant_permission_required', views.noncompliant_permission_required, name='noncompliant_permission_required'), + path('noncompliant_method_on_other_var', views.noncompliant_method_on_other_var, name='noncompliant_method_on_other_var'), + path('noncompliant_method_on_different_var', views.noncompliant_method_on_different_var, name='noncompliant_method_on_different_var'), + path('noncompliant_other_if_eq_check', views.noncompliant_other_if_eq_check, name='noncompliant_other_if_eq_check'), + path('noncompliant_method_truthy_check', views.noncompliant_method_truthy_check, name='noncompliant_method_truthy_check'), + path('noncompliant_method_and_check', views.noncompliant_method_and_check, name='noncompliant_method_and_check'), + path('noncompliant_method_only_printed', views.noncompliant_method_only_printed, name='noncompliant_method_only_printed'), + path('noncompliant_method_comparison_not_in_if', views.noncompliant_method_comparison_not_in_if, name='noncompliant_method_comparison_not_in_if'), + path('noncompliant_request_used_as_argument', views.noncompliant_request_used_as_argument, name='noncompliant_request_used_as_argument'), + path('noncompliant_tuple_param_only', views.noncompliant_tuple_param_only, name='noncompliant_tuple_param_only'), ] diff --git a/python-checks/src/test/resources/checks/hotspots/unsafeHttpMethods/django/views.py b/python-checks/src/test/resources/checks/hotspots/unsafeHttpMethods/django/views.py index 66b1b24d8..e33f37dcd 100644 --- a/python-checks/src/test/resources/checks/hotspots/unsafeHttpMethods/django/views.py +++ b/python-checks/src/test/resources/checks/hotspots/unsafeHttpMethods/django/views.py @@ -1,7 +1,6 @@ from django.views.decorators.http import require_http_methods, require_POST, require_GET, require_safe, other_decorator - -def sensitive1(request): # Noncompliant - ... +from django.contrib.auth.decorators import login_required, permission_required +from some_framework import view_decorator @require_http_methods(["GET", "POST"]) # Compliant - methods explicitly specified def compliant_explicit_methods(request): @@ -14,6 +13,7 @@ def compliant_require_http_methods(request): @require_http_methods(["GET"]) # Compliant def compliant_require_http_methods2(request): ... + @require_http_methods() # Compliant def compliant_require_http_methods3(request): ... @@ -23,8 +23,12 @@ def compliant_require_http_methods3(request): def compliant_require_http_methods4(request): ... +@view_decorator # Compliant: non-django unresolved import may restrict HTTP methods +def compliant_non_django_import(request): + ... + @unknown(["GET", "POST"]) -def compliant_require_http_methods5(request): # Compliant: Unknown decorrator might rerstrict allowed HTTP verbs +def compliant_require_http_methods5(request): # Compliant: Unknown decorator might restrict allowed HTTP verbs ... def foo(): ... @@ -43,8 +47,98 @@ def compliant_require_get(request): @require_safe # Compliant def compliant_require_safe(request): ... + +def compliant_method_eq_check(request): # Compliant: method check in body + if request.method == "POST": + ... + +def compliant_method_eq_check_swapped(request): # Compliant: operands swapped but still a method check + if "POST" == request.method: + ... + +def compliant_method_in_check(request): # Compliant: method check in body + if request.method in ["GET", "POST"]: + ... + +def compliant_method_check_and_condition(request): # Compliant: method check nested in boolean if condition + if request.user.is_authenticated and request.method == "POST": + ... + +def compliant_method_check_parenthesized(request): # Compliant: comparison wrapped in parentheses + if (request.method == "POST"): + ... + +def compliant_method_check_elif(request): # Compliant: method check in elif + if request.user.is_staff: + return "staff" + elif request.method == "GET": + ... + +def compliant_method_check_in_nested_scope(request): # Compliant: outer request captured by nested scope, method is checked + def inner(): + if request.method == "POST": + ... + inner() + +def noncompliant_nested_function(request, something_else): # Noncompliant + def helper(request): + if request.method == "POST": + ... + helper(something_else) + +def noncompliant_lambda(request): # Noncompliant + _ = lambda req: req.method == "POST" + ... + +def noncompliant1(request): # Noncompliant + ... + @other_decorator -def sensitive_other_dec(request): # Noncompliant +def noncompliant_other_dec(request): # Noncompliant + ... + +@login_required +def noncompliant_login_required(request): # Noncompliant + ... + +@permission_required("app.permission") +def noncompliant_permission_required(request): # Noncompliant + ... + +def noncompliant_method_on_other_var(request): # Noncompliant + _ = request.session + ... + +def noncompliant_method_on_different_var(request): # Noncompliant + if another.method == "POST": + ... + +def noncompliant_other_if_eq_check(request): # Noncompliant + if request.user.is_authenticated == True: + ... + +def noncompliant_method_truthy_check(request): # Noncompliant + if request.method: + ... + +def noncompliant_method_and_check(request): # Noncompliant + if request.method and request.user.is_authenticated: + ... + +def noncompliant_method_only_printed(request): # Noncompliant + print(request.method) + ... + +def noncompliant_method_comparison_not_in_if(request): # Noncompliant + _ = request.method == "POST" + ... + +def noncompliant_request_used_as_argument(request): # Noncompliant + do_something(request) + ... + +# Artificial test for Python 2-style tuple parameters: nonTuple() is empty so request.method cannot be checked +def noncompliant_tuple_param_only((a, b)): # Noncompliant ... def other(request): From f0e2839b80145bd6d9d311ea1b0a52e204767a1c Mon Sep 17 00:00:00 2001 From: Guillaume Dequenne Date: Tue, 26 May 2026 09:13:14 +0200 Subject: [PATCH 129/322] Update rule metadata GitOrigin-RevId: d0d628c135e02654fa69e0fb6f32fd95cbd0af3d --- .../org/sonar/l10n/py/rules/python/S3752.html | 94 ++++++---------- .../org/sonar/l10n/py/rules/python/S3752.json | 9 +- .../org/sonar/l10n/py/rules/python/S5122.html | 2 +- .../org/sonar/l10n/py/rules/python/S5247.json | 3 +- .../org/sonar/l10n/py/rules/python/S6333.html | 103 ++++++++---------- .../org/sonar/l10n/py/rules/python/S6333.json | 10 +- .../org/sonar/l10n/py/rules/python/S8392.html | 2 +- .../org/sonar/l10n/py/rules/python/S8397.html | 4 +- .../org/sonar/l10n/py/rules/python/S8411.html | 26 ++--- .../org/sonar/l10n/py/rules/python/S8508.html | 2 +- sonarpedia.json | 2 +- 11 files changed, 110 insertions(+), 147 deletions(-) diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S3752.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S3752.html index 828b11e50..c9afa18f9 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S3752.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S3752.html @@ -1,78 +1,46 @@ -

                An HTTP method is safe when used to perform a read-only operation, such as retrieving information. In contrast, an unsafe HTTP method is used to -change the state of an application, for instance to update a user’s profile on a web application.

                -

                Common safe HTTP methods are GET, HEAD, or OPTIONS.

                -

                Common unsafe HTTP methods are POST, PUT and DELETE.

                -

                Allowing both safe and unsafe HTTP methods to perform a specific operation on a web application could impact its security, for example CSRF -protections are most of the time only protecting operations performed by unsafe HTTP methods.

                -

                Ask Yourself Whether

                -
                  -
                • HTTP methods are not defined at all for a route/controller of the application.
                • -
                • Safe HTTP methods are defined and used for a route/controller that can change the state of an application.
                • -
                -

                There is a risk if you answered yes to any of those questions.

                -

                Recommended Secure Coding Practices

                -

                For all the routes/controllers of an application, the authorized HTTP methods should be explicitly defined and safe HTTP methods should only be -used to perform read-only operations.

                -

                Sensitive Code Example

                -

                For Django:

                -
                +

                HTTP routes that do not explicitly restrict which HTTP methods are allowed accept both safe (read-only) and unsafe (state-changing) methods, which +can expose the application to CSRF attacks.

                +

                Why is this an issue?

                +

                HTTP methods are divided into safe methods (GET, HEAD, OPTIONS), which are intended for read-only operations, and unsafe methods (POST, PUT, +DELETE), which are intended for state-changing operations. When a route does not restrict which methods it accepts, an attacker can trigger +state-changing behavior through a safe method such as GET. CSRF protections typically only apply to unsafe methods, so a route that accepts both can +be exploited via a crafted link or image tag without requiring the attacker to bypass CSRF defenses.

                +

                What is the potential impact?

                +

                Cross-Site Request Forgery

                +

                An attacker can craft a malicious link or page that causes a victim’s browser to issue a state-changing HTTP request to the vulnerable route. +Because the request originates from the victim’s authenticated session, the server processes it as legitimate, allowing the attacker to perform +actions such as deleting records, changing account settings, or initiating transactions on behalf of the victim.

                +

                How to fix it in Django

                +

                Code examples

                +

                The following noncompliant example shows a route that applies no method restriction, allowing any HTTP verb to trigger state-changing behavior. +Each compliant example restricts the route to only the methods appropriate for its purpose.

                +

                Noncompliant code example

                +
                 # No method restriction
                -def view(request):  # Sensitive
                -    return HttpResponse("...")
                -
                -
                -@require_http_methods(["GET", "POST"])  # Sensitive
                -def view(request):
                +def view(request):  # Noncompliant
                     return HttpResponse("...")
                 
                -

                For Flask:

                -
                -@methods.route('/sensitive', methods=['GET', 'POST'])  # Sensitive
                -def view():
                -    return Response("...", 200)
                -
                -

                Compliant Solution

                -

                For Django:

                -
                +

                Compliant solution

                +
                 @require_http_methods(["POST"])
                 def view(request):
                     return HttpResponse("...")
                 
                -
                -@require_POST
                -def view(request):
                -    return HttpResponse("...")
                -
                -
                -@require_GET
                -def view(request):
                -    return HttpResponse("...")
                -
                -
                -@require_safe
                -def view(request):
                -    return HttpResponse("...")
                -
                -

                For Flask:

                -
                -@methods.route('/compliant1')
                -def view():
                -    return Response("...", 200)
                -
                -
                -@methods.route('/compliant2', methods=['GET'])
                -def view():
                -    return Response("...", 200)
                -
                -

                See

                +

                Resources

                +

                Documentation

                +
                  +
                • Django - Allowed HTTP Methods
                • +
                +

                Articles & blog posts

                +
                  +
                • OWASP - Cross-Site Request Forgery
                • +
                +

                Standards

                diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S3752.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S3752.json index 81ad61671..0a4cc1cc7 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S3752.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S3752.json @@ -1,6 +1,6 @@ { - "title": "Allowing both safe and unsafe HTTP methods is security-sensitive", - "type": "SECURITY_HOTSPOT", + "title": "HTTP routes should restrict allowed HTTP methods", + "type": "VULNERABILITY", "code": { "impacts": { "SECURITY": "LOW" @@ -8,14 +8,15 @@ "attribute": "COMPLETE" }, "status": "ready", + "quickfix": "unknown", "remediation": { "func": "Constant\/Issue", "constantCost": "5min" }, "tags": [ "cwe", - "flask", - "django" + "django", + "former-hotspot" ], "defaultSeverity": "Minor", "ruleSpecification": "RSPEC-3752", diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5122.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5122.html index 5fb61e713..e6b143614 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5122.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5122.html @@ -81,6 +81,6 @@

                Standards

              • OWASP - Top 10 2017 Category A6 - Security Misconfiguration
              • CWE - CWE-346 - Origin Validation Error
              • -
              • CWE - CWE-942 - Overly Permissive Cross-domain Whitelist
              • +
              • CWE - CWE-942 - Permissive Cross-domain Security Policy with Untrusted Domains
              diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5247.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5247.json index 3df7bfb86..b3e90ed2a 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5247.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5247.json @@ -14,8 +14,7 @@ }, "tags": [ "cwe", - "django", - "former-hotspot" + "django" ], "defaultSeverity": "Major", "ruleSpecification": "RSPEC-5247", diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6333.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6333.html index 0023c29e2..e3689bf1d 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6333.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6333.html @@ -1,89 +1,82 @@ -

              Creating APIs without authentication unnecessarily increases the attack surface on the target infrastructure.

              -

              Unless another authentication method is used, attackers have the opportunity to attempt attacks against the underlying API. -
              - This means attacks both on the functionality provided by the API and its infrastructure.

              -

              Ask Yourself Whether

              -
                -
              • The underlying API exposes all of its contents to any anonymous Internet user.
              • -
              -

              There is a risk if you answered yes to this question.

              -

              Recommended Secure Coding Practices

              -

              In general, prefer limiting API access to a specific set of people or entities.

              -

              AWS provides multiple methods to do so:

              -
                -
              • AWS_IAM, to use standard AWS IAM roles and policies.
              • -
              • COGNITO_USER_POOLS, to use customizable OpenID Connect (OIDC) identity providers (IdP).
              • -
              • CUSTOM, to use an AWS-independant OIDC provider, glued to the infrastructure with a Lambda authorizer.
              • -
              -

              Sensitive Code Example

              +

              Creating AWS API Gateway resources without enforcing authentication exposes the underlying API to any anonymous internet user.

              +

              Why is this an issue?

              +

              Unless an authentication method is explicitly configured, AWS API Gateway allows any internet user to call the API without proving their identity. +This unnecessarily increases the attack surface, giving unauthenticated actors the opportunity to target both the functionality provided by the API +and its underlying infrastructure.

              +

              What is the potential impact?

              +

              Unauthorized access

              +

              An unauthenticated API endpoint can be reached by any internet user without proving their identity. Attackers may abuse the exposed functionality +to extract sensitive data, trigger resource-intensive operations, or exploit other vulnerabilities in the backend infrastructure.

              +

              How to fix it in AWS API Gateway

              +

              Code examples

              +

              The following examples show API Gateway resources configured without authentication, allowing access by any internet user.

              For aws_cdk.aws_apigateway.Resource:

              -
              +

              Noncompliant code example

              +
               from aws_cdk import (
                   aws_apigateway as apigateway
               )
               
               resource = api.root.add_resource("example")
               resource.add_method(
              -    "GET",
              -    authorization_type=apigateway.AuthorizationType.NONE  # Sensitive
              -)
              -
              -

              For aws_cdk.aws_apigatewayv2.CfnRoute:

              -
              -from aws_cdk import (
              -    aws_apigatewayv2 as apigateway
              -)
              -
              -apigateway.CfnRoute(
              -    self,
              -    "no-auth",
              -    api_id=api.ref,
              -    route_key="GET /test",
              -    authorization_type="NONE"  # Sensitive
              +    "POST",
              +    authorization_type=apigateway.AuthorizationType.NONE  # Noncompliant
               )
               
              -

              Compliant Solution

              -

              For aws_cdk.aws_apigateway.Resource:

              -
              +

              Compliant solution

              +
               from aws_cdk import (
                   aws_apigateway as apigateway
               )
               
              -opts = apigateway.MethodOptions(
              -    authorization_type=apigateway.AuthorizationType.IAM
              -)
              -resource = api.root.add_resource(
              -    "example",
              -    default_method_options=opts
              -)
              +resource = api.root.add_resource("example")
               resource.add_method(
                   "POST",
                   authorization_type=apigateway.AuthorizationType.IAM
               )
              -resource.add_method(  # authorization_type is inherited from the Resource's configured default_method_options
              -    "POST"
              -)
               
              +

              How to fix it in AWS API Gateway V2

              +

              Code examples

              +

              The following examples show API Gateway resources configured without authentication, allowing access by any internet user.

              For aws_cdk.aws_apigatewayv2.CfnRoute:

              -
              +

              Noncompliant code example

              +
              +from aws_cdk import (
              +    aws_apigatewayv2 as apigateway
              +)
              +
              +apigateway.CfnRoute(
              +    self,
              +    "update",
              +    api_id=api.ref,
              +    route_key="POST /update",
              +    authorization_type="NONE"  # Noncompliant
              +)
              +
              +

              Compliant solution

              +
               from aws_cdk import (
                   aws_apigatewayv2 as apigateway
               )
               
               apigateway.CfnRoute(
                   self,
              -    "auth",
              +    "update",
                   api_id=api.ref,
              -    route_key="GET /test",
              +    route_key="POST /update",
                   authorization_type="AWS_IAM"
               )
               
              -

              See

              +

              Resources

              +

              Documentation

              +

              Standards

              + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6333.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6333.json index 31f549fd2..c117decd1 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6333.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6333.json @@ -1,6 +1,6 @@ { - "title": "Creating public APIs is security-sensitive", - "type": "SECURITY_HOTSPOT", + "title": "AWS API Gateway should require authentication", + "type": "VULNERABILITY", "code": { "impacts": { "SECURITY": "BLOCKER" @@ -8,13 +8,15 @@ "attribute": "COMPLETE" }, "status": "ready", + "quickfix": "unknown", "remediation": { "func": "Constant\/Issue", "constantCost": "15min" }, "tags": [ "aws", - "cwe" + "cwe", + "former-hotspot" ], "defaultSeverity": "Blocker", "ruleSpecification": "RSPEC-6333", @@ -22,7 +24,7 @@ "scope": "Main", "securityStandards": { "CWE": [ - 284 + 306 ], "PCI DSS 3.2": [ "6.5.8" diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8392.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8392.html index 93a01a1f4..4409bf3ed 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8392.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8392.html @@ -111,7 +111,7 @@

              Documentation

              • FastAPI Documentation - Deployment Concepts - Official FastAPI documentation on deployment concepts, including network binding considerations
              • -
              • Uvicorn Documentation - Deployment - Uvicorn server documentation on deployment and configuration +
              • Uvicorn Documentation - Deployment - Uvicorn server documentation on deployment and configuration options
              • FastAPI CLI Documentation - Documentation explaining the difference between development (127.0.0.1) and production (0.0.0.0) binding
              • diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8397.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8397.html index 65c2a4d0d..c68e8de9f 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8397.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8397.html @@ -69,11 +69,11 @@

                Compliant solution

                Resources

                Documentation

                diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8411.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8411.html index 0568b0ea3..cdc9d753d 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8411.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8411.html @@ -11,10 +11,10 @@

                Why is this an issue?

                arguments. When a request comes in, FastAPI extracts the values from the URL path and injects them into the function call.

                When path parameters are missing from the function signature, several problems occur:

                  -
                • The parameter values cannot be accessed in the function body, making it impossible to use them for business logic
                • -
                • FastAPI cannot perform automatic validation and type conversion on the parameter
                • -
                • The application will raise a runtime error when the route is accessed
                • -
                • The mismatch between the route definition and function signature indicates a programming error
                • +
                • The parameter values cannot be accessed in the function body, making it impossible to use them for business logic
                • +
                • FastAPI cannot perform automatic validation and type conversion on the parameter
                • +
                • The application will raise a runtime error when the route is accessed
                • +
                • The mismatch between the route definition and function signature indicates a programming error

                Additionally, if a path parameter is declared as a positional-only argument (using / in the function signature), FastAPI cannot inject it because the framework uses keyword arguments for parameter injection. This is a subtle but important constraint of how FastAPI’s dependency @@ -24,10 +24,10 @@

                Why is this an issue?

                What is the potential impact?

                When path parameters are missing from the function signature, the application will fail at runtime when the route is accessed. This causes:

                  -
                • Service disruption: The endpoint becomes completely non-functional, returning HTTP 500 errors to clients
                • -
                • Poor user experience: Users receive error responses instead of the expected data or functionality
                • -
                • Debugging difficulty: The error may not be immediately obvious, especially if the route is not covered by tests
                • -
                • Maintenance burden: Developers must spend time investigating and fixing runtime errors that could have been prevented
                • +
                • Service disruption: The endpoint becomes completely non-functional, returning HTTP 500 errors to clients
                • +
                • Poor user experience: Users receive error responses instead of the expected data or functionality
                • +
                • Debugging difficulty: The error may not be immediately obvious, especially if the route is not covered by tests
                • +
                • Maintenance burden: Developers must spend time investigating and fixing runtime errors that could have been prevented

                The impact is particularly severe because this is a complete failure of the endpoint - there is no graceful degradation or partial functionality. Every request to the affected route will fail until the code is corrected and redeployed.

                @@ -124,13 +124,13 @@

                Compliant solution

                Resources

                Documentation

                Related rules

                  -
                • {rule:python:S6856} - Similar rule for Java Spring framework path variables
                • +
                • {rule:python:S6856} - Similar rule for Java Spring framework path variables
                diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8508.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8508.html index 1fd2175d4..e634ff928 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8508.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8508.html @@ -80,7 +80,7 @@

                Documentation

                External coding guidelines

                Related rules

                  diff --git a/sonarpedia.json b/sonarpedia.json index b8c12a894..0268a3508 100644 --- a/sonarpedia.json +++ b/sonarpedia.json @@ -3,7 +3,7 @@ "languages": [ "PY" ], - "latest-update": "2026-05-06T08:41:50.337723Z", + "latest-update": "2026-05-26T08:35:55.912839Z", "options": { "no-language-in-filenames": true, "preserve-filenames": true From 23fe38d955d17cc4054645e2ebe3815ea4a67f7a Mon Sep 17 00:00:00 2001 From: Guillaume Dequenne Date: Wed, 27 May 2026 09:59:46 +0200 Subject: [PATCH 130/322] Add telemetry when test file heuristics is triggered GitOrigin-RevId: 18b7e434386d8d9f5ffac9dfbcdf0b754418d70c --- .../sonar/plugins/python/PythonScanner.java | 4 ++ .../sonar/plugins/python/PythonSensor.java | 1 + .../python/telemetry/TelemetryMetricKey.java | 3 +- .../plugins/python/PythonSensorTest.java | 43 +++++++++++++++++++ 4 files changed, 50 insertions(+), 1 deletion(-) diff --git a/python-commons/src/main/java/org/sonar/plugins/python/PythonScanner.java b/python-commons/src/main/java/org/sonar/plugins/python/PythonScanner.java index ace6d532f..d2963fe11 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/PythonScanner.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/PythonScanner.java @@ -445,6 +445,10 @@ public TestFileTelemetry getTestFileTelemetry() { return testFileTelemetryCollector.getTelemetry(); } + public boolean wasTestFileHeuristicTriggered() { + return heuristicWarningEmitted.get(); + } + private void runLockedByRepository(String repositoryKey, Runnable runnable) { var repositoryLock = repositoryLocks.computeIfAbsent(repositoryKey, k -> new ReentrantLock()); try { diff --git a/python-commons/src/main/java/org/sonar/plugins/python/PythonSensor.java b/python-commons/src/main/java/org/sonar/plugins/python/PythonSensor.java index dede0e2ac..79079be5f 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/PythonSensor.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/PythonSensor.java @@ -218,6 +218,7 @@ private void updateTestFileTelemetry(PythonScanner scanner) { sensorTelemetryStorage.updateMetric(TelemetryMetricKey.PYTHON_MAIN_LINES_MISCLASSIFIED_IMPORT_BASED_ONLY, telemetry.linesInImportBasedOnly()); sensorTelemetryStorage.updateMetric(TelemetryMetricKey.PYTHON_MAIN_FILES_MISCLASSIFIED_PATH_BASED_ONLY, telemetry.filesInPathBasedOnly()); sensorTelemetryStorage.updateMetric(TelemetryMetricKey.PYTHON_MAIN_LINES_MISCLASSIFIED_PATH_BASED_ONLY, telemetry.linesInPathBasedOnly()); + sensorTelemetryStorage.updateMetric(TelemetryMetricKey.PYTHON_TEST_FILE_HEURISTIC_TRIGGERED, scanner.wasTestFileHeuristicTriggered()); } private void updateNamespacePackageTelemetry(PythonIndexer pythonIndexer) { diff --git a/python-commons/src/main/java/org/sonar/plugins/python/telemetry/TelemetryMetricKey.java b/python-commons/src/main/java/org/sonar/plugins/python/telemetry/TelemetryMetricKey.java index 9884426af..802464561 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/telemetry/TelemetryMetricKey.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/telemetry/TelemetryMetricKey.java @@ -74,7 +74,8 @@ public enum TelemetryMetricKey { PYTHON_MAIN_LINES_MISCLASSIFIED_IMPORT_BASED_ONLY("python.lines.main.misclassified_import_based_only"), PYTHON_MAIN_FILES_MISCLASSIFIED_PATH_BASED_ONLY("python.files.main.misclassified_path_based_only"), PYTHON_MAIN_LINES_MISCLASSIFIED_PATH_BASED_ONLY("python.lines.main.misclassified_path_based_only"), - PYTHON_SONAR_TESTS_SET("python.sonar_tests.set"); + PYTHON_SONAR_TESTS_SET("python.sonar_tests.set"), + PYTHON_TEST_FILE_HEURISTIC_TRIGGERED("python.test_file_heuristic.triggered"); private final String key; diff --git a/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java index 26190b7d8..1fee67737 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java @@ -1769,6 +1769,49 @@ void send_telemetry_sonar_tests_not_set() { verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_SONAR_TESTS_SET.key(), "0"); } + @Test + void send_telemetry_heuristic_triggered_when_file_reclassified() { + activeRules = new ActiveRulesBuilder() + .addRule(new NewActiveRule.Builder() + .setRuleKey(RuleKey.of(PythonRuleRepository.REPOSITORY_KEY, "S930")) + .build()) + .build(); + + inputFile(FILE_TEST_FILE, Type.MAIN); + var contextSpy = spy(context); + sensor().execute(contextSpy); + verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_TEST_FILE_HEURISTIC_TRIGGERED.key(), "1"); + } + + @Test + void send_telemetry_heuristic_not_triggered_when_no_file_reclassified() { + activeRules = new ActiveRulesBuilder() + .addRule(new NewActiveRule.Builder() + .setRuleKey(RuleKey.of(PythonRuleRepository.REPOSITORY_KEY, "S930")) + .build()) + .build(); + + inputFile(FILE_1); + var contextSpy = spy(context); + sensor().execute(contextSpy); + verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_TEST_FILE_HEURISTIC_TRIGGERED.key(), "0"); + } + + @Test + void send_telemetry_heuristic_not_triggered_when_heuristic_inactive() { + activeRules = new ActiveRulesBuilder() + .addRule(new NewActiveRule.Builder() + .setRuleKey(RuleKey.of(PythonRuleRepository.REPOSITORY_KEY, "S930")) + .build()) + .build(); + + context.setSettings(new MapSettings().setProperty("sonar.tests", "tests")); + inputFile(FILE_TEST_FILE, Type.MAIN); + var contextSpy = spy(context); + sensor().execute(contextSpy); + verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_TEST_FILE_HEURISTIC_TRIGGERED.key(), "0"); + } + @Test void detects_databricks() { activeRules = new ActiveRulesBuilder() From 71bd7ebdcb21b97c9d7533b71bd0119307a53b04 Mon Sep 17 00:00:00 2001 From: Guillaume Dequenne Date: Wed, 27 May 2026 11:38:59 +0200 Subject: [PATCH 131/322] Add additional telemetry around caching GitOrigin-RevId: 2972fab863c741e6db6557b5cded6ff5f265e061 --- .../sonar/plugins/python/PythonScanner.java | 6 +++ .../sonar/plugins/python/PythonSensor.java | 9 ++++ .../plugins/python/indexer/PythonIndexer.java | 4 ++ .../indexer/SonarQubePythonIndexer.java | 7 +++ .../python/telemetry/TelemetryMetricKey.java | 4 +- .../plugins/python/PythonSensorTest.java | 46 +++++++++++++++++++ 6 files changed, 75 insertions(+), 1 deletion(-) diff --git a/python-commons/src/main/java/org/sonar/plugins/python/PythonScanner.java b/python-commons/src/main/java/org/sonar/plugins/python/PythonScanner.java index d2963fe11..54d25a1d2 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/PythonScanner.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/PythonScanner.java @@ -90,6 +90,7 @@ public class PythonScanner extends Scanner { private final boolean testSourcesConfigured; private final AnalysisWarningsWrapper analysisWarnings; private final AtomicBoolean heuristicWarningEmitted = new AtomicBoolean(false); + private volatile int filesScannedWithCache = 0; static final String UNSET_SONAR_TESTS_WARNING = "SonarPython detected files that look like test code " + "but 'sonar.tests' is not configured. Rules targeting production code were not executed on these files. " + "Configure 'sonar.tests' in your project properties for a more accurate analysis."; @@ -415,6 +416,7 @@ public boolean canBeScannedWithoutParsing(PythonInputFile inputFile) { @Override protected void reportStatistics(int numSkippedFiles, int numTotalFiles) { + filesScannedWithCache = numSkippedFiles; LOG.info(""" The Python analyzer was able to leverage cached data from previous analyses for {} out of {} files. These files were not \ parsed.""", @@ -449,6 +451,10 @@ public boolean wasTestFileHeuristicTriggered() { return heuristicWarningEmitted.get(); } + public int getFilesScannedWithCache() { + return filesScannedWithCache; + } + private void runLockedByRepository(String repositoryKey, Runnable runnable) { var repositoryLock = repositoryLocks.computeIfAbsent(repositoryKey, k -> new ReentrantLock()); try { diff --git a/python-commons/src/main/java/org/sonar/plugins/python/PythonSensor.java b/python-commons/src/main/java/org/sonar/plugins/python/PythonSensor.java index 79079be5f..903872f0d 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/PythonSensor.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/PythonSensor.java @@ -161,6 +161,7 @@ public void execute(SensorContext context) { updateDatabricksTelemetry(scanner); updateTypeInferenceTelemetry(scanner); updateTestFileTelemetry(scanner); + updateCacheAnalysisTelemetry(context, pythonIndexer, scanner); sensorTelemetryStorage.updateMetric(TelemetryMetricKey.NOSONAR_RULE_ID_KEY, noSonarLineInfoCollector.getSuppressedRuleIds()); sensorTelemetryStorage.updateMetric(TelemetryMetricKey.NOSONAR_COMMENTS_KEY, noSonarLineInfoCollector.getCommentWithExactlyOneRuleSuppressed()); updateNamespacePackageTelemetry(pythonIndexer); @@ -279,6 +280,14 @@ private void updateBuildSystemTelemetry(NamespacePackageTelemetry telemetry) { buildSystem == PackageResolutionResult.BuildSystem.FLIT ? 1 : 0); } + private void updateCacheAnalysisTelemetry(SensorContext context, PythonIndexer indexer, PythonScanner scanner) { + if (context.runtime().getProduct() == SonarProduct.SONARLINT) { + return; + } + sensorTelemetryStorage.updateMetric(TelemetryMetricKey.PYTHON_ANALYSIS_USES_CACHE, indexer.isAnalysisOptimized()); + sensorTelemetryStorage.updateMetric(TelemetryMetricKey.PYTHON_FILES_SCANNED_WITH_CACHE, scanner.getFilesScannedWithCache()); + } + private void updateSonarTestsTelemetry(SensorContext context) { if (context.runtime().getProduct() == SonarProduct.SONARLINT) { return; diff --git a/python-commons/src/main/java/org/sonar/plugins/python/indexer/PythonIndexer.java b/python-commons/src/main/java/org/sonar/plugins/python/indexer/PythonIndexer.java index ce32b5bfa..4348b41a6 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/indexer/PythonIndexer.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/indexer/PythonIndexer.java @@ -206,6 +206,10 @@ public boolean canBeFullyScannedWithoutParsing(PythonInputFile inputFile) { public abstract CacheContext cacheContext(); + public boolean isAnalysisOptimized() { + return false; + } + public void writeEffectiveFileType(String fileKey, InputFile.Type type) { } diff --git a/python-commons/src/main/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexer.java b/python-commons/src/main/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexer.java index a0f2c576e..3df2847de 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexer.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexer.java @@ -55,6 +55,7 @@ public class SonarQubePythonIndexer extends PythonIndexer { private final Caching caching; private final boolean testSourcesConfigured; + private boolean analysisOptimized = false; private final Set fullySkippableFiles = new HashSet<>(); private final Set partiallySkippableFiles = new HashSet<>(); private final List inputFiles = new ArrayList<>(); @@ -81,6 +82,7 @@ public void buildOnce(SensorContext context) { analyzeNamespacePackages(projectTree); if (shouldOptimizeAnalysis(context)) { + analysisOptimized = true; computeGlobalSymbolsUsingCache(context); return; } @@ -99,6 +101,11 @@ public void postAnalysis(SensorContext context) { } } + @Override + public boolean isAnalysisOptimized() { + return analysisOptimized; + } + private boolean shouldOptimizeAnalysis(SensorContext context) { return caching.isCacheEnabled() && (context.canSkipUnchangedFiles() || context.config().getBoolean(SONAR_CAN_SKIP_UNCHANGED_FILES_KEY).orElse(false)) diff --git a/python-commons/src/main/java/org/sonar/plugins/python/telemetry/TelemetryMetricKey.java b/python-commons/src/main/java/org/sonar/plugins/python/telemetry/TelemetryMetricKey.java index 802464561..c9d92cf24 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/telemetry/TelemetryMetricKey.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/telemetry/TelemetryMetricKey.java @@ -75,7 +75,9 @@ public enum TelemetryMetricKey { PYTHON_MAIN_FILES_MISCLASSIFIED_PATH_BASED_ONLY("python.files.main.misclassified_path_based_only"), PYTHON_MAIN_LINES_MISCLASSIFIED_PATH_BASED_ONLY("python.lines.main.misclassified_path_based_only"), PYTHON_SONAR_TESTS_SET("python.sonar_tests.set"), - PYTHON_TEST_FILE_HEURISTIC_TRIGGERED("python.test_file_heuristic.triggered"); + PYTHON_TEST_FILE_HEURISTIC_TRIGGERED("python.test_file_heuristic.triggered"), + PYTHON_ANALYSIS_USES_CACHE("python.analysis.uses_cache"), + PYTHON_FILES_SCANNED_WITH_CACHE("python.files.scanned_with_cache"); private final String key; diff --git a/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java index 1fee67737..5ce779d7a 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java @@ -1812,6 +1812,52 @@ void send_telemetry_heuristic_not_triggered_when_heuristic_inactive() { verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_TEST_FILE_HEURISTIC_TRIGGERED.key(), "0"); } + @Test + void send_telemetry_analysis_uses_cache_when_optimization_active() throws IOException { + activeRules = new ActiveRulesBuilder() + .addRule(new NewActiveRule.Builder() + .setRuleKey(RuleKey.of(PythonRuleRepository.REPOSITORY_KEY, "S930")) + .build()) + .build(); + + PythonInputFile inputFile = inputFile(FILE_2, Type.MAIN, InputFile.Status.SAME); + TestReadCache readCache = getValidReadCache(); + TestWriteCache writeCache = new TestWriteCache(); + writeCache.bind(readCache); + byte[] serializedSymbolTable = toProtobufModuleDescriptor(Set.of(new VariableDescriptor("x", "main.x", null))).toByteArray(); + CpdSerializer.SerializationResult cpdTokens = CpdSerializer.serialize(Collections.emptyList()); + readCache.put(importsMapCacheKey(inputFile.wrappedFile().key()), String.join(";", Collections.emptyList()).getBytes(UTF_8)); + readCache.put(projectSymbolTableCacheKey(inputFile.wrappedFile().key()), serializedSymbolTable); + readCache.put(CPD_TOKENS_CACHE_KEY_PREFIX + inputFile.wrappedFile().key(), cpdTokens.data); + readCache.put(CPD_TOKENS_STRING_TABLE_KEY_PREFIX + inputFile.wrappedFile().key(), cpdTokens.stringTable); + readCache.put(fileContentHashCacheKey(inputFile.wrappedFile().key()), inputFile.wrappedFile().md5Hash().getBytes(UTF_8)); + readCache.put(effectiveFileTypeCacheKey(inputFile.wrappedFile().key()), "MAIN".getBytes(UTF_8)); + context.setPreviousCache(readCache); + context.setNextCache(writeCache); + context.setCacheEnabled(true); + context.setSettings(new MapSettings().setProperty("sonar.python.skipUnchanged", true)); + + var contextSpy = spy(context); + sensor().execute(contextSpy); + verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_ANALYSIS_USES_CACHE.key(), "1"); + verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_FILES_SCANNED_WITH_CACHE.key(), "1"); + } + + @Test + void send_telemetry_analysis_not_uses_cache_when_no_optimization() { + activeRules = new ActiveRulesBuilder() + .addRule(new NewActiveRule.Builder() + .setRuleKey(RuleKey.of(PythonRuleRepository.REPOSITORY_KEY, "S930")) + .build()) + .build(); + + inputFile(FILE_1); + var contextSpy = spy(context); + sensor().execute(contextSpy); + verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_ANALYSIS_USES_CACHE.key(), "0"); + verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_FILES_SCANNED_WITH_CACHE.key(), "0"); + } + @Test void detects_databricks() { activeRules = new ActiveRulesBuilder() From ddc3d709889f51153a615d97008c165441c0aefa Mon Sep 17 00:00:00 2001 From: guillaume-dequenne <54781802+guillaume-dequenne@users.noreply.github.com> Date: Thu, 28 May 2026 07:59:13 +0000 Subject: [PATCH 132/322] Prepare for next development iteration GitOrigin-RevId: 27a22e89ca1acd0cd73ecea251f28d0347fb7d32 --- docs/pom.xml | 2 +- docs/python-custom-rules-example/pom.xml | 2 +- its/commons/pom.xml | 2 +- its/plugin/it-python-plugin-test/pom.xml | 2 +- its/plugin/pom.xml | 2 +- its/plugin/python-custom-rules-plugin/pom.xml | 2 +- its/pom.xml | 2 +- pom.xml | 2 +- python-checks-testkit/pom.xml | 2 +- python-checks/pom.xml | 2 +- python-commons/pom.xml | 2 +- python-frontend/pom.xml | 2 +- sonar-python-plugin/pom.xml | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/pom.xml b/docs/pom.xml index e1853524d..b67000062 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.python python - 5.23-SNAPSHOT + 5.24-SNAPSHOT docs diff --git a/docs/python-custom-rules-example/pom.xml b/docs/python-custom-rules-example/pom.xml index 6a9f460ce..9476de1fa 100644 --- a/docs/python-custom-rules-example/pom.xml +++ b/docs/python-custom-rules-example/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python docs - 5.23-SNAPSHOT + 5.24-SNAPSHOT python-custom-rules-example diff --git a/its/commons/pom.xml b/its/commons/pom.xml index 0faf4ce12..e5a45ab5f 100644 --- a/its/commons/pom.xml +++ b/its/commons/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python python-its - 5.23-SNAPSHOT + 5.24-SNAPSHOT Python :: ITs :: Commons diff --git a/its/plugin/it-python-plugin-test/pom.xml b/its/plugin/it-python-plugin-test/pom.xml index ce202f0eb..81e926dad 100644 --- a/its/plugin/it-python-plugin-test/pom.xml +++ b/its/plugin/it-python-plugin-test/pom.xml @@ -7,7 +7,7 @@ it-python-plugin org.sonarsource.python - 5.23-SNAPSHOT + 5.24-SNAPSHOT it-python-plugin-test diff --git a/its/plugin/pom.xml b/its/plugin/pom.xml index 6d2606084..a345c58d9 100644 --- a/its/plugin/pom.xml +++ b/its/plugin/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.python python-its - 5.23-SNAPSHOT + 5.24-SNAPSHOT diff --git a/its/plugin/python-custom-rules-plugin/pom.xml b/its/plugin/python-custom-rules-plugin/pom.xml index c4988d257..bb6322c88 100644 --- a/its/plugin/python-custom-rules-plugin/pom.xml +++ b/its/plugin/python-custom-rules-plugin/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python it-python-plugin - 5.23-SNAPSHOT + 5.24-SNAPSHOT python-custom-rules-plugin diff --git a/its/pom.xml b/its/pom.xml index beaf4709e..aa2e4ef9e 100644 --- a/its/pom.xml +++ b/its/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.python python - 5.23-SNAPSHOT + 5.24-SNAPSHOT python-its diff --git a/pom.xml b/pom.xml index b06840b77..9de70a896 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ org.sonarsource.python python - 5.23-SNAPSHOT + 5.24-SNAPSHOT pom Python diff --git a/python-checks-testkit/pom.xml b/python-checks-testkit/pom.xml index eb023561c..7a10abb1f 100644 --- a/python-checks-testkit/pom.xml +++ b/python-checks-testkit/pom.xml @@ -6,7 +6,7 @@ python org.sonarsource.python - 5.23-SNAPSHOT + 5.24-SNAPSHOT python-checks-testkit diff --git a/python-checks/pom.xml b/python-checks/pom.xml index e4dc37b7f..bea5cde95 100644 --- a/python-checks/pom.xml +++ b/python-checks/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.python python - 5.23-SNAPSHOT + 5.24-SNAPSHOT python-checks diff --git a/python-commons/pom.xml b/python-commons/pom.xml index 15cc0e5b9..6831b2ab7 100644 --- a/python-commons/pom.xml +++ b/python-commons/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python python - 5.23-SNAPSHOT + 5.24-SNAPSHOT python-commons diff --git a/python-frontend/pom.xml b/python-frontend/pom.xml index 2cc13e129..97ae9445c 100644 --- a/python-frontend/pom.xml +++ b/python-frontend/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python python - 5.23-SNAPSHOT + 5.24-SNAPSHOT python-frontend diff --git a/sonar-python-plugin/pom.xml b/sonar-python-plugin/pom.xml index 4cc80da4b..1c5f613ab 100644 --- a/sonar-python-plugin/pom.xml +++ b/sonar-python-plugin/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python python - 5.23-SNAPSHOT + 5.24-SNAPSHOT sonar-python-plugin From 89c4ee3c3762314814748633791bc5ca6ce2d689 Mon Sep 17 00:00:00 2001 From: Guillaume Dequenne Date: Thu, 28 May 2026 14:33:39 +0200 Subject: [PATCH 133/322] SONARPY-4204 Fix FP on S1940 when comparing frozenset values with not (A <= B) (#1128) GitOrigin-RevId: 6e701b010f859607f1f80ab3bf4e8b6bf1b4918e --- .../checks/BooleanCheckNotInvertedCheck.java | 3 +- .../checks/booleanCheckNotInverted.py | 36 ++++++++++++++++++- .../python/api/types/BuiltinTypes.java | 1 + 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/BooleanCheckNotInvertedCheck.java b/python-checks/src/main/java/org/sonar/python/checks/BooleanCheckNotInvertedCheck.java index 0c732194e..b25ed8b2e 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/BooleanCheckNotInvertedCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/BooleanCheckNotInvertedCheck.java @@ -157,6 +157,7 @@ private static boolean isSetComparison(BinaryExpression binaryExpression) { binaryExpression.leftOperand().type(), binaryExpression.rightOperand().type() ); - return inferredTypeSet.stream().anyMatch(inferredType -> inferredType.mustBeOrExtend(BuiltinTypes.SET)); + return inferredTypeSet.stream().anyMatch(inferredType -> + inferredType.mustBeOrExtend(BuiltinTypes.SET) || inferredType.mustBeOrExtend(BuiltinTypes.FROZENSET)); } } diff --git a/python-checks/src/test/resources/checks/booleanCheckNotInverted.py b/python-checks/src/test/resources/checks/booleanCheckNotInverted.py index bf4899ca9..3eca4a5d5 100644 --- a/python-checks/src/test/resources/checks/booleanCheckNotInverted.py +++ b/python-checks/src/test/resources/checks/booleanCheckNotInverted.py @@ -1,4 +1,4 @@ -from typing import Set, Any +from typing import Set, FrozenSet, Any a = 1 b = 2 @@ -126,3 +126,37 @@ def check_conditional_set_comparison(a, cond): # FP: We don't know whether b is of type set in this case. An issue shouldn't be raised. if not (a <= b): # Noncompliant ... + + +def check_frozenset_as_declared_type(a: frozenset[str], b: frozenset[str]) -> None: + if not (a <= b): # OK: comparing two frozensets. + ... + if not (a == b): # Noncompliant + ... + if not (a < b): # OK: comparing two frozensets. + ... + if not (a > b): # OK: comparing two frozensets. + ... + if not (a >= b): # OK: comparing two frozensets. + ... + + +class CustomFrozenSet(frozenset): + ... + + +def check_frozenset_as_custom_subclass(a: CustomFrozenSet, b: CustomFrozenSet) -> None: + if not (a <= b): # OK + ... + + +def check_frozenset_literal(a, b) -> None: + x: frozenset[int] = frozenset({1, 2}) + y: frozenset[int] = frozenset({1, 2, 3}) + if not x <= y: # OK: comparing two frozensets. + ... + + +def check_frozenset_typing_annotation(a: FrozenSet[str], b: FrozenSet[str]) -> None: + if not (a <= b): # OK: comparing two frozensets with typing.FrozenSet. + ... diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/BuiltinTypes.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/BuiltinTypes.java index 292638ebd..242a4e7cd 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/BuiltinTypes.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/BuiltinTypes.java @@ -27,6 +27,7 @@ public class BuiltinTypes { public static final String TUPLE = "tuple"; public static final String LIST = "list"; public static final String SET = "set"; + public static final String FROZENSET = "frozenset"; public static final String DICT = "dict"; // https://docs.python.org/3/library/stdtypes.html#bytes-objects From e37d897a453d96451fd3482dcfb9d0bc684b07be Mon Sep 17 00:00:00 2001 From: Luqman Shahid Date: Tue, 2 Jun 2026 10:02:49 +0200 Subject: [PATCH 134/322] SONARPY-4178 [S6333] Improve detection logic to reduce FP (#1122) Co-authored-by: Claude Sonnet 4.6 Co-authored-by: Marc Jasper Co-authored-by: Gitar Co-authored-by: Luqman Shahid <232339299+Luqmansonar@users.noreply.github.com> GitOrigin-RevId: 05df3a8c2a6024f232fa5408257a7a7a0d0e8839 --- .../PublicApiIsSecuritySensitiveCheck.java | 263 ++++++--- ...licApiIsSecuritySensitiveCfnMethodCheck.py | 14 +- ...blicApiIsSecuritySensitiveCfnRouteCheck.py | 12 +- ...ublicApiIsSecuritySensitiveRestApiCheck.py | 501 ++++++++++++++---- 4 files changed, 620 insertions(+), 170 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/cdk/PublicApiIsSecuritySensitiveCheck.java b/python-checks/src/main/java/org/sonar/python/checks/cdk/PublicApiIsSecuritySensitiveCheck.java index 6d50d0c7b..57177a648 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/cdk/PublicApiIsSecuritySensitiveCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/cdk/PublicApiIsSecuritySensitiveCheck.java @@ -16,105 +16,242 @@ */ package org.sonar.python.checks.cdk; -import java.util.HashSet; import java.util.List; +import java.util.Locale; import java.util.Optional; import java.util.Set; -import java.util.function.Predicate; +import javax.annotation.CheckForNull; import org.sonar.check.Rule; -import org.sonar.plugins.python.api.PythonVisitorContext; import org.sonar.plugins.python.api.SubscriptionContext; import org.sonar.plugins.python.api.symbols.Symbol; import org.sonar.plugins.python.api.tree.CallExpression; import org.sonar.plugins.python.api.tree.Expression; -import org.sonar.plugins.python.api.tree.FunctionDef; +import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.QualifiedExpression; import org.sonar.plugins.python.api.tree.Tree; -import org.sonar.python.tree.FunctionDefImpl; -import org.sonar.python.tree.TreeUtils; +import org.sonar.python.checks.utils.Expressions; import static org.sonar.python.checks.cdk.CdkPredicate.isFqn; import static org.sonar.python.checks.cdk.CdkPredicate.isString; +import static org.sonar.python.checks.cdk.CdkPredicate.isStringLiteral; import static org.sonar.python.checks.cdk.CdkUtils.getArgument; -import static org.sonar.python.checks.cdk.CdkUtils.getDictionary; -import static org.sonar.python.checks.cdk.CdkUtils.getDictionaryPair; @Rule(key = "S6333") public class PublicApiIsSecuritySensitiveCheck extends AbstractCdkResourceCheck { - private static final String MESSAGE = "Make sure that creating public APIs is safe here."; - private static final String OMITTING_MESSAGE = "Omitting \"authorization_type\" disables authentication. Make sure it is safe here."; + + private static final String MESSAGE = "Ensure this API route requires authentication."; private static final String AUTHORIZATION_TYPE = "authorization_type"; + private static final String ENDPOINT_CONFIGURATION = "endpoint_configuration"; + private static final String TYPES = "types"; + private static final String HTTP_METHOD = "http_method"; + private static final String PATH_PART = "path_part"; private static final String AUTHORIZATION_TYPE_NONE = "aws_cdk.aws_apigateway.AuthorizationType.NONE"; + private static final String ADD_RESOURCE_FQN = "aws_cdk.aws_apigateway.Resource.add_resource"; + private static final String REST_API_FQN = "aws_cdk.aws_apigateway.RestApi"; + private static final String ENDPOINT_CONFIGURATION_FQN = "aws_cdk.aws_apigateway.EndpointConfiguration"; + private static final String ENDPOINT_TYPE_PRIVATE_FQN = "aws_cdk.aws_apigateway.EndpointType.PRIVATE"; - private final Set safeMethods = new HashSet<>(); + // Known public endpoints that do not require authentication by design. + private static final Set SAFE_PATH_NAMES = Set.of( + "login", "signup", "register", "authenticate", "token", + "forgot-password", "healthcheck", "health-check", "status", + "callback", "public-keys", "jwks", "well-known" + ); - @Override - public void scanFile(PythonVisitorContext visitorContext) { - super.scanFile(visitorContext); - safeMethods.clear(); - } + // Route names that are strong indicators of sensitive, access-controlled areas. + // Exact segment match only — "admin-portal" does not match "admin". + private static final Set SENSITIVE_PATH_NAMES = Set.of( + "admin", "management", "internal" + ); + + private static final Set DANGEROUS_HTTP_METHODS = Set.of( + "POST", "PUT", "DELETE", "PATCH", "ANY" + ); @Override protected void registerFqnConsumer() { - checkFqns(List.of("aws_cdk.aws_apigateway.CfnMethod", "aws_cdk.aws_apigatewayv2.CfnRoute"), (subscriptionContext, callExpression) -> - getArgument(subscriptionContext, callExpression, AUTHORIZATION_TYPE).ifPresentOrElse( - argument -> argument.addIssueIf(isString("NONE"), MESSAGE), - () -> subscriptionContext.addIssue(callExpression.callee(), OMITTING_MESSAGE) - ) + // L1 constructs: flag only when authorization_type is explicitly the literal "NONE". + checkFqns(List.of("aws_cdk.aws_apigateway.CfnMethod", "aws_cdk.aws_apigatewayv2.CfnRoute"), + (ctx, call) -> getArgument(ctx, call, AUTHORIZATION_TYPE) + .ifPresent(arg -> arg.addIssueIf(isString("NONE"), MESSAGE)) ); - checkFqns(List.of("aws_cdk.aws_apigateway.RestApi", "aws_cdk.aws_apigateway.Resource.add_resource"), (subscriptionContext, callExpression) -> - getArgument(subscriptionContext, callExpression, "default_method_options").ifPresent( - argument -> { - if (isArgumentSafe(subscriptionContext, argument)) { - // if invocation of RestApi() or Resource.add_resource() is with the safe default, and it's in the method, - // then store the method's full qualified name in safeMethods - enclosingMethodFqn(callExpression).ifPresent(safeMethods::add); - } + // L2 construct: apply full detection pipeline. + checkFqn("aws_cdk.aws_apigateway.Resource.add_method", PublicApiIsSecuritySensitiveCheck::checkAddMethod); + } + + private static void checkAddMethod(SubscriptionContext ctx, CallExpression call) { + // Must be explicit literal NONE — omission is not flagged. + Optional authArg = getArgument(ctx, call, AUTHORIZATION_TYPE); + if (authArg.isEmpty() || !authArg.get().hasExpression(isFqn(AUTHORIZATION_TYPE_NONE))) { + return; + } + + // Path is normalised: lowercase and leading dots/slashes stripped so ".well-known" matches "well-known". + Optional path = resolveAddResourcePath(ctx, call).map(PublicApiIsSecuritySensitiveCheck::normalizePath); + if (path.isPresent() && SAFE_PATH_NAMES.contains(path.get())) { + return; + } + + // Suppress: parent RestApi has a PRIVATE endpoint — the API is VPC-only and unreachable from the internet. + if (isPrivateRestApi(ctx, call)) { + return; + } + + // Gate 1: state-changing HTTP method — sufficient to confirm a vulnerability. + Optional httpMethod = getArgument(ctx, call, HTTP_METHOD, 0); + if (httpMethod.isPresent() && httpMethod.get().hasExpression(isString(DANGEROUS_HTTP_METHODS))) { + authArg.get().addIssue(MESSAGE); + return; + } + + if (path.isPresent() && SENSITIVE_PATH_NAMES.contains(path.get())) { + authArg.get().addIssue(MESSAGE); + } + } + + private static boolean isPrivateRestApi(SubscriptionContext ctx, CallExpression addMethodCall) { + Expression callee = addMethodCall.callee(); + if (!callee.is(Tree.Kind.QUALIFIED_EXPR)) { + return false; + } + Expression qualifier = ((QualifiedExpression) callee).qualifier(); + CallExpression addResourceCall = resolveToAddResourceCall(qualifier); + if (addResourceCall != null) { + return walkChainToRestApi(addResourceCall) + .map(restApiCall -> hasPrivateEndpointConfiguration(ctx, restApiCall)) + .orElse(false); + } + // Fallback: add_method called directly on api.root (no add_resource in chain) + return resolveToRestApiFromRoot(qualifier) + .map(restApiCall -> hasPrivateEndpointConfiguration(ctx, restApiCall)) + .orElse(false); + } + + private static Optional walkChainToRestApi(CallExpression addResourceCall) { + Expression callee = addResourceCall.callee(); + if (!callee.is(Tree.Kind.QUALIFIED_EXPR)) { + return Optional.empty(); + } + Expression qualifier = ((QualifiedExpression) callee).qualifier(); + + // api.root.add_resource(...) — qualifier is a QualifiedExpression ending in .root + if (qualifier.is(Tree.Kind.QUALIFIED_EXPR)) { + QualifiedExpression qe = (QualifiedExpression) qualifier; + if ("root".equals(qe.name().name())) { + return resolveToRestApiCall(qe.qualifier()); + } + } + + // api.root.add_resource("a").add_resource("b") — qualifier is itself an add_resource call + if (qualifier.is(Tree.Kind.CALL_EXPR)) { + CallExpression inner = (CallExpression) qualifier; + if (isAddResourceCall(inner)) { + return walkChainToRestApi(inner); + } + } + + // resource = api.root.add_resource("a"); resource.add_resource("b") + if (qualifier.is(Tree.Kind.NAME)) { + Expression assigned = Expressions.singleAssignedValue((Name) qualifier); + if (assigned != null && assigned.is(Tree.Kind.CALL_EXPR)) { + CallExpression inner = (CallExpression) assigned; + if (isAddResourceCall(inner)) { + return walkChainToRestApi(inner); } - ) - ); + } + } - checkFqn("aws_cdk.aws_apigateway.Resource.add_method", (subscriptionContext, callExpression) -> - getArgument(subscriptionContext, callExpression, AUTHORIZATION_TYPE).ifPresentOrElse( - argument -> argument.addIssueIf(isFqn(AUTHORIZATION_TYPE_NONE), MESSAGE), - () -> enclosingMethodFqn(callExpression).filter(fqn -> !safeMethods.contains(fqn)).ifPresent(fnq -> - // if the invocation of Resource.add_method() is without explicit authorization_type argument, - // and it's not in the scope of safeMethod the call, then it's considered unsafe - // this is the best possible approximation for now - subscriptionContext.addIssue(callExpression.callee(), OMITTING_MESSAGE) - ) - ) - ); + return Optional.empty(); } - private static Optional enclosingMethodFqn(Tree tree) { - FunctionDef functionDef = (FunctionDef) TreeUtils.firstAncestorOfKind(tree, Tree.Kind.FUNCDEF); - return Optional.ofNullable(functionDef) - .map(FunctionDefImpl.class::cast) - .map(FunctionDefImpl::functionSymbol) - .map(Symbol::fullyQualifiedName); + private static Optional resolveToRestApiCall(Expression expression) { + Expression resolved = expression; + if (expression.is(Tree.Kind.NAME)) { + Expression assigned = Expressions.singleAssignedValue((Name) expression); + if (assigned != null) { + resolved = assigned; + } + } + if (resolved.is(Tree.Kind.CALL_EXPR)) { + CallExpression call = (CallExpression) resolved; + if (Optional.ofNullable(call.calleeSymbol()) + .map(Symbol::fullyQualifiedName) + .filter(REST_API_FQN::equals) + .isPresent()) { + return Optional.of(call); + } + } + return Optional.empty(); } - private static boolean isArgumentSafe(SubscriptionContext subscriptionContext, CdkUtils.ExpressionFlow argument) { - return !(isUnsafeSafeDictionaryAuthorisationKey(subscriptionContext, argument.getLast()) - || isUnsafeAuthorisationArgument(subscriptionContext, argument)); + private static Optional resolveToRestApiFromRoot(Expression expression) { + Expression resolved = expression; + if (expression.is(Tree.Kind.NAME)) { + Expression assigned = Expressions.singleAssignedValue((Name) expression); + if (assigned != null) { + resolved = assigned; + } + } + if (resolved.is(Tree.Kind.QUALIFIED_EXPR)) { + QualifiedExpression qe = (QualifiedExpression) resolved; + if ("root".equals(qe.name().name())) { + return resolveToRestApiCall(qe.qualifier()); + } + } + return Optional.empty(); } - private static boolean isUnsafeSafeDictionaryAuthorisationKey(SubscriptionContext ctx, Expression expression) { - return getDictionary(expression) - .flatMap(dictionary -> getDictionaryPair(ctx, dictionary, AUTHORIZATION_TYPE)) - .filter(element -> isFqn(AUTHORIZATION_TYPE_NONE).test(element.value.getLast())) - .isPresent(); + private static boolean hasPrivateEndpointConfiguration(SubscriptionContext ctx, CallExpression restApiCall) { + return getArgument(ctx, restApiCall, ENDPOINT_CONFIGURATION) + .flatMap(flow -> flow.getExpression(e -> e.is(Tree.Kind.CALL_EXPR) && isFqn(ENDPOINT_CONFIGURATION_FQN).test(e))) + .map(CallExpression.class::cast) + .flatMap(configCall -> getArgument(ctx, configCall, TYPES, 0)) + .flatMap(CdkUtils::getList) + .map(list -> CdkUtils.getListElements(ctx, list)) + .map(elements -> elements.stream().anyMatch(el -> el.hasExpression(isFqn(ENDPOINT_TYPE_PRIVATE_FQN)))) + .orElse(false); } - private static boolean isUnsafeAuthorisationArgument(SubscriptionContext subscriptionContext, CdkUtils.ExpressionFlow expression) { - return expression.getExpression(isCallExpression().and(isFqn("aws_cdk.aws_apigateway.MethodOptions"))) - .flatMap(expr -> getArgument(subscriptionContext, (CallExpression) expr, AUTHORIZATION_TYPE)) - .filter(expr -> expr.hasExpression(isFqn(AUTHORIZATION_TYPE_NONE))) - .isPresent(); + private static Optional resolveAddResourcePath(SubscriptionContext ctx, CallExpression addMethodCall) { + Expression callee = addMethodCall.callee(); + if (!callee.is(Tree.Kind.QUALIFIED_EXPR)) { + return Optional.empty(); + } + Expression qualifier = ((QualifiedExpression) callee).qualifier(); + CallExpression addResourceCall = resolveToAddResourceCall(qualifier); + if (addResourceCall == null) { + return Optional.empty(); + } + return getArgument(ctx, addResourceCall, PATH_PART, 0) + .flatMap(flow -> flow.getExpression(isStringLiteral())) + .flatMap(CdkUtils::getString); + } + + @CheckForNull + private static CallExpression resolveToAddResourceCall(Expression expression) { + if (expression.is(Tree.Kind.CALL_EXPR)) { + CallExpression call = (CallExpression) expression; + return isAddResourceCall(call) ? call : null; + } + if (expression.is(Tree.Kind.NAME)) { + Expression assigned = Expressions.singleAssignedValue((Name) expression); + if (assigned != null && assigned.is(Tree.Kind.CALL_EXPR)) { + CallExpression call = (CallExpression) assigned; + return isAddResourceCall(call) ? call : null; + } + } + return null; } - public static Predicate isCallExpression() { - return expression -> expression.is(Tree.Kind.CALL_EXPR); + private static String normalizePath(String path) { + return path.replaceAll("^[./]+", "").toLowerCase(Locale.ROOT); + } + + private static boolean isAddResourceCall(CallExpression call) { + return Optional.ofNullable(call.calleeSymbol()) + .map(Symbol::fullyQualifiedName) + .filter(ADD_RESOURCE_FQN::equals) + .isPresent(); } } diff --git a/python-checks/src/test/resources/checks/cdk/publicApiIsSecuritySensitiveCfnMethodCheck.py b/python-checks/src/test/resources/checks/cdk/publicApiIsSecuritySensitiveCfnMethodCheck.py index 835435c65..8e9cb28b7 100644 --- a/python-checks/src/test/resources/checks/cdk/publicApiIsSecuritySensitiveCfnMethodCheck.py +++ b/python-checks/src/test/resources/checks/cdk/publicApiIsSecuritySensitiveCfnMethodCheck.py @@ -5,9 +5,14 @@ def __init__(self, auth_from_argument): apigateway.CfnMethod( self, "no-auth", - authorization_type="NONE" # NonCompliant{{Make sure that creating public APIs is safe here.}} + authorization_type="NONE" # NonCompliant{{Ensure this API route requires authentication.}} ) + apigateway.CfnMethod( + self, + "no-auth-omit" + ) # Compliant - omission no longer flagged + apigateway.CfnMethod( self, "auth", @@ -32,17 +37,12 @@ def __init__(self, auth_from_argument): authorization_type="COGNITO_USER_POOLS" # Compliant ) - apigateway.CfnMethod( # NonCompliant{{Omitting "authorization_type" disables authentication. Make sure it is safe here.}} - self, - "no-auth" - ) - auth_type_none = "NONE" # ^^^^^^^^^^^^^^^^^^^^^^^> apigateway.CfnMethod( self, "no-auth", - authorization_type=auth_type_none # NonCompliant{{Make sure that creating public APIs is safe here.}} + authorization_type=auth_type_none # NonCompliant{{Ensure this API route requires authentication.}} # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) diff --git a/python-checks/src/test/resources/checks/cdk/publicApiIsSecuritySensitiveCfnRouteCheck.py b/python-checks/src/test/resources/checks/cdk/publicApiIsSecuritySensitiveCfnRouteCheck.py index b990bac81..0dac9b792 100644 --- a/python-checks/src/test/resources/checks/cdk/publicApiIsSecuritySensitiveCfnRouteCheck.py +++ b/python-checks/src/test/resources/checks/cdk/publicApiIsSecuritySensitiveCfnRouteCheck.py @@ -3,16 +3,16 @@ class PublicApiIsSecuritySensitiveCfnRouteCheck: def __init__(self, auth_from_argument): - apigateway.CfnRoute( # NonCompliant{{Omitting "authorization_type" disables authentication. Make sure it is safe here.}} + apigateway.CfnRoute( self, - "default-no-auth" + "no-auth", + authorization_type="NONE" # NonCompliant{{Ensure this API route requires authentication.}} ) apigateway.CfnRoute( self, - "no-auth", - authorization_type="NONE" # NonCompliant{{Make sure that creating public APIs is safe here.}} - ) + "default-no-auth" + ) # Compliant - omission no longer flagged apigateway.CfnRoute( self, @@ -31,7 +31,7 @@ def __init__(self, auth_from_argument): apigateway.CfnRoute( self, "no-auth", - authorization_type=auth_type_none # NonCompliant{{Make sure that creating public APIs is safe here.}} + authorization_type=auth_type_none # NonCompliant{{Ensure this API route requires authentication.}} # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) diff --git a/python-checks/src/test/resources/checks/cdk/publicApiIsSecuritySensitiveRestApiCheck.py b/python-checks/src/test/resources/checks/cdk/publicApiIsSecuritySensitiveRestApiCheck.py index 64249e7f6..47a4314bf 100644 --- a/python-checks/src/test/resources/checks/cdk/publicApiIsSecuritySensitiveRestApiCheck.py +++ b/python-checks/src/test/resources/checks/cdk/publicApiIsSecuritySensitiveRestApiCheck.py @@ -1,153 +1,466 @@ -import aws_cdk.aws_apigateway as apigateway +import aws_cdk.aws_apigateway as apigw -class PublicApiIsSecuritySensitiveRestApiCheck: - def __init__(self, auth_from_argument): - api = apigateway.RestApi( - self, - "RestApi" +class GateOne: + def __init__(self): + api = apigw.RestApi(self, "MyApi") + + # Gate 1: state-changing methods → NonCompliant + api.root.add_resource("users").add_method( + "POST", + authorization_type=apigw.AuthorizationType.NONE # NonCompliant{{Ensure this API route requires authentication.}} + ) + api.root.add_resource("items").add_method( + "PUT", + authorization_type=apigw.AuthorizationType.NONE # NonCompliant{{Ensure this API route requires authentication.}} + ) + api.root.add_resource("items").add_method( + "DELETE", + authorization_type=apigw.AuthorizationType.NONE # NonCompliant{{Ensure this API route requires authentication.}} + ) + api.root.add_resource("items").add_method( + "PATCH", + authorization_type=apigw.AuthorizationType.NONE # NonCompliant{{Ensure this API route requires authentication.}} + ) + api.root.add_resource("items").add_method( + "ANY", + authorization_type=apigw.AuthorizationType.NONE # NonCompliant{{Ensure this API route requires authentication.}} ) - test = api.root.add_resource("test") - test.add_method( + # Gate 1: safe (read-only) methods → Compliant + api.root.add_resource("users").add_method( "GET", - authorization_type=apigateway.AuthorizationType.NONE # NonCompliant{{Make sure that creating public APIs is safe here.}} + authorization_type=apigw.AuthorizationType.NONE # Compliant - GET is not state-changing + ) + api.root.add_resource("users").add_method( + "HEAD", + authorization_type=apigw.AuthorizationType.NONE # Compliant - HEAD is not state-changing + ) + api.root.add_resource("users").add_method( + "OPTIONS", + authorization_type=apigw.AuthorizationType.NONE # Compliant - OPTIONS is not state-changing ) - test.add_method( + # Non-NONE authorization → Compliant + api.root.add_resource("users").add_method( "POST", - authorization_type=apigateway.AuthorizationType.IAM # Compliant + authorization_type=apigw.AuthorizationType.IAM # Compliant + ) + api.root.add_resource("users").add_method( + "POST", + authorization_type=apigw.AuthorizationType.COGNITO # Compliant ) - auth_type_none = apigateway.AuthorizationType.NONE -# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^> - test.add_method( - "GET", - authorization_type=auth_type_none # NonCompliant{{Make sure that creating public APIs is safe here.}} + # NONE via variable → NonCompliant (secondary location on assignment) + auth_type_none = apigw.AuthorizationType.NONE +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^> + api.root.add_resource("users").add_method( + "POST", + authorization_type=auth_type_none # NonCompliant{{Ensure this API route requires authentication.}} # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) - auth_type_cognito = apigateway.AuthorizationType.COGNITO - test.add_method( + # authorization_type from unknown external → Compliant + api.root.add_resource("users").add_method( + "POST", + authorization_type=auth_from_argument # Compliant - value comes from outside + ) + + # HTTP method from variable → Compliant (cannot prove method statically) + api.root.add_resource("users").add_method( + get_method(), + authorization_type=apigw.AuthorizationType.NONE # Compliant - method not statically provable + ) + + # Omitting authorization_type entirely → Compliant (omission is not flagged) + api.root.add_resource("users").add_method("POST") # Compliant - omission not flagged + + +class Stage2Exclusion: + def __init__(self): + api = apigw.RestApi(self, "MyApi") + + # Stage 2: known-public paths → Compliant even with state-changing methods + api.root.add_resource("login").add_method( + "POST", + authorization_type=apigw.AuthorizationType.NONE # Compliant - public endpoint + ) + api.root.add_resource("signup").add_method( + "POST", + authorization_type=apigw.AuthorizationType.NONE # Compliant - public endpoint + ) + api.root.add_resource("register").add_method( + "POST", + authorization_type=apigw.AuthorizationType.NONE # Compliant - public endpoint + ) + api.root.add_resource("healthcheck").add_method( + "GET", + authorization_type=apigw.AuthorizationType.NONE # Compliant - public endpoint + ) + api.root.add_resource("status").add_method( + "GET", + authorization_type=apigw.AuthorizationType.NONE # Compliant - public endpoint + ) + api.root.add_resource("token").add_method( + "POST", + authorization_type=apigw.AuthorizationType.NONE # Compliant - public endpoint + ) + api.root.add_resource("callback").add_method( + "GET", + authorization_type=apigw.AuthorizationType.NONE # Compliant - public endpoint + ) + api.root.add_resource("jwks").add_method( + "GET", + authorization_type=apigw.AuthorizationType.NONE # Compliant - public endpoint + ) + api.root.add_resource("well-known").add_method( + "GET", + authorization_type=apigw.AuthorizationType.NONE # Compliant - public endpoint + ) + api.root.add_resource(".well-known").add_method( + "GET", + authorization_type=apigw.AuthorizationType.NONE # Compliant - leading dot normalized + ) + api.root.add_resource("authenticate").add_method( + "POST", + authorization_type=apigw.AuthorizationType.NONE # Compliant - public endpoint + ) + api.root.add_resource("forgot-password").add_method( + "POST", + authorization_type=apigw.AuthorizationType.NONE # Compliant - public endpoint + ) + api.root.add_resource("health-check").add_method( + "GET", + authorization_type=apigw.AuthorizationType.NONE # Compliant - public endpoint + ) + api.root.add_resource("public-keys").add_method( "GET", - authorization_type=auth_type_cognito + authorization_type=apigw.AuthorizationType.NONE # Compliant - public endpoint ) - test_child = test.add_resource("testchild") - test_child.parent_resource.add_method( - "HEAD", - authorization_type=apigateway.AuthorizationType.NONE # NonCompliant{{Make sure that creating public APIs is safe here.}} +class GateTwo: + def __init__(self): + api = apigw.RestApi(self, "MyApi") + + # Gate 2: exact sensitive segment + GET → NonCompliant + api.root.add_resource("admin").add_method( + "GET", + authorization_type=apigw.AuthorizationType.NONE # NonCompliant{{Ensure this API route requires authentication.}} + ) + api.root.add_resource("management").add_method( + "GET", + authorization_type=apigw.AuthorizationType.NONE # NonCompliant{{Ensure this API route requires authentication.}} + ) + api.root.add_resource("internal").add_method( + "GET", + authorization_type=apigw.AuthorizationType.NONE # NonCompliant{{Ensure this API route requires authentication.}} ) - test.get_resource("testchild").add_method( - "PATCH", - authorization_type=apigateway.AuthorizationType.NONE # NonCompliant{{Make sure that creating public APIs is safe here.}} + # Gate 2: compound names are NOT exact matches → Compliant + api.root.add_resource("admin-portal").add_method( + "GET", + authorization_type=apigw.AuthorizationType.NONE # Compliant - not an exact segment match + ) + api.root.add_resource("internal-api").add_method( + "GET", + authorization_type=apigw.AuthorizationType.NONE # Compliant - not an exact segment match + ) + api.root.add_resource("management-ui").add_method( + "GET", + authorization_type=apigw.AuthorizationType.NONE # Compliant - not an exact segment match ) - test.api.root.add_method( # NonCompliant{{Omitting "authorization_type" disables authentication. Make sure it is safe here.}} - "DELETE" + # Gate 2 via variable assignment (ExpressionFlow resolves the receiver) + admin_res = api.root.add_resource("admin") + admin_res.add_method( + "GET", + authorization_type=apigw.AuthorizationType.NONE # NonCompliant{{Ensure this API route requires authentication.}} ) - test.api.root.add_method( - "DELETE", - authorization_type=auth_from_argument # Compliant, value comes from the outside + # Stage 2 exclusion takes priority over Gate 2 via variable assignment + login_res = api.root.add_resource("login") + login_res.add_method( + "POST", + authorization_type=apigw.AuthorizationType.NONE # Compliant - Stage 2 exclusion ) - test.api.root.add_method( - "DELETE", - authorization_type=unknown # Compliant, value is unknown + # Neutral name with GET → no gate fires → Compliant + api.root.add_resource("reports").add_method( + "GET", + authorization_type=apigw.AuthorizationType.NONE # Compliant - neutral name, safe method ) + # Case-insensitive path matching + api.root.add_resource("Login").add_method( + "POST", + authorization_type=apigw.AuthorizationType.NONE # Compliant - case-insensitive Stage 2 exclusion + ) + api.root.add_resource("Admin").add_method( + "GET", + authorization_type=apigw.AuthorizationType.NONE # NonCompliant{{Ensure this API route requires authentication.}} + ) -class PublicApiIsSecuritySensitiveRestApiSecureConstructorCheck: - def __init__(self, auth_from_argument): - api = apigateway.RestApi( - self, - "RestApiDefault", - default_method_options={"authorization_type": apigateway.AuthorizationType.IAM} + # Qualifier is a call but not add_resource → path unresolvable → no Gate 2 → Compliant + api.root.get_resource("admin").add_method( + "GET", + authorization_type=apigw.AuthorizationType.NONE # Compliant - receiver not add_resource, path unknown ) - test = api.root.add_resource("test") - test.add_method("GET") # Compliant; secure default - test.add_method( + # Variable assigned to non-add_resource call → path unresolvable → no Gate 2 → Compliant + some_res = api.root.get_resource("admin") + some_res.add_method( "GET", - authorization_type=apigateway.AuthorizationType.NONE # NonCompliant{{Make sure that creating public APIs is safe here.}} + authorization_type=apigw.AuthorizationType.NONE # Compliant - receiver not add_resource, path unknown + ) + + +class PrivateEndpoint: + def __init__(self): + # Compliant: PRIVATE endpoint — VPC-only API, all methods suppressed + private_api = apigw.RestApi(self, "PrivateApi", + endpoint_configuration=apigw.EndpointConfiguration( + types=[apigw.EndpointType.PRIVATE] + ) + ) + private_api.root.add_resource("admin").add_method( + "POST", + authorization_type=apigw.AuthorizationType.NONE # Compliant - VPC-only API ) - test.api.root.add_method( + private_api.root.add_resource("data").add_method( "DELETE", - authorization_type=apigateway.AuthorizationType.NONE # NonCompliant{{Make sure that creating public APIs is safe here.}} + authorization_type=apigw.AuthorizationType.NONE # Compliant - VPC-only API ) - test.api.root.add_method( # Compliant; secure default - "DELETE" + + # Compliant: PRIVATE with nested add_resource + private_api.root.add_resource("a").add_resource("b").add_method( + "POST", + authorization_type=apigw.AuthorizationType.NONE # Compliant - VPC-only API ) - test_child = test.add_resource("test_child") - test_child.parent_resource.add_method("HEAD") # Compliant; secure default - test_child.parent_resource.add_method( - "HEAD", - authorization_type=apigateway.AuthorizationType.NONE # NonCompliant{{Make sure that creating public APIs is safe here.}} + + # Compliant: PRIVATE via variable resource + nested = private_api.root.add_resource("nested") + nested.add_method( + "DELETE", + authorization_type=apigw.AuthorizationType.NONE # Compliant - VPC-only API ) - test_child.parent_resource.add_method( - "HEAD", - authorization_type=auth_from_argument # Compliant, value comes from the outside + + # Public (EDGE) endpoint — no suppression, still raises + public_api = apigw.RestApi(self, "PublicApi") + public_api.root.add_resource("admin").add_method( + "POST", + authorization_type=apigw.AuthorizationType.NONE # NonCompliant{{Ensure this API route requires authentication.}} ) -class PublicApiIsSecuritySensitiveRestApiSecureAddResourceCallCheck: - def __init__(self, auth_from_argument): - api = apigateway.RestApi( - self, - "RestApiDefault" + # REGIONAL endpoint is not PRIVATE — still raises + regional_api = apigw.RestApi(self, "RegionalApi", + endpoint_configuration=apigw.EndpointConfiguration( + types=[apigw.EndpointType.REGIONAL] + ) + ) + regional_api.root.add_resource("admin").add_method( + "POST", + authorization_type=apigw.AuthorizationType.NONE # NonCompliant{{Ensure this API route requires authentication.}} ) - opts = apigateway.MethodOptions( - authorization_type=apigateway.AuthorizationType.IAM + +class NestedResourceViaVariable: + def __init__(self): + api = apigw.RestApi(self, "MyApi") + + # Variable holding intermediate add_resource, then chained add_resource on it + # Exercises the resolveRestApi NAME→assigned-CALL_EXPR path. + base = api.root.add_resource("base") + base.add_resource("admin").add_method( + "POST", + authorization_type=apigw.AuthorizationType.NONE # NonCompliant{{Ensure this API route requires authentication.}} ) - test = api.root.add_resource( - "test", - default_method_options=opts + # Same shape, Stage 2 exclusion applies through the resolved chain. + base2 = api.root.add_resource("base2") + base2.add_resource("login").add_method( + "POST", + authorization_type=apigw.AuthorizationType.NONE # Compliant - safe path ) - test.add_method( # Compliant because of default_method_options - "GET" + + # PRIVATE suppression still applies via this nested variable chain. + private_api = apigw.RestApi(self, "PrivateApi2", + endpoint_configuration=apigw.EndpointConfiguration( + types=[apigw.EndpointType.PRIVATE] + ) ) - test.add_method( - "GET", - authorization_type=auth_from_argument # Compliant, value comes from the outside + nested_base = private_api.root.add_resource("nested_base") + nested_base.add_resource("admin").add_method( + "POST", + authorization_type=apigw.AuthorizationType.NONE # Compliant - VPC-only API ) - test.add_method( - "GET", - authorization_type=unknown # Compliant, value is unknown + + +class AddMethodOnRootDirectly: + def __init__(self): + api = apigw.RestApi(self, "MyApi") + + # add_method called directly on api.root — qualifier of add_method's callee + # is a QualifiedExpression (api.root), so resolveToAddResourceCall returns null. + # Path resolution yields empty; Gate 1 still fires for state-changing methods. + api.root.add_method( + "POST", + authorization_type=apigw.AuthorizationType.NONE # NonCompliant{{Ensure this API route requires authentication.}} ) - test.add_method( + + # Non state-changing method on api.root → no Gate 1, no path → Compliant. + api.root.add_method( "GET", - authorization_type=apigateway.AuthorizationType.NONE # NonCompliant{{Make sure that creating public APIs is safe here.}} + authorization_type=apigw.AuthorizationType.NONE # Compliant - no resource path resolved + ) + + +class HttpMethodMissing: + def __init__(self): + api = apigw.RestApi(self, "MyApi") + + # Authorization is NONE but http_method argument is absent entirely. + # Gate 1 cannot fire; path "users" is neutral → Compliant. + api.root.add_resource("users").add_method( + authorization_type=apigw.AuthorizationType.NONE # Compliant - http_method omitted + ) + + # No http_method but sensitive path → Gate 2 fires. + api.root.add_resource("admin").add_method( + authorization_type=apigw.AuthorizationType.NONE # NonCompliant{{Ensure this API route requires authentication.}} + ) + + +class ApiReassigned: + def __init__(self): + # api is reassigned, so singleAssignedValue returns null. + # resolveToRestApiCall stays at the Name expression (not a CALL_EXPR) + # and returns empty — PRIVATE suppression cannot be confirmed. + api = apigw.RestApi(self, "ApiA") + api = apigw.RestApi(self, "ApiB") + api.root.add_resource("admin").add_method( + "POST", + authorization_type=apigw.AuthorizationType.NONE # NonCompliant{{Ensure this API route requires authentication.}} + ) + + +class ApiInstantiatedInline: + def __init__(self): + # apigw.RestApi(...) used inline, no variable. + # qe.qualifier() in resolveRestApi is a CALL_EXPR (not a Name), + # exercising the non-NAME branch of resolveToRestApiCall. + apigw.RestApi(self, "InlineApi").root.add_resource("admin").add_method( + "POST", + authorization_type=apigw.AuthorizationType.NONE # NonCompliant{{Ensure this API route requires authentication.}} + ) + + +class EndpointConfigurationViaVariable: + def __init__(self): + # endpoint_configuration argument is a Name (config), not a direct + # EndpointConfiguration(...) call. The predicate's CALL_EXPR check + # fails on the Name expression in the flow. + config_name = "regional" + api = apigw.RestApi(self, "VarApi", endpoint_configuration=config_name) + api.root.add_resource("admin").add_method( + "POST", + authorization_type=apigw.AuthorizationType.NONE # NonCompliant{{Ensure this API route requires authentication.}} + ) + + # endpoint_configuration is a CALL_EXPR but NOT EndpointConfiguration. + api2 = apigw.RestApi(self, "WrongCallApi", endpoint_configuration=apigw.AuthorizationType.NONE) + api2.root.add_resource("admin").add_method( + "POST", + authorization_type=apigw.AuthorizationType.NONE # NonCompliant{{Ensure this API route requires authentication.}} + ) + + +class EndpointConfigurationWithoutTypes: + def __init__(self): + # EndpointConfiguration without "types" argument → cascade short-circuits. + api = apigw.RestApi(self, "NoTypesApi", + endpoint_configuration=apigw.EndpointConfiguration() + ) + api.root.add_resource("admin").add_method( + "POST", + authorization_type=apigw.AuthorizationType.NONE # NonCompliant{{Ensure this API route requires authentication.}} + ) + + +class NonPathLiteralResource: + def __init__(self): + api = apigw.RestApi(self, "MyApi") + + # path_part argument is a dynamic expression (not a string literal) — path stays empty. + api.root.add_resource(get_dynamic_path()).add_method( + "POST", + authorization_type=apigw.AuthorizationType.NONE # NonCompliant{{Ensure this API route requires authentication.}} ) - test.add_method( + api.root.add_resource(get_dynamic_path()).add_method( "GET", - authorization_type=apigateway.AuthorizationType.IAM # Compliant + authorization_type=apigw.AuthorizationType.NONE # Compliant - path unresolvable, safe method ) -class PublicApiIsSecuritySensitiveRestApiUnsecureConstructorDictionary: + +def get_dynamic_path(): + return external_value + + +class ResourceReassigned: def __init__(self): - api = apigateway.RestApi( - self, - "RestApiDefault", - default_method_options={"authorization_type": apigateway.AuthorizationType.NONE} + api = apigw.RestApi(self, "MyApi") + + # Variable holding a Resource is reassigned — singleAssignedValue returns null + # for the qualifier of add_method, hitting the assigned==null branch of + # resolveToAddResourceCall. Gate 1 still raises for state-changing methods. + res = api.root.add_resource("first") + res = api.root.add_resource("admin") + res.add_method( + "POST", + authorization_type=apigw.AuthorizationType.NONE # NonCompliant{{Ensure this API route requires authentication.}} + ) + + # Variable reassigned, then used as receiver of a nested add_resource — + # exercises the assigned==null branch within resolveRestApi's NAME branch. + nested_var = api.root.add_resource("a") + nested_var = api.root.add_resource("b") + nested_var.add_resource("admin").add_method( + "POST", + authorization_type=apigw.AuthorizationType.NONE # NonCompliant{{Ensure this API route requires authentication.}} ) - test = api.root.add_resource("test") - test.add_method("GET") # NonCompliant{{Omitting "authorization_type" disables authentication. Make sure it is safe here.}} -class PublicApiIsSecuritySensitiveRestApiUnsecureConstructorMethodOptions: +class EndpointConfigurationFromCall: def __init__(self): - opts = apigateway.MethodOptions( - authorization_type=apigateway.AuthorizationType.NONE + # endpoint_configuration is a CALL_EXPR but its FQN is not + # apigw.EndpointConfiguration — the predicate returns false and suppression is skipped. + api = apigw.RestApi(self, "FromCallApi", endpoint_configuration=build_some_config()) + api.root.add_resource("admin").add_method( + "POST", + authorization_type=apigw.AuthorizationType.NONE # NonCompliant{{Ensure this API route requires authentication.}} ) - api = apigateway.RestApi( - self, - "RestApiDefault", - default_method_options=opts + + +def build_some_config(): + return None + + +class ApiAndResourceAliasedViaName: + def __init__(self): + # api is assigned to another Name (alias), not directly to a CALL_EXPR. + # resolveToRestApiCall sees assigned != null but resolved.is(CALL_EXPR) is false. + real_api = apigw.RestApi(self, "RealApi") + api = real_api + api.root.add_resource("admin").add_method( + "POST", + authorization_type=apigw.AuthorizationType.NONE # NonCompliant{{Ensure this API route requires authentication.}} ) - test = api.root.add_resource("test") - test.add_method("GET") # NonCompliant{{Omitting "authorization_type" disables authentication. Make sure it is safe here.}} + # Resource alias: variable holding a Resource is reassigned via another Name. + # In resolveToAddResourceCall, assigned != null but is not a CALL_EXPR. + real_res = real_api.root.add_resource("inner") + res_alias = real_res + res_alias.add_method( + "POST", + authorization_type=apigw.AuthorizationType.NONE # NonCompliant{{Ensure this API route requires authentication.}} + ) From 58948b9cd75b54559588b5c9497007a6e63132e6 Mon Sep 17 00:00:00 2001 From: Daniel Teuchert <141642369+daniel-teuchert-sonarsource@users.noreply.github.com> Date: Tue, 2 Jun 2026 15:43:17 +0200 Subject: [PATCH 135/322] SONARPY-4239 Adjust detection logic and message of S6281 in preparation for migration to vulnerability (#1158) Co-authored-by: Claude Sonnet 4.6 (1M context) GitOrigin-RevId: 820c5ae38642dfb5c3a13f7a291cf467e0086706 --- .../cdk/S3BucketBlockPublicAccessCheck.java | 18 ++++------ .../cdk/s3BucketBlockPublicAccessCheck.py | 35 ++++++++++--------- 2 files changed, 25 insertions(+), 28 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/cdk/S3BucketBlockPublicAccessCheck.java b/python-checks/src/main/java/org/sonar/python/checks/cdk/S3BucketBlockPublicAccessCheck.java index b9f820288..2be26c914 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/cdk/S3BucketBlockPublicAccessCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/cdk/S3BucketBlockPublicAccessCheck.java @@ -33,11 +33,11 @@ @Rule(key = "S6281") public class S3BucketBlockPublicAccessCheck extends AbstractS3BucketCheck { - private static final String MESSAGE = "Make sure allowing public ACL/policies to be set is safe here."; - private static final String OMITTING_MESSAGE = "No Public Access Block configuration prevents public ACL/policies to be set on this S3 bucket. Make sure it is safe here."; + private static final String MESSAGE = "Disabling public access block settings allows public ACL/policies to be set on this S3 bucket."; + private static final String BLOCK_ACLS_ONLY_MESSAGE = "Using BLOCK_ACLS_ONLY allows public access via bucket policies."; private static final String BLOCK_PUBLIC_ACCESS_FQN = "aws_cdk.aws_s3.BlockPublicAccess"; - private static final String BLOCK_ACLS_FQN = BLOCK_PUBLIC_ACCESS_FQN + ".BLOCK_ACLS"; + private static final String BLOCK_ACLS_ONLY_FQN = BLOCK_PUBLIC_ACCESS_FQN + ".BLOCK_ACLS_ONLY"; private static final List BLOCK_PUBLIC_ACCESS_ARGUMENTS = List.of( "block_public_acls", "ignore_public_acls", @@ -48,16 +48,12 @@ public class S3BucketBlockPublicAccessCheck extends AbstractS3BucketCheck { BiConsumer visitBucketConstructor() { return (ctx, bucket) -> { Optional blockPublicAccess = getArgument(ctx, bucket, "block_public_access"); - if (blockPublicAccess.isPresent()) { - checkBlockPublicAccess(ctx, blockPublicAccess.get()); - } else { - ctx.addIssue(bucket.callee(), OMITTING_MESSAGE); - } + blockPublicAccess.ifPresent(bpa -> checkBlockPublicAccess(ctx, bpa)); }; } private static void checkBlockPublicAccess(SubscriptionContext ctx, CdkUtils.ExpressionFlow blockPublicAccess) { - blockPublicAccess.addIssueIf(S3BucketBlockPublicAccessCheck::blocksAclsOnly, MESSAGE); + blockPublicAccess.addIssueIf(S3BucketBlockPublicAccessCheck::isBlockAclsOnly, BLOCK_ACLS_ONLY_MESSAGE); blockPublicAccess.locations().stream().filter(CallExpression.class::isInstance).map(CallExpression.class::cast) .filter(S3BucketBlockPublicAccessCheck::isBlockPublicAccessConstructor) .findAny() @@ -73,12 +69,12 @@ private static void visitBlockPublicAccessConstructor(SubscriptionContext ctx, C .forEach(flow -> flow.addIssueIf(isFalse(), MESSAGE)); } - private static boolean blocksAclsOnly(Expression expression) { + private static boolean isBlockAclsOnly(Expression expression) { if (expression.is(Tree.Kind.QUALIFIED_EXPR)) { QualifiedExpression qualifiedExpression = (QualifiedExpression) expression; return Optional.ofNullable(qualifiedExpression.symbol()) .map(Symbol::fullyQualifiedName) - .filter(BLOCK_ACLS_FQN::equals) + .filter(BLOCK_ACLS_ONLY_FQN::equals) .isPresent(); } return false; diff --git a/python-checks/src/test/resources/checks/cdk/s3BucketBlockPublicAccessCheck.py b/python-checks/src/test/resources/checks/cdk/s3BucketBlockPublicAccessCheck.py index 8746d59f1..ef805b8f3 100644 --- a/python-checks/src/test/resources/checks/cdk/s3BucketBlockPublicAccessCheck.py +++ b/python-checks/src/test/resources/checks/cdk/s3BucketBlockPublicAccessCheck.py @@ -7,23 +7,19 @@ class NonCompliantStack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) - # NonCompliant@+1 {{No Public Access Block configuration prevents public ACL/policies to be set on this S3 bucket. Make sure it is safe here.}} - bucket = s3.Bucket(self, "PublicAccessIsNotBlockedByDefault") - # ^^^^^^^^^ + # NonCompliant@+2 {{Using BLOCK_ACLS_ONLY allows public access via bucket policies.}} + bucket = s3.Bucket(self, "PublicAccessOnlyBlockAclsOnly", + block_public_access=s3.BlockPublicAccess.BLOCK_ACLS_ONLY) - # NonCompliant@+2 {{Make sure allowing public ACL/policies to be set is safe here.}} - bucket = s3.Bucket(self, "PublicAccessOnlyBlockAcls", - block_public_access=s3.BlockPublicAccess.BLOCK_ACLS) - - public_access_only_block_acls_by_reference = s3.BlockPublicAccess.BLOCK_ACLS - # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^> {{Propagated setting.}} - bucket = s3.Bucket(self, "PublicAccessOnlyBlockAclsByReference", - block_public_access=public_access_only_block_acls_by_reference) # NonCompliant {{Make sure allowing public ACL/policies to be set is safe here.}} - # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + public_access_only_block_acls_only_by_reference = s3.BlockPublicAccess.BLOCK_ACLS_ONLY + # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^> {{Propagated setting.}} + bucket = s3.Bucket(self, "PublicAccessOnlyBlockAclsOnlyByReference", + block_public_access=public_access_only_block_acls_only_by_reference) # NonCompliant {{Using BLOCK_ACLS_ONLY allows public access via bucket policies.}} + # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ bucket = s3.Bucket(self, "SingleUnblockPublicAccesses", block_public_access=s3.BlockPublicAccess( - block_public_acls=False, # NonCompliant {{Make sure allowing public ACL/policies to be set is safe here.}} + block_public_acls=False, # NonCompliant {{Disabling public access block settings allows public ACL/policies to be set on this S3 bucket.}} # ^^^^^^^^^^^^^^^^^^^^^^^ ignore_public_acls=True, block_public_policy=True, @@ -31,16 +27,16 @@ def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: bucket = s3.Bucket(self, "MultipleUnblockPublicAccesses", block_public_access=s3.BlockPublicAccess( - block_public_acls=False, # NonCompliant {{Make sure allowing public ACL/policies to be set is safe here.}} + block_public_acls=False, # NonCompliant {{Disabling public access block settings allows public ACL/policies to be set on this S3 bucket.}} # ^^^^^^^^^^^^^^^^^^^^^^^ ignore_public_acls=True, - block_public_policy=False, # NonCompliant {{Make sure allowing public ACL/policies to be set is safe here.}} + block_public_policy=False, # NonCompliant {{Disabling public access block settings allows public ACL/policies to be set on this S3 bucket.}} # ^^^^^^^^^^^^^^^^^^^^^^^^^ restrict_public_buckets=True)) referenced_unblock_public_accesses = s3.BlockPublicAccess( block_public_acls=True, - ignore_public_acls=False, # NonCompliant {{Make sure allowing public ACL/policies to be set is safe here.}} + ignore_public_acls=False, # NonCompliant {{Disabling public access block settings allows public ACL/policies to be set on this S3 bucket.}} block_public_policy=True, restrict_public_buckets=True) @@ -51,7 +47,7 @@ def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^> {{Propagated setting.}} bucket = s3.Bucket(self, "ReferencedValueUnblockPublicAccesses", block_public_access=s3.BlockPublicAccess( - block_public_acls=referenced_value_unblock_public_accesses, # NonCompliant {{Make sure allowing public ACL/policies to be set is safe here.}} + block_public_acls=referenced_value_unblock_public_accesses, # NonCompliant {{Disabling public access block settings allows public ACL/policies to be set on this S3 bucket.}} # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ignore_public_acls=True, block_public_policy=True, @@ -62,9 +58,14 @@ class CompliantStack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) + bucket = s3.Bucket(self, "PublicAccessIsNotBlockedByDefault") + bucket = s3.Bucket(self, "PublicAccessOnlyBlockAll", block_public_access=s3.BlockPublicAccess.BLOCK_ALL) + bucket = s3.Bucket(self, "PublicAccessOnlyBlockAcls", + block_public_access=s3.BlockPublicAccess.BLOCK_ACLS) + bucket = s3.Bucket(self, "AllBlockPublicAccesses", block_public_access=s3.BlockPublicAccess( block_public_acls=True, From d62b8882bd83252cbadd57ef7f781fc9a8a27f82 Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Thu, 4 Jun 2026 13:31:33 +0200 Subject: [PATCH 136/322] SONARPY-4262 Updating mise versions (#1164) GitOrigin-RevId: fa16d70584c3dcccde3f410fa7ffff45dd2d50f1 --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4c039882e..8e043f711 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -48,9 +48,9 @@ jobs: git sparse-checkout set stubs/sklearn git checkout - - uses: jdx/mise-action@146a28175021df8ca24f8ee1828cc2a60f980bd5 # v3.5.1 + - uses: jdx/mise-action@e79ddf65a11cec7b0e882bedced08d6e976efb2d # v3.6.2 with: - version: 2025.12.12 + version: 2026.5.15 cache: false env: MISE_ENV: test-and-analyze From a58d3f87639b194c885e22e65c66cd388cb83cbc Mon Sep 17 00:00:00 2001 From: Guillaume Dequenne Date: Mon, 8 Jun 2026 16:02:09 +0200 Subject: [PATCH 137/322] SONARPY-4282 Fix SonarQube issues (#1177) GitOrigin-RevId: 403a993d82aec502754212c85c436537787a0c25 --- .../sonar/python/checks/FileHeaderCopyrightCheckTest.java | 4 ++-- .../python/checks/StringLiteralDuplicationCheckTest.java | 5 +++-- .../org/sonar/python/checks/UselessParenthesisCheckTest.java | 2 +- .../test/java/org/sonar/plugins/python/IPynbSensorTest.java | 2 +- .../sonar/plugins/python/MultiFileProgressReportTest.java | 2 +- .../org/sonar/plugins/python/NotebookParsingDataTest.java | 4 ++-- .../java/org/sonar/plugins/python/xunit/TestCaseTest.java | 2 +- .../org/sonar/plugins/python/api/PythonVersionUtilsTest.java | 4 ++-- .../python/semantic/v2/callgraph/CallGraphIterableTest.java | 2 +- 9 files changed, 14 insertions(+), 13 deletions(-) diff --git a/python-checks/src/test/java/org/sonar/python/checks/FileHeaderCopyrightCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/FileHeaderCopyrightCheckTest.java index 7fe722ead..0e29575af 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/FileHeaderCopyrightCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/FileHeaderCopyrightCheckTest.java @@ -21,7 +21,6 @@ import java.util.Collections; import java.util.List; import org.assertj.core.api.Assertions; -import org.junit.Assert; import org.junit.jupiter.api.Test; import org.sonar.plugins.python.api.PythonCheck; import org.sonar.plugins.python.api.PythonSubscriptionCheck; @@ -31,6 +30,7 @@ import org.sonar.python.checks.utils.PythonCheckVerifier; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; class FileHeaderCopyrightCheckTest { @@ -147,7 +147,7 @@ void test_searchPattern_exception() { Assertions.assertThatThrownBy(() -> SubscriptionVisitor.analyze(check, context)).isInstanceOf(IllegalArgumentException.class); - IllegalArgumentException e = Assert.assertThrows(IllegalArgumentException.class, () -> SubscriptionVisitor.analyze(check, context)); + IllegalArgumentException e = assertThrows(IllegalArgumentException.class, () -> SubscriptionVisitor.analyze(check, context)); Assertions.assertThat(e.getMessage()).isEqualTo("[FileHeaderCopyrightCheck] Unable to compile the regular expression: "+fileHeaderCopyrightCheck.headerFormat); } diff --git a/python-checks/src/test/java/org/sonar/python/checks/StringLiteralDuplicationCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/StringLiteralDuplicationCheckTest.java index 6c4900452..e3327d390 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/StringLiteralDuplicationCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/StringLiteralDuplicationCheckTest.java @@ -17,10 +17,11 @@ package org.sonar.python.checks; import org.assertj.core.api.Assertions; -import org.junit.Assert; import org.junit.jupiter.api.Test; import org.sonar.python.checks.utils.PythonCheckVerifier; +import static org.junit.jupiter.api.Assertions.assertThrows; + class StringLiteralDuplicationCheckTest { @Test @@ -44,7 +45,7 @@ void test_custom_pattern() { void test_invalid_custom_pattern() { StringLiteralDuplicationCheck check = new StringLiteralDuplicationCheck(); check.customExclusionRegex = "a+*("; - IllegalStateException e = Assert.assertThrows(IllegalStateException.class, + IllegalStateException e = assertThrows(IllegalStateException.class, () -> PythonCheckVerifier.verify("src/test/resources/checks/stringLiteralDuplicationCustom.py", check)); Assertions.assertThat(e.getMessage()).isEqualTo("Unable to compile regular expression: a+*("); diff --git a/python-checks/src/test/java/org/sonar/python/checks/UselessParenthesisCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/UselessParenthesisCheckTest.java index 2af45ba06..bbc24f9ee 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/UselessParenthesisCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/UselessParenthesisCheckTest.java @@ -25,7 +25,7 @@ import org.sonar.python.checks.utils.PythonCheckVerifier; import org.sonar.python.types.TypeShed; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; class UselessParenthesisCheckTest { diff --git a/python-commons/src/test/java/org/sonar/plugins/python/IPynbSensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/IPynbSensorTest.java index 0e14321d9..a6e42b589 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/IPynbSensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/IPynbSensorTest.java @@ -58,7 +58,7 @@ import static java.nio.charset.StandardCharsets.UTF_8; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.assertThrows; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; diff --git a/python-commons/src/test/java/org/sonar/plugins/python/MultiFileProgressReportTest.java b/python-commons/src/test/java/org/sonar/plugins/python/MultiFileProgressReportTest.java index b9dad91c0..5900d7f86 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/MultiFileProgressReportTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/MultiFileProgressReportTest.java @@ -36,7 +36,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.atIndex; -import static org.junit.Assert.fail; +import static org.junit.jupiter.api.Assertions.fail; class MultiFileProgressReportTest { diff --git a/python-commons/src/test/java/org/sonar/plugins/python/NotebookParsingDataTest.java b/python-commons/src/test/java/org/sonar/plugins/python/NotebookParsingDataTest.java index 604b061de..5d17fca30 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/NotebookParsingDataTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/NotebookParsingDataTest.java @@ -22,8 +22,8 @@ import org.sonar.python.IPythonLocation; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; class NotebookParsingDataTest { @Test diff --git a/python-commons/src/test/java/org/sonar/plugins/python/xunit/TestCaseTest.java b/python-commons/src/test/java/org/sonar/plugins/python/xunit/TestCaseTest.java index db0ca1897..ef1210842 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/xunit/TestCaseTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/xunit/TestCaseTest.java @@ -20,7 +20,7 @@ import java.util.Map; import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; class TestCaseTest { @Test diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/PythonVersionUtilsTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/PythonVersionUtilsTest.java index e8f786c00..ca88d3143 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/PythonVersionUtilsTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/PythonVersionUtilsTest.java @@ -24,8 +24,8 @@ import org.sonar.api.testfixtures.log.LogTesterJUnit5; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.sonar.plugins.python.api.PythonVersionUtils.Version.V_310; import static org.sonar.plugins.python.api.PythonVersionUtils.Version.V_311; import static org.sonar.plugins.python.api.PythonVersionUtils.Version.V_312; diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/callgraph/CallGraphIterableTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/callgraph/CallGraphIterableTest.java index 569944207..527b2c8e3 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/callgraph/CallGraphIterableTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/callgraph/CallGraphIterableTest.java @@ -22,7 +22,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; -import static org.junit.Assert.assertThrows; +import static org.junit.jupiter.api.Assertions.assertThrows; class CallGraphIterableTest { @Test From 2136317d1b4af33cd494c41fd2f5521ef4588076 Mon Sep 17 00:00:00 2001 From: Daniel Teuchert <141642369+daniel-teuchert-sonarsource@users.noreply.github.com> Date: Tue, 9 Jun 2026 11:52:22 +0200 Subject: [PATCH 138/322] SONARPY-4285 Remove deprecated rules S4784, S4787, S4792, S4823, S4829, S5300, S6245 (#1181) Co-authored-by: Claude Sonnet 4.6 (1M context) GitOrigin-RevId: c4f55bc56153171560716ff1360b07e397ea2d14 --- .../python/checks/OpenSourceCheckList.java | 14 --- .../cdk/S3BucketServerEncryptionCheck.java | 47 -------- .../checks/hotspots/CommandLineArgsCheck.java | 60 ---------- .../checks/hotspots/DataEncryptionCheck.java | 80 ------------- .../checks/hotspots/EmailSendingCheck.java | 45 ------- .../hotspots/LoggersConfigurationCheck.java | 91 -------------- .../python/checks/hotspots/RegexCheck.java | 113 ------------------ .../checks/hotspots/StandardInputCheck.java | 100 ---------------- .../org/sonar/l10n/py/rules/python/S4784.html | 92 -------------- .../org/sonar/l10n/py/rules/python/S4784.json | 12 -- .../org/sonar/l10n/py/rules/python/S4787.html | 101 ---------------- .../org/sonar/l10n/py/rules/python/S4787.json | 18 --- .../org/sonar/l10n/py/rules/python/S4792.html | 101 ---------------- .../org/sonar/l10n/py/rules/python/S4792.json | 43 ------- .../org/sonar/l10n/py/rules/python/S4823.html | 30 ----- .../org/sonar/l10n/py/rules/python/S4823.json | 12 -- .../org/sonar/l10n/py/rules/python/S4829.html | 67 ----------- .../org/sonar/l10n/py/rules/python/S4829.json | 12 -- .../org/sonar/l10n/py/rules/python/S5300.html | 71 ----------- .../org/sonar/l10n/py/rules/python/S5300.json | 12 -- .../org/sonar/l10n/py/rules/python/S6245.html | 58 --------- .../org/sonar/l10n/py/rules/python/S6245.json | 29 ----- .../S3BucketServerEncryptionCheckTest.java | 29 ----- .../hotspots/CommandLineArgsCheckTest.java | 29 ----- .../hotspots/DataEncryptionCheckTest.java | 28 ----- .../hotspots/EmailSendingCheckTest.java | 28 ----- .../LoggersConfigurationCheckTest.java | 27 ----- .../checks/hotspots/RegexCheckTest.java | 29 ----- .../hotspots/StandardInputCheckTest.java | 27 ----- .../checks/cdk/s3BucketServerEncryption.py | 47 -------- .../checks/hotspots/commandLineArgs.py | 31 ----- .../checks/hotspots/data_encryption.py | 81 ------------- .../resources/checks/hotspots/emailSending.py | 34 ------ .../checks/hotspots/loggersConfiguration.py | 54 --------- .../test/resources/checks/hotspots/regex.py | 69 ----------- .../checks/hotspots/standardInput.py | 39 ------ .../python/PythonRuleRepositoryTest.java | 13 -- 37 files changed, 1773 deletions(-) delete mode 100644 python-checks/src/main/java/org/sonar/python/checks/cdk/S3BucketServerEncryptionCheck.java delete mode 100644 python-checks/src/main/java/org/sonar/python/checks/hotspots/CommandLineArgsCheck.java delete mode 100644 python-checks/src/main/java/org/sonar/python/checks/hotspots/DataEncryptionCheck.java delete mode 100644 python-checks/src/main/java/org/sonar/python/checks/hotspots/EmailSendingCheck.java delete mode 100644 python-checks/src/main/java/org/sonar/python/checks/hotspots/LoggersConfigurationCheck.java delete mode 100644 python-checks/src/main/java/org/sonar/python/checks/hotspots/RegexCheck.java delete mode 100644 python-checks/src/main/java/org/sonar/python/checks/hotspots/StandardInputCheck.java delete mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4784.html delete mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4784.json delete mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4787.html delete mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4787.json delete mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4792.html delete mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4792.json delete mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4823.html delete mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4823.json delete mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4829.html delete mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4829.json delete mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5300.html delete mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5300.json delete mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6245.html delete mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6245.json delete mode 100644 python-checks/src/test/java/org/sonar/python/checks/cdk/S3BucketServerEncryptionCheckTest.java delete mode 100644 python-checks/src/test/java/org/sonar/python/checks/hotspots/CommandLineArgsCheckTest.java delete mode 100644 python-checks/src/test/java/org/sonar/python/checks/hotspots/DataEncryptionCheckTest.java delete mode 100644 python-checks/src/test/java/org/sonar/python/checks/hotspots/EmailSendingCheckTest.java delete mode 100644 python-checks/src/test/java/org/sonar/python/checks/hotspots/LoggersConfigurationCheckTest.java delete mode 100644 python-checks/src/test/java/org/sonar/python/checks/hotspots/RegexCheckTest.java delete mode 100644 python-checks/src/test/java/org/sonar/python/checks/hotspots/StandardInputCheckTest.java delete mode 100644 python-checks/src/test/resources/checks/cdk/s3BucketServerEncryption.py delete mode 100644 python-checks/src/test/resources/checks/hotspots/commandLineArgs.py delete mode 100644 python-checks/src/test/resources/checks/hotspots/data_encryption.py delete mode 100644 python-checks/src/test/resources/checks/hotspots/emailSending.py delete mode 100644 python-checks/src/test/resources/checks/hotspots/loggersConfiguration.py delete mode 100644 python-checks/src/test/resources/checks/hotspots/regex.py delete mode 100644 python-checks/src/test/resources/checks/hotspots/standardInput.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index aebf2a44b..db35dd0f5 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -31,7 +31,6 @@ import org.sonar.python.checks.cdk.S3BucketBlockPublicAccessCheck; import org.sonar.python.checks.cdk.S3BucketGrantedAccessCheck; import org.sonar.python.checks.cdk.S3BucketHTTPCommunicationCheck; -import org.sonar.python.checks.cdk.S3BucketServerEncryptionCheck; import org.sonar.python.checks.cdk.S3BucketVersioningCheck; import org.sonar.python.checks.cdk.UnencryptedEbsVolumeCheck; import org.sonar.python.checks.cdk.UnencryptedSageMakerNotebookCheck; @@ -42,15 +41,12 @@ import org.sonar.python.checks.django.DjangoModelStrMethodCheck; import org.sonar.python.checks.django.DjangoModelStringFieldCheck; import org.sonar.python.checks.hotspots.ClearTextProtocolsCheck; -import org.sonar.python.checks.hotspots.CommandLineArgsCheck; import org.sonar.python.checks.hotspots.CorsCheck; import org.sonar.python.checks.hotspots.CsrfDisabledCheck; -import org.sonar.python.checks.hotspots.DataEncryptionCheck; import org.sonar.python.checks.hotspots.DebugModeCheck; import org.sonar.python.checks.hotspots.DisabledHtmlAutoEscapeCheck; import org.sonar.python.checks.hotspots.DisabledHtmlAutoEscapeLegacyCheck; import org.sonar.python.checks.hotspots.DynamicCodeExecutionCheck; -import org.sonar.python.checks.hotspots.EmailSendingCheck; import org.sonar.python.checks.hotspots.ExpandingArchiveCheck; import org.sonar.python.checks.hotspots.FastHashingOrPlainTextCheck; import org.sonar.python.checks.hotspots.GraphQLIntrospectionCheck; @@ -58,15 +54,12 @@ import org.sonar.python.checks.hotspots.HardCodedCredentialsEntropyCheck; import org.sonar.python.checks.hotspots.HashingDataCheck; import org.sonar.python.checks.hotspots.HttpOnlyCookieCheck; -import org.sonar.python.checks.hotspots.LoggersConfigurationCheck; import org.sonar.python.checks.hotspots.NonStandardCryptographicAlgorithmCheck; import org.sonar.python.checks.hotspots.ProcessSignallingCheck; import org.sonar.python.checks.hotspots.PseudoRandomCheck; import org.sonar.python.checks.hotspots.PubliclyWritableDirectoriesCheck; -import org.sonar.python.checks.hotspots.RegexCheck; import org.sonar.python.checks.hotspots.SQLQueriesCheck; import org.sonar.python.checks.hotspots.SecureCookieCheck; -import org.sonar.python.checks.hotspots.StandardInputCheck; import org.sonar.python.checks.hotspots.StrongCryptographicKeysCheck; import org.sonar.python.checks.hotspots.UnsafeHttpMethodsCheck; import org.sonar.python.checks.hotspots.UnverifiedHostnameCheck; @@ -166,7 +159,6 @@ public Stream> getChecks() { CollapsibleIfStatementsCheck.class, CollectionCreationWrappedInConstructorCheck.class, CollectionLengthComparisonCheck.class, - CommandLineArgsCheck.class, CommentedCodeCheck.class, CommentRegularExpressionCheck.class, ComparisonToNoneCheck.class, @@ -183,7 +175,6 @@ public Stream> getChecks() { DataClassFunctionCallDefaultCheck.class, DataClassOnEnumCheck.class, DataclassFieldDefinitionCheck.class, - DataEncryptionCheck.class, DbNoPasswordCheck.class, DeadStoreCheck.class, DebugModeCheck.class, @@ -211,7 +202,6 @@ public Stream> getChecks() { DynamicCodeExecutionCheck.class, EinopsSyntaxCheck.class, ElseAfterLoopsWithoutBreakCheck.class, - EmailSendingCheck.class, EmptyAlternativeCheck.class, EmptyCollectionConstructorCheck.class, EmptyCollectionMembershipTestCheck.class, @@ -313,7 +303,6 @@ public Stream> getChecks() { LineLengthCheck.class, ListIterableFirstElementCheck.class, LocalVariableAndParameterNameConventionCheck.class, - LoggersConfigurationCheck.class, LoggingExceptionCheck.class, LoggingBestPracticesCheck.class, LongIntegerWithLowercaseSuffixUsageCheck.class, @@ -388,7 +377,6 @@ public Stream> getChecks() { PossessiveQuantifierContinuationCheck.class, RedundantRegexAlternativesCheck.class, ReluctantQuantifierCheck.class, - RegexCheck.class, ReluctantQuantifierWithEmptyContinuationCheck.class, ResourceAccessPolicyCheck.class, ReturnAndYieldInOneFunctionCheck.class, @@ -398,7 +386,6 @@ public Stream> getChecks() { S3BucketBlockPublicAccessCheck.class, S3BucketGrantedAccessCheck.class, S3BucketHTTPCommunicationCheck.class, - S3BucketServerEncryptionCheck.class, S3BucketVersioningCheck.class, SameBranchCheck.class, SameConditionCheck.class, @@ -422,7 +409,6 @@ public Stream> getChecks() { SpecialMethodParamListCheck.class, SpecialMethodReturnTypeCheck.class, SQLQueriesCheck.class, - StandardInputCheck.class, StartsWithEndsWithTupleCheck.class, StopIterationInGeneratorCheck.class, StrftimeConfusingHourSystemCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/cdk/S3BucketServerEncryptionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/cdk/S3BucketServerEncryptionCheck.java deleted file mode 100644 index a8ed20f71..000000000 --- a/python-checks/src/main/java/org/sonar/python/checks/cdk/S3BucketServerEncryptionCheck.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * SonarQube Python Plugin - * Copyright (C) SonarSource Sàrl - * mailto:info AT sonarsource DOT com - * - * You can redistribute and/or modify this program under the terms of - * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the Sonar Source-Available License for more details. - * - * You should have received a copy of the Sonar Source-Available License - * along with this program; if not, see https://sonarsource.com/license/ssal/ - */ -package org.sonar.python.checks.cdk; - -import java.util.function.BiConsumer; -import org.sonar.check.Rule; -import org.sonar.plugins.python.api.SubscriptionContext; -import org.sonar.plugins.python.api.tree.CallExpression; - -import static org.sonar.python.checks.cdk.CdkPredicate.isFqn; -import static org.sonar.python.checks.cdk.CdkUtils.getArgument; - -@Rule(key = "S6245") -public class S3BucketServerEncryptionCheck extends AbstractS3BucketCheck { - - private static final String S3_BUCKET_UNENCRYPTED_FQN = "aws_cdk.aws_s3.BucketEncryption.UNENCRYPTED"; - public static final String MESSAGE = "Objects in the bucket are not encrypted. Make sure it is safe here."; - public static final String OMITTING_MESSAGE = "Omitting 'encryption' disables server-side encryption. Make sure it is safe here."; - - @Override - BiConsumer visitBucketConstructor() { - return (ctx, bucket) -> getArgument(ctx, bucket, "encryption") - .ifPresentOrElse( - encryption -> encryption.addIssueIf(isFqn(S3_BUCKET_UNENCRYPTED_FQN), MESSAGE), - () -> checkEncryptionKey(ctx, bucket)); - } - - private static void checkEncryptionKey(SubscriptionContext ctx, CallExpression bucket) { - if (getArgument(ctx, bucket, "encryption_key").isEmpty()) { - ctx.addIssue(bucket.callee(), OMITTING_MESSAGE); - } - } -} diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/CommandLineArgsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/CommandLineArgsCheck.java deleted file mode 100644 index a2158a251..000000000 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/CommandLineArgsCheck.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * SonarQube Python Plugin - * Copyright (C) SonarSource Sàrl - * mailto:info AT sonarsource DOT com - * - * You can redistribute and/or modify this program under the terms of - * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the Sonar Source-Available License for more details. - * - * You should have received a copy of the Sonar Source-Available License - * along with this program; if not, see https://sonarsource.com/license/ssal/ - */ -package org.sonar.python.checks.hotspots; - -import java.util.Set; -import org.sonar.check.Rule; -import org.sonar.plugins.python.api.SubscriptionContext; -import org.sonar.plugins.python.api.tree.Name; -import org.sonar.plugins.python.api.tree.Tree; -import org.sonar.python.checks.AbstractCallExpressionCheck; -import org.sonar.plugins.python.api.symbols.Symbol; - -@Rule(key = CommandLineArgsCheck.CHECK_KEY) -public class CommandLineArgsCheck extends AbstractCallExpressionCheck { - public static final String CHECK_KEY = "S4823"; - private static final String MESSAGE = "Make sure that command line arguments are used safely here."; - private static final Set questionableFunctions = immutableSet("argparse.ArgumentParser", "optparse.OptionParser"); - - @Override - public void initialize(Context context) { - context.registerSyntaxNodeConsumer(Tree.Kind.NAME, CommandLineArgsCheck::checkSysArgNode); - super.initialize(context); - } - - private static void checkSysArgNode(SubscriptionContext ctx) { - Name nameTree = (Name) ctx.syntaxNode(); - Tree parent = nameTree.parent(); - Symbol symbol = nameTree.symbol(); - if (symbol != null && "sys.argv".equals(symbol.fullyQualifiedName())) { - if (isWithinImport(parent)) { - return; - } - ctx.addIssue(nameTree, MESSAGE); - } - } - - @Override - protected Set functionsToCheck() { - return questionableFunctions; - } - - @Override - protected String message() { - return MESSAGE; - } -} diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/DataEncryptionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/DataEncryptionCheck.java deleted file mode 100644 index f58f90926..000000000 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/DataEncryptionCheck.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * SonarQube Python Plugin - * Copyright (C) SonarSource Sàrl - * mailto:info AT sonarsource DOT com - * - * You can redistribute and/or modify this program under the terms of - * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the Sonar Source-Available License for more details. - * - * You should have received a copy of the Sonar Source-Available License - * along with this program; if not, see https://sonarsource.com/license/ssal/ - */ -package org.sonar.python.checks.hotspots; - -import java.util.Arrays; -import java.util.List; -import org.sonar.check.Rule; -import org.sonar.plugins.python.api.PythonSubscriptionCheck; -import org.sonar.plugins.python.api.tree.CallExpression; -import org.sonar.plugins.python.api.tree.Tree; -import org.sonar.plugins.python.api.symbols.Symbol; - -@Rule(key = "S4787") -public class DataEncryptionCheck extends PythonSubscriptionCheck { - - private static final List FUNCTIONS_TO_CHECK = Arrays.asList( - // pyca/cryptography: https://github.com/pyca/cryptography - "cryptography.fernet.Fernet", - "cryptography.hazmat.primitives.ciphers.aead.ChaCha20Poly1305", - "cryptography.hazmat.primitives.ciphers.aead.AESGCM", - "cryptography.hazmat.primitives.ciphers.aead.AESCCM", - "cryptography.hazmat.primitives.asymmetric.dh.generate_parameters", - "cryptography.hazmat.primitives.ciphers.Cipher", - // pyca/pynacl: https://github.com/pyca/pynacl - "nacl.public.Box", - "nacl.secret.SecretBox", - // PyCrypto: https://github.com/dlitz/pycrypto - "Crypto.Cipher.AES.new", - "Crypto.Cipher.DES.new", - "Crypto.Cipher.DES3.new", - "Crypto.Cipher.ARC2.new", - "Crypto.Cipher.ARC4.new", - "Crypto.Cipher.Blowfish.new", - "Crypto.Cipher.CAST.new", - "Crypto.Cipher.PKCS1_v1_5.new", - "Crypto.Cipher.PKCS1_OAEP.new", - "Crypto.Cipher.XOR.new", - "Crypto.Cipher.XOR.new", - "Crypto.PublicKey.ElGamal.generate", - // Cryptodome: https://github.com/Legrandin/pycryptodome - "Cryptodome.Cipher.AES.new", - "Cryptodome.Cipher.ChaCha20.new", - "Cryptodome.Cipher.DES.new", - "Cryptodome.Cipher.DES3.new", - "Cryptodome.Cipher.ARC2.new", - "Cryptodome.Cipher.ARC4.new", - "Cryptodome.Cipher.Blowfish.new", - "Cryptodome.Cipher.CAST.new", - "Cryptodome.Cipher.PKCS1_v1_5.new", - "Cryptodome.Cipher.PKCS1_OAEP.new", - "Cryptodome.Cipher.ChaCha20_Poly1305.new", - "Cryptodome.Cipher.Salsa20.new", - "Cryptodome.PublicKey.ElGamal.generate" - ); - - @Override - public void initialize(Context context) { - context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, ctx -> { - CallExpression callExpression = (CallExpression) ctx.syntaxNode(); - Symbol symbol = callExpression.calleeSymbol(); - if (symbol != null && FUNCTIONS_TO_CHECK.contains(symbol.fullyQualifiedName())) { - ctx.addIssue(callExpression, "Make sure that encrypting data is safe here."); - } - }); - } -} diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/EmailSendingCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/EmailSendingCheck.java deleted file mode 100644 index 4e07afc37..000000000 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/EmailSendingCheck.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * SonarQube Python Plugin - * Copyright (C) SonarSource Sàrl - * mailto:info AT sonarsource DOT com - * - * You can redistribute and/or modify this program under the terms of - * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the Sonar Source-Available License for more details. - * - * You should have received a copy of the Sonar Source-Available License - * along with this program; if not, see https://sonarsource.com/license/ssal/ - */ -package org.sonar.python.checks.hotspots; - -import java.util.Set; -import org.sonar.check.Rule; -import org.sonar.python.checks.AbstractCallExpressionCheck; - -@Rule(key = "S5300") -public class EmailSendingCheck extends AbstractCallExpressionCheck { - @Override - protected Set functionsToCheck() { - return immutableSet( - "django.core.mail.send_mail", - "django.core.mail.send_mass_mail", - "smtplib.SMTP.sendmail", - "smtplib.SMTP.send_message", - "smtplib.SMTP_SSL.sendmail", - "smtplib.SMTP_SSL.send_message", - "flask_mail.Mail.send", - "flask_mail.Mail.send_message", - "flask_mail.Connection.send", - "flask_mail.Connection.send_message" - ); - } - - @Override - protected String message() { - return "Make sure that this email is sent in a safe manner."; - } -} diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/LoggersConfigurationCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/LoggersConfigurationCheck.java deleted file mode 100644 index 10d82c00f..000000000 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/LoggersConfigurationCheck.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * SonarQube Python Plugin - * Copyright (C) SonarSource Sàrl - * mailto:info AT sonarsource DOT com - * - * You can redistribute and/or modify this program under the terms of - * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the Sonar Source-Available License for more details. - * - * You should have received a copy of the Sonar Source-Available License - * along with this program; if not, see https://sonarsource.com/license/ssal/ - */ -package org.sonar.python.checks.hotspots; - -import java.util.Arrays; -import java.util.List; -import org.sonar.check.Rule; -import org.sonar.plugins.python.api.PythonSubscriptionCheck; -import org.sonar.plugins.python.api.SubscriptionContext; -import org.sonar.plugins.python.api.tree.ArgList; -import org.sonar.plugins.python.api.tree.AssignmentStatement; -import org.sonar.plugins.python.api.tree.CallExpression; -import org.sonar.plugins.python.api.tree.ClassDef; -import org.sonar.plugins.python.api.tree.HasSymbol; -import org.sonar.plugins.python.api.tree.RegularArgument; -import org.sonar.plugins.python.api.tree.Tree; -import org.sonar.plugins.python.api.symbols.Symbol; - -@Rule(key = "S4792") -public class LoggersConfigurationCheck extends PythonSubscriptionCheck { - - private static final List FUNCTIONS_TO_CHECK = Arrays.asList( - "logging.basicConfig", - "logging.disable", - "logging.setLoggerClass", - "logging.config.fileConfig", - "logging.config.dictConfig"); - - private static final List LOGGERS_CLASSES = Arrays.asList( - "logging.Logger", - "logging.Handler", - "logging.Filter"); - - private static final String MESSAGE = "Make sure that this logger's configuration is safe."; - - @Override - public void initialize(Context context) { - context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, ctx -> { - CallExpression callExpressionTree = (CallExpression) ctx.syntaxNode(); - Symbol symbol = callExpressionTree.calleeSymbol(); - if (symbol != null && FUNCTIONS_TO_CHECK.contains(symbol.fullyQualifiedName())) { - ctx.addIssue(callExpressionTree, MESSAGE); - } - }); - - context.registerSyntaxNodeConsumer(Tree.Kind.ASSIGNMENT_STMT, ctx -> isSettingLastResort(ctx, (AssignmentStatement) ctx.syntaxNode())); - - context.registerSyntaxNodeConsumer(Tree.Kind.CLASSDEF, ctx -> isClassExtendingLogger(ctx, (ClassDef) ctx.syntaxNode())); - } - - private static void isClassExtendingLogger(SubscriptionContext ctx, ClassDef classDef) { - ArgList argList = classDef.args(); - if (argList != null) { - argList.arguments().stream() - .filter(argument -> argument.is(Tree.Kind.REGULAR_ARGUMENT)) - .map(RegularArgument.class::cast) - .map(RegularArgument::expression) - .filter(expr -> expr instanceof HasSymbol hasSymbol && hasSymbol.symbol() != null) - .filter(expr -> LOGGERS_CLASSES.contains(((HasSymbol) expr).symbol().fullyQualifiedName())) - .forEach(expr -> ctx.addIssue(expr, MESSAGE)); - } - } - - // check if logging.lastResort is being set - private static void isSettingLastResort(SubscriptionContext ctx, AssignmentStatement assignment) { - assignment.lhsExpressions().stream() - .flatMap(exprList -> exprList.expressions().stream()) - .forEach(expr -> { - if (expr instanceof HasSymbol hasSymbol) { - Symbol symbol = hasSymbol.symbol(); - if (symbol != null && "logging.lastResort".equals(symbol.fullyQualifiedName())) { - ctx.addIssue(expr, MESSAGE); - } - } - }); - } -} diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/RegexCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/RegexCheck.java deleted file mode 100644 index b7cf4e64e..000000000 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/RegexCheck.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * SonarQube Python Plugin - * Copyright (C) SonarSource Sàrl - * mailto:info AT sonarsource DOT com - * - * You can redistribute and/or modify this program under the terms of - * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the Sonar Source-Available License for more details. - * - * You should have received a copy of the Sonar Source-Available License - * along with this program; if not, see https://sonarsource.com/license/ssal/ - */ -package org.sonar.python.checks.hotspots; - -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; -import javax.annotation.Nullable; -import org.sonar.check.Rule; -import org.sonar.plugins.python.api.PythonSubscriptionCheck; -import org.sonar.plugins.python.api.SubscriptionContext; -import org.sonar.plugins.python.api.tree.Argument; -import org.sonar.plugins.python.api.tree.AssignmentExpression; -import org.sonar.plugins.python.api.tree.BinaryExpression; -import org.sonar.plugins.python.api.tree.CallExpression; -import org.sonar.plugins.python.api.tree.Expression; -import org.sonar.plugins.python.api.tree.Name; -import org.sonar.plugins.python.api.tree.RegularArgument; -import org.sonar.plugins.python.api.tree.StringLiteral; -import org.sonar.plugins.python.api.tree.Tree; -import org.sonar.plugins.python.api.IssueLocation; -import org.sonar.python.checks.utils.Expressions; -import org.sonar.plugins.python.api.symbols.Symbol; - -@Rule(key = RegexCheck.CHECK_KEY) -public class RegexCheck extends PythonSubscriptionCheck { - public static final String CHECK_KEY = "S4784"; - private static final String MESSAGE = "Make sure that using a regular expression is safe here."; - private static final int REGEX_ARGUMENT = 0; - private static final Set questionableFunctions = new HashSet<>(Arrays.asList( - "django.core.validators.RegexValidator", "django.urls.conf.re_path", - "re.compile", "re.match", "re.search", "re.fullmatch", "re.split", "re.findall", "re.finditer", "re.sub", "re.subn", - "regex.compile", "regex.match", "regex.search", "regex.fullmatch", "regex.split", "regex.findall", "regex.finditer", "regex.sub", "regex.subn", - "regex.subf", "regex.subfn", "regex.splititer")); - - @Override - public void initialize(Context context) { - context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, ctx -> { - CallExpression call = (CallExpression) ctx.syntaxNode(); - Symbol symbol = call.calleeSymbol(); - if (symbol != null && questionableFunctions.contains(symbol.fullyQualifiedName()) && !call.arguments().isEmpty()) { - checkRegexArgument(call.arguments().get(REGEX_ARGUMENT), ctx); - } - }); - } - - private static void checkRegexArgument(Argument arg, SubscriptionContext ctx) { - String literal = null; - IssueLocation secondaryLocation = null; - if (!arg.is(Tree.Kind.REGULAR_ARGUMENT)) { - return; - } - Expression argExpression = getExpression(((RegularArgument) arg).expression()); - if (argExpression.is(Tree.Kind.NAME)) { - Expression expression = getExpression(Expressions.singleAssignedValue((Name) argExpression)); - if (expression != null && expression.is(Tree.Kind.STRING_LITERAL)) { - secondaryLocation = IssueLocation.preciseLocation(expression, ""); - literal = Expressions.unescape((StringLiteral) expression); - } - } else if (argExpression.is(Tree.Kind.STRING_LITERAL)) { - literal = Expressions.unescape((StringLiteral) argExpression); - } - if (literal == null) { - return; - } - if (isSuspiciousRegex(literal)) { - PreciseIssue preciseIssue = ctx.addIssue(arg, MESSAGE); - if (secondaryLocation != null) { - preciseIssue.secondary(secondaryLocation); - } - } - } - - private static Expression getExpression(@Nullable Expression expr) { - if (expr == null) { - return null; - } - expr = Expressions.removeParentheses(expr); - if (expr.is(Tree.Kind.MODULO) || expr.is(Tree.Kind.PLUS)) { - return getExpression(((BinaryExpression) expr).leftOperand()); - } - if (expr.is(Tree.Kind.ASSIGNMENT_EXPRESSION)) { - return getExpression(((AssignmentExpression) expr).expression()); - } - return expr; - } - - /** - * This rule flags any execution of a hardcoded regular expression which has at least 3 characters and at least - * two instances of any of the following characters: "*+{" (Example: (a+)*) - */ - private static boolean isSuspiciousRegex(String regexp) { - if (regexp.length() > 2) { - int nOfSuspiciousChars = regexp.length() - regexp.replaceAll("[*+{]", "").length(); - return nOfSuspiciousChars > 1; - } - return false; - } -} diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/StandardInputCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/StandardInputCheck.java deleted file mode 100644 index 0f7af6af1..000000000 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/StandardInputCheck.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * SonarQube Python Plugin - * Copyright (C) SonarSource Sàrl - * mailto:info AT sonarsource DOT com - * - * You can redistribute and/or modify this program under the terms of - * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the Sonar Source-Available License for more details. - * - * You should have received a copy of the Sonar Source-Available License - * along with this program; if not, see https://sonarsource.com/license/ssal/ - */ -package org.sonar.python.checks.hotspots; - -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import org.sonar.check.Rule; -import org.sonar.plugins.python.api.tree.CallExpression; -import org.sonar.plugins.python.api.tree.Expression; -import org.sonar.plugins.python.api.tree.Name; -import org.sonar.plugins.python.api.tree.Tree; -import org.sonar.python.checks.AbstractCallExpressionCheck; -import org.sonar.plugins.python.api.symbols.Symbol; - -@Rule(key = StandardInputCheck.CHECK_KEY) -public class StandardInputCheck extends AbstractCallExpressionCheck { - public static final String CHECK_KEY = "S4829"; - private static final String MESSAGE = "Make sure that reading the standard input is safe here."; - private static final Set fileInputFunctions = immutableSet("fileinput.input", "fileinput.FileInput"); - private static final Set sysFunctions = immutableSet("sys.stdin.read", "sys.stdin.readline", "sys.stdin.readlines", - "sys.__stdin__.read", "sys.__stdin__.readline", "sys.__stdin__.readlines"); - private static final Set questionableFunctionsBuiltIn = immutableSet( - "raw_input", "input"); - private static final Set questionablePropertyAccess = immutableSet("sys.stdin", "sys.__stdin__"); - - @Override - public void initialize(Context context) { - context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, ctx -> { - CallExpression callExpr = (CallExpression) ctx.syntaxNode(); - if (questionableFunctionsBuiltIn.contains(getFunctionName(callExpr.callee()))) { - ctx.addIssue(callExpr, message()); - } else { - visitNode(ctx); - } - }); - context.registerSyntaxNodeConsumer(Tree.Kind.NAME, ctx -> { - Name name = (Name) ctx.syntaxNode(); - if (isWithinImport(name)) { - return; - } - if (isQuestionablePropertyAccess(name)) { - ctx.addIssue(name, message()); - } - }); - } - - private static String getFunctionName(Expression expr) { - String functionName = ""; - if (expr.is(Tree.Kind.NAME)) { - functionName = ((Name) expr).name(); - } - return functionName; - } - - @Override - protected boolean isException(CallExpression callExpression) { - Symbol symbol = callExpression.calleeSymbol(); - return symbol != null && fileInputFunctions.contains(symbol.fullyQualifiedName()) && !callExpression.arguments().isEmpty(); - } - - private static boolean isQuestionablePropertyAccess(Name pyNameTree) { - Tree parent = pyNameTree.parent(); - while (parent != null && !parent.is(Tree.Kind.CALL_EXPR)) { - Tree grandParent = parent.parent(); - if (grandParent != null && grandParent.is(Tree.Kind.CALL_EXPR) && ((CallExpression) grandParent).callee() == parent) { - // avoid raising twice the issue on call expressions like sys.stdin.read() - return false; - } - parent = grandParent; - } - Symbol symbol = pyNameTree.symbol(); - return symbol != null && questionablePropertyAccess.contains(symbol.fullyQualifiedName()); - } - - @Override - protected Set functionsToCheck() { - return Stream.concat(fileInputFunctions.stream(), sysFunctions.stream()) - .collect(Collectors.toSet()); - } - - @Override - protected String message() { - return MESSAGE; - } -} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4784.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4784.html deleted file mode 100644 index aca34dc3f..000000000 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4784.html +++ /dev/null @@ -1,92 +0,0 @@ -

                  This rule is deprecated; use {rule:python:S5852}, {rule:pythonsecurity:S2631} instead.

                  -

                  Using regular expressions is security-sensitive. It has led in the past to the following vulnerabilities:

                  - -

                  Evaluating regular expressions against input strings is potentially an extremely CPU-intensive task. Specially crafted regular expressions such as -(a+)+s will take several seconds to evaluate the input string aaaaaaaaaaaaaaaaaaaaaaaaaaaaabs. The problem is that with -every additional a character added to the input, the time required to evaluate the regex doubles. However, the equivalent regular -expression, a+s (without grouping) is efficiently evaluated in milliseconds and scales linearly with the input size.

                  -

                  Evaluating such regular expressions opens the door to Regular expression Denial of Service (ReDoS) attacks. -In the context of a web application, attackers can force the web server to spend all of its resources evaluating regular expressions thereby making -the service inaccessible to genuine users.

                  -

                  This rule flags any execution of a hardcoded regular expression which has at least 3 characters and at least two instances of any of the following -characters: *+{.

                  -

                  Example: (a+)*

                  -

                  Ask Yourself Whether

                  -
                    -
                  • the executed regular expression is sensitive and a user can provide a string which will be analyzed by this regular expression.
                  • -
                  • your regular expression engine performance decrease with specially crafted inputs and regular expressions.
                  • -
                  -

                  There is a risk if you answered yes to any of those questions.

                  -

                  Recommended Secure Coding Practices

                  -

                  Check whether your regular expression engine (the algorithm executing your regular expression) has any known vulnerabilities. Search for -vulnerability reports mentioning the one engine you’re are using.

                  -

                  Use if possible a library which is not vulnerable to Redos Attacks such as Google Re2.

                  -

                  Remember also that a ReDos attack is possible if a user-provided regular expression is executed. This rule won’t detect this kind of injection.

                  -

                  Sensitive Code Example

                  -

                  Django

                  -
                  -from django.core.validators import RegexValidator
                  -from django.urls import re_path
                  -
                  -RegexValidator('(a*)*b')  # Sensitive
                  -
                  -def define_http_endpoint(view):
                  -    re_path(r'^(a*)*b/$', view)  # Sensitive
                  -
                  -

                  re module

                  -
                  -import re
                  -from re import compile, match, search, fullmatch, split, findall, finditer, sub, subn
                  -
                  -
                  -input = 'input string'
                  -replacement = 'replacement'
                  -
                  -re.compile('(a*)*b')  # Sensitive
                  -re.match('(a*)*b', input)  # Sensitive
                  -re.search('(a*)*b', input)  # Sensitive
                  -re.fullmatch('(a*)*b', input)  # Sensitive
                  -re.split('(a*)*b', input)  # Sensitive
                  -re.findall('(a*)*b', input)  # Sensitive
                  -re.finditer('(a*)*b',input)  # Sensitive
                  -re.sub('(a*)*b', replacement, input)  # Sensitive
                  -re.subn('(a*)*b', replacement, input)  # Sensitive
                  -
                  -

                  regex module

                  -
                  -import regex
                  -from regex import compile, match, search, fullmatch, split, findall, finditer, sub, subn, subf, subfn, splititer
                  -
                  -input = 'input string'
                  -replacement = 'replacement'
                  -
                  -regex.subf('(a*)*b', replacement, input)  # Sensitive
                  -regex.subfn('(a*)*b', replacement, input)  # Sensitive
                  -regex.splititer('(a*)*b', input)  # Sensitive
                  -
                  -regex.compile('(a*)*b')  # Sensitive
                  -regex.match('(a*)*b', input)  # Sensitive
                  -regex.search('(a*)*b', input)  # Sensitive
                  -regex.fullmatch('(a*)*b', input)  # Sensitive
                  -regex.split('(a*)*b', input)  # Sensitive
                  -regex.findall('(a*)*b', input)  # Sensitive
                  -regex.finditer('(a*)*b',input)  # Sensitive
                  -regex.sub('(a*)*b', replacement, input)  # Sensitive
                  -regex.subn('(a*)*b', replacement, input)  # Sensitive
                  -
                  -

                  Exceptions

                  -

                  Some corner-case regular expressions will not raise an issue even though they might be vulnerable. For example: (a|aa)+, -(a|a?)+.

                  -

                  It is a good idea to test your regular expression if it has the same pattern on both side of a "|".

                  -

                  See

                  - - diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4784.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4784.json deleted file mode 100644 index a54d16c4e..000000000 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4784.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "title": "Using regular expressions is security-sensitive", - "type": "SECURITY_HOTSPOT", - "status": "deprecated", - "tags": [ - "deprecated" - ], - "defaultSeverity": "Critical", - "ruleSpecification": "RSPEC-4784", - "sqKey": "S4784", - "scope": "Main" -} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4787.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4787.html deleted file mode 100644 index faca90420..000000000 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4787.html +++ /dev/null @@ -1,101 +0,0 @@ -

                  This rule is deprecated; use {rule:python:S4426}, {rule:python:S5542}, {rule:python:S5547} instead.

                  -

                  Encrypting data is security-sensitive. It has led in the past to the following vulnerabilities:

                  - -

                  Proper encryption requires both the encryption algorithm and the key to be strong. Obviously the private key needs to remain secret and be renewed -regularly. However these are not the only means to defeat or weaken an encryption.

                  -

                  This rule flags function calls that initiate encryption/decryption.

                  -

                  Ask Yourself Whether

                  -
                    -
                  • the private key might not be random, strong enough or the same key is reused for a long long time.
                  • -
                  • the private key might be compromised. It can happen when it is stored in an unsafe place or when it was transferred in an unsafe manner.
                  • -
                  • the key exchange is made without properly authenticating the receiver.
                  • -
                  • the encryption algorithm is not strong enough for the level of protection required. Note that encryption algorithms strength decreases as time - passes.
                  • -
                  • the chosen encryption library is deemed unsafe.
                  • -
                  • a nonce is used, and the same value is reused multiple times, or the nonce is not random.
                  • -
                  • the RSA algorithm is used, and it does not incorporate an Optimal Asymmetric Encryption Padding (OAEP), which might weaken the encryption.
                  • -
                  • the CBC (Cypher Block Chaining) algorithm is used for encryption, and it’s IV (Initialization Vector) is not generated using a secure random - algorithm, or it is reused.
                  • -
                  • the Advanced Encryption Standard (AES) encryption algorithm is used with an unsecure mode. See the recommended practices for more - information.
                  • -
                  -

                  You are at risk if you answered yes to any of those questions.

                  -

                  Recommended Secure Coding Practices

                  -
                    -
                  • Generate encryption keys using secure random algorithms.
                  • -
                  • When generating cryptographic keys (or key pairs), it is important to use a key length that provides enough entropy against brute-force attacks. - For the Blowfish algorithm the key should be at least 128 bits long, while for the RSA algorithm it should be at least 2048 bits long.
                  • -
                  • Regenerate the keys regularly.
                  • -
                  • Always store the keys in a safe location and transfer them only over safe channels.
                  • -
                  • If there is an exchange of cryptographic keys, check first the identity of the receiver.
                  • -
                  • Only use strong encryption algorithms. Check regularly that the algorithm is still deemed secure. It is also imperative that they are - implemented correctly. Use only encryption libraries which are deemed secure. Do not define your own encryption algorithms as they will most - probably have flaws.
                  • -
                  • When a nonce is used, generate it randomly every time.
                  • -
                  • When using the RSA algorithm, incorporate an Optimal Asymmetric Encryption Padding (OAEP).
                  • -
                  • When CBC is used for encryption, the IV must be random and unpredictable. Otherwise it exposes the encrypted value to crypto-analysis attacks - like "Chosen-Plaintext Attacks". Thus a secure random algorithm should be used. An IV value should be associated to one and only one encryption - cycle, because the IV’s purpose is to ensure that the same plaintext encrypted twice will yield two different ciphertexts.
                  • -
                  • The Advanced Encryption Standard (AES) encryption algorithm can be used with various modes. Galois/Counter Mode (GCM) with no padding should be - preferred to the following combinations which are not secured: -
                      -
                    • Electronic Codebook (ECB) mode: Under a given key, any given plaintext block always gets encrypted to the same ciphertext block. Thus, it - does not hide data patterns well. In some senses, it doesn’t provide serious message confidentiality, and it is not recommended for use in - cryptographic protocols at all.
                    • -
                    • Cipher Block Chaining (CBC) with PKCS#5 padding (or PKCS#7) is susceptible to padding oracle attacks.
                    • -
                  • -
                  -

                  Sensitive Code Example

                  -

                  cryptography module

                  -
                  -from cryptography.fernet import Fernet
                  -from cryptography.hazmat.primitives.ciphers.aead import ChaCha20Poly1305, AESGCM, AESCCM
                  -from cryptography.hazmat.primitives.asymmetric import rsa
                  -from cryptography.hazmat.primitives.ciphers import Cipher
                  -
                  -
                  -def encrypt(key):
                  -    Fernet(key)  # Sensitive
                  -    ChaCha20Poly1305(key)  # Sensitive
                  -    AESGCM(key)  # Sensitive
                  -    AESCCM(key)  # Sensitive
                  -
                  -
                  -private_key = rsa.generate_private_key()  # Sensitive
                  -
                  -
                  -def encrypt2(algorithm, mode, backend):
                  -    Cipher(algorithm, mode, backend)  # Sensitive
                  -
                  -

                  pynacl library

                  -
                  -from nacl.public import Box
                  -from nacl.secret import SecretBox
                  -
                  -
                  -def public_encrypt(secret_key, public_key):
                  -    Box(secret_key, public_key)  # Sensitive
                  -
                  -
                  -def secret_encrypt(key):
                  -    SecretBox(key)  # Sensitive
                  -
                  -

                  See

                  - - diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4787.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4787.json deleted file mode 100644 index 0e5f556c8..000000000 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4787.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "title": "Encrypting data is security-sensitive", - "type": "SECURITY_HOTSPOT", - "code": { - "impacts": { - "SECURITY": "HIGH" - }, - "attribute": "TRUSTWORTHY" - }, - "status": "deprecated", - "tags": [ - "deprecated" - ], - "defaultSeverity": "Critical", - "ruleSpecification": "RSPEC-4787", - "sqKey": "S4787", - "scope": "Main" -} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4792.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4792.html deleted file mode 100644 index 15eeaa2e4..000000000 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4792.html +++ /dev/null @@ -1,101 +0,0 @@ -

                  This rule is deprecated, and will eventually be removed.

                  -

                  Configuring loggers is security-sensitive. It has led in the past to the following vulnerabilities:

                  - -

                  Logs are useful before, during and after a security incident.

                  -
                    -
                  • Attackers will most of the time start their nefarious work by probing the system for vulnerabilities. Monitoring this activity and stopping it - is the first step to prevent an attack from ever happening.
                  • -
                  • In case of a successful attack, logs should contain enough information to understand what damage an attacker may have inflicted.
                  • -
                  -

                  Logs are also a target for attackers because they might contain sensitive information. Configuring loggers has an impact on the type of information -logged and how they are logged.

                  -

                  This rule flags for review code that initiates loggers configuration. The goal is to guide security code reviews.

                  -

                  Ask Yourself Whether

                  -
                    -
                  • unauthorized users might have access to the logs, either because they are stored in an insecure location or because the application gives access - to them.
                  • -
                  • the logs contain sensitive information on a production server. This can happen when the logger is in debug mode.
                  • -
                  • the log can grow without limit. This can happen when additional information is written into logs every time a user performs an action and the - user can perform the action as many times as he/she wants.
                  • -
                  • the logs do not contain enough information to understand the damage an attacker might have inflicted. The loggers mode (info, warn, error) might - filter out important information. They might not print contextual information like the precise time of events or the server hostname.
                  • -
                  • the logs are only stored locally instead of being backuped or replicated.
                  • -
                  -

                  There is a risk if you answered yes to any of those questions.

                  -

                  Recommended Secure Coding Practices

                  -
                    -
                  • Check that your production deployment doesn’t have its loggers in "debug" mode as it might write sensitive information in logs.
                  • -
                  • Production logs should be stored in a secure location which is only accessible to system administrators.
                  • -
                  • Configure the loggers to display all warnings, info and error messages. Write relevant information such as the precise time of events and the - hostname.
                  • -
                  • Choose log format which is easy to parse and process automatically. It is important to process logs rapidly in case of an attack so that the - impact is known and limited.
                  • -
                  • Check that the permissions of the log files are correct. If you index the logs in some other service, make sure that the transfer and the - service are secure too.
                  • -
                  • Add limits to the size of the logs and make sure that no user can fill the disk with logs. This can happen even when the user does not control - the logged information. An attacker could just repeat a logged action many times.
                  • -
                  -

                  Remember that configuring loggers properly doesn’t make them bullet-proof. Here is a list of recommendations explaining on how to use your -logs:

                  -
                    -
                  • Don’t log any sensitive information. This obviously includes passwords and credit card numbers but also any personal information such as user - names, locations, etc…​ Usually any information which is protected by law is good candidate for removal.
                  • -
                  • Sanitize all user inputs before writing them in the logs. This includes checking its size, content, encoding, syntax, etc…​ As for any user - input, validate using whitelists whenever possible. Enabling users to write what they want in your logs can have many impacts. It could for example - use all your storage space or compromise your log indexing service.
                  • -
                  • Log enough information to monitor suspicious activities and evaluate the impact an attacker might have on your systems. Register events such as - failed logins, successful logins, server side input validation failures, access denials and any important transaction.
                  • -
                  • Monitor the logs for any suspicious activity.
                  • -
                  -

                  Sensitive Code Example

                  -
                  -import logging
                  -from logging import Logger, Handler, Filter
                  -from logging.config import fileConfig, dictConfig
                  -
                  -logging.basicConfig()  # Sensitive
                  -
                  -logging.disable()  # Sensitive
                  -
                  -
                  -def update_logging(logger_class):
                  -    logging.setLoggerClass(logger_class)  # Sensitive
                  -
                  -
                  -def set_last_resort(last_resort):
                  -    logging.lastResort = last_resort  # Sensitive
                  -
                  -
                  -class CustomLogger(Logger):  # Sensitive
                  -    pass
                  -
                  -
                  -class CustomHandler(Handler):  # Sensitive
                  -    pass
                  -
                  -
                  -class CustomFilter(Filter):  # Sensitive
                  -    pass
                  -
                  -
                  -def update_config(path, config):
                  -    fileConfig(path)  # Sensitive
                  -    dictConfig(config)  # Sensitive
                  -
                  -

                  See

                  - - diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4792.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4792.json deleted file mode 100644 index 5a14b6c4e..000000000 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4792.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "title": "Configuring loggers is security-sensitive", - "type": "SECURITY_HOTSPOT", - "code": { - "impacts": { - "SECURITY": "HIGH" - }, - "attribute": "CONVENTIONAL" - }, - "status": "deprecated", - "tags": [ - "deprecated" - ], - "defaultSeverity": "Critical", - "ruleSpecification": "RSPEC-4792", - "sqKey": "S4792", - "scope": "Main", - "securityStandards": { - "CWE": [ - 117, - 532 - ], - "OWASP": [ - "A3", - "A10" - ], - "OWASP Top 10 2021": [ - "A9" - ], - "PCI DSS 3.2": [ - "10.1", - "10.2", - "10.3" - ], - "PCI DSS 4.0": [ - "10.2" - ], - "ASVS 4.0": [ - "7.1.1", - "7.1.2" - ] - } -} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4823.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4823.html deleted file mode 100644 index a1a0acc3f..000000000 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4823.html +++ /dev/null @@ -1,30 +0,0 @@ -

                  This rule is deprecated, and will eventually be removed.

                  -

                  Using command line arguments is security-sensitive. It has led in the past to the following vulnerabilities:

                  - -

                  Command line arguments can be dangerous just like any other user input. They should never be used without being first validated and sanitized.

                  -

                  Remember also that any user can retrieve the list of processes running on a system, which makes the arguments provided to them visible. Thus -passing sensitive information via command line arguments should be considered as insecure.

                  -

                  This rule raises an issue on every reference to sys.argv, call to optparse.OptionParser() or a call to -argparse.ArgumentParser(). The goal is to guide security code reviews.

                  -

                  Ask Yourself Whether

                  -
                    -
                  • any of the command line arguments are used without being sanitized first.
                  • -
                  • your application accepts sensitive information via command line arguments.
                  • -
                  -

                  If you answered yes to any of these questions you are at risk.

                  -

                  Recommended Secure Coding Practices

                  -

                  Sanitize all command line arguments before using them.

                  -

                  Any user or application can list running processes and see the command line arguments they were started with. There are safer ways of providing -sensitive information to an application than exposing them in the command line. It is common to write them on the process' standard input, or give the -path to a file containing the information.

                  -

                  See

                  - - diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4823.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4823.json deleted file mode 100644 index c420aa3b8..000000000 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4823.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "title": "Using command line arguments is security-sensitive", - "type": "SECURITY_HOTSPOT", - "status": "deprecated", - "tags": [ - "deprecated" - ], - "defaultSeverity": "Critical", - "ruleSpecification": "RSPEC-4823", - "sqKey": "S4823", - "scope": "Main" -} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4829.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4829.html deleted file mode 100644 index 9b5934c89..000000000 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4829.html +++ /dev/null @@ -1,67 +0,0 @@ -

                  This rule is deprecated, and will eventually be removed.

                  -

                  Reading Standard Input is security-sensitive. It has led in the past to the following vulnerabilities:

                  - -

                  It is common for attackers to craft inputs enabling them to exploit software vulnerabilities. Thus any data read from the standard input (stdin) -can be dangerous and should be validated.

                  -

                  This rule flags code that reads from the standard input.

                  -

                  Ask Yourself Whether

                  -
                    -
                  • data read from the standard input is not sanitized before being used.
                  • -
                  -

                  You are at risk if you answered yes to this question.

                  -

                  Recommended Secure Coding Practices

                  -

                  Sanitize all data read from the standard input before using it.

                  -

                  Sensitive Code Example

                  -

                  Python 2 and Python 3

                  -
                  -import sys
                  -from sys import stdin, __stdin__
                  -
                  -# Any reference to sys.stdin or sys.__stdin__ without a method call is Sensitive
                  -sys.stdin  # Sensitive
                  -
                  -for line in sys.stdin:  # Sensitive
                  -    print(line)
                  -
                  -it = iter(sys.stdin)  # Sensitive
                  -line = next(it)
                  -
                  -# Calling the following methods on stdin or __stdin__ is sensitive
                  -sys.stdin.read()  # Sensitive
                  -sys.stdin.readline()  # Sensitive
                  -sys.stdin.readlines()  # Sensitive
                  -
                  -# Calling other methods on stdin or __stdin__ does not require a review, thus it is not Sensitive
                  -sys.stdin.seekable()  # Ok
                  -# ...
                  -
                  -

                  Python 2 only

                  -
                  -raw_input('What is your password?')  # Sensitive
                  -
                  -

                  Python 3 only

                  -
                  -input('What is your password?')  # Sensitive
                  -
                  -

                  Function fileinput.input and class fileinput.FileInput read the standard input when the list of files is empty.

                  -
                  -for line in fileinput.input():  # Sensitive
                  -    print(line)
                  -
                  -for line in fileinput.FileInput():  # Sensitive
                  -    print(line)
                  -
                  -for line in fileinput.input(['setup.py']):  # Ok
                  -    print(line)
                  -
                  -for line in fileinput.FileInput(['setup.py']):  # Ok
                  -    print(line)
                  -
                  -

                  See

                  - - diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4829.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4829.json deleted file mode 100644 index 46820f467..000000000 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4829.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "title": "Reading the Standard Input is security-sensitive", - "type": "SECURITY_HOTSPOT", - "status": "deprecated", - "tags": [ - "deprecated" - ], - "defaultSeverity": "Critical", - "ruleSpecification": "RSPEC-4829", - "sqKey": "S4829", - "scope": "Main" -} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5300.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5300.html deleted file mode 100644 index 932a9dd48..000000000 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5300.html +++ /dev/null @@ -1,71 +0,0 @@ -

                  This rule is deprecated, and will eventually be removed.

                  -

                  Sending emails is security-sensitive and can expose an application to a large range of vulnerabilities.

                  -

                  Information Exposure

                  -

                  Emails often contain sensitive information which might be exposed to an attacker if he can add an arbitrary address to the recipient list.

                  -

                  Spamming / Phishing

                  -

                  Malicious user can abuse email based feature to send spam or phishing content.

                  -

                  Dangerous Content Injection

                  -

                  Emails can contain HTML and JavaScript code, thus they can be used for XSS attacks.

                  -

                  Email Headers Injection

                  -

                  Email fields such as subject, to, cc, bcc, from are set in email "headers".  -Using unvalidated user input to set those fields might allow attackers to inject new line characters in headers to craft malformed SMTP requests. -Although modern libraries are filtering new line character by default, user data used in email "headers" should always be validated.

                  -

                  In the past, it has led to the following vulnerabilities:

                  - -

                  Ask Yourself Whether

                  -
                    -
                  • Unvalidated user input are used to set email headers.
                  • -
                  • Email content contains data provided by users and it is not sanitized.
                  • -
                  • Email recipient list or body are based on user inputs.
                  • -
                  -

                  You are at risk if you answered yes to any of those questions.

                  -

                  Recommended Secure Coding Practices

                  -
                    -
                  • Use an email library which sanitizes headers (Flask-Mail or django.core.mail).
                  • -
                  • Use html escape functions to sanitize every piece of data used to in the email body.
                  • -
                  • Verify application logic to make sure that email base feature can not be abuse to: -
                      -
                    • Send arbitrary email for spamming or fishing
                    • -
                    • Disclose sensitive email content
                    • -
                  • -
                  -

                  Sensitive Code Example

                  -

                  smtplib

                  -
                  -import smtplib
                  -
                  -def send(from_email, to_email, msg):
                  -  server = smtplib.SMTP('localhost', 1025)
                  -  server.sendmail(from_email, to_email, msg) # Sensitive
                  -
                  -

                  Django

                  -
                  -from django.core.mail import send_mail
                  -
                  -def send(subject, msg, from_email, to_email):
                  -  send_mail(subject, msg, from_email, [to_email]) # Sensitive
                  -
                  -

                  Flask-Mail

                  -
                  -from flask import Flask
                  -from flask_mail import Mail, Message
                  -
                  -app = Flask(__name__)
                  -
                  -def send(subject, msg, from_email, to_email):
                  -    mail = Mail(app)
                  -    msg = Message(subject, [to_email], body, sender=from_email)
                  -    mail.send(msg) # Sensitive
                  -
                  -

                  See

                  - - diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5300.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5300.json deleted file mode 100644 index 8bc44c00e..000000000 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5300.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "title": "Sending emails is security-sensitive", - "type": "SECURITY_HOTSPOT", - "status": "deprecated", - "tags": [ - "deprecated" - ], - "defaultSeverity": "Critical", - "ruleSpecification": "RSPEC-5300", - "sqKey": "S5300", - "scope": "Main" -} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6245.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6245.html deleted file mode 100644 index e876ca12c..000000000 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6245.html +++ /dev/null @@ -1,58 +0,0 @@ -

                  This rule is deprecated, and will eventually be removed.

                  -

                  Server-side encryption (SSE) encrypts an object (not the metadata) as it is written to disk (where the S3 bucket resides) and decrypts it as it is -read from disk. This doesn’t change the way the objects are accessed, as long as the user has the necessary permissions, objects are retrieved as if -they were unencrypted. Thus, SSE only helps in the event of disk thefts, improper disposals of disks and other attacks on the AWS infrastructure -itself.

                  -

                  There are three SSE options:

                  -
                    -
                  • Server-Side Encryption with Amazon S3-Managed Keys (SSE-S3) -
                      -
                    • AWS manages encryption keys and the encryption itself (with AES-256) on its own.
                    • -
                  • -
                  • Server-Side Encryption with Customer Master Keys (CMKs) Stored in AWS Key Management Service (SSE-KMS) -
                      -
                    • AWS manages the encryption (AES-256) of objects and encryption keys provided by the AWS KMS service.
                    • -
                  • -
                  • Server-Side Encryption with Customer-Provided Keys (SSE-C) -
                      -
                    • AWS manages only the encryption (AES-256) of objects with encryption keys provided by the customer. AWS doesn’t store the customer’s - encryption keys.
                    • -
                  • -
                  -

                  Ask Yourself Whether

                  -
                    -
                  • The S3 bucket stores sensitive information.
                  • -
                  • The infrastructure needs to comply to some regulations, like HIPAA or PCI DSS, and other standards.
                  • -
                  -

                  There is a risk if you answered yes to any of those questions.

                  -

                  Recommended Secure Coding Practices

                  -

                  It’s recommended to use SSE. Choosing the appropriate option depends on the level of control required for the management of encryption keys.

                  -

                  Sensitive Code Example

                  -

                  Server-side encryption is not used:

                  -
                  -bucket = s3.Bucket(self,"bucket",
                  -    encryption=s3.BucketEncryption.UNENCRYPTED       # Sensitive
                  -)
                  -
                  -

                  The default value of encryption is KMS if encryptionKey is set. Otherwise, if both parameters are absent the -bucket is unencrypted.

                  -

                  Compliant Solution

                  -

                  Server-side encryption with Amazon S3-Managed Keys is used:

                  -
                  -bucket = s3.Bucket(self,"bucket",
                  -    encryption=s3.BucketEncryption.S3_MANAGED
                  -)
                  -
                  -# Alternatively with a KMS key managed by the user.
                  -
                  -bucket = s3.Bucket(self,"bucket",
                  -    encryptionKey=access_key
                  -)
                  -
                  -

                  See

                  - - diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6245.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6245.json deleted file mode 100644 index 8da80d623..000000000 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6245.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "title": "Disabling server-side encryption of S3 buckets is security-sensitive", - "type": "SECURITY_HOTSPOT", - "code": { - "impacts": { - "SECURITY": "LOW" - }, - "attribute": "COMPLETE" - }, - "status": "deprecated", - "tags": [ - "deprecated" - ], - "defaultSeverity": "Minor", - "ruleSpecification": "RSPEC-6245", - "sqKey": "S6245", - "scope": "Main", - "securityStandards": { - "CWE": [ - 311 - ], - "PCI DSS 3.2": [ - "6.5.3" - ], - "PCI DSS 4.0": [ - "6.2.4" - ] - } -} diff --git a/python-checks/src/test/java/org/sonar/python/checks/cdk/S3BucketServerEncryptionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/cdk/S3BucketServerEncryptionCheckTest.java deleted file mode 100644 index 49fd1a7f4..000000000 --- a/python-checks/src/test/java/org/sonar/python/checks/cdk/S3BucketServerEncryptionCheckTest.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * SonarQube Python Plugin - * Copyright (C) SonarSource Sàrl - * mailto:info AT sonarsource DOT com - * - * You can redistribute and/or modify this program under the terms of - * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the Sonar Source-Available License for more details. - * - * You should have received a copy of the Sonar Source-Available License - * along with this program; if not, see https://sonarsource.com/license/ssal/ - */ -package org.sonar.python.checks.cdk; - -import org.junit.jupiter.api.Test; -import org.sonar.python.checks.utils.PythonCheckVerifier; - -class S3BucketServerEncryptionCheckTest { - - @Test - void test() { - PythonCheckVerifier.verify("src/test/resources/checks/cdk/s3BucketServerEncryption.py", new S3BucketServerEncryptionCheck()); - } - -} diff --git a/python-checks/src/test/java/org/sonar/python/checks/hotspots/CommandLineArgsCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/hotspots/CommandLineArgsCheckTest.java deleted file mode 100644 index c2192f6f9..000000000 --- a/python-checks/src/test/java/org/sonar/python/checks/hotspots/CommandLineArgsCheckTest.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * SonarQube Python Plugin - * Copyright (C) SonarSource Sàrl - * mailto:info AT sonarsource DOT com - * - * You can redistribute and/or modify this program under the terms of - * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the Sonar Source-Available License for more details. - * - * You should have received a copy of the Sonar Source-Available License - * along with this program; if not, see https://sonarsource.com/license/ssal/ - */ -package org.sonar.python.checks.hotspots; - -import org.junit.jupiter.api.Test; -import org.sonar.python.checks.utils.PythonCheckVerifier; - -class CommandLineArgsCheckTest { - - @Test - void test() { - PythonCheckVerifier.verify("src/test/resources/checks/hotspots/commandLineArgs.py", new CommandLineArgsCheck()); - } - -} diff --git a/python-checks/src/test/java/org/sonar/python/checks/hotspots/DataEncryptionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/hotspots/DataEncryptionCheckTest.java deleted file mode 100644 index 24d16bb8a..000000000 --- a/python-checks/src/test/java/org/sonar/python/checks/hotspots/DataEncryptionCheckTest.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * SonarQube Python Plugin - * Copyright (C) SonarSource Sàrl - * mailto:info AT sonarsource DOT com - * - * You can redistribute and/or modify this program under the terms of - * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the Sonar Source-Available License for more details. - * - * You should have received a copy of the Sonar Source-Available License - * along with this program; if not, see https://sonarsource.com/license/ssal/ - */ -package org.sonar.python.checks.hotspots; - -import org.junit.jupiter.api.Test; -import org.sonar.python.checks.utils.PythonCheckVerifier; - -class DataEncryptionCheckTest { - - @Test - void test() { - PythonCheckVerifier.verify("src/test/resources/checks/hotspots/data_encryption.py", new DataEncryptionCheck()); - } -} diff --git a/python-checks/src/test/java/org/sonar/python/checks/hotspots/EmailSendingCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/hotspots/EmailSendingCheckTest.java deleted file mode 100644 index 42a760f88..000000000 --- a/python-checks/src/test/java/org/sonar/python/checks/hotspots/EmailSendingCheckTest.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * SonarQube Python Plugin - * Copyright (C) SonarSource Sàrl - * mailto:info AT sonarsource DOT com - * - * You can redistribute and/or modify this program under the terms of - * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the Sonar Source-Available License for more details. - * - * You should have received a copy of the Sonar Source-Available License - * along with this program; if not, see https://sonarsource.com/license/ssal/ - */ -package org.sonar.python.checks.hotspots; - -import java.util.Collections; -import org.junit.jupiter.api.Test; -import org.sonar.python.checks.utils.PythonCheckVerifier; - -class EmailSendingCheckTest { - @Test - void test() { - PythonCheckVerifier.verify(Collections.singletonList("src/test/resources/checks/hotspots/emailSending.py"), new EmailSendingCheck()); - } -} diff --git a/python-checks/src/test/java/org/sonar/python/checks/hotspots/LoggersConfigurationCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/hotspots/LoggersConfigurationCheckTest.java deleted file mode 100644 index 40a3ae74d..000000000 --- a/python-checks/src/test/java/org/sonar/python/checks/hotspots/LoggersConfigurationCheckTest.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * SonarQube Python Plugin - * Copyright (C) SonarSource Sàrl - * mailto:info AT sonarsource DOT com - * - * You can redistribute and/or modify this program under the terms of - * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the Sonar Source-Available License for more details. - * - * You should have received a copy of the Sonar Source-Available License - * along with this program; if not, see https://sonarsource.com/license/ssal/ - */ -package org.sonar.python.checks.hotspots; - -import org.junit.jupiter.api.Test; -import org.sonar.python.checks.utils.PythonCheckVerifier; - -class LoggersConfigurationCheckTest { - @Test - void test() { - PythonCheckVerifier.verify("src/test/resources/checks/hotspots/loggersConfiguration.py", new LoggersConfigurationCheck()); - } -} diff --git a/python-checks/src/test/java/org/sonar/python/checks/hotspots/RegexCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/hotspots/RegexCheckTest.java deleted file mode 100644 index 2e9d98cbd..000000000 --- a/python-checks/src/test/java/org/sonar/python/checks/hotspots/RegexCheckTest.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * SonarQube Python Plugin - * Copyright (C) SonarSource Sàrl - * mailto:info AT sonarsource DOT com - * - * You can redistribute and/or modify this program under the terms of - * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the Sonar Source-Available License for more details. - * - * You should have received a copy of the Sonar Source-Available License - * along with this program; if not, see https://sonarsource.com/license/ssal/ - */ -package org.sonar.python.checks.hotspots; - -import org.junit.jupiter.api.Test; -import org.sonar.python.checks.utils.PythonCheckVerifier; - -class RegexCheckTest { - - @Test - void test() { - PythonCheckVerifier.verify("src/test/resources/checks/hotspots/regex.py", new RegexCheck()); - } - -} diff --git a/python-checks/src/test/java/org/sonar/python/checks/hotspots/StandardInputCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/hotspots/StandardInputCheckTest.java deleted file mode 100644 index 6524bf007..000000000 --- a/python-checks/src/test/java/org/sonar/python/checks/hotspots/StandardInputCheckTest.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * SonarQube Python Plugin - * Copyright (C) SonarSource Sàrl - * mailto:info AT sonarsource DOT com - * - * You can redistribute and/or modify this program under the terms of - * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the Sonar Source-Available License for more details. - * - * You should have received a copy of the Sonar Source-Available License - * along with this program; if not, see https://sonarsource.com/license/ssal/ - */ -package org.sonar.python.checks.hotspots; - -import org.junit.jupiter.api.Test; -import org.sonar.python.checks.utils.PythonCheckVerifier; - -class StandardInputCheckTest { - @Test - void test() { - PythonCheckVerifier.verify("src/test/resources/checks/hotspots/standardInput.py", new StandardInputCheck()); - } -} diff --git a/python-checks/src/test/resources/checks/cdk/s3BucketServerEncryption.py b/python-checks/src/test/resources/checks/cdk/s3BucketServerEncryption.py deleted file mode 100644 index 1dab93fdd..000000000 --- a/python-checks/src/test/resources/checks/cdk/s3BucketServerEncryption.py +++ /dev/null @@ -1,47 +0,0 @@ -from aws_cdk import aws_s3 as s3 - -bucket = s3.Bucket(self,"MyUnencryptedBucket") # NonCompliant {{Omitting 'encryption' disables server-side encryption. Make sure it is safe here.}} -# ^^^^^^^^^ - -bucket = s3.Bucket(self,"MyUnencryptedBucket", encryption=s3.BucketEncryption.UNENCRYPTED) # NonCompliant {{Objects in the bucket are not encrypted. Make sure it is safe here.}} -# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -bucket = s3.Bucket(self,"MyEncryptedBucket", - encryption=s3.BucketEncryption.KMS_MANAGED # Compliant - ) -bucket = s3.Bucket(self,"MyEncryptedBucket", - encryption=s3.BucketEncryption.S3_MANAGED # Compliant - ) -bucket = s3.Bucket(self,"MyEncryptedBucket", - encryption=s3.BucketEncryption.KMS # Compliant - ) -bucket = s3.Bucket(self,"MyEncryptedBucket", - encryption_key=my_encryption_key # Compliant - ) - -bucket = s3.Bucket(self,"MyUnencryptedBucket", - encryption=s3.BucketEncryption.UNENCRYPTED, # NonCompliant {{Objects in the bucket are not encrypted. Make sure it is safe here.}} -# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - encryption_key=my_encryption_key -) - -type_KMS = s3.BucketEncryption.KMS -bucket = s3.Bucket(self,"MyEncryptedBucket", - encryption=type_KMS # Compliant - ) - -my_encryption_key2 = aws_cdk.aws_kms.IKey() # Compliant -bucket = s3.Bucket(self,"MyEncryptedBucket", - encryption=s3.BucketEncryption.S3_MANAGED, - encryption_key=my_encryption_key2) - -def create_bucket(): - type_unencrypted = s3.BucketEncryption.UNENCRYPTED -# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^> {{Propagated setting.}} - bucket = s3.Bucket(self,"MyEncryptedBucket", - encryption=type_unencrypted, # NonCompliant {{Objects in the bucket are not encrypted. Make sure it is safe here.}} -# ^^^^^^^^^^^^^^^^^^^^^^^^^^^ - encryption_key=my_encryption_key2) - - -coverage = s3.Bucket(self, "bucket", encryption=unresolved_reference) # Compliant diff --git a/python-checks/src/test/resources/checks/hotspots/commandLineArgs.py b/python-checks/src/test/resources/checks/hotspots/commandLineArgs.py deleted file mode 100644 index 3a9d81155..000000000 --- a/python-checks/src/test/resources/checks/hotspots/commandLineArgs.py +++ /dev/null @@ -1,31 +0,0 @@ -import argparse -from argparse import ArgumentParser - -import sys -from sys import argv -import mySys - -from optparse import OptionParser -import optparse - -def argparse_test(): - argparse.ArgumentParser() # Noncompliant {{Make sure that command line arguments are used safely here.}} -# ^^^^^^^^^^^^^^^^^^^^^^^ - ArgumentParser() # Noncompliant - argparse.otherFunction() # OK - -def builtins(): - sys.argv # Noncompliant -# ^^^^ - argv # Noncompliant - mySys.argv # OK - sys.argv.remove('--force') # Noncompliant - -def optparse_test(): - OptionParser() # Noncompliant - optparse.OptionParser() # Noncompliant - - -@metrics.countMethod('AbstractBuildSlave.attached()') -def attached(self, bot): - pass diff --git a/python-checks/src/test/resources/checks/hotspots/data_encryption.py b/python-checks/src/test/resources/checks/hotspots/data_encryption.py deleted file mode 100644 index ed8487090..000000000 --- a/python-checks/src/test/resources/checks/hotspots/data_encryption.py +++ /dev/null @@ -1,81 +0,0 @@ -############################################ -### pyca/cryptography library ### -############################################ - -def pyca_cryptography(): - from cryptography.fernet import Fernet - from cryptography.hazmat.primitives.ciphers.aead import ChaCha20Poly1305, AESGCM, AESCCM - from cryptography.hazmat.primitives.asymmetric import rsa, ec, dsa, dh - from cryptography.hazmat.primitives.ciphers import Cipher - - Fernet(key) # Noncompliant - ChaCha20Poly1305(key) # Noncompliant - AESGCM(key) # Noncompliant - AESCCM(key) # Noncompliant - Other_encryption_method() # OK - - parameters_dh = dh.generate_parameters(2, key_size, backend) # Noncompliant {{Make sure that encrypting data is safe here.}} -# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - Cipher(algorithm, mode, backend) # Noncompliant - -############################################ -### pyca/pynacl library ### -############################################ - -def pyca_cryptography(): - from nacl.public import Box - from nacl.secret import SecretBox - - Box(secret_key, public_key) # Noncompliant - SecretBox(key) # Noncompliant - -############################################ -### PyCrypto library ### -############################################ - -def pyCrypto(): - import Crypto - from Crypto.Cipher import AES, DES, DES3, ARC2, ARC4, Blowfish, CAST, PKCS1_v1_5, PKCS1_OAEP, XOR - from Crypto.PublicKey import ElGamal - - Crypto.Cipher.AES.new() # Noncompliant - Crypto.Other.AES.new() # OK - AES.new(key=key) # Noncompliant - DES.new(key=key) # Noncompliant - DES3.new(key=key) # Noncompliant - ARC2.new(key=key) # Noncompliant - ARC4.new(key=key) # Noncompliant - Blowfish.new(key=key) # Noncompliant - CAST.new(key=key) # Noncompliant - PKCS1_v1_5.new(key=key) # Noncompliant - PKCS1_OAEP.new(key=key) # Noncompliant - XOR.new(key=key) # Noncompliant - - ElGamal.generate(key_size) # Noncompliant - - -############################################ -### Cryptodome library ### -############################################ - -def pyCrypto(): - import Cryptodome - from Cryptodome.Cipher import AES, ChaCha20, DES, DES3, ARC2, ARC4, Blowfish, CAST, PKCS1_v1_5, PKCS1_OAEP, ChaCha20_Poly1305, Salsa20 - from Cryptodome.PublicKey import ElGamal - - Cryptodome.Cipher.AES.new() # Noncompliant - Cryptodome.Other.AES.new() # OK - AES.new(key=key) # Noncompliant - ChaCha20.new(key=key) # Noncompliant - DES.new(key=key) # Noncompliant - DES3.new(key=key) # Noncompliant - ARC2.new(key=key) # Noncompliant - ARC4.new(key=key) # Noncompliant - Blowfish.new(key=key) # Noncompliant - CAST.new(key=key) # Noncompliant - PKCS1_v1_5.new(key=key) # Noncompliant - PKCS1_OAEP.new(key=key) # Noncompliant - ChaCha20_Poly1305.new(key=key) # Noncompliant - Salsa20.new(key=key) # Noncompliant - - ElGamal.generate(key_size) # Noncompliant diff --git a/python-checks/src/test/resources/checks/hotspots/emailSending.py b/python-checks/src/test/resources/checks/hotspots/emailSending.py deleted file mode 100644 index 4b6c9315b..000000000 --- a/python-checks/src/test/resources/checks/hotspots/emailSending.py +++ /dev/null @@ -1,34 +0,0 @@ -def django_tests(subject, msg, from_email, to_email): - from django.core.mail import send_mail, send_mass_mail - - send_mail(subject, msg, from_email, [to_email]) # Noncompliant {{Make sure that this email is sent in a safe manner.}} -# ^^^^^^^^^ - send_mass_mail((subject, msg, from_email, [to_email])) # Noncompliant - -def smtplib_tests(from_email, to_email, msg): - import smtplib - server1 = smtplib.SMTP('localhost', 1025) - server1.sendmail(from_email, to_email, msg) # Noncompliant - server1.send_message(msg, from_email, to_email) # Noncompliant - - server2 = smtplib.SMTP_SSL('localhost', 1025) - server2.sendmail(from_email, to_email, msg) # Noncompliant - server2.send_message(msg, from_email, to_email) # Noncompliant - - class A: - def sendmail(self): pass - def send_message(self): pass - - a = A() - a.sendmail(from_email, to_email, msg) # OK - a.send_message(msg, from_email, to_email) # OK - -def flask_mail_tests(app, msg, subject, to_email, body, from_email): - from flask_mail import Mail, Connection - mail = Mail(app) - mail.send(msg) # Noncompliant - mail.send_message(subject, [to_email], body, sender=from_email) # Noncompliant - - connection = Connection(mail) - connection.send(msg) # Noncompliant - connection.send_message(subject, [to_email], body, sender=from_email) # Noncompliant diff --git a/python-checks/src/test/resources/checks/hotspots/loggersConfiguration.py b/python-checks/src/test/resources/checks/hotspots/loggersConfiguration.py deleted file mode 100644 index b0ed102b9..000000000 --- a/python-checks/src/test/resources/checks/hotspots/loggersConfiguration.py +++ /dev/null @@ -1,54 +0,0 @@ -import logging -from logging import Logger, Handler, Filter -from logging.config import fileConfig, dictConfig - -logging.basicConfig() # Noncompliant {{Make sure that this logger's configuration is safe.}} - -logging.disable() # Noncompliant - - -def update_logging(logger_class): - foo().setLoggerClass(logger_class) # OK - logging.otherFn(logger_class) # OK - logging.setLoggerClass(logger_class) # Noncompliant -# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - - -def set_last_resort(last_resort): - logging.lastResort = last_resort # Noncompliant -# ^^^^^^^^^^^^^^^^^^ - foo().lastResort = last_resort # OK - lastResort() = last_resort # OK - logging.other = last_resort # OK - -def set_last_resert_multiple_assignment(last_resort): - import logging - logging.lastResort, foo = last_resort, 2 # Noncompliant - -class CustomLogger(Logger): # Noncompliant -# ^^^^^^ - pass - -class CustomLogger(foo()): # OK - pass - -class CustomLogger(): # OK - pass - -class CustomLogger(OtherLogger): # OK - pass - -class CustomLogger(logging.OtherClass): # OK - pass - -class CustomHandler(Handler): # Noncompliant - pass - - -class CustomFilter(Filter): # Noncompliant - pass - - -def update_config(path, config): - fileConfig(path) # Noncompliant - dictConfig(config) # Noncompliant diff --git a/python-checks/src/test/resources/checks/hotspots/regex.py b/python-checks/src/test/resources/checks/hotspots/regex.py deleted file mode 100644 index fc5d57d4f..000000000 --- a/python-checks/src/test/resources/checks/hotspots/regex.py +++ /dev/null @@ -1,69 +0,0 @@ -from django.core.validators import RegexValidator -from django.urls import re_path - -def build_validator(regex): - RegexValidator(regex) # OK - -RegexValidator() -RegexValidator('') -RegexValidator('a+') -RegexValidator('a*') -RegexValidator('a{1}') -RegexValidator('(a*)*') # Noncompliant {{Make sure that using a regular expression is safe here.}} -# ^^^^^^^ -RegexValidator('(a{1})*') # Noncompliant -RegexValidator('((a+)*') # Noncompliant -RegexValidator('(a{1})+') # Noncompliant -RegexValidator('(a+)+') # Noncompliant -RegexValidator('(a{1}){2}') # Noncompliant -RegexValidator(x:='(a+)+') # Noncompliant -RegexValidator((x:='(a+)+')) # Noncompliant -RegexValidator(x:='a+') -RegexValidator(42) - - -def define_http_endpoint(path, view): - re_path(path, view) # OK - regexp = '(a*)*' -# ^^^^^^^> - RegexValidator(regexp) # Noncompliant -# ^^^^^^ - RegexValidator(*path) - something = 42 - RegexValidator(something) - -import re -from re import compile - -def dynamic_pattern(): - pattern = '(a*)*' - re.compile(pattern) # Noncompliant - compile(pattern) # FN - Same name as built-in symbol compile - regexpressions.map(compile) # OK - -import regex -from regex import subf - - -def dynamic_pattern(pattern): - regex.subf(pattern, replacement, input) # OK - subf(pattern, replacement, input) # OK - - -beforethisafter = r'\s*(?P%s(?=\s*(\b(%s)\b)))' + \ - r'\s*(?P(\b(%s)\b))' + \ - r'\s*(?P%s)\s*\Z' -## -fortrantypes = r'character|logical|integer|real|complex|double\s*(precision\s*(complex|)|complex)|type(?=\s*\([\w\s,=(*)]*\))|byte' -typespattern = re.compile( - beforethisafter % ('', fortrantypes, fortrantypes, '.*'), re.I) # Noncompliant - -def test_valid_numpy_version(): - version_pattern = r"^[0-9]+\.[0-9]+\.[0-9]+(|a[0-9]|b[0-9]|rc[0-9])" - if np.version.release: - res = re.match(version_pattern, np.__version__) # Noncompliant - else: - res = re.match(version_pattern + dev_suffix, np.__version__) # Noncompliant - -def formatted_regex(): - pattern = re.compile(r'{}-\d+-{}$'.format(foo, bar)) diff --git a/python-checks/src/test/resources/checks/hotspots/standardInput.py b/python-checks/src/test/resources/checks/hotspots/standardInput.py deleted file mode 100644 index 3e9eed046..000000000 --- a/python-checks/src/test/resources/checks/hotspots/standardInput.py +++ /dev/null @@ -1,39 +0,0 @@ -import sys -from sys import stdin, __stdin__ -import fileinput - -def python_3_builtin(): - sys.stdin # Noncompliant {{Make sure that reading the standard input is safe here.}} -# ^^^^^ - - sys.__stdin__ # Noncompliant - - stdin #Noncompliant - __stdin__ #Noncompliant - - - sys.stdin.read() # Noncompliant - sys.stdin.readline() # Noncompliant - sys.stdin.readlines() # Noncompliant - - sys.__stdin__.read() # Noncompliant - sys.stdin.seekable() # Ok - - foo('stdin', sys.stdin) # Noncompliant - data = sys.stdin.read(1) # Noncompliant - - input('What is your password?') # Noncompliant - -def python_2_builtin(): - raw_input('What is your password?') # Noncompliant - -def from_fileinput(): - fileinput.input() # Noncompliant - fileinput.FileInput() # Noncompliant - - fileinput.input(['setup.py']) # OK - fileinput.FileInput(['setup.py']) # OK - - - - diff --git a/python-commons/src/test/java/org/sonar/plugins/python/PythonRuleRepositoryTest.java b/python-commons/src/test/java/org/sonar/plugins/python/PythonRuleRepositoryTest.java index 2a038391e..b107a1f2b 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/PythonRuleRepositoryTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/PythonRuleRepositoryTest.java @@ -72,19 +72,6 @@ void owaspSecurityStandard() { assertThat(s2077_9_2.securityStandards()).doesNotContain("owaspTop10-2021:a3"); } - @Test - void psiDssSecurityStandard() { - RulesDefinition.Repository repository_9_5 = buildRepository(9, 5); - RulesDefinition.Rule s4792_9_5 = repository_9_5.rule("S4792"); - assertThat(s4792_9_5).isNotNull(); - assertThat(s4792_9_5.securityStandards()).contains("pciDss-3.2:10.1", "pciDss-3.2:10.2", "pciDss-3.2:10.3", "pciDss-4.0:10.2"); - - RulesDefinition.Repository repository_9_4 = buildRepository(9, 4); - RulesDefinition.Rule s4792_9_4 = repository_9_4.rule("S4792"); - assertThat(s4792_9_4).isNotNull(); - assertThat(s4792_9_4.securityStandards()).doesNotContain("pciDss-3.2:10.1", "pciDss-3.2:10.2", "pciDss-3.2:10.3", "pciDss-4.0:10.2"); - } - private List nonAbstractCheckFiles() throws IOException { return Files.walk(new File("../python-checks/src/main/java/org/sonar/python/checks").toPath()) .filter(Files::isRegularFile) From 16ba06abd7b2cbb2a88bec4e7b7d31f7da08fbbd Mon Sep 17 00:00:00 2001 From: Guillaume Dequenne Date: Wed, 10 Jun 2026 10:45:13 +0200 Subject: [PATCH 139/322] SONARPY-4288 Fix quality issue (#1182) GitOrigin-RevId: e9699d52513c553f6c0eb7501373bc5ae3dec883 --- .../java/org/sonar/plugins/python/NotebookParsingDataTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python-commons/src/test/java/org/sonar/plugins/python/NotebookParsingDataTest.java b/python-commons/src/test/java/org/sonar/plugins/python/NotebookParsingDataTest.java index 5d17fca30..f0d2061bf 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/NotebookParsingDataTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/NotebookParsingDataTest.java @@ -100,7 +100,7 @@ void testRemoveTrailingExtraLine() { void testEquals() { var empty = NotebookParsingData.empty(); assertEquals(empty, empty); - assertNotEquals(empty, "test"); + assertNotEquals("test", empty); var data = new NotebookParsingData(new StringBuilder().append("Test"), Map.of(), 0); assertNotEquals(data, empty); From e6f5bce1126b1bff59cad75a5d320ec5362e61c1 Mon Sep 17 00:00:00 2001 From: Luqman Shahid Date: Mon, 15 Jun 2026 12:06:11 +0200 Subject: [PATCH 140/322] SONARPY-4247: Suppress S4790 for hashlib calls consumed by a bounded slice (#1187) Co-authored-by: Claude Sonnet 4.6 (1M context) Co-authored-by: Nils Werner GitOrigin-RevId: 60fe38ad79d60146a101bc587aae40a19c14e75f --- .../checks/hotspots/HashingDataCheck.java | 66 ++++++++++++++++++- .../checks/hotspots/hashing/hashingData.py | 56 ++++++++++++++++ 2 files changed, 121 insertions(+), 1 deletion(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/HashingDataCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/HashingDataCheck.java index 98138d1d4..e5950ebd8 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/HashingDataCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/HashingDataCheck.java @@ -34,10 +34,14 @@ import org.sonar.plugins.python.api.tree.HasSymbol; import org.sonar.plugins.python.api.tree.ListLiteral; import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.NumericLiteral; import org.sonar.plugins.python.api.tree.QualifiedExpression; import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.SliceExpression; +import org.sonar.plugins.python.api.tree.SliceItem; import org.sonar.plugins.python.api.tree.StringLiteral; import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.tree.UnaryExpression; import org.sonar.python.checks.AbstractCallExpressionCheck; import org.sonar.python.checks.utils.Expressions; import org.sonar.python.tree.TreeUtils; @@ -100,6 +104,10 @@ public class HashingDataCheck extends AbstractCallExpressionCheck { private static final Set questionableHashers = immutableSet("crypt", "unsalted_sha1", "unsalted_md5", "sha1", "md5"); + // Maximum absolute value of a slice bound considered "small" (clearly not full-digest length). + // MD5 hex = 32 chars, MD5 bytes = 16 — anything ≤ 16 is unambiguously truncated. + private static final int BOUNDED_SLICE_MAX = 16; + @Override public void initialize(Context context) { super.initialize(context); @@ -221,11 +229,67 @@ private static void checkQuestionableHashingAlgorithm(SubscriptionContext ctx) { } String fullyQualifiedName = name.symbol() != null ? name.symbol().fullyQualifiedName() : ""; - if (questionableHashlibAlgorithm.contains(fullyQualifiedName) || questionablePasslibAlgorithm.contains(fullyQualifiedName)) { + if (questionableHashlibAlgorithm.contains(fullyQualifiedName)) { + if (!isHashlibCallConsumedByBoundedSlice(name)) { + ctx.addIssue(name, MESSAGE); + } + } else if (questionablePasslibAlgorithm.contains(fullyQualifiedName)) { ctx.addIssue(name, MESSAGE); } } + private static boolean isHashlibCallConsumedByBoundedSlice(Name name) { + Tree callTree = TreeUtils.firstAncestorOfKind(name, Tree.Kind.CALL_EXPR); + if (!(callTree instanceof CallExpression hashlibCall)) { + return false; + } + + // The call may optionally be chained with .hexdigest() or .digest() before being sliced. + Tree candidate = hashlibCall; + Tree parent = hashlibCall.parent(); + + if (parent instanceof QualifiedExpression qualExpr) { + String member = qualExpr.name().name(); + if (("hexdigest".equals(member) || "digest".equals(member)) && qualExpr.parent() instanceof CallExpression digestCall) { + candidate = digestCall; + parent = digestCall.parent(); + } + } + + return parent instanceof SliceExpression sliceExpr + && sliceExpr.object() == candidate + && isBoundedSlice(sliceExpr); + } + + private static boolean isBoundedSlice(SliceExpression sliceExpr) { + List slices = sliceExpr.sliceList().slices(); + if (slices.size() != 1) { + return false; + } + // A single-item SliceExpression always holds a SliceItem (parser invariant). + SliceItem sliceItem = (SliceItem) slices.get(0); + // [:N] or [M:N] — small positive upper bound + if (sliceItem.upperBound() instanceof NumericLiteral numLit) { + return isBoundedLiteral(numLit); + } + // [-N:] — negative lower bound, no upper bound (last N elements) + boolean isUnboundedAbove = sliceItem.upperBound() == null && sliceItem.stride() == null; + return isUnboundedAbove + && sliceItem.lowerBound() instanceof UnaryExpression unary + && unary.is(Tree.Kind.UNARY_MINUS) + && unary.expression() instanceof NumericLiteral numLit + && isBoundedLiteral(numLit); + } + + private static boolean isBoundedLiteral(NumericLiteral lit) { + try { + long v = lit.valueAsLong(); + return v > 0 && v <= BOUNDED_SLICE_MAX; + } catch (NumberFormatException e) { + return false; + } + } + private static String getQualifiedName(Expression node) { if (node instanceof HasSymbol hasSymbol) { Symbol symbol = hasSymbol.symbol(); diff --git a/python-checks/src/test/resources/checks/hotspots/hashing/hashingData.py b/python-checks/src/test/resources/checks/hotspots/hashing/hashingData.py index df9ca5815..cc6310fd2 100644 --- a/python-checks/src/test/resources/checks/hotspots/hashing/hashingData.py +++ b/python-checks/src/test/resources/checks/hotspots/hashing/hashingData.py @@ -135,6 +135,62 @@ def hash_data(algorithm): md5 # Noncompliant +# S4790 suppressed when the hashlib call (or its .hexdigest()/.digest() qualifier) +# is immediately consumed by a bounded slice — truncated output cannot serve +# as a password hash, MAC, or integrity digest. +def hash_for_identifier(payload, email, seed, n): + uid = hashlib.sha1(b"data").hexdigest()[:8] # OK — short identifier + short = hashlib.md5(payload).digest()[:4] # OK — bounded keyspace + prefix = hashlib.sha1(email.encode()).hexdigest()[0:5] # OK — k-anonymity prefix + otp = hashlib.sha1(seed).hexdigest()[-6:] # OK — HOTP-style truncation + direct = hashlib.md5(payload)[:8] # OK — direct slice without digest call + s224 = hashlib.sha224(b"data").hexdigest()[:8] # OK — sha224 with bounded slice + + # Still flagged: slice bound too large (could be full-digest use) + hashlib.sha1(b"data").hexdigest()[:] # Noncompliant + hashlib.sha1(b"data").hexdigest()[:17] # Noncompliant + hashlib.sha1(b"data").hexdigest()[-17:] # Noncompliant + + # Still flagged: variable or dynamic bound — not a literal + hashlib.sha1(b"data").hexdigest()[:n] # Noncompliant + + # Still flagged: stride present — bounded size not guaranteed + hashlib.sha1(b"data").hexdigest()[-6::2] # Noncompliant + + # Still flagged: positive lower bound with no upper — unbounded tail + hashlib.sha1(b"data").hexdigest()[6:] # Noncompliant + + # Still flagged: zero upper bound + hashlib.sha1(b"data").hexdigest()[:0] # Noncompliant + + # Still flagged: chained method is neither hexdigest nor digest + hashlib.sha1(b"data").copy()[:8] # Noncompliant + + # Still flagged: hexdigest accessed as attribute, not called + hashlib.sha1(b"data").hexdigest # Noncompliant + + # Still flagged: negative upper bound keeps almost the whole digest + hashlib.sha1(b"data").hexdigest()[:-4] # Noncompliant + + # Still flagged: multi-dimensional slice + hashlib.sha1(b"data").hexdigest()[1:4, 2:8] # Noncompliant + + # Still flagged: float literal upper bound + hashlib.sha1(b"data").hexdigest()[:1.5] # Noncompliant + + # Still flagged: float literal lower bound magnitude + hashlib.sha1(b"data").hexdigest()[-1.5:] # Noncompliant + + # Still flagged: unary plus lower bound + hashlib.sha1(b"data").hexdigest()[+5:] # Noncompliant + + # Still flagged: variable under unary minus + hashlib.sha1(b"data").hexdigest()[-n:] # Noncompliant + + # Still flagged: intermediate variable breaks the chain + h = hashlib.sha1(b"data") # Noncompliant + h.hexdigest()[:8] + def test_if_usedforsecurity_works_only_for_hashlib(): import Cryptodome Cryptodome.Hash.MD2.new(usedforsecurity=False) # Noncompliant From 99f9f520d8d06d3c0690e0a6a2d561da7435acd9 Mon Sep 17 00:00:00 2001 From: Daniel Teuchert <141642369+daniel-teuchert-sonarsource@users.noreply.github.com> Date: Tue, 16 Jun 2026 11:23:53 +0200 Subject: [PATCH 141/322] SONARPY-4287 Use CleartextProtocolFilter from sonar-analyzer-commons for S5332 (#1184) Co-authored-by: Claude Sonnet 4.6 (1M context) Co-authored-by: Nils Werner <64034005+nils-werner-sonarsource@users.noreply.github.com> GitOrigin-RevId: ea32a28cc3049dd9382ce54b760b6a03f424358f --- pom.xml | 2 +- .../hotspots/ClearTextProtocolsCheck.java | 52 ++++++---------- .../checks/hotspots/clearTextProtocols.py | 62 ++++++++++++++----- 3 files changed, 67 insertions(+), 49 deletions(-) diff --git a/pom.xml b/pom.xml index 9de70a896..16104b552 100644 --- a/pom.xml +++ b/pom.xml @@ -103,7 +103,7 @@ 26.2.0.119303 13.0.0.3026 6.1.0.3962 - 2.21.0.4626 + 2.24.0.4903 its/**,private/its-enterprise/**,python-frontend/typeshed_serializer/**,**/test/resources/** diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/ClearTextProtocolsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/ClearTextProtocolsCheck.java index b349e2603..82be0bdb9 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/ClearTextProtocolsCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/ClearTextProtocolsCheck.java @@ -16,15 +16,10 @@ */ package org.sonar.python.checks.hotspots; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.Arrays; import java.util.List; -import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.Set; -import java.util.regex.Pattern; import java.util.stream.Stream; import org.sonar.check.Rule; import org.sonar.plugins.python.api.PythonSubscriptionCheck; @@ -45,15 +40,11 @@ import org.sonar.python.checks.utils.Expressions; import org.sonar.python.checks.cdk.ClearTextProtocolsCheckPart; import org.sonar.python.tree.TreeUtils; +import org.sonarsource.analyzer.commons.appsec.CleartextProtocolFilter; @Rule(key = "S5332") public class ClearTextProtocolsCheck extends PythonSubscriptionCheck { - private static final List SENSITIVE_PROTOCOLS = Arrays.asList("http://", "ftp://", "telnet://"); - private static final Pattern LOOPBACK = Pattern.compile("localhost|127(?:\\.\\d+){0,2}\\.\\d+$|^(?:0*\\:)*?:?0*1", Pattern.CASE_INSENSITIVE); - private static final Map ALTERNATIVES = Map.of( - "http", "https", - "ftp", "sftp, scp or ftps", - "telnet", "ssh"); + private static final Set CLEARTEXT_PROTOCOLS = CleartextProtocolFilter.getCleartextProtocols(); private static final String SENSITIVE_HTTP_SERVER_START_FQN = "socketserver.BaseServer.serve_forever"; private static final String SENSITIVE_HTTP_SERVER_BIND_FQN = "socketserver.BaseServer.server_bind"; private static final Set SENSITIVE_HTTP_SERVER_METHOD_NAMES = Set.of("serve_forever", "server_bind"); @@ -166,28 +157,22 @@ private static void handleAssignmentStatement(AssignmentStatement assignmentStat } private static Optional unsafeProtocol(String literalValue) { - for (String protocol : SENSITIVE_PROTOCOLS) { - if (literalValue.startsWith(protocol)) { - try { - URI uri = new URI(literalValue); - String host = uri.getHost(); - if (host == null) { - // handle ipv6 loopback - host = uri.getAuthority(); - } - if (host == null || LOOPBACK.matcher(host).matches()) { - return Optional.empty(); - } - } catch (URISyntaxException e) { - // not parseable uri, try to find loopback in the substring without protocol, this handles case of url formatted as string - if (LOOPBACK.matcher(literalValue.substring(protocol.length())).find()) { - return Optional.empty(); - } + return CLEARTEXT_PROTOCOLS.stream() + .filter(literalValue::startsWith) + .filter(p -> { + String rest = literalValue.substring(p.length()); + if (rest.isEmpty()) { + // Bare scheme string (e.g. "http://") — always flag + return true; } - return Optional.of(protocol); - } - } - return Optional.empty(); + char first = rest.charAt(0); + if (first == '/' || first == '?' || first == '#') { + // No authority component (e.g. "http:///path") — no host to evaluate + return false; + } + return !CleartextProtocolFilter.isSafeWithoutTls(literalValue); + }) + .findFirst(); } private static Optional isUnsafeLib(String qualifiedName) { @@ -204,6 +189,7 @@ private static Optional isUnsafeLib(String qualifiedName) { } private static String message(String protocol) { - return "Using " + protocol + " protocol is insecure. Use " + ALTERNATIVES.get(protocol) + " instead"; + return CleartextProtocolFilter.getIssueMessage(protocol) + .orElse("Using " + protocol + " protocol is insecure. Use a secure alternative instead."); } } diff --git a/python-checks/src/test/resources/checks/hotspots/clearTextProtocols.py b/python-checks/src/test/resources/checks/hotspots/clearTextProtocols.py index 6cb89b054..0f0680c3f 100644 --- a/python-checks/src/test/resources/checks/hotspots/clearTextProtocols.py +++ b/python-checks/src/test/resources/checks/hotspots/clearTextProtocols.py @@ -6,7 +6,7 @@ import ssl def clear_text_protocol(): - url = "http://" # Noncompliant {{Using http protocol is insecure. Use https instead}} + url = "http://" # Noncompliant {{Using HTTP protocol is insecure. Use HTTPS instead.}} # ^^^^^^^^^ url = "http://exemple.com" # Noncompliant url = "http://0001::1" # Noncompliant @@ -17,10 +17,10 @@ def clear_text_protocol(): url = "http://subdomain.exemple.com" # Noncompliant # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - url = "ftp://" # Noncompliant {{Using ftp protocol is insecure. Use sftp, scp or ftps instead}} + url = "ftp://" # Noncompliant {{Using FTP protocol is insecure. Use SFTP, SCP or FTPS instead.}} url = "ftp://anonymous@exemple.com" # Noncompliant url = "telnet://" # Noncompliant - url = "telnet://anonymous@exemple.com" # Noncompliant {{Using telnet protocol is insecure. Use ssh instead}} + url = "telnet://anonymous@exemple.com" # Noncompliant {{Using Telnet protocol is insecure. Use SSH instead.}} # Argument default value def download(url='http://exemple.com'): # Noncompliant @@ -41,7 +41,7 @@ def download(url='http://exemple.com'): # Noncompliant # The url domain component is a loopback address. url = "http://localhost" # Compliant url = "http://127.0.0.1" # Compliant - url = "http://::1" # Compliant + url = "http://::1" # Noncompliant url = "ftp://user@localhost" # Compliant # url without authority @@ -52,10 +52,10 @@ def download(url='ssh://exemple.com'): # Compliant print(url) - cnx = telnetlib.Telnet("towel.blinkenlights.nl") # Noncompliant {{Using telnet protocol is insecure. Use ssh instead}} + cnx = telnetlib.Telnet("towel.blinkenlights.nl") # Noncompliant {{Using Telnet protocol is insecure. Use SSH instead.}} # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cnx = Telnet("towel.blinkenlights.nl") # Noncompliant - cnx = ftplib.FTP("194.244.111.175") # Noncompliant {{Using ftp protocol is insecure. Use sftp, scp or ftps instead}} + cnx = ftplib.FTP("194.244.111.175") # Noncompliant {{Using FTP protocol is insecure. Use SFTP, SCP or FTPS instead.}} cnx = FTP("194.244.111.175") # Noncompliant cnx = ftplib.FTP_TLS("secure.example.com") # Compliant cnx = FTP_TLS("secure.example.com") # Compliant @@ -77,17 +77,49 @@ def download(url='ssh://exemple.com'): # Compliant url = "http://127.63.31.15" # Compliant url = "http://127.255.255.254" # Compliant - url = "http://0:0:0:0:0:0:0:1" # Compliant - url = "http://0000:0000:0000:0000:0000:0000:0000:0001" # Compliant - url = "http://::1" # Compliant - url = "http://0::1" # Compliant - url = "http://0:0:0::1" # Compliant - url = "http://0000::0001" # Compliant - url = "http://0000:0:0000::0001" # Compliant - url = "http://0000:0:0000::1" # Compliant - url = "http://0::0:1" # Compliant + # Unbracketed IPv6 is not a valid HTTP URL (RFC 3986 requires brackets); the new filter no longer treats these as safe + url = "http://0:0:0:0:0:0:0:1" # Noncompliant + url = "http://0000:0000:0000:0000:0000:0000:0000:0001" # Noncompliant + url = "http://::1" # Noncompliant + url = "http://0::1" # Noncompliant + url = "http://0:0:0::1" # Noncompliant + url = "http://0000::0001" # Noncompliant + url = "http://0000:0:0000::0001" # Noncompliant + url = "http://0000:0:0000::1" # Noncompliant + url = "http://0::0:1" # Noncompliant url = "ftp://user@localhost" # Compliant + # Bracketed IPv6 loopback is a valid URL and is safe + url = "http://[::1]" # Compliant + url = "http://[0:0:0:0:0:0:0:1]" # Compliant + url = "http://[::1]:8080/api" # Compliant + + # Cloud instance metadata endpoints are internal and not publicly reachable + url = "http://169.254.169.254/latest/meta-data/" # Compliant + url = "http://169.254.169.254/latest/api/token" # Compliant + url = "http://[fd00:ec2::254]/latest/meta-data/" # Compliant + url = "http://168.63.129.16/" # Compliant + url = "http://100.100.100.200/latest/meta-data/" # Compliant + url = "http://metadata.google.internal/computeMetadata/v1" # Compliant + + # Docker and Kubernetes internal hostnames are not publicly reachable + url = "http://host.docker.internal:8085/metrics" # Compliant + url = "http://vault.vault.svc.cluster.local:8200" # Compliant + url = "http://auth-service.prod.svc.cluster.local:3001/auth" # Compliant + + # Well-known namespace URI authorities: http:// prefix is part of the identifier, not a network endpoint + url = "http://www.w3.org/2001/XMLSchema" # Compliant + url = "http://schemas.xmlsoap.org/soap/envelope/" # Compliant + url = "http://www.springframework.org/schema/beans" # Compliant + url = "http://maven.apache.org/POM/4.0.0" # Compliant + url = "http://schema.org/Person" # Compliant + + # IANA-reserved documentation domains are placeholder URLs, not real endpoints + url = "http://example.com/path" # Compliant + url = "http://example.net" # Compliant + url = "http://api.example.com/v1/users" # Compliant + url = "ftp://example.com/file" # Compliant + self.server_url = 'http://127.0.0.1:%s' % self.server.port # compliant, loopback def get_url(self, path): return "http://127.0.0.1:%d%s" % (self.port, path) # compliant, loopback From 7cb355061e16709cb2c3ce53bf1e19aed559578b Mon Sep 17 00:00:00 2001 From: "Teemu R." Date: Wed, 17 Jun 2026 11:33:12 +0200 Subject: [PATCH 142/322] SONARPY-4248 Add support for bandit's # nosec directive (#1183) Co-authored-by: Claude Opus 4.7 (1M context) GitOrigin-RevId: 93c06d9ef7b24b76d1120bac3daeb3af937c5f24 --- .../profiles/nosonar.xml | 5 ++ .../projects/nosonar/nosec-project/main.py | 26 +++++++ .../sonar/python/it/plugin/NoSonarTest.java | 43 ++++++++++++ .../sonar/python/checks/NoQaCommentCheck.java | 17 +++-- .../src/test/resources/checks/noqaComment.py | 25 ++++++- .../resources/checks/nosonarCommentFormat.py | 15 +++++ .../nosonar/NoSonarIssueFilterTest.java | 14 ++++ .../nosonar/NoSonarLineInfoCollectorTest.java | 27 ++++++++ .../python/api/nosonar/NoSonarInfoParser.java | 55 +++++++++++++-- .../api/nosonar/NoSonarInfoParserTest.java | 67 ++++++++++++++++++- 10 files changed, 283 insertions(+), 11 deletions(-) create mode 100644 its/plugin/it-python-plugin-test/projects/nosonar/nosec-project/main.py diff --git a/its/plugin/it-python-plugin-test/profiles/nosonar.xml b/its/plugin/it-python-plugin-test/profiles/nosonar.xml index aa89d670f..4da1b3fb8 100644 --- a/its/plugin/it-python-plugin-test/profiles/nosonar.xml +++ b/its/plugin/it-python-plugin-test/profiles/nosonar.xml @@ -22,5 +22,10 @@ S1309 INFO + + python + S4423 + INFO + diff --git a/its/plugin/it-python-plugin-test/projects/nosonar/nosec-project/main.py b/its/plugin/it-python-plugin-test/projects/nosonar/nosec-project/main.py new file mode 100644 index 000000000..58c099eaf --- /dev/null +++ b/its/plugin/it-python-plugin-test/projects/nosonar/nosec-project/main.py @@ -0,0 +1,26 @@ +import ssl + +# Bare nosec suppresses every rule on the line (Bandit semantics). +ssl.SSLContext(ssl.PROTOCOL_TLSv1) +ssl.SSLContext(ssl.PROTOCOL_TLSv1) # nosec + +# Scoped nosec with a Bandit ID narrows suppression to that ID; B502 has no Sonar mapping, so S4423 still fires. +ssl.SSLContext(ssl.PROTOCOL_TLSv1) # nosec B502 legacy peer + +# Selective suppression by Sonar rule key. +ssl.SSLContext(ssl.PROTOCOL_TLSv1) # nosec S4423 + +# Selective suppression narrows to the listed keys; OneStatementPerLine still fires. +ssl.SSLContext(ssl.PROTOCOL_TLSv1); ssl.SSLContext(ssl.PROTOCOL_TLSv1_1) # nosec S4423 + +# Baseline: two S4423 + OneStatementPerLine all fire. +ssl.SSLContext(ssl.PROTOCOL_TLSv1); ssl.SSLContext(ssl.PROTOCOL_TLSv1_1) + +# Known FN: bare nosec silences a non-security rule on the same line. +ssl.SSLContext(ssl.PROTOCOL_TLSv1); ssl.SSLContext(ssl.PROTOCOL_TLSv1_1) # nosec + +# Trailing directive on the last statement. +ssl.SSLContext(ssl.PROTOCOL_TLSv1) # nosec + +# Selective suppression lets S4423 through +ssl.SSLContext(ssl.PROTOCOL_TLSv1) # nosec S1234 diff --git a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/NoSonarTest.java b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/NoSonarTest.java index 41591ea41..3b5e59edd 100644 --- a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/NoSonarTest.java +++ b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/NoSonarTest.java @@ -31,6 +31,7 @@ public class NoSonarTest { private static final String NO_SONAR_PROJECT_KEY = "nosonar"; private static final String EXTERNAL_ISSUE_PROJECT_KEY = "external-issues"; private static final String NOQA_PROJECT_KEY = "noqa"; + private static final String NO_SEC_PROJECT_KEY = "nosec"; private static final String PROFILE_NAME = "nosonar"; @@ -132,6 +133,48 @@ void test_noqa() { .containsIssue(22, "python:S1309").doesNotContainIssue(22, "python:PrintStatementUsage"); } + @Test + void test_nosec() { + analyzeProject(createScanner(NO_SEC_PROJECT_KEY, "projects/nosonar/nosec-project")); + + IssueListAssert.assertThat(issues(NO_SEC_PROJECT_KEY)) + .hasSize(14) + // bare nosec suppresses everything on the line; S1309 still fires (whitelisted) + .containsIssue(4, "python:S4423") + .doesNotContainIssue(5, "python:S4423") + .containsIssue(5, "python:S1309") + + // scoped bandit ID has no Sonar mapping, so S4423 still fires + .containsIssue(8, "python:S4423") + .containsIssue(8, "python:S1309") + + // selective suppression by Sonar rule key + .doesNotContainIssue(11, "python:S4423") + .containsIssue(11, "python:S1309") + + // selective suppression narrows to listed keys; OneStatementPerLine still fires + .doesNotContainIssue(14, "python:S4423") + .containsIssue(14, "python:OneStatementPerLine") + .containsIssue(14, "python:S1309") + + // baseline: 2 x S4423 + OneStatementPerLine all fire + .containsIssue(17, "python:S4423") + .containsIssue(17, "python:OneStatementPerLine") + + // FN: bare nosec silences a non-security rule on the same line + .doesNotContainIssue(20, "python:S4423") + .doesNotContainIssue(20, "python:OneStatementPerLine") + .containsIssue(20, "python:S1309") + + // nosec at end of file + .doesNotContainIssue(23, "python:S4423") + .containsIssue(23, "python:S1309") + + // scoped nosec with unrelated key does not suppress S4423 + .containsIssue(26, "python:S4423") + .containsIssue(26, "python:S1309"); + } + private void analyzeProject(SonarScanner scanner) { String projectKey = scanner.getProperty("sonar.projectKey"); ORCHESTRATOR.getServer().provisionProject(projectKey, projectKey); diff --git a/python-checks/src/main/java/org/sonar/python/checks/NoQaCommentCheck.java b/python-checks/src/main/java/org/sonar/python/checks/NoQaCommentCheck.java index 5351828fa..ea1b0bb25 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/NoQaCommentCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/NoQaCommentCheck.java @@ -26,16 +26,25 @@ @Rule(key = "S1309") public class NoQaCommentCheck extends PythonSubscriptionCheck { - private static final String MESSAGE = "Is #noqa used to exclude false-positive or to hide real quality flaw?"; + private static final String NOQA_MESSAGE = "Is 'noqa' used to exclude false-positive or to hide real quality flaw?"; + private static final String NOSEC_MESSAGE = "Is 'nosec' used to exclude false-positive or to hide real security issue?"; @Override public void initialize(Context context) { context.registerSyntaxNodeConsumer(Tree.Kind.TOKEN, ctx -> { Token token = (Token) ctx.syntaxNode(); for (Trivia trivia : token.trivia()) { - String commentLine = trivia.token().value(); - if (NoSonarInfoParser.isValidNoQa(commentLine)) { - ctx.addIssue(trivia.token(), MESSAGE); + for (String comment : NoSonarInfoParser.splitInlineComments(trivia.token().value())) { + String message = null; + if (NoSonarInfoParser.isValidNoQa(comment)) { + message = NOQA_MESSAGE; + } else if (NoSonarInfoParser.isValidNoSec(comment)) { + message = NOSEC_MESSAGE; + } + if (message != null) { + ctx.addIssue(trivia.token(), message); + break; + } } } }); diff --git a/python-checks/src/test/resources/checks/noqaComment.py b/python-checks/src/test/resources/checks/noqaComment.py index 3398d82f2..8dad02834 100644 --- a/python-checks/src/test/resources/checks/noqaComment.py +++ b/python-checks/src/test/resources/checks/noqaComment.py @@ -1,5 +1,5 @@ def divide(numerator, denominator): -# Noncompliant@+1 {{Is #noqa used to exclude false-positive or to hide real quality flaw?}} +# Noncompliant@+1 {{Is 'noqa' used to exclude false-positive or to hide real quality flaw?}} return numerator / denominator # noqa denominator value might be 0 # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -30,3 +30,26 @@ def divide(numerator, denominator): # this is not no qa a = "noqa-text" text = "noqa is mentioned here" + +# --- nosec cases --- +# S1309 is raised for both noqa and nosec suppression directives, so they share this fixture. + +# Noncompliant@+1 {{Is 'nosec' used to exclude false-positive or to hide real security issue?}} +import ssl # nosec +# ^^^^^^^ + +# Noncompliant@+1 +import ssl # nosec B101 + +# Noncompliant@+1 +import ssl # nosec S4423, S5332 reason text + +# Noncompliant@+1 +# NOSEC + +# a nosec just mixed in should not be detected + +# no sec with space should not be detected + +# Noncompliant@+1 {{Is 'nosec' used to exclude false-positive or to hide real security issue?}} +# some comment followed by # nosec should be detected diff --git a/python-checks/src/test/resources/checks/nosonarCommentFormat.py b/python-checks/src/test/resources/checks/nosonarCommentFormat.py index aaa0e5b37..97fc0408f 100644 --- a/python-checks/src/test/resources/checks/nosonarCommentFormat.py +++ b/python-checks/src/test/resources/checks/nosonarCommentFormat.py @@ -40,3 +40,18 @@ # NOSONAR(NoSonar) # Noncompliant@+1 # NOSONAR(python:S1234) + +# nosec +# nosec B101 +# nosec B101, B102 +# nosec B101, B102 reason text +# nosec: S1234, S5678 +# nosec because of foo, bar, and baz +# Noncompliant@+1 +# nosec B101, +# Noncompliant@+1 +# nosec ,B101 +# Noncompliant@+1 +# nosec B101,,B102 +# Noncompliant@+1 +# nosec B101 reason, B102 diff --git a/python-commons/src/test/java/org/sonar/plugins/python/nosonar/NoSonarIssueFilterTest.java b/python-commons/src/test/java/org/sonar/plugins/python/nosonar/NoSonarIssueFilterTest.java index 17b0d7299..793ce0cfb 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/nosonar/NoSonarIssueFilterTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/nosonar/NoSonarIssueFilterTest.java @@ -71,4 +71,18 @@ private static Stream provideFilterParameters() { Arguments.of(Map.of(), "my_rule", 1, false, false) ); } + + // Known FN of `# nosec` handling: a bare `# nosec` suppresses every rule on the line, even non-security ones. + @ParameterizedTest + @MethodSource("provideNoSecFalseNegativeParameters") + void noSecFalseNegativeTest(Map noSonarInfos, String ruleKey, int line, boolean filterChainAcceptResult, boolean expectedResult) { + test(noSonarInfos, ruleKey, line, filterChainAcceptResult, expectedResult); + } + + private static Stream provideNoSecFalseNegativeParameters() { + return Stream.of( + // FN: bare `# nosec` silences a non-security rule (e.g. S1481 unused local). + Arguments.of(Map.of(1, new NoSonarLineInfo(Set.of(), "")), "S1481", 1, true, false) + ); + } } diff --git a/python-commons/src/test/java/org/sonar/plugins/python/nosonar/NoSonarLineInfoCollectorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/nosonar/NoSonarLineInfoCollectorTest.java index 7fb2f6e07..949e76dcd 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/nosonar/NoSonarLineInfoCollectorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/nosonar/NoSonarLineInfoCollectorTest.java @@ -185,6 +185,33 @@ private static Stream provideCollectorParameters() { Set.of(1, 2, 3, 4, 5), "", "" + ), + Arguments.of(""" + import hashlib + hashlib.md5(b"x").hexdigest() # nosec + """, + Map.of(2, new NoSonarLineInfo(Set.of(), "")), + Set.of(2), + "", + "" + ), + Arguments.of(""" + import hashlib + hashlib.md5(b"x").hexdigest() # nosec B303 legacy hash + """, + Map.of(2, new NoSonarLineInfo(Set.of("B303"))), + Set.of(), + "B303", + "B303:" + ), + Arguments.of(""" + import ssl + ssl.SSLContext(ssl.PROTOCOL_TLSv1) # nosec S4423 + """, + Map.of(2, new NoSonarLineInfo(Set.of("S4423"))), + Set.of(), + "S4423", + "S4423:" ) ); } diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/nosonar/NoSonarInfoParser.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/nosonar/NoSonarInfoParser.java index 4f80be0f4..954799d53 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/nosonar/NoSonarInfoParser.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/nosonar/NoSonarInfoParser.java @@ -33,20 +33,24 @@ public class NoSonarInfoParser { private static final String NOQA_PATTERN_REGEX = "^#\\s*noqa(?::\\s*(.+))?(?:[\\s;:].*)?"; private static final String NOSONAR_PREFIX_REGEX = "^#\\s*NOSONAR(\\W.*)?"; private static final String NOSONAR_PATTERN_REGEX = "^#\\s*NOSONAR(?:\\s*\\(([^)]*)\\))?($|\\s.*)"; + private static final String NOSEC_PATTERN_REGEX = "(?i)^#\\s*nosec\\b[:\\s]*(.*)"; + private static final String NOSEC_RULE_KEY_REGEX = "^[A-Za-z]\\d+$"; private static final String RULE_KEY_PATTERN_REGEX = "^[a-zA-Z0-9]+$"; private final Pattern noSonarPattern; private final Pattern noQaPattern; + private final Pattern noSecPattern; public NoSonarInfoParser() { noSonarPattern = Pattern.compile(NOSONAR_PATTERN_REGEX); noQaPattern = Pattern.compile(NOQA_PATTERN_REGEX); + noSecPattern = Pattern.compile(NOSEC_PATTERN_REGEX); } public boolean isInvalidIssueSuppressionComment(String commentsLine) { return splitInlineComments(commentsLine) .stream() - .anyMatch(comment -> isInvalidNoSonarComment(comment) || isInvalidNoQaComment(comment)); + .anyMatch(comment -> isInvalidNoSonarComment(comment) || isInvalidNoQaComment(comment) || isInvalidNoSecComment(comment)); } private boolean isInvalidNoSonarComment(String comment) { @@ -86,6 +90,20 @@ private boolean isInvalidNoQaComment(String comment) { return !rules.isEmpty() && rules.stream().anyMatch(r -> r.isBlank() || r.contains(" ")); } + private boolean isInvalidNoSecComment(String comment) { + if (!isValidNoSec(comment)) { + return false; + } + var args = getParamsString(noSecPattern, comment); + if (!args.contains(",")) { + return false; + } + var tokens = parseSuppressionRules(args); + // Only flag when the args look like a rule list (>=1 rule-shape token); free-form reasons with commas stay valid. + var ruleKeys = tokens.stream().filter(t -> t.matches(NOSEC_RULE_KEY_REGEX)).toList(); + return !ruleKeys.isEmpty() && ruleKeys.size() != tokens.size(); + } + private static boolean isValidNoSonar(String noSonarCommentLine) { return noSonarCommentLine.matches(NOSONAR_PATTERN_REGEX); } @@ -94,6 +112,10 @@ public static boolean isValidNoQa(String noSonarCommentLine) { return noSonarCommentLine.matches(NOQA_PATTERN_REGEX); } + public static boolean isValidNoSec(String commentLine) { + return commentLine.matches(NOSEC_PATTERN_REGEX); + } + public Optional parse(String commentLine) { var rules = new HashSet(); StringBuilder concatenatedCommentBuilder = new StringBuilder(); @@ -132,13 +154,20 @@ private NoSonarLineInfo parseComment(String commentLine) { .filter(Predicate.not(String::isEmpty)) .forEach(rules::add); comment = parseNoQaComment(commentLine); + } else if (isValidNoSec(commentLine)) { + var noSecRules = parseNoSecRules(commentLine); + if (noSecRules.isEmpty()) { + comment = parseNoSecComment(commentLine); + } else { + rules.addAll(noSecRules); + } } else { return null; } return new NoSonarLineInfo(rules, comment); } - private static List splitInlineComments(String commentsLine) { + public static List splitInlineComments(String commentsLine) { return Stream.of(commentsLine.split("#")) .filter(Predicate.not(String::isBlank)) .map(s -> "#" + s) @@ -155,7 +184,21 @@ private String parseNoSonarComment(String noSonarCommentLine) { } private List parseNoQaRules(String noSonarCommentLine) { - var paramsString = getParamsString(noQaPattern, noSonarCommentLine); + return parseSuppressionRules(getParamsString(noQaPattern, noSonarCommentLine)); + } + + private String parseNoQaComment(String noSonarCommentLine) { + return getTruncatedCommentString(noQaPattern, noSonarCommentLine).strip(); + } + + private List parseNoSecRules(String noSecCommentLine) { + return parseSuppressionRules(getParamsString(noSecPattern, noSecCommentLine)) + .stream() + .filter(t -> t.matches(NOSEC_RULE_KEY_REGEX)) + .toList(); + } + + private static List parseSuppressionRules(String paramsString) { var paramsList = parseParamsString(paramsString).collect(Collectors.toList()); if (!paramsList.isEmpty()) { // to get the last suppressed rule ID we need to split it to cut the trailing comment text. @@ -170,8 +213,10 @@ private List parseNoQaRules(String noSonarCommentLine) { return paramsList; } - private String parseNoQaComment(String noSonarCommentLine) { - return getTruncatedCommentString(noQaPattern, noSonarCommentLine).strip(); + private String parseNoSecComment(String noSecCommentLine) { + var raw = getPatternGroup(1, noSecPattern, noSecCommentLine); + var truncated = raw.length() > MAX_COMMENT_LENGTH ? raw.substring(0, MAX_COMMENT_LENGTH) : raw; + return truncated.strip(); } private static String getParamsString(Pattern pattern, String noSonarCommentLine) { diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/nosonar/NoSonarInfoParserTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/nosonar/NoSonarInfoParserTest.java index afde41140..c15e2a688 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/nosonar/NoSonarInfoParserTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/nosonar/NoSonarInfoParserTest.java @@ -45,6 +45,10 @@ void parsingTest(String commentString, NoSonarLineInfo expectedLineInfo) { } private static Stream provideParserParameters() { + return Stream.concat(provideNoSonarAndNoQaParserParameters(), provideNoSecParserParameters()); + } + + private static Stream provideNoSonarAndNoQaParserParameters() { return Stream.of( Arguments.of( "# NOSONAR(something)", @@ -134,6 +138,55 @@ private static Stream provideParserParameters() { ); } + private static Stream provideNoSecParserParameters() { + return Stream.of( + Arguments.of( + "# nosec", + new NoSonarLineInfo(Set.of()) + ), + Arguments.of( + "# nosec B101", + new NoSonarLineInfo(Set.of("B101")) + ), + Arguments.of( + "# nosec B101, B102 reason text", + new NoSonarLineInfo(Set.of("B101", "B102")) + ), + Arguments.of( + "# nosec S1234", + new NoSonarLineInfo(Set.of("S1234")) + ), + Arguments.of( + "# nosec S1234, S5678", + new NoSonarLineInfo(Set.of("S1234", "S5678")) + ), + Arguments.of( + "# nosec: S1234, S5678 reason text", + new NoSonarLineInfo(Set.of("S1234", "S5678")) + ), + Arguments.of( + "# nosec B303, S1234", + new NoSonarLineInfo(Set.of("B303", "S1234")) + ), + Arguments.of( + "# nosec: it's fine", + new NoSonarLineInfo(Set.of(), "it's fine") + ), + Arguments.of( + "# NOSEC", + new NoSonarLineInfo(Set.of()) + ), + Arguments.of( + "# nosec a very long comment that I don't want to keep that long because there is more than 50 characters", + new NoSonarLineInfo(Set.of(), "a very long comment that I don't want to keep that") + ), + Arguments.of( + "# some text # nosec", + new NoSonarLineInfo(Set.of()) + ) + ); + } + @ParameterizedTest @MethodSource("provideValidationParameters") void validationTest(String commentString, boolean expectedIsInvalid) { @@ -187,7 +240,19 @@ private static Stream provideValidationParameters() { Arguments.of("#NOSONAR(S3)", false), Arguments.of("#NOSONAR(python:S3723)", true), Arguments.of("#NOSONAR(S-123)", true), - Arguments.of("#NOSONAR(NoSonar)", false) + Arguments.of("#NOSONAR(NoSonar)", false), + + Arguments.of("# nosec", false), + Arguments.of("# nosec B101", false), + Arguments.of("# nosec B101, B102", false), + Arguments.of("# nosec B101, B102 reason text", false), + Arguments.of("# nosec: S1234, S5678", false), + Arguments.of("# nosec because of foo, bar, and baz", false), + Arguments.of("# nosec B101,", true), + Arguments.of("# nosec ,B101", true), + Arguments.of("# nosec B101,,B102", true), + Arguments.of("# nosec B101, foo", true), + Arguments.of("# nosec B101 reason, B102", true) ); } From 095344cb5deeca5f904a1011dcb7f8ed986da8ec Mon Sep 17 00:00:00 2001 From: Pierre-Loup <49131563+pierre-loup-tristant-sonarsource@users.noreply.github.com> Date: Wed, 17 Jun 2026 14:41:58 +0200 Subject: [PATCH 143/322] SONARPY-4278 Narrow S5852 to exponential backtracking and create S8786 (#1190) Co-authored-by: Nils Werner <64034005+nils-werner-sonarsource@users.noreply.github.com> Co-authored-by: Claude Sonnet 4.6 (1M context) GitOrigin-RevId: 1bd378324f03e3ab6c032c0f4951629e9959ccc5 --- .../python/checks/OpenSourceCheckList.java | 2 + .../checks/regex/AbstractRedosCheck.java | 41 +++++++ .../sonar/python/checks/regex/RedosCheck.java | 102 ++-------------- .../checks/regex/RedosMatchTypeHelper.java | 102 ++++++++++++++++ .../checks/regex/SuperLinearRegexCheck.java | 36 ++++++ .../org/sonar/l10n/py/rules/python/S8786.html | 46 +++++++ .../org/sonar/l10n/py/rules/python/S8786.json | 24 ++++ .../python/Sonar_agentic_AI_profile.json | 3 +- .../py/rules/python/Sonar_way_profile.json | 3 +- .../regex/SuperLinearRegexCheckTest.java | 28 +++++ .../test/resources/checks/regex/redosCheck.py | 84 ++++++------- .../checks/regex/superLinearRegexCheck.py | 114 ++++++++++++++++++ 12 files changed, 446 insertions(+), 139 deletions(-) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/regex/AbstractRedosCheck.java create mode 100644 python-checks/src/main/java/org/sonar/python/checks/regex/RedosMatchTypeHelper.java create mode 100644 python-checks/src/main/java/org/sonar/python/checks/regex/SuperLinearRegexCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8786.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8786.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/regex/SuperLinearRegexCheckTest.java create mode 100644 python-checks/src/test/resources/checks/regex/superLinearRegexCheck.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index db35dd0f5..91d54e0b1 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -87,6 +87,7 @@ import org.sonar.python.checks.regex.SingleCharacterAlternationCheck; import org.sonar.python.checks.regex.StringReplaceCheck; import org.sonar.python.checks.regex.SuperfluousCurlyBraceCheck; +import org.sonar.python.checks.regex.SuperLinearRegexCheck; import org.sonar.python.checks.regex.UnquantifiedNonCapturingGroupCheck; import org.sonar.python.checks.regex.UnusedGroupNamesCheck; import org.sonar.python.checks.regex.VerboseRegexCheck; @@ -424,6 +425,7 @@ public Stream> getChecks() { SklearnPipelineSpecifyMemoryArgumentCheck.class, SklearnPipelineParameterAreCorrectCheck.class, SuperfluousCurlyBraceCheck.class, + SuperLinearRegexCheck.class, SynchronousFileOperationsInAsyncCheck.class, SynchronousHttpOperationsInAsyncCheck.class, SynchronousSubprocessOperationsInAsyncCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/regex/AbstractRedosCheck.java b/python-checks/src/main/java/org/sonar/python/checks/regex/AbstractRedosCheck.java new file mode 100644 index 000000000..12e90b4b8 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/regex/AbstractRedosCheck.java @@ -0,0 +1,41 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.regex; + +import java.util.Optional; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonarsource.analyzer.commons.regex.MatchType; +import org.sonarsource.analyzer.commons.regex.RegexParseResult; +import org.sonarsource.analyzer.commons.regex.finders.RedosFinder; + +public abstract class AbstractRedosCheck extends AbstractRegexCheck { + + @Override + public void checkRegex(RegexParseResult regexParseResult, CallExpression regexFunctionCall) { + MatchType matchType = RedosMatchTypeHelper.getMatchTypeFromCalledMethod(regexFunctionCall); + new PythonRedosFinder().checkRegex(regexParseResult, matchType, this::addIssue); + } + + protected abstract Optional buildMessage(RedosFinder.BacktrackingType backtrackingType, boolean regexContainsBackReference); + + private class PythonRedosFinder extends RedosFinder { + @Override + protected Optional message(RedosFinder.BacktrackingType backtrackingType, boolean regexContainsBackReference) { + return buildMessage(backtrackingType, regexContainsBackReference); + } + } +} diff --git a/python-checks/src/main/java/org/sonar/python/checks/regex/RedosCheck.java b/python-checks/src/main/java/org/sonar/python/checks/regex/RedosCheck.java index 7f443b677..b449784c6 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/regex/RedosCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/regex/RedosCheck.java @@ -18,111 +18,23 @@ import java.util.Optional; -import java.util.Set; -import java.util.function.Predicate; import org.sonar.check.Rule; -import org.sonar.plugins.python.api.symbols.Symbol; -import org.sonar.plugins.python.api.symbols.Usage; -import org.sonar.plugins.python.api.tree.AssignmentStatement; -import org.sonar.plugins.python.api.tree.CallExpression; -import org.sonar.plugins.python.api.tree.HasSymbol; -import org.sonar.plugins.python.api.tree.Name; -import org.sonar.plugins.python.api.tree.Tree; -import org.sonar.python.tree.TreeUtils; -import org.sonarsource.analyzer.commons.regex.MatchType; -import org.sonarsource.analyzer.commons.regex.RegexParseResult; import org.sonarsource.analyzer.commons.regex.finders.RedosFinder; - @Rule(key = "S5852") -public class RedosCheck extends AbstractRegexCheck { +public class RedosCheck extends AbstractRedosCheck { private static final String MESSAGE = """ Make sure the regex used here, which is vulnerable to %s runtime due to backtracking,\ cannot lead to denial of service."""; private static final String EXP = "exponential"; - private static final String POLY = "polynomial"; - private static final Set FULL_MATCH_METHODS = Set.of("fullmatch"); - private static final Set PARTIAL_MATCH_METHODS = Set.of("findall", "search", "split", "sub", "subn"); - private static final String COMPILE_METHOD = "compile"; @Override - public void checkRegex(RegexParseResult regexParseResult, CallExpression regexFunctionCall) { - MatchType matchType = getMatchTypeFromCalledMethod(regexFunctionCall); - new PythonRedosFinder().checkRegex(regexParseResult, matchType, this::addIssue); - } - - private static MatchType getMatchTypeFromCalledMethod(CallExpression regexFunctionCall) { - Symbol symbol = regexFunctionCall.calleeSymbol(); - if (symbol == null) { - // Defensive, callee symbol should have been checked prior to calling "checkRegex" - return MatchType.UNKNOWN; - } - if (FULL_MATCH_METHODS.contains(symbol.name())) { - return MatchType.FULL; - } - if (PARTIAL_MATCH_METHODS.contains(symbol.name())) { - return MatchType.PARTIAL; - } - if (COMPILE_METHOD.equals(symbol.name())) { - return matchTypeOfCompiledPattern(regexFunctionCall); - } - return MatchType.UNKNOWN; - } - - private static MatchType matchTypeOfCompiledPattern(CallExpression regexFunctionCall) { - return Optional.ofNullable(TreeUtils.firstAncestorOfKind(regexFunctionCall, Tree.Kind.ASSIGNMENT_STMT)) - .map(AssignmentStatement.class::cast) - .map(a -> a.lhsExpressions().get(0).expressions().get(0)) - .filter(lhs -> lhs.is(Tree.Kind.NAME)) - .map(n -> (Name) n) - .map(HasSymbol::symbol) - .map(RedosCheck::getMatchTypeFromSymbolUsages) - .orElse(MatchType.UNKNOWN); - } - - private static MatchType getMatchTypeFromSymbolUsages(Symbol s) { - boolean isUsedForFullMatch = s.usages().stream().map(Usage::tree).anyMatch(t -> isUsedInMethod(t, FULL_MATCH_METHODS)); - boolean isUsedForPartialMatch = s.usages().stream().map(Usage::tree).anyMatch(t -> isUsedInMethod(t, PARTIAL_MATCH_METHODS)); - return getMatchType(isUsedForFullMatch, isUsedForPartialMatch); - } - - private static MatchType getMatchType(boolean isUsedForFullMatch, boolean isUsedForPartialMatch) { - if (isUsedForFullMatch && isUsedForPartialMatch) { - return MatchType.BOTH; - } - if (isUsedForFullMatch) { - return MatchType.FULL; - } - if (isUsedForPartialMatch) { - return MatchType.PARTIAL; - } - return MatchType.UNKNOWN; - } - - private static boolean isUsedInMethod(Tree tree, Set methodNames) { - return TreeUtils.firstAncestor(tree, isCallToMethod(methodNames)) != null; - } - - private static Predicate isCallToMethod(Set methodNames) { - return tree -> Optional.ofNullable(tree) - .filter(t -> t.is(Tree.Kind.CALL_EXPR)) - .map(CallExpression.class::cast) - .map(CallExpression::calleeSymbol) - .map(Symbol::name) - .filter(methodNames::contains) - .isPresent(); - } - - static class PythonRedosFinder extends RedosFinder { - - @Override - protected Optional message(RedosFinder.BacktrackingType backtrackingType, boolean regexContainsBackReference) { - return switch (backtrackingType) { - case ALWAYS_EXPONENTIAL, QUADRATIC_WHEN_OPTIMIZED, LINEAR_WHEN_OPTIMIZED -> Optional.of(String.format(MESSAGE, EXP)); - case ALWAYS_QUADRATIC -> Optional.of(String.format(MESSAGE, POLY)); - default -> Optional.empty(); - }; - } + protected Optional buildMessage(RedosFinder.BacktrackingType backtrackingType, boolean regexContainsBackReference) { + return switch (backtrackingType) { + // Python has no JIT-style optimisation for QUADRATIC_WHEN_OPTIMIZED or LINEAR_WHEN_OPTIMIZED, so it stays in S5852 + case ALWAYS_EXPONENTIAL, QUADRATIC_WHEN_OPTIMIZED, LINEAR_WHEN_OPTIMIZED -> Optional.of(String.format(MESSAGE, EXP)); + default -> Optional.empty(); + }; } } diff --git a/python-checks/src/main/java/org/sonar/python/checks/regex/RedosMatchTypeHelper.java b/python-checks/src/main/java/org/sonar/python/checks/regex/RedosMatchTypeHelper.java new file mode 100644 index 000000000..3be43f6de --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/regex/RedosMatchTypeHelper.java @@ -0,0 +1,102 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.regex; + +import java.util.Optional; +import java.util.Set; +import java.util.function.Predicate; +import org.sonar.plugins.python.api.symbols.Symbol; +import org.sonar.plugins.python.api.symbols.Usage; +import org.sonar.plugins.python.api.tree.AssignmentStatement; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.HasSymbol; +import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.python.tree.TreeUtils; +import org.sonarsource.analyzer.commons.regex.MatchType; + +final class RedosMatchTypeHelper { + + private static final Set FULL_MATCH_METHODS = Set.of("fullmatch"); + private static final Set PARTIAL_MATCH_METHODS = Set.of("findall", "search", "split", "sub", "subn"); + private static final String COMPILE_METHOD = "compile"; + + private RedosMatchTypeHelper() { + } + + static MatchType getMatchTypeFromCalledMethod(CallExpression regexFunctionCall) { + Symbol symbol = regexFunctionCall.calleeSymbol(); + if (symbol == null) { + // Defensive: callee symbol should have been checked prior to calling "checkRegex" + return MatchType.UNKNOWN; + } + if (FULL_MATCH_METHODS.contains(symbol.name())) { + return MatchType.FULL; + } + if (PARTIAL_MATCH_METHODS.contains(symbol.name())) { + return MatchType.PARTIAL; + } + if (COMPILE_METHOD.equals(symbol.name())) { + return matchTypeOfCompiledPattern(regexFunctionCall); + } + return MatchType.UNKNOWN; + } + + private static MatchType matchTypeOfCompiledPattern(CallExpression regexFunctionCall) { + return Optional.ofNullable(TreeUtils.firstAncestorOfKind(regexFunctionCall, Tree.Kind.ASSIGNMENT_STMT)) + .map(AssignmentStatement.class::cast) + .map(a -> a.lhsExpressions().get(0).expressions().get(0)) + .filter(lhs -> lhs.is(Tree.Kind.NAME)) + .map(n -> (Name) n) + .map(HasSymbol::symbol) + .map(RedosMatchTypeHelper::getMatchTypeFromSymbolUsages) + .orElse(MatchType.UNKNOWN); + } + + private static MatchType getMatchTypeFromSymbolUsages(Symbol s) { + boolean isUsedForFullMatch = s.usages().stream().map(Usage::tree).anyMatch(t -> isUsedInMethod(t, FULL_MATCH_METHODS)); + boolean isUsedForPartialMatch = s.usages().stream().map(Usage::tree).anyMatch(t -> isUsedInMethod(t, PARTIAL_MATCH_METHODS)); + return getMatchType(isUsedForFullMatch, isUsedForPartialMatch); + } + + private static MatchType getMatchType(boolean isUsedForFullMatch, boolean isUsedForPartialMatch) { + if (isUsedForFullMatch && isUsedForPartialMatch) { + return MatchType.BOTH; + } + if (isUsedForFullMatch) { + return MatchType.FULL; + } + if (isUsedForPartialMatch) { + return MatchType.PARTIAL; + } + return MatchType.UNKNOWN; + } + + private static boolean isUsedInMethod(Tree tree, Set methodNames) { + return TreeUtils.firstAncestor(tree, isCallToMethod(methodNames)) != null; + } + + private static Predicate isCallToMethod(Set methodNames) { + return tree -> Optional.ofNullable(tree) + .filter(t -> t.is(Tree.Kind.CALL_EXPR)) + .map(CallExpression.class::cast) + .map(CallExpression::calleeSymbol) + .map(Symbol::name) + .filter(methodNames::contains) + .isPresent(); + } +} diff --git a/python-checks/src/main/java/org/sonar/python/checks/regex/SuperLinearRegexCheck.java b/python-checks/src/main/java/org/sonar/python/checks/regex/SuperLinearRegexCheck.java new file mode 100644 index 000000000..0214cd3df --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/regex/SuperLinearRegexCheck.java @@ -0,0 +1,36 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.regex; + + +import java.util.Optional; +import org.sonar.check.Rule; +import org.sonarsource.analyzer.commons.regex.finders.RedosFinder; + +@Rule(key = "S8786") +public class SuperLinearRegexCheck extends AbstractRedosCheck { + + private static final String MESSAGE = "Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking."; + + @Override + protected Optional buildMessage(RedosFinder.BacktrackingType backtrackingType, boolean regexContainsBackReference) { + return switch (backtrackingType) { + case ALWAYS_QUADRATIC -> Optional.of(MESSAGE); + default -> Optional.empty(); + }; + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8786.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8786.html new file mode 100644 index 000000000..eb27c0fb4 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8786.html @@ -0,0 +1,46 @@ +

                  Regular expression engines rely on backtracking to evaluate patterns against input. Certain regex patterns lead to non-linear backtracking, where +the evaluation time grows polynomially with input size.

                  +

                  Why is this an issue?

                  +

                  Regular expression engines use backtracking to try all possible execution paths when evaluating a pattern against an input. In some cases, this +leads to non-linear backtracking where the worst-case evaluation time grows polynomially (e.g., O(n²) or O(n³)) with the input size. While not as +severe as catastrophic backtracking, such patterns can significantly degrade application performance when processing large or untrusted inputs.

                  +

                  This rule reports regular expressions that exhibit non-linear backtracking behavior.

                  +

                  How to fix it

                  +

                  To fix a regular expression with non-linear backtracking, consider the following strategies:

                  +
                    +
                  • Replace . with negated character classes to exclude separators where applicable (e.g., + instead of . before ,).
                  • +
                  • Use bounded quantifiers such as {1,5} to limit repetitions.
                  • +
                  • Restructure alternations and quantifiers to eliminate ambiguity — avoid patterns where multiple alternatives can match the same character.
                  • +
                  • Use possessive quantifiers and atomic grouping (available since Python 3.11) to prevent the regex engine from keeping backtracking + positions.
                  • +
                  +

                  Code examples

                  +

                  The following regular expression has polynomial backtracking: without a start anchor, the engine retries the pattern at every position, leading to +quadratic evaluation time when there is no match.

                  +

                  Noncompliant code example

                  +
                  +import re
                  +
                  +re.search(r"a+b", input)  # Noncompliant - polynomial backtracking when the pattern does not match
                  +
                  +

                  Compliant solution

                  +

                  Adding a start anchor prevents the engine from retrying at every position:

                  +
                  +import re
                  +
                  +re.search(r"^a+b", input)  # Compliant - anchor eliminates redundant backtracking positions
                  +
                  +

                  Resources

                  +

                  Articles & blog posts

                  + +

                  Related rules

                  +
                    +
                  • {rule:python:S5852} - Regular expressions should not cause catastrophic backtracking
                  • +
                  + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8786.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8786.json new file mode 100644 index 000000000..236ff5b14 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8786.json @@ -0,0 +1,24 @@ +{ + "title": "Regular expressions should not cause non-linear backtracking", + "type": "CODE_SMELL", + "code": { + "impacts": { + "RELIABILITY": "MEDIUM" + }, + "attribute": "EFFICIENT" + }, + "status": "ready", + "quickfix": "unknown", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "20min" + }, + "tags": [ + "regex", + "performance" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-8786", + "sqKey": "S8786", + "scope": "All" +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_agentic_AI_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_agentic_AI_profile.json index 946a16ce9..88ce98945 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_agentic_AI_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_agentic_AI_profile.json @@ -305,6 +305,7 @@ "S8411", "S8413", "S8414", - "S8415" + "S8415", + "S8786" ] } diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 018fc8909..45ffd00ad 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -352,6 +352,7 @@ "S8520", "S8521", "S8572", - "S8685" + "S8685", + "S8786" ] } diff --git a/python-checks/src/test/java/org/sonar/python/checks/regex/SuperLinearRegexCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/regex/SuperLinearRegexCheckTest.java new file mode 100644 index 000000000..ab4d77ca7 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/regex/SuperLinearRegexCheckTest.java @@ -0,0 +1,28 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.regex; + +import org.junit.jupiter.api.Test; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class SuperLinearRegexCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/regex/superLinearRegexCheck.py", new SuperLinearRegexCheck()); + } +} diff --git a/python-checks/src/test/resources/checks/regex/redosCheck.py b/python-checks/src/test/resources/checks/regex/redosCheck.py index 7c9a10be6..3234eabd5 100644 --- a/python-checks/src/test/resources/checks/regex/redosCheck.py +++ b/python-checks/src/test/resources/checks/regex/redosCheck.py @@ -36,11 +36,11 @@ def full_and_partial_match(_input): re.split(r"(.*,)*", _input) # OK, partial match re.sub(r"(.*,)*", _input) # OK, partial match re.subn(r"(.*,)*", _input) # OK, partial match - re.search(r"\s*\s*+,", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to polynomial runtime due to backtracking, cannot lead to denial of service.}} - re.findall(r"\s*\s*+,", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to polynomial runtime due to backtracking, cannot lead to denial of service.}} - re.split(r"\s*\s*+,", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to polynomial runtime due to backtracking, cannot lead to denial of service.}} - re.sub(r"\s*\s*+,", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to polynomial runtime due to backtracking, cannot lead to denial of service.}} - re.subn(r"\s*\s*+,", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to polynomial runtime due to backtracking, cannot lead to denial of service.}} + re.search(r"\s*\s*+,", _input) # OK, polynomial cases now reported by S8786 + re.findall(r"\s*\s*+,", _input) # OK + re.split(r"\s*\s*+,", _input) # OK + re.sub(r"\s*\s*+,", _input) # OK + re.subn(r"\s*\s*+,", _input) # OK def always_exponential(_input): re.fullmatch(r"(.*,)*?", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to exponential runtime due to backtracking, cannot lead to denial of service.}} @@ -55,12 +55,12 @@ def always_exponential(_input): def always_quadratic(_input): - re.fullmatch(r"x*\w*", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to polynomial runtime due to backtracking, cannot lead to denial of service.}} - re.fullmatch(r".*.*X", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to polynomial runtime due to backtracking, cannot lead to denial of service.}} - re.match(r".*.*X", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to polynomial runtime due to backtracking, cannot lead to denial of service.}} - re.fullmatch(r"x*a*x*", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to polynomial runtime due to backtracking, cannot lead to denial of service.}} - re.fullmatch(r"x*(xy?)*", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to polynomial runtime due to backtracking, cannot lead to denial of service.}} - re.fullmatch(r"x*xx*", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to polynomial runtime due to backtracking, cannot lead to denial of service.}} + re.fullmatch(r"x*\w*", _input) # OK, polynomial cases now reported by S8786 + re.fullmatch(r".*.*X", _input) # OK + re.match(r".*.*X", _input) # OK + re.fullmatch(r"x*a*x*", _input) # OK + re.fullmatch(r"x*(xy?)*", _input) # OK + re.fullmatch(r"x*xx*", _input) # OK def always_quadratic_other_match_types(_input): @@ -71,59 +71,59 @@ def always_quadratic_other_match_types(_input): re.match(r"x*(xy?)*", _input) # OK re.search(r"x*(xy?)*", _input) # OK re.match(r"x*xx*", _input) # OK - # FP - re.search(r"x*xx*", _input) # Noncompliant + re.search(r"x*xx*", _input) # OK def non_possessive_followed_by_possessive(_input): - re.fullmatch(r".*\s*", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to polynomial runtime due to backtracking, cannot lead to denial of service.}} + re.fullmatch(r".*\s*", _input) # OK, polynomial cases now reported by S8786 re.match(r".*\s*", _input) # OK re.search(r".*\s*", _input) # OK - re.fullmatch(r".*\s*+", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to polynomial runtime due to backtracking, cannot lead to denial of service.}} + re.fullmatch(r".*\s*+", _input) # OK re.match(r".*\s*+", _input) # OK re.search(r".*\s*+", _input) # OK - re.fullmatch(r"\s*\s*+,", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to polynomial runtime due to backtracking, cannot lead to denial of service.}} - re.match(r"\s*\s*+,", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to polynomial runtime due to backtracking, cannot lead to denial of service.}} - re.search(r"\s*\s*+,", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to polynomial runtime due to backtracking, cannot lead to denial of service.}} - re.fullmatch(r"[a\s]*\s*+,", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to polynomial runtime due to backtracking, cannot lead to denial of service.}} - re.match(r"[a\s]*\s*+,", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to polynomial runtime due to backtracking, cannot lead to denial of service.}} - re.search(r"[a\s]*\s*+,", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to polynomial runtime due to backtracking, cannot lead to denial of service.}} - re.fullmatch(r"[a\s]*b*\s*+,", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to polynomial runtime due to backtracking, cannot lead to denial of service.}} - re.match(r"[a\s]*b*\s*+,", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to polynomial runtime due to backtracking, cannot lead to denial of service.}} - re.search(r"[a\s]*b*\s*+,", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to polynomial runtime due to backtracking, cannot lead to denial of service.}} + re.fullmatch(r"\s*\s*+,", _input) # OK + re.match(r"\s*\s*+,", _input) # OK + re.search(r"\s*\s*+,", _input) # OK + re.fullmatch(r"[a\s]*\s*+,", _input) # OK + re.match(r"[a\s]*\s*+,", _input) # OK + re.search(r"[a\s]*\s*+,", _input) # OK + re.fullmatch(r"[a\s]*b*\s*+,", _input) # OK + re.match(r"[a\s]*b*\s*+,", _input) # OK + re.search(r"[a\s]*b*\s*+,", _input) # OK def implicit_reluctant_quantifier_in_partial_match(_input): - re.search(r"\s*,", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to polynomial runtime due to backtracking, cannot lead to denial of service.}} + re.search(r"\s*,", _input) # OK, polynomial cases now reported by S8786 re.match(r"\s*,", _input) # OK re.fullmatch(r"\s*,", _input) # OK - re.search(r"\s*+,", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to polynomial runtime due to backtracking, cannot lead to denial of service.}} + re.search(r"\s*+,", _input) # OK re.match(r"\s*+,", _input) # OK re.fullmatch(r"\s*+,", _input) # OK - re.search(r"(?s:.*)\s*,(?s:.*)", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to polynomial runtime due to backtracking, cannot lead to denial of service.}} - re.match(r"(?s:.*)\s*,(?s:.*)", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to polynomial runtime due to backtracking, cannot lead to denial of service.}} - re.fullmatch(r"(?s:.*)\s*,(?s:.*)", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to polynomial runtime due to backtracking, cannot lead to denial of service.}} - re.search(r"(?s:.*)\s*+,(?s:.*)", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to polynomial runtime due to backtracking, cannot lead to denial of service.}} - re.match(r"(?s:.*)\s*+,(?s:.*)", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to polynomial runtime due to backtracking, cannot lead to denial of service.}} - re.fullmatch(r"(?s:.*)\s*+,(?s:.*)", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to polynomial runtime due to backtracking, cannot lead to denial of service.}} + re.search(r"(?s:.*)\s*,(?s:.*)", _input) # OK + re.match(r"(?s:.*)\s*,(?s:.*)", _input) # OK + re.fullmatch(r"(?s:.*)\s*,(?s:.*)", _input) # OK + re.search(r"(?s:.*)\s*+,(?s:.*)", _input) # OK + re.match(r"(?s:.*)\s*+,(?s:.*)", _input) # OK + re.fullmatch(r"(?s:.*)\s*+,(?s:.*)", _input) # OK def different_polynomials(_input): - re.fullmatch(r"x*x*", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to polynomial runtime due to backtracking, cannot lead to denial of service.}} + re.fullmatch(r"x*x*", _input) # OK, polynomial cases now reported by S8786 re.match(r"x*x*", _input) # OK re.search(r"x*x*", _input) # OK - re.fullmatch(r"x*x*x*", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to polynomial runtime due to backtracking, cannot lead to denial of service.}} + re.fullmatch(r"x*x*x*", _input) # OK re.match(r"x*x*x*", _input) # OK re.search(r"x*x*x*", _input) # OK - re.fullmatch(r"x*x*x*x*", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to polynomial runtime due to backtracking, cannot lead to denial of service.}} + re.fullmatch(r"x*x*x*x*", _input) # OK re.match(r"x*x*x*x*", _input) # OK re.search(r"x*x*x*x*", _input) # OK - re.fullmatch(r"x*x*x*x*x*", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to polynomial runtime due to backtracking, cannot lead to denial of service.}} + re.fullmatch(r"x*x*x*x*x*", _input) # OK re.match(r"x*x*x*x*x*", _input) # OK re.search(r"x*x*x*x*x*", _input) # OK - re.fullmatch(r"[^=]*.*.*=.*", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to polynomial runtime due to backtracking, cannot lead to denial of service.}} - re.match(r"[^=]*.*.*=.*", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to polynomial runtime due to backtracking, cannot lead to denial of service.}} - re.search(r"[^=]*.*.*=.*", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to polynomial runtime due to backtracking, cannot lead to denial of service.}} + re.fullmatch(r"[^=]*.*.*=.*", _input) # OK + re.match(r"[^=]*.*.*=.*", _input) # OK + re.search(r"[^=]*.*.*=.*", _input) # OK + re.search(r"a+b", _input) # OK def should_be_ok(_input): @@ -138,10 +138,10 @@ def should_be_ok(_input): def java9_optimized_cases_not_optimized_in_python(_input): re.fullmatch(r"(.?,)*X", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to exponential runtime due to backtracking, cannot lead to denial of service.}} re.match(r"(.?,)*X", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to exponential runtime due to backtracking, cannot lead to denial of service.}} - re.search(r"(.?,)*X", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to polynomial runtime due to backtracking, cannot lead to denial of service.}} + re.search(r"(.?,)*X", _input) # OK, ALWAYS_QUADRATIC in search mode, reported by S8786 re.fullmatch(r"(.?,)*\1", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to exponential runtime due to backtracking, cannot lead to denial of service.}} re.match(r"(.?,)*\1", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to exponential runtime due to backtracking, cannot lead to denial of service.}} - re.search(r"(.?,)*\1", _input) # Noncompliant {{Make sure the regex used here, which is vulnerable to polynomial runtime due to backtracking, cannot lead to denial of service.}} + re.search(r"(.?,)*\1", _input) # OK, ALWAYS_QUADRATIC in search mode, reported by S8786 re.fullmatch(r"(?:(.?)\1,)*", _input) # FN re.match(r"(?:(.?)\1,)*", _input) # OK re.search(r"(?:(.?)\1,)*", _input) # OK @@ -198,6 +198,6 @@ def compliant(_input): re.fullmatch(r"(?s)(.*,)*.*", _input) re.fullmatch(r"(?:(.)\1)*", _input) re.fullmatch(r"(?:\1|x(.))*", _input) - re.fullmatch(r"(?:\1|x(.))+", _input) + re.fullmatch(r"(?:\1|x(.))+" , _input) re.fullmatch(r"(?:\1|x(.)){1,2}", _input) re.fullmatch(r"(.)(?:\1\2|x(.))*", _input) diff --git a/python-checks/src/test/resources/checks/regex/superLinearRegexCheck.py b/python-checks/src/test/resources/checks/regex/superLinearRegexCheck.py new file mode 100644 index 000000000..f65ca587d --- /dev/null +++ b/python-checks/src/test/resources/checks/regex/superLinearRegexCheck.py @@ -0,0 +1,114 @@ +import re + + +def re_compile(_input): + p1 = re.compile(r"\s*\s*+,") # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + p2 = re.compile(r"\s*\s*+,") # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + p3 = re.compile(r"\s*\s*+,") # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + p1.fullmatch(_input) + p2.match(_input) + p3.search(_input) + + +def full_and_partial_match(_input): + re.search(r"\s*\s*+,", _input) # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + re.findall(r"\s*\s*+,", _input) # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + re.split(r"\s*\s*+,", _input) # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + re.sub(r"\s*\s*+,", _input) # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + re.subn(r"\s*\s*+,", _input) # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + + +def always_quadratic(_input): + re.fullmatch(r"x*\w*", _input) # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + re.fullmatch(r".*.*X", _input) # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + re.match(r".*.*X", _input) # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + re.fullmatch(r"x*a*x*", _input) # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + re.fullmatch(r"x*(xy?)*", _input) # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + re.fullmatch(r"x*xx*", _input) # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + + +def always_quadratic_other_match_types(_input): + re.match(r"x*\w*", _input) # OK + re.search(r"x*\w*", _input) # OK + re.match(r"x*a*x*", _input) # OK + re.search(r"x*a*x*", _input) # OK + re.match(r"x*(xy?)*", _input) # OK + re.search(r"x*(xy?)*", _input) # OK + re.match(r"x*xx*", _input) # OK + # FP + re.search(r"x*xx*", _input) # Noncompliant + + +def non_possessive_followed_by_possessive(_input): + re.fullmatch(r".*\s*", _input) # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + re.match(r".*\s*", _input) # OK + re.search(r".*\s*", _input) # OK + re.fullmatch(r".*\s*+", _input) # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + re.match(r".*\s*+", _input) # OK + re.search(r".*\s*+", _input) # OK + re.fullmatch(r"\s*\s*+,", _input) # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + re.match(r"\s*\s*+,", _input) # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + re.search(r"\s*\s*+,", _input) # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + re.fullmatch(r"[a\s]*\s*+,", _input) # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + re.match(r"[a\s]*\s*+,", _input) # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + re.search(r"[a\s]*\s*+,", _input) # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + re.fullmatch(r"[a\s]*b*\s*+,", _input) # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + re.match(r"[a\s]*b*\s*+,", _input) # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + re.search(r"[a\s]*b*\s*+,", _input) # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + + +def implicit_reluctant_quantifier_in_partial_match(_input): + re.search(r"\s*,", _input) # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + re.match(r"\s*,", _input) # OK + re.fullmatch(r"\s*,", _input) # OK + re.search(r"\s*+,", _input) # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + re.match(r"\s*+,", _input) # OK + re.fullmatch(r"\s*+,", _input) # OK + re.search(r"(?s:.*)\s*,(?s:.*)", _input) # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + re.match(r"(?s:.*)\s*,(?s:.*)", _input) # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + re.fullmatch(r"(?s:.*)\s*,(?s:.*)", _input) # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + re.search(r"(?s:.*)\s*+,(?s:.*)", _input) # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + re.match(r"(?s:.*)\s*+,(?s:.*)", _input) # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + re.fullmatch(r"(?s:.*)\s*+,(?s:.*)", _input) # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + + +def different_polynomials(_input): + re.fullmatch(r"x*x*", _input) # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + re.match(r"x*x*", _input) # OK + re.search(r"x*x*", _input) # OK + re.fullmatch(r"x*x*x*", _input) # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + re.match(r"x*x*x*", _input) # OK + re.search(r"x*x*x*", _input) # OK + re.fullmatch(r"x*x*x*x*", _input) # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + re.match(r"x*x*x*x*", _input) # OK + re.search(r"x*x*x*x*", _input) # OK + re.fullmatch(r"x*x*x*x*x*", _input) # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + re.match(r"x*x*x*x*x*", _input) # OK + re.search(r"x*x*x*x*x*", _input) # OK + re.fullmatch(r"[^=]*.*.*=.*", _input) # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + re.match(r"[^=]*.*.*=.*", _input) # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + re.search(r"[^=]*.*.*=.*", _input) # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + re.search(r"a+b", _input) # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + + +def linear_when_optimized_reported_by_s5852(_input): + re.search(r"(.?,)*X", _input) # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + re.search(r"(.?,)*\1", _input) # Noncompliant {{Simplify this regular expression to reduce its runtime, as it has super-linear performance due to backtracking.}} + re.fullmatch(r"(.?,)*X", _input) # OK, LINEAR_WHEN_OPTIMIZED reported by S5852 + re.match(r"(.?,)*X", _input) # OK + re.fullmatch(r"(.?,)*\1", _input) # OK + re.match(r"(.?,)*\1", _input) # OK + + +def should_not_report_exponential_cases(_input): + re.fullmatch(r"(.*,)*?", _input) # OK, exponential cases reported by S5852 + re.fullmatch(r"(.*,)*", _input) # OK + re.fullmatch(r"(.*,)*X", _input) # OK + re.match(r"(.*,)*X", _input) # OK + re.search(r"(.*,)*X", _input) # OK + + +def compliant(_input): + re.fullmatch(r"abc", _input) + re.fullmatch(r"(?s)(.*,)*.*", _input) + re.fullmatch(r"(?:(.)\1)*", _input) From 5224e3bd3fcda50b4cd2ae3a517d8e944e14799c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Coet?= Date: Fri, 19 Jun 2026 13:53:50 +0200 Subject: [PATCH 144/322] CLP-21 Move repository ownership to Core Languages and Parsers (#1197) GitOrigin-RevId: dd6a6d03cb037903497604ead6ad98a36d9c2765 --- .github/CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 23070909a..08d564436 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1 +1 @@ -.github/CODEOWNERS @SonarSource/quality-data-ml-squad +.github/CODEOWNERS @SonarSource/code-quality-core-languages-parsers-squad From 594d4a84921b8ab52fd5c93ebad4c66d9cc5e647 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Mora?= Date: Mon, 22 Jun 2026 17:01:10 +0200 Subject: [PATCH 145/322] SONARPY-4301 Update converted hotspot rule metadata (#1201) GitOrigin-RevId: 05b5ebac64985ae679696cdde51bc6630c9444fd --- .../org/sonar/l10n/py/rules/python/S1523.html | 77 +-- .../org/sonar/l10n/py/rules/python/S1523.json | 11 +- .../org/sonar/l10n/py/rules/python/S2077.html | 83 ++- .../org/sonar/l10n/py/rules/python/S2077.json | 12 +- .../org/sonar/l10n/py/rules/python/S2245.html | 86 +-- .../org/sonar/l10n/py/rules/python/S2245.json | 12 +- .../org/sonar/l10n/py/rules/python/S3330.html | 82 +-- .../org/sonar/l10n/py/rules/python/S3330.json | 8 +- .../org/sonar/l10n/py/rules/python/S4502.html | 187 +++--- .../org/sonar/l10n/py/rules/python/S4502.json | 8 +- .../org/sonar/l10n/py/rules/python/S4507.html | 85 +-- .../org/sonar/l10n/py/rules/python/S4507.json | 8 +- .../org/sonar/l10n/py/rules/python/S4790.html | 71 +- .../org/sonar/l10n/py/rules/python/S4790.json | 12 +- .../org/sonar/l10n/py/rules/python/S5247.html | 63 +- .../org/sonar/l10n/py/rules/python/S5247.json | 8 +- .../org/sonar/l10n/py/rules/python/S5332.html | 626 ++++-------------- .../org/sonar/l10n/py/rules/python/S5332.json | 16 +- .../org/sonar/l10n/py/rules/python/S5852.html | 115 ++-- .../org/sonar/l10n/py/rules/python/S5852.json | 13 +- .../org/sonar/l10n/py/rules/python/S6249.html | 83 +-- .../org/sonar/l10n/py/rules/python/S6249.json | 14 +- .../org/sonar/l10n/py/rules/python/S6252.html | 43 +- .../org/sonar/l10n/py/rules/python/S6252.json | 11 +- .../org/sonar/l10n/py/rules/python/S6281.html | 108 ++- .../org/sonar/l10n/py/rules/python/S6281.json | 13 +- .../org/sonar/l10n/py/rules/python/S6304.html | 50 +- .../org/sonar/l10n/py/rules/python/S6304.json | 8 +- .../org/sonar/l10n/py/rules/python/S6327.html | 92 +-- .../org/sonar/l10n/py/rules/python/S6327.json | 12 +- .../org/sonar/l10n/py/rules/python/S6329.html | 202 ++---- .../org/sonar/l10n/py/rules/python/S6329.json | 14 +- .../python/PythonRuleRepositoryTest.java | 4 +- 33 files changed, 852 insertions(+), 1385 deletions(-) diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1523.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1523.html index 68478d04f..56d2eed8f 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1523.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1523.html @@ -1,53 +1,46 @@ -

                  This rule is deprecated, and will eventually be removed.

                  -

                  Executing code dynamically is security-sensitive. It has led in the past to the following vulnerabilities:

                  - -

                  Some APIs enable the execution of dynamic code by providing it as strings at runtime. These APIs might be useful in some very specific -meta-programming use-cases. However most of the time their use is frowned upon because they also increase the risk of maliciously Injected Code. Such attacks can either run on the server or in the client (example: -XSS attack) and have a huge impact on an application’s security.

                  -

                  This rule marks for review each occurrence of such dynamic code execution. This rule does not detect code injections. It only highlights the use of -APIs which should be used sparingly and very carefully.

                  -

                  Ask Yourself Whether

                  -
                    -
                  • the executed code may come from an untrusted source and hasn’t been sanitized.
                  • -
                  • you really need to run code dynamically.
                  • -
                  -

                  There is a risk if you answered yes to any of those questions.

                  -

                  Recommended Secure Coding Practices

                  -

                  Regarding the execution of unknown code, the best solution is to not run code provided by an untrusted source. If you really need to do it, run the -code in a sandboxed environment. Use jails, firewalls and whatever means your -operating system and programming language provide (example: Security -Managers in java, iframes and same-origin policy for javascript in a web browser).

                  -

                  Do not try to create a blacklist of dangerous code. It is impossible to cover all attacks that way.

                  -

                  Avoid using dynamic code APIs whenever possible. Hard-coded code is always safer.

                  -

                  Sensitive Code Example

                  -
                  -import os
                  -
                  -value = input()
                  -command = 'os.system("%s")' % value
                  -
                  -def evaluate(command, file, mode):
                  -    eval(command)  # Sensitive.
                  +

                  Dynamic code execution APIs allow code to be provided and executed as strings at runtime.

                  +

                  Why is this an issue?

                  +

                  Some APIs enable the execution of code provided as strings at runtime. These APIs might be useful in specific meta-programming use-cases, but they +also increase the risk of code injection. When user-controlled data is included +in the code string, an attacker can inject and execute arbitrary instructions within the application.

                  +

                  Python’s eval, exec, and compile functions execute strings as Python code in the current execution +context.

                  +

                  What is the potential impact?

                  +

                  When user-controlled data reaches a dynamic code execution API, an attacker can craft input that alters the intended logic of the program.

                  +

                  Arbitrary code execution

                  +

                  An attacker who can influence the code being executed can run arbitrary commands on the host system or within the database, potentially leading to +full system compromise, data exfiltration, or privilege escalation.

                  +

                  How to fix it

                  +

                  Code examples

                  +

                  Noncompliant code example

                  +
                  +def run(role):
                  +    eval(f"handle_{role}()")  # Noncompliant
                  +
                  +

                  Compliant solution

                  +
                  +from enum import Enum
                   
                  -eval(command)  # Sensitive. Dynamic code
                  +class Role(Enum):
                  +    USER = "user"
                  +    ADMIN = "admin"
                   
                  -def execute(code, file, mode):
                  -    exec(code)  # Sensitive.
                  -    exec(compile(code, file, mode))  # Sensitive.
                  +HANDLERS = {
                  +    Role.USER: handle_user,
                  +    Role.ADMIN: handle_admin,
                  +}
                   
                  -exec(command)  # Sensitive.
                  +def run(role: Role):
                  +    HANDLERS[role]()
                   
                  -

                  See

                  +

                  Resources

                  +

                  Standards

                  diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1523.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1523.json index 316596e5b..23d9a8049 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1523.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1523.json @@ -1,6 +1,6 @@ { - "title": "Dynamically executing code is security-sensitive", - "type": "SECURITY_HOTSPOT", + "title": "Dynamic code execution should not use user-controlled data", + "type": "VULNERABILITY", "code": { "impacts": { "MAINTAINABILITY": "LOW", @@ -9,12 +9,14 @@ "attribute": "TRUSTWORTHY" }, "status": "deprecated", + "quickfix": "unknown", "remediation": { "func": "Constant\/Issue", "constantCost": "30min" }, "tags": [ - "deprecated" + "deprecated", + "former-hotspot" ], "defaultSeverity": "Critical", "ruleSpecification": "RSPEC-1523", @@ -41,6 +43,5 @@ "5.2.4", "5.5.4" ] - }, - "quickfix": "unknown" + } } diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2077.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2077.html index 1d9dfcacf..187910077 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2077.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2077.html @@ -1,21 +1,18 @@ -

                  Formatted SQL queries can be difficult to maintain, debug and can increase the risk of SQL injection when concatenating untrusted values into the -query. However, this rule doesn’t detect SQL injections (unlike rule {rule:python:S3649}), the goal is only to highlight complex/formatted -queries.

                  -

                  Ask Yourself Whether

                  -
                    -
                  • Some parts of the query come from untrusted values (like user inputs).
                  • -
                  • The query is repeated/duplicated in other parts of the code.
                  • -
                  • The application must support different types of relational databases.
                  • -
                  -

                  There is a risk if you answered yes to any of those questions.

                  -

                  Recommended Secure Coding Practices

                  - -

                  Sensitive Code Example

                  -
                  +

                  Dynamically building SQL query strings can result in broken SQL syntax and open SQL injection attacks.

                  +

                  Why is this an issue?

                  +

                  When SQL queries are constructed by concatenating or formatting user-supplied values directly into the query string, the structure of the query +itself can be altered by a malicious input. This rule flags calls to SQL execution functions where the query string is built using string +concatenation or format operators rather than parameterized queries or prepared statements. Unlike rule {rule:python:S3649}, this rule does not +perform taint analysis — it flags all dynamically formatted SQL queries as a potential risk regardless of the data source.

                  +

                  What is the potential impact?

                  +

                  SQL injection

                  +

                  If any part of a dynamically formatted query string originates from untrusted input, an attacker can manipulate the query to read, modify, or +delete data they should not have access to, bypass authentication checks, or in some configurations execute operating system commands.

                  +

                  How to fix it

                  +

                  Code examples

                  +

                  The following code builds a SQL query by concatenating a value directly into the query string.

                  +

                  Noncompliant code example

                  +
                   from django.db import models
                   from django.db import connection
                   from django.db import connections
                  @@ -30,39 +27,59 @@ 

                  Sensitive Code Example

                  def query_my_user(request, params, value): with connection.cursor() as cursor: - cursor.execute("{0}".format(value)) # Sensitive + cursor.execute("{0}".format(value)) # Noncompliant # https://docs.djangoproject.com/en/2.1/ref/models/expressions/#raw-sql-expressions - RawSQL("select col from %s where mycol = %s and othercol = " + value, ("test",)) # Sensitive + RawSQL("select col from %s where mycol = %s and othercol = " + value, ("test",)) # Noncompliant # https://docs.djangoproject.com/en/2.1/ref/models/querysets/#extra MyUser.objects.extra( select={ - 'mycol': "select col from sometable here mycol = %s and othercol = " + value}, # Sensitive + 'mycol': "select col from sometable here mycol = %s and othercol = " + value}, # Noncompliant select_params=(someparam,), }, )
                  -

                  Compliant Solution

                  -
                  -cursor = connection.cursor(prepared=True)
                  -sql_insert_query = """ select col from sometable here mycol = %s and othercol = %s """
                  +

                  Compliant solution

                  +
                  +from django.db import models
                  +from django.db import connection
                  +from django.db import connections
                  +from django.db.models.expressions import RawSQL
                  +
                  +value = input()
                   
                  -select_tuple = (1, value)
                   
                  -cursor.execute(sql_insert_query, select_tuple) # Compliant, the query is parameterized
                  -connection.commit()
                  +class MyUser(models.Model):
                  +    name = models.CharField(max_length=200)
                  +
                  +
                  +def query_my_user(request, params, value):
                  +    with connection.cursor() as cursor:
                  +        cursor.execute("SELECT * FROM mytable WHERE col = %s", [value])
                  +
                  +    RawSQL("select col from %s where mycol = %s and othercol = %s", ("test", value,))
                  +
                  +    MyUser.objects.extra(
                  +        select={
                  +            'mycol': "select col from sometable where mycol = %s and othercol = %s"},
                  +        select_params=(someparam, value),
                  +    )
                   
                  -

                  See

                  +

                  Resources

                  +

                  Articles & blog posts

                  +

                  Standards

                  + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2077.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2077.json index b10fecc9e..ada59fcb3 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2077.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2077.json @@ -1,6 +1,6 @@ { - "title": "Formatting SQL queries is security-sensitive", - "type": "SECURITY_HOTSPOT", + "title": "SQL queries should not be dynamically formatted", + "type": "VULNERABILITY", "code": { "impacts": { "MAINTAINABILITY": "LOW", @@ -9,6 +9,7 @@ "attribute": "COMPLETE" }, "status": "ready", + "quickfix": "unknown", "remediation": { "func": "Constant\/Issue", "constantCost": "20min" @@ -16,7 +17,8 @@ "tags": [ "cwe", "bad-practice", - "sql" + "sql", + "former-hotspot" ], "defaultSeverity": "Major", "ruleSpecification": "RSPEC-2077", @@ -24,8 +26,8 @@ "scope": "Main", "securityStandards": { "CWE": [ - 20, - 89 + 89, + 943 ], "OWASP": [ "A1" diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2245.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2245.html index 9fed31f63..b28c70225 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2245.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2245.html @@ -1,53 +1,53 @@ -

                  PRNGs are algorithms that produce sequences of numbers that only approximate true randomness. While they are suitable for applications like -simulations or modeling, they are not appropriate for security-sensitive contexts because their outputs can be predictable if the internal state is -known.

                  -

                  In contrast, cryptographically secure pseudorandom number generators (CSPRNGs) are designed to be secure against prediction attacks. CSPRNGs use -cryptographic algorithms to ensure that the generated sequences are not only random but also unpredictable, even if part of the sequence or the -internal state becomes known. This unpredictability is crucial for security-related tasks such as generating encryption keys, tokens, or any other -values that must remain confidential and resistant to guessing attacks.

                  -

                  For example, the use of non-cryptographic PRNGs has led to vulnerabilities such as:

                  - -

                  When software generates predictable values in a context requiring unpredictability, it may be possible for an attacker to guess the next value that -will be generated, and use this guess to impersonate another user or access sensitive information. Therefore, it is critical to use CSPRNGs in any -security-sensitive application to ensure the robustness and security of the system.

                  -

                  Ask Yourself Whether

                  -
                    -
                  • the code using the generated value requires it to be unpredictable. It is the case for all encryption mechanisms or when a secret value, such as - a password, is hashed.
                  • -
                  • the function you use is a non-cryptographic PRNG.
                  • -
                  • the generated value is used multiple times.
                  • -
                  • an attacker can access the generated value.
                  • -
                  -

                  There is a risk if you answered yes to any of those questions.

                  -

                  Recommended Secure Coding Practices

                  -
                    -
                  • Only use random number generators which are recommended by - OWASP or any other trusted organization.
                  • -
                  • Use the generated random values only once.
                  • -
                  • You should not expose the generated random value. If you have to store it, make sure that the database or file is secure.
                  • -
                  -

                  Sensitive Code Example

                  -
                  +

                  Pseudorandom number generators (PRNGs) produce sequences that only approximate true randomness and are not suitable for security-sensitive +contexts.

                  +

                  Why is this an issue?

                  +

                  When software generates predictable values in a context requiring unpredictability, an attacker who knows or can guess the internal state of the +PRNG may predict the next value that will be generated. The rule flags the use of non-cryptographic PRNGs in contexts where a cryptographically secure +pseudorandom number generator (CSPRNG) is required, such as generating encryption keys, tokens, or other secret values.

                  +

                  What is the potential impact?

                  +

                  Predictable values

                  +

                  If an attacker can predict the values generated by a PRNG, they may be able to guess session tokens, encryption keys, password reset links, or +other secrets, leading to unauthorized access or impersonation.

                  +

                  Broken cryptography

                  +

                  Using a non-cryptographic PRNG to generate keys or initialization vectors weakens the security of the cryptographic scheme, potentially making it +trivially breakable.

                  +

                  How to fix it

                  +

                  Code examples

                  +

                  Use a cryptographically secure pseudorandom number generator (CSPRNG) instead of a non-cryptographic PRNG.

                  +

                  Noncompliant code example

                  +
                   import random
                   
                  -random.getrandbits(1) # Sensitive
                  -random.randint(0,9) # Sensitive
                  -random.random()  # Sensitive
                  +random.getrandbits(1) # Noncompliant
                  +random.randint(0,9) # Noncompliant
                  +random.random()  # Noncompliant
                   
                  -# the following functions are sadly used to generate salt by selecting characters in a string ex: "abcdefghijk"...
                  -random.sample(['a', 'b'], 1)  # Sensitive
                  -random.choice(['a', 'b'])  # Sensitive
                  -random.choices(['a', 'b'])  # Sensitive
                  +# These functions are sometimes used to generate salts by selecting characters from a string:
                  +random.sample(['a', 'b'], 1)  # Noncompliant
                  +random.choice(['a', 'b'])  # Noncompliant
                  +random.choices(['a', 'b'])  # Noncompliant
                   
                  -

                  See

                  +

                  Compliant solution

                  +
                  +import secrets
                  +import random
                  +
                  +secrets.randbits(1)
                  +secrets.randbelow(10)
                  +secrets.token_hex(16)
                  +
                  +random.SystemRandom().sample(['a', 'b'], 1)
                  +secrets.choice(['a', 'b'])
                  +random.SystemRandom().choices(['a', 'b'])
                  +
                  +

                  Resources

                  +

                  Documentation

                  +

                  Standards

                  +
                  • OWASP - Top 10 2021 Category A2 - Cryptographic Failures
                  • OWASP - Top 10 2017 Category A3 - Sensitive Data Exposure
                  • diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2245.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2245.json index 5d89023b1..65a166377 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2245.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2245.json @@ -1,21 +1,23 @@ { - "title": "Using pseudorandom number generators (PRNGs) is security-sensitive", - "type": "SECURITY_HOTSPOT", + "title": "Pseudorandom number generators (PRNGs) should not be used in security contexts", + "type": "VULNERABILITY", "code": { "impacts": { - "SECURITY": "HIGH" + "SECURITY": "MEDIUM" }, "attribute": "TRUSTWORTHY" }, "status": "ready", + "quickfix": "unknown", "remediation": { "func": "Constant\/Issue", "constantCost": "10min" }, "tags": [ - "cwe" + "cwe", + "former-hotspot" ], - "defaultSeverity": "Critical", + "defaultSeverity": "Major", "ruleSpecification": "RSPEC-2245", "sqKey": "S2245", "scope": "Main", diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S3330.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S3330.html index 01688167f..58d4d371e 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S3330.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S3330.html @@ -1,45 +1,30 @@ -

                    When a cookie is configured with the HttpOnly attribute set to true, the browser guaranties that no client-side script will -be able to read it. In most cases, when a cookie is created, the default value of HttpOnly is false and it’s up to the developer -to decide whether or not the content of the cookie can be read by the client-side script. As a majority of Cross-Site Scripting (XSS) attacks target -the theft of session-cookies, the HttpOnly attribute can help to reduce their impact as it won’t be possible to exploit the XSS -vulnerability to steal session-cookies.

                    -

                    Ask Yourself Whether

                    -
                      -
                    • the cookie is sensitive, used to authenticate the user, for instance a session-cookie
                    • -
                    • the HttpOnly attribute offer an additional protection (not the case for an XSRF-TOKEN cookie / CSRF token for - example)
                    • -
                    -

                    There is a risk if you answered yes to any of those questions.

                    -

                    Recommended Secure Coding Practices

                    -
                      -
                    • By default the HttpOnly flag should be set to true for most of the cookies and it’s mandatory for session / - sensitive-security cookies.
                    • -
                    -

                    Sensitive Code Example

                    -

                    Using Flask:

                    -
                    +

                    Setting the HttpOnly attribute on cookies prevents client-side scripts from reading their values, limiting the damage that cross-site +scripting (XSS) attacks can cause.

                    +

                    Why is this an issue?

                    +

                    When a cookie is created without the HttpOnly attribute, or with it explicitly set to false, client-side scripts running +in the browser can read the cookie’s value. By default, cookies are created with HttpOnly set to false, meaning they are +accessible to browser scripts unless the developer explicitly enables this protection. Setting HttpOnly to true instructs +the browser to block script access to the cookie, limiting the damage from XSS attacks that attempt to steal session credentials.

                    +

                    What is the potential impact?

                    +

                    Session hijacking and account takeover

                    +

                    The most common target of cookie theft is the session cookie used to authenticate a user. If an attacker can exploit an XSS vulnerability on a page +where a session cookie is accessible to scripts, they can steal it and use it to impersonate the authenticated user without needing their credentials. +This can lead to unauthorized access to sensitive account data, account takeover, and potential privilege escalation within the application.

                    +

                    How to fix it in Flask

                    +

                    Code examples

                    +

                    The following code creates a cookie without enabling the HttpOnly attribute.

                    +

                    Noncompliant code example

                    +
                     from flask import Response
                     
                     @app.route('/')
                     def index():
                         response = Response()
                    -    response.set_cookie('key', 'value')  # Sensitive
                    +    response.set_cookie('key', 'value')  # Noncompliant
                         return response
                     
                    -

                    Using FastAPI:

                    -
                    -from fastapi import FastAPI, Response
                    -
                    -app = FastAPI()
                    -
                    -@app.get('/')
                    -async def index(response: Response):
                    -    response.set_cookie('key', 'value')  # Sensitive
                    -    return {"message": "Hello world!"}
                    -
                    -

                    Compliant Solution

                    -

                    Using Flask:

                    -
                    +

                    Compliant solution

                    +
                     from flask import Response
                     
                     @app.route('/')
                    @@ -48,8 +33,22 @@ 

                    Compliant Solution

                    response.set_cookie('key', 'value', httponly=True) return response
                    -

                    Using FastAPI:

                    -
                    +

                    How to fix it in FastAPI

                    +

                    Code examples

                    +

                    The following code creates a cookie without enabling the HttpOnly attribute.

                    +

                    Noncompliant code example

                    +
                    +from fastapi import FastAPI, Response
                    +
                    +app = FastAPI()
                    +
                    +@app.get('/')
                    +async def index(response: Response):
                    +    response.set_cookie('key', 'value')  # Noncompliant
                    +    return {"message": "Hello world!"}
                    +
                    +

                    Compliant solution

                    +
                     from fastapi import FastAPI, Response
                     
                     app = FastAPI()
                    @@ -59,14 +58,17 @@ 

                    Compliant Solution

                    response.set_cookie('key', 'value', httponly=True) return {"message": "Hello world!"}
                    -

                    See

                    +

                    Resources

                    +

                    Documentation

                    +

                    Standards

                    + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S3330.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S3330.json index 0576e9638..f2594c192 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S3330.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S3330.json @@ -1,6 +1,6 @@ { - "title": "Creating cookies without the \"HttpOnly\" flag is security-sensitive", - "type": "SECURITY_HOTSPOT", + "title": "Cookies should have the \"HttpOnly\" flag", + "type": "VULNERABILITY", "code": { "impacts": { "SECURITY": "LOW" @@ -12,12 +12,14 @@ "func": "Constant\/Issue", "constantCost": "10min" }, + "quickfix": "unknown", "tags": [ "cwe", "privacy", "flask", "fastapi", - "django" + "django", + "former-hotspot" ], "defaultSeverity": "Minor", "ruleSpecification": "RSPEC-3330", diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4502.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4502.html index cc1f6636b..2ec957ee3 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4502.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4502.html @@ -1,34 +1,23 @@ -

                    A cross-site request forgery (CSRF) attack occurs when a trusted user of a web application can be forced, by an attacker, to perform sensitive -actions that he didn’t intend, such as updating his profile or sending a message, more generally anything that can change the state of the -application.

                    -

                    The attacker can trick the user/victim to click on a link, corresponding to the privileged action, or to visit a malicious web site that embeds a -hidden web request and as web browsers automatically include cookies, the actions can be authenticated and sensitive.

                    -

                    Ask Yourself Whether

                    -
                      -
                    • The web application uses cookies to authenticate users.
                    • -
                    • There exist sensitive operations in the web application that can be performed when the user is authenticated.
                    • -
                    • The state / resources of the web application can be modified by doing HTTP POST or HTTP DELETE requests for example.
                    • -
                    -

                    There is a risk if you answered yes to any of those questions.

                    -

                    Recommended Secure Coding Practices

                    -
                      -
                    • Protection against CSRF attacks is strongly recommended: -
                        -
                      • to be activated by default for all unsafe HTTP - methods.
                      • -
                      • implemented, for example, with an unguessable CSRF token
                      • -
                    • -
                    • Of course all sensitive operations should not be performed with safe HTTP methods like GET which are designed to be - used only for information retrieval.
                    • -
                    -

                    Sensitive Code Example

                    -

                    For a Django application, the code is sensitive when,

                    -
                      -
                    • django.middleware.csrf.CsrfViewMiddleware is not used in the Django settings:
                    • -
                    -
                    +

                    Cross-site request forgery (CSRF) forces an authenticated user to perform unintended state-changing actions in a web application. This rule detects +when CSRF protection is explicitly disabled or missing from an application.

                    +

                    Why is this an issue?

                    +

                    When CSRF protection is disabled or bypassed, an attacker can trick a logged-in user into submitting requests the application treats as +authenticated. The rule flags configurations that disable framework CSRF middleware, exempt specific routes or views, or leave unsafe HTTP methods +unprotected.

                    +

                    What is the potential impact?

                    +

                    Unauthorized state changes

                    +

                    An attacker can change passwords, transfer funds, modify data, or perform other privileged operations using the victim’s session.

                    +

                    Account compromise

                    +

                    Successful CSRF attacks can lead to full account takeover when combined with sensitive actions such as email or credential changes.

                    +

                    How to fix it in Django

                    +

                    Enable django.middleware.csrf.CsrfViewMiddleware in settings and do not exempt views from CSRF protection unless strictly +necessary.

                    +

                    Code examples

                    +

                    Disabling or bypassing CSRF protection allows an authenticated user’s browser to execute state-changing requests the user did not intend.

                    +

                    Noncompliant code example

                    +

                    django.middleware.csrf.CsrfViewMiddleware is not used in the Django +settings:

                    +
                     MIDDLEWARE = [
                         'django.middleware.security.SecurityMiddleware',
                         'django.contrib.sessions.middleware.SessionMiddleware',
                    @@ -36,115 +25,111 @@ 

                    Sensitive Code Example

                    'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] # Sensitive: django.middleware.csrf.CsrfViewMiddleware is missing +] # Noncompliant: django.middleware.csrf.CsrfViewMiddleware is missing
                    -
                      -
                    • the CSRF protection is disabled on a view:
                    • -
                    -
                    -@csrf_exempt # Sensitive
                    +

                    The CSRF protection is disabled on a view:

                    +
                    +@csrf_exempt # Noncompliant
                     def example(request):
                         return HttpResponse("default")
                     
                    -

                    For a Flask application, the code is sensitive when,

                    -
                      -
                    • the WTF_CSRF_ENABLED setting is set to false:
                    • -
                    -
                    +

                    Compliant solution

                    +

                    Protect all views with django.middleware.csrf.CsrfViewMiddleware:

                    +
                    +MIDDLEWARE = [
                    +    'django.middleware.security.SecurityMiddleware',
                    +    'django.contrib.sessions.middleware.SessionMiddleware',
                    +    'django.middleware.common.CommonMiddleware',
                    +    'django.middleware.csrf.CsrfViewMiddleware',
                    +    'django.contrib.auth.middleware.AuthenticationMiddleware',
                    +    'django.contrib.messages.middleware.MessageMiddleware',
                    +    'django.middleware.clickjacking.XFrameOptionsMiddleware',
                    +]
                    +
                    +

                    Do not disable the CSRF protection on specific views:

                    +
                    +def example(request):
                    +    return HttpResponse("default")
                    +
                    +

                    How to fix it in Flask

                    +

                    Use the CSRFProtect module from Flask-WTF and keep WTF_CSRF_ENABLED enabled.

                    +

                    Code examples

                    +

                    Disabling or bypassing CSRF protection allows an authenticated user’s browser to execute state-changing requests the user did not intend.

                    +

                    Noncompliant code example

                    +

                    The WTF_CSRF_ENABLED setting is set to false:

                    +
                     app = Flask(__name__)
                    -app.config['WTF_CSRF_ENABLED'] = False # Sensitive
                    +app.config['WTF_CSRF_ENABLED'] = False # Noncompliant
                     
                    -
                      -
                    • the application doesn’t use the CSRFProtect module:
                    • -
                    -
                    -app = Flask(__name__) # Sensitive: CSRFProtect is missing
                    +

                    The application doesn’t use the CSRFProtect module:

                    +
                    +app = Flask(__name__) # Noncompliant: CSRFProtect is missing
                     
                     @app.route('/')
                     def hello_world():
                         return 'Hello, World!'
                     
                    -
                      -
                    • the CSRF protection is disabled on a view:
                    • -
                    -
                    -app = Flask(__name__)
                    -csrf = CSRFProtect()
                    -csrf.init_app(app)
                    -
                    +

                    The CSRF protection is disabled on a view:

                    +
                     @app.route('/example/', methods=['POST'])
                    -@csrf.exempt # Sensitive
                    +@csrf.exempt # Noncompliant
                     def example():
                         return 'example '
                     
                    -
                      -
                    • the CSRF protection is disabled on a form:
                    • -
                    -
                    +

                    The CSRF protection is disabled on a form:

                    +
                     class unprotectedForm(FlaskForm):
                         class Meta:
                    -        csrf = False # Sensitive
                    +        csrf = False # Noncompliant
                     
                         name = TextField('name')
                         submit = SubmitField('submit')
                     
                    -

                    Compliant Solution

                    -

                    For a Django application,

                    -
                      -
                    • it is recommended to protect all the views with django.middleware.csrf.CsrfViewMiddleware:
                    • -
                    -
                    -MIDDLEWARE = [
                    -    'django.middleware.security.SecurityMiddleware',
                    -    'django.contrib.sessions.middleware.SessionMiddleware',
                    -    'django.middleware.common.CommonMiddleware',
                    -    'django.middleware.csrf.CsrfViewMiddleware', # Compliant
                    -    'django.contrib.auth.middleware.AuthenticationMiddleware',
                    -    'django.contrib.messages.middleware.MessageMiddleware',
                    -    'django.middleware.clickjacking.XFrameOptionsMiddleware',
                    -]
                    -
                    -
                      -
                    • and to not disable the CSRF protection on specific views:
                    • -
                    -
                    -def example(request): # Compliant
                    -    return HttpResponse("default")
                    +

                    Compliant solution

                    +

                    Use the CSRFProtect module (and do not disable it with WTF_CSRF_ENABLED set to false):

                    +
                    +app = Flask(__name__)
                    +csrf = CSRFProtect()
                    +csrf.init_app(app)
                     
                    -

                    For a Flask application,

                    -
                      -
                    • the CSRFProtect module should be used (and not disabled further with WTF_CSRF_ENABLED set to false):
                    • -
                    -
                    +
                     app = Flask(__name__)
                     csrf = CSRFProtect()
                    -csrf.init_app(app) # Compliant
                    +csrf.init_app(app)
                     
                    -
                      -
                    • and it is recommended to not disable the CSRF protection on specific views or forms:
                    • -
                    -
                    -@app.route('/example/', methods=['POST']) # Compliant
                    +

                    Do not disable the CSRF protection on specific views or forms:

                    +
                    +@app.route('/example/', methods=['POST'])
                     def example():
                         return 'example '
                    -
                    +
                    +
                     class unprotectedForm(FlaskForm):
                         class Meta:
                    -        csrf = True # Compliant
                    +        csrf = True
                     
                         name = TextField('name')
                         submit = SubmitField('submit')
                     
                    -

                    See

                    +

                    Resources

                    +

                    Documentation

                    +
                      +
                    • Django - Cross Site Request Forgery protection
                    • +
                    • Flask-WTF - CSRF protection
                    • +
                    • OWASP - Cross-Site Request Forgery
                    • +
                    +

                    Articles & blog posts

                    + +

                    Standards

                    diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4502.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4502.json index 193b217b5..3d55a4e8d 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4502.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4502.json @@ -1,6 +1,6 @@ { - "title": "Disabling CSRF protections is security-sensitive", - "type": "SECURITY_HOTSPOT", + "title": "CSRF protections should not be disabled", + "type": "VULNERABILITY", "code": { "impacts": { "SECURITY": "HIGH" @@ -8,6 +8,7 @@ "attribute": "CONVENTIONAL" }, "status": "ready", + "quickfix": "unknown", "remediation": { "func": "Constant\/Issue", "constantCost": "5min" @@ -15,7 +16,8 @@ "tags": [ "cwe", "django", - "flask" + "flask", + "former-hotspot" ], "defaultSeverity": "Critical", "ruleSpecification": "RSPEC-4502", diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4507.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4507.html index 8b635f1e3..2f621bf65 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4507.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4507.html @@ -1,37 +1,60 @@ -

                    Development tools and frameworks usually have options to make debugging easier for developers. Although these features are useful during -development, they should never be enabled for applications deployed in production. Debug instructions or error messages can leak detailed information -about the system, like the application’s path or file names.

                    -

                    Ask Yourself Whether

                    -
                      -
                    • The code or configuration enabling the application debug features is deployed on production servers or distributed to end users.
                    • -
                    • The application runs by default with debug features activated.
                    • -
                    -

                    There is a risk if you answered yes to any of those questions.

                    -

                    Recommended Secure Coding Practices

                    -

                    Do not enable debugging features on production servers or applications distributed to end users.

                    -

                    Sensitive Code Example

                    -

                    Django application startup:

                    +

                    Development tools and frameworks usually have options to make debugging easier for developers, but these features should never be enabled for +applications deployed in production.

                    +

                    Why is this an issue?

                    +

                    Debug instructions or error messages can leak detailed information about the system, such as the application’s path, file names, or stack traces. +The rule flags configurations and API calls that enable debug features, including stack trace printing, verbose logging, debug mode flags, and remote +debugging endpoints.

                    +

                    What is the potential impact?

                    +

                    Information disclosure

                    +

                    Attackers can exploit debug output to learn internal application details, file paths, stack traces, and configuration data that can be leveraged to +craft further attacks.

                    +

                    Increased attack surface

                    +

                    Debug features may expose remote debugging endpoints, profiling APIs, or detailed error pages that significantly increase the attack surface of the +application.

                    +

                    How to fix it in Django

                    +

                    Code examples

                    +

                    Debug features should be disabled or guarded by environment checks before deploying to production.

                    +

                    Noncompliant code example

                    +

                    django.conf.settings.configure is called with debug settings enabled in the Django settings:

                     from django.conf import settings
                     
                    -settings.configure(DEBUG=True)  # Sensitive when set to True
                    -settings.configure(DEBUG_PROPAGATE_EXCEPTIONS=True)  # Sensitive when set to True
                    +settings.configure(DEBUG=True)  # Noncompliant
                    +settings.configure(DEBUG_PROPAGATE_EXCEPTIONS=True)  # Noncompliant
                     
                     def custom_config(config):
                    -    settings.configure(default_settings=config, DEBUG=True)  # Sensitive
                    +    settings.configure(default_settings=config, DEBUG=True)  # Noncompliant
                     

                    Inside settings.py or global_settings.py, which are the default configuration files for a Django application:

                    -DEBUG = True  # Sensitive
                    -DEBUG_PROPAGATE_EXCEPTIONS = True  # Sensitive
                    +DEBUG = True  # Noncompliant
                    +DEBUG_PROPAGATE_EXCEPTIONS = True  # Noncompliant
                    +
                    +

                    Compliant solution

                    +
                    +from django.conf import settings
                    +
                    +settings.configure(DEBUG=False)
                    +settings.configure(DEBUG_PROPAGATE_EXCEPTIONS=False)
                    +
                    +def custom_config(config):
                    +    settings.configure(default_settings=config, DEBUG=False)
                    +
                    +
                    +DEBUG = False
                    +DEBUG_PROPAGATE_EXCEPTIONS = False
                     
                    -

                    Flask application startup:

                    +

                    How to fix it in Flask

                    +

                    Code examples

                    +

                    Debug features should be disabled or guarded by environment checks before deploying to production.

                    +

                    Noncompliant code example

                     from flask import Flask
                     
                     app = Flask()
                    -app.debug = True  # Sensitive
                    -app.run(debug=True)  # Sensitive
                    +app.debug = True  # Noncompliant
                    +app.run(debug=True)  # Noncompliant
                     

                    The following code defines a GraphQL endpoint with GraphiQL enabled. While this might be a useful configuration during development, it should never be enabled for applications deployed in production:

                    @@ -46,24 +69,11 @@

                    Sensitive Code Example

                    view_func=GraphQLView.as_view( 'graphql', schema=schema, - graphiql=True # Sensitive + graphiql=True # Noncompliant ) )
                    -

                    Compliant Solution

                    -
                    -from django.conf import settings
                    -
                    -settings.configure(DEBUG=False)
                    -settings.configure(DEBUG_PROPAGATE_EXCEPTIONS=False)
                    -
                    -def custom_config(config):
                    -    settings.configure(default_settings=config, DEBUG=False)
                    -
                    -
                    -DEBUG = False
                    -DEBUG_PROPAGATE_EXCEPTIONS = False
                    -
                    +

                    Compliant solution

                     from flask import Flask
                     
                    @@ -85,7 +95,8 @@ 

                    Compliant Solution

                    ) )
                    -

                    See

                    +

                    Resources

                    +

                    Standards

                    • OWASP - Top 10 2021 Category A5 - Security Misconfiguration
                    • OWASP - Top 10 2017 Category A3 - Sensitive Data diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4507.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4507.json index 343ed14d2..c61a4d4f8 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4507.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4507.json @@ -1,6 +1,6 @@ { - "title": "Delivering code in production with debug features activated is security-sensitive", - "type": "SECURITY_HOTSPOT", + "title": "Debugging features should not be enabled in production", + "type": "VULNERABILITY", "code": { "impacts": { "SECURITY": "LOW" @@ -8,6 +8,7 @@ "attribute": "CONVENTIONAL" }, "status": "ready", + "quickfix": "unknown", "remediation": { "func": "Constant\/Issue", "constantCost": "1min" @@ -16,7 +17,8 @@ "cwe", "error-handling", "debug", - "user-experience" + "user-experience", + "former-hotspot" ], "defaultSeverity": "Minor", "ruleSpecification": "RSPEC-4507", diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4790.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4790.html index 9a6b2b257..9b6656894 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4790.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4790.html @@ -1,43 +1,42 @@ -

                      Cryptographic hash algorithms such as MD2, MD4, MD5, MD6, HAVAL-128, -DSA (which uses SHA-1), RIPEMD, RIPEMD-128, RIPEMD-160and SHA-1 are no -longer considered secure, because it is possible to have collisions (little computational effort is enough to find two or more different -inputs that produce the same hash).

                      -

                      Message authentication code (MAC) algorithms such as HMAC-MD5 or HMAC-SHA1 use weak hash functions as building blocks. -Although they are not all proven to be weak, they are considered legacy algorithms and should be avoided.

                      -

                      Ask Yourself Whether

                      -

                      The hashed value is used in a security context like:

                      -
                        -
                      • User-password storage.
                      • -
                      • Security token generation (used to confirm e-mail when registering on a website, reset password, etc …​).
                      • -
                      • To compute some message integrity.
                      • -
                      -

                      There is a risk if you answered yes to any of those questions.

                      -

                      Recommended Secure Coding Practices

                      -

                      Safer alternatives, such as SHA-256, SHA-512, SHA-3 are recommended, and for password hashing, it’s even -better to use algorithms that do not compute too "quickly", like bcrypt, scrypt, argon2 or pbkdf2 -because it slows down brute force attacks.

                      -

                      Sensitive Code Example

                      -
                      -import hashlib
                      -m = hashlib.md5() // Sensitive
                      -
                      -
                      +

                      Using a weak hashing algorithm to protect sensitive data can compromise the security guarantees the hash is meant to provide.

                      +

                      Why is this an issue?

                      +

                      Cryptographic hash algorithms such as MD2, MD4, MD5, MD6, HAVAL-128, DSA (which uses SHA-1), RIPEMD, RIPEMD-128, RIPEMD-160, and SHA-1 are no +longer considered secure, because it is computationally feasible to find two different inputs that produce the same hash output — a collision. Message +authentication code (MAC) algorithms such as HMAC-MD5 or HMAC-SHA1 use these weak hash functions as building blocks and are likewise considered legacy +algorithms. When a weak hashing algorithm is used to protect sensitive data — such as storing passwords, generating security tokens, or verifying data +integrity — its weakness can be exploited to defeat that protection.

                      +

                      What is the potential impact?

                      +

                      Breach of confidentiality

                      +

                      When weak hashing is used for password storage or security tokens, an attacker who obtains the hashed values can recover the original data more +easily through brute force or precomputed (rainbow table) attacks.

                      +

                      Data integrity compromise

                      +

                      When weak hashing is used to verify the integrity of data or downloaded files, an attacker can craft a different input that produces the same hash, +allowing them to substitute malicious content without detection.

                      +

                      How to fix it

                      +

                      To hash passwords or other sensitive data, use a slow, memory-hard algorithm specifically designed for that purpose. In order of preference: +Argon2, scrypt, bcrypt, or PBKDF2. These algorithms make brute-force and rainbow-table attacks +computationally expensive.

                      +

                      For non-sensitive use cases such as data integrity or fingerprinting, use a modern cryptographic hash function such as SHA-256, +SHA-512, or SHA-3.

                      +

                      Code examples

                      +

                      The following noncompliant example uses a weak hashing algorithm that is vulnerable to collision and preimage attacks.

                      +

                      Noncompliant code example

                      +
                       import hashlib
                      -m = hashlib.sha1() // Sensitive
                      +m = hashlib.md5() # Noncompliant
                       
                      -
                      -import md5 // Sensitive and deprecated since Python 2.5; use the hashlib module instead.
                      -m = md5.new()
                      -
                      -import sha // Sensitive and deprecated since Python 2.5; use the hashlib module instead.
                      -m = sha.new()
                      -
                      -

                      Compliant Solution

                      -
                      +

                      Compliant solution

                      +
                       import hashlib
                      -m = hashlib.sha512() // Compliant
                      +m = hashlib.sha512()
                       
                      -

                      See

                      +

                      Resources

                      +

                      Documentation

                      +
                      +

                      Standards

                      • OWASP - Top 10 2021 Category A2 - Cryptographic Failures
                      • OWASP - Top 10 2017 Category A3 - Sensitive Data diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4790.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4790.json index abae695d0..10b0f1e66 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4790.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S4790.json @@ -1,6 +1,6 @@ { - "title": "Using weak hashing algorithms is security-sensitive", - "type": "SECURITY_HOTSPOT", + "title": "Weak hashing algorithms should not be used", + "type": "VULNERABILITY", "code": { "impacts": { "SECURITY": "HIGH" @@ -8,8 +8,14 @@ "attribute": "TRUSTWORTHY" }, "status": "ready", + "quickfix": "unknown", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "30min" + }, "tags": [ - "cwe" + "cwe", + "former-hotspot" ], "defaultSeverity": "Critical", "ruleSpecification": "RSPEC-4790", diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5247.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5247.html index 0e1f64738..3290e1b9f 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5247.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5247.html @@ -1,47 +1,42 @@ -

                        To reduce the risk of cross-site scripting attacks, templating systems, such as Twig, Django, Smarty, -Groovy's template engine, allow configuration of automatic variable escaping before rendering templates. When escape occurs, characters -that make sense to the browser (eg: <a>) will be transformed/replaced with escaped/sanitized values (eg: & lt;a& gt; ).

                        -

                        Auto-escaping is not a magic feature to annihilate all cross-site scripting attacks, it depends on the strategy applied and the context, for example a "html auto-escaping" strategy -(which only transforms html characters into html entities) will not be relevant -when variables are used in a html attribute because ':' character is not -escaped and thus an attack as below is possible:

                        -
                        -<a href="{{ myLink }}">link</a> // myLink = javascript:alert(document.cookie)
                        -<a href="javascript:alert(document.cookie)">link</a> // JS injection (XSS attack)
                        -
                        -

                        Ask Yourself Whether

                        -
                          -
                        • Templates are used to render web content and -
                            -
                          • dynamic variables in templates come from untrusted locations or are user-controlled inputs
                          • -
                          • there is no local mechanism in place to sanitize or validate the inputs.
                          • -
                        • -
                        -

                        There is a risk if you answered yes to any of those questions.

                        -

                        Recommended Secure Coding Practices

                        -

                        Enable auto-escaping by default and continue to review the use of inputs in order to be sure that the chosen auto-escaping strategy is the right -one.

                        -

                        Sensitive Code Example

                        -
                        +

                        Template engines, such as Jinja2, provide automatic escaping of template variables to prevent cross-site scripting (XSS) attacks, but this +protection can be explicitly disabled.

                        +

                        Why is this an issue?

                        +

                        Template engines provide auto-escaping as a safety mechanism that transforms HTML special characters in variable output before rendering, +preventing user-controlled input from being interpreted as HTML or JavaScript by the browser. Disabling this protection — through settings like +autoescape: false, escape-bypass filters like |safe, or equivalent configuration — allows untrusted input to pass through +unmodified and be executed by the browser as markup or script.

                        +

                        What is the potential impact?

                        +

                        When auto-escaping is disabled, an attacker who can control the content of template variables can inject malicious HTML or JavaScript into pages +served to other users. An attacker could steal session tokens, redirect users to phishing pages, or perform unauthorized actions on behalf of the +victim.

                        +

                        How to fix it

                        +

                        Code examples

                        +

                        The following examples configure the template engine to disable its auto-escaping feature, allowing template variables to be rendered without HTML +encoding.

                        +

                        Noncompliant code example

                        +
                         from jinja2 import Environment
                         
                        -env = Environment() # Sensitive: New Jinja2 Environment has autoescape set to false
                        -env = Environment(autoescape=False) # Sensitive:
                        +env = Environment() # Noncompliant: New Jinja2 Environment has autoescape set to false
                        +env = Environment(autoescape=False) # Noncompliant:
                         
                        -

                        Compliant Solution

                        -
                        +

                        Compliant solution

                        +
                         from jinja2 import Environment
                         env = Environment(autoescape=True) # Compliant
                         
                        -

                        See

                        +

                        Resources

                        +

                        Documentation

                        +

                        Standards

                        + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5247.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5247.json index b3e90ed2a..75b5c0fa7 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5247.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5247.json @@ -1,6 +1,6 @@ { - "title": "Disabling auto-escaping in template engines is security-sensitive", - "type": "SECURITY_HOTSPOT", + "title": "Auto-escaping in HTML template engines should not be disabled", + "type": "VULNERABILITY", "code": { "impacts": { "SECURITY": "MEDIUM" @@ -8,13 +8,15 @@ "attribute": "COMPLETE" }, "status": "ready", + "quickfix": "unknown", "remediation": { "func": "Constant\/Issue", "constantCost": "5min" }, "tags": [ "cwe", - "django" + "django", + "former-hotspot" ], "defaultSeverity": "Major", "ruleSpecification": "RSPEC-5247", diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5332.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5332.html index 8c0c9a73f..af9c36bc3 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5332.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5332.html @@ -1,75 +1,59 @@ -

                        Clear-text protocols such as ftp, telnet, or http lack encryption of transported data, as well as the -capability to build an authenticated connection. It means that an attacker able to sniff traffic from the network can read, modify, or corrupt the -transported content. These protocols are not secure as they expose applications to an extensive range of risks:

                        -
                          -
                        • sensitive data exposure
                        • -
                        • traffic redirected to a malicious endpoint
                        • -
                        • malware-infected software update or installer
                        • -
                        • execution of client-side code
                        • -
                        • corruption of critical information
                        • -
                        -

                        Even in the context of isolated networks like offline environments or segmented cloud environments, the insider threat exists. Thus, attacks -involving communications being sniffed or tampered with can still happen.

                        -

                        For example, attackers could successfully compromise prior security layers by:

                        -
                          -
                        • bypassing isolation mechanisms
                        • -
                        • compromising a component of the network
                        • -
                        • getting the credentials of an internal IAM account (either from a service account or an actual person)
                        • -
                        -

                        In such cases, encrypting communications would decrease the chances of attackers to successfully leak data or steal credentials from other network -components. By layering various security practices (segmentation and encryption, for example), the application will follow the -defense-in-depth principle.

                        -

                        Note that using the http protocol is being deprecated by major web browsers.

                        -

                        In the past, it has led to the following vulnerabilities:

                        - -

                        Ask Yourself Whether

                        -
                          -
                        • Application data needs to be protected against falsifications or leaks when transiting over the network.
                        • -
                        • Application data transits over an untrusted network.
                        • -
                        • Compliance rules require the service to encrypt data in transit.
                        • -
                        • Your application renders web pages with a relaxed mixed content policy.
                        • -
                        • OS-level protections against clear-text traffic are deactivated.
                        • -
                        -

                        There is a risk if you answered yes to any of those questions.

                        -

                        Recommended Secure Coding Practices

                        -
                          -
                        • Make application data transit over a secure, authenticated and encrypted protocol like TLS or SSH. Here are a few alternatives to the most - common clear-text protocols: -
                            -
                          • Use ssh as an alternative to telnet.
                          • -
                          • Use sftp, scp, or ftps instead of ftp.
                          • -
                          • Use https instead of http.
                          • -
                          • Use SMTP over SSL/TLS or SMTP with STARTTLS instead of clear-text SMTP.
                          • -
                        • -
                        • Enable encryption of cloud components communications whenever it is possible.
                        • -
                        • Configure your application to block mixed content when rendering web pages.
                        • -
                        • If available, enforce OS-level deactivation of all clear-text traffic.
                        • -
                        -

                        It is recommended to secure all transport channels, even on local networks, as it can take a single non-secure connection to compromise an entire -application or system.

                        -

                        Sensitive Code Example

                        -
                        -url = "http://example.com" # Sensitive
                        -url = "ftp://anonymous@example.com" # Sensitive
                        -url = "telnet://anonymous@example.com" # Sensitive
                        +

                        Using clear-text protocols exposes data in transit to eavesdropping and man-in-the-middle attacks.

                        +

                        Why is this an issue?

                        +

                        An attacker who can observe network traffic — for example through a compromised network device, a position on the same network segment, or a cloud +environment breach — can read, modify, or inject data sent over ftp, telnet, http, or unencrypted SMTP without +detection. This is true even on internal or isolated networks, where insider threats or lateral movement after an initial compromise can expose +unencrypted traffic. This rule raises an issue when a clear-text protocol scheme is used or when encryption is explicitly disabled for a network +connection.

                        +

                        What is the potential impact?

                        +

                        Sensitive data exposure

                        +

                        An attacker who can intercept network traffic can read all data transmitted over clear-text connections, including credentials, session tokens, API +keys, or personal data.

                        +

                        Data tampering

                        +

                        Because clear-text protocols provide no integrity protection, an attacker in a man-in-the-middle position can silently modify data in transit — +redirecting users to malicious endpoints, injecting malicious content into responses, or altering commands sent to remote services.

                        +

                        How to fix it in Python Standard Library

                        +

                        Code examples

                        +

                        The following code uses a clear-text protocol or disables encryption for a network connection, leaving transmitted data exposed to +interception.

                        +

                        Noncompliant code example

                        +
                        +url = "http://example.com" # Noncompliant
                        +url = "ftp://anonymous@example.com" # Noncompliant
                        +url = "telnet://anonymous@example.com" # Noncompliant
                         
                         import telnetlib
                        -cnx = telnetlib.Telnet("towel.blinkenlights.nl") # Sensitive
                        +cnx = telnetlib.Telnet("telnet.example.com") # Noncompliant
                        +
                        +import ftplib
                        +cnx = ftplib.FTP("ftp.example.com") # Noncompliant
                        +
                        +import smtplib
                        +smtp = smtplib.SMTP("smtp.example.com", port=587) # Noncompliant
                        +
                        +

                        Compliant solution

                        +
                        +url = "https://example.com"
                        +url = "sftp://anonymous@example.com"
                        +url = "ssh://anonymous@example.com"
                         
                         import ftplib
                        -cnx = ftplib.FTP("ftp.example.com") # Sensitive
                        +cnx = ftplib.FTP_TLS("ftp.example.com")
                         
                         import smtplib
                        -smtp = smtplib.SMTP("smtp.example.com", port=587) # Sensitive
                        +smtp = smtplib.SMTP("smtp.example.com", port=587)
                        +smtp.starttls(context=context)
                        +
                        +smtp_ssl = smtplib.SMTP_SSL("smtp.example.com", port=465)
                         
                        +

                        How to fix it in AWS Elastic Load Balancing

                        +

                        Code examples

                        +

                        The following code uses a clear-text protocol or disables encryption for a network connection, leaving transmitted data exposed to +interception.

                        +

                        Noncompliant code example

                        For aws_cdk.aws_elasticloadbalancingv2.ApplicationLoadBalancer:

                        -
                        +
                         from aws_cdk import (
                             aws_elasticloadbalancingv2 as elbv2,
                         )
                        @@ -83,191 +67,62 @@ 

                        Sensitive Code Example

                        lb.add_listener( "Listener-default", - port=80, # Sensitive + port=80, # Noncompliant open=True ) lb.add_listener( "Listener-http-explicit", - protocol=elbv2.ApplicationProtocol.HTTP, # Sensitive + protocol=elbv2.ApplicationProtocol.HTTP, # Noncompliant port=8080, open=True )
                        -

                        For aws_cdk.aws_elasticloadbalancingv2.ApplicationListener:

                        -
                        +

                        Compliant solution

                        +
                         from aws_cdk import (
                             aws_elasticloadbalancingv2 as elbv2,
                         )
                         
                        -elbv2.ApplicationListener(
                        -    self,
                        -    "listener-http-explicit-const",
                        -    load_balancer=lb,
                        -    protocol=elbv2.ApplicationProtocol.HTTP, # Sensitive
                        -    port=8081,
                        -    open=True
                        -)
                        -
                        -

                        For aws_cdk.aws_elasticloadbalancingv2.NetworkLoadBalancer:

                        -
                        -from aws_cdk import (
                        -    aws_elasticloadbalancingv2 as elbv2,
                        -)
                        -lb = elbv2.NetworkLoadBalancer(
                        +lb = elbv2.ApplicationLoadBalancer(
                             self,
                             "LB",
                             vpc=vpc,
                             internet_facing=True
                         )
                         
                        -lb.add_listener( # Sensitive
                        -    "Listener-default",
                        -    port=1234
                        -)
                         lb.add_listener(
                        -    "Listener-TCP-explicit",
                        -    protocol=elbv2.Protocol.TCP, # Sensitive
                        -    port=1337
                        -)
                        -
                        -

                        For aws_cdk.aws_elasticloadbalancingv2.NetworkListener:

                        -
                        -from aws_cdk import (
                        -    aws_elasticloadbalancingv2 as elbv2,
                        -)
                        -
                        -elbv2.NetworkListener(
                        -    self,
                        -    "Listener-TCP-explicit",
                        -    protocol=elbv2.Protocol.TCP, # Sensitive
                        -    port=1338,
                        -    load_balancer=lb
                        -)
                        -
                        -

                        For aws_cdk.aws_elasticloadbalancingv2.CfnListener:

                        -
                        -from aws_cdk import (
                        -    aws_elasticloadbalancingv2 as elbv2,
                        -)
                        -
                        -elbv2.CfnListener(
                        -    self,
                        -    "listener-http",
                        -    default_actions=[application_default_action],
                        -    load_balancer_arn=lb.load_balancer_arn,
                        -    protocol="HTTP", # Sensitive
                        -    port=80
                        -)
                        -
                        -elbv2.CfnListener(
                        -    self,
                        -    "listener-tcp",
                        -    default_actions=[network_default_action],
                        -    load_balancer_arn=lb.load_balancer_arn,
                        -    protocol="TCP", # Sensitive
                        -    port=1000
                        -)
                        -
                        -

                        For aws_cdk.aws_elasticloadbalancing.LoadBalancerListener:

                        -
                        -from aws_cdk import (
                        -    aws_elasticloadbalancing as elb,
                        -)
                        -
                        -elb.LoadBalancerListener(
                        -    external_port=10000,
                        -    external_protocol=elb.LoadBalancingProtocol.TCP, # Sensitive
                        -    internal_port=10000
                        -)
                        -
                        -elb.LoadBalancerListener(
                        -    external_port=10080,
                        -    external_protocol=elb.LoadBalancingProtocol.HTTP, # Sensitive
                        -    internal_port=10080
                        -)
                        -
                        -

                        For aws_cdk.aws_elasticloadbalancing.CfnLoadBalancer:

                        -
                        -from aws_cdk import (
                        -    aws_elasticloadbalancing as elb
                        -)
                        -
                        -elb.CfnLoadBalancer(
                        -    self,
                        -    "elb-tcp",
                        -    listeners=[
                        -        elb.CfnLoadBalancer.ListenersProperty(
                        -            instance_port="10000",
                        -            load_balancer_port="10000",
                        -            protocol="tcp" # Sensitive
                        -        )
                        -    ],
                        -    subnets=vpc.select_subnets().subnet_ids
                        -)
                        -
                        -elb.CfnLoadBalancer(
                        -    self,
                        -    "elb-http-dict",
                        -    listeners=[
                        -        {
                        -            "instancePort":"10000",
                        -            "loadBalancerPort":"10000",
                        -            "protocol":"http" # Sensitive
                        -        }
                        -    ],
                        -    subnets=vpc.select_subnets().subnet_ids
                        -)
                        -
                        -

                        For aws_cdk.aws_elasticloadbalancing.LoadBalancer:

                        -
                        -from aws_cdk import (
                        -    aws_elasticloadbalancing as elb,
                        -)
                        -
                        -elb.LoadBalancer(
                        -    self,
                        -    "elb-tcp-dict",
                        -    vpc=vpc,
                        -    listeners=[
                        -        {
                        -            "externalPort":10000,
                        -            "externalProtocol":elb.LoadBalancingProtocol.TCP, # Sensitive
                        -            "internalPort":10000
                        -        }
                        -    ]
                        +    "Listener-https-explicit",
                        +    protocol=elbv2.ApplicationProtocol.HTTPS,
                        +    certificates=[elbv2.ListenerCertificate("certificateARN")],
                        +    port=443,
                        +    open=True
                         )
                         
                        -loadBalancer.add_listener(
                        -    external_port=10081,
                        -    external_protocol=elb.LoadBalancingProtocol.HTTP, # Sensitive
                        -    internal_port=10081
                        -)
                        -loadBalancer.add_listener(
                        -    external_port=10001,
                        -    external_protocol=elb.LoadBalancingProtocol.TCP, # Sensitive
                        -    internal_port=10001
                        +lb.add_listener(
                        +    "Listener-https-implicit",
                        +    certificates=[elbv2.ListenerCertificate("certificateARN")],
                        +    port=8443,
                        +    open=True
                         )
                         
                        +

                        How to fix it in Amazon ElastiCache

                        +

                        Code examples

                        +

                        The following code uses a clear-text protocol or disables encryption for a network connection, leaving transmitted data exposed to +interception.

                        +

                        Noncompliant code example

                        For aws_cdk.aws_elasticache.CfnReplicationGroup:

                        -
                        +
                         from aws_cdk import (
                             aws_elasticache as elasticache
                         )
                         
                         elasticache.CfnReplicationGroup(
                             self,
                        -    "unencrypted-explicit",
                        +    "example-explicit",
                             replication_group_description="a replication group",
                             automatic_failover_enabled=False,
                        -    transit_encryption_enabled=False, # Sensitive
                        +    transit_encryption_enabled=False, # Noncompliant
                             cache_subnet_group_name="test",
                             engine="redis",
                             engine_version="3.2.6",
                        @@ -275,11 +130,30 @@ 

                        Sensitive Code Example

                        cache_node_type="cache.t2.micro" ) -elasticache.CfnReplicationGroup( # Sensitive, encryption is disabled by default +elasticache.CfnReplicationGroup( # Noncompliant: encryption is disabled by default self, - "unencrypted-implicit", + "example-implicit", + replication_group_description="a replication group", + automatic_failover_enabled=False, + cache_subnet_group_name="test", + engine="redis", + engine_version="3.2.6", + num_cache_clusters=1, + cache_node_type="cache.t2.micro" +) +
                        +

                        Compliant solution

                        +
                        +from aws_cdk import (
                        +    aws_elasticache as elasticache
                        +)
                        +
                        +elasticache.CfnReplicationGroup(
                        +    self,
                        +    "example-explicit",
                             replication_group_description="a test replication group",
                             automatic_failover_enabled=False,
                        +    transit_encryption_enabled=True,
                             cache_subnet_group_name="test",
                             engine="redis",
                             engine_version="3.2.6",
                        @@ -287,318 +161,58 @@ 

                        Sensitive Code Example

                        cache_node_type="cache.t2.micro" )
                        +

                        How to fix it in AWS Kinesis

                        +

                        Code examples

                        +

                        The following code uses a clear-text protocol or disables encryption for a network connection, leaving transmitted data exposed to +interception.

                        +

                        Noncompliant code example

                        For aws_cdk.aws_kinesis.CfnStream:

                        -
                        +
                         from aws_cdk import (
                             aws_kinesis as kinesis,
                         )
                         
                        -kinesis.CfnStream( # Sensitive, encryption is disabled by default for CfnStreams
                        +kinesis.CfnStream( # Noncompliant: encryption is disabled by default for CfnStreams
                             self,
                        -    "cfnstream-implicit-unencrytped",
                        +    "example-cfnstream-implicit",
                             shard_count=1
                         )
                         
                         kinesis.CfnStream(self,
                        -    "cfnstream-explicit-unencrytped",
                        +    "example-cfnstream-explicit",
                             shard_count=1,
                        -    stream_encryption=None # Sensitive
                        +    stream_encryption=None # Noncompliant
                         )
                         

                        For aws_cdk.aws_kinesis.Stream:

                        -
                        +
                         from aws_cdk import (
                             aws_kinesis as kinesis,
                         )
                         
                         stream = kinesis.Stream(self,
                        -    "stream-explicit-unencrypted",
                        +    "example-stream",
                             shard_count=1,
                        -    encryption=kinesis.StreamEncryption.UNENCRYPTED # Sensitive
                        -)
                        -
                        -

                        Compliant Solution

                        -
                        -url = "https://example.com"
                        -url = "sftp://anonymous@example.com"
                        -url = "ssh://anonymous@example.com"
                        -
                        -import ftplib
                        -cnx = ftplib.FTP_TLS("ftp.example.com")
                        -
                        -import smtplib
                        -smtp = smtplib.SMTP("smtp.example.com", port=587)
                        -smtp.starttls(context=context)
                        -
                        -smtp_ssl = smtplib.SMTP_SSL("smtp.gmail.com", port=465)
                        -
                        -

                        For aws_cdk.aws_elasticloadbalancingv2.ApplicationLoadBalancer:

                        -
                        -from aws_cdk import (
                        -    aws_elasticloadbalancingv2 as elbv2,
                        -)
                        -
                        -lb = elbv2.ApplicationLoadBalancer(
                        -    self,
                        -    "LB",
                        -    vpc=vpc,
                        -    internet_facing=True
                        -)
                        -
                        -lb.add_listener(
                        -    "Listener-https-explicit",
                        -    protocol=elbv2.ApplicationProtocol.HTTPS,
                        -    certificates=[elbv2.ListenerCertificate("certificateARN")],
                        -    port=443,
                        -    open=True
                        -)
                        -
                        -lb.add_listener(
                        -    "Listener-https-implicit",
                        -    certificates=[elbv2.ListenerCertificate("certificateARN")],
                        -    port=8443,
                        -    open=True
                        -)
                        -
                        -

                        For -aws_cdk.aws_elasticloadbalancingv2.ApplicationListener:

                        -
                        -from aws_cdk import (
                        -    aws_elasticloadbalancingv2 as elbv2,
                        -)
                        -
                        -elbv2.ApplicationListener(
                        -    self,
                        -    "listener-https-explicit-const",
                        -    load_balancer=lb,
                        -    protocol=elbv2.ApplicationProtocol.HTTPS,
                        -    certificates=[elbv2.ListenerCertificate("certificateARN")],
                        -    port=444,
                        -    open=True
                        -)
                        -
                        -

                        For aws_cdk.aws_elasticloadbalancingv2.NetworkLoadBalancer:

                        -
                        -from aws_cdk import (
                        -    aws_elasticloadbalancingv2 as elbv2,
                        -)
                        -lb = elbv2.NetworkLoadBalancer(
                        -    self,
                        -    "LB",
                        -    vpc=vpc,
                        -    internet_facing=True
                        -)
                        -
                        -lb.add_listener(
                        -    "Listener-TLS-explicit",
                        -    protocol=elbv2.Protocol.TLS,
                        -    certificates=[elbv2.ListenerCertificate("certificateARN")],
                        -    port=443
                        -)
                        -lb.add_listener(
                        -    "Listener-TLS-implicit",
                        -    certificates=[elbv2.ListenerCertificate("certificateARN")],
                        -    port=1024
                        -)
                        -
                        -

                        For aws_cdk.aws_elasticloadbalancingv2.NetworkListener:

                        -
                        -from aws_cdk import (
                        -    aws_elasticloadbalancingv2 as elbv2,
                        -)
                        -
                        -elbv2.NetworkListener(
                        -    self,
                        -    "Listener-TLS-explicit",
                        -    protocol=elbv2.Protocol.TLS,
                        -    certificates=[elbv2.ListenerCertificate("certificateARN")],
                        -    port=443,
                        -    load_balancer=lb
                        +    encryption=kinesis.StreamEncryption.UNENCRYPTED # Noncompliant
                         )
                         
                        -

                        For aws_cdk.aws_elasticloadbalancingv2.CfnListener:

                        -
                        -from aws_cdk import (
                        -    aws_elasticloadbalancingv2 as elbv2,
                        -)
                        -
                        -elbv2.CfnListener(
                        -    self,
                        -    "listener-https",
                        -    default_actions=[application_default_action],
                        -    load_balancer_arn=lb.load_balancer_arn,
                        -    protocol="HTTPS",
                        -    port=443,
                        -    certificates=[elbv2.CfnListener.CertificateProperty(
                        -        certificate_arn="certificateARN"
                        -    )]
                        -)
                        -
                        -elbv2.CfnListener(
                        -    self,
                        -    "listener-tls",
                        -    default_actions=[network_default_action],
                        -    load_balancer_arn=lb.load_balancer_arn,
                        -    protocol="TLS",
                        -    port=1001,
                        -    certificates=[elbv2.CfnListener.CertificateProperty(
                        -        certificate_arn="certificateARN"
                        -    )]
                        -)
                        -
                        -

                        For aws_cdk.aws_elasticloadbalancing.LoadBalancerListener:

                        -
                        -from aws_cdk import (
                        -    aws_elasticloadbalancing as elb,
                        -)
                        -
                        -elb.LoadBalancerListener(
                        -    external_port=10043,
                        -    external_protocol=elb.LoadBalancingProtocol.SSL,
                        -    internal_port=10043,
                        -    ssl_certificate_arn="certificateARN"
                        -)
                        -
                        -elb.LoadBalancerListener(
                        -    external_port=10443,
                        -    external_protocol=elb.LoadBalancingProtocol.HTTPS,
                        -    internal_port=10443,
                        -    ssl_certificate_arn="certificateARN"
                        -)
                        -
                        -

                        For aws_cdk.aws_elasticloadbalancing.CfnLoadBalancer:

                        -
                        -from aws_cdk import (
                        -    aws_elasticloadbalancing as elb,
                        -)
                        -
                        -elb.CfnLoadBalancer(
                        -    self,
                        -    "elb-ssl",
                        -    listeners=[
                        -        elb.CfnLoadBalancer.ListenersProperty(
                        -            instance_port="10043",
                        -            load_balancer_port="10043",
                        -            protocol="ssl",
                        -            ssl_certificate_id=CERTIFICATE_ARN
                        -        )
                        -    ],
                        -    subnets=vpc.select_subnets().subnet_ids
                        -)
                        -
                        -elb.CfnLoadBalancer(
                        -    self,
                        -    "elb-https-dict",
                        -    listeners=[
                        -        {
                        -            "instancePort":"10443",
                        -            "loadBalancerPort":"10443",
                        -            "protocol":"https",
                        -            "sslCertificateId":CERTIFICATE_ARN
                        -        }
                        -    ],
                        -    subnets=vpc.select_subnets().subnet_ids
                        -)
                        -
                        -

                        For aws_cdk.aws_elasticloadbalancing.LoadBalancer:

                        -
                        -from aws_cdk import (
                        -    aws_elasticloadbalancing as elb,
                        -)
                        -
                        -elb.LoadBalancer(
                        -    self,
                        -    "elb-ssl",
                        -    vpc=vpc,
                        -    listeners=[
                        -        {
                        -            "externalPort":10044,
                        -            "externalProtocol":elb.LoadBalancingProtocol.SSL,
                        -            "internalPort":10044,
                        -            "sslCertificateArn":"certificateARN"
                        -        },
                        -        {
                        -            "externalPort":10444,
                        -            "externalProtocol":elb.LoadBalancingProtocol.HTTPS,
                        -            "internalPort":10444,
                        -            "sslCertificateArn":"certificateARN"
                        -        }
                        -    ]
                        -)
                        -
                        -loadBalancer = elb.LoadBalancer(
                        -        self,
                        -        "elb-multi-listener",
                        -        vpc=vpc
                        -)
                        -loadBalancer.add_listener(
                        -    external_port=10045,
                        -    external_protocol=elb.LoadBalancingProtocol.SSL,
                        -    internal_port=10045,
                        -    ssl_certificate_arn="certificateARN"
                        -)
                        -loadBalancer.add_listener(
                        -    external_port=10445,
                        -    external_protocol=elb.LoadBalancingProtocol.HTTPS,
                        -    internal_port=10445,
                        -    ssl_certificate_arn="certificateARN"
                        -)
                        -
                        -

                        For aws_cdk.aws_elasticache.CfnReplicationGroup:

                        -
                        -from aws_cdk import (
                        -    aws_elasticache as elasticache
                        -)
                        -
                        -elasticache.CfnReplicationGroup(
                        -    self,
                        -    "encrypted-explicit",
                        -    replication_group_description="a test replication group",
                        -    automatic_failover_enabled=False,
                        -    transit_encryption_enabled=True,
                        -    cache_subnet_group_name="test",
                        -    engine="redis",
                        -    engine_version="3.2.6",
                        -    num_cache_clusters=1,
                        -    cache_node_type="cache.t2.micro"
                        -)
                        -
                        -

                        For aws_cdk.aws_kinesis.CfnStream:

                        -
                        +

                        Compliant solution

                        +
                         from aws_cdk import (
                             aws_kinesis as kinesis,
                         )
                         
                         kinesis.CfnStream(
                             self,
                        -    "cfnstream-explicit-encrytped",
                        +    "example-cfnstream-explicit",
                             shard_count=1,
                             stream_encryption=kinesis.CfnStream.StreamEncryptionProperty(
                                 encryption_type="KMS",
                                 key_id="alias/aws/kinesis"
                             )
                         )
                        -
                        -stream = kinesis.CfnStream(
                        -    self,
                        -    "cfnstream-explicit-encrytped-dict",
                        -    shard_count=1,
                        -    stream_encryption={
                        -        "encryptionType": "KMS",
                        -        "keyId": "alias/aws/kinesis"
                        -    }
                        -)
                         
                        -

                        For aws_cdk.aws_kinesis.Stream:

                        -
                        +
                         from aws_cdk import (
                             aws_kinesis as kinesis,
                             aws_kms as kms
                        @@ -606,32 +220,28 @@ 

                        Compliant Solution

                        stream = kinesis.Stream( # Encryption is enabled by default for Streams self, - "stream-implicit-encrypted", + "example-stream", shard_count=1 ) stream = kinesis.Stream( self, - "stream-explicit-encrypted-managed", + "example-stream-managed", shard_count=1, encryption=kinesis.StreamEncryption.MANAGED ) - -key = kms.Key(self, "managed_key") -stream = kinesis.Stream( - self, - "stream-explicit-encrypted-selfmanaged", - shard_count=1, - encryption=kinesis.StreamEncryption.KMS, - encryption_key=key -)

                        Exceptions

                        -

                        No issue is reported for the following cases because they are not considered sensitive:

                        +

                        No issue is reported for the following cases:

                          -
                        • Insecure protocol scheme followed by loopback addresses like 127.0.0.1 or localhost.
                        • +
                        • URLs whose host resolves only within a private runtime environment and is not reachable from the public internet (including loopback and cloud + metadata hosts)
                        • +
                        • Well-known namespace URI authorities used in in XML, JSON-LD, RDF, or similar formats (for example, www.w3.org, + schemas.android.com, schema.org).
                        • +
                        • IANA-reserved documentation and test domains like example.com, example.net, example.org (RFC 6761). These + are almost always placeholders in source code, not real connection targets.
                        -

                        See

                        +

                        Resources

                        Documentation

                        • AWS Documentation - Listeners for diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5332.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5332.json index c4cf268e3..a4194de96 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5332.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5332.json @@ -1,17 +1,23 @@ { - "title": "Using clear-text protocols is security-sensitive", - "type": "SECURITY_HOTSPOT", + "title": "Clear-text protocols should not be used", + "type": "VULNERABILITY", "code": { "impacts": { - "SECURITY": "HIGH" + "SECURITY": "LOW" }, "attribute": "COMPLETE" }, "status": "ready", + "quickfix": "unknown", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "30min" + }, "tags": [ - "cwe" + "cwe", + "former-hotspot" ], - "defaultSeverity": "Critical", + "defaultSeverity": "Minor", "ruleSpecification": "RSPEC-5332", "sqKey": "S5332", "scope": "Main", diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5852.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5852.html index 4c393904d..63df8bd71 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5852.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5852.html @@ -1,69 +1,62 @@ -

                          Most of the regular expression engines use backtracking to try all possible execution paths of the regular expression when evaluating -an input, in some cases it can cause performance issues, called catastrophic backtracking situations. In the worst case, the complexity -of the regular expression is exponential in the size of the input, this means that a small carefully-crafted input (like 20 chars) can trigger -catastrophic backtracking and cause a denial of service of the application. Super-linear regex complexity can lead to the same impact too -with, in this case, a large carefully-crafted input (thousands chars).

                          -

                          This rule determines the runtime complexity of a regular expression and informs you of the complexity if it is not linear.

                          -

                          Ask Yourself Whether

                          +

                          Regular expression engines rely on backtracking to evaluate patterns against input. Certain regex patterns lead to catastrophic backtracking, where +the evaluation time grows exponentially with the input size.

                          +

                          Why is this an issue?

                          +

                          Regular expression engines use backtracking to try all possible execution paths when evaluating a pattern against an input. In some cases, this +leads to catastrophic backtracking situations where the worst-case evaluation time grows exponentially with the input size. A small, carefully crafted +input (around 20 characters) can trigger exponential backtracking and cause a denial of service of the application.

                          +

                          This rule reports regular expressions that create exponential backtracking.

                          +

                          What is the potential impact?

                          +

                          Denial of service

                          +

                          An attacker who can control the input matched against a vulnerable regular expression can craft a payload that causes the regex engine to explore +an exponential number of execution paths. This causes the matching thread to consume excessive CPU time, preventing the application from serving +legitimate users.

                          +

                          How to fix it

                          +

                          To fix a vulnerable regular expression, consider the following strategies:

                            -
                          • The input is user-controlled.
                          • -
                          • The input size is not restricted to a small number of characters.
                          • -
                          • There is no timeout in place to limit the regex evaluation time.
                          • +
                          • Use possessive quantifiers and atomic grouping (available since Python 3.11) to prevent the regex engine from keeping backtracking + positions.
                          • +
                          • Replace . with negated character classes to exclude separators where applicable (e.g., [^_]* instead of + .* before _).
                          • +
                          • Use bounded quantifiers such as {1,5} to limit repetitions.
                          • +
                          • Restructure nested quantifiers so the inner group can match in only one way.
                          -

                          There is a risk if you answered yes to any of those questions.

                          -

                          Recommended Secure Coding Practices

                          -

                          To avoid catastrophic backtracking situations, make sure that none of the following conditions apply to your regular expression.

                          -

                          In all of the following cases, catastrophic backtracking can only happen if the problematic part of the regex is followed by a pattern that can -fail, causing the backtracking to actually happen. Note that when performing a full match (e.g. using re.fullmatch), the end of the regex -counts as a pattern that can fail because it will only succeed when the end of the string is reached.

                          -
                            -
                          • If you have a non-possessive repetition r* or r*?, such that the regex r could produce different possible - matches (of possibly different lengths) on the same input, the worst case matching time can be exponential. This can be the case if r - contains optional parts, alternations or additional repetitions (but not if the repetition is written in such a way that there’s only one way to - match it).
                          • -
                          • If you have multiple non-possessive repetitions that can match the same contents and are consecutive or are only separated by an optional - separator or a separator that can be matched by both of the repetitions, the worst case matching time can be polynomial (O(n^c) where c is the - number of problematic repetitions). For example a*b* is not a problem because a* and b* match different - things and a*_a* is not a problem because the repetitions are separated by a '_' and can’t match that '_'. - However, a*a* and .*_.* have quadratic runtime.
                          • -
                          • If you’re performing a partial match (such as by using re.search, re.split, re.findall etc.) and the - regex is not anchored to the beginning of the string, quadratic runtime is especially hard to avoid because whenever a match fails, the regex engine - will try again starting at the next index. This means that any unbounded repetition (even a possessive one), if it’s followed by a pattern that can - fail, can cause quadratic runtime on some inputs. For example re.split(r"\s*,", my_str) will run in quadratic time on strings that - consist entirely of spaces (or at least contain large sequences of spaces, not followed by a comma).
                          • -
                          -

                          In order to rewrite your regular expression without these patterns, consider the following strategies:

                          -
                            -
                          • If applicable, define a maximum number of expected repetitions using the bounded quantifiers, like {1,5} instead of + - for instance.
                          • -
                          • Refactor nested quantifiers to limit the number of way the inner group can be matched by the outer quantifier, for instance this - nested quantifier situation (ba+)+ doesn’t cause performance issues, indeed, the inner group can be matched only if there exists - exactly one b char per repetition of the group.
                          • -
                          • Optimize regular expressions with possessive quantifiers and atomic grouping (available since Python 3.11).
                          • -
                          • Use negated character classes instead of . to exclude separators where applicable. For example the quadratic regex - .*_.* can be made linear by changing it to [^_]*_.*
                          • -
                          -

                          Sometimes it’s not possible to rewrite the regex to be linear while still matching what you want it to match. Especially when using partial -matches, for which it is quite hard to avoid quadratic runtimes. In those cases consider the following approaches:

                          -
                          -

                          See

                          +

                          Code examples

                          +

                          The following regular expression is vulnerable to exponential backtracking and will never terminate for the given input.

                          +

                          Noncompliant code example

                          +
                          +import re
                          +
                          +re.search(r"(a+)+$", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" +
                          +                      "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" +
                          +                      "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" +
                          +                      "aaaaaaaaaaaaaaa!")  # Noncompliant
                          +
                          +

                          Compliant solution

                          +

                          Using atomic grouping (available since Python 3.11) prevents the engine from keeping backtracking positions:

                          +
                          +import re
                          +
                          +re.search(r"(?>a+)+$", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" +
                          +                        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" +
                          +                        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" +
                          +                        "aaaaaaaaaaaaaaa!")
                          +
                          +

                          Resources

                          +

                          Articles & blog posts

                          - +

                          Standards

                          + +

                          Related rules

                          +
                            +
                          • {rule:python:S8786} - Regular expressions should not cause non-linear backtracking
                          • +
                          diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5852.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5852.json index 8051ec85b..c11030bd7 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5852.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5852.json @@ -1,6 +1,6 @@ { - "title": "Using slow regular expressions is security-sensitive", - "type": "SECURITY_HOTSPOT", + "title": "Regular expressions should not cause catastrophic backtracking", + "type": "VULNERABILITY", "code": { "impacts": { "SECURITY": "HIGH" @@ -8,13 +8,15 @@ "attribute": "EFFICIENT" }, "status": "ready", + "quickfix": "unknown", "remediation": { "func": "Constant\/Issue", "constantCost": "30min" }, "tags": [ "cwe", - "regex" + "regex", + "former-hotspot" ], "defaultSeverity": "Critical", "ruleSpecification": "RSPEC-5852", @@ -22,11 +24,10 @@ "scope": "All", "securityStandards": { "CWE": [ - 400, 1333 ], - "OWASP": [ - "A1" + "OWASP Top 10 2021": [ + "A4" ], "ASVS 4.0": [ "12.1.1" diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6249.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6249.html index 4287627bf..199850931 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6249.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6249.html @@ -1,70 +1,43 @@ -

                          By default, S3 buckets can be accessed through HTTP and HTTPs protocols.

                          -

                          As HTTP is a clear-text protocol, it lacks the encryption of transported data, as well as the capability to build an authenticated connection. It -means that a malicious actor who is able to intercept traffic from the network can read, modify or corrupt the transported content.

                          -

                          Ask Yourself Whether

                          -
                            -
                          • The S3 bucket stores sensitive information.
                          • -
                          • The infrastructure has to comply with AWS Foundational Security Best Practices standard.
                          • -
                          -

                          There is a risk if you answered yes to any of those questions.

                          -

                          Recommended Secure Coding Practices

                          -

                          It’s recommended to deny all HTTP requests:

                          -
                            -
                          • for all objects (*) of the bucket
                          • -
                          • for all principals (*)
                          • -
                          • for all actions (*)
                          • -
                          -

                          Sensitive Code Example

                          -

                          No secure policy is attached to this bucket:

                          -
                          +

                          By default, S3 buckets can be accessed through both HTTP and HTTPS protocols.

                          +

                          Why is this an issue?

                          +

                          HTTP is a cleartext protocol: it provides no encryption for data in transit and does not support authenticated connections. An attacker with the +ability to intercept network traffic can read, modify, or corrupt data transmitted between a client and an S3 bucket over HTTP. This rule raises an +issue when an S3 bucket has no policy that explicitly denies HTTP requests for all principals, all actions, and all objects.

                          +

                          What is the potential impact?

                          +

                          Data interception

                          +

                          An attacker positioned on the network path between clients and the S3 bucket can read all data transmitted over HTTP in cleartext, including file +contents and any credentials present in request headers.

                          +

                          Data tampering

                          +

                          Without transport encryption, a network attacker can modify requests or responses as they flow between the client and S3, corrupting stored data or +injecting malicious content without detection.

                          +

                          How to fix it

                          +

                          Code examples

                          +

                          The following code does not enforce HTTPS-only access to the S3 bucket, allowing HTTP requests to succeed.

                          +

                          Noncompliant code example

                          +
                           import aws_cdk.aws_s3 as s3
                          -import aws_cdk.aws_iam as iam
                           
                          -bucket = s3.Bucket(self, "bucket") # Sensitive
                          +bucket = s3.Bucket(self, "bucket") # Noncompliant
                           
                          -

                          A policy is defined but forces only HTTPs communication for some users, some objects of the bucket and for some actions:

                          -
                          -bucket = s3.Bucket(self, "bucket")
                          -bucket.add_to_resource_policy(iam.PolicyStatement(     # Sensitive
                          -    effect=iam.Effect.DENY,
                          -    resources=[bucket.bucket_arn],
                          -    actions=["s3:SomeAction"],
                          -    principals=[roles],
                          -    conditions=[{"Bool": {"aws:SecureTransport": False}}]
                          -    )
                          -)
                          -
                          -

                          Compliant Solution

                          -

                          A bucket policy that complies with s3-bucket-ssl-requests-only rule should be used. To adhere to it, the bucket policies need to explicitly deny -access to HTTP requests.

                          -

                          A secure policy that enforces SSL on requests (default: False):

                          -
                          -bucket = S3.Bucket(self,
                          +

                          Compliant solution

                          +
                          +import aws_cdk.aws_s3 as s3
                          +
                          +bucket = s3.Bucket(self,
                               "bucket",
                               enforce_ssl=True
                           )
                           
                          -

                          A secure policy that denies all HTTP requests is used:

                          -
                          -bucket = s3.Bucket(self, "bucket")
                          -
                          -result = bucket.add_to_resource_policy(iam.PolicyStatement(
                          -    effect=iam.Effect.DENY,
                          -    resources=["*"],
                          -    actions=["s3:*"],
                          -    principals=["*"],
                          -    conditions=["SecureTransport:False"]
                          -    )
                          -)
                          -
                          -

                          See

                          +

                          Resources

                          +

                          Documentation

                          +

                          Standards

                          + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6249.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6249.json index 1b0ea7eee..8acd2b568 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6249.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6249.json @@ -1,22 +1,24 @@ { - "title": "Authorizing HTTP communications with S3 buckets is security-sensitive", - "type": "SECURITY_HOTSPOT", + "title": "S3 buckets should enforce HTTPS-only access", + "type": "VULNERABILITY", "code": { "impacts": { - "SECURITY": "HIGH" + "SECURITY": "LOW" }, - "attribute": "COMPLETE" + "attribute": "TRUSTWORTHY" }, "status": "ready", + "quickfix": "unknown", "remediation": { "func": "Constant\/Issue", "constantCost": "10min" }, "tags": [ "aws", - "cwe" + "cwe", + "former-hotspot" ], - "defaultSeverity": "Critical", + "defaultSeverity": "Minor", "ruleSpecification": "RSPEC-6249", "sqKey": "S6249", "scope": "Main", diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6252.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6252.html index fc65b04dc..a8ead7ff1 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6252.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6252.html @@ -1,30 +1,39 @@ -

                          S3 buckets can be versioned. When the S3 bucket is unversioned it means that a new version of an object overwrites an existing one in the S3 -bucket.

                          -

                          It can lead to unintentional or intentional information loss.

                          -

                          Ask Yourself Whether

                          -
                            -
                          • The bucket stores information that require high availability.
                          • -
                          -

                          There is a risk if you answered yes to any of those questions.

                          -

                          Recommended Secure Coding Practices

                          -

                          It’s recommended to enable S3 versioning and thus to have the possibility to retrieve and restore different versions of an object.

                          -

                          Sensitive Code Example

                          -
                          +

                          Amazon S3 buckets can be unversioned, have versioning enabled, or have versioning suspended.

                          +

                          Why is this an issue?

                          +

                          When an S3 bucket is unversioned or has versioning suspended, uploading a new object overwrites the previous one instead of preserving prior +versions. The rule flags buckets without versioning enabled, including when the versioning property is omitted and defaults to disabled.

                          +

                          What is the potential impact?

                          +

                          Data loss

                          +

                          Objects can be permanently overwritten or deleted without the ability to restore previous versions. This can result from accidental changes, +misconfiguration, or malicious activity.

                          +

                          Reduced availability of historical data

                          +

                          Buckets that store information requiring long-term preservation become vulnerable to unintentional or intentional information loss when versioning +is not enabled.

                          +

                          How to fix it

                          +

                          Code examples

                          +

                          Versioning is disabled when the property is omitted or explicitly set to disable versioning, so new object uploads overwrite existing ones.

                          +

                          Noncompliant code example

                          +
                           bucket = s3.Bucket(self, "bucket",
                          -    versioned=False       # Sensitive
                          +    versioned=False       # Noncompliant
                           )
                           
                          -

                          The default value of versioned is False so the absence of this parameter is also sensitive.

                          -

                          Compliant Solution

                          -
                          +

                          The default value of versioned is False so the absence of this parameter is also noncompliant.

                          +

                          Compliant solution

                          +
                           bucket = s3.Bucket(self, "bucket",
                               versioned=True
                           )
                           
                          -

                          See

                          +

                          Resources

                          +

                          Documentation

                          +

                          Standards

                          + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6252.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6252.json index c0d4ca7e8..7bd717dee 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6252.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6252.json @@ -1,6 +1,6 @@ { - "title": "Disabling versioning of S3 buckets is security-sensitive", - "type": "SECURITY_HOTSPOT", + "title": "Amazon S3 buckets should have versioning enabled", + "type": "VULNERABILITY", "code": { "impacts": { "SECURITY": "LOW" @@ -8,12 +8,14 @@ "attribute": "CONVENTIONAL" }, "status": "ready", + "quickfix": "unknown", "remediation": { "func": "Constant\/Issue", "constantCost": "5min" }, "tags": [ - "aws" + "aws", + "former-hotspot" ], "defaultSeverity": "Minor", "ruleSpecification": "RSPEC-6252", @@ -27,8 +29,7 @@ "10.2.1.7" ], "CWE": [ - 16, - 693 + 16 ] } } diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6281.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6281.html index 225a92356..c6c5f4d79 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6281.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6281.html @@ -1,85 +1,79 @@ -

                          By default S3 buckets are private, it means that only the bucket owner can access it.

                          -

                          This access control can be relaxed with ACLs or policies.

                          -

                          To prevent permissive policies to be set on a S3 bucket the following booleans settings can be enabled:

                          -
                            -
                          • block_public_acls: to block or not public ACLs to be set to the S3 bucket.
                          • -
                          • ignore_public_acls: to consider or not existing public ACLs set to the S3 bucket.
                          • -
                          • block_public_policy: to block or not public policies to be set to the S3 bucket.
                          • -
                          • restrict_public_buckets: to restrict or not the access to the S3 endpoints of public policies to the principals within the bucket - owner account.
                          • -
                          -

                          The other attribute BlockPublicAccess.BLOCK_ACLS only turns on block_public_acls and ignore_public_acls. The -public policies can still affect the S3 bucket.

                          -

                          However, all of those options can be enabled by setting the block_public_access property of the S3 bucket to -BlockPublicAccess.BLOCK_ALL.

                          -

                          Ask Yourself Whether

                          -
                            -
                          • The S3 bucket stores sensitive data.
                          • -
                          • The S3 bucket is not used to store static resources of websites (images, css …​).
                          • -
                          • Many users have the permission to set ACL or policy to the S3 bucket.
                          • -
                          • These settings are not already enforced to true at the account level.
                          • -
                          -

                          There is a risk if you answered yes to any of those questions.

                          -

                          Recommended Secure Coding Practices

                          -

                          It’s recommended to configure:

                          -
                            -
                          • block_public_acls to True to block new attempts to set public ACLs.
                          • -
                          • ignore_public_acls to True to block existing public ACLs.
                          • -
                          • block_public_policy to True to block new attempts to set public policies.
                          • -
                          • restrict_public_buckets to True to restrict existing public policies.
                          • -
                          -

                          Sensitive Code Example

                          -

                          By default, when not set, the block_public_access is fully deactivated (nothing is blocked):

                          -
                          +

                          Amazon S3 provides four independent Public Access Block settings to prevent public access from being granted to a bucket through ACLs or bucket +policies. This rule flags S3 bucket configurations where any of these settings is set to false.

                          +

                          Why is this an issue?

                          +

                          Amazon S3 buckets are private by default, but their access control can be relaxed using ACLs or bucket policies that allow public access. Although +AWS enables all four Public Access Block settings by default, infrastructure code can inadvertently re-expose a bucket by setting any of them to +false.

                          +

                          What is the potential impact?

                          +

                          If public access is not fully blocked on an S3 bucket that contains sensitive data, any unauthenticated user on the internet can read, download, or +exfiltrate that data. This can lead to data breaches, compliance violations, and reputational damage to the organization.

                          +

                          How to fix it

                          +

                          Code examples

                          +

                          Noncompliant code example

                          +
                           bucket = s3.Bucket(self,
                          -    "bucket"        # Sensitive
                          +    "bucket",
                          +    block_public_access=s3.BlockPublicAccess(
                          +        block_public_acls=False,       # Noncompliant
                          +        ignore_public_acls=True,
                          +        block_public_policy=True,
                          +        restrict_public_buckets=True
                          +    )
                           )
                           
                          -

                          This block_public_access allows public ACL to be set:

                          -
                          +

                          Compliant solution

                          +
                           bucket = s3.Bucket(self,
                               "bucket",
                               block_public_access=s3.BlockPublicAccess(
                          -        block_public_acls=False,       # Sensitive
                          +        block_public_acls=True,
                                   ignore_public_acls=True,
                                   block_public_policy=True,
                                   restrict_public_buckets=True
                               )
                           )
                           
                          -

                          The attribute BLOCK_ACLS only blocks and ignores public ACLs:

                          -
                          +

                          The attribute BLOCK_ACLS_ONLY only blocks and ignores public ACLs, but public policies can still affect the S3 bucket:

                          +

                          Noncompliant code example

                          +
                           bucket = s3.Bucket(self,
                               "bucket",
                          -    block_public_access=s3.BlockPublicAccess.BLOCK_ACLS     # Sensitive
                          +    block_public_access=s3.BlockPublicAccess.BLOCK_ACLS_ONLY     # Noncompliant
                           )
                           
                          -

                          Compliant Solution

                          -

                          This block_public_access blocks public ACLs and policies, ignores existing public ACLs and restricts existing public policies:

                          -
                          +

                          Compliant solution

                          +
                           bucket = s3.Bucket(self,
                               "bucket",
                          -    block_public_access=s3.BlockPublicAccess.BLOCK_ALL # Compliant
                          +    block_public_access=s3.BlockPublicAccess.BLOCK_ALL
                           )
                           
                          -

                          A similar configuration to the one above can obtained by setting all parameters of the block_public_access

                          -
                          -bucket = s3.Bucket(self, "bucket",
                          -    block_public_access=s3.BlockPublicAccess(       # Compliant
                          -        block_public_acls=True,
                          -        ignore_public_acls=True,
                          -        block_public_policy=True,
                          -        restrict_public_buckets=True
                          -    )
                          -)
                          -
                          -

                          See

                          +

                          How does this work?

                          +

                          The BlockPublicAccess class controls public access to an S3 bucket through four independent settings:

                          +
                            +
                          • block_public_acls: blocks new public ACLs from being set on the bucket.
                          • +
                          • ignore_public_acls: causes existing public ACLs on the bucket to be ignored.
                          • +
                          • block_public_policy: blocks new public bucket policies from being set.
                          • +
                          • restrict_public_buckets: restricts access to the bucket to principals within the bucket owner account when a public policy is in + effect.
                          • +
                          +

                          When block_public_access is not set, or when BlockPublicAccess(…​) is used with some attributes omitted, AWS CDK defaults +the missing attributes to True. The BlockPublicAccess.BLOCK_ALL preset enables all four settings explicitly, providing +complete protection. The BlockPublicAccess.BLOCK_ACLS_ONLY preset only enables block_public_acls and +ignore_public_acls, explicitly setting block_public_policy and restrict_public_buckets to +False.

                          +

                          Resources

                          +

                          Documentation

                          +

                          Standards

                          + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6281.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6281.json index df73b7289..4a5eb2a8f 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6281.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6281.json @@ -1,6 +1,6 @@ { - "title": "Allowing public ACLs or policies on a S3 bucket is security-sensitive", - "type": "SECURITY_HOTSPOT", + "title": "Amazon S3 bucket public access should be fully blocked", + "type": "VULNERABILITY", "code": { "impacts": { "SECURITY": "HIGH" @@ -8,13 +8,15 @@ "attribute": "COMPLETE" }, "status": "ready", + "quickfix": "unknown", "remediation": { "func": "Constant\/Issue", - "constantCost": "5min" + "constantCost": "30min" }, "tags": [ "aws", - "cwe" + "cwe", + "former-hotspot" ], "defaultSeverity": "Critical", "ruleSpecification": "RSPEC-6281", @@ -22,7 +24,8 @@ "scope": "Main", "securityStandards": { "CWE": [ - 284 + 284, + 732 ], "PCI DSS 3.2": [ "6.5.8" diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6304.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6304.html index ed6aa3f20..fbae713af 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6304.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6304.html @@ -1,19 +1,20 @@ -

                          A policy that allows identities to access all resources in an AWS account may violate the principle of least privilege. Suppose an identity has permission to access -all resources even though it only requires access to some non-sensitive ones. In this case, unauthorized access and disclosure of sensitive -information will occur.

                          -

                          Ask Yourself Whether

                          -

                          The AWS account has more than one resource with different levels of sensitivity.

                          -

                          A risk exists if you answered yes to this question.

                          -

                          Recommended Secure Coding Practices

                          -

                          It’s recommended to apply the least privilege principle, i.e., by only granting access to necessary resources. A good practice to achieve this is -to organize or tag -resources depending on the sensitivity level of data they store or process. Therefore, managing a secure access control is less prone to errors.

                          -

                          Sensitive Code Example

                          -

                          The wildcard "*" is specified as the resource for this PolicyStatement. This grants the update permission for all -policies of the account:

                          -
                          +

                          IAM policies scope permissions to AWS resources using the Resource element in each policy statement.

                          +

                          Why is this an issue?

                          +

                          When an IAM policy uses "*" in the Resource element, the granted identity can access every resource in the AWS account, +even when only a subset is needed. This violates the principle of least privilege.

                          +

                          What is the potential impact?

                          +

                          Unauthorized access to sensitive resources

                          +

                          An identity with overly broad permissions can read, modify, or delete resources it was never intended to access. If the account contains resources +with different sensitivity levels, a compromised or misused credential exposes all of them.

                          +

                          Data disclosure and privilege escalation

                          +

                          Attackers who obtain credentials with wildcard resource access can exfiltrate sensitive data or escalate privileges by modifying IAM policies, +roles, or other security controls across the account.

                          +

                          How to fix it

                          +

                          Code examples

                          +

                          Update permission is granted for all policies when the wildcard (*) is used in the Resource property instead of +restricting access to a specific subset of resources.

                          +

                          Noncompliant code example

                          +
                           from aws_cdk.aws_iam import Effect, PolicyDocument, PolicyStatement
                           
                           PolicyDocument(
                          @@ -21,14 +22,14 @@ 

                          Sensitive Code Example

                          PolicyStatement( effect=Effect.ALLOW, actions="iam:CreatePolicyVersion", - resources=["*"] # Sensitive + resources=["*"] # Noncompliant ) ] )
                          -

                          Compliant Solution

                          +

                          Compliant solution

                          Restrict the update permission to the appropriate subset of policies:

                          -
                          +
                           from aws_cdk import Aws
                           from aws_cdk.aws_iam import Effect, PolicyDocument, PolicyStatement
                           
                          @@ -42,15 +43,14 @@ 

                          Compliant Solution

                          ] )
                          -

                          Exceptions

                          -
                            -
                          • Should not be raised on key policies (when AWS KMS actions are used.)
                          • -
                          • Should not be raised on policies not using any resources (if and only if all actions in the policy never require resources.)
                          • -
                          -

                          See

                          +

                          Resources

                          +

                          Documentation

                          +

                          Standards

                          + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6304.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6304.json index 98da3bc2e..2bf81c9b7 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6304.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6304.json @@ -1,6 +1,6 @@ { - "title": "Policies granting access to all resources of an account are security-sensitive", - "type": "SECURITY_HOTSPOT", + "title": "IAM policies should not grant access to all account resources", + "type": "VULNERABILITY", "code": { "impacts": { "SECURITY": "BLOCKER" @@ -8,13 +8,15 @@ "attribute": "CONVENTIONAL" }, "status": "ready", + "quickfix": "unknown", "remediation": { "func": "Constant\/Issue", "constantCost": "5min" }, "tags": [ "aws", - "cwe" + "cwe", + "former-hotspot" ], "defaultSeverity": "Blocker", "ruleSpecification": "RSPEC-6304", diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6327.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6327.html index 36c61d00a..a7ac3e19f 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6327.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6327.html @@ -1,42 +1,18 @@ -

                          Amazon Simple Notification Service (SNS) is a managed messaging service for application-to-application (A2A) and application-to-person (A2P) -communication. SNS topics allows publisher systems to fanout messages to a large number of subscriber systems. Amazon SNS allows to encrypt messages -when they are received. In the case that adversaries gain physical access to the storage medium or otherwise leak a message they are not able to -access the data.

                          -

                          Ask Yourself Whether

                          -
                            -
                          • The topic contains sensitive data that could cause harm when leaked.
                          • -
                          • There are compliance requirements for the service to store data encrypted.
                          • -
                          -

                          There is a risk if you answered yes to any of those questions.

                          -

                          Recommended Secure Coding Practices

                          -

                          It is recommended to encrypt SNS topics that contain sensitive information.

                          -

                          To do so, create a master key and assign the SNS topic to it. Note that this system does not encrypt the following:

                          -
                            -
                          • Topic metadata (topic name and attributes)
                          • -
                          • Message metadata (subject, message ID, timestamp, and attributes)
                          • -
                          • Data protection policy
                          • -
                          • Per-topic metrics
                          • -
                          -

                          Then, make sure that any publishers have the kms:GenerateDataKey* and kms:Decrypt permissions for the AWS KMS key.

                          -

                          See AWS SNS Key Management -Documentation for more information.

                          -

                          Sensitive Code Example

                          -

                          For aws_cdk.aws_sns.Topic:

                          -
                          -from aws_cdk import (
                          -    aws_sns as sns
                          -)
                          -
                          -class TopicStack(Stack):
                          -    def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
                          -        super().__init__(scope, construct_id, **kwargs)
                          -        sns.Topic( # Sensitive, unencrypted by default
                          -            self,
                          -            "example"
                          -        )
                          -
                          -

                          For aws_cdk.aws_sns.CfnTopic:

                          -
                          +

                          Amazon Simple Notification Service (SNS) is a managed messaging service that supports server-side encryption (SSE) to protect messages stored at +rest.

                          +

                          Why is this an issue?

                          +

                          Amazon SNS topics do not enable server-side encryption by default. When encryption is not configured, messages stored in SNS topics remain in +plaintext, making them readable to anyone who gains unauthorized access to the underlying storage. This rule raises an issue when an SNS topic is +created without a KMS master key configured.

                          +

                          What is the potential impact?

                          +

                          Sensitive data exposure

                          +

                          If an attacker gains unauthorized access to the underlying storage medium, they can read the contents of SNS messages in plaintext. Depending on +the data carried by the messages, this may expose sensitive information such as user data, financial records, or internal communications.

                          +

                          How to fix it

                          +

                          Code examples

                          +

                          The following code creates an SNS topic without a KMS master key configured, leaving messages stored at rest unencrypted.

                          +

                          Noncompliant code example

                          +
                           from aws_cdk import (
                               aws_sns as sns
                           )
                          @@ -44,14 +20,13 @@ 

                          Sensitive Code Example

                          class TopicStack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) - sns.CfnTopic( # Sensitive, unencrypted by default + sns.Topic( # Noncompliant: unencrypted by default self, "example" )
                          -

                          Compliant Solution

                          -

                          For aws_cdk.aws_sns.Topic:

                          -
                          +

                          Compliant solution

                          +
                           from aws_cdk import (
                               aws_sns as sns
                           )
                          @@ -66,27 +41,20 @@ 

                          Compliant Solution

                          master_key=my_key )
                          -

                          For aws_cdk.aws_sns.CfnTopic:

                          -
                          -from aws_cdk import (
                          -    aws_sns as sns
                          -)
                          -
                          -class TopicStack(Stack):
                          -    def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
                          -        super().__init__(scope, construct_id, **kwargs)
                          -        my_key = kms.Key(self, "key")
                          -        sns.CfnTopic(
                          -            self,
                          -            "example",
                          -            kms_master_key_id=my_key.key_id
                          -        )
                          -
                          -

                          See

                          +

                          The same fix applies to CfnTopic: pass the KMS key via the kms_master_key_id parameter.

                          +

                          Resources

                          +

                          Documentation

                          +

                          Articles & blog posts

                          +
                            +
                          • AWS Blog - Encrypting messages + published to Amazon SNS with AWS KMS
                          • +
                          +

                          Standards

                          +
                          • CWE - CWE-311 - Missing Encryption of Sensitive Data
                          • STIG Viewer - Application Security and Development: V-222588 - The application must implement approved cryptographic mechanisms to prevent unauthorized modification of information at diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6327.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6327.json index 1d54cb39c..298a08d69 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6327.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6327.json @@ -1,22 +1,24 @@ { - "title": "Using unencrypted SNS topics is security-sensitive", - "type": "SECURITY_HOTSPOT", + "title": "Amazon SNS topics should be encrypted at rest", + "type": "VULNERABILITY", "code": { "impacts": { - "SECURITY": "MEDIUM" + "SECURITY": "LOW" }, "attribute": "TRUSTWORTHY" }, "status": "ready", + "quickfix": "unknown", "remediation": { "func": "Constant\/Issue", "constantCost": "45min" }, "tags": [ "aws", - "cwe" + "cwe", + "former-hotspot" ], - "defaultSeverity": "Major", + "defaultSeverity": "Minor", "ruleSpecification": "RSPEC-6327", "sqKey": "S6327", "scope": "All", diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6329.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6329.html index ee79c626c..7619b8591 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6329.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6329.html @@ -1,193 +1,71 @@

                            Enabling public network access to cloud resources can affect an organization’s ability to protect its data or internal operations from data theft or disruption.

                            -

                            Depending on the component, inbound access from the Internet can be enabled via:

                            -
                              -
                            • a boolean value that explicitly allows access to the public network.
                            • -
                            • the assignment of a public IP address.
                            • -
                            • database firewall rules that allow public IP ranges.
                            • -
                            -

                            Deciding to allow public access may happen for various reasons such as for quick maintenance, time saving, or by accident.

                            -

                            This decision increases the likelihood of attacks on the organization, such as:

                            -
                              -
                            • data breaches.
                            • -
                            • intrusions into the infrastructure to permanently steal from it.
                            • -
                            • and various malicious traffic, such as DDoS attacks.
                            • -
                            -

                            Ask Yourself Whether

                            -

                            This cloud resource:

                            -
                              -
                            • should be publicly accessible to any Internet user.
                            • -
                            • requires inbound traffic from the Internet to function properly.
                            • -
                            -

                            There is a risk if you answered no to any of those questions.

                            -

                            Recommended Secure Coding Practices

                            -

                            Avoid publishing cloud services on the Internet unless they are intended to be publicly accessible, such as customer portals or e-commerce -sites.

                            -

                            Use private networks (and associated private IP addresses) and VPC peering or other secure communication tunnels to communicate with other cloud -components.

                            -

                            The goal is to prevent the component from intercepting traffic coming in via the public IP address. If the cloud resource does not support the -absence of a public IP address, assign a public IP address to it, but do not create listeners for the public IP address.

                            -

                            Sensitive Code Example

                            -

                            For aws_cdk.aws_ec2.Instance and similar constructs:

                            -
                            +

                            Why is this an issue?

                            +

                            Cloud resources that are exposed to the public Internet are reachable by any user worldwide. Inbound access from the Internet can be enabled in +several ways: a property that explicitly allows access to the public network, the assignment of a public IP address, or firewall rules that include +public IP ranges.

                            +

                            Choosing to allow public access often happens for quick maintenance, time savings, or by accident. However, doing so significantly increases the +attack surface of the resource and the organization that hosts it.

                            +

                            This rule covers AWS CDK constructs for EC2 instances (aws_ec2.Instance, aws_ec2.CfnInstance), DMS replication instances +(aws_dms.CfnReplicationInstance), and RDS database instances (aws_rds.DatabaseInstance, +aws_rds.CfnDBInstance).

                            +

                            What is the potential impact?

                            +

                            A cloud resource that is publicly reachable is a direct target for attackers anywhere on the Internet. The most likely consequences are data +breaches, intrusions that can be used to permanently compromise the infrastructure, and exposure to various forms of malicious traffic such as DDoS +attacks.

                            +

                            How to fix it

                            +

                            Code examples

                            +

                            The following code configures a cloud resource so that it is reachable from the public Internet, exposing it to unsolicited inbound traffic.

                            +

                            Noncompliant code example

                            +
                             from aws_cdk import aws_ec2 as ec2
                             
                             ec2.Instance(
                                 self,
                            -    "vpc_subnet_public",
                            +    "vpc_subnet_example",
                                 instance_type=nano_t2,
                                 machine_image=ec2.MachineImage.latest_amazon_linux(),
                                 vpc=vpc,
                            -    vpc_subnets=ec2.SubnetSelection(subnet_type=ec2.SubnetType.PUBLIC) # Sensitive
                            -)
                            -
                            -

                            For aws_cdk.aws_ec2.CfnInstance:

                            -
                            -from aws_cdk import aws_ec2 as ec2
                            -
                            -ec2.CfnInstance(
                            -    self,
                            -    "cfn_public_exposed",
                            -    instance_type="t2.micro",
                            -    image_id="ami-0ea0f26a6d50850c5",
                            -    network_interfaces=[
                            -        ec2.CfnInstance.NetworkInterfaceProperty(
                            -            device_index="0",
                            -            associate_public_ip_address=True, # Sensitive
                            -            delete_on_termination=True,
                            -            subnet_id=vpc.select_subnets(subnet_type=ec2.SubnetType.PUBLIC).subnet_ids[0]
                            -        )
                            -    ]
                            -)
                            -
                            -

                            For aws_cdk.aws_dms.CfnReplicationInstance:

                            -
                            -from aws_cdk import aws_dms as dms
                            -
                            -rep_instance = dms.CfnReplicationInstance(
                            -    self,
                            -    "explicit_public",
                            -    replication_instance_class="dms.t2.micro",
                            -    allocated_storage=5,
                            -    publicly_accessible=True, # Sensitive
                            -    replication_subnet_group_identifier=subnet_group.replication_subnet_group_identifier,
                            -    vpc_security_group_ids=[vpc.vpc_default_security_group]
                            -)
                            -
                            -

                            For aws_cdk.aws_rds.CfnDBInstance:

                            -
                            -from aws_cdk import aws_rds as rds
                            -from aws_cdk import aws_ec2 as ec2
                            -
                            -rds_subnet_group_public = rds.CfnDBSubnetGroup(
                            -    self,
                            -    "public_subnet",
                            -    db_subnet_group_description="Subnets",
                            -    subnet_ids=vpc.select_subnets(
                            -        subnet_type=ec2.SubnetType.PUBLIC
                            -    ).subnet_ids
                            -)
                            -
                            -rds.CfnDBInstance(
                            -    self,
                            -    "public-public-subnet",
                            -    engine="postgres",
                            -    master_username="foobar",
                            -    master_user_password="12345678",
                            -    db_instance_class="db.r5.large",
                            -    allocated_storage="200",
                            -    iops=1000,
                            -    db_subnet_group_name=rds_subnet_group_public.ref,
                            -    publicly_accessible=True, # Sensitive
                            -    vpc_security_groups=[sg.security_group_id]
                            +    vpc_subnets=ec2.SubnetSelection(subnet_type=ec2.SubnetType.PUBLIC) # Noncompliant
                             )
                             
                            -

                            Compliant Solution

                            -

                            For aws_cdk.aws_ec2.Instance:

                            -
                            +

                            Compliant solution

                            +
                             from aws_cdk import aws_ec2 as ec2
                             
                             ec2.Instance(
                                 self,
                            -    "vpc_subnet_private",
                            +    "vpc_subnet_example",
                                 instance_type=nano_t2,
                                 machine_image=ec2.MachineImage.latest_amazon_linux(),
                                 vpc=vpc,
                            -    vpc_subnets=ec2.SubnetSelection(subnet_type=ec2.SubnetType.PRIVATE_WITH_NAT)
                            -)
                            -
                            -

                            For aws_cdk.aws_ec2.CfnInstance:

                            -
                            -from aws_cdk import aws_ec2 as ec2
                            -
                            -ec2.CfnInstance(
                            -    self,
                            -    "cfn_private",
                            -    instance_type="t2.micro",
                            -    image_id="ami-0ea0f26a6d50850c5",
                            -    network_interfaces=[
                            -        ec2.CfnInstance.NetworkInterfaceProperty(
                            -            device_index="0",
                            -            associate_public_ip_address=False, # Compliant
                            -            delete_on_termination=True,
                            -            subnet_id=vpc.select_subnets(subnet_type=ec2.SubnetType.PRIVATE_WITH_NAT).subnet_ids[0]
                            -        )
                            -    ]
                            -)
                            -
                            -

                            For aws_cdk.aws_dms.CfnReplicationInstance:

                            -
                            -from aws_cdk import aws_dms as dms
                            -
                            -rep_instance = dms.CfnReplicationInstance(
                            -    self,
                            -    "explicit_private",
                            -    replication_instance_class="dms.t2.micro",
                            -    allocated_storage=5,
                            -    publicly_accessible=False,
                            -    replication_subnet_group_identifier=subnet_group.replication_subnet_group_identifier,
                            -    vpc_security_group_ids=[vpc.vpc_default_security_group]
                            +    vpc_subnets=ec2.SubnetSelection(subnet_type=ec2.SubnetType.PRIVATE_WITH_EGRESS)
                             )
                             
                            -

                            For aws_cdk.aws_rds.CfnDBInstance:

                            -
                            -from aws_cdk import aws_rds as rds
                            -from aws_cdk import aws_ec2 as ec2
                            -
                            -rds_subnet_group_private = rds.CfnDBSubnetGroup(
                            -    self,
                            -    "private_subnet",
                            -    db_subnet_group_description="Subnets",
                            -    subnet_ids=vpc.select_subnets(
                            -        subnet_type=ec2.SubnetType.PRIVATE_WITH_NAT
                            -    ).subnet_ids
                            -)
                            -
                            -rds.CfnDBInstance(
                            -    self,
                            -    "private-private-subnet",
                            -    engine="postgres",
                            -    master_username="foobar",
                            -    master_user_password="12345678",
                            -    db_instance_class="db.r5.large",
                            -    allocated_storage="200",
                            -    iops=1000,
                            -    db_subnet_group_name=rds_subnet_group_private.ref,
                            -    publicly_accessible=False,
                            -    vpc_security_groups=[sg.security_group_id]
                            -)
                            -
                            -

                            See

                            +

                            Resources

                            +

                            Documentation

                            +

                            Standards

                            + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6329.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6329.json index 2b8502617..e84423cab 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6329.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6329.json @@ -1,6 +1,6 @@ { - "title": "Allowing public network access to cloud resources is security-sensitive", - "type": "SECURITY_HOTSPOT", + "title": "Public network access to cloud resources should be disabled", + "type": "VULNERABILITY", "code": { "impacts": { "SECURITY": "BLOCKER" @@ -8,13 +8,15 @@ "attribute": "COMPLETE" }, "status": "ready", + "quickfix": "unknown", "remediation": { "func": "Constant\/Issue", - "constantCost": "5min" + "constantCost": "30min" }, "tags": [ "cwe", - "aws" + "aws", + "former-hotspot" ], "defaultSeverity": "Blocker", "ruleSpecification": "RSPEC-6329", @@ -23,7 +25,9 @@ "securityStandards": { "CWE": [ 284, - 668 + 668, + 732, + 1327 ], "PCI DSS 3.2": [ "6.5.8" diff --git a/python-commons/src/test/java/org/sonar/plugins/python/PythonRuleRepositoryTest.java b/python-commons/src/test/java/org/sonar/plugins/python/PythonRuleRepositoryTest.java index b107a1f2b..e95ec0ee9 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/PythonRuleRepositoryTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/PythonRuleRepositoryTest.java @@ -105,10 +105,10 @@ void ruleTemplates() { } @Test - void hotspotRules() { + void convertedHotspotRules() { RulesDefinition.Repository repository = buildRepository(); RulesDefinition.Rule sqlInjection = repository.rule("S2077"); - assertThat(sqlInjection.type()).isEqualTo(RuleType.SECURITY_HOTSPOT); + assertThat(sqlInjection.type()).isEqualTo(RuleType.VULNERABILITY); } private static RulesDefinition.Repository buildRepository() { From 47d90129f667e538caeed6ed77d2ffce4ab04614 Mon Sep 17 00:00:00 2001 From: Guillaume Dequenne Date: Mon, 22 Jun 2026 17:22:23 +0200 Subject: [PATCH 146/322] CLP-41 Update NOTICE.txt file in sonar-python-enterprise (#1198) GitOrigin-RevId: 5925e25e90c1b1ca1f1976482c99d306d3eae42e --- NOTICE.txt | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/NOTICE.txt b/NOTICE.txt index cb53f0684..271350773 100644 --- a/NOTICE.txt +++ b/NOTICE.txt @@ -1,6 +1,11 @@ -Python -Copyright (C) 2011-2025 SonarSource Sàrl +Copyright (C) SonarSource Sàrl mailto:info AT sonarsource DOT com This product includes software developed at -SonarSource (http://www.sonarsource.com/). +SonarSource (https://sonarsource.com/). + +See LICENSE.txt file for details of the +applicable license. + +For further legal information, see +https://sonarsource.com/legal/ From 2fda6555207fb181c56eca11b404217bbfa0fd94 Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Tue, 23 Jun 2026 15:32:27 +0200 Subject: [PATCH 147/322] SONARPY-4299 Create rule S8903: HTML elements should be created with "new_tag()" instead of inserting raw HTML strings (#1200) GitOrigin-RevId: ecad64137c9d5f9054b01ceb2f0c23f375ba5ef5 --- .../BeautifulSoupRawHtmlInsertionCheck.java | 75 +++++++++++++++++++ .../python/checks/OpenSourceCheckList.java | 1 + .../org/sonar/l10n/py/rules/python/S8903.html | 58 ++++++++++++++ .../org/sonar/l10n/py/rules/python/S8903.json | 26 +++++++ .../py/rules/python/Sonar_way_profile.json | 3 +- ...eautifulSoupRawHtmlInsertionCheckTest.java | 29 +++++++ .../checks/beautifulSoupRawHtmlInsertion.py | 41 ++++++++++ 7 files changed, 232 insertions(+), 1 deletion(-) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/BeautifulSoupRawHtmlInsertionCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8903.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8903.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/BeautifulSoupRawHtmlInsertionCheckTest.java create mode 100644 python-checks/src/test/resources/checks/beautifulSoupRawHtmlInsertion.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/BeautifulSoupRawHtmlInsertionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/BeautifulSoupRawHtmlInsertionCheck.java new file mode 100644 index 000000000..7166b0d56 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/BeautifulSoupRawHtmlInsertionCheck.java @@ -0,0 +1,75 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import java.util.Map; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.QualifiedExpression; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.StringLiteral; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.checks.utils.Expressions; +import org.sonar.python.tree.TreeUtils; + +@Rule(key = "S8903") +public class BeautifulSoupRawHtmlInsertionCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Use \"new_tag()\" instead of inserting raw HTML strings."; + + private record MethodSpec(int argIndex, String keyword) {} + + private static final Map INSERTION_METHODS = Map.of( + TypeMatchers.isType("bs4.element.PageElement.insert"), new MethodSpec(1, "new_child"), + TypeMatchers.isType("bs4.element.PageElement.append"), new MethodSpec(0, "tag"), + TypeMatchers.isType("bs4.element.PageElement.extend"), new MethodSpec(0, "tags") + ); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, BeautifulSoupRawHtmlInsertionCheck::checkCallExpression); + } + + private static boolean looksLikeHtmlMarkup(Expression expr) { + StringLiteral literal = Expressions.extractStringLiteral(expr); + return literal != null && + literal.trimmedQuotesValue().startsWith("<") && + literal.trimmedQuotesValue().endsWith(">"); + } + + private static void checkCallExpression(SubscriptionContext ctx) { + CallExpression callExpr = (CallExpression) ctx.syntaxNode(); + + if (!(callExpr.callee() instanceof QualifiedExpression qualifiedExpr)) { + return; + } + + INSERTION_METHODS.entrySet().stream() + .filter(e -> e.getKey().isTrueFor(qualifiedExpr, ctx)) + .map(Map.Entry::getValue) + .findFirst() + .flatMap(spec -> TreeUtils.nthArgumentOrKeywordOptional(spec.argIndex(), spec.keyword(), callExpr.arguments())) + .map(RegularArgument::expression) + .filter(BeautifulSoupRawHtmlInsertionCheck::looksLikeHtmlMarkup) + .ifPresent(contentExpr -> ctx.addIssue(qualifiedExpr.name(), MESSAGE)); + } +} diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 91d54e0b1..175c0b86d 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -137,6 +137,7 @@ public Stream> getChecks() { BackslashInStringCheck.class, BackticksUsageCheck.class, BareRaiseInFinallyCheck.class, + BeautifulSoupRawHtmlInsertionCheck.class, BindToAllNetworkInterfacesCheck.class, BooleanExpressionInExceptCheck.class, BooleanCheckNotInvertedCheck.class, diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8903.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8903.html new file mode 100644 index 000000000..2eaae5137 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8903.html @@ -0,0 +1,58 @@ +

                            When inserting HTML elements into an in-memory document structure using methods that add content nodes with raw HTML strings.

                            +

                            In Python, this specifically refers to BeautifulSoup operations like insert(), append(), and similar methods that add +HTML content to the document tree.

                            +

                            Why is this an issue?

                            +

                            Document parsing and manipulation libraries provide APIs for building and modifying HTML and XML document trees. When working with these libraries, +you need to add new elements to the document structure programmatically.

                            +

                            A common mistake is to insert raw markup strings directly into the document tree. When you do this, the library treats the string as text content +rather than markup. This means all markup special characters get escaped:

                            +
                              +
                            • < becomes <
                            • +
                            • > becomes >
                            • +
                            • " becomes "
                            • +
                            +

                            As a result, instead of creating actual elements in the document tree, you end up with visible text that looks like markup code on the rendered +page. The document structure becomes invalid, and the intended functionality is lost.

                            +

                            Factory methods provided by the library are the correct API for creating new elements programmatically. These methods create proper element objects +that integrate seamlessly into the document tree. You specify the element name as the first argument and can pass attributes as additional +parameters.

                            +

                            Using factory methods ensures:

                            +
                              +
                            • Elements are created as actual element objects, not text
                            • +
                            • Attributes are properly set without manual string formatting
                            • +
                            • The document structure remains valid
                            • +
                            • The code is more readable and maintainable
                            • +
                            +

                            In Python’s BeautifulSoup library specifically, this factory method is called new_tag().

                            +

                            What is the potential impact?

                            +

                            The incorrect HTML structure will cause the web page to display escaped HTML text instead of rendering the intended elements. This breaks the +application’s functionality and user interface. Users will see literal HTML code like angle brackets and tag names displayed as text instead of the +intended page structure.

                            +

                            How to fix it

                            +

                            Replace raw HTML string insertion with the new_tag() factory method. Create the tag object first by calling +soup.new_tag() with the tag name and attributes, then insert it into the document tree.

                            +

                            Code examples

                            +

                            Noncompliant code example

                            +
                            +from bs4 import BeautifulSoup
                            +
                            +soup = BeautifulSoup('<html><body></body></html>', 'html.parser')
                            +soup.body.insert(0, '<div id="file_history"></div>')  # Noncompliant
                            +
                            +

                            Compliant solution

                            +
                            +from bs4 import BeautifulSoup
                            +
                            +soup = BeautifulSoup('<html><body></body></html>', 'html.parser')
                            +new_tag = soup.new_tag('div', id='file_history')
                            +soup.body.insert(0, new_tag)
                            +
                            +

                            Resources

                            +

                            Documentation

                            + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8903.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8903.json new file mode 100644 index 000000000..5351c4309 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8903.json @@ -0,0 +1,26 @@ +{ + "title": "HTML elements should be created with \"new_tag()\" instead of inserting raw HTML strings", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5 min" + }, + "tags": [ + "html", + "api", + "pitfall" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-8903", + "sqKey": "S8903", + "scope": "All", + "quickfix": "unknown", + "code": { + "impacts": { + "RELIABILITY": "MEDIUM", + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "CONVENTIONAL" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 45ffd00ad..363b7a03a 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -353,6 +353,7 @@ "S8521", "S8572", "S8685", - "S8786" + "S8786", + "S8903" ] } diff --git a/python-checks/src/test/java/org/sonar/python/checks/BeautifulSoupRawHtmlInsertionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/BeautifulSoupRawHtmlInsertionCheckTest.java new file mode 100644 index 000000000..2d21ac4a3 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/BeautifulSoupRawHtmlInsertionCheckTest.java @@ -0,0 +1,29 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.junit.jupiter.api.Test; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class BeautifulSoupRawHtmlInsertionCheckTest { + @Test + void test() { + PythonCheckVerifier.verify( + "src/test/resources/checks/beautifulSoupRawHtmlInsertion.py", + new BeautifulSoupRawHtmlInsertionCheck()); + } +} diff --git a/python-checks/src/test/resources/checks/beautifulSoupRawHtmlInsertion.py b/python-checks/src/test/resources/checks/beautifulSoupRawHtmlInsertion.py new file mode 100644 index 000000000..75a8f14c1 --- /dev/null +++ b/python-checks/src/test/resources/checks/beautifulSoupRawHtmlInsertion.py @@ -0,0 +1,41 @@ +from bs4 import BeautifulSoup +from bs4.element import Tag + +soup = BeautifulSoup('', 'html.parser') + +soup.insert(0, '
                            ') # Noncompliant {{Use "new_tag()" instead of inserting raw HTML strings.}} +# ^^^^^^ +soup.append('

                            some text

                            ') # Noncompliant {{Use "new_tag()" instead of inserting raw HTML strings.}} +tag = soup.new_tag('section') +tag.insert(0, '') # Noncompliant {{Use "new_tag()" instead of inserting raw HTML strings.}} +tag.append('bold') # Noncompliant {{Use "new_tag()" instead of inserting raw HTML strings.}} +tag.extend('
                          • item
                          • ') # Noncompliant {{Use "new_tag()" instead of inserting raw HTML strings.}} +soup.extend(tags='
                          • item
                          • ') # Noncompliant +# Compliant: plain text strings — idiomatic NavigableString insertion +soup.append("Hello world") # Compliant - no markup +tag.insert(0, "some text") # Compliant - no markup + +# Variable holding an HTML string literal — value is traced back to the literal +html_fragment = '
                            ' +tag.insert(0, html_fragment) # Noncompliant {{Use "new_tag()" instead of inserting raw HTML strings.}} +tag.append(html_fragment) # Noncompliant {{Use "new_tag()" instead of inserting raw HTML strings.}} + +# Compliant: using new_tag() to create proper element objects +new_tag = soup.new_tag('div', id='file_history') +soup.insert(0, new_tag) # Compliant +soup.append(new_tag) # Compliant + +# Compliant: not a string +soup.insert(0, 42) # Compliant +soup.append(None) # Compliant + +# Compliant: extend with a list +soup.extend([new_tag]) # Compliant +soup.extend(tags=['
                          • item
                          • ']) + +soup.append("<= 3") # Compliant not the shape of a tag + +# Compliant: called on a non-Tag type +my_list = [1, 2, 3] +my_list.insert(0, '
                            ') # Compliant - not a Tag +my_list.append('

                            ') # Compliant - not a Tag From 0d2338ae59c2d8a3ed01bb539073106e4087d066 Mon Sep 17 00:00:00 2001 From: Guillaume Dequenne Date: Tue, 23 Jun 2026 16:38:33 +0200 Subject: [PATCH 148/322] SONARPY-4307 Fix quality issues (#1210) GitOrigin-RevId: be395ce6d4e33334b9b0a4d86ecc429a379ff75f --- .../checks/utils/PythonCheckVerifierTest.java | 16 ++----- .../indexer/SonarLintPythonIndexerTest.java | 9 +--- .../PythonTreeMakerMatchStatementTest.java | 10 ++--- .../python/tree/PythonTreeMakerTest.java | 45 ++++++------------- 4 files changed, 22 insertions(+), 58 deletions(-) diff --git a/python-checks-testkit/src/test/java/org/sonar/python/checks/utils/PythonCheckVerifierTest.java b/python-checks-testkit/src/test/java/org/sonar/python/checks/utils/PythonCheckVerifierTest.java index d57b1a930..2694bb850 100644 --- a/python-checks-testkit/src/test/java/org/sonar/python/checks/utils/PythonCheckVerifierTest.java +++ b/python-checks-testkit/src/test/java/org/sonar/python/checks/utils/PythonCheckVerifierTest.java @@ -28,7 +28,8 @@ import org.sonar.plugins.python.api.tree.FunctionDef; import org.sonar.plugins.python.api.tree.Tree; -import static org.assertj.core.api.Assertions.fail; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.fail; class PythonCheckVerifierTest { @@ -90,17 +91,8 @@ void subscription_test(String file, boolean expectSuccess) { } private void assertNoFailureOfVerifier(String filePath, PythonCheck check) { - try { - PythonCheckVerifier.verify(filePath, check); - } catch (AssertionError e) { - fail("should not fail", e); - } - - try { - PythonCheckVerifier.verify(Collections.singletonList(filePath), check); - } catch (AssertionError e) { - fail("should not fail", e); - } + assertDoesNotThrow(() -> PythonCheckVerifier.verify(filePath, check), "should not fail"); + assertDoesNotThrow(() -> PythonCheckVerifier.verify(Collections.singletonList(filePath), check), "should not fail"); } private static void assertFailOfVerifier(String filepath, PythonCheck check) { diff --git a/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarLintPythonIndexerTest.java b/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarLintPythonIndexerTest.java index d8ea2519a..955efb9a6 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarLintPythonIndexerTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarLintPythonIndexerTest.java @@ -16,7 +16,6 @@ */ package org.sonar.plugins.python.indexer; -import com.sonar.sslr.api.RecognitionException; import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; @@ -53,7 +52,7 @@ import org.sonarsource.sonarlint.plugin.api.module.file.ModuleFileEvent; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.fail; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -279,11 +278,7 @@ private void testNonPythonFile(@Nullable String language) { ModuleFileEvent moduleFileEvent = mock(ModuleFileEvent.class); PythonInputFile txtFile = createInputFile("non_python.txt", language); when(moduleFileEvent.getTarget()).thenReturn(txtFile.wrappedFile()); - try { - pythonIndexer.process(moduleFileEvent); - } catch (RecognitionException exception) { - fail("Non Python files should not be parsed."); - } + assertDoesNotThrow(() -> pythonIndexer.process(moduleFileEvent), "Non Python files should not be parsed."); assertThat(logTester.logs(Level.DEBUG)).contains("Module file event for non_python.txt has been ignored because it's not a Python file."); assertThat(projectLevelSymbolTable.getSymbolsFromModule("non_python")).isNull(); } diff --git a/python-frontend/src/test/java/org/sonar/python/tree/PythonTreeMakerMatchStatementTest.java b/python-frontend/src/test/java/org/sonar/python/tree/PythonTreeMakerMatchStatementTest.java index 31ff5e7b4..82f1d1c90 100644 --- a/python-frontend/src/test/java/org/sonar/python/tree/PythonTreeMakerMatchStatementTest.java +++ b/python-frontend/src/test/java/org/sonar/python/tree/PythonTreeMakerMatchStatementTest.java @@ -49,7 +49,7 @@ import org.sonar.python.parser.RuleTest; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.fail; +import static org.junit.jupiter.api.Assertions.assertThrows; class PythonTreeMakerMatchStatementTest extends RuleTest { @@ -331,12 +331,8 @@ void class_pattern() { @Test void class_pattern_positional_after_keyword() { - try { - pattern("case A(foo=42, x, y): ..."); - fail("Position patterns cannot follow keyword patterns"); - } catch (RecognitionException exception) { - assertThat(exception.getMessage()).isEqualTo("Parse error at line 1: Positional patterns follow keyword patterns."); - } + RecognitionException exception = assertThrows(RecognitionException.class, () -> pattern("case A(foo=42, x, y): ...")); + assertThat(exception.getMessage()).isEqualTo("Parse error at line 1: Positional patterns follow keyword patterns."); } private void assertSequenceElements(SequencePattern sequencePattern, String... elements) { diff --git a/python-frontend/src/test/java/org/sonar/python/tree/PythonTreeMakerTest.java b/python-frontend/src/test/java/org/sonar/python/tree/PythonTreeMakerTest.java index 8a965828f..bfc67d9b6 100644 --- a/python-frontend/src/test/java/org/sonar/python/tree/PythonTreeMakerTest.java +++ b/python-frontend/src/test/java/org/sonar/python/tree/PythonTreeMakerTest.java @@ -119,7 +119,6 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.assertj.core.api.Assertions.fail; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertThrowsExactly; @@ -164,12 +163,8 @@ void variadic_is_kind() { @Test void unexpected_expression_should_throw_an_exception() { - try { - parse("", treeMaker::expression); - fail("unexpected ASTNode type for expression should not succeed to be translated to Strongly typed AST"); - } catch (IllegalStateException iae) { - assertThat(iae).hasMessage("Expression FILE_INPUT not correctly translated to strongly typed AST"); - } + IllegalStateException iae = assertThrows(IllegalStateException.class, () -> parse("", treeMaker::expression)); + assertThat(iae).hasMessage("Expression FILE_INPUT not correctly translated to strongly typed AST"); } @Test @@ -1391,13 +1386,9 @@ void assignement_expression() { setRootRule(PythonGrammar.NAMED_EXPR_TEST); - try { - astNode = p.parse("a.b := 12"); - treeMaker.expression(astNode); - fail("Expected RecognitionException"); - } catch (RecognitionException e) { - assertThat(e.getLine()).isOne(); - } + AstNode invalidWalrusNode = p.parse("a.b := 12"); + RecognitionException walrusException = assertThrows(RecognitionException.class, () -> treeMaker.expression(invalidWalrusNode)); + assertThat(walrusException.getLine()).isOne(); } @Test @@ -2483,12 +2474,8 @@ void generator_expression() { firstArg = ((RegularArgument) call.arguments().get(0)).expression(); assertThat(firstArg.getKind()).isEqualTo(Tree.Kind.GENERATOR_EXPR); - try { - parse("foo(1, x*x for x in range(10))", treeMaker::expression); - fail("generator expression must be parenthesized unless it's the unique argument in arglist"); - } catch (RecognitionException re) { - assertThat(re).hasMessage("Parse error at line 1: Generator expression must be parenthesized if not sole argument."); - } + RecognitionException re = assertThrows(RecognitionException.class, () -> parse("foo(1, x*x for x in range(10))", treeMaker::expression)); + assertThat(re).hasMessage("Parse error at line 1: Generator expression must be parenthesized if not sole argument."); } @Test @@ -2706,18 +2693,12 @@ void repr_expression() { @Test @Timeout(2) public void should_not_require_exponential_time() { - try { - p.parse("(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((("); - fail("Expected RecognitionException"); - } catch (RecognitionException e) { - assertThat(e.getLine()).isOne(); - } - try { - p.parse("````````````````````````````````````````````````````````````````````````````````"); - fail("Expected RecognitionException"); - } catch (RecognitionException e) { - assertThat(e.getLine()).isOne(); - } + RecognitionException openParensException = assertThrows(RecognitionException.class, + () -> p.parse("((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((")); + assertThat(openParensException.getLine()).isOne(); + RecognitionException backticksException = assertThrows(RecognitionException.class, + () -> p.parse("````````````````````````````````````````````````````````````````````````````````")); + assertThat(backticksException.getLine()).isOne(); } @Test From 15d4b5b242f9ea03ac50a8fcba0514d4bf07e078 Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Wed, 24 Jun 2026 17:04:29 +0200 Subject: [PATCH 149/322] SONARPY-4305 : Port S5778 to python: Only one method invocation is expected when testing runtime exceptions (#1209) GitOrigin-RevId: 8bbf706d4d734c8a4310aa8438e7664b5db2d4d2 --- .../python/checks/OpenSourceCheckList.java | 2 + ...SingleInvocationRuntimeExceptionCheck.java | 182 +++++++++++++++++ .../org/sonar/l10n/py/rules/python/S5778.html | 74 +++++++ .../org/sonar/l10n/py/rules/python/S5778.json | 25 +++ .../py/rules/python/Sonar_way_profile.json | 1 + ...leInvocationRuntimeExceptionCheckTest.java | 28 +++ .../tests/singleInvocationRuntimeException.py | 190 ++++++++++++++++++ 7 files changed, 502 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5778.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5778.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheckTest.java create mode 100644 python-checks/src/test/resources/checks/tests/singleInvocationRuntimeException.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 175c0b86d..a55751890 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -97,6 +97,7 @@ import org.sonar.python.checks.tests.DedicatedAssertionCheck; import org.sonar.python.checks.tests.ImplicitlySkippedTestCheck; import org.sonar.python.checks.tests.NotDiscoverableTestMethodCheck; +import org.sonar.python.checks.tests.SingleInvocationRuntimeExceptionCheck; import org.sonar.python.checks.tests.SkippedTestNoReasonCheck; import org.sonar.python.checks.tests.UnconditionalAssertionCheck; @@ -403,6 +404,7 @@ public Stream> getChecks() { SingleCharacterAlternationCheck.class, SingleCharCharacterClassCheck.class, SingleDispatchMixupCheck.class, + SingleInvocationRuntimeExceptionCheck.class, SkippedTestNoReasonCheck.class, SkLearnEstimatorDontInitializeEstimatedValuesCheck.class, SleepZeroInAsyncCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheck.java new file mode 100644 index 000000000..3242d5b0b --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheck.java @@ -0,0 +1,182 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.IssueLocation; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.symbols.Symbol; +import org.sonar.plugins.python.api.tree.Argument; +import org.sonar.plugins.python.api.tree.BaseTreeVisitor; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.FunctionDef; +import org.sonar.plugins.python.api.tree.LambdaExpression; +import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.QualifiedExpression; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.tree.WithItem; +import org.sonar.plugins.python.api.tree.WithStatement; +import org.sonar.python.tests.UnittestUtils; + +@Rule(key = "S5778") +public class SingleInvocationRuntimeExceptionCheck extends PythonSubscriptionCheck { + private static final String MESSAGE = "Refactor this exception test to have only one invocation possibly throwing an exception."; + private static final String SECONDARY_MESSAGE = "Invocation possibly throwing an exception."; + private static final String PYTEST_RAISES = "pytest.raises"; + private static final List SAFE_BUILTINS = List.of( + "list", + "set", + "dict", + "tuple", + "frozenset", + "str", + "bytes", + "bytearray", + "object"); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.WITH_STMT, ctx -> checkWithStatement(ctx, (WithStatement) ctx.syntaxNode())); + context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, ctx -> checkDirectRaiseCall(ctx, (CallExpression) ctx.syntaxNode())); + } + + private static void checkWithStatement(SubscriptionContext ctx, WithStatement withStatement) { + boolean isRaiseAssertion = withStatement.withItems().stream() + .map(WithItem::test) + .filter(CallExpression.class::isInstance) + .map(CallExpression.class::cast) + .anyMatch(callExpression -> isPytestRaise(callExpression) || isUnittestRaise(callExpression)); + + if (!isRaiseAssertion) { + return; + } + + reportIfMultipleInvocations(ctx, unsafeInvocations(withStatement.statements())); + } + + private static void checkDirectRaiseCall(SubscriptionContext ctx, CallExpression callExpression) { + if (!isPytestRaise(callExpression) && !isUnittestRaise(callExpression)) { + return; + } + + findLambdaArgument(callExpression.arguments()) + .map(lambdaExpression -> unsafeInvocations(lambdaExpression.expression())) + .ifPresent(invocations -> reportIfMultipleInvocations(ctx, invocations)); + } + + private static boolean isPytestRaise(CallExpression callExpression) { + return Optional.ofNullable(callExpression.calleeSymbol()) + .map(Symbol::fullyQualifiedName) + .filter(Objects::nonNull) + .map(fqn -> fqn.contains(PYTEST_RAISES)) + .orElse(false); + } + + private static boolean isUnittestRaise(CallExpression callExpression) { + if (!(callExpression.callee() instanceof QualifiedExpression qualifiedExpression)) { + return false; + } + if (!(qualifiedExpression.qualifier() instanceof Name qualifier) || !"self".equals(qualifier.name())) { + return false; + } + return UnittestUtils.isWithinUnittestTestCase(callExpression) + && UnittestUtils.RAISE_METHODS.contains(qualifiedExpression.name().name()); + } + + private static Optional findLambdaArgument(List arguments) { + return arguments.stream() + .filter(RegularArgument.class::isInstance) + .map(RegularArgument.class::cast) + .map(RegularArgument::expression) + .filter(LambdaExpression.class::isInstance) + .map(LambdaExpression.class::cast) + .findFirst(); + } + + private static void reportIfMultipleInvocations(SubscriptionContext ctx, List invocations) { + if (invocations.size() <= 1) { + return; + } + + var issue = ctx.addIssue(invocations.get(0), MESSAGE); + invocations.stream().skip(1).forEach(invocation -> issue.secondary(invocationLocation(invocation, SECONDARY_MESSAGE))); + } + + private static IssueLocation invocationLocation(CallExpression invocation, String message) { + if (invocation.callee() instanceof QualifiedExpression qualifiedExpression) { + return IssueLocation.preciseLocation(qualifiedExpression.name().firstToken(), invocation.rightPar(), message); + } + if (invocation.callee() instanceof Name calleeName) { + return IssueLocation.preciseLocation(calleeName.firstToken(), invocation.rightPar(), message); + } + return IssueLocation.preciseLocation(invocation, message); + } + + private static List unsafeInvocations(Tree tree) { + var visitor = new InvocationCollector(); + tree.accept(visitor); + return visitor.invocations.stream() + .sorted(Comparator + .comparingInt((CallExpression invocation) -> invocation.firstToken().line()) + .thenComparingInt(invocation -> invocation.firstToken().column()) + .thenComparingInt(invocation -> invocation.lastToken().line()) + .thenComparingInt(invocation -> invocation.lastToken().column())) + .toList(); + } + + private static class InvocationCollector extends BaseTreeVisitor { + private final List invocations = new ArrayList<>(); + + @Override + public void visitCallExpression(CallExpression callExpression) { + if (!isSafeBuiltin(callExpression)) { + invocations.add(callExpression); + } + super.visitCallExpression(callExpression); + } + + @Override + public void visitLambda(LambdaExpression lambdaExpression) { + // Nested lambdas define deferred execution and should not contribute calls here. + } + + @Override + public void visitFunctionDef(FunctionDef functionDef) { + // Nested function bodies are not executed when merely defined. + } + + private static boolean isSafeBuiltin(CallExpression callExpression) { + if (!(callExpression.callee() instanceof Name calleeName)) { + return false; + } + + String callee = calleeName.name(); + if (!SAFE_BUILTINS.contains(callee)) { + return false; + } + + return callExpression.arguments().isEmpty(); + } + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5778.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5778.html new file mode 100644 index 000000000..35406602e --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5778.html @@ -0,0 +1,74 @@ +

                            When testing code that should raise an exception, having multiple method calls in the tested code makes it unclear which call is expected to raise +the exception.

                            +

                            Why is this an issue?

                            +

                            When writing tests for exception handling, clarity is essential. If you chain multiple method calls within the code being tested for an exception, +it becomes ambiguous which specific call is expected to raise that exception.

                            +

                            For example, consider this code:

                            +
                            +pytest.raises(IndexError, lambda: get_item().process())
                            +
                            +

                            Here, both get_item() and process() could potentially raise an IndexError. If the test passes, you cannot be +certain which method actually raised the exception. This ambiguity reduces test reliability.

                            +

                            By isolating the method call you want to test, you make your test explicit and unambiguous. This improves test reliability and makes your test +suite a better specification of expected behavior.

                            +

                            What is the potential impact?

                            +

                            Writing tests with multiple method calls when testing for exceptions reduces test quality:

                            +
                              +
                            • Incorrect test coverage: You may think you’re testing one method’s exception behavior when you’re actually testing + another’s.
                            • +
                            • Maintenance burden: Other developers (or future you) will struggle to understand what the test is verifying.
                            • +
                            • Reduced confidence: Passing tests don’t guarantee that the specific behavior you intended to test is working correctly.
                            • +
                            +

                            How to fix it in pytest

                            +

                            When using pytest’s pytest.raises() context manager, extract intermediate method calls into separate variables before the assertion. +This ensures only the final method call that you want to test is inside the exception-testing block.

                            +

                            Code examples

                            +

                            Noncompliant code example

                            +
                            +import pytest
                            +
                            +def test_process():
                            +    # Which method raises the exception: get_item() or process()?
                            +    with pytest.raises(IndexError):  # Noncompliant
                            +        get_item().process()
                            +
                            +

                            Compliant solution

                            +
                            +import pytest
                            +
                            +def test_process():
                            +    item = get_item()
                            +    with pytest.raises(IndexError):
                            +        item.process()
                            +
                            +

                            How to fix it in unittest

                            +

                            When using unittest’s assertRaises() method, extract intermediate method calls before the assertion. This makes it clear which +specific method is being tested for the exception.

                            +

                            Code examples

                            +

                            Noncompliant code example

                            +
                            +import unittest
                            +
                            +class TestMyCode(unittest.TestCase):
                            +    def test_process(self):
                            +        # Which method raises the exception: get_item() or process()?
                            +        self.assertRaises(IndexError, lambda: get_item().process())  # Noncompliant
                            +
                            +

                            Compliant solution

                            +
                            +import unittest
                            +
                            +class TestMyCode(unittest.TestCase):
                            +    def test_process(self):
                            +        item = get_item()
                            +        self.assertRaises(IndexError, item.process)
                            +
                            +

                            Resources

                            +

                            Documentation

                            + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5778.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5778.json new file mode 100644 index 000000000..b88c4c6bd --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5778.json @@ -0,0 +1,25 @@ +{ + "title": "Only one method invocation is expected when testing runtime exceptions", + "type": "CODE_SMELL", + "code": { + "impacts": { + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "CLEAR" + }, + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "pytest", + "unittest", + "tests" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-5778", + "sqKey": "S5778", + "scope": "Tests", + "quickfix": "unknown" +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 363b7a03a..c66da40ab 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -132,6 +132,7 @@ "S5747", "S5754", "S5756", + "S5778", "S5780", "S5781", "S5795", diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheckTest.java new file mode 100644 index 000000000..667dbe55b --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheckTest.java @@ -0,0 +1,28 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import org.junit.jupiter.api.Test; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class SingleInvocationRuntimeExceptionCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/singleInvocationRuntimeException.py", new SingleInvocationRuntimeExceptionCheck()); + } +} diff --git a/python-checks/src/test/resources/checks/tests/singleInvocationRuntimeException.py b/python-checks/src/test/resources/checks/tests/singleInvocationRuntimeException.py new file mode 100644 index 000000000..9c599c2fa --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/singleInvocationRuntimeException.py @@ -0,0 +1,190 @@ +import unittest + +import pytest + + +def get_item(): + return Item() + + +def do_work(value=None): + raise ValueError(value) + + +class Item: + def process(self): + raise ValueError() + + +class DummyContextManager: + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + return False + + +def test_pytest_with_call_chain(): + with pytest.raises(ValueError): + get_item().process() # Noncompliant {{Refactor this exception test to have only one invocation possibly throwing an exception.}} +# ^^^^^^^^^^ +# ^^^^^^^^^@-1< {{Invocation possibly throwing an exception.}} + + +def test_pytest_with_nested_calls(): + with pytest.raises(ValueError): + do_work(get_item()) # Noncompliant +# ^^^^^^^^^^^^^^^^^^^ +# ^^^^^^^^^^@-1< {{Invocation possibly throwing an exception.}} + + +def test_pytest_with_single_invocation(): + item = get_item() + with pytest.raises(ValueError): + item.process() + + +def test_pytest_with_safe_builtins(): + with pytest.raises(ValueError): + do_work(str()) + + +def test_pytest_with_safe_list(): + with pytest.raises(ValueError): + do_work(list()) + + +def test_pytest_with_safe_set(): + with pytest.raises(ValueError): + do_work(set()) + + +def test_pytest_with_safe_dict(): + with pytest.raises(ValueError): + do_work(dict()) + + +def test_pytest_with_safe_tuple(): + with pytest.raises(ValueError): + do_work(tuple()) + + +def test_pytest_with_safe_frozenset(): + with pytest.raises(ValueError): + do_work(frozenset()) + + +def test_pytest_with_safe_bytes(): + with pytest.raises(ValueError): + do_work(bytes()) + + +def test_pytest_with_safe_bytearray(): + with pytest.raises(ValueError): + do_work(bytearray()) + + +def test_pytest_with_safe_object(): + with pytest.raises(ValueError): + do_work(object()) + + +def test_pytest_with_unsafe_builtin_arguments(): + with pytest.raises(ValueError): + do_work(object(1)) # Noncompliant {{Refactor this exception test to have only one invocation possibly throwing an exception.}} +# ^^^^^^^^^^^^^^^^^^ +# ^^^^^^^^^@-1< {{Invocation possibly throwing an exception.}} + + +def test_pytest_with_unsafe_collection_arguments(): + with pytest.raises(ValueError): + do_work(set(5)) # Noncompliant +# ^^^^^^^^^^^^^^^ +# ^^^^^^@-1< {{Invocation possibly throwing an exception.}} + + +def test_pytest_direct_lambda(): + pytest.raises(ValueError, lambda: get_item().process()) # Noncompliant {{Refactor this exception test to have only one invocation possibly throwing an exception.}} +# ^^^^^^^^^^ +# ^^^^^^^^^@-1< {{Invocation possibly throwing an exception.}} + + +def test_pytest_direct_callable(): + item = get_item() + pytest.raises(ValueError, item.process) + + +def test_pytest_direct_lambda_with_safe_builtin(): + pytest.raises(ValueError, lambda: do_work(str())) + + +def test_pytest_direct_lambda_single_invocation(): + pytest.raises(ValueError, lambda: do_work()) + + +def test_pytest_direct_lambda_with_unsafe_builtin_argument(): + pytest.raises(ValueError, lambda: do_work(dict(5))) # Noncompliant {{Refactor this exception test to have only one invocation possibly throwing an exception.}} +# ^^^^^^^^^^^^^^^^ +# ^^^^^^^@-1< {{Invocation possibly throwing an exception.}} + + +def test_non_raise_with_statement(): + with DummyContextManager(): + get_item().process() + + +def test_pytest_with_nested_lambda_definition(): + with pytest.raises(ValueError): + do_work(lambda value: get_item().process()) + + +def test_pytest_with_nested_helper_definition(): + with pytest.raises(ValueError): + def helper(): + return get_item().process() + do_work() + + +class TestCase(unittest.TestCase): + def test_unittest_with_statement(self): + with self.assertRaises(ValueError): + get_item().process() # Noncompliant {{Refactor this exception test to have only one invocation possibly throwing an exception.}} +# ^^^^^^^^^^ +# ^^^^^^^^^@-1< {{Invocation possibly throwing an exception.}} + + def test_unittest_with_safe_builtin(self): + with self.assertRaises(ValueError): + do_work(dict()) + + def test_unittest_lambda(self): + self.assertRaises(ValueError, lambda: get_item().process()) # Noncompliant {{Refactor this exception test to have only one invocation possibly throwing an exception.}} +# ^^^^^^^^^^ +# ^^^^^^^^^@-1< {{Invocation possibly throwing an exception.}} + + def test_unittest_lambda_nested_calls(self): + self.assertRaises(ValueError, lambda: do_work(get_item())) # Noncompliant +# ^^^^^^^^^^^^^^^^^^^ +# ^^^^^^^^^^@-1< {{Invocation possibly throwing an exception.}} + + def test_unittest_lambda_with_safe_builtin(self): + self.assertRaises(ValueError, lambda: do_work(bytearray())) + + def test_unittest_bound_method(self): + item = get_item() + self.assertRaises(ValueError, item.process) + + def test_unittest_lambda_single_invocation(self): + self.assertRaises(ValueError, lambda: do_work()) + + def test_unittest_lambda_with_unsafe_builtin_argument(self): + self.assertRaises(ValueError, lambda: do_work(frozenset(5))) # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^^ +# ^^^^^^^^^^^^@-1< {{Invocation possibly throwing an exception.}} + + def test_unittest_invalid_raise_method(self): + self.assertRaisesRandom(ValueError, lambda: do_work(get_item())) + + +class Helper: + def test_not_a_unittest_test_case(self): + self.assertRaises(ValueError, lambda: do_work(get_item())) From b517143158e1cc0dea2ec6e117db8fccda9ff8d9 Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Thu, 25 Jun 2026 09:22:03 +0200 Subject: [PATCH 150/322] SONARPY-4305 : S5778 - fix issue location, primary location on with, secondaries on calls (#1213) GitOrigin-RevId: 0547771257f98af79bf9418f7afe53a4f5a287e4 --- ...SingleInvocationRuntimeExceptionCheck.java | 18 +++--- .../tests/singleInvocationRuntimeException.py | 60 +++++++++++-------- 2 files changed, 44 insertions(+), 34 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheck.java index 3242d5b0b..d99839c52 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheck.java @@ -23,6 +23,7 @@ import java.util.Optional; import org.sonar.check.Rule; import org.sonar.plugins.python.api.IssueLocation; +import org.sonar.plugins.python.api.PythonCheck; import org.sonar.plugins.python.api.PythonSubscriptionCheck; import org.sonar.plugins.python.api.SubscriptionContext; import org.sonar.plugins.python.api.symbols.Symbol; @@ -72,7 +73,10 @@ private static void checkWithStatement(SubscriptionContext ctx, WithStatement wi return; } - reportIfMultipleInvocations(ctx, unsafeInvocations(withStatement.statements())); + var invocations = unsafeInvocations(withStatement.statements()); + if (invocations.size() > 1) { + reportIfMultipleInvocations(ctx.addIssue(withStatement.withKeyword(), withStatement.colon(), MESSAGE), invocations); + } } private static void checkDirectRaiseCall(SubscriptionContext ctx, CallExpression callExpression) { @@ -82,7 +86,8 @@ private static void checkDirectRaiseCall(SubscriptionContext ctx, CallExpression findLambdaArgument(callExpression.arguments()) .map(lambdaExpression -> unsafeInvocations(lambdaExpression.expression())) - .ifPresent(invocations -> reportIfMultipleInvocations(ctx, invocations)); + .filter(invocations -> invocations.size() > 1) + .ifPresent(invocations -> reportIfMultipleInvocations(ctx.addIssue(callExpression, MESSAGE), invocations)); } private static boolean isPytestRaise(CallExpression callExpression) { @@ -114,13 +119,8 @@ private static Optional findLambdaArgument(List argu .findFirst(); } - private static void reportIfMultipleInvocations(SubscriptionContext ctx, List invocations) { - if (invocations.size() <= 1) { - return; - } - - var issue = ctx.addIssue(invocations.get(0), MESSAGE); - invocations.stream().skip(1).forEach(invocation -> issue.secondary(invocationLocation(invocation, SECONDARY_MESSAGE))); + private static void reportIfMultipleInvocations(PythonCheck.PreciseIssue issue, List invocations) { + invocations.forEach(invocation -> issue.secondary(invocationLocation(invocation, SECONDARY_MESSAGE))); } private static IssueLocation invocationLocation(CallExpression invocation, String message) { diff --git a/python-checks/src/test/resources/checks/tests/singleInvocationRuntimeException.py b/python-checks/src/test/resources/checks/tests/singleInvocationRuntimeException.py index 9c599c2fa..3215a00cc 100644 --- a/python-checks/src/test/resources/checks/tests/singleInvocationRuntimeException.py +++ b/python-checks/src/test/resources/checks/tests/singleInvocationRuntimeException.py @@ -25,16 +25,18 @@ def __exit__(self, exc_type, exc_val, exc_tb): def test_pytest_with_call_chain(): - with pytest.raises(ValueError): - get_item().process() # Noncompliant {{Refactor this exception test to have only one invocation possibly throwing an exception.}} -# ^^^^^^^^^^ + with pytest.raises(ValueError): # Noncompliant {{Refactor this exception test to have only one invocation possibly throwing an exception.}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + get_item().process() +# ^^^^^^^^^^< {{Invocation possibly throwing an exception.}} # ^^^^^^^^^@-1< {{Invocation possibly throwing an exception.}} def test_pytest_with_nested_calls(): - with pytest.raises(ValueError): - do_work(get_item()) # Noncompliant -# ^^^^^^^^^^^^^^^^^^^ + with pytest.raises(ValueError): # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + do_work(get_item()) +# ^^^^^^^^^^^^^^^^^^^< {{Invocation possibly throwing an exception.}} # ^^^^^^^^^^@-1< {{Invocation possibly throwing an exception.}} @@ -90,23 +92,26 @@ def test_pytest_with_safe_object(): def test_pytest_with_unsafe_builtin_arguments(): - with pytest.raises(ValueError): - do_work(object(1)) # Noncompliant {{Refactor this exception test to have only one invocation possibly throwing an exception.}} -# ^^^^^^^^^^^^^^^^^^ + with pytest.raises(ValueError): # Noncompliant {{Refactor this exception test to have only one invocation possibly throwing an exception.}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + do_work(object(1)) +# ^^^^^^^^^^^^^^^^^^< {{Invocation possibly throwing an exception.}} # ^^^^^^^^^@-1< {{Invocation possibly throwing an exception.}} def test_pytest_with_unsafe_collection_arguments(): - with pytest.raises(ValueError): - do_work(set(5)) # Noncompliant -# ^^^^^^^^^^^^^^^ + with pytest.raises(ValueError): # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + do_work(set(5)) +# ^^^^^^^^^^^^^^^< {{Invocation possibly throwing an exception.}} # ^^^^^^@-1< {{Invocation possibly throwing an exception.}} def test_pytest_direct_lambda(): pytest.raises(ValueError, lambda: get_item().process()) # Noncompliant {{Refactor this exception test to have only one invocation possibly throwing an exception.}} -# ^^^^^^^^^^ -# ^^^^^^^^^@-1< {{Invocation possibly throwing an exception.}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +# ^^^^^^^^^^@-1< {{Invocation possibly throwing an exception.}} +# ^^^^^^^^^@-2< {{Invocation possibly throwing an exception.}} def test_pytest_direct_callable(): @@ -124,8 +129,9 @@ def test_pytest_direct_lambda_single_invocation(): def test_pytest_direct_lambda_with_unsafe_builtin_argument(): pytest.raises(ValueError, lambda: do_work(dict(5))) # Noncompliant {{Refactor this exception test to have only one invocation possibly throwing an exception.}} -# ^^^^^^^^^^^^^^^^ -# ^^^^^^^@-1< {{Invocation possibly throwing an exception.}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +# ^^^^^^^^^^^^^^^^@-1< {{Invocation possibly throwing an exception.}} +# ^^^^^^^@-2< {{Invocation possibly throwing an exception.}} def test_non_raise_with_statement(): @@ -147,9 +153,10 @@ def helper(): class TestCase(unittest.TestCase): def test_unittest_with_statement(self): - with self.assertRaises(ValueError): - get_item().process() # Noncompliant {{Refactor this exception test to have only one invocation possibly throwing an exception.}} -# ^^^^^^^^^^ + with self.assertRaises(ValueError): # Noncompliant {{Refactor this exception test to have only one invocation possibly throwing an exception.}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + get_item().process() +# ^^^^^^^^^^< {{Invocation possibly throwing an exception.}} # ^^^^^^^^^@-1< {{Invocation possibly throwing an exception.}} def test_unittest_with_safe_builtin(self): @@ -158,13 +165,15 @@ def test_unittest_with_safe_builtin(self): def test_unittest_lambda(self): self.assertRaises(ValueError, lambda: get_item().process()) # Noncompliant {{Refactor this exception test to have only one invocation possibly throwing an exception.}} -# ^^^^^^^^^^ -# ^^^^^^^^^@-1< {{Invocation possibly throwing an exception.}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +# ^^^^^^^^^^@-1< {{Invocation possibly throwing an exception.}} +# ^^^^^^^^^@-2< {{Invocation possibly throwing an exception.}} def test_unittest_lambda_nested_calls(self): self.assertRaises(ValueError, lambda: do_work(get_item())) # Noncompliant -# ^^^^^^^^^^^^^^^^^^^ -# ^^^^^^^^^^@-1< {{Invocation possibly throwing an exception.}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +# ^^^^^^^^^^^^^^^^^^^@-1< {{Invocation possibly throwing an exception.}} +# ^^^^^^^^^^@-2< {{Invocation possibly throwing an exception.}} def test_unittest_lambda_with_safe_builtin(self): self.assertRaises(ValueError, lambda: do_work(bytearray())) @@ -178,8 +187,9 @@ def test_unittest_lambda_single_invocation(self): def test_unittest_lambda_with_unsafe_builtin_argument(self): self.assertRaises(ValueError, lambda: do_work(frozenset(5))) # Noncompliant -# ^^^^^^^^^^^^^^^^^^^^^ -# ^^^^^^^^^^^^@-1< {{Invocation possibly throwing an exception.}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +# ^^^^^^^^^^^^^^^^^^^^^@-1< {{Invocation possibly throwing an exception.}} +# ^^^^^^^^^^^^@-2< {{Invocation possibly throwing an exception.}} def test_unittest_invalid_raise_method(self): self.assertRaisesRandom(ValueError, lambda: do_work(get_item())) From 6a143a0cab29c334c83155b0932e5aa0f80f0d2a Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Thu, 25 Jun 2026 15:33:09 +0200 Subject: [PATCH 151/322] SONARPY-4308: Create rule S8905: BeautifulSoup parser should be explicitly specified (#1211) GitOrigin-RevId: 2f574719bb11c274ea782ed80fece89e540f623d --- .../checks/BeautifulSoupParserCheck.java | 57 ++++++++++++++++ .../python/checks/OpenSourceCheckList.java | 1 + .../org/sonar/l10n/py/rules/python/S8905.html | 67 +++++++++++++++++++ .../org/sonar/l10n/py/rules/python/S8905.json | 26 +++++++ .../py/rules/python/Sonar_way_profile.json | 3 +- .../checks/BeautifulSoupParserCheckTest.java | 29 ++++++++ .../resources/checks/beautifulSoupParser.py | 31 +++++++++ 7 files changed, 213 insertions(+), 1 deletion(-) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/BeautifulSoupParserCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8905.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8905.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/BeautifulSoupParserCheckTest.java create mode 100644 python-checks/src/test/resources/checks/beautifulSoupParser.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/BeautifulSoupParserCheck.java b/python-checks/src/main/java/org/sonar/python/checks/BeautifulSoupParserCheck.java new file mode 100644 index 000000000..ccd733ecd --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/BeautifulSoupParserCheck.java @@ -0,0 +1,57 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import java.util.List; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.Argument; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.tree.TreeUtils; + +@Rule(key = "S8905") +public class BeautifulSoupParserCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Specify the parser to use for \"BeautifulSoup\"."; + private static final TypeMatcher BEAUTIFUL_SOUP_MATCHER = TypeMatchers.isType("bs4.BeautifulSoup"); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, BeautifulSoupParserCheck::checkCallExpression); + } + + private static void checkCallExpression(SubscriptionContext ctx) { + CallExpression callExpression = (CallExpression) ctx.syntaxNode(); + + if (!BEAUTIFUL_SOUP_MATCHER.isTrueFor(callExpression.callee(), ctx)) { + return; + } + + List arguments = callExpression.arguments(); + + var features = TreeUtils.nthArgumentOrKeyword(1, "features", arguments); + var builder = TreeUtils.nthArgumentOrKeyword(2, "builder", arguments); + + if (features == null && builder == null) { + ctx.addIssue(callExpression.callee(), MESSAGE); + } + } +} diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index a55751890..2642f0952 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -137,6 +137,7 @@ public Stream> getChecks() { AwsWaitersInsteadOfCustomPollingCheck.class, BackslashInStringCheck.class, BackticksUsageCheck.class, + BeautifulSoupParserCheck.class, BareRaiseInFinallyCheck.class, BeautifulSoupRawHtmlInsertionCheck.class, BindToAllNetworkInterfacesCheck.class, diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8905.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8905.html new file mode 100644 index 000000000..e8e57cfe6 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8905.html @@ -0,0 +1,67 @@ +

                            This rule raises an issue when an HTML/XML parser object is created without explicitly specifying which parsing engine to use (typically the second +positional parameter or a named parameter in the constructor).

                            +

                            In Python, this specifically refers to the BeautifulSoup object from the BeautifulSoup4 library.

                            +

                            Why is this an issue?

                            +

                            When you initialize an HTML parsing library without specifying which parser to use, the library automatically selects what it considers the "best +available" parser on your system. This might seem convenient, but it creates several problems.

                            +

                            The parser that the library chooses depends on which parsing libraries are installed in your environment. Common parsing strategies include a +language’s built-in HTML parser, faster third-party parsers with native code components, and more lenient parsers that prioritize compatibility. +Different environments—such as your local machine, a colleague’s computer, a CI/CD server, or a production deployment—may have different parsers +installed.

                            +

                            This environment-dependent behavior leads to inconsistent parsing results. Different parsers handle HTML differently, especially when dealing with +malformed or ambiguous markup. For example:

                            +
                              +
                            • Parsers with native code components are faster but may be stricter about HTML structure
                            • +
                            • Compatibility-focused parsers are more lenient and parse HTML like a web browser would
                            • +
                            • Built-in parsers offer a middle ground and require no external dependencies
                            • +
                            +

                            When parsing untrusted or poorly-formed HTML from external sources, these differences can produce completely different parse trees. Code that works +perfectly in your development environment might fail or behave unexpectedly in production. A query that successfully locates an element with one +parser might return nothing with another.

                            +

                            Beyond correctness issues, this inconsistency makes debugging difficult. When a bug appears only in certain environments, tracking down the cause +becomes challenging if you don’t realize the parser is different.

                            +

                            For security-sensitive applications that parse untrusted HTML, relying on an unspecified parser introduces additional risk. Different parsers may +interpret potentially malicious markup differently, and you lose control over this critical parsing behavior.

                            +

                            In Python’s BeautifulSoup library, the common parsers are html.parser (Python’s built-in), lxml (faster with native +code), and html5lib (most lenient and browser-like).

                            +

                            What is the potential impact?

                            +

                            When HTML parsing libraries use different parsers across environments, your application may:

                            +
                              +
                            • Parse the same HTML differently in development versus production
                            • +
                            • Experience bugs that only occur on certain machines or in specific deployment environments
                            • +
                            • Fail to extract expected data from HTML documents, causing application logic errors
                            • +
                            • Behave unpredictably when processing HTML from external sources
                            • +
                            +

                            These issues reduce code reliability and make your application harder to maintain and debug.

                            +

                            How to fix it

                            +

                            Add the parser name as the second argument when creating a BeautifulSoup object. Python’s built-in html.parser is a good default +choice as it requires no additional dependencies.

                            +

                            Code examples

                            +

                            Noncompliant code example

                            +
                            +from bs4 import BeautifulSoup
                            +from urllib.request import urlopen
                            +
                            +webpage = urlopen('http://example.com')
                            +soup = BeautifulSoup(webpage)  # Noncompliant
                            +table = soup.find('table', {'class': 'data'})
                            +
                            +

                            Compliant solution

                            +
                            +from bs4 import BeautifulSoup
                            +from urllib.request import urlopen
                            +
                            +webpage = urlopen('http://example.com')
                            +soup = BeautifulSoup(webpage, 'html.parser')
                            +table = soup.find('table', {'class': 'data'})
                            +
                            +

                            Resources

                            +

                            Documentation

                            + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8905.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8905.json new file mode 100644 index 000000000..ef7b0f849 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8905.json @@ -0,0 +1,26 @@ +{ + "title": "BeautifulSoup parser should be explicitly specified", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5 min" + }, + "tags": [ + "html", + "unpredictable", + "pitfall" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-8905", + "sqKey": "S8905", + "scope": "All", + "quickfix": "unknown", + "code": { + "impacts": { + "RELIABILITY": "MEDIUM", + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "CLEAR" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index c66da40ab..a4b60fe5b 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -355,6 +355,7 @@ "S8572", "S8685", "S8786", - "S8903" + "S8903", + "S8905" ] } diff --git a/python-checks/src/test/java/org/sonar/python/checks/BeautifulSoupParserCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/BeautifulSoupParserCheckTest.java new file mode 100644 index 000000000..740578ecb --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/BeautifulSoupParserCheckTest.java @@ -0,0 +1,29 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.junit.jupiter.api.Test; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class BeautifulSoupParserCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/beautifulSoupParser.py", new BeautifulSoupParserCheck()); + } + +} diff --git a/python-checks/src/test/resources/checks/beautifulSoupParser.py b/python-checks/src/test/resources/checks/beautifulSoupParser.py new file mode 100644 index 000000000..528239500 --- /dev/null +++ b/python-checks/src/test/resources/checks/beautifulSoupParser.py @@ -0,0 +1,31 @@ +from bs4 import BeautifulSoup + +html = "

                            test

                            " + +soup = BeautifulSoup(html) # Noncompliant {{Specify the parser to use for "BeautifulSoup".}} +# ^^^^^^^^^^^^^ +soup = BeautifulSoup() # Noncompliant +# ^^^^^^^^^^^^^ +soup = BeautifulSoup(html, None) +soup = BeautifulSoup(html, features=None) + +# Compliant: features specified as second positional arg +soup = BeautifulSoup(html, 'html.parser') +soup = BeautifulSoup(html, 'lxml') +soup = BeautifulSoup(html, 'html5lib') + +# Compliant: features specified as keyword argument +soup = BeautifulSoup(html, features='html.parser') +soup = BeautifulSoup(features='html.parser', markup=html) + +# Compliant: builder specified (alternative way to pin the parser) +from bs4.builder import HTMLParserTreeBuilder +soup = BeautifulSoup(html, builder=None) +soup = BeautifulSoup(html, builder=HTMLParserTreeBuilder()) +soup = BeautifulSoup(html, None, HTMLParserTreeBuilder()) # builder as 3rd positional + +# Compliant: not a bs4 BeautifulSoup +class BeautifulSoup: + def __init__(self, markup): pass + +soup = BeautifulSoup(html) # Not bs4 - no issue From 52f976f2907769b8205f87dc75b43f24d9476924 Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Fri, 26 Jun 2026 08:51:29 +0200 Subject: [PATCH 152/322] SONARPY-4306 : Port S8714 to python: Dedicated exception assertions should be used instead of "try-catch" with "fail()" (#1204) GitOrigin-RevId: e6e5a83df4fe7157e7aab0f81c97da8d0c949a50 --- .../python/checks/OpenSourceCheckList.java | 2 + .../DedicatedExceptionAssertionCheck.java | 132 +++++++++++++ .../org/sonar/l10n/py/rules/python/S8714.html | 141 ++++++++++++++ .../org/sonar/l10n/py/rules/python/S8714.json | 23 +++ .../python/Sonar_agentic_AI_profile.json | 1 + .../py/rules/python/Sonar_way_profile.json | 1 + .../DedicatedExceptionAssertionCheckTest.java | 36 ++++ .../tests/dedicatedExceptionAssertion.py | 173 ++++++++++++++++++ 8 files changed, 509 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/tests/DedicatedExceptionAssertionCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8714.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8714.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/tests/DedicatedExceptionAssertionCheckTest.java create mode 100644 python-checks/src/test/resources/checks/tests/dedicatedExceptionAssertion.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 2642f0952..cf436c6a7 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -95,6 +95,7 @@ import org.sonar.python.checks.tests.AssertOnDissimilarTypesCheck; import org.sonar.python.checks.tests.AssertOnTupleLiteralCheck; import org.sonar.python.checks.tests.DedicatedAssertionCheck; +import org.sonar.python.checks.tests.DedicatedExceptionAssertionCheck; import org.sonar.python.checks.tests.ImplicitlySkippedTestCheck; import org.sonar.python.checks.tests.NotDiscoverableTestMethodCheck; import org.sonar.python.checks.tests.SingleInvocationRuntimeExceptionCheck; @@ -183,6 +184,7 @@ public Stream> getChecks() { DeadStoreCheck.class, DebugModeCheck.class, DedicatedAssertionCheck.class, + DedicatedExceptionAssertionCheck.class, DefaultFactoryArgumentCheck.class, DeprecatedNumpyTypesCheck.class, DictKeysMembershipTestCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/DedicatedExceptionAssertionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/DedicatedExceptionAssertionCheck.java new file mode 100644 index 000000000..17adbb23e --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/DedicatedExceptionAssertionCheck.java @@ -0,0 +1,132 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import java.util.List; +import javax.annotation.Nullable; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.ElseClause; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.ExpressionStatement; +import org.sonar.plugins.python.api.tree.Statement; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.tree.TryStatement; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; + +@Rule(key = "S8714") +public class DedicatedExceptionAssertionCheck extends PythonSubscriptionCheck { + private static final TypeMatcher PYTEST_FAIL_MATCHER = TypeMatchers.withFQN("pytest.fail"); + private static final TypeMatcher UNITTEST_FAIL_MATCHER = TypeMatchers.withFQN("unittest.case.TestCase.fail"); + private static final String PYTEST_MESSAGE = "Replace this try/except block with a \"pytest.raises\" context manager."; + private static final String UNITTEST_MESSAGE = "Replace this try/except block with \"self.assertRaises()\"."; + private static final String NO_EXCEPTION_MESSAGE = "Remove this try/except block and let the test fail naturally if an exception is raised."; + private record FailCall(CallExpression callExpression, String message) { + } + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.TRY_STMT, ctx -> checkTryStatement(ctx, (TryStatement) ctx.syntaxNode())); + } + + @Override + public CheckScope scope() { + return CheckScope.ALL; + } + + private static void checkTryStatement(SubscriptionContext ctx, TryStatement tryStatement) { + if (!hasSupportedExceptClauses(tryStatement) || tryStatement.finallyClause() != null) { + return; + } + + if (tryStatement.exceptClauses().size() == 1) { + FailCall exceptFail = failCallFromSingleStatementBody(tryStatement.exceptClauses().get(0).body().statements(), ctx); + if (exceptFail != null) { + ctx.addIssue(exceptFail.callExpression(), NO_EXCEPTION_MESSAGE); + return; + } + } + + FailCall failCall = failCallFromElseClause(tryStatement.elseClause(), ctx); + if (failCall == null) { + failCall = failCallFromTryBody(tryStatement.body().statements(), ctx); + } + if (failCall == null) { + return; + } + + ctx.addIssue(failCall.callExpression(), failCall.message()); + } + + private static boolean hasSupportedExceptClauses(TryStatement tryStatement) { + return !tryStatement.exceptClauses().isEmpty() && tryStatement.exceptClauses().stream().allMatch(exceptClause -> + exceptClause.starToken() == null && exceptClause.exception() != null); + } + + @Nullable + private static FailCall failCallFromElseClause(@Nullable ElseClause elseClause, SubscriptionContext ctx) { + if (elseClause == null) { + return null; + } + return failCallFromSingleStatementBody(elseClause.body().statements(), ctx); + } + + @Nullable + private static FailCall failCallFromTryBody(List statements, SubscriptionContext ctx) { + if (statements.size() < 2) { + return null; + } + return failCallFromStatement(statements.get(statements.size() - 1), ctx); + } + + @Nullable + private static FailCall failCallFromSingleStatementBody(List statements, SubscriptionContext ctx) { + if (statements.size() != 1) { + return null; + } + return failCallFromStatement(statements.get(0), ctx); + } + + @Nullable + private static FailCall failCallFromStatement(Statement statement, SubscriptionContext ctx) { + if (!(statement instanceof ExpressionStatement expressionStatement) || expressionStatement.expressions().size() != 1) { + return null; + } + Expression expression = expressionStatement.expressions().get(0); + if (!(expression instanceof CallExpression callExpression)) { + return null; + } + if (isPytestFail(callExpression, ctx)) { + return new FailCall(callExpression, PYTEST_MESSAGE); + } + if (isUnittestFail(callExpression, ctx)) { + return new FailCall(callExpression, UNITTEST_MESSAGE); + } + return null; + } + + private static boolean isPytestFail(CallExpression callExpression, SubscriptionContext ctx) { + return PYTEST_FAIL_MATCHER.isTrueFor(callExpression.callee(), ctx); + } + + private static boolean isUnittestFail(CallExpression callExpression, SubscriptionContext ctx) { + return UNITTEST_FAIL_MATCHER.isTrueFor(callExpression.callee(), ctx); + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8714.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8714.html new file mode 100644 index 000000000..39ea0b3ad --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8714.html @@ -0,0 +1,141 @@ +

                            This rule raises an issue when a test uses a try-except block combined with fail() to verify whether an exception is +raised or not raised.

                            +

                            Why is this an issue?

                            +

                            Using try-except blocks combined with fail() to test for the presence or absence of exceptions is an anti-pattern.

                            +

                            Modern testing frameworks like pytest and Python’s built-in unittest provide dedicated assertion methods that make +exception testing cleaner and more explicit. These methods eliminate boilerplate code, clearly communicate test intent, and make it easier to assert +on exception details.

                            +

                            The try-except-fail() pattern has several drawbacks:

                            +
                              +
                            • It adds unnecessary boilerplate that obscures the test’s purpose
                            • +
                            • It requires manual exception handling instead of using framework features
                            • +
                            • It makes the test harder to maintain and read
                            • +
                            • It provides no straightforward way to assert on exception attributes when an exception is expected
                            • +
                            +

                            Dedicated exception assertions solve these problems by providing a declarative way to express exception expectations.

                            +

                            What is the potential impact?

                            +

                            Using try-except with fail() instead of dedicated exception assertions reduces test code quality and maintainability:

                            +
                              +
                            • Readability: Tests become harder to understand at a glance, especially for developers unfamiliar with the codebase
                            • +
                            • Maintainability: More verbose code means more places for bugs to hide and more effort required to update tests
                            • +
                            • Intent clarity: The test’s purpose (verifying exception behavior) is buried in control flow rather than being explicit
                            • +
                            • Lost functionality: It’s harder to assert on exception messages, types, or other attributes when using the + try-except pattern
                            • +
                            +

                            How to fix it in unittest

                            +

                            Code examples

                            +

                            Noncompliant code example

                            +

                            Replace try-except blocks that use fail() with assertRaises used as a context manager. This built-in method +from Python’s unittest framework provides a clean way to verify exception behavior.

                            +

                            When you expect no exception, simply call the code directly without wrapping it in a try-except block. If an unexpected exception is +raised, the test framework will catch it and fail the test automatically.

                            +

                            When you expect an exception, use assertRaises as a context manager. This allows you to capture the exception and make additional +assertions on its properties.

                            +
                            +import unittest
                            +
                            +class UserServiceTest(unittest.TestCase):
                            +    def test_no_exception_thrown(self):
                            +        try:
                            +            self.user_service.register_user(self.valid_user)
                            +        except ValidationError:
                            +            self.fail("Should not have thrown any exception")  # Noncompliant
                            +
                            +

                            When verifying that an exception is raised, use assertRaises as a context manager. This provides access to the exception object for +further assertions.

                            +
                            +import unittest
                            +
                            +class UserServiceTest(unittest.TestCase):
                            +    def test_exception_is_thrown(self):
                            +        try:
                            +            self.user_service.register_user(self.invalid_user)
                            +            self.fail("Expected ValidationError to be thrown")  # Noncompliant
                            +        except ValidationError as e:
                            +            self.assertEqual("Invalid email", str(e))
                            +
                            +

                            Compliant solution

                            +

                            Replace try-except blocks that use fail() with assertRaises used as a context manager. This built-in method +from Python’s unittest framework provides a clean way to verify exception behavior.

                            +

                            When you expect no exception, simply call the code directly without wrapping it in a try-except block. If an unexpected exception is +raised, the test framework will catch it and fail the test automatically.

                            +

                            When you expect an exception, use assertRaises as a context manager. This allows you to capture the exception and make additional +assertions on its properties.

                            +
                            +import unittest
                            +
                            +class UserServiceTest(unittest.TestCase):
                            +    def test_no_exception_thrown(self):
                            +        # Simply call the method - unittest will fail if an exception is raised
                            +        self.user_service.register_user(self.valid_user)
                            +
                            +

                            When verifying that an exception is raised, use assertRaises as a context manager. This provides access to the exception object for +further assertions.

                            +
                            +import unittest
                            +
                            +class UserServiceTest(unittest.TestCase):
                            +    def test_exception_is_thrown(self):
                            +        with self.assertRaises(ValidationError) as context:
                            +            self.user_service.register_user(self.invalid_user)
                            +
                            +        self.assertEqual("Invalid email", str(context.exception))
                            +
                            +

                            How to fix it in pytest

                            +

                            Code examples

                            +

                            Noncompliant code example

                            +

                            Replace try-except blocks with pytest.raises used as a context manager. Pytest is the most popular Python testing +framework and provides excellent exception testing support.

                            +

                            When you expect no exception, simply call the code directly. Pytest will fail the test if an unexpected exception occurs.

                            +

                            When you expect an exception, use pytest.raises as a context manager to verify the exception type and optionally inspect its +properties.

                            +
                            +import pytest
                            +
                            +def test_no_exception_thrown(user_service, valid_user):
                            +    try:
                            +        user_service.register_user(valid_user)
                            +    except ValidationError:
                            +        pytest.fail("Should not have thrown any exception")  # Noncompliant
                            +
                            +

                            When verifying that an exception is raised with pytest, use pytest.raises as a context manager. This gives you access to the exception +object for additional assertions using the match parameter or the value attribute.

                            +
                            +import pytest
                            +
                            +def test_exception_is_thrown(user_service, invalid_user):
                            +    try:
                            +        user_service.register_user(invalid_user)
                            +        pytest.fail("Expected ValidationError to be thrown")  # Noncompliant
                            +    except ValidationError as e:
                            +        assert str(e) == "Invalid email"
                            +
                            +

                            Compliant solution

                            +

                            Replace try-except blocks with pytest.raises used as a context manager. Pytest is the most popular Python testing +framework and provides excellent exception testing support.

                            +

                            When you expect no exception, simply call the code directly. Pytest will fail the test if an unexpected exception occurs.

                            +

                            When you expect an exception, use pytest.raises as a context manager to verify the exception type and optionally inspect its +properties.

                            +
                            +def test_no_exception_thrown(user_service, valid_user):
                            +    # Simply call the method - pytest will fail if an exception is raised
                            +    user_service.register_user(valid_user)
                            +
                            +

                            When verifying that an exception is raised with pytest, use pytest.raises as a context manager. This gives you access to the exception +object for additional assertions using the match parameter or the value attribute.

                            +
                            +import pytest
                            +
                            +def test_exception_is_thrown(user_service, invalid_user):
                            +    with pytest.raises(ValidationError) as exc_info:
                            +        user_service.register_user(invalid_user)
                            +
                            +    assert str(exc_info.value) == "Invalid email"
                            +
                            +

                            Resources

                            +

                            Documentation

                            + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8714.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8714.json new file mode 100644 index 000000000..1c41e6059 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8714.json @@ -0,0 +1,23 @@ +{ + "title": "Dedicated exception assertions should be used instead of \"try-except\" with \"fail()\"", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "tests" + ], + "defaultSeverity": "Minor", + "ruleSpecification": "RSPEC-8714", + "sqKey": "S8714", + "scope": "Tests", + "quickfix": "unknown", + "code": { + "impacts": { + "MAINTAINABILITY": "LOW" + }, + "attribute": "CONVENTIONAL" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_agentic_AI_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_agentic_AI_profile.json index 88ce98945..4f70e2235 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_agentic_AI_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_agentic_AI_profile.json @@ -306,6 +306,7 @@ "S8413", "S8414", "S8415", + "S8714", "S8786" ] } diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index a4b60fe5b..cd870e547 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -354,6 +354,7 @@ "S8521", "S8572", "S8685", + "S8714", "S8786", "S8903", "S8905" diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/DedicatedExceptionAssertionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/DedicatedExceptionAssertionCheckTest.java new file mode 100644 index 000000000..76505896a --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/DedicatedExceptionAssertionCheckTest.java @@ -0,0 +1,36 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import org.junit.jupiter.api.Test; +import org.sonar.plugins.python.api.PythonCheck; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +import static org.assertj.core.api.Assertions.assertThat; + +class DedicatedExceptionAssertionCheckTest { + + @Test + void sample() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/dedicatedExceptionAssertion.py", new DedicatedExceptionAssertionCheck()); + } + + @Test + void test_scope() { + assertThat(new DedicatedExceptionAssertionCheck().scope()).isEqualTo(PythonCheck.CheckScope.ALL); + } +} diff --git a/python-checks/src/test/resources/checks/tests/dedicatedExceptionAssertion.py b/python-checks/src/test/resources/checks/tests/dedicatedExceptionAssertion.py new file mode 100644 index 000000000..7cb3bce8e --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/dedicatedExceptionAssertion.py @@ -0,0 +1,173 @@ +import unittest + +import pytest +from pytest import fail as imported_fail + +def explode(): + raise ValueError() + +def test_pytest_reproducer(): + try: + explode() + except ValueError: + pass + else: + pytest.fail("ValueError expected") # Noncompliant {{Replace this try/except block with a "pytest.raises" context manager.}} + +def test_pytest_else_fail(): + try: + explode() + except ValueError: + pass + else: + pytest.fail("ValueError expected") # Noncompliant {{Replace this try/except block with a "pytest.raises" context manager.}} + +def test_pytest_try_fail(): + try: + explode() + pytest.fail("ValueError expected") # Noncompliant {{Replace this try/except block with a "pytest.raises" context manager.}} + except ValueError: + pass + +def test_pytest_imported_fail(): + try: + explode() + except ValueError: + pass + else: + imported_fail("ValueError expected") # Noncompliant {{Replace this try/except block with a "pytest.raises" context manager.}} + +def test_except_body_with_extra_logic(): + try: + explode() + except ValueError as err: + print(err) + else: + pytest.fail("ValueError expected") # Noncompliant + +def test_no_issue_on_non_pytest_fail(): + try: + explode() + except ValueError: + pass + else: + fail("ValueError expected") + +def test_no_issue_with_finally(): + try: + explode() + except ValueError: + pass + else: + pytest.fail("ValueError expected") + finally: + cleanup() + +def test_no_issue_with_bare_except(): + try: + explode() + except: + pytest.fail("ValueError expected") + +def test_no_issue_with_except_star(): + try: + explode() + except* ValueError: + pytest.fail("ValueError expected") + +def test_no_issue_with_multi_statement_else(): + try: + explode() + except ValueError: + pass + else: + message = "ValueError expected" + pytest.fail(message) + +def test_no_issue_with_multi_expression_else(): + try: + explode() + except ValueError: + pass + else: + print("before fail"), pytest.fail("ValueError expected") + +def test_no_issue_with_non_call_expression_else(): + try: + explode() + except ValueError: + pass + else: + "ValueError expected" + +def test_fail_in_except(): + try: + explode() + except ValueError: + pytest.fail("unexpected") # Noncompliant {{Remove this try/except block and let the test fail naturally if an exception is raised.}} + +def test_no_issue_with_multi_statement_except_body(): + try: + explode() + except ValueError: + message = "unexpected" + pytest.fail(message) + +def test_try_fail_with_multiple_except_clauses(): + try: + explode() + pytest.fail("ValueError expected") # Noncompliant {{Replace this try/except block with a "pytest.raises" context manager.}} + except ValueError: + pass + except TypeError as err: + assert "bad type" in str(err) + +class SomeTest(unittest.TestCase): + def __init__(self): + self.user_service = None + self.valid_user = None + self.invalid_user = None + + def test_unittest_else_fail(self): + try: + explode() + except ValueError: + pass + else: + self.fail("ValueError expected") # Noncompliant {{Replace this try/except block with "self.assertRaises()".}} + + def test_unittest_try_fail(self): + try: + explode() + self.fail("ValueError expected") # Noncompliant {{Replace this try/except block with "self.assertRaises()".}} + except ValueError: + pass + + def test_no_exception_expected(self): + try: + self.user_service.register_user(self.valid_user) + except ValidationError: + self.fail("Should not have thrown any exception") # Noncompliant {{Remove this try/except block and let the test fail naturally if an exception is raised.}} + + def test_exception_details(self): + try: + self.user_service.register_user(self.invalid_user) + self.fail("Expected ValidationError to be thrown") # Noncompliant {{Replace this try/except block with "self.assertRaises()".}} + except ValidationError as e: + self.assertEqual("Invalid email", str(e)) + + def test_multiple_except_clauses(self): + try: + self.user_service.register_user(self.valid_user) + except ValidationError: + self.fail("got ValidationError") + except TypeError: + self.assertEqual("bad type", "bad type") + + def test_no_issue_outside_unittest(self): + try: + explode() + except ValueError: + pass + else: + other.fail("ValueError expected") From cc981924278e2b9f6ec5419337e7826b265bc94e Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Fri, 26 Jun 2026 09:06:23 +0200 Subject: [PATCH 153/322] SONARPY-4296 Create rule S8900: Deprecated Beautiful Soup methods should be replaced with their modern equivalents (#1199) GitOrigin-RevId: 7955c815acf370e1800b89c5a6235d68a904850d --- .../BeautifulSoupDeprecatedNamesCheck.java | 186 +++++++++++++++ .../python/checks/OpenSourceCheckList.java | 3 +- .../org/sonar/l10n/py/rules/python/S8900.html | 213 ++++++++++++++++++ .../org/sonar/l10n/py/rules/python/S8900.json | 25 ++ .../py/rules/python/Sonar_way_profile.json | 2 + ...BeautifulSoupDeprecatedNamesCheckTest.java | 113 ++++++++++ .../checks/beautifulSoupDeprecatedNames.py | 107 +++++++++ 7 files changed, 648 insertions(+), 1 deletion(-) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/BeautifulSoupDeprecatedNamesCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8900.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8900.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/BeautifulSoupDeprecatedNamesCheckTest.java create mode 100644 python-checks/src/test/resources/checks/beautifulSoupDeprecatedNames.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/BeautifulSoupDeprecatedNamesCheck.java b/python-checks/src/main/java/org/sonar/python/checks/BeautifulSoupDeprecatedNamesCheck.java new file mode 100644 index 000000000..e88a099ba --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/BeautifulSoupDeprecatedNamesCheck.java @@ -0,0 +1,186 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.quickfix.PythonQuickFix; +import org.sonar.plugins.python.api.tree.Argument; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.QualifiedExpression; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.quickfix.TextEditUtils; +import org.sonar.python.tree.TreeUtils; + +@Rule(key = "S8900") +public class BeautifulSoupDeprecatedNamesCheck extends PythonSubscriptionCheck { + + // All deprecated methods and attributes are defined on PageElement (the base class), + // so using isObjectInstanceOf covers BeautifulSoup, Tag, and their subclasses. + private static final TypeMatcher BS4_MATCHER = TypeMatchers.isObjectInstanceOf("bs4.element.PageElement"); + + // Maps deprecated method names to their modern equivalents + private static final Map DEPRECATED_METHODS; + static { + Map m = new LinkedHashMap<>(); + m.put("findAll", "find_all"); + m.put("findChild", "find"); + m.put("findChildren", "find_all"); + m.put("findNext", "find_next"); + m.put("findAllNext", "find_all_next"); + m.put("findPrevious", "find_previous"); + m.put("findAllPrevious", "find_all_previous"); + m.put("findNextSibling", "find_next_sibling"); + m.put("findNextSiblings", "find_next_siblings"); + m.put("findPreviousSibling", "find_previous_sibling"); + m.put("findPreviousSiblings", "find_previous_siblings"); + m.put("findParent", "find_parent"); + m.put("findParents", "find_parents"); + m.put("replaceWith", "replace_with"); + m.put("getText", "get_text"); + DEPRECATED_METHODS = Collections.unmodifiableMap(m); + } + + // Maps deprecated attribute names to their modern equivalents + private static final Map DEPRECATED_ATTRS; + static { + Map m = new LinkedHashMap<>(); + m.put("nextSibling", "next_sibling"); + m.put("previousSibling", "previous_sibling"); + DEPRECATED_ATTRS = Collections.unmodifiableMap(m); + } + + // Modern find-family method names that accept the text= keyword argument. + // replaceWith/replace_with and getText/get_text are intentionally excluded. + private static final Set FIND_FAMILY_MODERN_METHODS; + static { + Set s = new LinkedHashSet<>(); + s.add("find"); + s.add("find_all"); + s.add("find_next"); + s.add("find_all_next"); + s.add("find_previous"); + s.add("find_all_previous"); + s.add("find_next_sibling"); + s.add("find_next_siblings"); + s.add("find_previous_sibling"); + s.add("find_previous_siblings"); + FIND_FAMILY_MODERN_METHODS = Collections.unmodifiableSet(s); + } + + // Union of modern find-family names and all deprecated names that map to one of them. + // Derived to avoid duplicating the deprecated keys from DEPRECATED_METHODS. + private static final Set FIND_FAMILY_METHODS; + static { + LinkedHashSet s = Stream.concat( + FIND_FAMILY_MODERN_METHODS.stream(), + DEPRECATED_METHODS.entrySet().stream() + .filter(e -> FIND_FAMILY_MODERN_METHODS.contains(e.getValue())) + .map(Map.Entry::getKey) + ).collect(Collectors.toCollection(LinkedHashSet::new)); + FIND_FAMILY_METHODS = Collections.unmodifiableSet(s); + } + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, BeautifulSoupDeprecatedNamesCheck::checkCallExpression); + context.registerSyntaxNodeConsumer(Tree.Kind.QUALIFIED_EXPR, BeautifulSoupDeprecatedNamesCheck::checkQualifiedExpression); + } + + private static void checkCallExpression(SubscriptionContext ctx) { + CallExpression callExpression = (CallExpression) ctx.syntaxNode(); + + if (!(callExpression.callee() instanceof QualifiedExpression qualifiedExpr)) { + return; + } + + String methodName = qualifiedExpr.name().name(); + Expression receiver = qualifiedExpr.qualifier(); + + if (!BS4_MATCHER.isTrueFor(receiver, ctx)) { + return; + } + + // Check for deprecated method name + // We need to use the name as findAll FQN resolves to find_all + String modernMethod = DEPRECATED_METHODS.get(methodName); + if (modernMethod != null) { + PreciseIssue issue = ctx.addIssue(qualifiedExpr.name(), + String.format("Replace the deprecated '%s()' method with '%s()'.", methodName, modernMethod)); + issue.addQuickFix(PythonQuickFix.newQuickFix( + "Replace '%s()' with '%s()'".formatted(methodName, modernMethod), + TextEditUtils.replace(qualifiedExpr.name(), modernMethod) + )); + } + + // Check for deprecated text= keyword argument (in any find-family method) + if (FIND_FAMILY_METHODS.contains(methodName)) { + checkDeprecatedTextKeyword(ctx, callExpression.arguments()); + } + } + + private static void checkDeprecatedTextKeyword(SubscriptionContext ctx, List arguments) { + RegularArgument textArg = TreeUtils.argumentByKeyword("text", arguments); + if (textArg != null && textArg.keywordArgument() != null) { + PreciseIssue issue = ctx.addIssue(textArg.keywordArgument(), + "Replace the deprecated 'text' keyword argument with 'string'."); + issue.addQuickFix(PythonQuickFix.newQuickFix( + "Replace 'text' with 'string'", + TextEditUtils.replace(textArg.keywordArgument(), "string") + )); + } + } + + private static void checkQualifiedExpression(SubscriptionContext ctx) { + QualifiedExpression qualifiedExpr = (QualifiedExpression) ctx.syntaxNode(); + + // Skip if this is the callee of a call expression — that case is handled by checkCallExpression + if (qualifiedExpr.parent() instanceof CallExpression parentCall + && parentCall.callee() == qualifiedExpr) { + return; + } + + String attrName = qualifiedExpr.name().name(); + String modernAttr = DEPRECATED_ATTRS.get(attrName); + if (modernAttr == null) { + return; + } + + Expression qualifier = qualifiedExpr.qualifier(); + if (BS4_MATCHER.isTrueFor(qualifier, ctx)) { + PreciseIssue issue = ctx.addIssue(qualifiedExpr.name(), + String.format("Replace the deprecated '%s' attribute with '%s'.", attrName, modernAttr)); + issue.addQuickFix(PythonQuickFix.newQuickFix( + "Replace '%s' with '%s'".formatted(attrName, modernAttr), + TextEditUtils.replace(qualifiedExpr.name(), modernAttr) + )); + } + } +} diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index cf436c6a7..c761eb2f8 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -511,6 +511,7 @@ public Stream> getChecks() { WebEntryPointDecoratorCheck.class, DjangoModelStringFieldCheck.class, DjangoModelStrMethodCheck.class, - HardcodedCredentialsCallCheck.class); + HardcodedCredentialsCallCheck.class, + BeautifulSoupDeprecatedNamesCheck.class); } } diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8900.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8900.html new file mode 100644 index 000000000..a2fa8cd56 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8900.html @@ -0,0 +1,213 @@ +

                            This is an issue when you use deprecated methods from a previous major version of an HTML/XML parsing library, particularly methods that follow an +older naming convention (such as camelCase methods) that have been superseded by methods using a different naming convention in the current +version.

                            +

                            In Python with Beautiful Soup 4, this applies to:

                            +
                              +
                            • Deprecated camelCase method names carried over from Beautiful Soup 3, such as findAll(), findChildren(), + findParent(), and findNext()
                            • +
                            • Deprecated camelCase attribute names such as nextSibling and previousSibling
                            • +
                            • The deprecated text= keyword argument to search methods, replaced by string=
                            • +
                            +

                            Why is this an issue?

                            +

                            A major version update of this parsing library introduced a more consistent naming convention for its methods. The old naming convention from the +previous major version (like methods following the earlier style) was kept for backward compatibility but marked as deprecated.

                            +

                            While these deprecated methods still work in current versions, they create several problems:

                            +
                              +
                            • Inconsistent code style: Mixing deprecated methods with modern methods makes your codebase harder to read and understand.
                            • +
                            • Future compatibility risk: Deprecated methods may be removed in future library versions, breaking your code.
                            • +
                            • Confusion for maintainers: Developers familiar with the modern API will find deprecated methods unexpected and may not + understand why they’re being used.
                            • +
                            • Missing improvements: Modern methods may include performance optimizations or bug fixes not backported to deprecated + versions.
                            • +
                            +

                            The library’s documentation explicitly recommends using the modern equivalents to ensure long-term code maintainability.

                            +

                            In Beautiful Soup specifically, this refers to the transition from Beautiful Soup 3’s camelCase naming (like findAll(), +nextSibling) to Beautiful Soup 4’s underscore-separated naming convention (like find_all(), next_sibling).

                            +

                            What is the potential impact?

                            +

                            Using deprecated methods creates technical debt that will require refactoring effort later. When the library eventually removes these methods, your +application may break unexpectedly during a dependency update, requiring emergency fixes. This is especially problematic in production environments +where dependency updates should be routine maintenance rather than risky operations.

                            +

                            How to fix it

                            +

                            Replace the deprecated name with its modern equivalent. The full list of replacements is:

                            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            Deprecated nameModern equivalent
                            +

                            findAll()

                            +
                            +

                            find_all()

                            +
                            +

                            findChild()

                            +
                            +

                            find()

                            +
                            +

                            findChildren()

                            +
                            +

                            find_all()

                            +
                            +

                            findNext()

                            +
                            +

                            find_next()

                            +
                            +

                            findAllNext()

                            +
                            +

                            find_all_next()

                            +
                            +

                            findPrevious()

                            +
                            +

                            find_previous()

                            +
                            +

                            findAllPrevious()

                            +
                            +

                            find_all_previous()

                            +
                            +

                            findNextSibling()

                            +
                            +

                            find_next_sibling()

                            +
                            +

                            findNextSiblings()

                            +
                            +

                            find_next_siblings()

                            +
                            +

                            findPreviousSibling()

                            +
                            +

                            find_previous_sibling()

                            +
                            +

                            findPreviousSiblings()

                            +
                            +

                            find_previous_siblings()

                            +
                            +

                            findParent()

                            +
                            +

                            find_parent()

                            +
                            +

                            findParents()

                            +
                            +

                            find_parents()

                            +
                            +

                            replaceWith()

                            +
                            +

                            replace_with()

                            +
                            +

                            getText()

                            +
                            +

                            get_text()

                            +
                            +

                            .nextSibling

                            +
                            +

                            .next_sibling

                            +
                            +

                            .previousSibling

                            +
                            +

                            .previous_sibling

                            +
                            +

                            text= argument in find*() methods

                            +
                            +

                            string= argument

                            +
                            +

                            Code examples

                            +

                            Noncompliant code example

                            +
                            +from bs4 import BeautifulSoup
                            +
                            +soup = BeautifulSoup(html, 'html.parser')
                            +result = soup.find_all('a', text='Click here')  # Noncompliant
                            +
                            +

                            Compliant solution

                            +
                            +from bs4 import BeautifulSoup
                            +
                            +soup = BeautifulSoup(html, 'html.parser')
                            +result = soup.find_all('a', string='Click here')
                            +
                            +

                            Resources

                            +

                            Documentation

                            + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8900.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8900.json new file mode 100644 index 000000000..fc7fe5fe2 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8900.json @@ -0,0 +1,25 @@ +{ + "title": "Deprecated Beautiful Soup methods should be replaced with their modern equivalents", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5 min" + }, + "tags": [ + "deprecated", + "convention", + "pythonic" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-8900", + "sqKey": "S8900", + "scope": "All", + "quickfix": "unknown", + "code": { + "impacts": { + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "CONVENTIONAL" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index cd870e547..e694941a3 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -356,6 +356,8 @@ "S8685", "S8714", "S8786", + + "S8900", "S8903", "S8905" ] diff --git a/python-checks/src/test/java/org/sonar/python/checks/BeautifulSoupDeprecatedNamesCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/BeautifulSoupDeprecatedNamesCheckTest.java new file mode 100644 index 000000000..4a5358cf7 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/BeautifulSoupDeprecatedNamesCheckTest.java @@ -0,0 +1,113 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import java.util.stream.Stream; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.sonar.python.checks.quickfix.PythonQuickFixVerifier; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class BeautifulSoupDeprecatedNamesCheckTest { + + private static final BeautifulSoupDeprecatedNamesCheck check = new BeautifulSoupDeprecatedNamesCheck(); + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/beautifulSoupDeprecatedNames.py", check); + } + + @ParameterizedTest(name = "{0}") + @MethodSource("quickFixTestCases") + void quickFixMethod(String testName, String before, String after, String expectedMessage) { + PythonQuickFixVerifier.verify(check, before, after); + PythonQuickFixVerifier.verifyQuickFixMessages(check, before, expectedMessage); + } + + + @Test + void quickFixTextKeyword() { + String before = """ + from bs4 import BeautifulSoup + soup = BeautifulSoup("", 'html.parser') + soup.find_all('a', text='Click here')"""; + String after = """ + from bs4 import BeautifulSoup + soup = BeautifulSoup("", 'html.parser') + soup.find_all('a', string='Click here')"""; + PythonQuickFixVerifier.verify(check, before, after); + PythonQuickFixVerifier.verifyQuickFixMessages(check, before, "Replace 'text' with 'string'"); + } + + static Stream quickFixTestCases() { + return Stream.of( + methodCase("findAll", "find_all"), + methodCase("findChild", "find"), + methodCase("findChildren", "find_all"), + methodCase("findNext", "find_next"), + methodCase("findAllNext", "find_all_next"), + methodCase("findPrevious", "find_previous"), + methodCase("findAllPrevious", "find_all_previous"), + methodCase("findNextSibling", "find_next_sibling"), + methodCase("findNextSiblings", "find_next_siblings"), + methodCase("findPreviousSibling", "find_previous_sibling"), + methodCase("findPreviousSiblings", "find_previous_siblings"), + methodCase("findParent", "find_parent"), + methodCase("findParents", "find_parents"), + methodCase("replaceWith", "replace_with"), + methodCase("getText", "get_text"), + attrCase("nextSibling", "next_sibling"), + attrCase("previousSibling", "previous_sibling") + ); + } + + private static Arguments methodCase(String deprecated, String modern) { + String before = """ + from bs4 import BeautifulSoup + soup = BeautifulSoup("", 'html.parser') + soup.%s('a')""".formatted(deprecated); + String after = """ + from bs4 import BeautifulSoup + soup = BeautifulSoup("", 'html.parser') + soup.%s('a')""".formatted(modern); + return Arguments.of( + deprecated + " -> " + modern, + before, + after, + "Replace '%s()' with '%s()'".formatted(deprecated, modern) + ); + } + + private static Arguments attrCase(String deprecated, String modern) { + String before = """ + from bs4 import BeautifulSoup + soup = BeautifulSoup("", 'html.parser') + _ = soup.%s""".formatted(deprecated); + String after = """ + from bs4 import BeautifulSoup + soup = BeautifulSoup("", 'html.parser') + _ = soup.%s""".formatted(modern); + return Arguments.of( + deprecated + " -> " + modern, + before, + after, + "Replace '%s' with '%s'".formatted(deprecated, modern) + ); + } +} diff --git a/python-checks/src/test/resources/checks/beautifulSoupDeprecatedNames.py b/python-checks/src/test/resources/checks/beautifulSoupDeprecatedNames.py new file mode 100644 index 000000000..5d627a6ab --- /dev/null +++ b/python-checks/src/test/resources/checks/beautifulSoupDeprecatedNames.py @@ -0,0 +1,107 @@ +from bs4 import BeautifulSoup, Tag + +html = "Click here" +soup = BeautifulSoup(html, 'html.parser') +# Construct a Tag directly so the type inference yields a definite 'bs4.element.Tag' type +tag = Tag(name='a') + + +# Deprecated method calls on BeautifulSoup +def deprecated_methods_on_soup(): + soup.findAll('a') # Noncompliant {{Replace the deprecated 'findAll()' method with 'find_all()'.}} + soup.findChild('a') # Noncompliant {{Replace the deprecated 'findChild()' method with 'find()'.}} + soup.findChildren('a') # Noncompliant {{Replace the deprecated 'findChildren()' method with 'find_all()'.}} + soup.findNext('a') # Noncompliant {{Replace the deprecated 'findNext()' method with 'find_next()'.}} + soup.findAllNext('a') # Noncompliant {{Replace the deprecated 'findAllNext()' method with 'find_all_next()'.}} + soup.findPrevious('a') # Noncompliant {{Replace the deprecated 'findPrevious()' method with 'find_previous()'.}} + soup.findAllPrevious('a') # Noncompliant {{Replace the deprecated 'findAllPrevious()' method with 'find_all_previous()'.}} + soup.findNextSibling('a') # Noncompliant {{Replace the deprecated 'findNextSibling()' method with 'find_next_sibling()'.}} + soup.findNextSiblings('a') # Noncompliant {{Replace the deprecated 'findNextSiblings()' method with 'find_next_siblings()'.}} + soup.findPreviousSibling('a') # Noncompliant {{Replace the deprecated 'findPreviousSibling()' method with 'find_previous_sibling()'.}} + soup.findPreviousSiblings('a') # Noncompliant {{Replace the deprecated 'findPreviousSiblings()' method with 'find_previous_siblings()'.}} + soup.findParent('a') # Noncompliant {{Replace the deprecated 'findParent()' method with 'find_parent()'.}} + soup.findParents('a') # Noncompliant {{Replace the deprecated 'findParents()' method with 'find_parents()'.}} + soup.replaceWith('other') # Noncompliant {{Replace the deprecated 'replaceWith()' method with 'replace_with()'.}} + soup.getText() # Noncompliant {{Replace the deprecated 'getText()' method with 'get_text()'.}} + + +# Deprecated method calls on Tag (find() returns a Tag, which is also a PageElement) +def deprecated_methods_on_tag(): + tag.findAll('b') # Noncompliant {{Replace the deprecated 'findAll()' method with 'find_all()'.}} + tag.findChild('b') # Noncompliant {{Replace the deprecated 'findChild()' method with 'find()'.}} + tag.findNext('b') # Noncompliant {{Replace the deprecated 'findNext()' method with 'find_next()'.}} + tag.getText() # Noncompliant {{Replace the deprecated 'getText()' method with 'get_text()'.}} + + +# Deprecated attribute access +def deprecated_attributes(): + _ = soup.nextSibling # Noncompliant {{Replace the deprecated 'nextSibling' attribute with 'next_sibling'.}} + _ = soup.previousSibling # Noncompliant {{Replace the deprecated 'previousSibling' attribute with 'previous_sibling'.}} + _ = tag.nextSibling # Noncompliant {{Replace the deprecated 'nextSibling' attribute with 'next_sibling'.}} + _ = tag.previousSibling # Noncompliant {{Replace the deprecated 'previousSibling' attribute with 'previous_sibling'.}} + + +# Deprecated text= keyword argument (on modern method names) +def deprecated_text_kwarg(): + soup.find('a', text='Click here') # Noncompliant {{Replace the deprecated 'text' keyword argument with 'string'.}} + soup.find_all('a', text='Click here') # Noncompliant {{Replace the deprecated 'text' keyword argument with 'string'.}} + soup.find_next('a', text='x') # Noncompliant {{Replace the deprecated 'text' keyword argument with 'string'.}} + soup.find_all_next('a', text='x') # Noncompliant {{Replace the deprecated 'text' keyword argument with 'string'.}} + soup.find_previous('a', text='x') # Noncompliant {{Replace the deprecated 'text' keyword argument with 'string'.}} + soup.find_all_previous('a', text='x') # Noncompliant {{Replace the deprecated 'text' keyword argument with 'string'.}} + soup.find_next_sibling('a', text='x') # Noncompliant {{Replace the deprecated 'text' keyword argument with 'string'.}} + soup.find_next_siblings('a', text='x') # Noncompliant {{Replace the deprecated 'text' keyword argument with 'string'.}} + soup.find_previous_sibling('a', text='x') # Noncompliant {{Replace the deprecated 'text' keyword argument with 'string'.}} + soup.find_previous_siblings('a', text='x') # Noncompliant {{Replace the deprecated 'text' keyword argument with 'string'.}} + soup.find_parent('a', text='x') # Compliant - find_parent does not accept a string= argument + soup.find_parents('a', text='x') # Compliant - find_parents does not accept a string= argument + + +# Deprecated method + deprecated text= argument = two issues on same call +def deprecated_method_and_text_kwarg(): + soup.findAll('a', text='Click here') # Noncompliant {{Replace the deprecated 'findAll()' method with 'find_all()'.}} + # Noncompliant@-1 {{Replace the deprecated 'text' keyword argument with 'string'.}} + + +# Compliant: modern method names +def compliant_methods(): + soup.find('a') + soup.find_all('a') + soup.find_next('a') + soup.find_all_next('a') + soup.find_previous('a') + soup.find_all_previous('a') + soup.find_next_sibling('a') + soup.find_next_siblings('a') + soup.find_previous_sibling('a') + soup.find_previous_siblings('a') + soup.find_parent('a') + soup.find_parents('a') + soup.replace_with('other') + soup.get_text() + + +# Compliant: modern attribute names +def compliant_attributes(): + _ = soup.next_sibling + _ = soup.previous_sibling + _ = tag.next_sibling + _ = tag.previous_sibling + + +# Compliant: modern string= keyword +def compliant_string_kwarg(): + soup.find('a', string='Click here') + soup.find_all('a', string='Click here') + + +# Compliant: not a bs4 object +def compliant_non_bs4(): + class FakeElement: + def findAll(self): + pass + nextSibling = None + + obj = FakeElement() + obj.findAll() # Compliant - not a bs4 type + _ = obj.nextSibling # Compliant - not a bs4 type From 311529943895162ee4e8779341764eb9c66b6c3d Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Fri, 26 Jun 2026 11:57:04 +0200 Subject: [PATCH 154/322] SONARPY-4302 : Port S5958 to python: Tests should check which exception is thrown (#1205) GitOrigin-RevId: 97b5e09a95ffdcc2c0a63f5abbc49e6eaeadd1e0 --- .../python/checks/OpenSourceCheckList.java | 2 + .../SpecificExceptionAssertionCheck.java | 124 +++++++++++++++ .../org/sonar/l10n/py/rules/python/S5958.html | 122 +++++++++++++++ .../org/sonar/l10n/py/rules/python/S5958.json | 23 +++ .../py/rules/python/Sonar_way_profile.json | 1 + .../SpecificExceptionAssertionCheckTest.java | 28 ++++ .../tests/specificExceptionAssertion.py | 141 ++++++++++++++++++ 7 files changed, 441 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/tests/SpecificExceptionAssertionCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5958.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5958.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/tests/SpecificExceptionAssertionCheckTest.java create mode 100644 python-checks/src/test/resources/checks/tests/specificExceptionAssertion.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index c761eb2f8..f6fb497c0 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -100,6 +100,7 @@ import org.sonar.python.checks.tests.NotDiscoverableTestMethodCheck; import org.sonar.python.checks.tests.SingleInvocationRuntimeExceptionCheck; import org.sonar.python.checks.tests.SkippedTestNoReasonCheck; +import org.sonar.python.checks.tests.SpecificExceptionAssertionCheck; import org.sonar.python.checks.tests.UnconditionalAssertionCheck; public class OpenSourceCheckList { @@ -415,6 +416,7 @@ public Stream> getChecks() { SlotsAssignmentCheck.class, SpecialMethodParamListCheck.class, SpecialMethodReturnTypeCheck.class, + SpecificExceptionAssertionCheck.class, SQLQueriesCheck.class, StartsWithEndsWithTupleCheck.class, StopIterationInGeneratorCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/SpecificExceptionAssertionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/SpecificExceptionAssertionCheck.java new file mode 100644 index 000000000..7351d79a1 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/SpecificExceptionAssertionCheck.java @@ -0,0 +1,124 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import javax.annotation.Nullable; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.tree.WithItem; +import org.sonar.plugins.python.api.tree.WithStatement; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.tree.TreeUtils; + +import static org.sonar.plugins.python.api.types.BuiltinTypes.BASE_EXCEPTION; +import static org.sonar.plugins.python.api.types.BuiltinTypes.EXCEPTION; + +@Rule(key = "S5958") +public class SpecificExceptionAssertionCheck extends PythonSubscriptionCheck { + private static final String MESSAGE = "Specify a more specific exception type here."; + private static final String UNITTEST_TEST_CASE_FQN_PREFIX = "unittest.case.TestCase."; + private static final String PYTEST_EXPECTED_EXCEPTION = "expected_exception"; + private static final String PYTEST_MATCH = "match"; + private static final String UNITTEST_EXCEPTION = "exception"; + private static final TypeMatcher PYTEST_RAISES_MATCHER = TypeMatchers.withFQN("pytest.raises"); + private static final TypeMatcher UNITTEST_ASSERT_RAISES_MATCHER = TypeMatchers.any( + TypeMatchers.withFQN(UNITTEST_TEST_CASE_FQN_PREFIX + "assertRaises"), + TypeMatchers.withFQN(UNITTEST_TEST_CASE_FQN_PREFIX + "assertRaisesRegex"), + TypeMatchers.withFQN(UNITTEST_TEST_CASE_FQN_PREFIX + "assertRaisesRegexp") + ); + private static final TypeMatcher UNITTEST_ASSERT_RAISES_WITH_MESSAGE_CHECK_MATCHER = TypeMatchers.any( + TypeMatchers.withFQN(UNITTEST_TEST_CASE_FQN_PREFIX + "assertRaisesRegex"), + TypeMatchers.withFQN(UNITTEST_TEST_CASE_FQN_PREFIX + "assertRaisesRegexp") + ); + private static final TypeMatcher GENERIC_EXCEPTION_MATCHER = TypeMatchers.any( + TypeMatchers.isObjectOfType(EXCEPTION), + TypeMatchers.isObjectOfType(BASE_EXCEPTION), + TypeMatchers.isType(EXCEPTION), + TypeMatchers.isType(BASE_EXCEPTION) + ); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.WITH_STMT, ctx -> checkWithStatement(ctx, (WithStatement) ctx.syntaxNode())); + context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, ctx -> checkCallExpression(ctx, (CallExpression) ctx.syntaxNode())); + } + + @Override + public CheckScope scope() { + return CheckScope.ALL; + } + + private static void checkWithStatement(SubscriptionContext ctx, WithStatement withStatement) { + for (WithItem withItem : withStatement.withItems()) { + if (!(withItem.test() instanceof CallExpression callExpression)) { + continue; + } + Expression issueLocation = genericExceptionArgument(callExpression, ctx); + if (issueLocation != null) { + ctx.addIssue(issueLocation, MESSAGE); + } + } + } + + private static void checkCallExpression(SubscriptionContext ctx, CallExpression callExpression) { + if (callExpression.parent().is(Tree.Kind.WITH_ITEM)) { + return; + } + Expression issueLocation = genericExceptionArgument(callExpression, ctx); + if (issueLocation != null) { + ctx.addIssue(issueLocation, MESSAGE); + } + } + + @Nullable + private static Expression genericExceptionArgument(CallExpression callExpression, SubscriptionContext ctx) { + RegularArgument exceptionArgument = null; + if (PYTEST_RAISES_MATCHER.isTrueFor(callExpression.callee(), ctx)) { + if (hasPytestMessageCheck(callExpression)) { + return null; + } + exceptionArgument = TreeUtils.nthArgumentOrKeyword(0, PYTEST_EXPECTED_EXCEPTION, callExpression.arguments()); + } else if (isUnittestAssertRaises(callExpression, ctx)) { + if (hasUnittestMessageCheck(callExpression, ctx)) { + return null; + } + exceptionArgument = TreeUtils.nthArgumentOrKeyword(0, UNITTEST_EXCEPTION, callExpression.arguments()); + } + if (exceptionArgument == null || !GENERIC_EXCEPTION_MATCHER.isTrueFor(exceptionArgument.expression(), ctx)) { + return null; + } + return exceptionArgument.expression(); + } + + private static boolean hasPytestMessageCheck(CallExpression callExpression) { + return TreeUtils.argumentByKeyword(PYTEST_MATCH, callExpression.arguments()) != null; + } + + private static boolean hasUnittestMessageCheck(CallExpression callExpression, SubscriptionContext ctx) { + return UNITTEST_ASSERT_RAISES_WITH_MESSAGE_CHECK_MATCHER.isTrueFor(callExpression.callee(), ctx); + } + + private static boolean isUnittestAssertRaises(CallExpression callExpression, SubscriptionContext ctx) { + return UNITTEST_ASSERT_RAISES_MATCHER.isTrueFor(callExpression.callee(), ctx); + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5958.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5958.html new file mode 100644 index 000000000..999167d12 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5958.html @@ -0,0 +1,122 @@ +

                            This is an issue when test code verifies that an exception was raised without checking its type or its message.

                            +

                            Why is this an issue?

                            +

                            Assertions are statements that check whether certain conditions are true. They validate that the actual results of a code snippet match the +expected outcomes. By using assertions, developers ensure their code behaves as intended and identify potential bugs or issues early in the +development process.

                            +

                            When testing exception handling, it is not sufficient to verify only that some exception was raised. Tests should also validate the +exception type or message to differentiate expected exceptions from unexpected ones.

                            +

                            Consider a function that should raise a ValueError when given invalid input. If your test only checks that an exception occurred, it +cannot distinguish between:

                            +
                              +
                            • The expected ValueError indicating proper input validation
                            • +
                            • An unexpected TypeError from a bug in the code
                            • +
                            • An unexpected AttributeError from a null reference error
                            • +
                            +

                            All three scenarios would make the test pass, even though two represent actual bugs.

                            +

                            In Python testing frameworks like pytest and unittest, several patterns can lead to insufficiently specific exception testing:

                            +
                              +
                            • Using pytest.raises(Exception) without specifying the exception type or checking the message
                            • +
                            • Using unittest.assertRaises(Exception) which catches any exception
                            • +
                            • Not validating the exception message when the same exception type could be raised for different reasons
                            • +
                            • Catching exceptions in try-except blocks without asserting on the caught exception
                            • +
                            +

                            These patterns create fragile tests that may pass for the wrong reasons, allowing bugs to slip through your test suite undetected.

                            +

                            What is the potential impact?

                            +

                            Tests that do not verify the exception type or message can:

                            +
                              +
                            • Miss bugs: Your tests may pass even when your code throws unexpected exceptions due to bugs
                            • +
                            • Reduce confidence: You cannot trust that your error handling works correctly
                            • +
                            • Hide breaking changes: Refactoring that changes exception types will not be caught by tests
                            • +
                            • Complicate debugging: When tests fail, you will not have clear information about what went wrong
                            • +
                            +

                            This weakens the safety net that your test suite provides and can lead to production issues that could have been caught during development.

                            +

                            How to fix it in pytest

                            +

                            Code examples

                            +

                            Noncompliant code example

                            +
                            +import pytest
                            +
                            +class InvalidConfigError(Exception):
                            +    def __init__(self, field, message):
                            +        self.field = field
                            +        super().__init__(message)
                            +
                            +def load_config(data):
                            +    if 'api_key' not in data:
                            +        raise InvalidConfigError('api_key', 'Missing required field')
                            +
                            +def test_missing_config():
                            +    with pytest.raises(Exception):  # Noncompliant: does not verify the type or the message
                            +        load_config({})
                            +
                            +

                            Compliant solution

                            +

                            With pytest, use pytest.raises() with a specific exception type instead of the generic Exception class, or use the +match parameter to validate the exception message using a regular expression pattern. You can also use both when appropriate.

                            +
                            +import pytest
                            +
                            +class InvalidConfigError(Exception):
                            +    def __init__(self, field, message):
                            +        self.field = field
                            +        super().__init__(message)
                            +
                            +def load_config(data):
                            +    if 'api_key' not in data:
                            +        raise InvalidConfigError('api_key', 'Missing required field')
                            +
                            +def test_missing_config():
                            +    with pytest.raises(InvalidConfigError) as exc_info:
                            +        load_config({})
                            +
                            +    assert exc_info.value.field == 'api_key'
                            +    assert 'Missing required field' in str(exc_info.value)
                            +
                            +    # or
                            +    with pytest.raises(Exception, match=r"Missing required field"):
                            +        load_config({})
                            +
                            +

                            How to fix it in unittest

                            +

                            With unittest, use assertRaises() with a specific exception type, or assertRaisesRegex() when you want to verify the +message as well. You can use either approach depending on what the test needs to verify.

                            +

                            Code examples

                            +

                            Noncompliant code example

                            +
                            +import unittest
                            +
                            +def parse_age(value):
                            +    age = int(value)
                            +    if age < 0:
                            +        raise ValueError("Age cannot be negative")
                            +    return age
                            +
                            +class TestAgeParser(unittest.TestCase):
                            +    def test_negative_age(self):
                            +        with self.assertRaises(Exception):  # Noncompliant: does not verify which exception
                            +            parse_age("-5")
                            +
                            +

                            Compliant solution

                            +
                            +import unittest
                            +
                            +def parse_age(value):
                            +    age = int(value)
                            +    if age < 0:
                            +        raise ValueError("Age cannot be negative")
                            +    return age
                            +
                            +class TestAgeParser(unittest.TestCase):
                            +    def test_negative_age(self):
                            +        with self.assertRaises(ValueError):
                            +            parse_age("-5")
                            +
                            +        # or
                            +        with self.assertRaisesRegex(Exception, r"Age cannot be negative"):
                            +            parse_age("-5")
                            +
                            +

                            Resources

                            +

                            Documentation

                            + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5958.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5958.json new file mode 100644 index 000000000..5cfd122ee --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5958.json @@ -0,0 +1,23 @@ +{ + "title": "Tests should check which exception is thrown", + "type": "CODE_SMELL", + "code": { + "impacts": { + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "TESTED" + }, + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "tests" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-5958", + "sqKey": "S5958", + "scope": "Tests", + "quickfix": "unknown" +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index e694941a3..a975714c8 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -161,6 +161,7 @@ "S5914", "S5915", "S5918", + "S5958", "S5994", "S5996", "S6001", diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/SpecificExceptionAssertionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/SpecificExceptionAssertionCheckTest.java new file mode 100644 index 000000000..3145b95ea --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/SpecificExceptionAssertionCheckTest.java @@ -0,0 +1,28 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import org.junit.jupiter.api.Test; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class SpecificExceptionAssertionCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/specificExceptionAssertion.py", new SpecificExceptionAssertionCheck()); + } +} diff --git a/python-checks/src/test/resources/checks/tests/specificExceptionAssertion.py b/python-checks/src/test/resources/checks/tests/specificExceptionAssertion.py new file mode 100644 index 000000000..aeffe614a --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/specificExceptionAssertion.py @@ -0,0 +1,141 @@ +import unittest + +import pytest +from pytest import raises as imported_raises + + +def explode(): + raise ValueError("bad value") + + +class CustomException(Exception): + pass + + +def raise_custom_exception(): + raise CustomException("custom") + + +class DummyContextManager: + def __enter__(self): + return self + + def __exit__(self, exc_type, exc, tb): + return False + + +dummy_context_manager = DummyContextManager() + + +def test_pytest_raises_exception(): + with pytest.raises(Exception): # Noncompliant {{Specify a more specific exception type here.}} +# ^^^^^^^^^ + explode() + + +def test_pytest_raises_base_exception(): + with pytest.raises(BaseException): # Noncompliant {{Specify a more specific exception type here.}} +# ^^^^^^^^^^^^^ + explode() + + +def test_pytest_raises_expected_exception_keyword(): + with pytest.raises(expected_exception=Exception): # Noncompliant {{Specify a more specific exception type here.}} +# ^^^^^^^^^ + explode() + + +def test_pytest_imported_raises(): + with imported_raises(Exception): # Noncompliant {{Specify a more specific exception type here.}} +# ^^^^^^^^^ + explode() + + +def test_pytest_raises_specific_exception(): + with pytest.raises(ValueError): + explode() + + +def test_pytest_raises_custom_exception(): + with pytest.raises(CustomException): + raise_custom_exception() + + +def test_pytest_raises_generic_exception_with_match(): + with pytest.raises(Exception, match="bad value"): + explode() + + +def test_pytest_direct_raises_exception(): + pytest.raises(Exception, explode) # Noncompliant {{Specify a more specific exception type here.}} +# ^^^^^^^^^ + + +def test_pytest_direct_imported_raises_exception(): + imported_raises(BaseException, explode) # Noncompliant {{Specify a more specific exception type here.}} +# ^^^^^^^^^^^^^ + + +def test_with_non_call_context_manager(): + with dummy_context_manager: + explode() + + +def test_raise_qualifier_named_helper_parameter(helper): + with helper.assertRaises(Exception): + explode() + + +def test_raise_qualifier_named_cls_parameter(cls): + with cls.assertRaises(Exception): + explode() + + +class MyTest(unittest.TestCase): + def test_unittest_assert_raises_exception(self): + with self.assertRaises(Exception): # Noncompliant {{Specify a more specific exception type here.}} +# ^^^^^^^^^ + explode() + + def test_unittest_assert_raises_base_exception(self): + with self.assertRaises(BaseException): # Noncompliant {{Specify a more specific exception type here.}} +# ^^^^^^^^^^^^^ + explode() + + def test_unittest_assert_raises_regex_exception(self): + with self.assertRaisesRegex(Exception, "bad"): + explode() + + def test_unittest_assert_raises_regexp_exception(self): + with self.assertRaisesRegexp(Exception, "bad"): + explode() + + def test_unittest_assert_raises_keyword_exception(self): + with self.assertRaisesRegex(exception=Exception, regex="bad"): + explode() + + def test_unittest_assert_raises_specific_exception(self): + with self.assertRaisesRegex(ValueError, "bad value"): + explode() + + def test_unittest_assert_raises_custom_exception(self): + with self.assertRaises(CustomException): + raise_custom_exception() + + def test_unittest_direct_assert_raises_exception(self): + self.assertRaises(Exception, explode) # Noncompliant {{Specify a more specific exception type here.}} +# ^^^^^^^^^ + + def test_unittest_direct_assert_raises_regex_exception(self): + self.assertRaisesRegex(Exception, "bad", explode) + + def test_unittest_direct_assert_raises_specific_exception(self): + self.assertRaises(ValueError, explode) + + def test_unittest_raise_qualifier_not_self(self): + with helper.assertRaises(Exception): + explode() + + def test_unittest_raise_qualifier_not_a_name(self): + with helper().assertRaises(Exception): + explode() From 9ac74b1abd99cfa6f87cfd20bcd63565762d4737 Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Fri, 26 Jun 2026 14:47:20 +0200 Subject: [PATCH 155/322] SONARPY-4300 Create rule S8904: BeautifulSoup elements should be checked for None before accessing (#1203) GitOrigin-RevId: a1c0e965f235f018ee7432b110fb1baa4471abdd --- .../python/checks/BeautifulSoupNoneCheck.java | 305 ++++++++++++++++ .../python/checks/OpenSourceCheckList.java | 3 +- .../org/sonar/l10n/py/rules/python/S8904.html | 179 ++++++++++ .../org/sonar/l10n/py/rules/python/S8904.json | 25 ++ .../py/rules/python/Sonar_way_profile.json | 1 + .../checks/BeautifulSoupNoneCheckTest.java | 31 ++ .../checks/beautifulSoupNoneCheck.py | 330 ++++++++++++++++++ 7 files changed, 873 insertions(+), 1 deletion(-) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/BeautifulSoupNoneCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8904.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8904.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/BeautifulSoupNoneCheckTest.java create mode 100644 python-checks/src/test/resources/checks/beautifulSoupNoneCheck.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/BeautifulSoupNoneCheck.java b/python-checks/src/main/java/org/sonar/python/checks/BeautifulSoupNoneCheck.java new file mode 100644 index 000000000..846708461 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/BeautifulSoupNoneCheck.java @@ -0,0 +1,305 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import java.util.List; +import java.util.Set; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.symbols.v2.SymbolV2; +import org.sonar.plugins.python.api.tree.AssertStatement; +import org.sonar.plugins.python.api.tree.AssignmentStatement; +import org.sonar.plugins.python.api.tree.ExceptClause; +import org.sonar.plugins.python.api.tree.TryStatement; +import org.sonar.plugins.python.api.tree.BinaryExpression; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.IfStatement; +import org.sonar.plugins.python.api.tree.IsExpression; +import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.QualifiedExpression; +import org.sonar.plugins.python.api.tree.StringLiteral; +import org.sonar.plugins.python.api.tree.SubscriptionExpression; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.tree.UnaryExpression; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.tree.TreeUtils; + +@Rule(key = "S8904") +public class BeautifulSoupNoneCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Check if this element exists before accessing it with `%s`."; + + private static TypeMatcher bs4Matcher(String suffix) { + return TypeMatchers.isType("bs4.element." + suffix); + } + + // Covers find/select_one (defined on Tag) and the find_* / find_parent methods (defined on PageElement) + private static final TypeMatcher IS_BS4_SEARCH_CALL = TypeMatchers.any( + bs4Matcher("Tag.find"), + bs4Matcher("Tag.select_one"), + bs4Matcher("PageElement.find_next"), + bs4Matcher("PageElement.find_previous"), + bs4Matcher("PageElement.find_next_sibling"), + bs4Matcher("PageElement.find_previous_sibling"), + bs4Matcher("PageElement.find_parent")); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.QUALIFIED_EXPR, BeautifulSoupNoneCheck::checkQualifiedExpr); + context.registerSyntaxNodeConsumer(Tree.Kind.SUBSCRIPTION, BeautifulSoupNoneCheck::checkSubscription); + } + + private static void checkQualifiedExpr(SubscriptionContext ctx) { + QualifiedExpression qe = (QualifiedExpression) ctx.syntaxNode(); + // When a QualifiedExpression is the callee of a BS4 search call (e.g. "soup.find"), + // skip it — unless its qualifier is itself a BS4 search call result (e.g. "soup.find("div").find"). + // The former is safe (soup is not None); the latter is unsafe (soup.find("div") may be None). + if (qe.parent() instanceof CallExpression callParent + && callParent.callee() == qe + && IS_BS4_SEARCH_CALL.isTrueFor(qe, ctx) + && !(qe.qualifier() instanceof CallExpression qualifierCall && isBS4SearchCall(qualifierCall, ctx))) { + return; + } + checkObjectAccess(qe.qualifier(), qe.name(), "." + qe.name().name(), ctx); + } + + private static void checkSubscription(SubscriptionContext ctx) { + SubscriptionExpression se = (SubscriptionExpression) ctx.syntaxNode(); + if (isAssignmentTarget(se)) { + return; + } + checkObjectAccess(se.object(), se, subscriptDescription(se), ctx); + } + + private static String subscriptDescription(SubscriptionExpression se) { + var subscripts = se.subscripts().expressions(); + if (subscripts.size() == 1 && subscripts.get(0) instanceof StringLiteral str) { + return String.format("[%s]", str.trimmedQuotesValue()); + } + return "[]"; + } + + private static void checkObjectAccess(Expression object, Tree issueLocation, String accessDescription, SubscriptionContext ctx) { + if (isInsideCatchingTry(issueLocation, ctx)) { + return; + } + // Case 1: direct inline chaining — the object is itself a BS4 search call. + // Only raise on the first unsafe access in a chain: skip if the object's own qualifier is + // already a BS4 search call (meaning an earlier issue was already raised for that access). + // e.g. soup.find("div").find("p").text — raise on the first find, not the second + if (object instanceof CallExpression callExpr && isBS4SearchCall(callExpr, ctx)) { + if (callExpr.callee() instanceof QualifiedExpression innerQe + && innerQe.qualifier() instanceof CallExpression innerQualifierCall + && isBS4SearchCall(innerQualifierCall, ctx)) { + return; + } + // Highlight the name of the call that produced the potentially-None object + // e.g. for soup.find("p").text → highlight "find"; for soup.find("div").find("p") → highlight the first "find" + Tree calleeNameLocation = callExpr.callee() instanceof QualifiedExpression calleeQe + ? calleeQe.name() + : issueLocation; + ctx.addIssue(calleeNameLocation, MESSAGE.formatted(accessDescription)); + return; + } + // Case 2: variable whose value at this location comes from a BS4 search call + if (object instanceof Name name) { + checkNameAccess(name, issueLocation, accessDescription, ctx); + } + } + + private static boolean isInsideCatchingTry(Tree tree, SubscriptionContext ctx) { + TryStatement enclosingTry = (TryStatement) TreeUtils.firstAncestorOfKind(tree, Tree.Kind.TRY_STMT); + return enclosingTry != null + && TreeUtils.hasDescendant(enclosingTry.body(), t -> t == tree) + && catchesAttributeError(enclosingTry.exceptClauses(), ctx); + } + + private static void checkNameAccess(Name name, Tree issueLocation, String accessDescription, SubscriptionContext ctx) { + Set values = ctx.valuesAtLocation(name); + if (values.isEmpty()) { + return; + } + boolean allBS4Calls = values.stream() + .allMatch(v -> v instanceof CallExpression callExpr && isBS4SearchCall(callExpr, ctx)); + if (!allBS4Calls) { + return; + } + if (isGuardedByNoneCheck(name)) { + return; + } + ctx.addIssue(issueLocation, MESSAGE.formatted(accessDescription)); + } + + private static boolean isBS4SearchCall(CallExpression callExpr, SubscriptionContext ctx) { + return IS_BS4_SEARCH_CALL.isTrueFor(callExpr.callee(), ctx); + } + + /** + * Returns true if the Name is guarded against None. Recognises three patterns: + * 1. Enclosing if-body guard: walks *all* enclosing IfStatements (not just the nearest) so that + * nested ifs inside a guard are covered. Conditions may include "and"-chains. + * e.g. "if name:", "if name is not None:", "if name != None:", "if name is not None and other:" + * 2. Early-exit guard: a preceding usage of the same symbol appears as the subject of an + * IfStatement that exits unconditionally (return/raise/continue/break) when the name is + * None or falsy: "if name is None: return" / "if not name: return" + * 3. Assert guard: a preceding assert statement whose condition matches conditionChecksForTruthy: + * "assert name" / "assert name is not None" + */ + private static boolean isGuardedByNoneCheck(Name name) { + // Pattern 1: walk all enclosing IfStatements, not just the nearest + Tree cursor = name.parent(); + while (cursor != null) { + if (cursor instanceof IfStatement ifStmt + && TreeUtils.hasDescendant(ifStmt.body(), t -> t == name) + && conditionChecksForTruthy(ifStmt.condition(), name)) { + return true; + } + cursor = cursor.parent(); + } + + SymbolV2 symbol = name.symbolV2(); + if (symbol == null) { + return false; + } + int nameLine = name.firstToken().line(); + + // Pattern 2: an earlier usage of the same symbol is guarded by an early-exit if-statement + if (symbol.usages().stream() + .filter(u -> u.tree().firstToken().line() < nameLine) + .map(u -> TreeUtils.firstAncestorOfKind(u.tree(), Tree.Kind.IF_STMT)) + .filter(IfStatement.class::isInstance) + .map(IfStatement.class::cast) + .anyMatch(ifStmt -> isEarlyExitNoneGuard(ifStmt, name))) { + return true; + } + + // Pattern 3: assert statement whose condition guards the name + return symbol.usages().stream() + .filter(u -> u.tree().firstToken().line() < nameLine) + .map(u -> TreeUtils.firstAncestorOfKind(u.tree(), Tree.Kind.ASSERT_STMT)) + .filter(AssertStatement.class::isInstance) + .map(AssertStatement.class::cast) + .anyMatch(assertStmt -> conditionChecksForTruthy(assertStmt.condition(), name)); + } + + private static final TypeMatcher IS_ATTRIBUTE_ERROR = + TypeMatchers.isOrExtendsType("builtins.AttributeError"); + + private static boolean catchesAttributeError(List exceptClauses, SubscriptionContext ctx) { + for (ExceptClause clause : exceptClauses) { + Expression exception = clause.exception(); + if (exception == null) { + // bare "except:" — too broad, do not suppress + return false; + } + // check each exception type in the clause (handles "except (AttributeError, TypeError):") + List caught = TreeUtils.flattenTuples(exception).toList(); + for (Expression expr : caught) { + if (IS_ATTRIBUTE_ERROR.isTrueFor(expr, ctx)) { + return true; + } + } + } + return false; + } + + /** + * Returns true if the if-statement exits unconditionally (return/raise/continue/break) and + * its condition tests the name for None or falsiness. + * Recognised conditions: "name is None", "not name", "name == None" + */ + private static boolean isEarlyExitNoneGuard(IfStatement ifStmt, Name name) { + var stmts = ifStmt.body().statements(); + if (stmts.isEmpty()) { + return false; + } + if (!stmts.get(stmts.size() - 1).is(Tree.Kind.RETURN_STMT, Tree.Kind.RAISE_STMT, Tree.Kind.CONTINUE_STMT, Tree.Kind.BREAK_STMT)) { + return false; + } + return conditionChecksForNoneOrFalsy(ifStmt.condition(), name); + } + + /** + * Checks if the condition tests the name for None or falsiness (the inverse of a positive guard). + * Recognised: "not name", "name is None", "name == None" + */ + private static boolean conditionChecksForNoneOrFalsy(Expression condition, Name name) { + // "if not element:" + if (condition instanceof UnaryExpression unary + && "not".equals(unary.operator().value()) + && nameMatchesExpressionName(name, unary.expression())) { + return true; + } + // "if element is None:" / "if None is element:" + if (condition instanceof IsExpression isExpr && isExpr.notToken() == null) { + return nameComparedToNone(name, isExpr.leftOperand(), isExpr.rightOperand()); + } + // "if element == None:" / "if None == element:" + if (condition instanceof BinaryExpression binaryExpr + && condition.is(Tree.Kind.COMPARISON) + && "==".equals(binaryExpr.operator().value())) { + return nameComparedToNone(name, binaryExpr.leftOperand(), binaryExpr.rightOperand()); + } + return false; + } + + private static boolean conditionChecksForTruthy(Expression condition, Name name) { + // "if element:" + if (nameMatchesExpressionName(name, condition)) { + return true; + } + // "if and other:" / "if other and :" — recurse into both operands of "and" + if (condition instanceof BinaryExpression andExpr + && condition.is(Tree.Kind.AND) + && (conditionChecksForTruthy(andExpr.leftOperand(), name) + || conditionChecksForTruthy(andExpr.rightOperand(), name))) { + return true; + } + // "if element is not None:" / "if None is not element:" + if (condition instanceof IsExpression isExpr && isExpr.notToken() != null) { + return nameComparedToNone(name, isExpr.leftOperand(), isExpr.rightOperand()); + } + // "if element != None:" / "if None != element:" + if (condition instanceof BinaryExpression binaryExpr + && condition.is(Tree.Kind.COMPARISON) + && "!=".equals(binaryExpr.operator().value())) { + return nameComparedToNone(name, binaryExpr.leftOperand(), binaryExpr.rightOperand()); + } + return false; + } + + /** Returns true if one operand is the name and the other is None (in either order). */ + private static boolean nameComparedToNone(Name name, Expression left, Expression right) { + return (nameMatchesExpressionName(name, left) && right.is(Tree.Kind.NONE)) + || (nameMatchesExpressionName(name, right) && left.is(Tree.Kind.NONE)); + } + + private static boolean nameMatchesExpressionName(Name name, Expression operand) { + return operand instanceof Name opName && opName.name().equals(name.name()); + } + + private static boolean isAssignmentTarget(SubscriptionExpression subscriptionExpression) { + return TreeUtils.firstAncestor(subscriptionExpression, + t -> t.is(Tree.Kind.ASSIGNMENT_STMT) + && ((AssignmentStatement) t).lhsExpressions().stream() + .flatMap(lhs -> lhs.expressions().stream()) + .anyMatch(expr -> expr.equals(subscriptionExpression))) != null; + } +} diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index f6fb497c0..c9a632be7 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -139,9 +139,10 @@ public Stream> getChecks() { AwsWaitersInsteadOfCustomPollingCheck.class, BackslashInStringCheck.class, BackticksUsageCheck.class, - BeautifulSoupParserCheck.class, BareRaiseInFinallyCheck.class, + BeautifulSoupParserCheck.class, BeautifulSoupRawHtmlInsertionCheck.class, + BeautifulSoupNoneCheck.class, BindToAllNetworkInterfacesCheck.class, BooleanExpressionInExceptCheck.class, BooleanCheckNotInvertedCheck.class, diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8904.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8904.html new file mode 100644 index 000000000..e8a9cd8d6 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8904.html @@ -0,0 +1,179 @@ +

                            This is an issue when accessing attributes, methods, or using subscript notation on HTML/XML parsing library search results without first verifying +the element exists.

                            +

                            This rule raises an issue when you access attributes, text content, or methods of BeautifulSoup elements without first checking if they exist.

                            +

                            BeautifulSoup’s search methods like find(), find_next(), and select_one() return None when they +cannot locate a matching element. If you try to access properties or methods on None, Python raises an AttributeError or +TypeError, causing your program to crash.

                            +

                            This commonly happens when:

                            +
                              +
                            • You assume an HTML element will always be present in the parsed content
                            • +
                            • You chain multiple find() calls without intermediate checks
                            • +
                            • You access element attributes using subscript notation (e.g., element['href'])
                            • +
                            • You access the .text, .string, or other properties directly after a search
                            • +
                            +

                            The following methods and access patterns can return None and are covered by this rule:

                            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            Method / AccessDescriptionReturns None when
                            +

                            find()

                            +
                            +

                            Searches descendants for the first tag or string matching the given criteria.

                            +
                            +

                            No matching element exists.

                            +
                            +

                            find_next()

                            +
                            +

                            Finds the first tag or string that follows the current element in document order matching the given criteria.

                            +
                            +

                            No matching element exists after the current position.

                            +
                            +

                            find_previous()

                            +
                            +

                            Finds the first tag or string that precedes the current element in document order matching the given criteria.

                            +
                            +

                            No matching element exists before the current position.

                            +
                            +

                            find_next_sibling()

                            +
                            +

                            Finds the first sibling tag after the current element matching the given criteria.

                            +
                            +

                            No matching sibling exists after the current element.

                            +
                            +

                            find_previous_sibling()

                            +
                            +

                            Finds the first sibling tag before the current element matching the given criteria.

                            +
                            +

                            No matching sibling exists before the current element.

                            +
                            +

                            find_parent()

                            +
                            +

                            Finds the first parent tag matching the given criteria by traversing upward in the tree.

                            +
                            +

                            No matching parent exists.

                            +
                            +

                            select_one()

                            +
                            +

                            Returns the first tag matching the given CSS selector.

                            +
                            +

                            No element matches the CSS selector.

                            +
                            +

                            Why is this an issue?

                            +

                            HTML and XML parsing libraries provide search methods to locate elements in parsed document trees. These search methods typically return a null or +none value when they cannot find a matching element, rather than throwing an exception. This is expected behavior because:

                            +
                              +
                            • HTML structures vary between pages and websites
                            • +
                            • Content may be dynamically loaded or conditionally present
                            • +
                            • Selectors might be incorrect or outdated
                            • +
                            • The page structure may change over time
                            • +
                            +

                            The problem occurs when code assumes an element will always be found and immediately accesses its properties or methods. Attempting to operate on a +null result causes runtime errors when:

                            +
                              +
                            • Accessing properties like text content, tag names, or other element attributes on null values
                            • +
                            • Using subscript or indexing operations to access element attributes on null values
                            • +
                            • Calling methods to navigate the document tree or retrieve information on null values
                            • +
                            • Chaining multiple search operations without intermediate null checks amplifies the risk
                            • +
                            +

                            These runtime errors cause the program to crash, often in production when encountering unexpected HTML structures. The errors can be difficult to +diagnose because they depend on the specific content being parsed, which may vary between:

                            +
                              +
                            • Different pages on the same website
                            • +
                            • The same page at different times
                            • +
                            • Different user sessions or geographic locations
                            • +
                            • Development versus production environments
                            • +
                            +

                            What is the potential impact?

                            +

                            When HTML/XML parser element references are accessed without null checks, the application crashes with null reference exceptions or type errors. +This has several consequences:

                            +
                              +
                            • Service disruption: Web scraping scripts fail mid-execution, leaving incomplete or corrupt data
                            • +
                            • Poor user experience: Applications that parse HTML for features crash unexpectedly
                            • +
                            • Difficult debugging: Errors only occur with specific HTML content, making them hard to reproduce
                            • +
                            • Data loss: Partially processed data may be lost when the program terminates
                            • +
                            • Maintenance burden: Developers must handle support requests and emergency fixes
                            • +
                            +

                            The impact is particularly severe in production web scraping pipelines, automated testing tools, and applications that process user-provided HTML +content.

                            +

                            How to fix it

                            +

                            Check if the element exists before accessing its attributes. Store the search result in a variable and verify it’s not None using a conditional +statement. This approach makes the code self-documenting and provides a clear place to handle missing elements.

                            +

                            Code examples

                            +

                            Noncompliant code example

                            +
                            +from bs4 import BeautifulSoup
                            +
                            +soup = BeautifulSoup(html_content, "html.parser")
                            +figure = soup.find("dd", class_="investment_sought").text  # Noncompliant
                            +print(figure)
                            +
                            +

                            Compliant solution

                            +
                            +from bs4 import BeautifulSoup
                            +
                            +soup = BeautifulSoup(html_content, "html.parser")
                            +element = soup.find("dd", class_="investment_sought")
                            +if element:
                            +    figure = element.text
                            +    print(figure)
                            +else:
                            +    print("Element not found")
                            +
                            +

                            Resources

                            +

                            Documentation

                            + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8904.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8904.json new file mode 100644 index 000000000..ba202b8bc --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8904.json @@ -0,0 +1,25 @@ +{ + "title": "BeautifulSoup elements should be checked for None before accessing", + "type": "BUG", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5 min" + }, + "tags": [ + "beautifulsoup", + "pitfall", + "web" + ], + "defaultSeverity": "Critical", + "ruleSpecification": "RSPEC-8904", + "sqKey": "S8904", + "scope": "All", + "quickfix": "unknown", + "code": { + "impacts": { + "RELIABILITY": "HIGH" + }, + "attribute": "COMPLETE" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index a975714c8..009239118 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -360,6 +360,7 @@ "S8900", "S8903", + "S8904", "S8905" ] } diff --git a/python-checks/src/test/java/org/sonar/python/checks/BeautifulSoupNoneCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/BeautifulSoupNoneCheckTest.java new file mode 100644 index 000000000..c648bd257 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/BeautifulSoupNoneCheckTest.java @@ -0,0 +1,31 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.junit.jupiter.api.Test; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class BeautifulSoupNoneCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify( + "src/test/resources/checks/beautifulSoupNoneCheck.py", + new BeautifulSoupNoneCheck() + ); + } +} diff --git a/python-checks/src/test/resources/checks/beautifulSoupNoneCheck.py b/python-checks/src/test/resources/checks/beautifulSoupNoneCheck.py new file mode 100644 index 000000000..1786886c6 --- /dev/null +++ b/python-checks/src/test/resources/checks/beautifulSoupNoneCheck.py @@ -0,0 +1,330 @@ +from bs4 import BeautifulSoup +from bs4.element import Tag + +html = "

                            Hello

                            link" + + +# --- Noncompliant: inline chaining on all 7 search methods --- + +def noncompliant_find_attr(): + soup = BeautifulSoup(html, "html.parser") + text = soup.find("p").text # Noncompliant {{Check if this element exists before accessing it with `.text`.}} + # ^^^^ + +def noncompliant_find_subscript(): + soup = BeautifulSoup(html, "html.parser") + cls = soup.find("a")["class"] # Noncompliant {{Check if this element exists before accessing it with `[class]`.}} + a = "access" + cls = soup.find("a")[a] # Noncompliant {{Check if this element exists before accessing it with `[]`.}} + + +def noncompliant_select_one_attr(): + soup = BeautifulSoup(html, "html.parser") + text = soup.select_one("p").text # Noncompliant + + +def noncompliant_find_next_attr(): + soup = BeautifulSoup(html, "html.parser") + text = soup.find_next("p").text # Noncompliant + + +def noncompliant_find_previous_attr(): + soup = BeautifulSoup(html, "html.parser") + text = soup.find_previous("p").text # Noncompliant + + +def noncompliant_find_next_sibling_attr(): + soup = BeautifulSoup(html, "html.parser") + text = soup.find_next_sibling("p").text # Noncompliant + + +def noncompliant_find_previous_sibling_attr(): + soup = BeautifulSoup(html, "html.parser") + text = soup.find_previous_sibling("p").text # Noncompliant + + +def noncompliant_find_parent_attr(): + soup = BeautifulSoup(html, "html.parser") + text = soup.find_parent("div").text # Noncompliant + + +# --- Noncompliant: method call on search result --- + +def noncompliant_method_call_inline(): + soup = BeautifulSoup(html, "html.parser") + text = soup.find("p").get_text() # Noncompliant + + +def noncompliant_method_call_variable(): + soup = BeautifulSoup(html, "html.parser") + element = soup.find("p") + text = element.get_text() # Noncompliant + + +# --- Noncompliant: chained BS4 search calls --- + +def noncompliant_chained_find(): + soup = BeautifulSoup(html, "html.parser") + text = soup.find("div").find("p").text # Noncompliant {{Check if this element exists before accessing it with `.find`.}} + # ^^^^ + + +def noncompliant_chained_find_no_attr(): + soup = BeautifulSoup(html, "html.parser") + inner = soup.find("div").find("p") # Noncompliant {{Check if this element exists before accessing it with `.find`.}} + # ^^^^ + + +def noncompliant_cond_without_return_stmt(cond): + soup = BeautifulSoup(html, "html.parser") + element = soup.find("p") + if not element: + pass + text = element.text # Noncompliant +# +# --- Noncompliant: "is not " is not a None-guard --- + +def noncompliant_is_not_non_none(other): + soup = BeautifulSoup(html, "html.parser") + element = soup.find("p") + if element is not other: + text = element.text # Noncompliant + + +# --- Noncompliant: variable assignment then unguarded access --- + +def noncompliant_variable_attr(): + soup = BeautifulSoup(html, "html.parser") + element = soup.find("p") + text = element.text # Noncompliant + # ^^^^ + +def noncompliant_variable_subscript(): + soup = BeautifulSoup(html, "html.parser") + element = soup.find("a") + cls = element["class"] # Noncompliant + # ^^^^^^^^^^^^^^^^ + +def noncompliant_variable_select_one(): + soup = BeautifulSoup(html, "html.parser") + element = soup.select_one("p") + text = element.text # Noncompliant + + +# --- Compliant: guarded with "if element is not None:" --- + +def compliant_is_not_none(): + soup = BeautifulSoup(html, "html.parser") + element = soup.find("p") + if element is not None: + text = element.text # Compliant + cls = element["class"] # Compliant + + +# --- Compliant: guarded with "if element:" --- + +def compliant_truthiness(): + soup = BeautifulSoup(html, "html.parser") + element = soup.find("p") + if element: + text = element.text # Compliant + + +# --- Compliant: nested if inside a None-guard --- + +def compliant_nested_if(): + soup = BeautifulSoup(html, "html.parser") + element = soup.find("p") + if element is not None: + if True: + text = element.text # Compliant + + +# --- Compliant: compound "and" condition (guard on left or right) --- + +def compliant_and_condition_guard_left(): + soup = BeautifulSoup(html, "html.parser") + element = soup.find("p") + if element is not None and True: + text = element.text # Compliant + + +def compliant_and_condition_guard_right(): + soup = BeautifulSoup(html, "html.parser") + element = soup.find("p") + if True and element is not None: + text = element.text # Compliant + + +# --- Compliant: guarded with "if element != None:" --- + +def compliant_not_equal_none(): + soup = BeautifulSoup(html, "html.parser") + element = soup.find("p") + if element != None: + text = element.text # Compliant + + +# --- Compliant: subscription as assignment target (write, not read) --- + +def compliant_subscription_assignment_target(): + soup = BeautifulSoup(html, "html.parser") + element = soup.find("p") + if element: + element["class"] = "active" # Compliant + + +# --- Compliant: early-return guard with "if element == None:" --- + +def compliant_early_return_equal_none(): + soup = BeautifulSoup(html, "html.parser") + element = soup.find("p") + if element == None: + return + text = element.text # Compliant + + +def compliant_early_return_none_equal(): + soup = BeautifulSoup(html, "html.parser") + element = soup.find("p") + if None == element: + return + text = element.text # Compliant + + +def compliant_early_return_none_is(): + soup = BeautifulSoup(html, "html.parser") + element = soup.find("p") + if None is element: + return + text = element.text # Compliant + + +# --- Compliant: early-return guard --- + +def compliant_early_return_is_none(): + soup = BeautifulSoup(html, "html.parser") + element = soup.find("p") + if element is None: + return + text = element.text # Compliant + + +def compliant_early_return_not(): + soup = BeautifulSoup(html, "html.parser") + element = soup.find("p") + if not element: + return + text = element.text # Compliant + + +# --- Compliant: "None != element" guard --- + +def compliant_none_not_equal(): + soup = BeautifulSoup(html, "html.parser") + element = soup.find("p") + if None != element: + text = element.text # Compliant + + +# --- Noncompliant: inverted guard (early-return on is-not-None leaves only None path) --- + +def noncompliant_early_return_is_not_none(): + soup = BeautifulSoup(html, "html.parser") + element = soup.find("p") + if element is not None: + return + text = element.text # Noncompliant + + +# --- Noncompliant: assert element is None (asserts None, then accesses) --- + +def noncompliant_assert_is_none(): + soup = BeautifulSoup(html, "html.parser") + element = soup.find("p") + assert element is None + text = element.text # Noncompliant + + +# --- Noncompliant: dynamic subscript ([] fallback description) --- + +def noncompliant_dynamic_subscript(): + soup = BeautifulSoup(html, "html.parser") + key = "class" + cls = soup.find("a")[key] # Noncompliant {{Check if this element exists before accessing it with `[]`.}} + + +# --- Compliant: unresolved name (valuesAtLocation returns empty) --- + +def compliant_unresolved_name(element): + # element is a parameter — valuesAtLocation returns empty, no issue raised + text = element.text # Compliant + + +# --- Compliant: assert guard --- + +def compliant_assert_truthy(): + soup = BeautifulSoup(html, "html.parser") + element = soup.find("p") + assert element + text = element.text # Compliant + + +def compliant_assert_is_not_none(): + soup = BeautifulSoup(html, "html.parser") + element = soup.find("p") + assert element is not None + text = element.text # Compliant + + +# --- Compliant: inline chaining inside try/except catching AttributeError --- + +def compliant_try_except_attribute_error(): + soup = BeautifulSoup(html, "html.parser") + try: + text = soup.find("p").text # Compliant + except AttributeError: + pass + + +def noncompliant_try_except_exception(): + soup = BeautifulSoup(html, "html.parser") + try: + text = soup.find("p").text # Noncompliant + except Exception: + pass + + +def noncompliant_try_except_bare(): + soup = BeautifulSoup(html, "html.parser") + try: + text = soup.find("p").text # Noncompliant + except: + pass + + +def compliant_try_except_tuple(): + soup = BeautifulSoup(html, "html.parser") + try: + text = soup.find("p").text # Compliant + except (AttributeError, TypeError): + pass + + +# --- Noncompliant: inline chaining inside try/except catching unrelated exception --- + +def noncompliant_try_except_unrelated(): + soup = BeautifulSoup(html, "html.parser") + try: + text = soup.find("p").text # Noncompliant + except ValueError: + pass + + +# --- Compliant: non-BS4 object --- + +def compliant_non_bs4(): + d = {"key": "value"} + val = d["key"] # Compliant + text = d.get("key") # Compliant + From 677bf514f06b552f25514fb5fa823962549de803 Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Fri, 26 Jun 2026 15:45:23 +0200 Subject: [PATCH 156/322] SONARPY-4303 : Port S5976 to python: Similar tests should be grouped in a single Parameterized test (#1206) GitOrigin-RevId: 1117f2a8a3500ab503f3c507563d7eb12f8e1b61 --- .../python/checks/OpenSourceCheckList.java | 2 + .../GroupSimilarTestsParameterizedCheck.java | 224 ++++++++++ .../org/sonar/l10n/py/rules/python/S5976.html | 122 ++++++ .../org/sonar/l10n/py/rules/python/S5976.json | 25 ++ .../py/rules/python/Sonar_way_profile.json | 2 +- ...oupSimilarTestsParameterizedCheckTest.java | 293 ++++++++++++++ .../empty_groupSimilarTestsParameterized.py | 1 + .../tests/groupSimilarTestsParameterized.py | 21 + .../groupSimilarTestsParameterized_test.py | 24 ++ .../test_groupSimilarTestsParameterized.py | 383 ++++++++++++++++++ 10 files changed, 1096 insertions(+), 1 deletion(-) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/tests/GroupSimilarTestsParameterizedCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5976.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5976.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/tests/GroupSimilarTestsParameterizedCheckTest.java create mode 100644 python-checks/src/test/resources/checks/tests/empty_groupSimilarTestsParameterized.py create mode 100644 python-checks/src/test/resources/checks/tests/groupSimilarTestsParameterized.py create mode 100644 python-checks/src/test/resources/checks/tests/groupSimilarTestsParameterized_test.py create mode 100644 python-checks/src/test/resources/checks/tests/test_groupSimilarTestsParameterized.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index c9a632be7..9ddd21f8c 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -96,6 +96,7 @@ import org.sonar.python.checks.tests.AssertOnTupleLiteralCheck; import org.sonar.python.checks.tests.DedicatedAssertionCheck; import org.sonar.python.checks.tests.DedicatedExceptionAssertionCheck; +import org.sonar.python.checks.tests.GroupSimilarTestsParameterizedCheck; import org.sonar.python.checks.tests.ImplicitlySkippedTestCheck; import org.sonar.python.checks.tests.NotDiscoverableTestMethodCheck; import org.sonar.python.checks.tests.SingleInvocationRuntimeExceptionCheck; @@ -264,6 +265,7 @@ public Stream> getChecks() { GraphQLDenialOfServiceCheck.class, GraphQLIntrospectionCheck.class, GroupByIteratorReuseCheck.class, + GroupSimilarTestsParameterizedCheck.class, GroupReplacementCheck.class, HardCodedCredentialsCheck.class, HardCodedCredentialsEntropyCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/GroupSimilarTestsParameterizedCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/GroupSimilarTestsParameterizedCheck.java new file mode 100644 index 000000000..a49d00143 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/GroupSimilarTestsParameterizedCheck.java @@ -0,0 +1,224 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.ClassDef; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.FileInput; +import org.sonar.plugins.python.api.tree.FunctionDef; +import org.sonar.plugins.python.api.tree.RaiseStatement; +import org.sonar.plugins.python.api.tree.Statement; +import org.sonar.plugins.python.api.tree.StatementList; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.tree.Tree.Kind; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.checks.utils.CheckUtils; +import org.sonar.python.tests.UnittestUtils; +import org.sonar.python.tree.TreeUtils; + +import javax.annotation.Nullable; + +@Rule(key = "S5976") +public class GroupSimilarTestsParameterizedCheck extends PythonSubscriptionCheck { + private static final String MESSAGE = "Group these similar tests into a single parameterized test."; + private static final int MIN_GROUP_SIZE = 3; + private static final int MAX_PARAMETER_COUNT = 3; + private static final TypeMatcher NOT_IMPLEMENTED_ERROR_MATCHER = TypeMatchers.any( + TypeMatchers.isType("builtins.NotImplementedError"), + TypeMatchers.isObjectInstanceOf("builtins.NotImplementedError")); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.FILE_INPUT, ctx -> checkFileInput(ctx, (FileInput) ctx.syntaxNode())); + } + + @Override + public CheckScope scope() { + return CheckScope.ALL; + } + + private static void checkFileInput(SubscriptionContext ctx, FileInput fileInput) { + var statements = fileInput.statements(); + if (statements == null) { + return; + } + checkStatementListRecursively(ctx, statements); + } + + private static void checkStatementListRecursively(SubscriptionContext ctx, StatementList statementList) { + checkStatementList(ctx, statementList); + for (Statement statement : statementList.statements()) { + if (statement instanceof ClassDef classDef) { + checkStatementListRecursively(ctx, classDef.body()); + } + } + } + + private static void checkStatementList(SubscriptionContext ctx, StatementList statementList) { + List testFunctions = statementList.statements().stream() + .filter(FunctionDef.class::isInstance) + .map(FunctionDef.class::cast) + .filter(functionDef -> isCandidateTestFunction(ctx, functionDef)) + .toList(); + + Set alreadyReported = new HashSet<>(); + for (int i = 0; i < testFunctions.size(); i++) { + FunctionDef anchor = testFunctions.get(i); + if (alreadyReported.contains(anchor)) { + continue; + } + + List similarFunctions = new ArrayList<>(); + similarFunctions.add(anchor); + for (int j = i + 1; j < testFunctions.size(); j++) { + FunctionDef candidate = testFunctions.get(j); + if (areSimilarTests(anchor, candidate)) { + similarFunctions.add(candidate); + } + } + + if (similarFunctions.size() >= MIN_GROUP_SIZE) { + var issue = ctx.addIssue(anchor.name(), MESSAGE); + similarFunctions.stream().skip(1).forEach(similarFunction -> issue.secondary(similarFunction.name(), "Similar test.")); + alreadyReported.addAll(similarFunctions); + } + } + } + + private static boolean isCandidateTestFunction(SubscriptionContext ctx, FunctionDef functionDef) { + return functionDef.name().name().startsWith("test") + && functionDef.decorators().isEmpty() + && !isPlaceholderTest(functionDef, ctx) + && (isPytestStyleTest(ctx, functionDef) || UnittestUtils.isWithinUnittestTestCase(functionDef)); + } + + private static boolean isPytestStyleTest(SubscriptionContext ctx, FunctionDef functionDef) { + String fileName = ctx.pythonFile().fileName(); + if (!(fileName.startsWith("test_") || fileName.endsWith("_test.py"))) { + return false; + } + ClassDef parentClass = CheckUtils.getParentClassDef(functionDef); + return parentClass == null || parentClass.name().name().startsWith("Test"); + } + + private static boolean isPlaceholderTest(FunctionDef functionDef, SubscriptionContext ctx) { + List statements = functionDef.body().statements(); + if (statements.size() != 1) { + return false; + } + Statement statement = statements.get(0); + return statement.is(Kind.PASS_STMT) || isNotImplementedErrorRaise(statement, ctx); + } + + private static boolean isNotImplementedErrorRaise(Statement statement, SubscriptionContext ctx) { + if (!(statement instanceof RaiseStatement raiseStatement) || raiseStatement.expressions().size() != 1) { + return false; + } + return isNotImplementedError(raiseStatement.expressions().get(0), ctx); + } + + private static boolean isNotImplementedError(Expression expression, SubscriptionContext ctx) { + return NOT_IMPLEMENTED_ERROR_MATCHER.isTrueFor(expression, ctx); + } + + private static boolean areSimilarTests(FunctionDef left, FunctionDef right) { + if (!sameNamePattern(left, right)) { + return false; + } + if (!sameTestKind(left, right)) { + return false; + } + if (!CheckUtils.areEquivalent(left.parameters(), right.parameters())) { + return false; + } + var differences = new DifferenceCounter(); + return differences.areSimilar(left.body(), right.body()); + } + + private static boolean sameTestKind(FunctionDef left, FunctionDef right) { + boolean leftUnittest = UnittestUtils.isWithinUnittestTestCase(left); + return leftUnittest == UnittestUtils.isWithinUnittestTestCase(right); + } + + private static boolean sameNamePattern(FunctionDef left, FunctionDef right) { + return normalizeName(left).equals(normalizeName(right)); + } + + private static String normalizeName(FunctionDef functionDef) { + String name = functionDef.name().name(); + int suffixStart = name.length(); + while (suffixStart > 0 && Character.isDigit(name.charAt(suffixStart - 1))) { + suffixStart--; + } + return name.substring(0, suffixStart); + } + + private static class DifferenceCounter { + private final Set differences = new HashSet<>(); + + private boolean areSimilar(@Nullable Tree left, @Nullable Tree right) { + if (left == right) { + return true; + } + if (left == null || right == null) { + return false; + } + if (left.getKind() != right.getKind() || left.children().size() != right.children().size()) { + return false; + } + if (left.children().isEmpty() && right.children().isEmpty()) { + return compareLeaves(left, right); + } + for (int i = 0; i < left.children().size(); i++) { + if (!areSimilar(left.children().get(i), right.children().get(i))) { + return false; + } + } + return true; + } + + private boolean compareLeaves(Tree left, Tree right) { + String leftValue = left.firstToken() == null ? null : left.firstToken().value(); + String rightValue = right.firstToken() == null ? null : right.firstToken().value(); + if ((leftValue == null && rightValue == null) || (leftValue != null && leftValue.equals(rightValue))) { + return true; + } + if (!isParameterizableLiteral(left) || !isParameterizableLiteral(right)) { + return false; + } + differences.add(new LiteralDifference(left.getKind(), leftValue, rightValue)); + return differences.size() <= MAX_PARAMETER_COUNT; + } + + private static boolean isParameterizableLiteral(Tree tree) { + Tree candidate = tree.parent() != null ? tree.parent() : tree; + return candidate.is(Kind.NUMERIC_LITERAL, Kind.STRING_LITERAL, Kind.STRING_ELEMENT, Kind.NONE) + || TreeUtils.isBooleanLiteral(candidate); + } + + private record LiteralDifference(Kind kind, @Nullable String leftValue, @Nullable String rightValue) { + } + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5976.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5976.html new file mode 100644 index 000000000..c46726354 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5976.html @@ -0,0 +1,122 @@ +

                            This is an issue when at least 3 test methods differ only by a few hardcoded values and could be refactored into a single parameterized test with +less than 4 parameters.

                            +

                            Why is this an issue?

                            +

                            When multiple test methods contain nearly identical logic but differ only in a few hardcoded values, they create unnecessary code duplication. This +duplication makes the test suite harder to maintain and increases the risk of introducing bugs.

                            +

                            Consider a scenario where you have three test methods that each verify a calculation with different input values. If you later discover a bug in +the test logic itself, you would need to fix it in three places instead of one. This redundancy is error-prone and wastes time.

                            +

                            Parameterized tests solve this problem by allowing you to write the test logic once and execute it multiple times with different input values. Most +modern testing frameworks, including pytest for Python, provide built-in support for parameterization.

                            +

                            This approach offers several benefits:

                            +
                              +
                            • Reduced code duplication: The test logic is written once, making it easier to understand and maintain.
                            • +
                            • Fewer bugs: Changes to test logic only need to be made in one place.
                            • +
                            • Better readability: The data-driven nature of parameterized tests makes it clear what variations are being tested.
                            • +
                            • Easier to extend: Adding new test cases becomes as simple as adding new parameter values.
                            • +
                            +

                            However, balance is important. If parameterizing tests makes them significantly more complex than the original versions, it may not be worth it. +The goal is to improve maintainability, not to force every similar test into a parameterized structure.

                            +

                            What is the potential impact?

                            +

                            Duplicated test methods lead to higher maintenance costs and increased likelihood of bugs. When test logic needs to be updated, developers must +remember to make identical changes across multiple methods, which is easy to forget.

                            +

                            This can result in inconsistent test coverage where some variations of a test are updated while others remain outdated. Such inconsistencies can +cause false positives or, worse, false negatives that let bugs slip through.

                            +

                            The impact on team productivity compounds over time as the test suite grows. More time is spent maintaining redundant code instead of writing new +tests or improving application code.

                            +

                            How to fix it in pytest

                            +

                            Use pytest’s @pytest.mark.parametrize decorator to combine similar tests into a single parameterized test. The decorator accepts a +string of parameter names and a list of tuples containing the values for each test case.

                            +

                            Code examples

                            +

                            Noncompliant code example

                            +
                            +import pytest
                            +
                            +class TestApp:
                            +    def test_not_null1(self):  # Noncompliant
                            +        setup_tax()
                            +        assert get_tax(1) is not None
                            +
                            +    def test_not_null2(self):
                            +        setup_tax()
                            +        assert get_tax(2) is not None
                            +
                            +    def test_not_null3(self):
                            +        setup_tax()
                            +        assert get_tax(3) is not None
                            +
                            +    def test_level1(self):  # Noncompliant
                            +        set_level(1)
                            +        run_game()
                            +        assert player_health() == 100
                            +
                            +    def test_level2(self):
                            +        set_level(2)
                            +        run_game()
                            +        assert player_health() == 200
                            +
                            +    def test_level3(self):
                            +        set_level(3)
                            +        run_game()
                            +        assert player_health() == 300
                            +
                            +

                            Compliant solution

                            +
                            +import pytest
                            +
                            +class TestApp:
                            +    @pytest.mark.parametrize("tax_id", [1, 2, 3])
                            +    def test_not_null(self, tax_id):
                            +        setup_tax()
                            +        assert get_tax(tax_id) is not None
                            +
                            +    @pytest.mark.parametrize("level,health", [
                            +        (1, 100),
                            +        (2, 200),
                            +        (3, 300),
                            +    ])
                            +    def test_levels(self, level, health):
                            +        set_level(level)
                            +        run_game()
                            +        assert player_health() == health
                            +
                            +

                            How to fix it in unittest

                            +

                            For unittest, you can use the parameterized library to achieve similar functionality. Install it with pip install +parameterized and use the @parameterized.expand decorator.

                            +

                            Code examples

                            +

                            Noncompliant code example

                            +
                            +import unittest
                            +
                            +class TestApp(unittest.TestCase):
                            +    def test_not_null1(self):  # Noncompliant
                            +        setup_tax()
                            +        self.assertIsNotNone(get_tax(1))
                            +
                            +    def test_not_null2(self):
                            +        setup_tax()
                            +        self.assertIsNotNone(get_tax(2))
                            +
                            +    def test_not_null3(self):
                            +        setup_tax()
                            +        self.assertIsNotNone(get_tax(3))
                            +
                            +

                            Compliant solution

                            +
                            +import unittest
                            +from parameterized import parameterized
                            +
                            +class TestApp(unittest.TestCase):
                            +    @parameterized.expand([1, 2, 3])
                            +    def test_not_null(self, tax_id):
                            +        setup_tax()
                            +        self.assertIsNotNone(get_tax(tax_id))
                            +
                            +

                            Resources

                            +

                            Documentation

                            + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5976.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5976.json new file mode 100644 index 000000000..8ac4091d6 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5976.json @@ -0,0 +1,25 @@ +{ + "title": "Similar tests should be grouped in a single Parameterized test", + "type": "CODE_SMELL", + "code": { + "impacts": { + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "CONVENTIONAL" + }, + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "10min" + }, + "tags": [ + "tests", + "bad-practice", + "clumsy" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-5976", + "sqKey": "S5976", + "scope": "Tests", + "quickfix": "unknown" +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 009239118..84a914d4f 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -162,6 +162,7 @@ "S5915", "S5918", "S5958", + "S5976", "S5994", "S5996", "S6001", @@ -357,7 +358,6 @@ "S8685", "S8714", "S8786", - "S8900", "S8903", "S8904", diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/GroupSimilarTestsParameterizedCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/GroupSimilarTestsParameterizedCheckTest.java new file mode 100644 index 000000000..12e906c41 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/GroupSimilarTestsParameterizedCheckTest.java @@ -0,0 +1,293 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.net.URI; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.junit.jupiter.api.Test; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.symbols.ClassSymbol; +import org.sonar.plugins.python.api.symbols.Symbol; +import org.sonar.plugins.python.api.tree.ClassDef; +import org.sonar.plugins.python.api.tree.FunctionDef; +import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.RaiseStatement; +import org.sonar.plugins.python.api.tree.Token; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class GroupSimilarTestsParameterizedCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/test_groupSimilarTestsParameterized.py", new GroupSimilarTestsParameterizedCheck()); + } + + @Test + void testNonTestFileName() { + PythonCheckVerifier.verifyNoIssue("src/test/resources/checks/tests/groupSimilarTestsParameterized.py", new GroupSimilarTestsParameterizedCheck()); + } + + @Test + void testUnderscoreTestSuffixFileName() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/groupSimilarTestsParameterized_test.py", new GroupSimilarTestsParameterizedCheck()); + } + + @Test + void testEmptyFile() { + PythonCheckVerifier.verifyNoIssue("src/test/resources/checks/tests/empty_groupSimilarTestsParameterized.py", new GroupSimilarTestsParameterizedCheck()); + } + + @Test + void scope() { + assertEquals(GroupSimilarTestsParameterizedCheck.CheckScope.ALL, new GroupSimilarTestsParameterizedCheck().scope()); + } + + @Test + void same_test_kind_can_differ_between_pytest_and_unittest() throws Exception { + FunctionDef unittestFunction = functionDef(unittestClassDef()); + FunctionDef pytestFunction = functionDef(null); + + assertFalse((boolean) invokePrivateStaticMethod("sameTestKind", new Class[] {FunctionDef.class, FunctionDef.class}, unittestFunction, pytestFunction)); + } + + @Test + void similar_tests_reject_mixed_test_kinds() throws Exception { + FunctionDef unittestFunction = functionDef("test_variant_1", unittestClassDef()); + FunctionDef pytestFunction = functionDef("test_variant_1", null); + + assertFalse((boolean) invokePrivateStaticMethod("areSimilarTests", new Class[] {FunctionDef.class, FunctionDef.class}, unittestFunction, pytestFunction)); + } + + @Test + void not_implemented_error_raise_rejects_raise_without_expression() throws Exception { + RaiseStatement bareRaise = proxy(RaiseStatement.class, Map.of("expressions", List.of())); + + assertFalse((boolean) invokePrivateStaticMethod("isNotImplementedErrorRaise", + new Class[] {org.sonar.plugins.python.api.tree.Statement.class, SubscriptionContext.class}, + bareRaise, dummySubscriptionContext())); + } + + @Test + void difference_counter_handles_defensive_null_paths() throws Exception { + Object counter = newDifferenceCounter(); + Method areSimilar = differenceCounterMethod("areSimilar", Tree.class, Tree.class); + + assertTrue((boolean) areSimilar.invoke(counter, null, null)); + + Tree tree = leaf(Tree.Kind.NAME, "value", null); + assertFalse((boolean) areSimilar.invoke(counter, tree, null)); + } + + @Test + void difference_counter_handles_leafs_without_tokens_or_parents() throws Exception { + Method areSimilar = differenceCounterMethod("areSimilar", Tree.class, Tree.class); + Method compareLeaves = differenceCounterMethod("compareLeaves", Tree.class, Tree.class); + + Tree leafWithoutToken1 = leaf(Tree.Kind.PASS_STMT, null, null); + Tree leafWithoutToken2 = leaf(Tree.Kind.PASS_STMT, null, null); + assertTrue((boolean) areSimilar.invoke(newDifferenceCounter(), leafWithoutToken1, leafWithoutToken2)); + + Tree nonParameterizableLeaf1 = leaf(Tree.Kind.PASS_STMT, "left", null); + Tree nonParameterizableLeaf2 = leaf(Tree.Kind.PASS_STMT, "right", null); + assertFalse((boolean) areSimilar.invoke(newDifferenceCounter(), nonParameterizableLeaf1, nonParameterizableLeaf2)); + + Tree parameterizableLeaf1 = leaf(Tree.Kind.NUMERIC_LITERAL, "1", null); + Tree parameterizableLeaf2 = leaf(Tree.Kind.NUMERIC_LITERAL, "2", null); + assertTrue((boolean) areSimilar.invoke(newDifferenceCounter(), parameterizableLeaf1, parameterizableLeaf2)); + + Tree leftNullTokenLeaf = leaf(Tree.Kind.PASS_STMT, null, null); + Tree rightTokenLeaf = leaf(Tree.Kind.PASS_STMT, "right", null); + assertFalse((boolean) compareLeaves.invoke(newDifferenceCounter(), leftNullTokenLeaf, rightTokenLeaf)); + + Tree rightNonParameterizableLeaf = leaf(Tree.Kind.PASS_STMT, "right", null); + assertFalse((boolean) compareLeaves.invoke(newDifferenceCounter(), parameterizableLeaf1, rightNonParameterizableLeaf)); + } + + @Test + void difference_counter_handles_left_null_and_nested_trees() throws Exception { + Method areSimilar = differenceCounterMethod("areSimilar", Tree.class, Tree.class); + + Tree tree = leaf(Tree.Kind.PASS_STMT, "value", null); + assertFalse((boolean) areSimilar.invoke(newDifferenceCounter(), null, tree)); + + Tree nestedLeft = tree(Tree.Kind.TUPLE, List.of(leaf(Tree.Kind.NUMERIC_LITERAL, "1", null))); + Tree nestedRight = tree(Tree.Kind.TUPLE, List.of(leaf(Tree.Kind.NUMERIC_LITERAL, "1", null))); + assertTrue((boolean) areSimilar.invoke(newDifferenceCounter(), nestedLeft, nestedRight)); + } + + private static Object newDifferenceCounter() throws Exception { + Constructor constructor = Class.forName("org.sonar.python.checks.tests.GroupSimilarTestsParameterizedCheck$DifferenceCounter").getDeclaredConstructor(); + constructor.setAccessible(true); + return constructor.newInstance(); + } + + private static Method differenceCounterMethod(String name, Class... parameterTypes) throws Exception { + Method method = Class.forName("org.sonar.python.checks.tests.GroupSimilarTestsParameterizedCheck$DifferenceCounter") + .getDeclaredMethod(name, parameterTypes); + method.setAccessible(true); + return method; + } + + private static Object invokePrivateStaticMethod(String name, Class[] parameterTypes, Object... arguments) throws Exception { + Method method = GroupSimilarTestsParameterizedCheck.class.getDeclaredMethod(name, parameterTypes); + method.setAccessible(true); + return method.invoke(null, arguments); + } + + private static ClassDef unittestClassDef() { + Symbol parentClass = proxy(Symbol.class, Map.of( + "fullyQualifiedName", "unittest.case.TestCase")); + + ClassSymbol classSymbol = proxy(ClassSymbol.class, Map.of( + "kind", Symbol.Kind.CLASS, + "superClasses", List.of(parentClass))); + + Map classNameConfig = new HashMap<>(); + classNameConfig.put("symbol", classSymbol); + classNameConfig.put("kind", Tree.Kind.NAME); + classNameConfig.put("children", List.of()); + classNameConfig.put("parent", null); + classNameConfig.put("firstToken", null); + Name className = proxy(Name.class, classNameConfig); + + Map classDefConfig = new HashMap<>(); + classDefConfig.put("kind", Tree.Kind.CLASSDEF); + classDefConfig.put("name", className); + classDefConfig.put("parent", null); + classDefConfig.put("children", List.of()); + classDefConfig.put("firstToken", null); + return proxy(ClassDef.class, classDefConfig); + } + + private static FunctionDef functionDef(Tree parent) { + return functionDef("test_variant", parent); + } + + private static FunctionDef functionDef(String name, Tree parent) { + Map nameConfig = new HashMap<>(); + nameConfig.put("kind", Tree.Kind.NAME); + nameConfig.put("name", name); + nameConfig.put("children", List.of()); + nameConfig.put("parent", null); + nameConfig.put("firstToken", null); + Name functionName = proxy(Name.class, nameConfig); + + Map functionConfig = new HashMap<>(); + functionConfig.put("kind", Tree.Kind.FUNCDEF); + functionConfig.put("name", functionName); + functionConfig.put("parent", parent); + functionConfig.put("children", List.of()); + functionConfig.put("firstToken", null); + functionConfig.put("parameters", null); + functionConfig.put("body", null); + return proxy(FunctionDef.class, functionConfig); + } + + private static Tree leaf(Tree.Kind kind, String tokenValue, Tree parent) { + Token token = tokenValue == null ? null : proxy(Token.class, Map.of("value", tokenValue)); + Map treeConfig = new HashMap<>(); + treeConfig.put("kind", kind); + treeConfig.put("children", List.of()); + treeConfig.put("parent", parent); + treeConfig.put("firstToken", token); + return proxy(Tree.class, treeConfig); + } + + private static Tree tree(Tree.Kind kind, List children) { + Map treeConfig = new HashMap<>(); + treeConfig.put("kind", kind); + treeConfig.put("children", children); + treeConfig.put("parent", null); + treeConfig.put("firstToken", null); + return proxy(Tree.class, treeConfig); + } + + private static SubscriptionContext dummySubscriptionContext() { + return proxy(SubscriptionContext.class, Map.of( + "pythonFile", new org.sonar.plugins.python.api.PythonFile() { + @Override + public String content() { + return ""; + } + + @Override + public String fileName() { + return "test_groupSimilarTestsParameterized.py"; + } + + @Override + public URI uri() { + return URI.create("file:///test_groupSimilarTestsParameterized.py"); + } + + @Override + public String key() { + return "test_groupSimilarTestsParameterized.py"; + } + })); + } + + @SuppressWarnings("unchecked") + private static T proxy(Class type, Map values) { + Map config = new HashMap<>(values); + return (T) Proxy.newProxyInstance(type.getClassLoader(), new Class[] {type}, (proxy, method, args) -> switch (method.getName()) { + case "getKind" -> config.get("kind"); + case "children" -> config.getOrDefault("children", List.of()); + case "parent" -> config.get("parent"); + case "firstToken" -> config.get("firstToken"); + case "name" -> config.get("name"); + case "parameters" -> config.get("parameters"); + case "body" -> config.get("body"); + case "symbol" -> config.get("symbol"); + case "kind" -> config.get("kind"); + case "superClasses" -> config.getOrDefault("superClasses", List.of()); + case "fullyQualifiedName" -> config.get("fullyQualifiedName"); + case "expressions" -> config.getOrDefault("expressions", List.of()); + case "pythonFile" -> config.get("pythonFile"); + case "value" -> config.get("value"); + case "is" -> Arrays.stream((Tree.Kind[]) args[0]).anyMatch(config.get("kind")::equals); + case "hashCode" -> System.identityHashCode(proxy); + case "equals" -> proxy == args[0]; + case "toString" -> type.getSimpleName() + config; + default -> defaultValue(method.getReturnType()); + }); + } + + private static Object defaultValue(Class returnType) { + if (!returnType.isPrimitive()) { + return null; + } + if (boolean.class.equals(returnType)) { + return false; + } + if (char.class.equals(returnType)) { + return '\0'; + } + return 0; + } +} diff --git a/python-checks/src/test/resources/checks/tests/empty_groupSimilarTestsParameterized.py b/python-checks/src/test/resources/checks/tests/empty_groupSimilarTestsParameterized.py new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/empty_groupSimilarTestsParameterized.py @@ -0,0 +1 @@ + diff --git a/python-checks/src/test/resources/checks/tests/groupSimilarTestsParameterized.py b/python-checks/src/test/resources/checks/tests/groupSimilarTestsParameterized.py new file mode 100644 index 000000000..36ccef15e --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/groupSimilarTestsParameterized.py @@ -0,0 +1,21 @@ +def setup_tax(): + pass + + +def get_tax(value): + return value + + +def test_not_null1(): + setup_tax() + assert get_tax(1) is not None + + +def test_not_null2(): + setup_tax() + assert get_tax(2) is not None + + +def test_not_null3(): + setup_tax() + assert get_tax(3) is not None diff --git a/python-checks/src/test/resources/checks/tests/groupSimilarTestsParameterized_test.py b/python-checks/src/test/resources/checks/tests/groupSimilarTestsParameterized_test.py new file mode 100644 index 000000000..c6f7e5afe --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/groupSimilarTestsParameterized_test.py @@ -0,0 +1,24 @@ +def setup_tax(): + pass + + +def get_tax(value): + return value + + +def test_not_null1(): # Noncompliant {{Group these similar tests into a single parameterized test.}} +# ^^^^^^^^^^^^^^ + setup_tax() + assert get_tax(1) is not None + + +def test_not_null2(): +# ^^^^^^^^^^^^^^< {{Similar test.}} + setup_tax() + assert get_tax(2) is not None + + +def test_not_null3(): +# ^^^^^^^^^^^^^^< {{Similar test.}} + setup_tax() + assert get_tax(3) is not None diff --git a/python-checks/src/test/resources/checks/tests/test_groupSimilarTestsParameterized.py b/python-checks/src/test/resources/checks/tests/test_groupSimilarTestsParameterized.py new file mode 100644 index 000000000..f1d66243a --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/test_groupSimilarTestsParameterized.py @@ -0,0 +1,383 @@ +import unittest + +import pytest +from parameterized import parameterized +from unittest.mock import patch + + +def setup_tax(): + pass + + +def get_tax(value): + return value + + +def set_level(level): + pass + + +def run_game(): + pass + + +def player_health(): + return 100 + + +decorators = [lambda func: func] + + +def test_not_null1(): # Noncompliant {{Group these similar tests into a single parameterized test.}} +# ^^^^^^^^^^^^^^ + setup_tax() + assert get_tax(1) is not None + + +def test_not_null2(): +# ^^^^^^^^^^^^^^< {{Similar test.}} + setup_tax() + assert get_tax(2) is not None + + +def test_not_null3(): +# ^^^^^^^^^^^^^^< {{Similar test.}} + setup_tax() + assert get_tax(3) is not None + + +class TestApp: + def test_level1(self): # Noncompliant {{Group these similar tests into a single parameterized test.}} +# ^^^^^^^^^^^ + set_level(1) + run_game() + assert player_health() == 100 + + def test_level2(self): +# ^^^^^^^^^^^< {{Similar test.}} + set_level(2) + run_game() + assert player_health() == 200 + + def test_level3(self): +# ^^^^^^^^^^^< {{Similar test.}} + set_level(3) + run_game() + assert player_health() == 300 + + +class TestUnittestApp(unittest.TestCase): + def test_user1(self): # Noncompliant {{Group these similar tests into a single parameterized test.}} +# ^^^^^^^^^^ + setup_tax() + self.assertIsNotNone(get_tax(1)) + + def test_user2(self): +# ^^^^^^^^^^< {{Similar test.}} + setup_tax() + self.assertIsNotNone(get_tax(2)) + + def test_user3(self): +# ^^^^^^^^^^< {{Similar test.}} + setup_tax() + self.assertIsNotNone(get_tax(3)) + + +@pytest.mark.parametrize("tax_id", [1, 2, 3]) +def test_already_parameterized(tax_id): + setup_tax() + assert get_tax(tax_id) is not None + + +class TestParameterized(unittest.TestCase): + @parameterized.expand([1, 2, 3]) + def test_parameterized(self, tax_id): + self.assertIsNotNone(get_tax(tax_id)) + + +@pytest.mark.slow +def test_decorated_but_not_parameterized(): + setup_tax() + assert get_tax(1) is not None + + +def test_only_two_cases_1(): + setup_tax() + assert get_tax(1) is not None + + +def test_only_two_cases_2(): + setup_tax() + assert get_tax(2) is not None + + +def test_too_many_differences_1(): + set_level(1) + run_game() + assert player_health() == 100 + + +def test_too_many_differences_2(): + set_level(2) + setup_tax() + assert player_health() == 200 + + +def test_too_many_differences_3(): + set_level(3) + assert get_tax(3) == 300 + + +@decorators[0] +def test_non_standard_decorator_expression(): + setup_tax() + assert get_tax(1) is not None + + +@patch("pkg.target") +def test_patched_tax1(mock_target): + setup_tax() + assert get_tax(1) is not None + + +@patch("pkg.target") +def test_patched_tax2(mock_target): + setup_tax() + assert get_tax(2) is not None + + +@patch("pkg.target") +def test_patched_tax3(mock_target): + setup_tax() + assert get_tax(3) is not None + + +class LegacySuite(unittest.TestCase): + def test_legacy_user1(self): # Noncompliant {{Group these similar tests into a single parameterized test.}} +# ^^^^^^^^^^^^^^^^^ + self.assertEqual(get_tax(True), True) + + def test_legacy_user2(self): +# ^^^^^^^^^^^^^^^^^< {{Similar test.}} + self.assertEqual(get_tax(False), False) + + def test_legacy_user3(self): +# ^^^^^^^^^^^^^^^^^< {{Similar test.}} + self.assertEqual(get_tax(True), True) + + +def test_parameter_mismatch_1(user_id): + setup_tax() + assert get_tax(user_id) is not None + + +def test_parameter_mismatch_2(account_id): + setup_tax() + assert get_tax(account_id) is not None + + +def test_parameter_mismatch_3(customer_id): + setup_tax() + assert get_tax(customer_id) is not None + + +def test_call_with_different_arity_1(): + assert get_tax(1) == 1 + + +def test_call_with_different_arity_2(): + assert get_tax(1, 2) == 1 + + +def test_call_with_different_arity_3(): + assert get_tax(1, 2, 3) == 1 + + +def test_non_literal_leaf_difference_1(): + tax = 1 + assert get_tax(tax) is not None + + +def test_non_literal_leaf_difference_2(): + value = 1 + assert get_tax(value) is not None + + +def test_non_literal_leaf_difference_3(): + amount = 1 + assert get_tax(amount) is not None + + +def test_string_difference_1(): # Noncompliant {{Group these similar tests into a single parameterized test.}} +# ^^^^^^^^^^^^^^^^^^^^^^^^ + assert get_tax("alpha") is not None + + +def test_string_difference_2(): +# ^^^^^^^^^^^^^^^^^^^^^^^^< {{Similar test.}} + assert get_tax("beta") is not None + + +def test_string_difference_3(): +# ^^^^^^^^^^^^^^^^^^^^^^^^< {{Similar test.}} + assert get_tax("gamma") is not None + + +def test_literal_vs_non_literal_leaf_1(): + value = 1 + assert get_tax(1) == value + + +def test_literal_vs_non_literal_leaf_2(): + value = 1 + assert get_tax(account_id) == value + + +def test_return_variant_1(): + return + + +def test_return_variant_2(): + return 1 + + +def test_return_variant_3(): + return 2 + + +def test_raise_variant_1(): + raise ValueError("alpha") + + +def test_raise_variant_2(): + raise ValueError("alpha") from RuntimeError("cause") + + +def test_raise_variant_3(): + raise ValueError("beta") + + +def test_more_than_three_parameters_1(): + assert (1, "alpha", True, None) == (1, "alpha", True, None) + + +def test_more_than_three_parameters_2(): + assert (2, "beta", False, 1) == (2, "beta", False, 1) + + +def test_more_than_three_parameters_3(): + assert (3, "gamma", True, 2) == (3, "gamma", True, 2) + + +def test_more_than_three_literal_differences_1(): + assert get_tax(1) == ("alpha", True, None, 1) + + +def test_more_than_three_literal_differences_2(): + assert get_tax(2) == ("beta", False, 1, 2) + + +def test_more_than_three_literal_differences_3(): + assert get_tax(3) == ("gamma", True, 2, 3) + + +def test_repeated_parameter_difference_1(): # Noncompliant {{Group these similar tests into a single parameterized test.}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + assert (1, 1, 1, 1) == (1, 1, 1, 1) + + +def test_repeated_parameter_difference_2(): +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Similar test.}} + assert (2, 2, 2, 2) == (2, 2, 2, 2) + + +def test_repeated_parameter_difference_3(): +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Similar test.}} + assert (3, 3, 3, 3) == (3, 3, 3, 3) + + +def test_placeholder1(): + pass + + +def test_placeholder2(): + pass + + +def test_placeholder3(): + pass + + +def test_not_implemented_placeholder1(): + raise NotImplementedError + + +def test_not_implemented_placeholder2(): + raise NotImplementedError() + + +def test_not_implemented_placeholder3(): + raise NotImplementedError("todo") + + +@pytest.mark.xfail +def test_not_implemented1(): + raise NotImplementedError + + +@pytest.mark.xfail +def test_not_implemented2(): + raise NotImplementedError() + + +@pytest.mark.xfail +def test_not_implemented3(): + raise NotImplementedError("todo") + + +class HelperContainer: + def test_helper1(self): + setup_tax() + assert get_tax(1) is not None + + def test_helper2(self): + setup_tax() + assert get_tax(2) is not None + + def test_helper3(self): + setup_tax() + assert get_tax(3) is not None + + +class TestMixedKind(unittest.TestCase): + def test_mixed_kind_1(self): + setup_tax() + self.assertIsNotNone(get_tax(1)) + + +def test_mixed_kind_2(): + setup_tax() + assert get_tax(2) is not None + + +def test_mixed_kind_3(): + setup_tax() + assert get_tax(3) is not None + + +class TestNestedContainer: + class TestInner: + def test_nested_tax1(self): # Noncompliant {{Group these similar tests into a single parameterized test.}} +# ^^^^^^^^^^^^^^^^ + setup_tax() + assert get_tax(1) is not None + + def test_nested_tax2(self): +# ^^^^^^^^^^^^^^^^< {{Similar test.}} + setup_tax() + assert get_tax(2) is not None + + def test_nested_tax3(self): +# ^^^^^^^^^^^^^^^^< {{Similar test.}} + setup_tax() + assert get_tax(3) is not None From b470cb70bbdefe14b6873fd40aa31fa3b7bbdbdf Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Fri, 26 Jun 2026 16:43:53 +0200 Subject: [PATCH 157/322] SONARPY-4309: Create rule S8906: CSS selectors should be used when selecting elements with multiple required classes (#1214) Co-authored-by: Gitar GitOrigin-RevId: 7de3a7c192d816d0d7f025624d128a246ba3c4ee --- .../checks/BeautifulSoupClassListCheck.java | 145 ++++++++++++++++++ .../python/checks/OpenSourceCheckList.java | 5 +- .../org/sonar/l10n/py/rules/python/S8906.html | 71 +++++++++ .../org/sonar/l10n/py/rules/python/S8906.json | 25 +++ .../py/rules/python/Sonar_way_profile.json | 3 +- .../BeautifulSoupClassListCheckTest.java | 30 ++++ .../checks/beautifulSoupClassList.py | 80 ++++++++++ 7 files changed, 356 insertions(+), 3 deletions(-) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/BeautifulSoupClassListCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8906.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8906.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/BeautifulSoupClassListCheckTest.java create mode 100644 python-checks/src/test/resources/checks/beautifulSoupClassList.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/BeautifulSoupClassListCheck.java b/python-checks/src/main/java/org/sonar/python/checks/BeautifulSoupClassListCheck.java new file mode 100644 index 000000000..970b3bf6d --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/BeautifulSoupClassListCheck.java @@ -0,0 +1,145 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import java.util.Optional; +import java.util.Set; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.ListLiteral; +import org.sonar.plugins.python.api.tree.QualifiedExpression; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.tree.TreeUtils; + +@Rule(key = "S8906") +public class BeautifulSoupClassListCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE_TEMPLATE = "Use \"%s()\" with a chained CSS class selector instead."; + private static final String MESSAGE_SELECT_ONE = MESSAGE_TEMPLATE.formatted("select_one"); + private static final String MESSAGE_SELECT = MESSAGE_TEMPLATE.formatted("select"); + + + private static final TypeMatcher IS_BS4_PAGE_ELEMENT_INSTANCE = TypeMatchers.isObjectInstanceOf("bs4.element.PageElement"); + + private static TypeMatcher bs4Matcher(String suffix) { + return TypeMatchers.isType("bs4.element." + suffix); + } + + // Single-result methods: the correct CSS replacement is select_one(). + // Defined on Tag: find. Defined on PageElement: find_parent, find_next, find_next_sibling, find_previous, find_previous_sibling. + private static final TypeMatcher IS_BS4_SINGLE_RESULT_CALL = TypeMatchers.any( + bs4Matcher("Tag.find"), + bs4Matcher("PageElement.find_parent"), + bs4Matcher("PageElement.find_next"), + bs4Matcher("PageElement.find_next_sibling"), + bs4Matcher("PageElement.find_previous"), + bs4Matcher("PageElement.find_previous_sibling") + ); + + // List-returning methods: the correct CSS replacement is select(). + // Defined on Tag: find_all. Defined on PageElement: find_parents, find_all_next, find_next_siblings, find_all_previous, find_previous_siblings. + private static final TypeMatcher IS_BS4_LIST_RESULT_CALL = TypeMatchers.any( + bs4Matcher("Tag.find_all"), + bs4Matcher("PageElement.find_parents"), + bs4Matcher("PageElement.find_all_next"), + bs4Matcher("PageElement.find_next_siblings"), + bs4Matcher("PageElement.find_all_previous"), + bs4Matcher("PageElement.find_previous_siblings") + ); + + // Deprecated camelCase aliases; type inference cannot resolve them (they are simple assignments in the stubs). + // Instead we check: method name is in this set AND qualifier is a bs4.element.Tag instance. + // BeautifulSoup extends Tag, so isObjectInstanceOf("bs4.element.Tag") covers both. + private static final Set DEPRECATED_SINGLE_RESULT_NAMES = Set.of( + "findChild", + "findParent", + "findNext", + "findNextSibling", + "findPrevious", + "findPreviousSibling" + ); + + private static final Set DEPRECATED_LIST_RESULT_NAMES = Set.of( + "findAll", + "findChildren", + "findParents", + "findAllNext", + "findNextSiblings", + "findAllPrevious", + "findPreviousSiblings" + ); + + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, BeautifulSoupClassListCheck::checkCallExpression); + } + + private static void checkCallExpression(SubscriptionContext ctx) { + CallExpression call = (CallExpression) ctx.syntaxNode(); + RegularArgument classArg = TreeUtils.argumentByKeyword("class_", call.arguments()); + if (classArg == null || !classArg.expression().is(Tree.Kind.LIST_LITERAL)) { + return; + } + ListLiteral listLiteral = (ListLiteral) classArg.expression(); + if (listLiteral.elements().expressions().size() < 2) { + return; + } + messageForCall(call, ctx).ifPresent(message -> ctx.addIssue(classArg, message)); + } + + /** + * Returns the appropriate issue message if the call targets a bs4 search method, or empty otherwise. + * Single-result methods (find, find_parent, …) → MESSAGE_SELECT_ONE. + * List-returning methods (find_all, find_parents, …) → MESSAGE_SELECT. + */ + private static Optional messageForCall(CallExpression call, SubscriptionContext ctx) { + Expression callee = call.callee(); + // Path 1: modern snake_case methods — resolved via type inference + if (IS_BS4_SINGLE_RESULT_CALL.isTrueFor(callee, ctx)) { + return Optional.of(MESSAGE_SELECT_ONE); + } + if (IS_BS4_LIST_RESULT_CALL.isTrueFor(callee, ctx)) { + return Optional.of(MESSAGE_SELECT); + } + // Path 2: deprecated camelCase aliases — detected by method name + qualifier type + if (callee instanceof QualifiedExpression qualifiedExpression) { + return messageForDeprecatedAlias(qualifiedExpression, ctx); + } + return Optional.empty(); + } + + private static Optional messageForDeprecatedAlias(QualifiedExpression qualifiedExpression, SubscriptionContext ctx) { + String name = qualifiedExpression.name().name(); + if (!IS_BS4_PAGE_ELEMENT_INSTANCE.isTrueFor(qualifiedExpression.qualifier(), ctx)) { + return Optional.empty(); + } + if (DEPRECATED_SINGLE_RESULT_NAMES.contains(name)) { + return Optional.of(MESSAGE_SELECT_ONE); + } + if (DEPRECATED_LIST_RESULT_NAMES.contains(name)) { + return Optional.of(MESSAGE_SELECT); + } + return Optional.empty(); + } +} diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 9ddd21f8c..7d3ec31fc 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -141,6 +141,8 @@ public Stream> getChecks() { BackslashInStringCheck.class, BackticksUsageCheck.class, BareRaiseInFinallyCheck.class, + BeautifulSoupClassListCheck.class, + BeautifulSoupDeprecatedNamesCheck.class, BeautifulSoupParserCheck.class, BeautifulSoupRawHtmlInsertionCheck.class, BeautifulSoupNoneCheck.class, @@ -516,7 +518,6 @@ public Stream> getChecks() { WebEntryPointDecoratorCheck.class, DjangoModelStringFieldCheck.class, DjangoModelStrMethodCheck.class, - HardcodedCredentialsCallCheck.class, - BeautifulSoupDeprecatedNamesCheck.class); + HardcodedCredentialsCallCheck.class); } } diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8906.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8906.html new file mode 100644 index 000000000..1d7cecc85 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8906.html @@ -0,0 +1,71 @@ +

                            This rule raises an issue when a list of class names is passed to a parameter that filters HTML elements by CSS class and expect to match elements +that have ALL the specified classes.

                            +

                            In Python’s BeautifulSoup library, this specifically refers to the class_ parameter accepted by many search methods, including +find(), find_all(), find_parent(), find_parents(), find_next_sibling(), +find_next_siblings(), find_previous_sibling(), find_previous_siblings(), find_next(), +find_all_next(), find_previous(), and find_all_previous().

                            +

                            Why is this an issue?

                            +

                            In HTML parsing libraries, when you pass multiple class names to element selection methods that accept a list of classes, these methods often use +OR logic. This means they select elements that have ANY of the specified classes, not ALL of them.

                            +

                            This behavior is counter intuitive for developers familiar with CSS selectors, where chaining class selectors (like .A.B) means the +element must have both classes. The OR logic can lead to selecting more elements than intended, causing bugs in data extraction or processing.

                            +

                            For example, if you want to find all div elements with both class A and class B, passing both class names as +separate items in a list to the selection method will actually find all div elements with class A OR class B. +This includes:

                            +
                              +
                            • Elements with only class A
                            • +
                            • Elements with only class B
                            • +
                            • Elements with both classes A and B
                            • +
                            +

                            When you actually need elements with both classes, this leads to incorrect results.

                            +

                            In BeautifulSoup specifically, this occurs when using the class_ parameter with a list of class names in any of these methods. For +example: soup.find_all('div', class_=['A', 'B']) or soup.find('div', class_=['A', 'B']).

                            +

                            What is the potential impact?

                            +

                            Using selector methods with collections of criteria when the collection is treated with OR logic but you need AND logic can cause:

                            +
                              +
                            • Incorrect data extraction: Your code processes elements you didn’t intend to select, leading to wrong or contaminated + results.
                            • +
                            • Logic errors: Downstream code that expects specific element types may fail or behave unexpectedly.
                            • +
                            • Difficult debugging: The issue may not be immediately obvious, especially when testing with markup that happens to contain + elements matching your unintended selection criteria.
                            • +
                            +

                            How to fix it

                            +

                            If you need elements that have ALL of the specified classes, replace the class_ parameter list with the select() method +using chained CSS class selectors. Chain class selectors by placing them directly after each other with a dot prefix (e.g., .A.B).

                            +

                            If you actually need elements that have ANY of the specified classes (OR logic), use a comma-separated CSS selector instead (e.g., div.A, +div.B).

                            +

                            Code examples

                            +

                            Noncompliant code example

                            +
                            +from bs4 import BeautifulSoup
                            +
                            +soup = BeautifulSoup(html, 'html.parser')
                            +# Intending to select divs with both class A AND class B, but actually selects A OR B
                            +results = soup.find_all('div', class_=['A', 'B'])  # Noncompliant
                            +
                            +

                            Compliant solution

                            +

                            When you need elements that have all of the specified classes (AND logic):

                            +
                            +from bs4 import BeautifulSoup
                            +
                            +soup = BeautifulSoup(html, 'html.parser')
                            +# Selects divs with both class A AND class B
                            +results = soup.select('div.A.B')
                            +
                            +

                            When you actually need elements that have any of the specified classes (OR logic), use a comma-separated CSS selector:

                            +
                            +from bs4 import BeautifulSoup
                            +
                            +soup = BeautifulSoup(html, 'html.parser')
                            +# Selects divs with class A OR class B
                            +results = soup.select('div.A, div.B')
                            +
                            +

                            Resources

                            +

                            Documentation

                            + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8906.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8906.json new file mode 100644 index 000000000..fbff27d05 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8906.json @@ -0,0 +1,25 @@ +{ + "title": "CSS selectors should be used when selecting elements with multiple required classes", + "type": "BUG", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "pitfall", + "css", + "confusing" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-8906", + "sqKey": "S8906", + "scope": "All", + "quickfix": "unknown", + "code": { + "impacts": { + "RELIABILITY": "MEDIUM" + }, + "attribute": "LOGICAL" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 84a914d4f..cbc535c21 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -361,6 +361,7 @@ "S8900", "S8903", "S8904", - "S8905" + "S8905", + "S8906" ] } diff --git a/python-checks/src/test/java/org/sonar/python/checks/BeautifulSoupClassListCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/BeautifulSoupClassListCheckTest.java new file mode 100644 index 000000000..b71ba567a --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/BeautifulSoupClassListCheckTest.java @@ -0,0 +1,30 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.junit.jupiter.api.Test; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class BeautifulSoupClassListCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify( + "src/test/resources/checks/beautifulSoupClassList.py", + new BeautifulSoupClassListCheck()); + } +} diff --git a/python-checks/src/test/resources/checks/beautifulSoupClassList.py b/python-checks/src/test/resources/checks/beautifulSoupClassList.py new file mode 100644 index 000000000..8962dd6ec --- /dev/null +++ b/python-checks/src/test/resources/checks/beautifulSoupClassList.py @@ -0,0 +1,80 @@ +from bs4 import BeautifulSoup + +html = "
                            test
                            " +soup = BeautifulSoup(html, 'html.parser') + +# --- List-returning methods → "Use select()" --- + +result = soup.find_all('div', class_=['A', 'B']) # Noncompliant {{Use "select()" with a chained CSS class selector instead.}} +# ^^^^^^^^^^^^^^^^^ +result = soup.findAll('div', class_=['A', 'B']) # Noncompliant {{Use "select()" with a chained CSS class selector instead.}} +result = soup.find_all(class_=['A', 'B', 'C']) # Noncompliant {{Use "select()" with a chained CSS class selector instead.}} +result = soup.find_all('div', class_=['A', 'B', 'C']) # Noncompliant {{Use "select()" with a chained CSS class selector instead.}} +# ^^^^^^^^^^^^^^^^^^^^^^ +result = soup.findChildren('div', class_=['A', 'B']) # Noncompliant {{Use "select()" with a chained CSS class selector instead.}} + +result = soup.find_parents('div', class_=['A', 'B']) # Noncompliant {{Use "select()" with a chained CSS class selector instead.}} +result = soup.findParents('div', class_=['A', 'B']) # Noncompliant {{Use "select()" with a chained CSS class selector instead.}} + +result = soup.find_all_next('div', class_=['A', 'B']) # Noncompliant {{Use "select()" with a chained CSS class selector instead.}} +result = soup.findAllNext('div', class_=['A', 'B']) # Noncompliant {{Use "select()" with a chained CSS class selector instead.}} + +result = soup.find_next_siblings('div', class_=['A', 'B']) # Noncompliant {{Use "select()" with a chained CSS class selector instead.}} +result = soup.findNextSiblings('div', class_=['A', 'B']) # Noncompliant {{Use "select()" with a chained CSS class selector instead.}} + +result = soup.find_all_previous('div', class_=['A', 'B']) # Noncompliant {{Use "select()" with a chained CSS class selector instead.}} +result = soup.findAllPrevious('div', class_=['A', 'B']) # Noncompliant {{Use "select()" with a chained CSS class selector instead.}} + +result = soup.find_previous_siblings('div', class_=['A', 'B']) # Noncompliant {{Use "select()" with a chained CSS class selector instead.}} +result = soup.findPreviousSiblings('div', class_=['A', 'B']) # Noncompliant {{Use "select()" with a chained CSS class selector instead.}} + +# --- Single-result methods → "Use select_one()" --- + +result = soup.find('div', class_=['A', 'B']) # Noncompliant {{Use "select_one()" with a chained CSS class selector instead.}} +result = soup.findChild('div', class_=['A', 'B']) # Noncompliant {{Use "select_one()" with a chained CSS class selector instead.}} + +result = soup.find_parent('div', class_=['A', 'B']) # Noncompliant {{Use "select_one()" with a chained CSS class selector instead.}} +result = soup.findParent('div', class_=['A', 'B']) # Noncompliant {{Use "select_one()" with a chained CSS class selector instead.}} + +result = soup.find_next('div', class_=['A', 'B']) # Noncompliant {{Use "select_one()" with a chained CSS class selector instead.}} +result = soup.findNext('div', class_=['A', 'B']) # Noncompliant {{Use "select_one()" with a chained CSS class selector instead.}} + +result = soup.find_next_sibling('div', class_=['A', 'B']) # Noncompliant {{Use "select_one()" with a chained CSS class selector instead.}} +result = soup.findNextSibling('div', class_=['A', 'B']) # Noncompliant {{Use "select_one()" with a chained CSS class selector instead.}} + +result = soup.find_previous('div', class_=['A', 'B']) # Noncompliant {{Use "select_one()" with a chained CSS class selector instead.}} +result = soup.findPrevious('div', class_=['A', 'B']) # Noncompliant {{Use "select_one()" with a chained CSS class selector instead.}} + +result = soup.find_previous_sibling('div', class_=['A', 'B']) # Noncompliant {{Use "select_one()" with a chained CSS class selector instead.}} +result = soup.findPreviousSibling('div', class_=['A', 'B']) # Noncompliant {{Use "select_one()" with a chained CSS class selector instead.}} + +# Compliant: use CSS selector instead +result = soup.select('div.A.B') +result = soup.select_one('div.A.B') + +# Compliant: single class string +result = soup.find_all('div', class_='A') +result = soup.find('div', class_='A') +result = soup.find_parent('div', class_='A') +result = soup.find_next('div', class_='A') +result = soup.find_next_sibling('div', class_='A') +result = soup.find_previous('div', class_='A') +result = soup.find_previous_sibling('div', class_='A') + +# Compliant: single-element list (no ambiguity) +result = soup.find_all('div', class_=['A']) +result = soup.find('div', class_=['A']) + +# Compliant: no class_ argument +result = soup.find_all('div') +result = soup.find('div') +result = soup.find_all('div', other=['A', 'B']) + +def not_beautifulsoup(some_obj): + # Compliant: not a bs4 object + result = some_obj.find_all('div', class_=['A', 'B']) + result = some_obj.findAll('div', class_=['A', 'B']) + result = some_obj.find('div', class_=['A', 'B']) + result = some_obj.findChild('div', class_=['A', 'B']) + result = some_obj.find_parent('div', class_=['A', 'B']) + result = some_obj.findParent('div', class_=['A', 'B']) From 6ee1774cbdce89c0f87bd4b4a29920a6371f6493 Mon Sep 17 00:00:00 2001 From: Guillaume Dequenne Date: Fri, 26 Jun 2026 17:01:56 +0200 Subject: [PATCH 158/322] SONARPY-4294 Limit nosec directives to security rules (#1196) GitOrigin-RevId: 19cff809efb0cd4b3981decf10a095986c369152 --- .../projects/nosonar/nosec-project/main.py | 2 +- .../sonar/python/it/plugin/NoSonarTest.java | 8 +- python-commons/pom.xml | 4 + .../plugins/python/PythonExtensions.java | 2 + .../python/nosonar/NoSonarIssueFilter.java | 23 ++- .../nosonar/SecurityRuleKeyProvider.java | 163 +++++++++++++++++ .../plugins/python/PythonExtensionsTest.java | 4 +- .../nosonar/NoSonarIssueFilterTest.java | 46 +++-- .../nosonar/NoSonarLineInfoCollectorTest.java | 2 +- .../nosonar/SecurityRuleKeyProviderTest.java | 169 ++++++++++++++++++ .../l10n/py/rules/python/TestCodeSmell.json | 6 + .../py/rules/python/TestMalformedJson.json | 1 + .../l10n/py/rules/python/TestNoType.json | 4 + .../py/rules/python/TestVulnerability.json | 6 + .../python/api/nosonar/NoSonarInfoParser.java | 21 ++- .../python/api/nosonar/NoSonarLineInfo.java | 16 +- .../api/nosonar/NoSonarInfoParserTest.java | 22 ++- 17 files changed, 458 insertions(+), 41 deletions(-) create mode 100644 python-commons/src/main/java/org/sonar/plugins/python/nosonar/SecurityRuleKeyProvider.java create mode 100644 python-commons/src/test/java/org/sonar/plugins/python/nosonar/SecurityRuleKeyProviderTest.java create mode 100644 python-commons/src/test/resources/org/sonar/l10n/py/rules/python/TestCodeSmell.json create mode 100644 python-commons/src/test/resources/org/sonar/l10n/py/rules/python/TestMalformedJson.json create mode 100644 python-commons/src/test/resources/org/sonar/l10n/py/rules/python/TestNoType.json create mode 100644 python-commons/src/test/resources/org/sonar/l10n/py/rules/python/TestVulnerability.json diff --git a/its/plugin/it-python-plugin-test/projects/nosonar/nosec-project/main.py b/its/plugin/it-python-plugin-test/projects/nosonar/nosec-project/main.py index 58c099eaf..8789095fa 100644 --- a/its/plugin/it-python-plugin-test/projects/nosonar/nosec-project/main.py +++ b/its/plugin/it-python-plugin-test/projects/nosonar/nosec-project/main.py @@ -16,7 +16,7 @@ # Baseline: two S4423 + OneStatementPerLine all fire. ssl.SSLContext(ssl.PROTOCOL_TLSv1); ssl.SSLContext(ssl.PROTOCOL_TLSv1_1) -# Known FN: bare nosec silences a non-security rule on the same line. +# Bare nosec suppresses security rules but lets non-security rules (e.g. OneStatementPerLine) through. ssl.SSLContext(ssl.PROTOCOL_TLSv1); ssl.SSLContext(ssl.PROTOCOL_TLSv1_1) # nosec # Trailing directive on the last statement. diff --git a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/NoSonarTest.java b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/NoSonarTest.java index 3b5e59edd..365b3f08e 100644 --- a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/NoSonarTest.java +++ b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/NoSonarTest.java @@ -138,8 +138,8 @@ void test_nosec() { analyzeProject(createScanner(NO_SEC_PROJECT_KEY, "projects/nosonar/nosec-project")); IssueListAssert.assertThat(issues(NO_SEC_PROJECT_KEY)) - .hasSize(14) - // bare nosec suppresses everything on the line; S1309 still fires (whitelisted) + .hasSize(15) + // bare nosec suppresses security rules on the line; S1309 still fires (whitelisted) .containsIssue(4, "python:S4423") .doesNotContainIssue(5, "python:S4423") .containsIssue(5, "python:S1309") @@ -161,9 +161,9 @@ void test_nosec() { .containsIssue(17, "python:S4423") .containsIssue(17, "python:OneStatementPerLine") - // FN: bare nosec silences a non-security rule on the same line + // bare nosec suppresses security rules (S4423) but not non-security rules (OneStatementPerLine) .doesNotContainIssue(20, "python:S4423") - .doesNotContainIssue(20, "python:OneStatementPerLine") + .containsIssue(20, "python:OneStatementPerLine") .containsIssue(20, "python:S1309") // nosec at end of file diff --git a/python-commons/pom.xml b/python-commons/pom.xml index 6831b2ab7..69a62e435 100644 --- a/python-commons/pom.xml +++ b/python-commons/pom.xml @@ -38,6 +38,10 @@ python-checks ${project.version} + + com.google.code.gson + gson + org.sonarsource.analyzer-commons sonar-analyzer-commons diff --git a/python-commons/src/main/java/org/sonar/plugins/python/PythonExtensions.java b/python-commons/src/main/java/org/sonar/plugins/python/PythonExtensions.java index b035746a0..307e6f7dd 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/PythonExtensions.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/PythonExtensions.java @@ -41,6 +41,7 @@ import org.sonar.plugins.python.mypy.MypySensor; import org.sonar.plugins.python.nosonar.NoSonarIssueFilter; import org.sonar.plugins.python.nosonar.NoSonarLineInfoCollector; +import org.sonar.plugins.python.nosonar.SecurityRuleKeyProvider; import org.sonar.python.project.config.ProjectConfigurationBuilder; import org.sonar.plugins.python.pylint.PylintRulesDefinition; import org.sonar.plugins.python.pylint.PylintSensor; @@ -69,6 +70,7 @@ public static void addCommonExtensions(Plugin.Context context) { context.addExtensions( ProjectConfigurationBuilder.class, NoSonarLineInfoCollector.class, + SecurityRuleKeyProvider.class, NoSonarIssueFilter.class, buildPythonSuffix(), buildIpynbPythonSuffix(), diff --git a/python-commons/src/main/java/org/sonar/plugins/python/nosonar/NoSonarIssueFilter.java b/python-commons/src/main/java/org/sonar/plugins/python/nosonar/NoSonarIssueFilter.java index a79456c98..37db0a7db 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/nosonar/NoSonarIssueFilter.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/nosonar/NoSonarIssueFilter.java @@ -33,9 +33,11 @@ public class NoSonarIssueFilter implements IssueFilter { private static final Set WHITELISTED_RULES = Set.of("S1309", "NoSonar"); private final NoSonarLineInfoCollector noSonarLineInfoCollector; + private final SecurityRuleKeyProvider securityRuleKeyProvider; - public NoSonarIssueFilter(NoSonarLineInfoCollector noSonarLineInfoCollector) { + public NoSonarIssueFilter(NoSonarLineInfoCollector noSonarLineInfoCollector, SecurityRuleKeyProvider securityRuleKeyProvider) { this.noSonarLineInfoCollector = noSonarLineInfoCollector; + this.securityRuleKeyProvider = securityRuleKeyProvider; } @Override @@ -51,25 +53,28 @@ public boolean accept(FilterableIssue issue, IssueFilterChain chain) { String ruleId = issue.ruleKey().rule(); if(WHITELISTED_RULES.contains(ruleId)) { - LOG.debug("Rule {} cannot be filtered out as it is whitelisted (all whitelisted rules: {}) for component with key: {} on line: {}", - ruleId, + LOG.debug("Rule {} cannot be filtered out as it is whitelisted (all whitelisted rules: {}) for component with key: {} on line: {}", + ruleId, WHITELISTED_RULES, - issueComponentKey, + issueComponentKey, issueLine); // while whitelisted rules should never be filtered out, returning true here screws up the LITs plugin - return chain.accept(issue); + return chain.accept(issue); } - var isNotFilteredOutByNoSonar = noSonarLineInfo == null || - (!noSonarLineInfo.isSuppressedRuleKeysEmpty() && !noSonarLineInfo.suppressedRuleKeys().contains(ruleId)); - if (!isNotFilteredOutByNoSonar) { + var isSuppressedByNoSonar = noSonarLineInfo != null && ( + (noSonarLineInfo.isSuppressedRuleKeysEmpty() && !noSonarLineInfo.securityOnlySuppression()) + || noSonarLineInfo.suppressedRuleKeys().contains(ruleId) + || (noSonarLineInfo.securityOnlySuppression() && securityRuleKeyProvider.isSecurityRule(ruleId)) + ); + if (isSuppressedByNoSonar) { LOG.debug("Filtering out issue in the component with key: {} for rule: {} on line: {} based on the file NoSonar infos {}", issueComponentKey, issue.ruleKey().rule(), issueLine, noSonarLineInfos.values()); } - return isNotFilteredOutByNoSonar && chain.accept(issue); + return !isSuppressedByNoSonar && chain.accept(issue); } } diff --git a/python-commons/src/main/java/org/sonar/plugins/python/nosonar/SecurityRuleKeyProvider.java b/python-commons/src/main/java/org/sonar/plugins/python/nosonar/SecurityRuleKeyProvider.java new file mode 100644 index 000000000..c39f1b14e --- /dev/null +++ b/python-commons/src/main/java/org/sonar/plugins/python/nosonar/SecurityRuleKeyProvider.java @@ -0,0 +1,163 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.plugins.python.nosonar; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import java.io.File; +import java.io.IOException; +import java.net.JarURLConnection; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashSet; +import java.util.Set; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.sonar.api.scanner.ScannerSide; +import org.sonarsource.api.sonarlint.SonarLintSide; + +@ScannerSide +@SonarLintSide +public class SecurityRuleKeyProvider { + + private static final Logger LOG = LoggerFactory.getLogger(SecurityRuleKeyProvider.class); + + private static final String JSON_EXTENSION = ".json"; + + private static final String[] RULE_RESOURCE_DIRS = { + "org/sonar/l10n/py/rules/python/", + "com/sonar/l10n/py/rules/python/" + }; + + private final Set securityRuleKeys; + + public SecurityRuleKeyProvider() { + this(SecurityRuleKeyProvider.class.getClassLoader()); + } + + SecurityRuleKeyProvider(ClassLoader classLoader) { + securityRuleKeys = Collections.unmodifiableSet(loadSecurityRuleKeys(classLoader)); + } + + SecurityRuleKeyProvider(Set securityRuleKeys) { + this.securityRuleKeys = Collections.unmodifiableSet(new HashSet<>(securityRuleKeys)); + } + + public boolean isSecurityRule(String ruleKey) { + return securityRuleKeys.contains(ruleKey); + } + + private static Set loadSecurityRuleKeys(ClassLoader classLoader) { + var keys = new HashSet(); + for (var dir : RULE_RESOURCE_DIRS) { + try { + Enumeration resources = classLoader.getResources(dir); + while (resources.hasMoreElements()) { + scanDir(resources.nextElement(), keys); + } + } catch (IOException e) { + LOG.warn("Failed to scan security rule keys from classpath path: {}", dir, e); + } + } + LOG.debug("Loaded {} security rule key(s)", keys.size()); + return keys; + } + + private static void scanDir(URL dirUrl, Set keys) { + try { + if ("jar".equals(dirUrl.getProtocol())) { + scanJar(dirUrl, keys); + } else if ("file".equals(dirUrl.getProtocol())) { + scanFileDir(dirUrl, keys); + } + } catch (IOException | URISyntaxException | RuntimeException e) { + LOG.debug("Could not scan {} for security rule keys: {}", dirUrl, e.getMessage()); + } + } + + private static void scanJar(URL jarDirUrl, Set keys) throws IOException { + var urlConnection = jarDirUrl.openConnection(); + if (!(urlConnection instanceof JarURLConnection connection)) { + LOG.debug("Skipping jar URL {} — unexpected connection type: {}", jarDirUrl, urlConnection.getClass().getName()); + return; + } + var entryPrefix = connection.getEntryName(); + if (entryPrefix == null) { + LOG.debug("Skipping jar URL {} — no entry name", jarDirUrl); + return; + } + connection.setUseCaches(false); + try (var jar = connection.getJarFile()) { + var entries = jar.entries(); + while (entries.hasMoreElements()) { + var entry = entries.nextElement(); + if (!entry.isDirectory() && entry.getName().startsWith(entryPrefix)) { + var suffix = entry.getName().substring(entryPrefix.length()); + if (!suffix.contains("/") && suffix.endsWith(JSON_EXTENSION)) { + try (var is = jar.getInputStream(entry)) { + var json = new String(is.readAllBytes(), StandardCharsets.UTF_8); + if (isSecurityRuleJson(json)) { + keys.add(extractRuleKey(entry.getName())); + } + } + } + } + } + } + } + + private static void scanFileDir(URL dirUrl, Set keys) throws IOException, URISyntaxException { + var dir = new File(dirUrl.toURI()); + if (!dir.isDirectory()) { + return; + } + var jsonFiles = dir.listFiles((d, name) -> name.endsWith(JSON_EXTENSION)); + if (jsonFiles == null) { + return; + } + for (var jsonFile : jsonFiles) { + var json = Files.readString(jsonFile.toPath(), StandardCharsets.UTF_8); + if (isSecurityRuleJson(json)) { + keys.add(extractRuleKey(jsonFile.getName())); + } + } + } + + private static boolean isSecurityRuleJson(String json) { + try { + JsonObject obj = JsonParser.parseString(json).getAsJsonObject(); + var typeElement = obj.get("type"); + if (typeElement == null) { + return false; + } + var type = typeElement.getAsString(); + return "VULNERABILITY".equals(type); + } catch (Exception e) { + return false; + } + } + + private static String extractRuleKey(String pathOrName) { + var lastSlash = pathOrName.lastIndexOf('/'); + var filename = lastSlash >= 0 ? pathOrName.substring(lastSlash + 1) : pathOrName; + return filename.substring(0, filename.length() - JSON_EXTENSION.length()); + } +} diff --git a/python-commons/src/test/java/org/sonar/plugins/python/PythonExtensionsTest.java b/python-commons/src/test/java/org/sonar/plugins/python/PythonExtensionsTest.java index e9eab83ed..09f5ef2af 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/PythonExtensionsTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/PythonExtensionsTest.java @@ -43,10 +43,10 @@ class PythonExtensionsTest { void testGetExtensions() { Version v79 = Version.create(7, 9); SonarRuntime runtime = SonarRuntimeImpl.forSonarQube(v79, SonarQubeSide.SERVER, SonarEdition.DEVELOPER); - assertThat(extensions(runtime)).hasSize(45); + assertThat(extensions(runtime)).hasSize(46); assertThat(extensions(runtime)).contains(AnalysisWarningsWrapper.class); assertThat(extensions(SonarRuntimeImpl.forSonarLint(v79))) - .hasSize(25) + .hasSize(26) .contains(SonarLintCache.class); } diff --git a/python-commons/src/test/java/org/sonar/plugins/python/nosonar/NoSonarIssueFilterTest.java b/python-commons/src/test/java/org/sonar/plugins/python/nosonar/NoSonarIssueFilterTest.java index 793ce0cfb..81b4ecafa 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/nosonar/NoSonarIssueFilterTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/nosonar/NoSonarIssueFilterTest.java @@ -31,7 +31,9 @@ import org.sonar.plugins.python.api.nosonar.NoSonarLineInfo; class NoSonarIssueFilterTest { - + + private static final Set SECURITY_RULES = Set.of("S4423"); + @ParameterizedTest @MethodSource("provideFilterParameters") void test(Map noSonarInfos, String ruleKey, @Nullable Integer line, boolean filterChainAcceptResult, boolean expectedResult) { @@ -41,7 +43,8 @@ void test(Map noSonarInfos, String ruleKey, @Nullable var collector = Mockito.mock(NoSonarLineInfoCollector.class); Mockito.when(collector.get(componentKey)) .thenReturn(noSonarInfos); - var filter = new NoSonarIssueFilter(collector); + + var filter = new NoSonarIssueFilter(collector, new SecurityRuleKeyProvider(SECURITY_RULES)); var issue = Mockito.mock(FilterableIssue.class); Mockito.when(issue.componentKey()).thenReturn(componentKey); @@ -58,31 +61,50 @@ void test(Map noSonarInfos, String ruleKey, @Nullable } private static Stream provideFilterParameters() { + return Stream.concat( + provideBaseFilterParameters(), + provideSecurityOnlySuppressionParameters() + ); + } + + private static Stream provideBaseFilterParameters() { return Stream.of( + // explicit key suppression: suppress matching rule Arguments.of(Map.of(1, new NoSonarLineInfo(Set.of("my_rule"))), "my_rule", 1, true, false), + // bare NOSONAR/noqa (securityOnlySuppression=false): suppress all Arguments.of(Map.of(1, new NoSonarLineInfo(Set.of())), "my_rule", 1, true, false), Arguments.of(Map.of(1, new NoSonarLineInfo(Set.of())), "my_rule", 1, false, false), + // explicit key suppression: different rule, not suppressed Arguments.of(Map.of(1, new NoSonarLineInfo(Set.of("other_rule"))), "my_rule", 1, true, true), + // suppression on different line: not suppressed Arguments.of(Map.of(2, new NoSonarLineInfo(Set.of("my_rule"))), "my_rule", 1, true, true), + // issue has no line: never suppressed Arguments.of(Map.of(1, new NoSonarLineInfo(Set.of("my_rule"))), "my_rule", null, true, true), + // different rule on same line with chain rejecting: chain result propagates Arguments.of(Map.of(1, new NoSonarLineInfo(Set.of("other_rule"))), "my_rule", 1, false, false), + // S1309 is whitelisted — never suppressed by explicit key Arguments.of(Map.of(1, new NoSonarLineInfo(Set.of("S1309"))), "S1309", 1, true, true), Arguments.of(Map.of(1, new NoSonarLineInfo(Set.of("S1309"))), "S1309", 1, false, false), + // no suppression comment: chain decides Arguments.of(Map.of(), "my_rule", 1, false, false) ); } - // Known FN of `# nosec` handling: a bare `# nosec` suppresses every rule on the line, even non-security ones. - @ParameterizedTest - @MethodSource("provideNoSecFalseNegativeParameters") - void noSecFalseNegativeTest(Map noSonarInfos, String ruleKey, int line, boolean filterChainAcceptResult, boolean expectedResult) { - test(noSonarInfos, ruleKey, line, filterChainAcceptResult, expectedResult); - } - - private static Stream provideNoSecFalseNegativeParameters() { + private static Stream provideSecurityOnlySuppressionParameters() { return Stream.of( - // FN: bare `# nosec` silences a non-security rule (e.g. S1481 unused local). - Arguments.of(Map.of(1, new NoSonarLineInfo(Set.of(), "")), "S1481", 1, true, false) + // bare nosec: suppresses security rule S4423 + Arguments.of(Map.of(1, NoSonarLineInfo.securityOnly()), "S4423", 1, true, false), + // bare nosec: does NOT suppress non-security rule + Arguments.of(Map.of(1, NoSonarLineInfo.securityOnly()), "my_rule", 1, true, true), + // bare nosec: S1309 is whitelisted, chain decides regardless + Arguments.of(Map.of(1, NoSonarLineInfo.securityOnly()), "S1309", 1, true, true), + Arguments.of(Map.of(1, NoSonarLineInfo.securityOnly()), "S1309", 1, false, false), + // mixed: explicit key + nosec — explicit key is suppressed + Arguments.of(Map.of(1, new NoSonarLineInfo(Set.of("E501"), "", true)), "E501", 1, true, false), + // mixed: explicit key + nosec — security rule is also suppressed + Arguments.of(Map.of(1, new NoSonarLineInfo(Set.of("E501"), "", true)), "S4423", 1, true, false), + // mixed: explicit key + nosec — non-security rule not in keys is NOT suppressed + Arguments.of(Map.of(1, new NoSonarLineInfo(Set.of("E501"), "", true)), "my_rule", 1, true, true) ); } } diff --git a/python-commons/src/test/java/org/sonar/plugins/python/nosonar/NoSonarLineInfoCollectorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/nosonar/NoSonarLineInfoCollectorTest.java index 949e76dcd..7fc670179 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/nosonar/NoSonarLineInfoCollectorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/nosonar/NoSonarLineInfoCollectorTest.java @@ -190,7 +190,7 @@ private static Stream provideCollectorParameters() { import hashlib hashlib.md5(b"x").hexdigest() # nosec """, - Map.of(2, new NoSonarLineInfo(Set.of(), "")), + Map.of(2, new NoSonarLineInfo(Set.of(), "", true)), Set.of(2), "", "" diff --git a/python-commons/src/test/java/org/sonar/plugins/python/nosonar/SecurityRuleKeyProviderTest.java b/python-commons/src/test/java/org/sonar/plugins/python/nosonar/SecurityRuleKeyProviderTest.java new file mode 100644 index 000000000..f90a90501 --- /dev/null +++ b/python-commons/src/test/java/org/sonar/plugins/python/nosonar/SecurityRuleKeyProviderTest.java @@ -0,0 +1,169 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.plugins.python.nosonar; + +import java.io.IOException; +import java.net.URL; +import java.net.URLClassLoader; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Collections; +import java.util.Enumeration; +import java.util.List; +import java.util.Map; +import java.util.jar.JarEntry; +import java.util.jar.JarOutputStream; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +class SecurityRuleKeyProviderTest { + + @Test + void test_loads_vulnerability_as_security() { + var provider = new SecurityRuleKeyProvider(); + Assertions.assertThat(provider.isSecurityRule("TestVulnerability")).isTrue(); + } + + @Test + void test_code_smell_is_not_security() { + var provider = new SecurityRuleKeyProvider(); + Assertions.assertThat(provider.isSecurityRule("TestCodeSmell")).isFalse(); + } + + @Test + void test_unknown_rule_is_not_security() { + var provider = new SecurityRuleKeyProvider(); + Assertions.assertThat(provider.isSecurityRule("S9999")).isFalse(); + Assertions.assertThat(provider.isSecurityRule("NonExistentRule")).isFalse(); + } + + @Test + void test_json_without_type_field_and_malformed_json_are_not_security() { + var provider = new SecurityRuleKeyProvider(); + Assertions.assertThat(provider.isSecurityRule("TestNoType")).isFalse(); + Assertions.assertThat(provider.isSecurityRule("TestMalformedJson")).isFalse(); + } + + @Test + void test_jar_url_with_null_entry_name_is_skipped() throws Exception { + var jarPath = createTempJar(Map.of( + "org/sonar/l10n/py/rules/python/", "", + "org/sonar/l10n/py/rules/python/JarVuln.json", "{\"type\": \"VULNERABILITY\"}" + )); + try { + // "jar:...!/" with nothing after the separator gives getEntryName() == null + var noEntryUrl = new URL("jar:" + jarPath.toUri() + "!/"); + ClassLoader loader = new ClassLoader(null) { + @Override + public Enumeration getResources(String name) { + return Collections.enumeration(List.of(noEntryUrl)); + } + }; + var provider = new SecurityRuleKeyProvider(loader); + Assertions.assertThat(provider.isSecurityRule("JarVuln")).isFalse(); + } finally { + Files.deleteIfExists(jarPath); + } + } + + @Test + void test_jar_without_directory_entry_yields_no_keys() throws Exception { + // JARs without an explicit directory entry for the rule path are not discovered — + // ClassLoader.getResources("dir/") requires a matching directory entry in the JAR. + var jarPath = createTempJar(Map.of( + "org/sonar/l10n/py/rules/python/JarVulnerability.json", "{\"type\": \"VULNERABILITY\"}" + )); + try { + try (var jarClassLoader = new URLClassLoader(new URL[]{jarPath.toUri().toURL()}, null)) { + var provider = new SecurityRuleKeyProvider(jarClassLoader); + Assertions.assertThat(provider.isSecurityRule("JarVulnerability")).isFalse(); + } + } finally { + Files.deleteIfExists(jarPath); + } + } + + @Test + void test_loads_from_jar_classpath() throws Exception { + var jarPath = createTempJar(Map.of( + "org/sonar/l10n/py/rules/python/", "", + "org/sonar/l10n/py/rules/python/JarVulnerability.json", "{\"type\": \"VULNERABILITY\"}", + "org/sonar/l10n/py/rules/python/JarCodeSmell.json", "{\"type\": \"CODE_SMELL\"}" + )); + try { + try (var jarClassLoader = new URLClassLoader(new URL[]{jarPath.toUri().toURL()}, null)) { + var provider = new SecurityRuleKeyProvider(jarClassLoader); + var urls = jarClassLoader.getResources("org/sonar/l10n/py/rules/python/"); + Assertions.assertThat(urls.nextElement().toString()).startsWith("jar:file:"); + Assertions.assertThat(provider.isSecurityRule("JarVulnerability")).isTrue(); + Assertions.assertThat(provider.isSecurityRule("JarCodeSmell")).isFalse(); + } + } finally { + Files.deleteIfExists(jarPath); + } + } + + @Test + void test_bad_jar_url_is_handled_gracefully() throws Exception { + // A jar: URL pointing to a non-existent JAR exercises the catch block in scanDir + var badJarUrl = new URL("jar:file:/nonexistent-path/missing.jar!/org/sonar/l10n/py/rules/python/"); + ClassLoader badLoader = new ClassLoader(null) { + @Override + public Enumeration getResources(String name) { + return Collections.enumeration(List.of(badJarUrl)); + } + }; + // Must not throw — error is logged at DEBUG and loading continues + var provider = new SecurityRuleKeyProvider(badLoader); + Assertions.assertThat(provider.isSecurityRule("anything")).isFalse(); + } + + @Test + void test_file_url_pointing_to_non_directory_is_skipped() throws Exception { + // A file: URL pointing to a regular file (not a directory) exercises the !isDirectory() early return + String tmpdir = System.getenv("TMPDIR"); + Path tmpBase = (tmpdir != null) ? Path.of(tmpdir) : Path.of(System.getProperty("java.io.tmpdir")); + var plainFile = Files.createTempFile(tmpBase, "not-a-dir", ".json"); + try { + ClassLoader fileLoader = new ClassLoader(null) { + @Override + public Enumeration getResources(String name) throws IOException { + return Collections.enumeration(List.of(plainFile.toUri().toURL())); + } + }; + var provider = new SecurityRuleKeyProvider(fileLoader); + Assertions.assertThat(provider.isSecurityRule("anything")).isFalse(); + } finally { + Files.deleteIfExists(plainFile); + } + } + + private static Path createTempJar(Map entries) throws IOException { + String tmpdir = System.getenv("TMPDIR"); + Path tmpBase = (tmpdir != null) ? Path.of(tmpdir) : Path.of(System.getProperty("java.io.tmpdir")); + var jarPath = Files.createTempFile(tmpBase, "test-rules", ".jar"); + try (var jos = new JarOutputStream(Files.newOutputStream(jarPath))) { + for (var entry : entries.entrySet()) { + jos.putNextEntry(new JarEntry(entry.getKey())); + jos.write(entry.getValue().getBytes(StandardCharsets.UTF_8)); + jos.closeEntry(); + } + } + return jarPath; + } +} diff --git a/python-commons/src/test/resources/org/sonar/l10n/py/rules/python/TestCodeSmell.json b/python-commons/src/test/resources/org/sonar/l10n/py/rules/python/TestCodeSmell.json new file mode 100644 index 000000000..909cd6312 --- /dev/null +++ b/python-commons/src/test/resources/org/sonar/l10n/py/rules/python/TestCodeSmell.json @@ -0,0 +1,6 @@ +{ + "title": "Test code smell rule", + "type": "CODE_SMELL", + "status": "ready", + "defaultSeverity": "Minor" +} diff --git a/python-commons/src/test/resources/org/sonar/l10n/py/rules/python/TestMalformedJson.json b/python-commons/src/test/resources/org/sonar/l10n/py/rules/python/TestMalformedJson.json new file mode 100644 index 000000000..7b1b3603a --- /dev/null +++ b/python-commons/src/test/resources/org/sonar/l10n/py/rules/python/TestMalformedJson.json @@ -0,0 +1 @@ +not valid json {{{ diff --git a/python-commons/src/test/resources/org/sonar/l10n/py/rules/python/TestNoType.json b/python-commons/src/test/resources/org/sonar/l10n/py/rules/python/TestNoType.json new file mode 100644 index 000000000..4461ce2c6 --- /dev/null +++ b/python-commons/src/test/resources/org/sonar/l10n/py/rules/python/TestNoType.json @@ -0,0 +1,4 @@ +{ + "title": "Test rule with no type field", + "status": "ready" +} diff --git a/python-commons/src/test/resources/org/sonar/l10n/py/rules/python/TestVulnerability.json b/python-commons/src/test/resources/org/sonar/l10n/py/rules/python/TestVulnerability.json new file mode 100644 index 000000000..716ea68ce --- /dev/null +++ b/python-commons/src/test/resources/org/sonar/l10n/py/rules/python/TestVulnerability.json @@ -0,0 +1,6 @@ +{ + "title": "Test vulnerability rule", + "type": "VULNERABILITY", + "status": "ready", + "defaultSeverity": "Critical" +} diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/nosonar/NoSonarInfoParser.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/nosonar/NoSonarInfoParser.java index 954799d53..507f884a5 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/nosonar/NoSonarInfoParser.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/nosonar/NoSonarInfoParser.java @@ -118,25 +118,35 @@ public static boolean isValidNoSec(String commentLine) { public Optional parse(String commentLine) { var rules = new HashSet(); - StringBuilder concatenatedCommentBuilder = new StringBuilder(); + var concatenatedCommentBuilder = new StringBuilder(); + var hasSecurityOnlyNosec = false; var comments = splitInlineComments(commentLine); for (var comment : comments) { var noSonarLineInfo = parseComment(comment); if (noSonarLineInfo != null) { - if (noSonarLineInfo.isSuppressedRuleKeysEmpty()) { + if (noSonarLineInfo.isSuppressedRuleKeysEmpty() && !noSonarLineInfo.securityOnlySuppression()) { + // bare NOSONAR or bare noqa → suppress all rules on this line return Optional.of(noSonarLineInfo); + } else if (noSonarLineInfo.securityOnlySuppression() && noSonarLineInfo.isSuppressedRuleKeysEmpty()) { + // bare nosec → security-only suppression; continue to process remaining comments + hasSecurityOnlyNosec = true; + concatenatedCommentBuilder.append(noSonarLineInfo.comment()); + } else { + rules.addAll(noSonarLineInfo.suppressedRuleKeys()); + concatenatedCommentBuilder.append(noSonarLineInfo.comment()); } - rules.addAll(noSonarLineInfo.suppressedRuleKeys()); - concatenatedCommentBuilder.append(noSonarLineInfo.comment()); } else { concatenatedCommentBuilder.append(comment.strip()); } } if (rules.isEmpty()) { + if (hasSecurityOnlyNosec) { + return Optional.of(NoSonarLineInfo.securityOnly(concatenatedCommentBuilder.toString())); + } return Optional.empty(); } - return Optional.of(new NoSonarLineInfo(rules, concatenatedCommentBuilder.toString())); + return Optional.of(new NoSonarLineInfo(rules, concatenatedCommentBuilder.toString(), hasSecurityOnlyNosec)); } @CheckForNull @@ -158,6 +168,7 @@ private NoSonarLineInfo parseComment(String commentLine) { var noSecRules = parseNoSecRules(commentLine); if (noSecRules.isEmpty()) { comment = parseNoSecComment(commentLine); + return NoSonarLineInfo.securityOnly(comment); } else { rules.addAll(noSecRules); } diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/nosonar/NoSonarLineInfo.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/nosonar/NoSonarLineInfo.java index 1ddde66c8..79ac31af1 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/nosonar/NoSonarLineInfo.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/nosonar/NoSonarLineInfo.java @@ -18,9 +18,21 @@ import java.util.Set; -public record NoSonarLineInfo(Set suppressedRuleKeys, String comment) { +public record NoSonarLineInfo(Set suppressedRuleKeys, String comment, boolean securityOnlySuppression) { public NoSonarLineInfo(Set suppressedRuleKeys) { - this(suppressedRuleKeys, ""); + this(suppressedRuleKeys, "", false); + } + + public NoSonarLineInfo(Set suppressedRuleKeys, String comment) { + this(suppressedRuleKeys, comment, false); + } + + public static NoSonarLineInfo securityOnly(String comment) { + return new NoSonarLineInfo(Set.of(), comment, true); + } + + public static NoSonarLineInfo securityOnly() { + return securityOnly(""); } public boolean isSuppressedRuleKeysEmpty() { diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/nosonar/NoSonarInfoParserTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/nosonar/NoSonarInfoParserTest.java index c15e2a688..2482bbc27 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/nosonar/NoSonarInfoParserTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/nosonar/NoSonarInfoParserTest.java @@ -140,10 +140,12 @@ private static Stream provideNoSonarAndNoQaParserParameters() { private static Stream provideNoSecParserParameters() { return Stream.of( + // bare nosec → security-only suppression (no explicit keys) Arguments.of( "# nosec", - new NoSonarLineInfo(Set.of()) + NoSonarLineInfo.securityOnly() ), + // nosec with explicit bandit key Arguments.of( "# nosec B101", new NoSonarLineInfo(Set.of("B101")) @@ -152,6 +154,7 @@ private static Stream provideNoSecParserParameters() { "# nosec B101, B102 reason text", new NoSonarLineInfo(Set.of("B101", "B102")) ), + // nosec with explicit Sonar key Arguments.of( "# nosec S1234", new NoSonarLineInfo(Set.of("S1234")) @@ -168,21 +171,30 @@ private static Stream provideNoSecParserParameters() { "# nosec B303, S1234", new NoSonarLineInfo(Set.of("B303", "S1234")) ), + // bare nosec with free-text reason → security-only suppression Arguments.of( "# nosec: it's fine", - new NoSonarLineInfo(Set.of(), "it's fine") + NoSonarLineInfo.securityOnly("it's fine") ), + // case-insensitive bare nosec Arguments.of( "# NOSEC", - new NoSonarLineInfo(Set.of()) + NoSonarLineInfo.securityOnly() ), + // bare nosec with long reason → truncated comment, security-only Arguments.of( "# nosec a very long comment that I don't want to keep that long because there is more than 50 characters", - new NoSonarLineInfo(Set.of(), "a very long comment that I don't want to keep that") + NoSonarLineInfo.securityOnly("a very long comment that I don't want to keep that") ), + // non-suppression text before bare nosec → comment captured, security-only Arguments.of( "# some text # nosec", - new NoSonarLineInfo(Set.of()) + NoSonarLineInfo.securityOnly("# some text") + ), + // mixed: explicit rule key from noqa + bare nosec → explicit key suppressed, security rules also suppressed + Arguments.of( + "# noqa: E501 # nosec", + new NoSonarLineInfo(Set.of("E501"), "", true) ) ); } From 2d57c1d2de7c953330ba0ed1dcd1339d1a7810b2 Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Mon, 29 Jun 2026 10:28:03 +0200 Subject: [PATCH 159/322] SONARPY-4311 Fixing the QG (#1218) GitOrigin-RevId: 521820b75c18825f0b3c81950b54852661322c43 --- .../utils/PythonMultiFileVerifierTest.java | 9 +- .../utils/AwsLambdaChecksUtilsTest.java | 21 ++-- .../python/checks/utils/MarimoUtilsTest.java | 11 +- .../sonar/plugins/python/IPynbSensorTest.java | 24 ++--- .../plugins/python/PythonSensorTest.java | 16 +-- .../plugins/python/caching/CachingTest.java | 6 +- .../coverage/PythonCoverageSensorTest.java | 4 +- .../nosonar/NoSonarIssueFilterTest.java | 20 ++-- .../python/api/PythonVisitorContextTest.java | 4 +- .../python/api/SonarLintCacheTest.java | 7 +- .../python/api/cfg/ControlFlowGraphTest.java | 4 +- .../python/api/types/v2/ClassTypeTest.java | 4 +- .../v2/FullyQualifiedNameHelperTest.java | 29 ++--- .../python/api/types/v2/UnionTypeTest.java | 4 +- .../types/v2/matchers/MatchersTestUtils.java | 7 +- .../v2/matchers/TypeMatcherImplTest.java | 99 ++++++++--------- .../v2/matchers/TypeMatcherUtilsTest.java | 11 +- .../org/sonar/python/PythonCheckTest.java | 3 +- .../org/sonar/python/PythonTestUtils.java | 9 +- .../sonar/python/SubscriptionVisitorTest.java | 6 +- .../caching/PythonWriteCacheImplTest.java | 13 ++- .../org/sonar/python/cfg/CfgUtilsTest.java | 4 +- .../DefinedVariablesAnalysisTest.java | 5 +- .../fixpoint/LiveVariablesAnalysisTest.java | 4 +- .../ReachingDefinitionsAnalysisTest.java | 4 +- .../python/quickfix/TextEditUtilsTest.java | 4 +- .../semantic/FullyQualifiedNameTest.java | 4 +- .../python/semantic/SymbolUtilsTest.java | 9 +- .../sonar/python/semantic/UsageImplTest.java | 4 +- .../semantic/v2/TypeInferenceV2Test.java | 33 +++--- ...usDescriptorToPythonTypeConverterTest.java | 14 +-- ...ssDescriptorToPythonTypeConverterTest.java | 6 +- .../v2/converter/ConversionContextTest.java | 26 ++--- .../DescriptorToPythonTypeConverterTest.java | 101 +++++++++--------- ...onDescriptorToPythonTypeConverterTest.java | 7 +- ...peAnnotationToPythonTypeConverterTest.java | 13 +-- ...leDescriptorToPythonTypeConverterTest.java | 8 +- .../org/sonar/python/types/TypeShedTest.java | 9 +- .../sonar/python/types/v2/LazyTypeTest.java | 7 +- .../python/types/v2/LazyTypeWrapperTest.java | 11 +- .../python/types/v2/LazyUnionTypeTest.java | 10 +- .../v2/matchers/AllTypePredicateTest.java | 38 +++---- .../v2/matchers/AnyTypePredicateTest.java | 40 +++---- .../v2/matchers/HasFQNPredicateTest.java | 61 +++++------ .../v2/matchers/HasMemberPredicateTest.java | 20 ++-- .../IsAnyTypeInUnionSatisfyingTest.java | 32 +++--- ...sFunctionOwnerSatisfyingPredicateTest.java | 7 +- .../IsObjectSatisfyingPredicateTest.java | 17 +-- .../v2/matchers/IsSelfTypePredicateTest.java | 23 ++-- ...ypeOrSuperTypeSatisfyingPredicateTest.java | 27 ++--- .../v2/matchers/IsTypePredicateTest.java | 27 ++--- .../v2/matchers/TypeSourcePredicateTest.java | 21 ++-- 52 files changed, 476 insertions(+), 431 deletions(-) diff --git a/python-checks-testkit/src/test/java/org/sonar/python/checks/utils/PythonMultiFileVerifierTest.java b/python-checks-testkit/src/test/java/org/sonar/python/checks/utils/PythonMultiFileVerifierTest.java index 5e6a72fdd..df3fbd7db 100644 --- a/python-checks-testkit/src/test/java/org/sonar/python/checks/utils/PythonMultiFileVerifierTest.java +++ b/python-checks-testkit/src/test/java/org/sonar/python/checks/utils/PythonMultiFileVerifierTest.java @@ -22,12 +22,13 @@ import java.nio.file.Path; import java.util.Map; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.sonar.plugins.python.api.PythonVisitorContext; import org.sonar.plugins.python.api.types.v2.ModuleType; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.mockStatic; class PythonMultiFileVerifierTest { @@ -56,7 +57,7 @@ void newBaseDirNotEmpty() { @Test void createTemporaryDirectorException() { - try (var files = Mockito.mockStatic(Files.class)) { + try (var files = mockStatic(Files.class)) { files.when(() -> Files.createTempDirectory("")) .thenThrow(IOException.class); @@ -69,8 +70,8 @@ void createTemporaryDirectorException() { void writeTempFileException() { var entry = Map.entry("foo.py", "class Foo: ..."); var tempDirectoryPath = Path.of("temp"); - try (var files = Mockito.mockStatic(Files.class)) { - files.when(() -> Files.newBufferedWriter(Mockito.any())) + try (var files = mockStatic(Files.class)) { + files.when(() -> Files.newBufferedWriter(any())) .thenThrow(IOException.class); assertThatThrownBy(() -> PythonMultiFileVerifier.writeTempFile(entry, tempDirectoryPath)) diff --git a/python-checks/src/test/java/org/sonar/python/checks/utils/AwsLambdaChecksUtilsTest.java b/python-checks/src/test/java/org/sonar/python/checks/utils/AwsLambdaChecksUtilsTest.java index 7286ac60e..ab8a0deb3 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/utils/AwsLambdaChecksUtilsTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/utils/AwsLambdaChecksUtilsTest.java @@ -17,7 +17,6 @@ package org.sonar.python.checks.utils; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.sonar.plugins.python.api.SubscriptionContext; import org.sonar.plugins.python.api.project.configuration.AwsLambdaHandlerInfo; import org.sonar.plugins.python.api.project.configuration.ProjectConfiguration; @@ -32,6 +31,8 @@ import org.sonar.python.tree.PythonTreeMaker; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; class AwsLambdaChecksUtilsTest { @Test @@ -125,9 +126,9 @@ void isOnlyLambdaHandlerTest() { } private static SubscriptionContext subscriptionContext(CallGraph callGraph) { - var subscriptionContext = Mockito.mock(org.sonar.plugins.python.api.SubscriptionContext.class); - Mockito.when(subscriptionContext.projectConfiguration()).thenReturn(new ProjectConfiguration()); - Mockito.when(subscriptionContext.callGraph()).thenReturn(callGraph); + var subscriptionContext = mock(org.sonar.plugins.python.api.SubscriptionContext.class); + when(subscriptionContext.projectConfiguration()).thenReturn(new ProjectConfiguration()); + when(subscriptionContext.callGraph()).thenReturn(callGraph); return subscriptionContext; } @@ -138,17 +139,17 @@ private static FunctionDef functionDef(String name) { } private static FunctionType functionType(String name) { - FunctionType functionNameType = Mockito.mock(FunctionType.class); - Mockito.when(functionNameType.fullyQualifiedName()).thenReturn(name); + FunctionType functionNameType = mock(FunctionType.class); + when(functionNameType.fullyQualifiedName()).thenReturn(name); return functionNameType; } private static FunctionDef functionDef(PythonType type) { - Name functionName = Mockito.mock(Name.class); - FunctionDef functionDef = Mockito.mock(FunctionDef.class); + Name functionName = mock(Name.class); + FunctionDef functionDef = mock(FunctionDef.class); - Mockito.when(functionName.typeV2()).thenReturn(type); - Mockito.when(functionDef.name()).thenReturn(functionName); + when(functionName.typeV2()).thenReturn(type); + when(functionDef.name()).thenReturn(functionName); return functionDef; } diff --git a/python-checks/src/test/java/org/sonar/python/checks/utils/MarimoUtilsTest.java b/python-checks/src/test/java/org/sonar/python/checks/utils/MarimoUtilsTest.java index 5744fda05..01f0af741 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/utils/MarimoUtilsTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/utils/MarimoUtilsTest.java @@ -18,7 +18,6 @@ import com.sonar.sslr.api.AstNode; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.sonar.plugins.python.api.SubscriptionContext; import org.sonar.plugins.python.api.tree.FileInput; import org.sonar.plugins.python.api.tree.FunctionDef; @@ -31,6 +30,8 @@ import org.sonar.python.tree.PythonTreeMaker; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; class MarimoUtilsTest { @@ -62,8 +63,8 @@ def some_cell(): var symbolTableV2 = new SymbolTableBuilderV2(fileInput).build(); new TypeInferenceV2(typeTable, mockFile, symbolTableV2, "").inferModuleType(fileInput); - SubscriptionContext ctx = Mockito.mock(SubscriptionContext.class); - Mockito.when(ctx.typeTable()).thenReturn(typeTable); + SubscriptionContext ctx = mock(SubscriptionContext.class); + when(ctx.typeTable()).thenReturn(typeTable); var statements = fileInput.statements().statements(); var functionDef = (FunctionDef) statements.get(statements.size() - 1); @@ -73,8 +74,8 @@ def some_cell(): } private static SubscriptionContext mockSubscriptionContext() { - SubscriptionContext ctx = Mockito.mock(SubscriptionContext.class); - Mockito.when(ctx.typeTable()).thenReturn(new ProjectLevelTypeTable(ProjectLevelSymbolTable.empty())); + SubscriptionContext ctx = mock(SubscriptionContext.class); + when(ctx.typeTable()).thenReturn(new ProjectLevelTypeTable(ProjectLevelSymbolTable.empty())); return ctx; } diff --git a/python-commons/src/test/java/org/sonar/plugins/python/IPynbSensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/IPynbSensorTest.java index a6e42b589..ef69f854c 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/IPynbSensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/IPynbSensorTest.java @@ -24,7 +24,6 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -import org.mockito.Mockito; import org.slf4j.event.Level; import org.sonar.api.SonarRuntime; import org.sonar.api.batch.fs.InputFile; @@ -60,6 +59,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; @@ -137,7 +137,7 @@ private IPynbSensor sensor() { private IPynbSensor sensor(PythonIndexer indexer) { FileLinesContextFactory fileLinesContextFactory = mock(FileLinesContextFactory.class); FileLinesContext fileLinesContext = mock(FileLinesContext.class); - when(fileLinesContextFactory.createFor(Mockito.any(InputFile.class))).thenReturn(fileLinesContext); + when(fileLinesContextFactory.createFor(any(InputFile.class))).thenReturn(fileLinesContext); CheckFactory checkFactory = new CheckFactory(activeRules); return new IPynbSensor(fileLinesContextFactory, checkFactory, @@ -186,7 +186,7 @@ void test_python_version_parameter() { private IPynbSensor notebookSensor() { FileLinesContextFactory fileLinesContextFactory = mock(FileLinesContextFactory.class); FileLinesContext fileLinesContext = mock(FileLinesContext.class); - when(fileLinesContextFactory.createFor(Mockito.any(InputFile.class))).thenReturn(fileLinesContext); + when(fileLinesContextFactory.createFor(any(InputFile.class))).thenReturn(fileLinesContext); CheckFactory checkFactory = new CheckFactory(activeRules); return new IPynbSensor(fileLinesContextFactory, checkFactory, @@ -236,11 +236,11 @@ void test_notebook_sensor_is_executed_on_json_file() { var sensor = spy(notebookSensor()); var contextSpy = spy(context); assertDoesNotThrow(() -> sensor.execute(contextSpy)); - verify(contextSpy, Mockito.times(1)).addTelemetryProperty(TelemetryMetricKey.NOTEBOOK_PRESENT_KEY.key(), "1"); - verify(contextSpy, Mockito.times(1)).addTelemetryProperty(TelemetryMetricKey.NOTEBOOK_RECOGNITION_ERROR_KEY.key(), "0"); - verify(contextSpy, Mockito.times(1)).addTelemetryProperty(TelemetryMetricKey.NOTEBOOK_TOTAL_KEY.key(), "1"); - verify(contextSpy, Mockito.times(1)).addTelemetryProperty(TelemetryMetricKey.NOTEBOOK_EXCEPTION_KEY.key(), "0"); - verify(contextSpy, Mockito.times(1)).addTelemetryProperty(eq(TelemetryMetricKey.NOTEBOOKS_ANALYSIS_DURATION_KEY.key()), anyString()); + verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.NOTEBOOK_PRESENT_KEY.key(), "1"); + verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.NOTEBOOK_RECOGNITION_ERROR_KEY.key(), "0"); + verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.NOTEBOOK_TOTAL_KEY.key(), "1"); + verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.NOTEBOOK_EXCEPTION_KEY.key(), "0"); + verify(contextSpy, times(1)).addTelemetryProperty(eq(TelemetryMetricKey.NOTEBOOKS_ANALYSIS_DURATION_KEY.key()), anyString()); } @Test @@ -262,10 +262,10 @@ void test_notebook_sensor_parse_error_on_valid_line() { sensor.execute(contextSpy); var logs = String.join("", logTester.logs()); assertThat(logs).contains("Unable to parse file: notebook_parse_error.ipynbParse error at line 1"); - verify(contextSpy, Mockito.times(1)).addTelemetryProperty(TelemetryMetricKey.NOTEBOOK_PRESENT_KEY.key(), "1"); - verify(contextSpy, Mockito.times(1)).addTelemetryProperty(TelemetryMetricKey.NOTEBOOK_RECOGNITION_ERROR_KEY.key(), "1"); - verify(contextSpy, Mockito.times(1)).addTelemetryProperty(TelemetryMetricKey.NOTEBOOK_TOTAL_KEY.key(), "1"); - verify(contextSpy, Mockito.times(1)).addTelemetryProperty(TelemetryMetricKey.NOTEBOOK_EXCEPTION_KEY.key(), "0"); + verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.NOTEBOOK_PRESENT_KEY.key(), "1"); + verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.NOTEBOOK_RECOGNITION_ERROR_KEY.key(), "1"); + verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.NOTEBOOK_TOTAL_KEY.key(), "1"); + verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.NOTEBOOK_EXCEPTION_KEY.key(), "0"); } @Test diff --git a/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java index 5ce779d7a..df3e517c0 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java @@ -40,7 +40,6 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.ValueSource; -import org.mockito.Mockito; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.event.Level; @@ -121,6 +120,7 @@ import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -296,7 +296,7 @@ void test_execute_on_sonarlint() { @Test void test_execute_on_sonarlint_quickfix() throws IOException { context.setRuntime(SONARLINT_RUNTIME); - context = Mockito.spy(context); + context = spy(context); when(context.newIssue()).thenReturn(new MockSonarLintIssue(context)); activate_rule_S2710(); @@ -329,7 +329,7 @@ void test_execute_on_sonarlint_quickfix() throws IOException { @Test void test_execute_on_sonarlint_quickfix_broken() throws IOException { context.setRuntime(SONARLINT_RUNTIME); - context = Mockito.spy(context); + context = spy(context); when(context.newIssue()).thenReturn(new MockSonarLintIssue(context) { @Override public NewQuickFix newQuickFix() { @@ -670,7 +670,7 @@ void test_auto_reclassify_bypassed_when_test_source_configured(String property, assertThat(context.allIssues()).hasSize(1); assertThat(context.allIssues().iterator().next().ruleKey().rule()).isEqualTo("S1226"); - verify(analysisWarning, Mockito.never()).addUnique(PythonScanner.UNSET_SONAR_TESTS_WARNING); + verify(analysisWarning, never()).addUnique(PythonScanner.UNSET_SONAR_TESTS_WARNING); } @Test @@ -1270,7 +1270,7 @@ void test_scan_without_parsing_uses_cached_effective_file_type() throws IOExcept assertThat(context.allIssues()).isEmpty(); assertThat(logTester.logs(Level.INFO)) .contains("The Python analyzer was able to leverage cached data from previous analyses for 1 out of 1 files. These files were not parsed."); - verify(analysisWarning, Mockito.never()).addUnique(PythonScanner.UNSET_SONAR_TESTS_WARNING); + verify(analysisWarning, never()).addUnique(PythonScanner.UNSET_SONAR_TESTS_WARNING); } @Test @@ -1909,7 +1909,7 @@ void send_telemetry_threads_and_files() { verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.ANALYSIS_THREADS_PARAM_KEY.key(), "2"); verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PARALLEL_ANALYSIS_KEY.key(), "1"); verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_NUMBER_OF_FILES_KEY.key(), "2"); - verify(contextSpy, Mockito.times(1)).addTelemetryProperty(eq(TelemetryMetricKey.ANALYSIS_DURATION_KEY.key()), anyString()); + verify(contextSpy, times(1)).addTelemetryProperty(eq(TelemetryMetricKey.ANALYSIS_DURATION_KEY.key()), anyString()); } @Test @@ -1934,7 +1934,7 @@ void send_telemetry_threads_disabled() { verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.ANALYSIS_THREADS_KEY.key(), "1"); verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PARALLEL_ANALYSIS_KEY.key(), "0"); verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_NUMBER_OF_FILES_KEY.key(), "2"); - verify(contextSpy, Mockito.times(1)).addTelemetryProperty(eq(TelemetryMetricKey.ANALYSIS_DURATION_KEY.key()), anyString()); + verify(contextSpy, times(1)).addTelemetryProperty(eq(TelemetryMetricKey.ANALYSIS_DURATION_KEY.key()), anyString()); } @Test @@ -1988,7 +1988,7 @@ private PythonSensor sensor( ProjectConfigurationBuilder projectConfigurationBuilder) { FileLinesContextFactory fileLinesContextFactory = mock(FileLinesContextFactory.class); FileLinesContext fileLinesContext = mock(FileLinesContext.class); - when(fileLinesContextFactory.createFor(Mockito.any(InputFile.class))).thenReturn(fileLinesContext); + when(fileLinesContextFactory.createFor(any(InputFile.class))).thenReturn(fileLinesContext); CheckFactory checkFactory = new CheckFactory(activeRules); return new PythonSensor( fileLinesContextFactory, diff --git a/python-commons/src/test/java/org/sonar/plugins/python/caching/CachingTest.java b/python-commons/src/test/java/org/sonar/plugins/python/caching/CachingTest.java index 3222cfa88..f8f558083 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/caching/CachingTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/caching/CachingTest.java @@ -29,7 +29,6 @@ import org.sonar.api.batch.fs.InputFile; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -import org.mockito.Mockito; import org.slf4j.event.Level; import org.sonar.api.testfixtures.log.LogTesterJUnit5; import org.sonar.plugins.python.api.caching.PythonReadCache; @@ -46,6 +45,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import static org.sonar.plugins.python.caching.Caching.EFFECTIVE_FILE_TYPE_CACHE_KEY_PREFIX; import static org.sonar.plugins.python.caching.Caching.IMPORTS_MAP_CACHE_KEY_PREFIX; @@ -120,10 +120,10 @@ void readProjectLevelSymbolTableIOException() throws IOException { TestReadCache readCache = new TestReadCache(); InputStream inputStream = mock(InputStream.class); when(inputStream.readAllBytes()).thenThrow(new IOException("Boom!")); - PythonReadCacheImpl pythonReadCache = Mockito.spy(new PythonReadCacheImpl(readCache)); + PythonReadCacheImpl pythonReadCache = spy(new PythonReadCacheImpl(readCache)); String cacheKey = PROJECT_SYMBOL_TABLE_CACHE_KEY_PREFIX + "mod"; readCache.put(cacheKey, new byte[0]); - Mockito.when(pythonReadCache.read(cacheKey)).thenReturn(inputStream); + when(pythonReadCache.read(cacheKey)).thenReturn(inputStream); CacheContextImpl cacheContext = new CacheContextImpl(true, new PythonWriteCacheImpl(writeCache), pythonReadCache); Caching caching = new Caching(cacheContext, CACHE_VERSION); diff --git a/python-commons/src/test/java/org/sonar/plugins/python/coverage/PythonCoverageSensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/coverage/PythonCoverageSensorTest.java index b42c5bd4a..5017046f7 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/coverage/PythonCoverageSensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/coverage/PythonCoverageSensorTest.java @@ -28,7 +28,6 @@ import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.api.io.TempDir; import org.mockito.MockedStatic; -import org.mockito.Mockito; import org.slf4j.event.Level; import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.fs.InputFile.Type; @@ -46,6 +45,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.contains; +import static org.mockito.Mockito.mockStatic; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -306,7 +306,7 @@ void should_do_nothing_on_empty_report() { @Test void should_warn_on_invalid_basedir() { - try(MockedStatic pythonReportSensorMock = Mockito.mockStatic(PythonReportSensor.class)) { + try(MockedStatic pythonReportSensorMock = mockStatic(PythonReportSensor.class)) { pythonReportSensorMock .when(() -> PythonReportSensor.getReports(any(), any(), any(), any(), any())) .thenThrow(RuntimeException.class); diff --git a/python-commons/src/test/java/org/sonar/plugins/python/nosonar/NoSonarIssueFilterTest.java b/python-commons/src/test/java/org/sonar/plugins/python/nosonar/NoSonarIssueFilterTest.java index 81b4ecafa..c792e2be3 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/nosonar/NoSonarIssueFilterTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/nosonar/NoSonarIssueFilterTest.java @@ -24,12 +24,14 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import org.mockito.Mockito; import org.sonar.api.rule.RuleKey; import org.sonar.api.scan.issue.filter.FilterableIssue; import org.sonar.api.scan.issue.filter.IssueFilterChain; import org.sonar.plugins.python.api.nosonar.NoSonarLineInfo; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + class NoSonarIssueFilterTest { private static final Set SECURITY_RULES = Set.of("S4423"); @@ -40,19 +42,19 @@ void test(Map noSonarInfos, String ruleKey, @Nullable var componentKey = "foo.py"; var ruleRepo = "my_repo"; - var collector = Mockito.mock(NoSonarLineInfoCollector.class); - Mockito.when(collector.get(componentKey)) + var collector = mock(NoSonarLineInfoCollector.class); + when(collector.get(componentKey)) .thenReturn(noSonarInfos); var filter = new NoSonarIssueFilter(collector, new SecurityRuleKeyProvider(SECURITY_RULES)); - var issue = Mockito.mock(FilterableIssue.class); - Mockito.when(issue.componentKey()).thenReturn(componentKey); - Mockito.when(issue.line()).thenReturn(line); - Mockito.when(issue.ruleKey()).thenReturn(RuleKey.of(ruleRepo, ruleKey)); + var issue = mock(FilterableIssue.class); + when(issue.componentKey()).thenReturn(componentKey); + when(issue.line()).thenReturn(line); + when(issue.ruleKey()).thenReturn(RuleKey.of(ruleRepo, ruleKey)); - var filterChain = Mockito.mock(IssueFilterChain.class); - Mockito.when(filterChain.accept(issue)).thenReturn(filterChainAcceptResult); + var filterChain = mock(IssueFilterChain.class); + when(filterChain.accept(issue)).thenReturn(filterChainAcceptResult); var result = filter.accept(issue, filterChain); Assertions.assertThat(result) diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/PythonVisitorContextTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/PythonVisitorContextTest.java index a22c8bea1..99c54c93a 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/PythonVisitorContextTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/PythonVisitorContextTest.java @@ -21,7 +21,6 @@ import java.util.Map; import java.util.Set; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.sonar.api.SonarProduct; import org.sonar.plugins.python.api.symbols.Symbol; import org.sonar.plugins.python.api.tree.FileInput; @@ -42,6 +41,7 @@ import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; import static org.sonar.python.PythonTestUtils.pythonFile; class PythonVisitorContextTest { @@ -63,7 +63,7 @@ void fullyQualifiedModuleName() { .hasFieldOrPropertyWithValue("fullyQualifiedName", "my_module"); // file without extension - Mockito.when(pythonFile.fileName()).thenReturn("my_module"); + when(pythonFile.fileName()).thenReturn("my_module"); ctx = new PythonVisitorContext.Builder(fileInput, pythonFile).packageName("my_package").build(); functionDef = (FunctionDef) PythonTestUtils.getAllDescendant(fileInput, t -> t.is(Tree.Kind.FUNCDEF)).get(0); assertThat(functionDef.name().symbol().fullyQualifiedName()).isEqualTo("my_package.my_module.foo"); diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/SonarLintCacheTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/SonarLintCacheTest.java index 2a515d8ad..22e8997ee 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/SonarLintCacheTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/SonarLintCacheTest.java @@ -20,10 +20,11 @@ import java.io.IOException; import java.io.InputStream; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; class SonarLintCacheTest { @@ -60,8 +61,8 @@ void contains() { @Test void write_non_valid_input_stream() throws IOException { - InputStream inputStream = Mockito.mock(InputStream.class); - Mockito.when(inputStream.readAllBytes()).thenThrow(IOException.class); + InputStream inputStream = mock(InputStream.class); + when(inputStream.readAllBytes()).thenThrow(IOException.class); SonarLintCache sonarLintCache = new SonarLintCache(); assertThatThrownBy(() -> sonarLintCache.write("foo", inputStream)).isInstanceOf(IllegalStateException.class).hasCauseInstanceOf(IOException.class); diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/cfg/ControlFlowGraphTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/cfg/ControlFlowGraphTest.java index 9f2901872..d284568a1 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/cfg/ControlFlowGraphTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/cfg/ControlFlowGraphTest.java @@ -20,7 +20,6 @@ import java.util.List; import java.util.stream.Collectors; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.sonar.plugins.python.api.PythonFile; import org.sonar.plugins.python.api.tree.ExpressionStatement; import org.sonar.plugins.python.api.tree.FileInput; @@ -35,10 +34,11 @@ import org.sonar.python.cfg.PythonCfgSimpleBlock; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; class ControlFlowGraphTest { - private PythonFile file = Mockito.mock(PythonFile.class, "file1.py"); + private PythonFile file = mock(PythonFile.class, "file1.py"); @Test void empty_file() { diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/ClassTypeTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/ClassTypeTest.java index 40c81a7ff..eb0096641 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/ClassTypeTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/ClassTypeTest.java @@ -26,7 +26,6 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import org.mockito.Mockito; import org.sonar.plugins.python.api.LocationInFile; import org.sonar.plugins.python.api.PythonFile; import org.sonar.plugins.python.api.TriBool; @@ -53,6 +52,7 @@ import static org.sonar.python.PythonTestUtils.pythonFile; import static org.sonar.python.semantic.ProjectLevelSymbolTable.empty; import static org.sonar.python.types.v2.TypesTestUtils.PROJECT_LEVEL_TYPE_TABLE; +import static org.mockito.Mockito.mock; public class ClassTypeTest { @@ -98,7 +98,7 @@ def foo(): ... @Test void members() { - FunctionType barMember = Mockito.mock(FunctionType.class); + FunctionType barMember = mock(FunctionType.class); Member bar = new Member("bar", barMember); Member qix = new Member("qix", PythonType.UNKNOWN); ClassType classType = new ClassType( diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/FullyQualifiedNameHelperTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/FullyQualifiedNameHelperTest.java index 9fcafb7b7..6aa6170a1 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/FullyQualifiedNameHelperTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/FullyQualifiedNameHelperTest.java @@ -17,29 +17,30 @@ package org.sonar.plugins.python.api.types.v2; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.sonar.python.types.v2.SpecialFormType; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; class FullyQualifiedNameHelperTest { @Test void testGetFullyQualifiedName() { - FunctionType function1 = Mockito.mock(FunctionType.class); - FunctionType nullFunctionType = Mockito.mock(FunctionType.class); - ClassType class1 = Mockito.mock(ClassType.class); - UnknownType.UnresolvedImportType unresolvedImport = Mockito.mock(UnknownType.UnresolvedImportType.class); - ModuleType module1 = Mockito.mock(ModuleType.class); - SpecialFormType specialFormType1 = Mockito.mock(SpecialFormType.class); - UnknownType.UnknownTypeImpl unknownType = Mockito.mock(UnknownType.UnknownTypeImpl.class); + FunctionType function1 = mock(FunctionType.class); + FunctionType nullFunctionType = mock(FunctionType.class); + ClassType class1 = mock(ClassType.class); + UnknownType.UnresolvedImportType unresolvedImport = mock(UnknownType.UnresolvedImportType.class); + ModuleType module1 = mock(ModuleType.class); + SpecialFormType specialFormType1 = mock(SpecialFormType.class); + UnknownType.UnknownTypeImpl unknownType = mock(UnknownType.UnknownTypeImpl.class); - Mockito.when(function1.fullyQualifiedName()).thenReturn("foo.bar.func1"); - Mockito.when(nullFunctionType.fullyQualifiedName()).thenReturn(null); - Mockito.when(class1.fullyQualifiedName()).thenReturn("foo.bar.class1"); - Mockito.when(module1.fullyQualifiedName()).thenReturn("mod.module1"); - Mockito.when(specialFormType1.fullyQualifiedName()).thenReturn("typing.List"); - Mockito.when(unresolvedImport.importPath()).thenReturn("imported.module1"); + when(function1.fullyQualifiedName()).thenReturn("foo.bar.func1"); + when(nullFunctionType.fullyQualifiedName()).thenReturn(null); + when(class1.fullyQualifiedName()).thenReturn("foo.bar.class1"); + when(module1.fullyQualifiedName()).thenReturn("mod.module1"); + when(specialFormType1.fullyQualifiedName()).thenReturn("typing.List"); + when(unresolvedImport.importPath()).thenReturn("imported.module1"); assertThat(FullyQualifiedNameHelper.getFullyQualifiedName(function1)).contains("foo.bar.func1"); assertThat(FullyQualifiedNameHelper.getFullyQualifiedName(nullFunctionType)).isEmpty(); diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/UnionTypeTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/UnionTypeTest.java index 23ee26b44..42cff684b 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/UnionTypeTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/UnionTypeTest.java @@ -22,7 +22,6 @@ import java.util.Set; import org.assertj.core.api.InstanceOfAssertFactories; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.sonar.plugins.python.api.TriBool; import org.sonar.plugins.python.api.tree.ExpressionStatement; import org.sonar.plugins.python.api.tree.FileInput; @@ -39,6 +38,7 @@ import static org.sonar.python.types.v2.TypesTestUtils.INT_TYPE; import static org.sonar.python.types.v2.TypesTestUtils.STR_TYPE; import static org.sonar.python.types.v2.TypesTestUtils.parseAndInferTypes; +import static org.mockito.Mockito.mock; class UnionTypeTest { @@ -183,7 +183,7 @@ void unionTypeCandidatesResolution() { @Test void noLazyTypeInUnionType() { - PythonType lazyType = new LazyType("foo", Mockito.mock(LazyTypesContext.class)); + PythonType lazyType = new LazyType("foo", mock(LazyTypesContext.class)); assertThatThrownBy(() -> UnionType.or(INT_TYPE, lazyType)) .isInstanceOf(IllegalArgumentException.class) .hasMessage("UnionType cannot contain Lazy types"); diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/matchers/MatchersTestUtils.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/matchers/MatchersTestUtils.java index 279cccdca..745e4dc60 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/matchers/MatchersTestUtils.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/matchers/MatchersTestUtils.java @@ -16,7 +16,6 @@ */ package org.sonar.plugins.python.api.types.v2.matchers; -import org.mockito.Mockito; import org.sonar.plugins.python.api.TriBool; import org.sonar.plugins.python.api.types.v2.PythonType; import org.sonar.python.types.v2.matchers.TypePredicate; @@ -25,14 +24,16 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; public class MatchersTestUtils { private MatchersTestUtils() { } public static TypePredicate mockPredicateReturning(PythonType expectedType, TriBool result) { - TypePredicate predicate = Mockito.mock(TypePredicate.class); - Mockito.when(predicate.check(eq(expectedType), any(TypePredicateContext.class))).thenReturn(result); + TypePredicate predicate = mock(TypePredicate.class); + when(predicate.check(eq(expectedType), any(TypePredicateContext.class))).thenReturn(result); return predicate; } diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/matchers/TypeMatcherImplTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/matchers/TypeMatcherImplTest.java index c04c26e6a..72ee4b31a 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/matchers/TypeMatcherImplTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/matchers/TypeMatcherImplTest.java @@ -21,7 +21,6 @@ import org.jspecify.annotations.NonNull; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.sonar.plugins.python.api.SubscriptionContext; import org.sonar.plugins.python.api.TriBool; import org.sonar.plugins.python.api.tree.Expression; @@ -38,6 +37,8 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.sonar.plugins.python.api.types.v2.matchers.MatchersTestUtils.createTypeMatcher; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; class TypeMatcherImplTest { @@ -53,63 +54,63 @@ public TriBool check(@NonNull PythonType type, @Nullable TypePredicateContext ct TypeMatcher typeMatcher = createTypeMatcher(isFunctionType); - PythonType functionType = Mockito.mock(FunctionType.class); - PythonType functionType2 = Mockito.mock(FunctionType.class); - PythonType objectType = Mockito.mock(ObjectType.class); - PythonType objectType2 = Mockito.mock(ObjectType.class); - PythonType unknownType = Mockito.mock(UnknownType.UnknownTypeImpl.class); + PythonType functionType = mock(FunctionType.class); + PythonType functionType2 = mock(FunctionType.class); + PythonType objectType = mock(ObjectType.class); + PythonType objectType2 = mock(ObjectType.class); + PythonType unknownType = mock(UnknownType.UnknownTypeImpl.class); PythonType unionWithFunctionAndUnknown = UnionType.or(Set.of(functionType, unknownType)); PythonType unionWithObjectAndUnknown = UnionType.or(Set.of(objectType, unknownType)); PythonType unionWithFunctionAndObject = UnionType.or(Set.of(functionType, objectType)); PythonType unionOfFunctions = UnionType.or(Set.of(functionType, functionType2)); PythonType unionOfObjects = UnionType.or(Set.of(objectType, objectType2)); - Expression functionExpr = Mockito.mock(Expression.class); - Expression unknownExpr = Mockito.mock(Expression.class); - Expression objectExpr = Mockito.mock(Expression.class); - Expression unionWithFunctionAndUnknownExpr = Mockito.mock(Expression.class); - Expression unionWithObjectAndUnknownExpr = Mockito.mock(Expression.class); - Expression unionWithFunctionAndObjectExpr = Mockito.mock(Expression.class); - Expression unionOfFunctionExpr = Mockito.mock(Expression.class); - Expression unionOfObjectExpr = Mockito.mock(Expression.class); + Expression functionExpr = mock(Expression.class); + Expression unknownExpr = mock(Expression.class); + Expression objectExpr = mock(Expression.class); + Expression unionWithFunctionAndUnknownExpr = mock(Expression.class); + Expression unionWithObjectAndUnknownExpr = mock(Expression.class); + Expression unionWithFunctionAndObjectExpr = mock(Expression.class); + Expression unionOfFunctionExpr = mock(Expression.class); + Expression unionOfObjectExpr = mock(Expression.class); @BeforeEach void prepare() { - functionType = Mockito.mock(FunctionType.class); - functionType2 = Mockito.mock(FunctionType.class); - objectType = Mockito.mock(ObjectType.class); - objectType2 = Mockito.mock(ObjectType.class); - unknownType = Mockito.mock(UnknownType.UnknownTypeImpl.class); + functionType = mock(FunctionType.class); + functionType2 = mock(FunctionType.class); + objectType = mock(ObjectType.class); + objectType2 = mock(ObjectType.class); + unknownType = mock(UnknownType.UnknownTypeImpl.class); unionWithFunctionAndUnknown = UnionType.or(Set.of(functionType, unknownType)); unionWithObjectAndUnknown = UnionType.or(Set.of(objectType, unknownType)); unionWithFunctionAndObject = UnionType.or(Set.of(functionType, objectType)); unionOfFunctions = UnionType.or(Set.of(functionType, functionType2)); unionOfObjects = UnionType.or(Set.of(objectType, objectType2)); - functionExpr = Mockito.mock(Expression.class); - unknownExpr = Mockito.mock(Expression.class); - objectExpr = Mockito.mock(Expression.class); - unionWithFunctionAndUnknownExpr = Mockito.mock(Expression.class); - unionWithObjectAndUnknownExpr = Mockito.mock(Expression.class); - unionWithFunctionAndObjectExpr = Mockito.mock(Expression.class); - unionOfFunctionExpr = Mockito.mock(Expression.class); - unionOfObjectExpr = Mockito.mock(Expression.class); - - - Mockito.when(unknownExpr.typeV2()).thenReturn(unknownType); - Mockito.when(objectExpr.typeV2()).thenReturn(objectType); - Mockito.when(functionExpr.typeV2()).thenReturn(functionType); - Mockito.when(unionWithFunctionAndUnknownExpr.typeV2()).thenReturn(unionWithFunctionAndUnknown); - Mockito.when(unionWithObjectAndUnknownExpr.typeV2()).thenReturn(unionWithObjectAndUnknown); - Mockito.when(unionWithFunctionAndObjectExpr.typeV2()).thenReturn(unionWithFunctionAndObject); - Mockito.when(unionOfFunctionExpr.typeV2()).thenReturn(unionOfFunctions); - Mockito.when(unionOfObjectExpr.typeV2()).thenReturn(unionOfObjects); + functionExpr = mock(Expression.class); + unknownExpr = mock(Expression.class); + objectExpr = mock(Expression.class); + unionWithFunctionAndUnknownExpr = mock(Expression.class); + unionWithObjectAndUnknownExpr = mock(Expression.class); + unionWithFunctionAndObjectExpr = mock(Expression.class); + unionOfFunctionExpr = mock(Expression.class); + unionOfObjectExpr = mock(Expression.class); + + + when(unknownExpr.typeV2()).thenReturn(unknownType); + when(objectExpr.typeV2()).thenReturn(objectType); + when(functionExpr.typeV2()).thenReturn(functionType); + when(unionWithFunctionAndUnknownExpr.typeV2()).thenReturn(unionWithFunctionAndUnknown); + when(unionWithObjectAndUnknownExpr.typeV2()).thenReturn(unionWithObjectAndUnknown); + when(unionWithFunctionAndObjectExpr.typeV2()).thenReturn(unionWithFunctionAndObject); + when(unionOfFunctionExpr.typeV2()).thenReturn(unionOfFunctions); + when(unionOfObjectExpr.typeV2()).thenReturn(unionOfObjects); } @Test void testIsFor() { - SubscriptionContext ctx = Mockito.mock(); - Mockito.when(ctx.typeTable()).thenReturn(Mockito.mock(TypeTable.class)); + SubscriptionContext ctx = mock(); + when(ctx.typeTable()).thenReturn(mock(TypeTable.class)); assertThat(typeMatcher.evaluateFor(functionExpr, ctx)).isEqualTo(TriBool.TRUE); assertThat(typeMatcher.evaluateFor(unknownExpr, ctx)).isEqualTo(TriBool.UNKNOWN); assertThat(typeMatcher.evaluateFor(objectExpr, ctx)).isEqualTo(TriBool.FALSE); @@ -121,8 +122,8 @@ void testIsFor() { @Test void testIsTrueFor() { - SubscriptionContext ctx = Mockito.mock(SubscriptionContext.class); - Mockito.when(ctx.typeTable()).thenReturn(Mockito.mock(TypeTable.class)); + SubscriptionContext ctx = mock(SubscriptionContext.class); + when(ctx.typeTable()).thenReturn(mock(TypeTable.class)); assertThat(typeMatcher.isTrueFor(functionExpr, ctx)).isTrue(); assertThat(typeMatcher.isTrueFor(unknownExpr, ctx)).isFalse(); assertThat(typeMatcher.isTrueFor(objectExpr, ctx)).isFalse(); @@ -149,8 +150,8 @@ def __init__(self): a """); - SubscriptionContext ctx = Mockito.mock(SubscriptionContext.class); - Mockito.when(ctx.typeTable()).thenReturn(project.projectLevelTypeTable()); + SubscriptionContext ctx = mock(SubscriptionContext.class); + when(ctx.typeTable()).thenReturn(project.projectLevelTypeTable()); assertThat(TypeMatchers.isObjectOfType("my_file.A").evaluateFor(objectTypeExpression, ctx)).isEqualTo(TriBool.TRUE); assertThat(TypeMatchers.isObjectOfType("my_file.B").isTrueFor(objectTypeExpression, ctx)).isFalse(); @@ -169,8 +170,8 @@ def func1(): pass func1 """); - SubscriptionContext ctx = Mockito.mock(SubscriptionContext.class); - Mockito.when(ctx.typeTable()).thenReturn(project.projectLevelTypeTable()); + SubscriptionContext ctx = mock(SubscriptionContext.class); + when(ctx.typeTable()).thenReturn(project.projectLevelTypeTable()); assertThat(TypeMatchers.isObjectOfType("my_file.func1").evaluateFor(func1Expression, ctx)).isEqualTo(TriBool.FALSE); assertThat(func1Expression.typeV2()).isNotInstanceOf(UnknownType.class); @@ -195,8 +196,8 @@ def __init__(self): a """); - SubscriptionContext ctx = Mockito.mock(SubscriptionContext.class); - Mockito.when(ctx.typeTable()).thenReturn(project.projectLevelTypeTable()); + SubscriptionContext ctx = mock(SubscriptionContext.class); + when(ctx.typeTable()).thenReturn(project.projectLevelTypeTable()); assertThat(unknownTypeExpression.typeV2()).isInstanceOf(UnknownType.class); assertThat(knownTypeExpression.typeV2()).isInstanceOf(ObjectType.class); @@ -219,8 +220,8 @@ def foo(param: int | A | str): param """); - SubscriptionContext ctx = Mockito.mock(SubscriptionContext.class); - Mockito.when(ctx.typeTable()).thenReturn(project.projectLevelTypeTable()); + SubscriptionContext ctx = mock(SubscriptionContext.class); + when(ctx.typeTable()).thenReturn(project.projectLevelTypeTable()); assertThat(unionTypeExpression.typeV2()).isInstanceOf(UnionType.class); assertThat(InternalTypeMatchers.isAnyTypeInUnionSatisfying(TypeMatchers.isObjectOfType("my_file.A")).isTrueFor(unionTypeExpression, ctx)).isTrue(); diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/matchers/TypeMatcherUtilsTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/matchers/TypeMatcherUtilsTest.java index 870d9de01..648b2a2bc 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/matchers/TypeMatcherUtilsTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/matchers/TypeMatcherUtilsTest.java @@ -20,13 +20,14 @@ import java.util.stream.Stream; import org.junit.jupiter.api.Test; import org.junit.platform.commons.annotation.Testable; -import org.mockito.Mockito; import org.sonar.plugins.python.api.SubscriptionContext; import org.sonar.plugins.python.api.TriBool; import org.sonar.plugins.python.api.tree.Expression; import org.sonar.python.semantic.v2.TestProject; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; @Testable class TypeMatcherUtilsTest { @@ -57,10 +58,10 @@ def bar(self): TypeMatcher allMatcher1 = List.of("bar", "foo").stream() .map(TypeMatchers::hasMember) .collect(TypeMatcherUtils.allCollector()); - assertThat(allMatcher1.evaluateFor(expression, Mockito.mock())).isEqualTo(TriBool.TRUE); + assertThat(allMatcher1.evaluateFor(expression, mock())).isEqualTo(TriBool.TRUE); var allMatcher2 = TypeMatchers.all(Stream.of("bar", "foo").map(TypeMatchers::hasMember)); - assertThat(allMatcher2.evaluateFor(expression, Mockito.mock())).isEqualTo(TriBool.TRUE); + assertThat(allMatcher2.evaluateFor(expression, mock())).isEqualTo(TriBool.TRUE); } @Test @@ -83,8 +84,8 @@ class B : .map(TypeMatchers::isObjectOfType) .collect(TypeMatcherUtils.anyCollector()); - var ctx = Mockito.mock(SubscriptionContext.class); - Mockito.when(ctx.typeTable()).thenReturn(project.projectLevelTypeTable()); + var ctx = mock(SubscriptionContext.class); + when(ctx.typeTable()).thenReturn(project.projectLevelTypeTable()); assertThat(anyMatcher1.evaluateFor(expression, ctx)).isEqualTo(TriBool.TRUE); diff --git a/python-frontend/src/test/java/org/sonar/python/PythonCheckTest.java b/python-frontend/src/test/java/org/sonar/python/PythonCheckTest.java index bd80f71eb..67b787b06 100644 --- a/python-frontend/src/test/java/org/sonar/python/PythonCheckTest.java +++ b/python-frontend/src/test/java/org/sonar/python/PythonCheckTest.java @@ -19,7 +19,6 @@ import java.io.File; import java.util.List; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.sonar.plugins.python.api.IssueLocation; import org.sonar.plugins.python.api.PythonCheck; import org.sonar.plugins.python.api.PythonCheck.PreciseIssue; @@ -74,7 +73,7 @@ public void visitFunctionDef(FunctionDef pyFunctionDefTree) { assertThat(primaryLocation.endLineOffset()).isEqualTo(9); assertThat(firstIssue.quickFixes()).isEmpty(); - PythonTextEdit textEdit = Mockito.mock(PythonTextEdit.class); + PythonTextEdit textEdit = mock(PythonTextEdit.class); PythonQuickFix quickFix = PythonQuickFix.newQuickFix("New Quickfix") .addTextEdit(textEdit) .build(); diff --git a/python-frontend/src/test/java/org/sonar/python/PythonTestUtils.java b/python-frontend/src/test/java/org/sonar/python/PythonTestUtils.java index fe5eb8046..e93dfd71c 100644 --- a/python-frontend/src/test/java/org/sonar/python/PythonTestUtils.java +++ b/python-frontend/src/test/java/org/sonar/python/PythonTestUtils.java @@ -23,7 +23,6 @@ import java.util.Map; import java.util.function.Predicate; import javax.annotation.CheckForNull; -import org.mockito.Mockito; import org.sonar.plugins.python.api.PythonFile; import org.sonar.plugins.python.api.symbols.FunctionSymbol; import org.sonar.plugins.python.api.tree.Expression; @@ -39,6 +38,8 @@ import org.sonar.python.tree.TreeUtils; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; public final class PythonTestUtils { @@ -106,10 +107,10 @@ public static T getLastDescendant(Tree tree, Predicate pr } public static PythonFile pythonFile(String fileName) { - PythonFile pythonFile = Mockito.mock(PythonFile.class); - Mockito.when(pythonFile.fileName()).thenReturn(fileName); + PythonFile pythonFile = mock(PythonFile.class); + when(pythonFile.fileName()).thenReturn(fileName); try { - Mockito.when(pythonFile.uri()).thenReturn(Files.createTempFile(fileName, "py").toUri()); + when(pythonFile.uri()).thenReturn(Files.createTempFile(fileName, "py").toUri()); } catch (IOException e) { throw new IllegalStateException("Cannot create temporary file"); } diff --git a/python-frontend/src/test/java/org/sonar/python/SubscriptionVisitorTest.java b/python-frontend/src/test/java/org/sonar/python/SubscriptionVisitorTest.java index 7a6fb8c48..c1ff9918f 100644 --- a/python-frontend/src/test/java/org/sonar/python/SubscriptionVisitorTest.java +++ b/python-frontend/src/test/java/org/sonar/python/SubscriptionVisitorTest.java @@ -23,7 +23,6 @@ import java.util.concurrent.atomic.AtomicReference; import java.util.regex.Pattern; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.sonar.plugins.python.api.project.configuration.AwsLambdaHandlerInfo; import org.sonar.plugins.python.api.project.configuration.ProjectConfiguration; import org.sonar.plugins.python.api.ProjectPythonVersion; @@ -48,6 +47,7 @@ import org.sonarsource.analyzer.commons.regex.ast.FlagSet; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; class SubscriptionVisitorTest { @@ -78,7 +78,7 @@ public void initialize(Context context) { @Test void exposed_visitor_data() { FileInput fileInput = PythonTestUtils.parse("def foo(): ..."); - var cache = Mockito.mock(CacheContext.class); + var cache = mock(CacheContext.class); PythonFile pythonFile = PythonTestUtils.pythonFile("file"); PythonVisitorContext context = new PythonVisitorContext.Builder(fileInput, pythonFile) @@ -150,7 +150,7 @@ public void initialize(Context context) { @Test void callGraph() { - var callGraph = Mockito.mock(CallGraph.class); + var callGraph = mock(CallGraph.class); var latch = new CountDownLatch(1); var check = new PythonSubscriptionCheck() { @Override diff --git a/python-frontend/src/test/java/org/sonar/python/caching/PythonWriteCacheImplTest.java b/python-frontend/src/test/java/org/sonar/python/caching/PythonWriteCacheImplTest.java index f7c555335..ee14febd6 100644 --- a/python-frontend/src/test/java/org/sonar/python/caching/PythonWriteCacheImplTest.java +++ b/python-frontend/src/test/java/org/sonar/python/caching/PythonWriteCacheImplTest.java @@ -17,31 +17,34 @@ package org.sonar.python.caching; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.sonar.api.batch.sensor.cache.WriteCache; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + class PythonWriteCacheImplTest { @Test void write() { byte[] bytes = "hello".getBytes(); - WriteCache writeCache = Mockito.spy(WriteCache.class); + WriteCache writeCache = spy(WriteCache.class); PythonWriteCacheImpl pythonWriteCache = new PythonWriteCacheImpl(writeCache); pythonWriteCache.write("key", bytes); - Mockito.verify(writeCache, Mockito.times(1)) + verify(writeCache, times(1)) .write("key", bytes); } @Test void copy_from_previous() { - WriteCache writeCache = Mockito.spy(WriteCache.class); + WriteCache writeCache = spy(WriteCache.class); PythonWriteCacheImpl pythonWriteCache = new PythonWriteCacheImpl(writeCache); pythonWriteCache.copyFromPrevious("key"); - Mockito.verify(writeCache, Mockito.times(1)) + verify(writeCache, times(1)) .copyFromPrevious("key"); } } diff --git a/python-frontend/src/test/java/org/sonar/python/cfg/CfgUtilsTest.java b/python-frontend/src/test/java/org/sonar/python/cfg/CfgUtilsTest.java index 3af8fd413..0dadac634 100644 --- a/python-frontend/src/test/java/org/sonar/python/cfg/CfgUtilsTest.java +++ b/python-frontend/src/test/java/org/sonar/python/cfg/CfgUtilsTest.java @@ -22,7 +22,6 @@ import java.util.Set; import java.util.stream.Collectors; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.sonar.plugins.python.api.cfg.CfgBlock; import org.sonar.plugins.python.api.cfg.ControlFlowGraph; import org.sonar.plugins.python.api.tree.FileInput; @@ -31,10 +30,11 @@ import org.sonar.python.PythonTestUtils; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; class CfgUtilsTest { - private PythonFile file = Mockito.mock(PythonFile.class, "file1.py"); + private PythonFile file = mock(PythonFile.class, "file1.py"); @Test void unreachableBlocks_empty() { diff --git a/python-frontend/src/test/java/org/sonar/python/cfg/fixpoint/DefinedVariablesAnalysisTest.java b/python-frontend/src/test/java/org/sonar/python/cfg/fixpoint/DefinedVariablesAnalysisTest.java index 19e1c5fde..e00bd995f 100644 --- a/python-frontend/src/test/java/org/sonar/python/cfg/fixpoint/DefinedVariablesAnalysisTest.java +++ b/python-frontend/src/test/java/org/sonar/python/cfg/fixpoint/DefinedVariablesAnalysisTest.java @@ -19,7 +19,6 @@ import java.util.Arrays; import java.util.stream.Collectors; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.sonar.plugins.python.api.cfg.CfgValidator; import org.sonar.plugins.python.api.cfg.ControlFlowGraph; import org.sonar.plugins.python.api.tree.FileInput; @@ -27,6 +26,8 @@ import org.sonar.plugins.python.api.PythonFile; import org.sonar.python.PythonTestUtils; +import static org.mockito.Mockito.mock; + /** * This Defined Variable Analysis Test uses a meta-language to specify the expected values for each basic block. *

                            @@ -48,7 +49,7 @@ * 3. the name of the function is the identifier of the basic block */ class DefinedVariablesAnalysisTest { - private PythonFile file = Mockito.mock(PythonFile.class, "file1.py"); + private PythonFile file = mock(PythonFile.class, "file1.py"); @Test void test_simple_def() { diff --git a/python-frontend/src/test/java/org/sonar/python/cfg/fixpoint/LiveVariablesAnalysisTest.java b/python-frontend/src/test/java/org/sonar/python/cfg/fixpoint/LiveVariablesAnalysisTest.java index d1b140791..8fd83c287 100644 --- a/python-frontend/src/test/java/org/sonar/python/cfg/fixpoint/LiveVariablesAnalysisTest.java +++ b/python-frontend/src/test/java/org/sonar/python/cfg/fixpoint/LiveVariablesAnalysisTest.java @@ -21,7 +21,6 @@ import java.util.Set; import java.util.stream.Collectors; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.sonar.plugins.python.api.PythonFile; import org.sonar.plugins.python.api.cfg.CfgValidator; import org.sonar.plugins.python.api.cfg.ControlFlowGraph; @@ -31,6 +30,7 @@ import org.sonar.python.PythonTestUtils; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; /** * This Live Variable Analysis Test uses a meta-language to specify the expected LVA values for each basic block. @@ -53,7 +53,7 @@ * 3. the name of the function is the identifier of the basic block */ class LiveVariablesAnalysisTest { - private PythonFile file = Mockito.mock(PythonFile.class, "file1.py"); + private PythonFile file = mock(PythonFile.class, "file1.py"); @Test void test_simple_kill() { diff --git a/python-frontend/src/test/java/org/sonar/python/cfg/fixpoint/ReachingDefinitionsAnalysisTest.java b/python-frontend/src/test/java/org/sonar/python/cfg/fixpoint/ReachingDefinitionsAnalysisTest.java index 4da5981d9..1d4626a6a 100644 --- a/python-frontend/src/test/java/org/sonar/python/cfg/fixpoint/ReachingDefinitionsAnalysisTest.java +++ b/python-frontend/src/test/java/org/sonar/python/cfg/fixpoint/ReachingDefinitionsAnalysisTest.java @@ -23,9 +23,9 @@ import static org.sonar.python.PythonTestUtils.lastExpression; import static org.sonar.python.PythonTestUtils.lastExpressionInFunction; import static org.sonar.python.PythonTestUtils.parse; +import static org.mockito.Mockito.mock; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.sonar.plugins.python.api.PythonFile; import org.sonar.plugins.python.api.tree.Expression; import org.sonar.plugins.python.api.tree.ExpressionStatement; @@ -34,7 +34,7 @@ import org.sonar.plugins.python.api.tree.NumericLiteral; class ReachingDefinitionsAnalysisTest { - private final PythonFile file = Mockito.mock(PythonFile.class, "file1.py"); + private final PythonFile file = mock(PythonFile.class, "file1.py"); ReachingDefinitionsAnalysis analysis = new ReachingDefinitionsAnalysis(file); @Test diff --git a/python-frontend/src/test/java/org/sonar/python/quickfix/TextEditUtilsTest.java b/python-frontend/src/test/java/org/sonar/python/quickfix/TextEditUtilsTest.java index 952d1625b..af93438b7 100644 --- a/python-frontend/src/test/java/org/sonar/python/quickfix/TextEditUtilsTest.java +++ b/python-frontend/src/test/java/org/sonar/python/quickfix/TextEditUtilsTest.java @@ -18,7 +18,6 @@ import java.util.List; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.sonar.plugins.python.api.PythonLine; import org.sonar.plugins.python.api.quickfix.PythonTextEdit; import org.sonar.plugins.python.api.tree.CallExpression; @@ -33,6 +32,7 @@ import org.sonarsource.analyzer.commons.collections.ListUtils; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.sonar.python.PythonTestUtils.parse; @@ -232,7 +232,7 @@ private void assertTextEditLocation(PythonTextEdit textEdit, int startLine, int } private static Token mockToken(String value, int line, int column) { - Token token = Mockito.mock(Token.class); + Token token = mock(Token.class); when(token.firstToken()).thenReturn(token); when(token.lastToken()).thenReturn(token); diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/FullyQualifiedNameTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/FullyQualifiedNameTest.java index 0ce307592..d996033f3 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/FullyQualifiedNameTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/FullyQualifiedNameTest.java @@ -19,7 +19,6 @@ import java.net.URI; import javax.annotation.Nullable; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.sonar.plugins.python.api.PythonFile; import org.sonar.plugins.python.api.PythonVisitorContext; import org.sonar.plugins.python.api.symbols.Symbol; @@ -37,6 +36,7 @@ import org.sonar.python.tree.PythonTreeMaker; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.sonar.python.PythonTestUtils.getAllDescendant; import static org.sonar.python.PythonTestUtils.getFirstChild; @@ -467,7 +467,7 @@ void from_import_submodule() { void init_module_relative_import() { String code = String.join(System.getProperty("line.separator"), "from .. import fn", "fn()", "class A: pass"); FileInput fileInput = new PythonTreeMaker().fileInput(PythonParser.create().parse(code)); - PythonFile pythonFile = Mockito.mock(PythonFile.class, "__init__.py"); + PythonFile pythonFile = mock(PythonFile.class, "__init__.py"); when(pythonFile.fileName()).thenReturn("__init__.py"); when(pythonFile.uri()).thenReturn(URI.create("mod/__init__.py")); PythonVisitorContext context = new PythonVisitorContext.Builder(fileInput, pythonFile).packageName("foo.bar").build(); diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/SymbolUtilsTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/SymbolUtilsTest.java index 11c806cf3..27a1efa24 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/SymbolUtilsTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/SymbolUtilsTest.java @@ -43,7 +43,6 @@ import java.util.Objects; import javax.annotation.Nullable; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.sonar.plugins.python.api.PythonFile; import org.sonar.plugins.python.api.symbols.ClassSymbol; import org.sonar.plugins.python.api.symbols.FunctionSymbol; @@ -254,17 +253,17 @@ void fqn_by_package_with_subpackage() { @Test void path_of() throws IOException, URISyntaxException { - PythonFile pythonFile = Mockito.mock(PythonFile.class); + PythonFile pythonFile = mock(PythonFile.class); URI uri = Files.createTempFile("foo.py", "py").toUri(); - Mockito.when(pythonFile.uri()).thenReturn(uri); + when(pythonFile.uri()).thenReturn(uri); assertThat(pathOf(pythonFile)).isEqualTo(Paths.get(uri)); uri = new URI("myscheme", null, "/file1.py", null); - Mockito.when(pythonFile.uri()).thenReturn(uri); + when(pythonFile.uri()).thenReturn(uri); assertThat(pathOf(pythonFile)).isNull(); - Mockito.when(pythonFile.uri()).thenThrow(InvalidPathException.class); + when(pythonFile.uri()).thenThrow(InvalidPathException.class); assertThat(pathOf(pythonFile)).isNull(); } diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/UsageImplTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/UsageImplTest.java index 04f77527e..381370829 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/UsageImplTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/UsageImplTest.java @@ -17,11 +17,11 @@ package org.sonar.python.semantic; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.sonar.plugins.python.api.symbols.Usage; import org.sonar.plugins.python.api.tree.Tree; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; class UsageImplTest { @@ -39,7 +39,7 @@ void binding_usages() { } private static void assertBindingUsage(Usage.Kind kind, boolean isBinding) { - Tree mockTree = Mockito.mock(Tree.class); + Tree mockTree = mock(Tree.class); UsageImpl usage = new UsageImpl(mockTree, kind); assertThat(usage.kind()).isEqualTo(kind); assertThat(usage.isBindingUsage()).isEqualTo(isBinding); diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/TypeInferenceV2Test.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/TypeInferenceV2Test.java index 555583857..fc11f3ebe 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/TypeInferenceV2Test.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/TypeInferenceV2Test.java @@ -33,7 +33,6 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import org.mockito.Mockito; import org.sonar.plugins.python.api.LocationInFile; import org.sonar.plugins.python.api.PythonFile; import org.sonar.plugins.python.api.PythonVisitorContext; @@ -110,6 +109,10 @@ import static org.sonar.python.types.v2.TypesTestUtils.STR_TYPE; import static org.sonar.python.types.v2.TypesTestUtils.TUPLE_TYPE; import static org.sonar.python.types.v2.TypesTestUtils.TYPE_TYPE; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; public class TypeInferenceV2Test { @@ -3126,15 +3129,15 @@ void return_type_of_call_expression_inconsistent() { """ ); CallExpression callExpression = ((CallExpression) ((ExpressionStatement) fileInput.statements().statements().get(0)).expressions().get(0)); - CallExpression callExpressionSpy = Mockito.spy(callExpression); + CallExpression callExpressionSpy = spy(callExpression); // Inconsistent union type, should not happen - UnionType unionType = Mockito.mock(UnionType.class); - Mockito.when(unionType.candidates()).thenReturn(Set.of(PythonType.UNKNOWN)); + UnionType unionType = mock(UnionType.class); + when(unionType.candidates()).thenReturn(Set.of(PythonType.UNKNOWN)); - Name mock = Mockito.mock(Name.class); - Mockito.when(mock.typeV2()).thenReturn(unionType); - Mockito.doReturn(mock).when(callExpressionSpy).callee(); + Name mock = mock(Name.class); + when(mock.typeV2()).thenReturn(unionType); + doReturn(mock).when(callExpressionSpy).callee(); assertThat(callExpressionSpy.typeV2()).isEqualTo(PythonType.UNKNOWN); } @@ -3147,15 +3150,15 @@ void return_type_of_call_expression_inconsistent_2() { """ ); CallExpression callExpression = ((CallExpression) ((ExpressionStatement) fileInput.statements().statements().get(0)).expressions().get(0)); - CallExpression callExpressionSpy = Mockito.spy(callExpression); + CallExpression callExpressionSpy = spy(callExpression); // Inconsistent union type, should not happen - UnionType unionType = Mockito.mock(UnionType.class); - Mockito.when(unionType.candidates()).thenReturn(Set.of()); + UnionType unionType = mock(UnionType.class); + when(unionType.candidates()).thenReturn(Set.of()); - Name mock = Mockito.mock(Name.class); - Mockito.when(mock.typeV2()).thenReturn(unionType); - Mockito.doReturn(mock).when(callExpressionSpy).callee(); + Name mock = mock(Name.class); + when(mock.typeV2()).thenReturn(unionType); + doReturn(mock).when(callExpressionSpy).callee(); assertThat(callExpressionSpy.typeV2()).isEqualTo(PythonType.UNKNOWN); } @@ -3273,8 +3276,8 @@ void resolveIncorrectLazyType2() { ModuleType builtinModule = symbolsModuleTypeProvider.getRootModule(); symbolsModuleTypeProvider.convertModuleType(List.of("typing"), builtinModule); - ClassSymbol symbol = Mockito.mock(ClassSymbolImpl.class); - Mockito.when(symbol.kind()).thenReturn(Symbol.Kind.OTHER); + ClassSymbol symbol = mock(ClassSymbolImpl.class); + when(symbol.kind()).thenReturn(Symbol.Kind.OTHER); assertThat(PROJECT_LEVEL_TYPE_TABLE.lazyTypesContext().getOrCreateLazyType("typing.Iterable.unknown").resolve()).isEqualTo(PythonType.UNKNOWN); } diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/AmbiguousDescriptorToPythonTypeConverterTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/AmbiguousDescriptorToPythonTypeConverterTest.java index f422ace1d..f208d63ce 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/AmbiguousDescriptorToPythonTypeConverterTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/AmbiguousDescriptorToPythonTypeConverterTest.java @@ -19,7 +19,6 @@ import java.util.Set; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.sonar.python.index.AmbiguousDescriptor; import org.sonar.python.index.ClassDescriptor; import org.sonar.python.index.Descriptor; @@ -28,13 +27,14 @@ import org.sonar.python.types.v2.LazyUnionType; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; class AmbiguousDescriptorToPythonTypeConverterTest { @Test void unsupportedClassTest() { - var ctx = Mockito.mock(ConversionContext.class); - var descriptor = Mockito.mock(ClassDescriptor.class); + var ctx = mock(ConversionContext.class); + var descriptor = mock(ClassDescriptor.class); var converter = new AmbiguousDescriptorToPythonTypeConverter(); Assertions.assertThatThrownBy(() -> converter.convert(ctx, descriptor)) .isInstanceOf(IllegalArgumentException.class) @@ -43,17 +43,17 @@ void unsupportedClassTest() { @Test void testDescriptorWithLazyTypes() { - var descriptor = Mockito.mock(Descriptor.class); + var descriptor = mock(Descriptor.class); when(descriptor.kind()).thenReturn(Descriptor.Kind.VARIABLE); - var descriptor2 = Mockito.mock(Descriptor.class); + var descriptor2 = mock(Descriptor.class); when(descriptor2.kind()).thenReturn(Descriptor.Kind.VARIABLE); - var lazyTypeContext = Mockito.mock(LazyTypesContext.class); + var lazyTypeContext = mock(LazyTypesContext.class); var lazyType1 = new LazyType("lazy1", lazyTypeContext); var lazyType2 = new LazyType("lazy2", lazyTypeContext); - var ctx = Mockito.mock(ConversionContext.class); + var ctx = mock(ConversionContext.class); when(ctx.convert(descriptor)).thenReturn(lazyType1); when(ctx.convert(descriptor2)).thenReturn(lazyType2); diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/ClassDescriptorToPythonTypeConverterTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/ClassDescriptorToPythonTypeConverterTest.java index 8a62dcb42..44de39cb0 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/ClassDescriptorToPythonTypeConverterTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/ClassDescriptorToPythonTypeConverterTest.java @@ -19,7 +19,6 @@ import java.util.Set; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.sonar.plugins.python.api.types.v2.ClassType; import org.sonar.plugins.python.api.types.v2.PythonType; import org.sonar.plugins.python.api.types.v2.SelfType; @@ -34,12 +33,13 @@ import org.sonar.python.semantic.v2.typetable.ProjectLevelTypeTable; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; class ClassDescriptorToPythonTypeConverterTest { @Test void unsupportedClassTest() { - var ctx = Mockito.mock(ConversionContext.class); - var descriptor = Mockito.mock(FunctionDescriptor.class); + var ctx = mock(ConversionContext.class); + var descriptor = mock(FunctionDescriptor.class); var converter = new ClassDescriptorToPythonTypeConverter(); Assertions.assertThatThrownBy(() -> converter.convert(ctx, descriptor)) .isInstanceOf(IllegalArgumentException.class) diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/ConversionContextTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/ConversionContextTest.java index 3f12bd4f2..810a4b03b 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/ConversionContextTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/ConversionContextTest.java @@ -18,18 +18,20 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.sonar.python.index.Descriptor; import org.sonar.python.semantic.v2.LazyTypesContext; import org.sonar.plugins.python.api.types.v2.PythonType; import org.sonar.plugins.python.api.types.v2.TypeOrigin; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + class ConversionContextTest { @Test void lazyTypeContextTest() { - var expectedLazyTypeContext = Mockito.mock(LazyTypesContext.class); - var rootConverter = Mockito.mock(DescriptorToPythonTypeConverter.class); + var expectedLazyTypeContext = mock(LazyTypesContext.class); + var rootConverter = mock(DescriptorToPythonTypeConverter.class); var ctx = new ConversionContext("", expectedLazyTypeContext, rootConverter, TypeOrigin.LOCAL); var lazyTypesContext = ctx.lazyTypesContext(); Assertions.assertSame(expectedLazyTypeContext, lazyTypesContext); @@ -37,11 +39,11 @@ void lazyTypeContextTest() { @Test void parentsTest() { - var expectedLazyTypeContext = Mockito.mock(LazyTypesContext.class); - var rootConverter = Mockito.mock(DescriptorToPythonTypeConverter.class); + var expectedLazyTypeContext = mock(LazyTypesContext.class); + var rootConverter = mock(DescriptorToPythonTypeConverter.class); var ctx = new ConversionContext("", expectedLazyTypeContext, rootConverter, TypeOrigin.LOCAL); - var firstParent = Mockito.mock(PythonType.class); - var secondParent = Mockito.mock(PythonType.class); + var firstParent = mock(PythonType.class); + var secondParent = mock(PythonType.class); Assertions.assertNull(ctx.currentParent()); ctx.pushParent(firstParent); @@ -56,14 +58,14 @@ void parentsTest() { @Test void convertTest() { - var descriptor = Mockito.mock(Descriptor.class); - var expectedType = Mockito.mock(PythonType.class); + var descriptor = mock(Descriptor.class); + var expectedType = mock(PythonType.class); - var lazyTypeContext = Mockito.mock(LazyTypesContext.class); - var rootConverter = Mockito.mock(DescriptorToPythonTypeConverter.class); + var lazyTypeContext = mock(LazyTypesContext.class); + var rootConverter = mock(DescriptorToPythonTypeConverter.class); var ctx = new ConversionContext("", lazyTypeContext, rootConverter, TypeOrigin.LOCAL); - Mockito.when(rootConverter.convert(ctx, descriptor)) + when(rootConverter.convert(ctx, descriptor)) .thenReturn(expectedType); var type = ctx.convert(descriptor); diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/DescriptorToPythonTypeConverterTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/DescriptorToPythonTypeConverterTest.java index df87a587e..7f8aeb1c2 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/DescriptorToPythonTypeConverterTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/DescriptorToPythonTypeConverterTest.java @@ -20,7 +20,6 @@ import java.util.Set; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.sonar.plugins.python.api.LocationInFile; import org.sonar.python.index.AmbiguousDescriptor; import org.sonar.python.index.ClassDescriptor; @@ -42,13 +41,17 @@ import org.sonar.plugins.python.api.types.v2.TypeWrapper; import org.sonar.plugins.python.api.types.v2.UnionType; +import static org.mockito.Mockito.argThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + class DescriptorToPythonTypeConverterTest { @Test void unknownDescriptorToPythonTypeConverterTest() { - var ctx = Mockito.mock(ConversionContext.class); - var descriptor = Mockito.mock(Descriptor.class); - Mockito.when(descriptor.kind()).thenReturn(null); + var ctx = mock(ConversionContext.class); + var descriptor = mock(Descriptor.class); + when(descriptor.kind()).thenReturn(null); var converter = new UnknownDescriptorToPythonTypeConverter(); var type = converter.convert(ctx, descriptor); Assertions.assertThat(type).isEqualTo(PythonType.UNKNOWN); @@ -56,21 +59,21 @@ void unknownDescriptorToPythonTypeConverterTest() { @Test void ambiguousDescriptorConversionTest() { - var lazyTypesContext = Mockito.mock(LazyTypesContext.class); + var lazyTypesContext = mock(LazyTypesContext.class); var converter = new AnyDescriptorToPythonTypeConverter(lazyTypesContext); - var descriptorAlternative1 = Mockito.mock(FunctionDescriptor.class); + var descriptorAlternative1 = mock(FunctionDescriptor.class); var returnTypeName = "Returned"; String fullyQualifiedName = "returned.ReturnTypeName"; var resolvedReturnType = new ClassTypeBuilder(returnTypeName, fullyQualifiedName).build(); - Mockito.when(lazyTypesContext.resolveLazyType(Mockito.argThat(lt -> returnTypeName.equals(lt.importPath())))) + when(lazyTypesContext.resolveLazyType(argThat(lt -> returnTypeName.equals(lt.importPath())))) .thenReturn(resolvedReturnType); - Mockito.when(descriptorAlternative1.kind()).thenReturn(Descriptor.Kind.FUNCTION); - Mockito.when(descriptorAlternative1.name()).thenReturn("Sample"); - Mockito.when(descriptorAlternative1.annotatedReturnTypeName()).thenReturn(returnTypeName); - Mockito.when(descriptorAlternative1.parameters()).thenReturn(List.of( + when(descriptorAlternative1.kind()).thenReturn(Descriptor.Kind.FUNCTION); + when(descriptorAlternative1.name()).thenReturn("Sample"); + when(descriptorAlternative1.annotatedReturnTypeName()).thenReturn(returnTypeName); + when(descriptorAlternative1.parameters()).thenReturn(List.of( new FunctionDescriptor.Parameter( "p1", "Returned", @@ -83,11 +86,11 @@ void ambiguousDescriptorConversionTest() { new LocationInFile("m1", 1, 10, 1, 15)) )); - var descriptorAlternative2 = Mockito.mock(FunctionDescriptor.class); - Mockito.when(descriptorAlternative2.kind()).thenReturn(Descriptor.Kind.FUNCTION); - Mockito.when(descriptorAlternative2.name()).thenReturn("Sample"); - Mockito.when(descriptorAlternative2.annotatedReturnTypeName()).thenReturn(returnTypeName); - Mockito.when(descriptorAlternative2.parameters()).thenReturn(List.of( + var descriptorAlternative2 = mock(FunctionDescriptor.class); + when(descriptorAlternative2.kind()).thenReturn(Descriptor.Kind.FUNCTION); + when(descriptorAlternative2.name()).thenReturn("Sample"); + when(descriptorAlternative2.annotatedReturnTypeName()).thenReturn(returnTypeName); + when(descriptorAlternative2.parameters()).thenReturn(List.of( new FunctionDescriptor.Parameter( "p2", "Returned", @@ -100,9 +103,9 @@ void ambiguousDescriptorConversionTest() { new LocationInFile("m1", 2, 10, 2, 15)) )); - var descriptor = Mockito.mock(AmbiguousDescriptor.class); - Mockito.when(descriptor.kind()).thenReturn(Descriptor.Kind.AMBIGUOUS); - Mockito.when(descriptor.alternatives()).thenReturn(Set.of(descriptorAlternative1, descriptorAlternative2)); + var descriptor = mock(AmbiguousDescriptor.class); + when(descriptor.kind()).thenReturn(Descriptor.Kind.AMBIGUOUS); + when(descriptor.alternatives()).thenReturn(Set.of(descriptorAlternative1, descriptorAlternative2)); var type = (UnionType) converter.convert("", descriptor, TypeOrigin.LOCAL); Assertions.assertThat(type.candidates()) @@ -118,28 +121,28 @@ void ambiguousDescriptorConversionTest() { @Test void classDescriptorConversionTest() { - var lazyTypesContext = Mockito.mock(LazyTypesContext.class); + var lazyTypesContext = mock(LazyTypesContext.class); var converter = new AnyDescriptorToPythonTypeConverter(lazyTypesContext); - var descriptor = Mockito.mock(ClassDescriptor.class); + var descriptor = mock(ClassDescriptor.class); var parentClassName = "Parent"; String parentClassFqn = "parent.Parent"; var resolvedParent = new ClassTypeBuilder(parentClassName, parentClassFqn).build(); - var member = Mockito.mock(AmbiguousDescriptor.class); - Mockito.when(member.kind()).thenReturn(Descriptor.Kind.AMBIGUOUS); - Mockito.when(member.name()).thenReturn("member"); + var member = mock(AmbiguousDescriptor.class); + when(member.kind()).thenReturn(Descriptor.Kind.AMBIGUOUS); + when(member.name()).thenReturn("member"); - Mockito.when(descriptor.kind()).thenReturn(Descriptor.Kind.CLASS); - Mockito.when(descriptor.name()).thenReturn("Sample"); - Mockito.when(descriptor.superClasses()).thenReturn(List.of(parentClassName)); - Mockito.when(descriptor.members()).thenReturn(List.of( + when(descriptor.kind()).thenReturn(Descriptor.Kind.CLASS); + when(descriptor.name()).thenReturn("Sample"); + when(descriptor.superClasses()).thenReturn(List.of(parentClassName)); + when(descriptor.members()).thenReturn(List.of( member )); - Mockito.when(lazyTypesContext.getOrCreateLazyType(parentClassName)) + when(lazyTypesContext.getOrCreateLazyType(parentClassName)) .thenReturn(new LazyType(parentClassName, lazyTypesContext)); - Mockito.when(lazyTypesContext.resolveLazyType(Mockito.argThat(lt -> parentClassName.equals(lt.importPath())))) + when(lazyTypesContext.resolveLazyType(argThat(lt -> parentClassName.equals(lt.importPath())))) .thenReturn(resolvedParent); var type = (ClassType) converter.convert("", descriptor, TypeOrigin.LOCAL); @@ -157,24 +160,24 @@ void classDescriptorConversionTest() { @Test void functionDescriptorConversionTest() { - var lazyTypesContext = Mockito.mock(LazyTypesContext.class); + var lazyTypesContext = mock(LazyTypesContext.class); var converter = new AnyDescriptorToPythonTypeConverter(lazyTypesContext); - var descriptor = Mockito.mock(FunctionDescriptor.class); + var descriptor = mock(FunctionDescriptor.class); var returnTypeName = "Returned"; String returnTypeFqn = "returned.Returned"; var resolvedReturnType = new ClassTypeBuilder(returnTypeName, returnTypeFqn).build(); - Mockito.when(descriptor.kind()).thenReturn(Descriptor.Kind.FUNCTION); - Mockito.when(descriptor.name()).thenReturn("Sample"); - Mockito.when(descriptor.annotatedReturnTypeName()).thenReturn(returnTypeName); + when(descriptor.kind()).thenReturn(Descriptor.Kind.FUNCTION); + when(descriptor.name()).thenReturn("Sample"); + when(descriptor.annotatedReturnTypeName()).thenReturn(returnTypeName); - TypeAnnotationDescriptor typeAnnotationDescriptor = Mockito.mock(TypeAnnotationDescriptor.class); - Mockito.when(typeAnnotationDescriptor.kind()).thenReturn(TypeAnnotationDescriptor.TypeKind.INSTANCE); - Mockito.when(typeAnnotationDescriptor.fullyQualifiedName()).thenReturn(returnTypeName); - Mockito.when(descriptor.typeAnnotationDescriptor()).thenReturn(typeAnnotationDescriptor); + TypeAnnotationDescriptor typeAnnotationDescriptor = mock(TypeAnnotationDescriptor.class); + when(typeAnnotationDescriptor.kind()).thenReturn(TypeAnnotationDescriptor.TypeKind.INSTANCE); + when(typeAnnotationDescriptor.fullyQualifiedName()).thenReturn(returnTypeName); + when(descriptor.typeAnnotationDescriptor()).thenReturn(typeAnnotationDescriptor); - Mockito.when(descriptor.parameters()).thenReturn(List.of( + when(descriptor.parameters()).thenReturn(List.of( new FunctionDescriptor.Parameter( "p1", "Returned", @@ -187,10 +190,10 @@ void functionDescriptorConversionTest() { new LocationInFile("m1", 1, 10, 1, 15)) )); - Mockito.when(lazyTypesContext.getOrCreateLazyType(returnTypeName)) + when(lazyTypesContext.getOrCreateLazyType(returnTypeName)) .thenReturn(new LazyType(returnTypeName, lazyTypesContext)); - Mockito.when(lazyTypesContext.resolveLazyType(Mockito.argThat(lt -> returnTypeName.equals(lt.importPath())))) + when(lazyTypesContext.resolveLazyType(argThat(lt -> returnTypeName.equals(lt.importPath())))) .thenReturn(resolvedReturnType); var type = (FunctionType) converter.convert("", descriptor, TypeOrigin.LOCAL); @@ -209,22 +212,22 @@ void functionDescriptorConversionTest() { @Test void variableDescriptorConversionTest() { - var lazyTypesContext = Mockito.mock(LazyTypesContext.class); + var lazyTypesContext = mock(LazyTypesContext.class); var converter = new AnyDescriptorToPythonTypeConverter(lazyTypesContext); - var descriptor = Mockito.mock(VariableDescriptor.class); + var descriptor = mock(VariableDescriptor.class); var variableTypeName = "Returned"; String variableTypeFqn = "returned.Returned"; var resolvedVariableType = new ClassTypeBuilder(variableTypeName, variableTypeFqn).build(); - Mockito.when(descriptor.kind()).thenReturn(Descriptor.Kind.VARIABLE); - Mockito.when(descriptor.name()).thenReturn("variable"); - Mockito.when(descriptor.annotatedType()).thenReturn(variableTypeName); + when(descriptor.kind()).thenReturn(Descriptor.Kind.VARIABLE); + when(descriptor.name()).thenReturn("variable"); + when(descriptor.annotatedType()).thenReturn(variableTypeName); - Mockito.when(lazyTypesContext.getOrCreateLazyTypeWrapper(variableTypeName)) + when(lazyTypesContext.getOrCreateLazyTypeWrapper(variableTypeName)) .thenReturn(new LazyTypeWrapper(new LazyType(variableTypeName, lazyTypesContext))); - Mockito.when(lazyTypesContext.resolveLazyType(Mockito.argThat(lt -> variableTypeName.equals(lt.importPath())))) + when(lazyTypesContext.resolveLazyType(argThat(lt -> variableTypeName.equals(lt.importPath())))) .thenReturn(resolvedVariableType); var type = (ObjectType) converter.convert("", descriptor, TypeOrigin.LOCAL); diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/FunctionDescriptorToPythonTypeConverterTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/FunctionDescriptorToPythonTypeConverterTest.java index 21d617c2d..3dca6aa31 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/FunctionDescriptorToPythonTypeConverterTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/FunctionDescriptorToPythonTypeConverterTest.java @@ -18,14 +18,15 @@ import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.sonar.python.index.ClassDescriptor; +import static org.mockito.Mockito.mock; + class FunctionDescriptorToPythonTypeConverterTest { @Test void unsupportedClassTest() { - var ctx = Mockito.mock(ConversionContext.class); - var descriptor = Mockito.mock(ClassDescriptor.class); + var ctx = mock(ConversionContext.class); + var descriptor = mock(ClassDescriptor.class); var converter = new FunctionDescriptorToPythonTypeConverter(); Assertions.assertThatThrownBy(() -> converter.convert(ctx, descriptor)) .isInstanceOf(IllegalArgumentException.class) diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/TypeAnnotationToPythonTypeConverterTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/TypeAnnotationToPythonTypeConverterTest.java index b40aaa6d1..c843ebc08 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/TypeAnnotationToPythonTypeConverterTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/TypeAnnotationToPythonTypeConverterTest.java @@ -19,7 +19,6 @@ import java.util.List; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.sonar.plugins.python.api.types.v2.ObjectType; import org.sonar.plugins.python.api.types.v2.PythonType; import org.sonar.python.index.TypeAnnotationDescriptor; @@ -27,16 +26,18 @@ import org.sonar.python.types.v2.TypesTestUtils; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; class TypeAnnotationToPythonTypeConverterTest { @Test void typeVarWithIncorrectArgsAndIsSelfTrueReturnsUnknown() { - var lazyTypesContext = Mockito.mock(LazyTypesContext.class); - var ctx = Mockito.mock(ConversionContext.class); + var lazyTypesContext = mock(LazyTypesContext.class); + var ctx = mock(ConversionContext.class); var converter = new TypeAnnotationToPythonTypeConverter(); - Mockito.when(ctx.lazyTypesContext()).thenReturn(lazyTypesContext); + when(ctx.lazyTypesContext()).thenReturn(lazyTypesContext); // Create a TYPE_VAR TypeAnnotationDescriptor with isSelf=true and multiple args var innerArg1 = new TypeAnnotationDescriptor("int", TypeAnnotationDescriptor.TypeKind.INSTANCE, List.of(), "int", false); @@ -74,10 +75,10 @@ void typeVarWithIncorrectArgsAndIsSelfTrueReturnsUnknown() { @Test void testListInstanceWithAttributes() { var lazyTypesContext = new LazyTypesContext(TypesTestUtils.PROJECT_LEVEL_TYPE_TABLE); - var ctx = Mockito.mock(ConversionContext.class); + var ctx = mock(ConversionContext.class); var converter = new TypeAnnotationToPythonTypeConverter(); - Mockito.when(ctx.lazyTypesContext()).thenReturn(lazyTypesContext); + when(ctx.lazyTypesContext()).thenReturn(lazyTypesContext); // Create a INSTANCE TypeAnnotationDescriptor for list[int] var intArg = new TypeAnnotationDescriptor("int", TypeAnnotationDescriptor.TypeKind.INSTANCE, List.of(), "int", false); diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/VariableDescriptorToPythonTypeConverterTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/VariableDescriptorToPythonTypeConverterTest.java index 97f30c576..fd033ba86 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/VariableDescriptorToPythonTypeConverterTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/converter/VariableDescriptorToPythonTypeConverterTest.java @@ -19,7 +19,6 @@ import java.util.List; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.sonar.plugins.python.api.types.v2.ObjectType; import org.sonar.plugins.python.api.types.v2.PythonType; import org.sonar.python.index.ClassDescriptor; @@ -30,12 +29,13 @@ import org.sonar.python.types.v2.SpecialFormType; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; class VariableDescriptorToPythonTypeConverterTest { @Test void unsupportedClassTest() { - var ctx = Mockito.mock(ConversionContext.class); - var descriptor = Mockito.mock(ClassDescriptor.class); + var ctx = mock(ConversionContext.class); + var descriptor = mock(ClassDescriptor.class); var converter = new VariableDescriptorToPythonTypeConverter(); Assertions.assertThatThrownBy(() -> converter.convert(ctx, descriptor)) .isInstanceOf(IllegalArgumentException.class) @@ -44,7 +44,7 @@ void unsupportedClassTest() { @Test void testSpecialFormTypeConversion() { - var ctx = Mockito.mock(ConversionContext.class); + var ctx = mock(ConversionContext.class); var converter = new VariableDescriptorToPythonTypeConverter(); var typingSelfDescriptor = new VariableDescriptor("Self", "typing.Self", "typing._SpecialForm"); diff --git a/python-frontend/src/test/java/org/sonar/python/types/TypeShedTest.java b/python-frontend/src/test/java/org/sonar/python/types/TypeShedTest.java index 8cbde5be2..4c245d38c 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/TypeShedTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/TypeShedTest.java @@ -27,7 +27,6 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -import org.mockito.Mockito; import org.slf4j.event.Level; import org.sonar.api.testfixtures.log.LogTesterJUnit5; import org.sonar.plugins.python.api.ProjectPythonVersion; @@ -48,6 +47,8 @@ import static org.assertj.core.api.Assertions.tuple; import static org.sonar.python.types.TypeShed.symbolWithFQN; import static org.sonar.python.types.TypeShed.symbolsForModule; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; class TypeShedTest { @@ -148,10 +149,10 @@ void stdlib_symbols() { @Test void symbols_not_retrieved_when_within_same_project() { - ProjectLevelSymbolTable projectLevelSymbolTable = Mockito.mock(ProjectLevelSymbolTable.class); + ProjectLevelSymbolTable projectLevelSymbolTable = mock(ProjectLevelSymbolTable.class); TypeShed.setProjectLevelSymbolTable(projectLevelSymbolTable); - Mockito.when(projectLevelSymbolTable.projectBasePackages()).thenReturn(Set.of("sklearn")); + when(projectLevelSymbolTable.projectBasePackages()).thenReturn(Set.of("sklearn")); Map sklearnSymbols = symbolsForModule("sklearn.ensemble"); assertThat(sklearnSymbols).isEmpty(); sklearnSymbols = symbolsForModule("sklearn"); @@ -159,7 +160,7 @@ void symbols_not_retrieved_when_within_same_project() { Symbol symbol = symbolWithFQN("sklearn.ensemble", "sklearn.ensemble.RandomForestClassifier"); assertThat(symbol).isNull(); - Mockito.when(projectLevelSymbolTable.projectBasePackages()).thenReturn(Set.of("unrelated")); + when(projectLevelSymbolTable.projectBasePackages()).thenReturn(Set.of("unrelated")); sklearnSymbols = symbolsForModule("sklearn.ensemble"); assertThat(sklearnSymbols).isNotEmpty(); symbol = symbolWithFQN("sklearn.ensemble", "sklearn.ensemble.RandomForestClassifier"); diff --git a/python-frontend/src/test/java/org/sonar/python/types/v2/LazyTypeTest.java b/python-frontend/src/test/java/org/sonar/python/types/v2/LazyTypeTest.java index 03aaadeb3..f5d6277cf 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/v2/LazyTypeTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/v2/LazyTypeTest.java @@ -17,7 +17,6 @@ package org.sonar.python.types.v2; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.sonar.plugins.python.api.types.v2.FunctionType; import org.sonar.plugins.python.api.types.v2.PythonType; import org.sonar.python.semantic.ProjectLevelSymbolTable; @@ -26,6 +25,8 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.sonar.python.types.v2.TypesTestUtils.BOOL_TYPE; import static org.sonar.python.types.v2.TypesTestUtils.INT_TYPE; @@ -34,8 +35,8 @@ class LazyTypeTest { @Test void lazyTypeThrowExceptionsWhenInteractedWith() { - LazyTypesContext lazyTypesContext = Mockito.mock(LazyTypesContext.class); - when(lazyTypesContext.resolveLazyType(Mockito.any())).thenReturn(INT_TYPE); + LazyTypesContext lazyTypesContext = mock(LazyTypesContext.class); + when(lazyTypesContext.resolveLazyType(any())).thenReturn(INT_TYPE); LazyType lazyType = new LazyType("random", lazyTypesContext); assertThat(lazyType.resolve()).isEqualTo(INT_TYPE); assertThatThrownBy(lazyType::unwrappedType).isInstanceOf(IllegalStateException.class).hasMessage("Lazy types should not be interacted with."); diff --git a/python-frontend/src/test/java/org/sonar/python/types/v2/LazyTypeWrapperTest.java b/python-frontend/src/test/java/org/sonar/python/types/v2/LazyTypeWrapperTest.java index b5148df01..e56fcdf7d 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/v2/LazyTypeWrapperTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/v2/LazyTypeWrapperTest.java @@ -17,10 +17,11 @@ package org.sonar.python.types.v2; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.sonar.python.semantic.v2.LazyTypesContext; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.sonar.python.types.v2.TypesTestUtils.INT_TYPE; import static org.sonar.python.types.v2.TypesTestUtils.STR_TYPE; @@ -32,8 +33,8 @@ class LazyTypeWrapperTest { @Test void lazyTypeIsResolvedWhenAccessed() { - LazyTypesContext lazyTypesContext = Mockito.mock(LazyTypesContext.class); - when(lazyTypesContext.resolveLazyType(Mockito.any())).thenReturn(INT_TYPE); + LazyTypesContext lazyTypesContext = mock(LazyTypesContext.class); + when(lazyTypesContext.resolveLazyType(any())).thenReturn(INT_TYPE); LazyType lazyType = new LazyType("random", lazyTypesContext); LazyTypeWrapper lazyTypeWrapper = new LazyTypeWrapper(lazyType); assertThat(lazyTypeWrapper.isResolved()).isFalse(); @@ -51,7 +52,7 @@ void resolvingNonLazyTypeThrowsException() { @Test void testEquals() { - var lazyTypeWrapper = new LazyTypeWrapper(new LazyType("random", Mockito.mock(LazyTypesContext.class))); + var lazyTypeWrapper = new LazyTypeWrapper(new LazyType("random", mock(LazyTypesContext.class))); assertThat(lazyTypeWrapper.equals(lazyTypeWrapper)).isTrue(); assertThat(lazyTypeWrapper.equals(null)).isFalse(); assertThat(lazyTypeWrapper.equals("str")).isFalse(); @@ -59,7 +60,7 @@ void testEquals() { @Test void testToString() { - var lazyTypeWrapper = new LazyTypeWrapper(new LazyType("random", Mockito.mock(LazyTypesContext.class))); + var lazyTypeWrapper = new LazyTypeWrapper(new LazyType("random", mock(LazyTypesContext.class))); assertThat(lazyTypeWrapper.toString()).startsWith("LazyTypeWrapper{type="); } } diff --git a/python-frontend/src/test/java/org/sonar/python/types/v2/LazyUnionTypeTest.java b/python-frontend/src/test/java/org/sonar/python/types/v2/LazyUnionTypeTest.java index ac4eb6b3f..5444c9900 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/v2/LazyUnionTypeTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/v2/LazyUnionTypeTest.java @@ -18,7 +18,6 @@ import java.util.Set; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.sonar.plugins.python.api.types.v2.PythonType; import org.sonar.plugins.python.api.types.v2.UnionType; import org.sonar.plugins.python.api.types.v2.UnknownType; @@ -27,6 +26,9 @@ import org.sonar.python.semantic.v2.typetable.ProjectLevelTypeTable; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import static org.sonar.python.types.v2.TypesTestUtils.FLOAT_TYPE; import static org.sonar.python.types.v2.TypesTestUtils.INT_TYPE; @@ -35,8 +37,8 @@ class LazyUnionTypeTest { @Test void lazyUnionTypeResolvesNestedLazyTypesWhenAccessed() { - LazyTypesContext lazyTypesContext = Mockito.mock(LazyTypesContext.class); - when(lazyTypesContext.resolveLazyType(Mockito.any())).thenReturn(INT_TYPE); + LazyTypesContext lazyTypesContext = mock(LazyTypesContext.class); + when(lazyTypesContext.resolveLazyType(any())).thenReturn(INT_TYPE); LazyType lazyType = new LazyType("random", lazyTypesContext); LazyUnionType lazyUnionType = (LazyUnionType) LazyUnionType.or(Set.of(lazyType, FLOAT_TYPE)); UnionType unionType = (UnionType) lazyUnionType.resolve(); @@ -45,7 +47,7 @@ void lazyUnionTypeResolvesNestedLazyTypesWhenAccessed() { @Test void flattened() { - LazyTypesContext lazyTypesContext = Mockito.spy(new LazyTypesContext(new ProjectLevelTypeTable(ProjectLevelSymbolTable.empty()))); + LazyTypesContext lazyTypesContext = spy(new LazyTypesContext(new ProjectLevelTypeTable(ProjectLevelSymbolTable.empty()))); var lazyType1 = lazyTypeUnresolved("lazy1", lazyTypesContext); var lazyType2 = lazyTypeUnresolved("lazy2", lazyTypesContext); diff --git a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/AllTypePredicateTest.java b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/AllTypePredicateTest.java index 593e3b57a..78ebc9338 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/AllTypePredicateTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/AllTypePredicateTest.java @@ -17,7 +17,6 @@ package org.sonar.python.types.v2.matchers; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.sonar.plugins.python.api.TriBool; import org.sonar.plugins.python.api.tree.Expression; import org.sonar.plugins.python.api.types.v2.FunctionType; @@ -26,51 +25,54 @@ import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; class AllTypePredicateTest { @Test void testPredicate() { - FunctionType function1 = Mockito.mock(FunctionType.class); - Expression expression1 = Mockito.mock(); - Mockito.when(expression1.typeV2()).thenReturn(function1); + FunctionType function1 = mock(FunctionType.class); + Expression expression1 = mock(); + when(expression1.typeV2()).thenReturn(function1); - TypePredicate truePredicate = Mockito.mock(TypePredicate.class); - Mockito.when(truePredicate.check(Mockito.any(), Mockito.any())).thenReturn(TriBool.TRUE); + TypePredicate truePredicate = mock(TypePredicate.class); + when(truePredicate.check(any(), any())).thenReturn(TriBool.TRUE); - TypePredicate falsePredicate = Mockito.mock(TypePredicate.class); - Mockito.when(falsePredicate.check(Mockito.any(), Mockito.any())).thenReturn(TriBool.FALSE); + TypePredicate falsePredicate = mock(TypePredicate.class); + when(falsePredicate.check(any(), any())).thenReturn(TriBool.FALSE); - TypePredicate unknownPredicate = Mockito.mock(TypePredicate.class); - Mockito.when(unknownPredicate.check(Mockito.any(), Mockito.any())).thenReturn(TriBool.UNKNOWN); + TypePredicate unknownPredicate = mock(TypePredicate.class); + when(unknownPredicate.check(any(), any())).thenReturn(TriBool.UNKNOWN); TypeMatcher trueMatcher = MatchersTestUtils.createTypeMatcher(truePredicate); TypeMatcher falseMatcher = MatchersTestUtils.createTypeMatcher(falsePredicate); TypeMatcher unknownMatcher = MatchersTestUtils.createTypeMatcher(unknownPredicate); TypeMatcher singleTrue = TypeMatchers.all(trueMatcher); - assertThat(singleTrue.evaluateFor(expression1, Mockito.mock())).isEqualTo(TriBool.TRUE); + assertThat(singleTrue.evaluateFor(expression1, mock())).isEqualTo(TriBool.TRUE); TypeMatcher bothTrue = TypeMatchers.all(trueMatcher, trueMatcher); - assertThat(bothTrue.evaluateFor(expression1, Mockito.mock())).isEqualTo(TriBool.TRUE); + assertThat(bothTrue.evaluateFor(expression1, mock())).isEqualTo(TriBool.TRUE); TypeMatcher trueFalse = TypeMatchers.all(trueMatcher, falseMatcher); - assertThat(trueFalse.evaluateFor(expression1, Mockito.mock())).isEqualTo(TriBool.FALSE); + assertThat(trueFalse.evaluateFor(expression1, mock())).isEqualTo(TriBool.FALSE); TypeMatcher trueUnknown = TypeMatchers.all(trueMatcher, unknownMatcher); - assertThat(trueUnknown.evaluateFor(expression1, Mockito.mock())).isEqualTo(TriBool.UNKNOWN); + assertThat(trueUnknown.evaluateFor(expression1, mock())).isEqualTo(TriBool.UNKNOWN); TypeMatcher bothUnknown = TypeMatchers.all(unknownMatcher, unknownMatcher); - assertThat(bothUnknown.evaluateFor(expression1, Mockito.mock())).isEqualTo(TriBool.UNKNOWN); + assertThat(bothUnknown.evaluateFor(expression1, mock())).isEqualTo(TriBool.UNKNOWN); TypeMatcher falseTrue = TypeMatchers.all(falseMatcher, trueMatcher); - assertThat(falseTrue.evaluateFor(expression1, Mockito.mock())).isEqualTo(TriBool.FALSE); + assertThat(falseTrue.evaluateFor(expression1, mock())).isEqualTo(TriBool.FALSE); TypeMatcher falseUnknown = TypeMatchers.all(falseMatcher, unknownMatcher); - assertThat(falseUnknown.evaluateFor(expression1, Mockito.mock())).isEqualTo(TriBool.FALSE); + assertThat(falseUnknown.evaluateFor(expression1, mock())).isEqualTo(TriBool.FALSE); TypeMatcher unknownFalse = TypeMatchers.all(falseMatcher, unknownMatcher); - assertThat(unknownFalse.evaluateFor(expression1, Mockito.mock())).isEqualTo(TriBool.FALSE); + assertThat(unknownFalse.evaluateFor(expression1, mock())).isEqualTo(TriBool.FALSE); } } diff --git a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/AnyTypePredicateTest.java b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/AnyTypePredicateTest.java index 49dcfa61c..2e5192826 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/AnyTypePredicateTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/AnyTypePredicateTest.java @@ -17,7 +17,6 @@ package org.sonar.python.types.v2.matchers; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.sonar.plugins.python.api.TriBool; import org.sonar.plugins.python.api.tree.Expression; import org.sonar.plugins.python.api.types.v2.FunctionType; @@ -26,54 +25,57 @@ import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; class AnyTypePredicateTest { @Test void testPredicate() { - FunctionType function1 = Mockito.mock(FunctionType.class); - Expression expression1 = Mockito.mock(); - Mockito.when(expression1.typeV2()).thenReturn(function1); + FunctionType function1 = mock(FunctionType.class); + Expression expression1 = mock(); + when(expression1.typeV2()).thenReturn(function1); - TypePredicate truePredicate = Mockito.mock(TypePredicate.class); - Mockito.when(truePredicate.check(Mockito.any(), Mockito.any())).thenReturn(TriBool.TRUE); + TypePredicate truePredicate = mock(TypePredicate.class); + when(truePredicate.check(any(), any())).thenReturn(TriBool.TRUE); - TypePredicate falsePredicate = Mockito.mock(TypePredicate.class); - Mockito.when(falsePredicate.check(Mockito.any(), Mockito.any())).thenReturn(TriBool.FALSE); + TypePredicate falsePredicate = mock(TypePredicate.class); + when(falsePredicate.check(any(), any())).thenReturn(TriBool.FALSE); - TypePredicate unknownPredicate = Mockito.mock(TypePredicate.class); - Mockito.when(unknownPredicate.check(Mockito.any(), Mockito.any())).thenReturn(TriBool.UNKNOWN); + TypePredicate unknownPredicate = mock(TypePredicate.class); + when(unknownPredicate.check(any(), any())).thenReturn(TriBool.UNKNOWN); TypeMatcher trueMatcher = MatchersTestUtils.createTypeMatcher(truePredicate); TypeMatcher falseMatcher = MatchersTestUtils.createTypeMatcher(falsePredicate); TypeMatcher unknownMatcher = MatchersTestUtils.createTypeMatcher(unknownPredicate); TypeMatcher singleTrue = TypeMatchers.any(trueMatcher); - assertThat(singleTrue.evaluateFor(expression1, Mockito.mock())).isEqualTo(TriBool.TRUE); + assertThat(singleTrue.evaluateFor(expression1, mock())).isEqualTo(TriBool.TRUE); TypeMatcher bothTrue = TypeMatchers.any(trueMatcher, trueMatcher); - assertThat(bothTrue.evaluateFor(expression1, Mockito.mock())).isEqualTo(TriBool.TRUE); + assertThat(bothTrue.evaluateFor(expression1, mock())).isEqualTo(TriBool.TRUE); TypeMatcher falseTrue = TypeMatchers.any(falseMatcher, trueMatcher); - assertThat(falseTrue.evaluateFor(expression1, Mockito.mock())).isEqualTo(TriBool.TRUE); + assertThat(falseTrue.evaluateFor(expression1, mock())).isEqualTo(TriBool.TRUE); TypeMatcher trueFalse = TypeMatchers.any(trueMatcher, falseMatcher); - assertThat(trueFalse.evaluateFor(expression1, Mockito.mock())).isEqualTo(TriBool.TRUE); + assertThat(trueFalse.evaluateFor(expression1, mock())).isEqualTo(TriBool.TRUE); TypeMatcher trueUnknown = TypeMatchers.any(trueMatcher, unknownMatcher); - assertThat(trueUnknown.evaluateFor(expression1, Mockito.mock())).isEqualTo(TriBool.TRUE); + assertThat(trueUnknown.evaluateFor(expression1, mock())).isEqualTo(TriBool.TRUE); TypeMatcher bothUnknown = TypeMatchers.any(unknownMatcher, unknownMatcher); - assertThat(bothUnknown.evaluateFor(expression1, Mockito.mock())).isEqualTo(TriBool.UNKNOWN); + assertThat(bothUnknown.evaluateFor(expression1, mock())).isEqualTo(TriBool.UNKNOWN); TypeMatcher falseFalse = TypeMatchers.any(falseMatcher, falseMatcher); - assertThat(falseFalse.evaluateFor(expression1, Mockito.mock())).isEqualTo(TriBool.FALSE); + assertThat(falseFalse.evaluateFor(expression1, mock())).isEqualTo(TriBool.FALSE); TypeMatcher falseUnknown = TypeMatchers.any(falseMatcher, unknownMatcher); - assertThat(falseUnknown.evaluateFor(expression1, Mockito.mock())).isEqualTo(TriBool.UNKNOWN); + assertThat(falseUnknown.evaluateFor(expression1, mock())).isEqualTo(TriBool.UNKNOWN); TypeMatcher unknownFalse = TypeMatchers.any(falseMatcher, unknownMatcher); - assertThat(unknownFalse.evaluateFor(expression1, Mockito.mock())).isEqualTo(TriBool.UNKNOWN); + assertThat(unknownFalse.evaluateFor(expression1, mock())).isEqualTo(TriBool.UNKNOWN); } } diff --git a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/HasFQNPredicateTest.java b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/HasFQNPredicateTest.java index 645773aac..f63513001 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/HasFQNPredicateTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/HasFQNPredicateTest.java @@ -17,7 +17,6 @@ package org.sonar.python.types.v2.matchers; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.sonar.plugins.python.api.SubscriptionContext; import org.sonar.plugins.python.api.TriBool; import org.sonar.plugins.python.api.tree.Expression; @@ -29,49 +28,51 @@ import org.sonar.python.types.v2.SpecialFormType; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; class HasFQNPredicateTest { @Test void testCheck() { - FunctionType function1 = Mockito.mock(FunctionType.class); - FunctionType function2 = Mockito.mock(FunctionType.class); - FunctionType nullFunctionType = Mockito.mock(FunctionType.class); + FunctionType function1 = mock(FunctionType.class); + FunctionType function2 = mock(FunctionType.class); + FunctionType nullFunctionType = mock(FunctionType.class); - ClassType class1 = Mockito.mock(ClassType.class); - ClassType class2 = Mockito.mock(ClassType.class); - ClassType classWithSameFQNAsFunction = Mockito.mock(ClassType.class); + ClassType class1 = mock(ClassType.class); + ClassType class2 = mock(ClassType.class); + ClassType classWithSameFQNAsFunction = mock(ClassType.class); - UnknownType.UnresolvedImportType unresolvedImport = Mockito.mock(UnknownType.UnresolvedImportType.class); - UnknownType.UnresolvedImportType unresolvedImport2 = Mockito.mock(UnknownType.UnresolvedImportType.class); + UnknownType.UnresolvedImportType unresolvedImport = mock(UnknownType.UnresolvedImportType.class); + UnknownType.UnresolvedImportType unresolvedImport2 = mock(UnknownType.UnresolvedImportType.class); - ModuleType module1 = Mockito.mock(ModuleType.class); - ModuleType module2 = Mockito.mock(ModuleType.class); + ModuleType module1 = mock(ModuleType.class); + ModuleType module2 = mock(ModuleType.class); - SpecialFormType specialFormType1 = Mockito.mock(SpecialFormType.class); - SpecialFormType specialFormType2 = Mockito.mock(SpecialFormType.class); + SpecialFormType specialFormType1 = mock(SpecialFormType.class); + SpecialFormType specialFormType2 = mock(SpecialFormType.class); - UnknownType.UnknownTypeImpl unknownType = Mockito.mock(UnknownType.UnknownTypeImpl.class); + UnknownType.UnknownTypeImpl unknownType = mock(UnknownType.UnknownTypeImpl.class); - Expression func1Expression = Mockito.mock(Expression.class); - Mockito.when(func1Expression.typeV2()).thenReturn(function1); + Expression func1Expression = mock(Expression.class); + when(func1Expression.typeV2()).thenReturn(function1); - Mockito.when(function1.fullyQualifiedName()).thenReturn("foo.bar.func1"); - Mockito.when(function2.fullyQualifiedName()).thenReturn("foo.bar.func2"); - Mockito.when(nullFunctionType.fullyQualifiedName()).thenReturn(null); + when(function1.fullyQualifiedName()).thenReturn("foo.bar.func1"); + when(function2.fullyQualifiedName()).thenReturn("foo.bar.func2"); + when(nullFunctionType.fullyQualifiedName()).thenReturn(null); - Mockito.when(class1.fullyQualifiedName()).thenReturn("foo.bar.class1"); - Mockito.when(class2.fullyQualifiedName()).thenReturn("foo.bar.class2"); - Mockito.when(classWithSameFQNAsFunction.fullyQualifiedName()).thenReturn("foo.bar.func1"); + when(class1.fullyQualifiedName()).thenReturn("foo.bar.class1"); + when(class2.fullyQualifiedName()).thenReturn("foo.bar.class2"); + when(classWithSameFQNAsFunction.fullyQualifiedName()).thenReturn("foo.bar.func1"); - Mockito.when(module1.fullyQualifiedName()).thenReturn("mod.module1"); - Mockito.when(module2.fullyQualifiedName()).thenReturn("mod.module2"); + when(module1.fullyQualifiedName()).thenReturn("mod.module1"); + when(module2.fullyQualifiedName()).thenReturn("mod.module2"); - Mockito.when(specialFormType1.fullyQualifiedName()).thenReturn("typing.List"); - Mockito.when(specialFormType2.fullyQualifiedName()).thenReturn("typing.Set"); + when(specialFormType1.fullyQualifiedName()).thenReturn("typing.List"); + when(specialFormType2.fullyQualifiedName()).thenReturn("typing.Set"); - Mockito.when(unresolvedImport.importPath()).thenReturn("imported.module1"); - Mockito.when(unresolvedImport2.importPath()).thenReturn("imported.module2"); + when(unresolvedImport.importPath()).thenReturn("imported.module1"); + when(unresolvedImport2.importPath()).thenReturn("imported.module2"); HasFQNPredicate hasFQNPredicateFunction1 = new HasFQNPredicate("foo.bar.func1"); HasFQNPredicate hasFQNPredicateClass1 = new HasFQNPredicate("foo.bar.class1"); @@ -79,8 +80,8 @@ void testCheck() { HasFQNPredicate hasFQNPredicateModule1 = new HasFQNPredicate("mod.module1"); HasFQNPredicate hasFQNPredicateSpecialFormList = new HasFQNPredicate("typing.List"); - TypePredicateContext predicateContext = TypePredicateContext.of(Mockito.mock(org.sonar.python.semantic.v2.typetable.TypeTable.class)); - SubscriptionContext subscriptionContext = Mockito.mock(SubscriptionContext.class); + TypePredicateContext predicateContext = TypePredicateContext.of(mock(org.sonar.python.semantic.v2.typetable.TypeTable.class)); + SubscriptionContext subscriptionContext = mock(SubscriptionContext.class); assertThat(hasFQNPredicateFunction1.check(function1, predicateContext)).isEqualTo(TriBool.TRUE); assertThat(TypeMatchers.withFQN("foo.bar.func1").evaluateFor(func1Expression, subscriptionContext)).isEqualTo(TriBool.TRUE); diff --git a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/HasMemberPredicateTest.java b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/HasMemberPredicateTest.java index 2b6f8ac47..7b2a831b4 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/HasMemberPredicateTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/HasMemberPredicateTest.java @@ -17,7 +17,6 @@ package org.sonar.python.types.v2.matchers; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.sonar.plugins.python.api.SubscriptionContext; import org.sonar.plugins.python.api.TriBool; import org.sonar.plugins.python.api.tree.Expression; @@ -29,6 +28,9 @@ import org.sonar.python.semantic.v2.TestProject; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; class HasMemberPredicateTest { @@ -46,8 +48,8 @@ def foo(self): a """); - SubscriptionContext ctx = Mockito.mock(SubscriptionContext.class); - Mockito.when(ctx.typeTable()).thenReturn(project.projectLevelTypeTable()); + SubscriptionContext ctx = mock(SubscriptionContext.class); + when(ctx.typeTable()).thenReturn(project.projectLevelTypeTable()); TypePredicateContext predicateContext = TypePredicateContext.of(project.projectLevelTypeTable()); HasMemberPredicate hasFooTypePredicate = new HasMemberPredicate("foo"); @@ -63,12 +65,12 @@ def foo(self): assertThat(objectType).isNotInstanceOf(UnknownType.class); - TypePredicate truePredicate = Mockito.mock(TypePredicate.class); - TypePredicate falsePredicate = Mockito.mock(TypePredicate.class); - TypePredicate unknownPredicate = Mockito.mock(TypePredicate.class); - Mockito.when(truePredicate.check(Mockito.any(), Mockito.any())).thenReturn(TriBool.TRUE); - Mockito.when(falsePredicate.check(Mockito.any(), Mockito.any())).thenReturn(TriBool.FALSE); - Mockito.when(unknownPredicate.check(Mockito.any(), Mockito.any())).thenReturn(TriBool.UNKNOWN); + TypePredicate truePredicate = mock(TypePredicate.class); + TypePredicate falsePredicate = mock(TypePredicate.class); + TypePredicate unknownPredicate = mock(TypePredicate.class); + when(truePredicate.check(any(), any())).thenReturn(TriBool.TRUE); + when(falsePredicate.check(any(), any())).thenReturn(TriBool.FALSE); + when(unknownPredicate.check(any(), any())).thenReturn(TriBool.UNKNOWN); TypeMatcher trueMatcher = MatchersTestUtils.createTypeMatcher(truePredicate); TypeMatcher falseMatcher = MatchersTestUtils.createTypeMatcher(falsePredicate); diff --git a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsAnyTypeInUnionSatisfyingTest.java b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsAnyTypeInUnionSatisfyingTest.java index 1d5c9c293..406d835c6 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsAnyTypeInUnionSatisfyingTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsAnyTypeInUnionSatisfyingTest.java @@ -21,7 +21,6 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import org.mockito.Mockito; import org.sonar.plugins.python.api.TriBool; import org.sonar.plugins.python.api.types.v2.PythonType; import org.sonar.plugins.python.api.types.v2.UnionType; @@ -30,17 +29,22 @@ import org.sonar.python.semantic.v2.typetable.TypeTable; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verifyNoInteractions; +import static org.mockito.Mockito.when; class IsAnyTypeInUnionSatisfyingTest { @Test void testUnionTypeWithOneMatchingCandidate() { - PythonType candidate1 = Mockito.mock(PythonType.class); - PythonType candidate2 = Mockito.mock(PythonType.class); + PythonType candidate1 = mock(PythonType.class); + PythonType candidate2 = mock(PythonType.class); UnionType unionType = (UnionType) UnionType.or(candidate1, candidate2); TypePredicate wrappedPredicate = MatchersTestUtils.mockPredicateReturning(candidate1, TriBool.TRUE); - Mockito.when(wrappedPredicate.check(Mockito.eq(candidate2), Mockito.any())).thenReturn(TriBool.FALSE); + when(wrappedPredicate.check(eq(candidate2), any())).thenReturn(TriBool.FALSE); TriBool result = checkType(unionType, wrappedPredicate); assertThat(result).isEqualTo(TriBool.TRUE); @@ -48,12 +52,12 @@ void testUnionTypeWithOneMatchingCandidate() { @Test void testUnionTypeWithAllNonMatchingCandidates() { - PythonType candidate1 = Mockito.mock(PythonType.class); - PythonType candidate2 = Mockito.mock(PythonType.class); + PythonType candidate1 = mock(PythonType.class); + PythonType candidate2 = mock(PythonType.class); UnionType unionType = (UnionType) UnionType.or(candidate1, candidate2); TypePredicate wrappedPredicate = MatchersTestUtils.mockPredicateReturning(candidate1, TriBool.FALSE); - Mockito.when(wrappedPredicate.check(Mockito.eq(candidate2), Mockito.any())).thenReturn(TriBool.FALSE); + when(wrappedPredicate.check(eq(candidate2), any())).thenReturn(TriBool.FALSE); TriBool result = checkType(unionType, wrappedPredicate); assertThat(result).isEqualTo(TriBool.FALSE); @@ -61,12 +65,12 @@ void testUnionTypeWithAllNonMatchingCandidates() { @Test void testUnionTypeWithUnknownCandidate() { - PythonType candidate1 = Mockito.mock(PythonType.class); - PythonType candidate2 = Mockito.mock(PythonType.class); + PythonType candidate1 = mock(PythonType.class); + PythonType candidate2 = mock(PythonType.class); UnionType unionType = (UnionType) UnionType.or(candidate1, candidate2); TypePredicate wrappedPredicate = MatchersTestUtils.mockPredicateReturning(candidate1, TriBool.FALSE); - Mockito.when(wrappedPredicate.check(Mockito.eq(candidate2), Mockito.any())).thenReturn(TriBool.UNKNOWN); + when(wrappedPredicate.check(eq(candidate2), any())).thenReturn(TriBool.UNKNOWN); TriBool result = checkType(unionType, wrappedPredicate); assertThat(result).isEqualTo(TriBool.UNKNOWN); @@ -76,25 +80,25 @@ void testUnionTypeWithUnknownCandidate() { @ParameterizedTest @MethodSource("nonUnionTypesWithExpectedResults") void testNonUnionTypeDoesNotDelegateToWrappedPredicate(PythonType nonUnionType, TriBool expectedResult) { - TypePredicate wrappedPredicate = Mockito.mock(TypePredicate.class); + TypePredicate wrappedPredicate = mock(TypePredicate.class); TriBool result = checkType(nonUnionType, wrappedPredicate); assertThat(result).isEqualTo(expectedResult); - Mockito.verifyNoInteractions(wrappedPredicate); + verifyNoInteractions(wrappedPredicate); } static Stream nonUnionTypesWithExpectedResults() { return Stream.of( Arguments.of(PythonType.UNKNOWN, TriBool.UNKNOWN), Arguments.of(new UnknownType.UnresolvedImportType("some.module"), TriBool.UNKNOWN), - Arguments.of(Mockito.mock(PythonType.class), TriBool.FALSE) + Arguments.of(mock(PythonType.class), TriBool.FALSE) ); } private static TriBool checkType(PythonType type, TypePredicate wrappedPredicate) { IsAnyTypeInUnionSatisfying predicate = new IsAnyTypeInUnionSatisfying(wrappedPredicate); - TypePredicateContext ctx = TypePredicateContext.of(Mockito.mock(TypeTable.class)); + TypePredicateContext ctx = TypePredicateContext.of(mock(TypeTable.class)); return predicate.check(type, ctx); } } diff --git a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsFunctionOwnerSatisfyingPredicateTest.java b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsFunctionOwnerSatisfyingPredicateTest.java index 218fe4a38..11ce379c4 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsFunctionOwnerSatisfyingPredicateTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsFunctionOwnerSatisfyingPredicateTest.java @@ -17,7 +17,6 @@ package org.sonar.python.types.v2.matchers; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.sonar.plugins.python.api.TriBool; import org.sonar.plugins.python.api.tree.Expression; import org.sonar.plugins.python.api.tree.FunctionDef; @@ -31,6 +30,8 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.sonar.python.types.v2.TypesTestUtils.PROJECT_LEVEL_TYPE_TABLE; import static org.sonar.python.types.v2.TypesTestUtils.parseAndInferTypes; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; class IsFunctionOwnerSatisfyingPredicateTest { @@ -109,8 +110,8 @@ class MyClass: @Test void testUnknownType() { var project = new TestProject(); - Expression unknownTypeExpression = Mockito.mock(Expression.class); - Mockito.when(unknownTypeExpression.typeV2()).thenReturn(PythonType.UNKNOWN); + Expression unknownTypeExpression = mock(Expression.class); + when(unknownTypeExpression.typeV2()).thenReturn(PythonType.UNKNOWN); TypePredicateContext ctx = TypePredicateContext.of(project.projectLevelTypeTable()); diff --git a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsObjectSatisfyingPredicateTest.java b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsObjectSatisfyingPredicateTest.java index a368b65b5..d81abe941 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsObjectSatisfyingPredicateTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsObjectSatisfyingPredicateTest.java @@ -21,7 +21,6 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import org.mockito.Mockito; import org.sonar.plugins.python.api.TriBool; import org.sonar.plugins.python.api.types.v2.ObjectType; import org.sonar.plugins.python.api.types.v2.PythonType; @@ -32,13 +31,15 @@ import org.sonar.python.semantic.v2.typetable.TypeTable; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verifyNoInteractions; class IsObjectSatisfyingPredicateTest { @ParameterizedTest @MethodSource("objectTypeWithWrappedPredicateResults") void testObjectTypeUnwrapsAndDelegatesToWrappedPredicate(TriBool wrappedPredicateResult, TriBool expectedResult) { - PythonType wrappedType = Mockito.mock(PythonType.class); + PythonType wrappedType = mock(PythonType.class); ObjectType objectType = ObjectType.fromType(wrappedType); TypePredicate wrappedPredicate = MatchersTestUtils.mockPredicateReturning(wrappedType, wrappedPredicateResult); @@ -57,12 +58,12 @@ static Stream objectTypeWithWrappedPredicateResults() { @ParameterizedTest @MethodSource("nonObjectTypesWithExpectedResults") void testNonObjectTypeDoesNotDelegateToWrappedPredicate(PythonType nonObjectType, TriBool expectedResult) { - TypePredicate wrappedPredicate = Mockito.mock(TypePredicate.class); + TypePredicate wrappedPredicate = mock(TypePredicate.class); TriBool result = checkType(nonObjectType, wrappedPredicate); assertThat(result).isEqualTo(expectedResult); - Mockito.verifyNoInteractions(wrappedPredicate); + verifyNoInteractions(wrappedPredicate); } @@ -70,13 +71,13 @@ static Stream nonObjectTypesWithExpectedResults() { return Stream.of( Arguments.of(PythonType.UNKNOWN, TriBool.UNKNOWN), Arguments.of(new UnknownType.UnresolvedImportType("some.module"), TriBool.UNKNOWN), - Arguments.of(Mockito.mock(PythonType.class), TriBool.FALSE) + Arguments.of(mock(PythonType.class), TriBool.FALSE) ); } @Test void testTypeMatchersIsObjectSatisfyingIntegration() { - PythonType wrappedType = Mockito.mock(PythonType.class); + PythonType wrappedType = mock(PythonType.class); ObjectType objectType = ObjectType.fromType(wrappedType); TypePredicate innerPredicate = MatchersTestUtils.mockPredicateReturning(wrappedType, TriBool.TRUE); @@ -84,7 +85,7 @@ void testTypeMatchersIsObjectSatisfyingIntegration() { TypeMatcher objectThatMatcher = TypeMatchers.isObjectSatisfying(innerMatcher); - TypePredicateContext ctx = Mockito.mock(TypePredicateContext.class); + TypePredicateContext ctx = mock(TypePredicateContext.class); TriBool result = MatchersTestUtils.getPredicate(objectThatMatcher).check(objectType, ctx); assertThat(result).isEqualTo(TriBool.TRUE); @@ -92,7 +93,7 @@ void testTypeMatchersIsObjectSatisfyingIntegration() { private static TriBool checkType(PythonType type, TypePredicate wrappedPredicate) { IsObjectSatisfyingPredicate predicate = new IsObjectSatisfyingPredicate(wrappedPredicate); - TypePredicateContext ctx = TypePredicateContext.of(Mockito.mock(TypeTable.class)); + TypePredicateContext ctx = TypePredicateContext.of(mock(TypeTable.class)); return predicate.check(type, ctx); } } diff --git a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsSelfTypePredicateTest.java b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsSelfTypePredicateTest.java index 0f80998ab..dce0eca43 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsSelfTypePredicateTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsSelfTypePredicateTest.java @@ -17,7 +17,6 @@ package org.sonar.python.types.v2.matchers; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.sonar.plugins.python.api.TriBool; import org.sonar.plugins.python.api.types.v2.ClassType; import org.sonar.plugins.python.api.types.v2.ObjectType; @@ -26,16 +25,18 @@ import org.sonar.plugins.python.api.types.v2.UnknownType; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; class IsSelfTypePredicateTest { private final IsSelfTypePredicate predicate = new IsSelfTypePredicate(); private final TypePredicateContext ctx = TypePredicateContext.of( - Mockito.mock(org.sonar.python.semantic.v2.typetable.TypeTable.class)); + mock(org.sonar.python.semantic.v2.typetable.TypeTable.class)); @Test void selfTypeReturnsTrue() { - ClassType innerType = Mockito.mock(ClassType.class); + ClassType innerType = mock(ClassType.class); SelfType selfType = (SelfType) SelfType.of(innerType); assertThat(predicate.check(selfType, ctx)).isEqualTo(TriBool.TRUE); @@ -43,16 +44,16 @@ void selfTypeReturnsTrue() { @Test void objectTypeWrappingSelfTypeReturnsFalse() { - ObjectType objectType = Mockito.mock(ObjectType.class); - SelfType selfType = Mockito.mock(SelfType.class); - Mockito.when(objectType.type()).thenReturn(selfType); + ObjectType objectType = mock(ObjectType.class); + SelfType selfType = mock(SelfType.class); + when(objectType.type()).thenReturn(selfType); assertThat(predicate.check(objectType, ctx)).isEqualTo(TriBool.FALSE); } @Test void classTypeReturnsFalse() { - ClassType classType = Mockito.mock(ClassType.class); + ClassType classType = mock(ClassType.class); assertThat(predicate.check(classType, ctx)).isEqualTo(TriBool.FALSE); } @@ -64,17 +65,17 @@ void unknownTypeReturnsUnknown() { @Test void unresolvedImportTypeReturnsUnknown() { - UnknownType.UnresolvedImportType unresolvedImportType = Mockito.mock(UnknownType.UnresolvedImportType.class); + UnknownType.UnresolvedImportType unresolvedImportType = mock(UnknownType.UnresolvedImportType.class); assertThat(predicate.check(unresolvedImportType, ctx)).isEqualTo(TriBool.UNKNOWN); } @Test void compositionWithIsObjectSatisfying() { - ClassType innerType = Mockito.mock(ClassType.class); + ClassType innerType = mock(ClassType.class); SelfType selfType = (SelfType) SelfType.of(innerType); - ObjectType objectType = Mockito.mock(ObjectType.class); - Mockito.when(objectType.unwrappedType()).thenReturn(selfType); + ObjectType objectType = mock(ObjectType.class); + when(objectType.unwrappedType()).thenReturn(selfType); TypePredicate isObjectOfSelf = new IsObjectSatisfyingPredicate(predicate); diff --git a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsTypeOrSuperTypeSatisfyingPredicateTest.java b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsTypeOrSuperTypeSatisfyingPredicateTest.java index 8544ca61a..249959137 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsTypeOrSuperTypeSatisfyingPredicateTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsTypeOrSuperTypeSatisfyingPredicateTest.java @@ -17,7 +17,6 @@ package org.sonar.python.types.v2.matchers; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.sonar.plugins.python.api.SubscriptionContext; import org.sonar.plugins.python.api.TriBool; import org.sonar.plugins.python.api.tree.Expression; @@ -28,6 +27,8 @@ import org.sonar.python.semantic.v2.TestProject; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; class IsTypeOrSuperTypeSatisfyingPredicateTest { @@ -43,8 +44,8 @@ class A: A() """); - SubscriptionContext subscriptionContext = Mockito.mock(SubscriptionContext.class); - Mockito.when(subscriptionContext.typeTable()).thenReturn(project.projectLevelTypeTable()); + SubscriptionContext subscriptionContext = mock(SubscriptionContext.class); + when(subscriptionContext.typeTable()).thenReturn(project.projectLevelTypeTable()); assertThat(TypeMatchers.isObjectInstanceOf("my_file.A").evaluateFor(objectTypeExpression, subscriptionContext)).isEqualTo(TriBool.TRUE); assertThat(TypeMatchers.isObjectInstanceOf("str").evaluateFor(objectTypeExpression, subscriptionContext)).isEqualTo(TriBool.FALSE); @@ -66,8 +67,8 @@ class C(A): B() """); - SubscriptionContext subscriptionContext = Mockito.mock(SubscriptionContext.class); - Mockito.when(subscriptionContext.typeTable()).thenReturn(project.projectLevelTypeTable()); + SubscriptionContext subscriptionContext = mock(SubscriptionContext.class); + when(subscriptionContext.typeTable()).thenReturn(project.projectLevelTypeTable()); assertThat(TypeMatchers.isObjectInstanceOf("my_file.A").evaluateFor(objectTypeExpression, subscriptionContext)).isEqualTo(TriBool.TRUE); assertThat(TypeMatchers.isObjectInstanceOf("my_file.B").evaluateFor(objectTypeExpression, subscriptionContext)).isEqualTo(TriBool.TRUE); @@ -89,8 +90,8 @@ class A: TypePredicateContext ctx = TypePredicateContext.of(project.projectLevelTypeTable()); - SubscriptionContext subscriptionContext = Mockito.mock(SubscriptionContext.class); - Mockito.when(subscriptionContext.typeTable()).thenReturn(project.projectLevelTypeTable()); + SubscriptionContext subscriptionContext = mock(SubscriptionContext.class); + when(subscriptionContext.typeTable()).thenReturn(project.projectLevelTypeTable()); var predicate = new IsTypeOrSuperTypeSatisfyingPredicate(new IsTypePredicate("my_file.A")); @@ -114,8 +115,8 @@ class B(A): TypePredicateContext ctx = TypePredicateContext.of(project.projectLevelTypeTable()); - SubscriptionContext subscriptionContext = Mockito.mock(SubscriptionContext.class); - Mockito.when(subscriptionContext.typeTable()).thenReturn(project.projectLevelTypeTable()); + SubscriptionContext subscriptionContext = mock(SubscriptionContext.class); + when(subscriptionContext.typeTable()).thenReturn(project.projectLevelTypeTable()); var predicateA = new IsTypeOrSuperTypeSatisfyingPredicate(new IsTypePredicate("my_file.A")); var predicateB = new IsTypeOrSuperTypeSatisfyingPredicate(new IsTypePredicate("my_file.B")); @@ -206,8 +207,8 @@ class A: TypePredicateContext ctx = TypePredicateContext.of(project.projectLevelTypeTable()); - SubscriptionContext subscriptionContext = Mockito.mock(SubscriptionContext.class); - Mockito.when(subscriptionContext.typeTable()).thenReturn(project.projectLevelTypeTable()); + SubscriptionContext subscriptionContext = mock(SubscriptionContext.class); + when(subscriptionContext.typeTable()).thenReturn(project.projectLevelTypeTable()); var predicate = new IsTypeOrSuperTypeSatisfyingPredicate(new HasFQNPredicate("my_file.A")); @@ -239,8 +240,8 @@ class B(A): @Test void testUnknownType() { var project = new TestProject(); - Expression unknownTypeExpression = Mockito.mock(Expression.class); - Mockito.when(unknownTypeExpression.typeV2()).thenReturn(PythonType.UNKNOWN); + Expression unknownTypeExpression = mock(Expression.class); + when(unknownTypeExpression.typeV2()).thenReturn(PythonType.UNKNOWN); TypePredicateContext ctx = TypePredicateContext.of(project.projectLevelTypeTable()); diff --git a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsTypePredicateTest.java b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsTypePredicateTest.java index 6d97f9dde..86d97a25d 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsTypePredicateTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/IsTypePredicateTest.java @@ -17,7 +17,6 @@ package org.sonar.python.types.v2.matchers; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.sonar.plugins.python.api.SubscriptionContext; import org.sonar.plugins.python.api.TriBool; import org.sonar.plugins.python.api.tree.Expression; @@ -29,6 +28,8 @@ import org.sonar.python.semantic.v2.typetable.TypeTable; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; class IsTypePredicateTest { @@ -49,8 +50,8 @@ def __init__(self): a """); - SubscriptionContext ctx = Mockito.mock(SubscriptionContext.class); - Mockito.when(ctx.typeTable()).thenReturn(project.projectLevelTypeTable()); + SubscriptionContext ctx = mock(SubscriptionContext.class); + when(ctx.typeTable()).thenReturn(project.projectLevelTypeTable()); TypePredicateContext predicateContext = TypePredicateContext.of(project.projectLevelTypeTable()); IsTypePredicate isTypeAPredicate = new IsTypePredicate("my_file.A"); @@ -78,8 +79,8 @@ def __init__(self): A """); - SubscriptionContext ctx = Mockito.mock(SubscriptionContext.class); - Mockito.when(ctx.typeTable()).thenReturn(project.projectLevelTypeTable()); + SubscriptionContext ctx = mock(SubscriptionContext.class); + when(ctx.typeTable()).thenReturn(project.projectLevelTypeTable()); TypePredicateContext predicateContext = TypePredicateContext.of(project.projectLevelTypeTable()); IsTypePredicate isTypeAPredicate = new IsTypePredicate("my_file.A"); @@ -112,8 +113,8 @@ def __init__(self): a """); - SubscriptionContext ctx = Mockito.mock(SubscriptionContext.class); - Mockito.when(ctx.typeTable()).thenReturn(project.projectLevelTypeTable()); + SubscriptionContext ctx = mock(SubscriptionContext.class); + when(ctx.typeTable()).thenReturn(project.projectLevelTypeTable()); TypePredicateContext predicateContext = TypePredicateContext.of(project.projectLevelTypeTable()); IsTypePredicate isTypeAPredicate = new IsTypePredicate("my_file.A"); @@ -139,8 +140,8 @@ def __init__(self): A """); - SubscriptionContext ctx = Mockito.mock(SubscriptionContext.class); - Mockito.when(ctx.typeTable()).thenReturn(project.projectLevelTypeTable()); + SubscriptionContext ctx = mock(SubscriptionContext.class); + when(ctx.typeTable()).thenReturn(project.projectLevelTypeTable()); assertThat(TypeMatchers.isType("my_file.A").isTrueFor(classTypeExpression, ctx)).isTrue(); assertThat(TypeMatchers.isType("my_file.B").isTrueFor(classTypeExpression, ctx)).isFalse(); @@ -166,8 +167,8 @@ def __init__(self): A # will result the class A defined in package/A.py """); - SubscriptionContext ctx = Mockito.mock(SubscriptionContext.class); - Mockito.when(ctx.typeTable()).thenReturn(project.projectLevelTypeTable()); + SubscriptionContext ctx = mock(SubscriptionContext.class); + when(ctx.typeTable()).thenReturn(project.projectLevelTypeTable()); // isType(fqn) resolves the FQN like "import package.A.A" which will prefer the class A defined in __init__.py assertThat(TypeMatchers.isType("package.A.A").evaluateFor(classTypeExpression, ctx)).isEqualTo(TriBool.FALSE); @@ -192,9 +193,9 @@ class A: assertThat(isTypePredicate.check(selfType, ctx)).isEqualTo(TriBool.UNKNOWN); - var mockTypeTable = Mockito.mock(TypeTable.class); + var mockTypeTable = mock(TypeTable.class); // mocking this to improve coverage, should normally never happen - Mockito.when(mockTypeTable.getType("my_file.A")).thenReturn(selfType); + when(mockTypeTable.getType("my_file.A")).thenReturn(selfType); ctx = TypePredicateContext.of(mockTypeTable); assertThat(isTypePredicate.check(classTypeExpression.typeV2(), ctx)).isEqualTo(TriBool.UNKNOWN); diff --git a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/TypeSourcePredicateTest.java b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/TypeSourcePredicateTest.java index c5ca9ed1b..f75f6dad9 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/TypeSourcePredicateTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/TypeSourcePredicateTest.java @@ -21,7 +21,6 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import org.mockito.Mockito; import org.sonar.plugins.python.api.TriBool; import org.sonar.plugins.python.api.types.v2.ObjectType; import org.sonar.plugins.python.api.types.v2.PythonType; @@ -30,6 +29,8 @@ import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; class TypeSourcePredicateTest { @@ -38,7 +39,7 @@ class TypeSourcePredicateTest { void testMatchingTypeSources(TypeSource typeSource) { PythonType type = createTypeWithSource(typeSource); TypeSourcePredicate predicate = new TypeSourcePredicate(typeSource); - TypePredicateContext ctx = TypePredicateContext.of(Mockito.mock(org.sonar.python.semantic.v2.typetable.TypeTable.class)); + TypePredicateContext ctx = TypePredicateContext.of(mock(org.sonar.python.semantic.v2.typetable.TypeTable.class)); assertThat(predicate.check(type, ctx)).isEqualTo(TriBool.TRUE); } @@ -48,7 +49,7 @@ void testMatchingTypeSources(TypeSource typeSource) { void testNonMatchingTypeSources(TypeSource typeTypeSource, TypeSource predicateTypeSource) { PythonType type = createTypeWithSource(typeTypeSource); TypeSourcePredicate predicate = new TypeSourcePredicate(predicateTypeSource); - TypePredicateContext ctx = TypePredicateContext.of(Mockito.mock(org.sonar.python.semantic.v2.typetable.TypeTable.class)); + TypePredicateContext ctx = TypePredicateContext.of(mock(org.sonar.python.semantic.v2.typetable.TypeTable.class)); assertThat(predicate.check(type, ctx)).isEqualTo(TriBool.FALSE); } @@ -57,7 +58,7 @@ void testNonMatchingTypeSources(TypeSource typeTypeSource, TypeSource predicateT void testThroughTypeMatchers() { PythonType typeWithExactSource = createTypeWithSource(TypeSource.EXACT); PythonType typeWithTypeHintSource = createTypeWithSource(TypeSource.TYPE_HINT); - TypePredicateContext predicateContext = TypePredicateContext.of(Mockito.mock(org.sonar.python.semantic.v2.typetable.TypeTable.class)); + TypePredicateContext predicateContext = TypePredicateContext.of(mock(org.sonar.python.semantic.v2.typetable.TypeTable.class)); assertThat(MatchersTestUtils.getPredicate(TypeMatchers.hasTypeSource(TypeSource.EXACT)).check(typeWithExactSource, predicateContext)).isEqualTo(TriBool.TRUE); assertThat(MatchersTestUtils.getPredicate(TypeMatchers.hasTypeSource(TypeSource.EXACT)).check(typeWithTypeHintSource, predicateContext)).isEqualTo(TriBool.FALSE); @@ -69,13 +70,13 @@ void testThroughTypeMatchers() { void testObjectTypeIsNotUnwrapped() { PythonType wrappedType = createTypeWithSource(TypeSource.TYPE_HINT); - ObjectType objectType = Mockito.mock(ObjectType.class); - Mockito.when(objectType.typeSource()).thenReturn(TypeSource.EXACT); - Mockito.when(objectType.unwrappedType()).thenReturn(wrappedType); + ObjectType objectType = mock(ObjectType.class); + when(objectType.typeSource()).thenReturn(TypeSource.EXACT); + when(objectType.unwrappedType()).thenReturn(wrappedType); TypeSourcePredicate exactPredicate = new TypeSourcePredicate(TypeSource.EXACT); TypeSourcePredicate typeHintPredicate = new TypeSourcePredicate(TypeSource.TYPE_HINT); - TypePredicateContext ctx = TypePredicateContext.of(Mockito.mock(org.sonar.python.semantic.v2.typetable.TypeTable.class)); + TypePredicateContext ctx = TypePredicateContext.of(mock(org.sonar.python.semantic.v2.typetable.TypeTable.class)); assertThat(exactPredicate.check(objectType, ctx)).isEqualTo(TriBool.TRUE); assertThat(typeHintPredicate.check(objectType, ctx)).isEqualTo(TriBool.FALSE); @@ -93,8 +94,8 @@ private static Stream nonMatchingTypeSourceCases() { } private static PythonType createTypeWithSource(TypeSource typeSource) { - PythonType type = Mockito.mock(PythonType.class); - Mockito.when(type.typeSource()).thenReturn(typeSource); + PythonType type = mock(PythonType.class); + when(type.typeSource()).thenReturn(typeSource); return type; } } From f2ab5b42e51957a5048071bcb66f7fd3b54e24c2 Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Mon, 29 Jun 2026 15:04:01 +0200 Subject: [PATCH 160/322] SONARPY-4306 : Improve S8714 issue locations and secondary message (#1215) GitOrigin-RevId: 3231260b58a9fc8f326f02ba1677ad942efa28fe --- .../DedicatedExceptionAssertionCheck.java | 28 ++++++-- .../tests/dedicatedExceptionAssertion.py | 66 ++++++++++++------- 2 files changed, 67 insertions(+), 27 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/DedicatedExceptionAssertionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/DedicatedExceptionAssertionCheck.java index 17adbb23e..4688b6661 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/DedicatedExceptionAssertionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/DedicatedExceptionAssertionCheck.java @@ -28,6 +28,7 @@ import org.sonar.plugins.python.api.tree.Statement; import org.sonar.plugins.python.api.tree.Tree; import org.sonar.plugins.python.api.tree.TryStatement; +import org.sonar.plugins.python.api.tree.Token; import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; @@ -38,7 +39,10 @@ public class DedicatedExceptionAssertionCheck extends PythonSubscriptionCheck { private static final String PYTEST_MESSAGE = "Replace this try/except block with a \"pytest.raises\" context manager."; private static final String UNITTEST_MESSAGE = "Replace this try/except block with \"self.assertRaises()\"."; private static final String NO_EXCEPTION_MESSAGE = "Remove this try/except block and let the test fail naturally if an exception is raised."; - private record FailCall(CallExpression callExpression, String message) { + private static final String DEDICATED_ASSERTION_SECONDARY_MESSAGE = "Replace this fail call with a dedicated exception assertion."; + private static final String NO_EXCEPTION_SECONDARY_MESSAGE = "Remove this fail call and let the test fail naturally if an exception is raised."; + + private record FailCall(CallExpression callExpression, String primaryMessage, String secondaryMessage) { } @Override @@ -59,7 +63,8 @@ private static void checkTryStatement(SubscriptionContext ctx, TryStatement tryS if (tryStatement.exceptClauses().size() == 1) { FailCall exceptFail = failCallFromSingleStatementBody(tryStatement.exceptClauses().get(0).body().statements(), ctx); if (exceptFail != null) { - ctx.addIssue(exceptFail.callExpression(), NO_EXCEPTION_MESSAGE); + ctx.addIssue(tryStatement.tryKeyword(), endToken(tryStatement), NO_EXCEPTION_MESSAGE) + .secondary(exceptFail.callExpression(), NO_EXCEPTION_SECONDARY_MESSAGE); return; } } @@ -72,7 +77,20 @@ private static void checkTryStatement(SubscriptionContext ctx, TryStatement tryS return; } - ctx.addIssue(failCall.callExpression(), failCall.message()); + ctx.addIssue(tryStatement.tryKeyword(), endToken(tryStatement), failCall.primaryMessage()) + .secondary(failCall.callExpression(), failCall.secondaryMessage()); + } + + private static Token endToken(TryStatement tryStatement) { + var elseClause = tryStatement.elseClause(); + if (elseClause != null) { + return lastStatement(elseClause.body().statements()).lastToken(); + } + return lastStatement(tryStatement.exceptClauses().get(tryStatement.exceptClauses().size() - 1).body().statements()).lastToken(); + } + + private static Statement lastStatement(List statements) { + return statements.get(statements.size() - 1); } private static boolean hasSupportedExceptClauses(TryStatement tryStatement) { @@ -114,10 +132,10 @@ private static FailCall failCallFromStatement(Statement statement, SubscriptionC return null; } if (isPytestFail(callExpression, ctx)) { - return new FailCall(callExpression, PYTEST_MESSAGE); + return new FailCall(callExpression, PYTEST_MESSAGE, DEDICATED_ASSERTION_SECONDARY_MESSAGE); } if (isUnittestFail(callExpression, ctx)) { - return new FailCall(callExpression, UNITTEST_MESSAGE); + return new FailCall(callExpression, UNITTEST_MESSAGE, DEDICATED_ASSERTION_SECONDARY_MESSAGE); } return null; } diff --git a/python-checks/src/test/resources/checks/tests/dedicatedExceptionAssertion.py b/python-checks/src/test/resources/checks/tests/dedicatedExceptionAssertion.py index 7cb3bce8e..428ec0320 100644 --- a/python-checks/src/test/resources/checks/tests/dedicatedExceptionAssertion.py +++ b/python-checks/src/test/resources/checks/tests/dedicatedExceptionAssertion.py @@ -7,43 +7,53 @@ def explode(): raise ValueError() def test_pytest_reproducer(): - try: + try: # Noncompliant {{Replace this try/except block with a "pytest.raises" context manager.}} +# ^[el=+6;ec=42] explode() except ValueError: pass else: - pytest.fail("ValueError expected") # Noncompliant {{Replace this try/except block with a "pytest.raises" context manager.}} + pytest.fail("ValueError expected") +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Replace this fail call with a dedicated exception assertion.}} def test_pytest_else_fail(): - try: + try: # Noncompliant {{Replace this try/except block with a "pytest.raises" context manager.}} +# ^[el=+6;ec=42] explode() except ValueError: pass else: - pytest.fail("ValueError expected") # Noncompliant {{Replace this try/except block with a "pytest.raises" context manager.}} + pytest.fail("ValueError expected") +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Replace this fail call with a dedicated exception assertion.}} def test_pytest_try_fail(): - try: + try: # Noncompliant {{Replace this try/except block with a "pytest.raises" context manager.}} +# ^[el=+6;ec=12] explode() - pytest.fail("ValueError expected") # Noncompliant {{Replace this try/except block with a "pytest.raises" context manager.}} + pytest.fail("ValueError expected") +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Replace this fail call with a dedicated exception assertion.}} except ValueError: pass def test_pytest_imported_fail(): - try: + try: # Noncompliant {{Replace this try/except block with a "pytest.raises" context manager.}} +# ^[el=+6;ec=44] explode() except ValueError: pass else: - imported_fail("ValueError expected") # Noncompliant {{Replace this try/except block with a "pytest.raises" context manager.}} + imported_fail("ValueError expected") +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Replace this fail call with a dedicated exception assertion.}} def test_except_body_with_extra_logic(): - try: + try: # Noncompliant +# ^[el=+6;ec=42] explode() except ValueError as err: print(err) else: - pytest.fail("ValueError expected") # Noncompliant + pytest.fail("ValueError expected") +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Replace this fail call with a dedicated exception assertion.}} def test_no_issue_on_non_pytest_fail(): try: @@ -101,10 +111,12 @@ def test_no_issue_with_non_call_expression_else(): "ValueError expected" def test_fail_in_except(): - try: + try: # Noncompliant {{Remove this try/except block and let the test fail naturally if an exception is raised.}} +# ^[el=+4;ec=33] explode() except ValueError: - pytest.fail("unexpected") # Noncompliant {{Remove this try/except block and let the test fail naturally if an exception is raised.}} + pytest.fail("unexpected") +# ^^^^^^^^^^^^^^^^^^^^^^^^^< {{Remove this fail call and let the test fail naturally if an exception is raised.}} def test_no_issue_with_multi_statement_except_body(): try: @@ -114,9 +126,11 @@ def test_no_issue_with_multi_statement_except_body(): pytest.fail(message) def test_try_fail_with_multiple_except_clauses(): - try: + try: # Noncompliant {{Replace this try/except block with a "pytest.raises" context manager.}} +# ^[el=+8;ec=37] explode() - pytest.fail("ValueError expected") # Noncompliant {{Replace this try/except block with a "pytest.raises" context manager.}} + pytest.fail("ValueError expected") +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Replace this fail call with a dedicated exception assertion.}} except ValueError: pass except TypeError as err: @@ -129,30 +143,38 @@ def __init__(self): self.invalid_user = None def test_unittest_else_fail(self): - try: + try: # Noncompliant {{Replace this try/except block with "self.assertRaises()".}} +# ^[el=+6;ec=44] explode() except ValueError: pass else: - self.fail("ValueError expected") # Noncompliant {{Replace this try/except block with "self.assertRaises()".}} + self.fail("ValueError expected") +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Replace this fail call with a dedicated exception assertion.}} def test_unittest_try_fail(self): - try: + try: # Noncompliant {{Replace this try/except block with "self.assertRaises()".}} +# ^[el=+6;ec=16] explode() - self.fail("ValueError expected") # Noncompliant {{Replace this try/except block with "self.assertRaises()".}} + self.fail("ValueError expected") +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Replace this fail call with a dedicated exception assertion.}} except ValueError: pass def test_no_exception_expected(self): - try: + try: # Noncompliant {{Remove this try/except block and let the test fail naturally if an exception is raised.}} +# ^[el=+4;ec=61] self.user_service.register_user(self.valid_user) except ValidationError: - self.fail("Should not have thrown any exception") # Noncompliant {{Remove this try/except block and let the test fail naturally if an exception is raised.}} + self.fail("Should not have thrown any exception") +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Remove this fail call and let the test fail naturally if an exception is raised.}} def test_exception_details(self): - try: + try: # Noncompliant {{Replace this try/except block with "self.assertRaises()".}} +# ^[el=+6;ec=53] self.user_service.register_user(self.invalid_user) - self.fail("Expected ValidationError to be thrown") # Noncompliant {{Replace this try/except block with "self.assertRaises()".}} + self.fail("Expected ValidationError to be thrown") +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Replace this fail call with a dedicated exception assertion.}} except ValidationError as e: self.assertEqual("Invalid email", str(e)) From 5d1ba4987511c58b6ae4d916561d05c69ab67d3b Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Tue, 30 Jun 2026 13:24:53 +0200 Subject: [PATCH 161/322] SONARPY-4322 Remove closed Rule S1523 (#1225) GitOrigin-RevId: 978e8b4175aea1fd9a3299de72864269b1c35184 --- .../python/checks/OpenSourceCheckList.java | 2 - .../hotspots/DynamicCodeExecutionCheck.java | 48 ------------------- .../checks/OpenSourceCheckListTest.java | 2 +- .../DynamicCodeExecutionCheckTest.java | 29 ----------- .../checks/hotspots/dynamicCodeExecution.py | 8 ---- 5 files changed, 1 insertion(+), 88 deletions(-) delete mode 100644 python-checks/src/main/java/org/sonar/python/checks/hotspots/DynamicCodeExecutionCheck.java delete mode 100644 python-checks/src/test/java/org/sonar/python/checks/hotspots/DynamicCodeExecutionCheckTest.java delete mode 100644 python-checks/src/test/resources/checks/hotspots/dynamicCodeExecution.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 7d3ec31fc..e738145b1 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -46,7 +46,6 @@ import org.sonar.python.checks.hotspots.DebugModeCheck; import org.sonar.python.checks.hotspots.DisabledHtmlAutoEscapeCheck; import org.sonar.python.checks.hotspots.DisabledHtmlAutoEscapeLegacyCheck; -import org.sonar.python.checks.hotspots.DynamicCodeExecutionCheck; import org.sonar.python.checks.hotspots.ExpandingArchiveCheck; import org.sonar.python.checks.hotspots.FastHashingOrPlainTextCheck; import org.sonar.python.checks.hotspots.GraphQLIntrospectionCheck; @@ -210,7 +209,6 @@ public Stream> getChecks() { DuplicatedMethodFieldNamesCheck.class, DuplicatedMethodImplementationCheck.class, DuplicatesInCharacterClassCheck.class, - DynamicCodeExecutionCheck.class, EinopsSyntaxCheck.class, ElseAfterLoopsWithoutBreakCheck.class, EmptyAlternativeCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/DynamicCodeExecutionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/DynamicCodeExecutionCheck.java deleted file mode 100644 index 896f038a6..000000000 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/DynamicCodeExecutionCheck.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * SonarQube Python Plugin - * Copyright (C) SonarSource Sàrl - * mailto:info AT sonarsource DOT com - * - * You can redistribute and/or modify this program under the terms of - * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the Sonar Source-Available License for more details. - * - * You should have received a copy of the Sonar Source-Available License - * along with this program; if not, see https://sonarsource.com/license/ssal/ - */ -package org.sonar.python.checks.hotspots; - -import org.sonar.check.Rule; -import org.sonar.plugins.python.api.PythonSubscriptionCheck; -import org.sonar.plugins.python.api.tree.CallExpression; -import org.sonar.plugins.python.api.tree.Expression; -import org.sonar.plugins.python.api.tree.Name; -import org.sonar.plugins.python.api.tree.Tree; - -@Rule(key = "S1523") -public class DynamicCodeExecutionCheck extends PythonSubscriptionCheck { - private static final String MESSAGE = "Make sure that this dynamic injection or execution of code is safe."; - - @Override - public void initialize(Context context) { - context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, ctx -> { - CallExpression callExpr = (CallExpression) ctx.syntaxNode(); - if (isFuncNameExecOrEval(callExpr)) { - ctx.addIssue(callExpr, MESSAGE); - } - }); - } - - private static boolean isFuncNameExecOrEval(CallExpression call) { - Expression expr = call.callee(); - if (expr.is(Tree.Kind.NAME)) { - String functionName = ((Name) expr).name(); - return "exec".equals(functionName) || "eval".equals(functionName); - } - return false; - } -} diff --git a/python-checks/src/test/java/org/sonar/python/checks/OpenSourceCheckListTest.java b/python-checks/src/test/java/org/sonar/python/checks/OpenSourceCheckListTest.java index 86469c573..c20408a5c 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/OpenSourceCheckListTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/OpenSourceCheckListTest.java @@ -132,7 +132,7 @@ void test_no_deprecated_rule_in_default_profile() throws IOException, ParseExcep void test_locally_deprecated_rules_stay_deprecated() throws IOException { // Some rules have been deprecated only for Python. When executed, rule-api reverts those rule to "ready" status, which is incorrect. // This test is here to ensure it doesn't happen. - List locallyDeprecatedRules = Arrays.asList("S1523"); + List locallyDeprecatedRules = Arrays.asList(); try (Stream fileStream = Files.find(METADATA_DIR, 1, (path, attr) -> path.toString().endsWith(".json"))) { Set deprecatedKeys = fileStream .filter(path -> !path.toString().endsWith("_profile.json")) diff --git a/python-checks/src/test/java/org/sonar/python/checks/hotspots/DynamicCodeExecutionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/hotspots/DynamicCodeExecutionCheckTest.java deleted file mode 100644 index fd7ebdd97..000000000 --- a/python-checks/src/test/java/org/sonar/python/checks/hotspots/DynamicCodeExecutionCheckTest.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * SonarQube Python Plugin - * Copyright (C) SonarSource Sàrl - * mailto:info AT sonarsource DOT com - * - * You can redistribute and/or modify this program under the terms of - * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the Sonar Source-Available License for more details. - * - * You should have received a copy of the Sonar Source-Available License - * along with this program; if not, see https://sonarsource.com/license/ssal/ - */ -package org.sonar.python.checks.hotspots; - -import org.junit.jupiter.api.Test; -import org.sonar.python.checks.utils.PythonCheckVerifier; - -class DynamicCodeExecutionCheckTest { - - @Test - void test() { - PythonCheckVerifier.verify("src/test/resources/checks/hotspots/dynamicCodeExecution.py", new DynamicCodeExecutionCheck()); - } - -} diff --git a/python-checks/src/test/resources/checks/hotspots/dynamicCodeExecution.py b/python-checks/src/test/resources/checks/hotspots/dynamicCodeExecution.py deleted file mode 100644 index 682c6bcd6..000000000 --- a/python-checks/src/test/resources/checks/hotspots/dynamicCodeExecution.py +++ /dev/null @@ -1,8 +0,0 @@ -def evaluate(command, file, mode): - eval(command) # Noncompliant -# ^^^^^^^^^^^^^ - exec(code) # Noncompliant -# ^^^^^^^^^^ - eval.f() # OK - myModule.eval() # OK - myEval(code) # OK From 4fbf70b2ab425d7b556ff9805632ba60549713b7 Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Tue, 30 Jun 2026 13:59:05 +0200 Subject: [PATCH 162/322] SONARPY-4319 Fix failing deprecated rules tests (#1222) GitOrigin-RevId: b6a5957be1eb02baefb748d296f07087444288ac --- .../sonar/python/checks/OpenSourceCheckListTest.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/python-checks/src/test/java/org/sonar/python/checks/OpenSourceCheckListTest.java b/python-checks/src/test/java/org/sonar/python/checks/OpenSourceCheckListTest.java index c20408a5c..4103d0ee9 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/OpenSourceCheckListTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/OpenSourceCheckListTest.java @@ -24,7 +24,6 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.Arrays; import java.util.List; import java.util.Set; import java.util.regex.Matcher; @@ -132,7 +131,15 @@ void test_no_deprecated_rule_in_default_profile() throws IOException, ParseExcep void test_locally_deprecated_rules_stay_deprecated() throws IOException { // Some rules have been deprecated only for Python. When executed, rule-api reverts those rule to "ready" status, which is incorrect. // This test is here to ensure it doesn't happen. - List locallyDeprecatedRules = Arrays.asList(); + List locallyDeprecatedRules = List.of( + "S1721", + "S2733", + "S5439", + "S5042", + "S1717", + "S4828", + "ClassComplexity", + "FileComplexity"); try (Stream fileStream = Files.find(METADATA_DIR, 1, (path, attr) -> path.toString().endsWith(".json"))) { Set deprecatedKeys = fileStream .filter(path -> !path.toString().endsWith("_profile.json")) From 6dbf018825923fd022515e7c9e3209a74b61e8f1 Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Tue, 30 Jun 2026 14:22:25 +0200 Subject: [PATCH 163/322] SONARPY-4317 Update rule metadata (#1221) GitOrigin-RevId: 68cdad4607a23dbabd05ab548b5d9549a60d10c1 --- .../org/sonar/l10n/py/rules/python/S1110.json | 24 +++++----- .../org/sonar/l10n/py/rules/python/S1523.json | 2 +- .../org/sonar/l10n/py/rules/python/S1764.html | 1 + .../org/sonar/l10n/py/rules/python/S5542.html | 12 ----- .../org/sonar/l10n/py/rules/python/S5852.html | 5 +- .../org/sonar/l10n/py/rules/python/S5958.html | 8 ---- .../org/sonar/l10n/py/rules/python/S5976.html | 46 ++++--------------- .../org/sonar/l10n/py/rules/python/S8786.html | 21 +++++++-- .../org/sonar/l10n/py/rules/python/S8900.html | 22 ++++++--- .../org/sonar/l10n/py/rules/python/S8900.json | 2 +- .../org/sonar/l10n/py/rules/python/S8903.html | 22 +++++---- .../org/sonar/l10n/py/rules/python/S8904.html | 15 +++--- .../org/sonar/l10n/py/rules/python/S8905.html | 2 +- .../python/Sonar_agentic_AI_profile.json | 1 - sonarpedia.json | 2 +- 15 files changed, 81 insertions(+), 104 deletions(-) diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1110.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1110.json index 63a37f01a..ba3c690aa 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1110.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1110.json @@ -1,23 +1,25 @@ { - "title": "Redundant pairs of parentheses should be removed", + "title": "Unnecessary parentheses should be removed", "type": "CODE_SMELL", - "code": { - "impacts": { - "MAINTAINABILITY": "MEDIUM" - }, - "attribute": "CLEAR" - }, "status": "ready", "remediation": { "func": "Constant\/Issue", - "constantCost": "1min" + "constantCost": "2 min" }, "tags": [ - "confusing" + "clippy", + "redundant", + "readability" ], - "defaultSeverity": "Major", + "defaultSeverity": "Minor", "ruleSpecification": "RSPEC-1110", "sqKey": "S1110", "scope": "All", - "quickfix": "covered" + "quickfix": "covered", + "code": { + "impacts": { + "MAINTAINABILITY": "LOW" + }, + "attribute": "CLEAR" + } } diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1523.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1523.json index 23d9a8049..daff4ac53 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1523.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1523.json @@ -8,7 +8,7 @@ }, "attribute": "TRUSTWORTHY" }, - "status": "deprecated", + "status": "closed", "quickfix": "unknown", "remediation": { "func": "Constant\/Issue", diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1764.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1764.html index 6cbb02f5d..fabc51a67 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1764.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1764.html @@ -28,6 +28,7 @@

                            Exceptions

                          • The expression 1 << 1

                          Resources

                          +

                          Related rules

                          • {rule:python:S1656} - Implements a check on =.
                          diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5542.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5542.html index 4d1189999..2492c9e26 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5542.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5542.html @@ -16,8 +16,6 @@

                          Why is this an issue?

                          secure by the cryptography community.

                          For AES, the weakest mode is ECB (Electronic Codebook). Repeated blocks of data are encrypted to the same value, making them easy to identify and reducing the difficulty of recovering the original cleartext.

                          -

                          Unauthenticated modes such as CBC (Cipher Block Chaining) may be used but are prone to attacks that manipulate the ciphertext. They must be used -with caution.

                          For RSA, the weakest algorithms are either using it without padding or using the PKCS1v1.5 padding scheme.

                          What is the potential impact?

                          The cleartext of an encrypted message might be recoverable. Additionally, it might be possible to modify the cleartext of an encrypted message.

                          @@ -72,8 +70,6 @@

                          For AES: use authenticated encryption modes

                        • IAPM: Integer Authenticated Parallelizable Mode
                        • OCB: Offset Codebook Mode
                        -

                        It is also possible to use AES-CBC with HMAC for integrity checks. However, it is considered more straightforward to use AES-GCM directly -instead.

                        For RSA: use the OAEP scheme

                        The Optimal Asymmetric Encryption Padding scheme (OAEP) adds randomness and a secure hash function that strengthens the regular inner workings of RSA.

                        @@ -162,8 +158,6 @@

                        For AES: use authenticated encryption modes

                      • IAPM: Integer Authenticated Parallelizable Mode
                      • OCB: Offset Codebook Mode
                      -

                      It is also possible to use AES-CBC with HMAC for integrity checks. However, it is considered more straightforward to use AES-GCM directly -instead.

                      For RSA: use the OAEP scheme

                      The Optimal Asymmetric Encryption Padding scheme (OAEP) adds randomness and a secure hash function that strengthens the regular inner workings of RSA.

                      @@ -214,8 +208,6 @@

                      For AES: use authenticated encryption modes

                    • IAPM: Integer Authenticated Parallelizable Mode
                    • OCB: Offset Codebook Mode
                    -

                    It is also possible to use AES-CBC with HMAC for integrity checks. However, it is considered more straightforward to use AES-GCM directly -instead.

                    For RSA: use the OAEP scheme

                    The Optimal Asymmetric Encryption Padding scheme (OAEP) adds randomness and a secure hash function that strengthens the regular inner workings of RSA.

                    @@ -254,16 +246,12 @@

                    For AES: use authenticated encryption modes

                  • IAPM: Integer Authenticated Parallelizable Mode
                  • OCB: Offset Codebook Mode
                  -

                  It is also possible to use AES-CBC with HMAC for integrity checks. However, it is considered more straightforward to use AES-GCM directly -instead.

                  For RSA: use the OAEP scheme

                  The Optimal Asymmetric Encryption Padding scheme (OAEP) adds randomness and a secure hash function that strengthens the regular inner workings of RSA.

                  Resources

                  Articles & blog posts

                    -
                  • Microsoft, Timing vulnerabilities with CBC-mode - symmetric decryption using padding
                  • Wikipedia, Padding Oracle Attack
                  • Wikipedia, Chosen-Ciphertext Attack
                  • Wikipedia, Chosen-Plaintext Attack
                  • diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5852.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5852.html index 63df8bd71..071ee23aa 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5852.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5852.html @@ -15,8 +15,8 @@

                    How to fix it

                    • Use possessive quantifiers and atomic grouping (available since Python 3.11) to prevent the regex engine from keeping backtracking positions.
                    • -
                    • Replace . with negated character classes to exclude separators where applicable (e.g., [^_]* instead of - .* before _).
                    • +
                    • Replace . with negated character classes to exclude separators where applicable (e.g., + instead of . before ).
                    • Use bounded quantifiers such as {1,5} to limit repetitions.
                    • Restructure nested quantifiers so the inner group can match in only one way.
                    @@ -60,3 +60,4 @@

                    Related rules

                    • {rule:python:S8786} - Regular expressions should not cause non-linear backtracking
                    + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5958.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5958.html index 999167d12..844c55b95 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5958.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5958.html @@ -70,10 +70,6 @@

                    Compliant solution

                    assert exc_info.value.field == 'api_key' assert 'Missing required field' in str(exc_info.value) - - # or - with pytest.raises(Exception, match=r"Missing required field"): - load_config({})

                  How to fix it in unittest

                  With unittest, use assertRaises() with a specific exception type, or assertRaisesRegex() when you want to verify the @@ -108,10 +104,6 @@

                  Compliant solution

                  def test_negative_age(self): with self.assertRaises(ValueError): parse_age("-5") - - # or - with self.assertRaisesRegex(Exception, r"Age cannot be negative"): - parse_age("-5")

                  Resources

                  Documentation

                  diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5976.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5976.html index c46726354..c1a4b1a82 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5976.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5976.html @@ -1,21 +1,10 @@ -

                  This is an issue when at least 3 test methods differ only by a few hardcoded values and could be refactored into a single parameterized test with -less than 4 parameters.

                  +

                  This rule raises an issue when at least 3 test methods could be refactored into a single parameterized test with less than 4 parameters.

                  Why is this an issue?

                  -

                  When multiple test methods contain nearly identical logic but differ only in a few hardcoded values, they create unnecessary code duplication. This -duplication makes the test suite harder to maintain and increases the risk of introducing bugs.

                  -

                  Consider a scenario where you have three test methods that each verify a calculation with different input values. If you later discover a bug in -the test logic itself, you would need to fix it in three places instead of one. This redundancy is error-prone and wastes time.

                  -

                  Parameterized tests solve this problem by allowing you to write the test logic once and execute it multiple times with different input values. Most -modern testing frameworks, including pytest for Python, provide built-in support for parameterization.

                  -

                  This approach offers several benefits:

                  -
                    -
                  • Reduced code duplication: The test logic is written once, making it easier to understand and maintain.
                  • -
                  • Fewer bugs: Changes to test logic only need to be made in one place.
                  • -
                  • Better readability: The data-driven nature of parameterized tests makes it clear what variations are being tested.
                  • -
                  • Easier to extend: Adding new test cases becomes as simple as adding new parameter values.
                  • -
                  -

                  However, balance is important. If parameterizing tests makes them significantly more complex than the original versions, it may not be worth it. -The goal is to improve maintainability, not to force every similar test into a parameterized structure.

                  +

                  When multiple tests differ only by a few hardcoded values, they should be refactored into a single parameterized test. This reduces duplication, +makes the tests easier to read, and lowers the risk of introducing bugs when the test logic needs to change.

                  +

                  Parameterized tests are supported by most testing frameworks.

                  +

                  The right balance still needs to be found. There is little value in parameterizing tests when the resulting test becomes significantly more complex +than the original versions.

                  What is the potential impact?

                  Duplicated test methods lead to higher maintenance costs and increased likelihood of bugs. When test logic needs to be updated, developers must remember to make identical changes across multiple methods, which is easy to forget.

                  @@ -32,18 +21,6 @@

                  Noncompliant code example

                  import pytest class TestApp: - def test_not_null1(self): # Noncompliant - setup_tax() - assert get_tax(1) is not None - - def test_not_null2(self): - setup_tax() - assert get_tax(2) is not None - - def test_not_null3(self): - setup_tax() - assert get_tax(3) is not None - def test_level1(self): # Noncompliant set_level(1) run_game() @@ -64,11 +41,6 @@

                  Compliant solution

                  import pytest class TestApp: - @pytest.mark.parametrize("tax_id", [1, 2, 3]) - def test_not_null(self, tax_id): - setup_tax() - assert get_tax(tax_id) is not None - @pytest.mark.parametrize("level,health", [ (1, 100), (2, 200), @@ -114,9 +86,9 @@

                  Compliant solution

                  Resources

                  Documentation

                  diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8786.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8786.html index eb27c0fb4..c4b33d6da 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8786.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8786.html @@ -16,20 +16,33 @@

                  How to fix it

                  positions.

                Code examples

                -

                The following regular expression has polynomial backtracking: without a start anchor, the engine retries the pattern at every position, leading to -quadratic evaluation time when there is no match.

                +

                The following examples illustrate two distinct causes of non-linear backtracking. The first shows a pattern that is polynomial when unanchored: +without a start anchor, the engine retries the pattern at every position, leading to quadratic evaluation time when there is no match. The second +shows ambiguous alternation, which causes quadratic backtracking regardless of anchoring because multiple alternatives can match the same input in +different ways.

                Noncompliant code example

                 import re
                 
                -re.search(r"a+b", input)  # Noncompliant - polynomial backtracking when the pattern does not match
                +re.search(r"a+b", text)  # Noncompliant - polynomial backtracking when the pattern does not match
                +
                +
                +import re
                +
                +re.search(r"(a|aa)+", text)  # Noncompliant - ambiguous alternation causes quadratic backtracking
                 

                Compliant solution

                Adding a start anchor prevents the engine from retrying at every position:

                 import re
                 
                -re.search(r"^a+b", input)  # Compliant - anchor eliminates redundant backtracking positions
                +re.search(r"^a+b", text)  # Compliant - anchor eliminates redundant backtracking positions
                +
                +

                Restructuring the alternation to eliminate the overlap removes the quadratic behavior:

                +
                +import re
                +
                +re.search(r"a+", text)  # Compliant - unambiguous
                 

                Resources

                Articles & blog posts

                diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8900.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8900.html index a2fa8cd56..36b8d86f8 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8900.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8900.html @@ -17,8 +17,6 @@

                Why is this an issue?

              • Future compatibility risk: Deprecated methods may be removed in future library versions, breaking your code.
              • Confusion for maintainers: Developers familiar with the modern API will find deprecated methods unexpected and may not understand why they’re being used.
              • -
              • Missing improvements: Modern methods may include performance optimizations or bug fixes not backported to deprecated - versions.

              The library’s documentation explicitly recommends using the modern equivalents to ensure long-term code maintainability.

              In Beautiful Soup specifically, this refers to the transition from Beautiful Soup 3’s camelCase naming (like findAll(), @@ -199,15 +197,27 @@

              Compliant solution

               from bs4 import BeautifulSoup
               
              +soup = BeautifulSoup(html, 'html.parser')
              +result = soup.find_all('a', string='Click here')
              +
              +

              Noncompliant code example

              +
              +from bs4 import BeautifulSoup
              +
              +soup = BeautifulSoup(html, 'html.parser')
              +result = soup.findAll('a', string='Click here')  # Noncompliant
              +
              +

              Compliant solution

              +
              +from bs4 import BeautifulSoup
              +
               soup = BeautifulSoup(html, 'html.parser')
               result = soup.find_all('a', string='Click here')
               

              Resources

              Documentation

              diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8900.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8900.json index fc7fe5fe2..f188656f8 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8900.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8900.json @@ -15,7 +15,7 @@ "ruleSpecification": "RSPEC-8900", "sqKey": "S8900", "scope": "All", - "quickfix": "unknown", + "quickfix": "covered", "code": { "impacts": { "MAINTAINABILITY": "MEDIUM" diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8903.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8903.html index 2eaae5137..c20974670 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8903.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8903.html @@ -1,15 +1,16 @@ -

              When inserting HTML elements into an in-memory document structure using methods that add content nodes with raw HTML strings.

              -

              In Python, this specifically refers to BeautifulSoup operations like insert(), append(), and similar methods that add -HTML content to the document tree.

              +

              This rule raises an issue when HTML elements are inserted into an in-memory document structure using methods that add content nodes with raw HTML +strings.

              +

              In Python, this specifically refers to BeautifulSoup operations such as insert(), append(), and extend() +that add HTML content to the document tree.

              Why is this an issue?

              Document parsing and manipulation libraries provide APIs for building and modifying HTML and XML document trees. When working with these libraries, you need to add new elements to the document structure programmatically.

              A common mistake is to insert raw markup strings directly into the document tree. When you do this, the library treats the string as text content rather than markup. This means all markup special characters get escaped:

                -
              • < becomes <
              • -
              • > becomes >
              • -
              • " becomes "
              • +
              • < becomes &lt;
              • +
              • > becomes &gt;
              • +
              • " becomes &quot;

              As a result, instead of creating actual elements in the document tree, you end up with visible text that looks like markup code on the rendered page. The document structure becomes invalid, and the intended functionality is lost.

              @@ -50,9 +51,10 @@

              Compliant solution

              Resources

              Documentation

              diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8904.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8904.html index e8a9cd8d6..8b2992cda 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8904.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8904.html @@ -1,6 +1,5 @@ -

              This is an issue when accessing attributes, methods, or using subscript notation on HTML/XML parsing library search results without first verifying -the element exists.

              -

              This rule raises an issue when you access attributes, text content, or methods of BeautifulSoup elements without first checking if they exist.

              +

              This rule raises an issue when attributes, text content, or methods of BeautifulSoup elements are accessed without first checking if they +exist.

              BeautifulSoup’s search methods like find(), find_next(), and select_one() return None when they cannot locate a matching element. If you try to access properties or methods on None, Python raises an AttributeError or TypeError, causing your program to crash.

              @@ -140,8 +139,7 @@

              What is the potential impact?

            • Data loss: Partially processed data may be lost when the program terminates
            • Maintenance burden: Developers must handle support requests and emergency fixes
            -

            The impact is particularly severe in production web scraping pipelines, automated testing tools, and applications that process user-provided HTML -content.

            +

            The impact is particularly severe in production web scraping pipelines and applications that process user-provided HTML content.

            How to fix it

            Check if the element exists before accessing its attributes. Store the search result in a variable and verify it’s not None using a conditional statement. This approach makes the code self-documenting and provides a clear place to handle missing elements.

            @@ -169,10 +167,9 @@

            Compliant solution

            Resources

            Documentation

            diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8905.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8905.html index e8e57cfe6..e71fe8a50 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8905.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8905.html @@ -23,7 +23,7 @@

            Why is this an issue?

            For security-sensitive applications that parse untrusted HTML, relying on an unspecified parser introduces additional risk. Different parsers may interpret potentially malicious markup differently, and you lose control over this critical parsing behavior.

            In Python’s BeautifulSoup library, the common parsers are html.parser (Python’s built-in), lxml (faster with native -code), and html5lib (most lenient and browser-like).

            +code), lxml-xml or xml (for XML documents), and html5lib (most lenient and browser-like).

            What is the potential impact?

            When HTML parsing libraries use different parsers across environments, your application may:

              diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_agentic_AI_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_agentic_AI_profile.json index 4f70e2235..88ce98945 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_agentic_AI_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_agentic_AI_profile.json @@ -306,7 +306,6 @@ "S8413", "S8414", "S8415", - "S8714", "S8786" ] } diff --git a/sonarpedia.json b/sonarpedia.json index 0268a3508..ff4da8df8 100644 --- a/sonarpedia.json +++ b/sonarpedia.json @@ -3,7 +3,7 @@ "languages": [ "PY" ], - "latest-update": "2026-05-26T08:35:55.912839Z", + "latest-update": "2026-06-30T07:19:01.975842Z", "options": { "no-language-in-filenames": true, "preserve-filenames": true From 023a7d90e21eca155bde0d5946fe096a3cc09ffa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Coet?= Date: Tue, 30 Jun 2026 16:06:05 +0200 Subject: [PATCH 164/322] CLP-82 Update notifications Slack channels (#1208) GitOrigin-RevId: eacff3bf582a8c06bb9fd19f89351a224dc8bdaa --- .github/workflows/SlackNotify.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/SlackNotify.yml b/.github/workflows/SlackNotify.yml index 9c168d68c..bc7c655c4 100644 --- a/.github/workflows/SlackNotify.yml +++ b/.github/workflows/SlackNotify.yml @@ -19,4 +19,4 @@ jobs: GITHUB_TOKEN: ${{ github.token }} uses: SonarSource/gh-action_slack-notify@1.0.1 with: - slackChannel: squad-python-notifs + slackChannel: squad-corelang-notifs From 2d78692f7574d3efe6f6b4504831a1eebf8c6821 Mon Sep 17 00:00:00 2001 From: "hashicorp-vault-sonar-prod[bot]" <111297361+hashicorp-vault-sonar-prod[bot]@users.noreply.github.com> Date: Tue, 30 Jun 2026 16:31:17 +0200 Subject: [PATCH 165/322] Prepare for next development iteration (#1228) Co-authored-by: rombirli <56340680+rombirli@users.noreply.github.com> GitOrigin-RevId: 957b5b351b77060917ea18dd9038e3c75681b35a --- docs/pom.xml | 2 +- docs/python-custom-rules-example/pom.xml | 2 +- its/commons/pom.xml | 2 +- its/plugin/it-python-plugin-test/pom.xml | 2 +- its/plugin/pom.xml | 2 +- its/plugin/python-custom-rules-plugin/pom.xml | 2 +- its/pom.xml | 2 +- pom.xml | 2 +- python-checks-testkit/pom.xml | 2 +- python-checks/pom.xml | 2 +- python-commons/pom.xml | 2 +- python-frontend/pom.xml | 2 +- sonar-python-plugin/pom.xml | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/pom.xml b/docs/pom.xml index b67000062..4ae9d3042 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.python python - 5.24-SNAPSHOT + 5.25-SNAPSHOT docs diff --git a/docs/python-custom-rules-example/pom.xml b/docs/python-custom-rules-example/pom.xml index 9476de1fa..5d0efff3c 100644 --- a/docs/python-custom-rules-example/pom.xml +++ b/docs/python-custom-rules-example/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python docs - 5.24-SNAPSHOT + 5.25-SNAPSHOT python-custom-rules-example diff --git a/its/commons/pom.xml b/its/commons/pom.xml index e5a45ab5f..a77389664 100644 --- a/its/commons/pom.xml +++ b/its/commons/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python python-its - 5.24-SNAPSHOT + 5.25-SNAPSHOT Python :: ITs :: Commons diff --git a/its/plugin/it-python-plugin-test/pom.xml b/its/plugin/it-python-plugin-test/pom.xml index 81e926dad..a6024bd5c 100644 --- a/its/plugin/it-python-plugin-test/pom.xml +++ b/its/plugin/it-python-plugin-test/pom.xml @@ -7,7 +7,7 @@ it-python-plugin org.sonarsource.python - 5.24-SNAPSHOT + 5.25-SNAPSHOT it-python-plugin-test diff --git a/its/plugin/pom.xml b/its/plugin/pom.xml index a345c58d9..0e3f467ba 100644 --- a/its/plugin/pom.xml +++ b/its/plugin/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.python python-its - 5.24-SNAPSHOT + 5.25-SNAPSHOT diff --git a/its/plugin/python-custom-rules-plugin/pom.xml b/its/plugin/python-custom-rules-plugin/pom.xml index bb6322c88..5bb49fcf1 100644 --- a/its/plugin/python-custom-rules-plugin/pom.xml +++ b/its/plugin/python-custom-rules-plugin/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python it-python-plugin - 5.24-SNAPSHOT + 5.25-SNAPSHOT python-custom-rules-plugin diff --git a/its/pom.xml b/its/pom.xml index aa2e4ef9e..541bb1ae1 100644 --- a/its/pom.xml +++ b/its/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.python python - 5.24-SNAPSHOT + 5.25-SNAPSHOT python-its diff --git a/pom.xml b/pom.xml index 16104b552..af4441342 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ org.sonarsource.python python - 5.24-SNAPSHOT + 5.25-SNAPSHOT pom Python diff --git a/python-checks-testkit/pom.xml b/python-checks-testkit/pom.xml index 7a10abb1f..5c59d2704 100644 --- a/python-checks-testkit/pom.xml +++ b/python-checks-testkit/pom.xml @@ -6,7 +6,7 @@ python org.sonarsource.python - 5.24-SNAPSHOT + 5.25-SNAPSHOT python-checks-testkit diff --git a/python-checks/pom.xml b/python-checks/pom.xml index bea5cde95..717470f15 100644 --- a/python-checks/pom.xml +++ b/python-checks/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.python python - 5.24-SNAPSHOT + 5.25-SNAPSHOT python-checks diff --git a/python-commons/pom.xml b/python-commons/pom.xml index 69a62e435..09faba74a 100644 --- a/python-commons/pom.xml +++ b/python-commons/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python python - 5.24-SNAPSHOT + 5.25-SNAPSHOT python-commons diff --git a/python-frontend/pom.xml b/python-frontend/pom.xml index 97ae9445c..e2d7e18c1 100644 --- a/python-frontend/pom.xml +++ b/python-frontend/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python python - 5.24-SNAPSHOT + 5.25-SNAPSHOT python-frontend diff --git a/sonar-python-plugin/pom.xml b/sonar-python-plugin/pom.xml index 1c5f613ab..110299efc 100644 --- a/sonar-python-plugin/pom.xml +++ b/sonar-python-plugin/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python python - 5.24-SNAPSHOT + 5.25-SNAPSHOT sonar-python-plugin From d53165b3862d752102315d31b0d83c86dde6c299 Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Wed, 1 Jul 2026 12:35:45 +0200 Subject: [PATCH 166/322] SONARPY-4312 Port S2187 to python: TestCases should contain tests (#1220) GitOrigin-RevId: 31d1f65c33e89164346651f3b28f1537eca5dc5d --- .../python/checks/OpenSourceCheckList.java | 2 + .../TestCasesShouldContainTestsCheck.java | 237 ++++++++++++++++++ .../org/sonar/l10n/py/rules/python/S2187.html | 72 ++++++ .../org/sonar/l10n/py/rules/python/S2187.json | 25 ++ .../py/rules/python/Sonar_way_profile.json | 1 + .../TestCasesShouldContainTestsCheckTest.java | 53 ++++ .../resources/checks/tests/emptyModule.py | 1 + .../checks/tests/emptyPytestModule_test.py | 7 + .../checks/tests/helpersOnlyModule.py | 12 + .../tests/testCasesShouldContainTests_test.py | 169 +++++++++++++ .../checks/tests/test_emptyPytestModule.py | 2 + ...t_fileWithClassTestsButNoCandidateClass.py | 4 + 12 files changed, 585 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/tests/TestCasesShouldContainTestsCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2187.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2187.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/tests/TestCasesShouldContainTestsCheckTest.java create mode 100644 python-checks/src/test/resources/checks/tests/emptyModule.py create mode 100644 python-checks/src/test/resources/checks/tests/emptyPytestModule_test.py create mode 100644 python-checks/src/test/resources/checks/tests/helpersOnlyModule.py create mode 100644 python-checks/src/test/resources/checks/tests/testCasesShouldContainTests_test.py create mode 100644 python-checks/src/test/resources/checks/tests/test_emptyPytestModule.py create mode 100644 python-checks/src/test/resources/checks/tests/test_fileWithClassTestsButNoCandidateClass.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index e738145b1..593722259 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -101,6 +101,7 @@ import org.sonar.python.checks.tests.SingleInvocationRuntimeExceptionCheck; import org.sonar.python.checks.tests.SkippedTestNoReasonCheck; import org.sonar.python.checks.tests.SpecificExceptionAssertionCheck; +import org.sonar.python.checks.tests.TestCasesShouldContainTestsCheck; import org.sonar.python.checks.tests.UnconditionalAssertionCheck; public class OpenSourceCheckList { @@ -420,6 +421,7 @@ public Stream> getChecks() { SpecialMethodParamListCheck.class, SpecialMethodReturnTypeCheck.class, SpecificExceptionAssertionCheck.class, + TestCasesShouldContainTestsCheck.class, SQLQueriesCheck.class, StartsWithEndsWithTupleCheck.class, StopIterationInGeneratorCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/TestCasesShouldContainTestsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/TestCasesShouldContainTestsCheck.java new file mode 100644 index 000000000..fc5c09ded --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/TestCasesShouldContainTestsCheck.java @@ -0,0 +1,237 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; +import javax.annotation.Nullable; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.symbols.ClassSymbol; +import org.sonar.plugins.python.api.symbols.Symbol; +import org.sonar.plugins.python.api.tree.ClassDef; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.FileInput; +import org.sonar.plugins.python.api.tree.FunctionDef; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.RaiseStatement; +import org.sonar.plugins.python.api.tree.Statement; +import org.sonar.plugins.python.api.tree.StatementList; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; + +import static java.util.function.Predicate.not; +import static org.sonar.python.tree.TreeUtils.getClassSymbolFromDef; + +@Rule(key = "S2187") +public class TestCasesShouldContainTestsCheck extends PythonSubscriptionCheck { + private static final String CLASS_MESSAGE = "Add some tests to this class."; + private static final String FILE_MESSAGE = "Add some tests to this file."; + private static final TypeMatcher UNITTEST_TEST_CASE_MATCHER = TypeMatchers.any( + TypeMatchers.isOrExtendsType("unittest.TestCase"), + TypeMatchers.isOrExtendsType("unittest.case.TestCase")); + private static final TypeMatcher ABSTRACT_BASE_CLASS_MATCHER = TypeMatchers.isOrExtendsType("abc.ABC"); + private static final TypeMatcher NOT_IMPLEMENTED_ERROR_MATCHER = TypeMatchers.any( + TypeMatchers.isType("builtins.NotImplementedError"), + TypeMatchers.isObjectInstanceOf("builtins.NotImplementedError")); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.FILE_INPUT, TestCasesShouldContainTestsCheck::checkFileInput); + } + + private static void checkFileInput(SubscriptionContext ctx) { + FileInput fileInput = (FileInput) ctx.syntaxNode(); + StatementList statements = fileInput.statements(); + if (statements == null) { + return; + } + + boolean pytestStyleFile = isPytestStyleFile(ctx); + List candidateClasses = collectCandidateClasses(ctx, statements, pytestStyleFile); + boolean hasCollectedTests = hasModuleLevelPytestTests(statements) || hasClassLevelTests(statements); + + if (pytestStyleFile && !hasCollectedTests) { + ctx.addFileIssue(FILE_MESSAGE); + return; + } + + candidateClasses + .stream() + .filter(not(CandidateClass::hasCollectedTests)) + .filter(candidateClass -> !hasDescendantWithTests(candidateClass, candidateClasses)) + .filter(candidateClass -> !isLikelySharedBaseClass(candidateClass, ctx)) + .forEach(candidateClass -> ctx.addIssue(candidateClass.classDef().name(), CLASS_MESSAGE)); + } + + private static List collectCandidateClasses(SubscriptionContext ctx, StatementList statements, boolean pytestStyleFile) { + return statements.statements() + .stream().filter(ClassDef.class::isInstance) + .map(ClassDef.class::cast) + .filter(classDef -> isCandidateTestClass(ctx, classDef, pytestStyleFile)) + .map(classDef -> + new CandidateClass(classDef, getClassSymbolFromDef(classDef), hasCollectedTests(classDef)) + ) + .toList(); + } + + private static boolean hasModuleLevelPytestTests(StatementList statements) { + return statements.statements().stream() + .filter(FunctionDef.class::isInstance) + .map(FunctionDef.class::cast) + .anyMatch(TestCasesShouldContainTestsCheck::isTestMethod); + } + + private static boolean hasClassLevelTests(StatementList statements) { + return statements.statements().stream() + .filter(ClassDef.class::isInstance) + .map(ClassDef.class::cast) + .anyMatch(TestCasesShouldContainTestsCheck::hasCollectedTests); + } + + private static boolean isCandidateTestClass(SubscriptionContext ctx, ClassDef classDef, boolean pytestStyleFile) { + return (pytestStyleFile && classDef.name().name().startsWith("Test")) || isUnittestTestCaseClass(classDef, ctx); + } + + private static boolean isPytestStyleFile(SubscriptionContext ctx) { + String fileName = ctx.pythonFile().fileName(); + return fileName.startsWith("test_") || fileName.endsWith("_test.py"); + } + + private static boolean isUnittestTestCaseClass(ClassDef classDef, SubscriptionContext ctx) { + return hasAncestorMatching(classDef, UNITTEST_TEST_CASE_MATCHER, ctx); + } + + private static boolean hasCollectedTests(ClassDef classDef) { + return hasLocalTestMethod(classDef) || hasInheritedTestMethod(classDef); + } + + private static boolean hasLocalTestMethod(ClassDef classDef) { + return classDef.body().statements().stream() + .filter(FunctionDef.class::isInstance) + .map(FunctionDef.class::cast) + .anyMatch(TestCasesShouldContainTestsCheck::isTestMethod); + } + + private static boolean hasInheritedTestMethod(ClassDef classDef) { + ClassSymbol classSymbol = getClassSymbolFromDef(classDef); + return classSymbol != null && superClassesDeclareTests(classSymbol, new LinkedHashSet<>()); + } + + private static boolean superClassesDeclareTests(ClassSymbol classSymbol, Set visitedSymbols) { + if (!visitedSymbols.add(classSymbol)) { + return false; + } + return classSymbol.superClasses().stream() + .filter(ClassSymbol.class::isInstance) + .map(ClassSymbol.class::cast) + .anyMatch(superClassSymbol -> + superClassesDeclareTests(superClassSymbol, visitedSymbols) || + superClassSymbol.declaredMembers().stream() + .filter(symbol -> symbol.is(Symbol.Kind.FUNCTION)) + .map(Symbol::name) + .anyMatch(TestCasesShouldContainTestsCheck::isTestMethodName) + ); + } + + private static boolean hasDescendantWithTests(CandidateClass candidateClass, List candidateClasses) { + ClassSymbol classSymbol = candidateClass.classSymbol(); + if (classSymbol == null) { + return false; + } + return candidateClasses.stream() + .filter(other -> other != candidateClass) + .filter(CandidateClass::hasCollectedTests) + .map(CandidateClass::classSymbol) + .filter(Objects::nonNull) + .anyMatch(otherClassSymbol -> otherClassSymbol.isOrExtends(classSymbol)); + } + + private static boolean isLikelySharedBaseClass(CandidateClass candidateClass, SubscriptionContext ctx) { + ClassDef classDef = candidateClass.classDef(); + String className = classDef.name().name(); + return className.startsWith("Base") + || className.endsWith("Mixin") + || isAbstractBaseClass(classDef, candidateClass.classSymbol(), ctx) + || onlyContainsPlaceholderMethods(classDef, ctx); + } + + private static boolean isAbstractBaseClass(ClassDef classDef, @Nullable ClassSymbol classSymbol, SubscriptionContext ctx) { + return classSymbol != null && (classSymbol.hasMetaClass() + || hasAncestorMatching(classDef, ABSTRACT_BASE_CLASS_MATCHER, ctx)); + } + + private static boolean hasAncestorMatching(ClassDef classDef, TypeMatcher matcher, SubscriptionContext ctx) { + var args = classDef.args(); + if (args == null) { + return false; + } + for (var argument : args.arguments()) { + if (argument instanceof RegularArgument regularArgument && matcher.isTrueFor(regularArgument.expression(), ctx)) { + return true; + } + } + return false; + } + + private static boolean onlyContainsPlaceholderMethods(ClassDef classDef, SubscriptionContext ctx) { + return classDef.body().statements().stream() + .filter(FunctionDef.class::isInstance) + .map(FunctionDef.class::cast) + .findAny() + .filter(functionDef -> classDef.body().statements().stream() + .filter(FunctionDef.class::isInstance) + .map(FunctionDef.class::cast) + .allMatch(method -> isPlaceholderMethod(method, ctx))) + .isPresent(); + } + + private static boolean isPlaceholderMethod(FunctionDef functionDef, SubscriptionContext ctx) { + List statements = functionDef.body().statements(); + return statements.size() == 1 && isPlaceholderStatement(statements.get(0), ctx); + } + + private static boolean isPlaceholderStatement(Statement statement, SubscriptionContext ctx) { + return statement.is(Tree.Kind.PASS_STMT) || isNotImplementedErrorRaise(statement, ctx); + } + + private static boolean isNotImplementedErrorRaise(Statement statement, SubscriptionContext ctx) { + if (!(statement instanceof RaiseStatement raiseStatement) || raiseStatement.expressions().size() != 1) { + return false; + } + return isNotImplementedError(raiseStatement.expressions().get(0), ctx); + } + + private static boolean isNotImplementedError(Expression expression, SubscriptionContext ctx) { + return NOT_IMPLEMENTED_ERROR_MATCHER.isTrueFor(expression, ctx); + } + + private static boolean isTestMethod(FunctionDef functionDef) { + return isTestMethodName(functionDef.name().name()); + } + + private static boolean isTestMethodName(String name) { + return name.startsWith("test"); + } + + private record CandidateClass(ClassDef classDef, @Nullable ClassSymbol classSymbol, boolean hasCollectedTests) { + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2187.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2187.html new file mode 100644 index 000000000..9df340e6e --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2187.html @@ -0,0 +1,72 @@ +

              Why is this an issue?

              +

              Test files and test classes are meant to verify behavior. When a file looks like a test module, or a class looks like a collected test class, +readers expect it to contain executable test cases. If it only contains helpers, fixtures, or lifecycle code, it gives the false impression that the +covered behavior is actually tested.

              +

              In Python, this can happen in different ways depending on the test framework:

              +
                +
              • In pytest, a file such as test_example.py or example_test.py can define fixtures or helper classes but no + collected test functions or test methods.
              • +
              • In unittest, a class can inherit from unittest.TestCase but only define setup helpers and no test_ + methods.
              • +
              +

              Such files and classes are misleading because they appear to contribute test coverage while actually verifying nothing.

              +

              Exceptions

              +

              There are scenarios where not having local test cases is acceptable.

              +

              Base classes used only for shared test logic

              +

              Shared helpers or setup code can live in a base class or mixin that is meant to be inherited by real test classes. Those classes are not +problematic by themselves as long as the actual derived test classes contain collected tests.

              +

              Derived classes that inherit tests

              +

              Some test classes inherit test methods from a base class. In that case, the derived class may not declare its own test_ methods +locally, but it still participates in real tests and should not be flagged.

              +

              How to fix it in pytest

              +

              To fix this issue in pytest, it is important that all test files contain at least one test case.

              +

              Test cases in pytest are identified by:

              +
                +
              • Functions prefixed with test_ in files prefixed with test_ or suffixed with _test.py
              • +
              • Methods prefixed with test_ in classes prefixed with Test
              • +
              +

              Code examples

              +

              Noncompliant code example

              +
              +# test_example.py
              +class TestSomeClass:
              +    pass  # Noncompliant: no test methods
              +
              +

              Compliant solution

              +
              +# test_example.py
              +class TestSomeClass:
              +    def test_some_method_should_return_true(self):
              +        assert some_method() is True
              +
              +

              How to fix it in unittest

              +

              To fix this issue in unittest, it is important that all test classes that inherit from unittest.TestCase contain at least +one test method.

              +

              Test methods in unittest must:

              +
                +
              • Be prefixed with test_
              • +
              • Be part of a class that inherits from unittest.TestCase
              • +
              +

              Code examples

              +

              Noncompliant code example

              +
              +import unittest
              +
              +class TestSomeClass(unittest.TestCase):
              +    pass  # Noncompliant: no test methods
              +
              +

              Compliant solution

              +
              +import unittest
              +
              +class TestSomeClass(unittest.TestCase):
              +    def test_some_method_should_return_true(self):
              +        self.assertTrue(some_method())
              +
              +

              Resources

              +

              Documentation

              + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2187.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2187.json new file mode 100644 index 000000000..c86146c6e --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2187.json @@ -0,0 +1,25 @@ +{ + "title": "TestCases should contain tests", + "type": "CODE_SMELL", + "code": { + "impacts": { + "MAINTAINABILITY": "BLOCKER" + }, + "attribute": "TESTED" + }, + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "tests", + "pytest", + "unittest" + ], + "defaultSeverity": "Blocker", + "ruleSpecification": "RSPEC-2187", + "sqKey": "S2187", + "scope": "Tests", + "quickfix": "unknown" +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index cbc535c21..0bd91045e 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -51,6 +51,7 @@ "S2092", "S2115", "S2159", + "S2187", "S2190", "S2201", "S2208", diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/TestCasesShouldContainTestsCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/TestCasesShouldContainTestsCheckTest.java new file mode 100644 index 000000000..2bb010644 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/TestCasesShouldContainTestsCheckTest.java @@ -0,0 +1,53 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import org.junit.jupiter.api.Test; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class TestCasesShouldContainTestsCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/testCasesShouldContainTests_test.py", new TestCasesShouldContainTestsCheck()); + } + + @Test + void pytest_file_without_tests() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/emptyPytestModule_test.py", new TestCasesShouldContainTestsCheck()); + } + + @Test + void pytest_prefix_file_without_tests() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/test_emptyPytestModule.py", new TestCasesShouldContainTestsCheck()); + } + + @Test + void non_pytest_file() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/helpersOnlyModule.py", new TestCasesShouldContainTestsCheck()); + } + + @Test + void empty_file() { + PythonCheckVerifier.verifyNoIssue("src/test/resources/checks/tests/emptyModule.py", new TestCasesShouldContainTestsCheck()); + } + + @Test + void file_with_class_tests_but_no_candidate_class() { + PythonCheckVerifier.verifyNoIssue("src/test/resources/checks/tests/test_fileWithClassTestsButNoCandidateClass.py", new TestCasesShouldContainTestsCheck()); + } +} diff --git a/python-checks/src/test/resources/checks/tests/emptyModule.py b/python-checks/src/test/resources/checks/tests/emptyModule.py new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/emptyModule.py @@ -0,0 +1 @@ + diff --git a/python-checks/src/test/resources/checks/tests/emptyPytestModule_test.py b/python-checks/src/test/resources/checks/tests/emptyPytestModule_test.py new file mode 100644 index 000000000..482d2781b --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/emptyPytestModule_test.py @@ -0,0 +1,7 @@ +def helper_only_module(): # Noncompliant@-1 {{Add some tests to this file.}} + return 42 + + +class TestHelperOnly: + def helper(self): + return 42 diff --git a/python-checks/src/test/resources/checks/tests/helpersOnlyModule.py b/python-checks/src/test/resources/checks/tests/helpersOnlyModule.py new file mode 100644 index 000000000..25f5ee53a --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/helpersOnlyModule.py @@ -0,0 +1,12 @@ +import unittest + + +class TestHelper: + def helper(self): + return 42 + + +class EmptyUnittestCase(unittest.TestCase): # Noncompliant {{Add some tests to this class.}} +# ^^^^^^^^^^^^^^^^^ + def helper(self): + return 42 diff --git a/python-checks/src/test/resources/checks/tests/testCasesShouldContainTests_test.py b/python-checks/src/test/resources/checks/tests/testCasesShouldContainTests_test.py new file mode 100644 index 000000000..9aff1ad8d --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/testCasesShouldContainTests_test.py @@ -0,0 +1,169 @@ +import unittest + + +def test_module_level_test(): + assert True + + +class TestPytestWithoutTests: # Noncompliant {{Add some tests to this class.}} +# ^^^^^^^^^^^^^^^^^^^^^^ + def helper(self): + return 42 + + +class TestPytestWithTest: + def test_ok(self): + assert True + + +class HelperPytestClass: + def helper(self): + return 42 + + +class EmptyUnittestCase(unittest.TestCase): # Noncompliant {{Add some tests to this class.}} +# ^^^^^^^^^^^^^^^^^ + def helper(self): + return 42 + + +class BaseSharedTestCase(unittest.TestCase): + def helper(self): + return 42 + + +class HelperMixin(unittest.TestCase): + def helper(self): + return 42 + + +class UnittestWithTest(unittest.TestCase): + def test_ok(self): + self.assertTrue(True) + + +class BaseHelperTestCase(unittest.TestCase): + def helper(self): + return 42 + + +class DerivedWithOwnTest(BaseHelperTestCase): + def test_ok(self): + self.assertEqual(42, self.helper()) + + +class BaseWithInheritedTest(unittest.TestCase): + def test_from_base(self): + self.assertTrue(True) + + +class DerivedInheritingTest(BaseWithInheritedTest): + def helper(self): + return 42 + + +class TestBaseHelper: + def helper(self): + return 42 + + +class BasePytestScaffold: + def helper(self): + return 42 + + +class TestDerivedWithTest(TestBaseHelper): + def test_ok(self): + assert self.helper() == 42 + + +class TestBaseWithTest: + def test_from_base(self): + assert True + + +class TestDerivedInheritingTest(TestBaseWithTest): + def helper(self): + return 42 + + +class BaseWithTestAttribute(unittest.TestCase): + test_data = True + + +class DerivedWithoutRealInheritedTest(BaseWithTestAttribute): # Noncompliant {{Add some tests to this class.}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + def helper(self): + return 42 + + +class TestingNameOnly(unittest.TestCase): + def testing(self): + return 42 + + +class CamelCaseTestMethod(unittest.TestCase): + def testSomething(self): + return 42 + + +class TestUnknownParent(UnknownParent): # Noncompliant {{Add some tests to this class.}} +# ^^^^^^^^^^^^^^^^^ + def helper(self): + return 42 + + +def TestAmbiguous(): + return 42 + + +class TestAmbiguous: # Noncompliant {{Add some tests to this class.}} +# ^^^^^^^^^^^^^ + def helper(self): + return 42 + + +class SharedBase: + def test_from_base(self): + assert True + + +class LeftBranch(SharedBase): + pass + + +class RightBranch(SharedBase): + pass + + +class TestDiamondInheritance(LeftBranch, RightBranch): + def helper(self): + return 42 + + +def FactoryBase(): + return object + + +class TestFunctionBase(FactoryBase): # Noncompliant {{Add some tests to this class.}} +# ^^^^^^^^^^^^^^^^ + def helper(self): + return 42 + + +class SharedNoTest: + pass + + +class LeftNoTest(SharedNoTest): + pass + + +class RightNoTest(SharedNoTest): + pass + + +class TestDiamondNoTests(LeftNoTest, RightNoTest): # Noncompliant {{Add some tests to this class.}} +# ^^^^^^^^^^^^^^^^^^ + def helper(self): + return 42 diff --git a/python-checks/src/test/resources/checks/tests/test_emptyPytestModule.py b/python-checks/src/test/resources/checks/tests/test_emptyPytestModule.py new file mode 100644 index 000000000..4e020174c --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/test_emptyPytestModule.py @@ -0,0 +1,2 @@ +def helper_only_module(): # Noncompliant@-1 {{Add some tests to this file.}} + return 42 diff --git a/python-checks/src/test/resources/checks/tests/test_fileWithClassTestsButNoCandidateClass.py b/python-checks/src/test/resources/checks/tests/test_fileWithClassTestsButNoCandidateClass.py new file mode 100644 index 000000000..0263c2a42 --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/test_fileWithClassTestsButNoCandidateClass.py @@ -0,0 +1,4 @@ +class ApiTests: + def test_list(self): + assert True + From 67251855dce6ec42f36a2935d7a91c08cff76ba9 Mon Sep 17 00:00:00 2001 From: Victor Date: Thu, 2 Jul 2026 10:20:14 +0200 Subject: [PATCH 167/322] SONARPY-4333 Use squad Renovate preset (#1236) GitOrigin-RevId: bf9756dfe9440c3e2fba52b3b97dfa2509e0c939 --- renovate.json | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/renovate.json b/renovate.json index 37f1181c3..f23dd67a2 100644 --- a/renovate.json +++ b/renovate.json @@ -1,14 +1,27 @@ { "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": ["github>SonarSource/renovate-config:languages-team"], - "enabledManagers": ["maven", "github-actions"], - "ignorePaths": ["python-frontend/typeshed_serializer/**"], - + "extends": [ + "local>SonarSource/core-languages-tooling-public:renovate-config" + ], + "enabledManagers": [ + "maven", + "github-actions" + ], + "ignorePaths": [ + "python-frontend/typeshed_serializer/**" + ], "packageRules": [ { - "matchManagers": ["maven"], - "matchPackageNames": ["*"], - "matchUpdateTypes": ["minor", "patch"], + "matchManagers": [ + "maven" + ], + "matchPackageNames": [ + "*" + ], + "matchUpdateTypes": [ + "minor", + "patch" + ], "groupName": "all non-major dependencies", "groupSlug": "all-minor-patch" }, @@ -36,11 +49,15 @@ "groupName": "parent" }, { - "matchPackageNames": ["/org.sonarsource.sonarlint.core.*/"], + "matchPackageNames": [ + "/org.sonarsource.sonarlint.core.*/" + ], "groupName": "SL core" }, { - "matchDepTypes": ["action"], + "matchDepTypes": [ + "action" + ], "rollbackPrs": false, "pinDigests": false } From 576b3aeca03193f18db470f21f4de6ba6f3c3010 Mon Sep 17 00:00:00 2001 From: Luqman Shahid Date: Thu, 2 Jul 2026 15:18:42 +0200 Subject: [PATCH 168/322] SONARPY-4310 Use SecretClassifier to filter S2068, S6418, S6437, S6779, S6781 (#1233) Co-authored-by: Claude Sonnet 5 GitOrigin-RevId: 430439a4a7536a1d6ef9b168ee9fd3f3274f2e36 --- pom.xml | 2 +- .../python/checks/FlaskHardCodedSecret.java | 28 +++++---- .../checks/HardcodedCredentialsCallCheck.java | 9 ++- .../hotspots/HardCodedCredentialsCheck.java | 63 +++++++++++++------ .../HardCodedCredentialsEntropyCheck.java | 3 +- .../checks/flaskHardCodedJWTSecretKey.py | 18 +++--- .../checks/flaskHardCodedSecretKey.py | 26 ++++---- .../resources/checks/hardCodedCredentials.py | 26 +++++--- .../checks/hardCodedCredentialsCustom.py | 2 +- .../checks/hardcodedCredentialsCall.py | 50 +++++++-------- 10 files changed, 135 insertions(+), 92 deletions(-) diff --git a/pom.xml b/pom.xml index af4441342..35011a3ca 100644 --- a/pom.xml +++ b/pom.xml @@ -103,7 +103,7 @@ 26.2.0.119303 13.0.0.3026 6.1.0.3962 - 2.24.0.4903 + 2.25.0.4954 its/**,private/its-enterprise/**,python-frontend/typeshed_serializer/**,**/test/resources/** diff --git a/python-checks/src/main/java/org/sonar/python/checks/FlaskHardCodedSecret.java b/python-checks/src/main/java/org/sonar/python/checks/FlaskHardCodedSecret.java index d32409675..d70fffc7c 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/FlaskHardCodedSecret.java +++ b/python-checks/src/main/java/org/sonar/python/checks/FlaskHardCodedSecret.java @@ -38,6 +38,7 @@ import org.sonar.plugins.python.api.tree.Tree; import org.sonar.python.checks.utils.Expressions; import org.sonar.python.tree.TreeUtils; +import org.sonarsource.analyzer.commons.appsec.SecretClassifier; public abstract class FlaskHardCodedSecret extends PythonSubscriptionCheck { @@ -133,20 +134,20 @@ private boolean isIllegalKeyValuePair(KeyValuePair keyValuePair) { .map(StringLiteral.class::cast) .map(StringLiteral::trimmedQuotesValue) .filter(getSecretKeyKeyword()::equals) - .isPresent() && isStringValue(keyValuePair.value()); + .isPresent() && isPotentialSecretValue(keyValuePair.value()); } private Optional getIllegalKeywordArgument(CallExpression callExpression) { return Optional.ofNullable(TreeUtils.argumentByKeyword(getSecretKeyKeyword(), callExpression.arguments())) .filter(argument -> Optional.of(argument) .map(RegularArgument::expression) - .filter(FlaskHardCodedSecret::isStringValue) + .filter(FlaskHardCodedSecret::isPotentialSecretValue) .isPresent()); } private void verifyAssignmentStatement(SubscriptionContext ctx) { AssignmentStatement assignmentStatementTree = (AssignmentStatement) ctx.syntaxNode(); - if (!isStringValue(assignmentStatementTree.assignedValue())) { + if (!isPotentialSecretValue(assignmentStatementTree.assignedValue())) { return; } List expressionList = assignmentStatementTree.lhsExpressions().stream() @@ -181,24 +182,27 @@ protected boolean isSensitiveProperty(Expression expression) { .isPresent(); } - private static boolean isStringValue(@Nullable Expression expr) { - return isStringValue(expr, new HashSet<>()); + // True when expr resolves to a string literal that SecretClassifier does NOT recognize as a known non-secret placeholder. + private static boolean isPotentialSecretValue(@Nullable Expression expr) { + return resolveStringValue(expr, new HashSet<>()) + .filter(value -> !SecretClassifier.isKnownNonSecret(value)) + .isPresent(); } - - private static boolean isStringValue(@Nullable Expression expr, Set visited) { + private static Optional resolveStringValue(@Nullable Expression expr, Set visited) { if (expr == null) { - return false; + return Optional.empty(); } if (expr.is(Tree.Kind.NAME)) { if (visited.contains(((Name) expr).name())) { - return false; + return Optional.empty(); } visited.add(((Name) expr).name()); Expression assignmentValueExpression = Expressions.singleAssignedValue((Name) expr); - return isStringValue(assignmentValueExpression, visited); - } else { - return expr.is(Tree.Kind.STRING_LITERAL); + return resolveStringValue(assignmentValueExpression, visited); + } else if (expr.is(Tree.Kind.STRING_LITERAL)) { + return Optional.of(((StringLiteral) expr).trimmedQuotesValue()); } + return Optional.empty(); } } diff --git a/python-checks/src/main/java/org/sonar/python/checks/HardcodedCredentialsCallCheck.java b/python-checks/src/main/java/org/sonar/python/checks/HardcodedCredentialsCallCheck.java index 2c9cc77cc..361356716 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/HardcodedCredentialsCallCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/HardcodedCredentialsCallCheck.java @@ -44,6 +44,7 @@ import org.sonar.plugins.python.api.tree.Tree; import org.sonar.python.checks.utils.Expressions; import org.sonar.python.tree.TreeUtils; +import org.sonarsource.analyzer.commons.appsec.SecretClassifier; @Rule(key = "S6437") public class HardcodedCredentialsCallCheck extends PythonSubscriptionCheck { @@ -91,6 +92,7 @@ private static void checkArgument(SubscriptionContext ctx, RegularArgument argum .map(StringLiteral.class::cast) .filter(Predicate.not(HardcodedCredentialsCallCheck::containsFormattedExpressions)) .filter(HardcodedCredentialsCallCheck::isNotEmpty) + .filter(HardcodedCredentialsCallCheck::isNotKnownNonSecret) .ifPresent(string -> ctx.addIssue(argument, MESSAGE)); } else if (argExp.is(Tree.Kind.NAME)) { findAssignment((Name) argExp, 0) @@ -98,6 +100,7 @@ private static void checkArgument(SubscriptionContext ctx, RegularArgument argum .map(StringLiteral.class::cast) .filter(Predicate.not(HardcodedCredentialsCallCheck::containsFormattedExpressions)) .filter(HardcodedCredentialsCallCheck::isNotEmpty) + .filter(HardcodedCredentialsCallCheck::isNotKnownNonSecret) .ifPresent(assignedValue -> ctx.addIssue(argument, MESSAGE).secondary(assignedValue, MESSAGE)); } } @@ -106,7 +109,11 @@ private static boolean isNotEmpty(StringLiteral stringLiteral) { return Optional.of(stringLiteral) .map(StringLiteral::trimmedQuotesValue) .filter(Predicate.not(String::isEmpty)) - .isPresent(); + .isPresent(); + } + + private static boolean isNotKnownNonSecret(StringLiteral stringLiteral) { + return !SecretClassifier.isKnownNonSecret(stringLiteral.trimmedQuotesValue()); } private static boolean containsFormattedExpressions(StringLiteral stringLiteral) { diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/HardCodedCredentialsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/HardCodedCredentialsCheck.java index 35953466b..83b91c110 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/HardCodedCredentialsCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/HardCodedCredentialsCheck.java @@ -23,6 +23,7 @@ import java.util.Collection; import java.util.List; import java.util.Optional; +import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -57,6 +58,7 @@ import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; import org.sonar.python.tree.TreeUtils; +import org.sonarsource.analyzer.commons.appsec.SecretClassifier; @Rule(key = "S2068") public class HardCodedCredentialsCheck extends PythonSubscriptionCheck { @@ -187,8 +189,11 @@ private static void checkSensitiveArgument(CallExpression callExpression, int ar RegularArgument regularArgument = (RegularArgument) argument; if (regularArgument.keywordArgument() != null) { return; - } else if (i == argNb && regularArgument.expression().is(Kind.STRING_LITERAL) && !((StringLiteral) regularArgument.expression()).trimmedQuotesValue().isEmpty()) { - ctx.addIssue(regularArgument, "Review this potentially hard-coded credential."); + } else if (i == argNb && regularArgument.expression().is(Kind.STRING_LITERAL)) { + String value = ((StringLiteral) regularArgument.expression()).trimmedQuotesValue(); + if (!value.isEmpty() && !SecretClassifier.isKnownNonSecret(value)) { + ctx.addIssue(regularArgument, "Review this potentially hard-coded credential."); + } } } } @@ -211,10 +216,10 @@ private void handleStringLiteral(StringLiteral stringLiteral, SubscriptionContex return; } - String matchedCredential = matchedCredential(literalValue, literalPatterns()); - if (matchedCredential != null) { - ctx.addIssue(stringLiteral, String.format(MESSAGE, matchedCredential)); - } + firstMatchingPattern(literalValue, literalPatterns()) + .filter(matcher -> !SecretClassifier.isKnownNonSecret(extractValueAfterEquals(matcher.group()))) + .ifPresent(matcher -> ctx.addIssue(stringLiteral, String.format(MESSAGE, credentialNameFromPattern(matcher.pattern())))); + if (isURLWithCredentials(stringLiteral)) { ctx.addIssue(stringLiteral, "Review this hard-coded URL, which may contain a credential."); } @@ -270,7 +275,8 @@ private static boolean isURLWithCredentials(StringLiteral stringLiteral) { URL url = new URI(stringLiteral.trimmedQuotesValue()).toURL(); String userInfo = url.getUserInfo(); if (userInfo != null && userInfo.matches("\\S+:\\S+")) { - return true; + String password = userInfo.substring(userInfo.indexOf(':') + 1); + return !SecretClassifier.isKnownNonSecret(password); } } catch (URISyntaxException | MalformedURLException | IllegalArgumentException e) { return false; @@ -318,8 +324,13 @@ private String credentialSymbolName(@CheckForNull Symbol symbol) { } private boolean isSuspiciousStringLiteral(Tree tree) { - return tree.is(Kind.STRING_LITERAL) && !((StringLiteral) tree).trimmedQuotesValue().isEmpty() - && !isCredential(((StringLiteral) tree).trimmedQuotesValue(), variablePatterns()); + if (!tree.is(Kind.STRING_LITERAL)) { + return false; + } + String value = ((StringLiteral) tree).trimmedQuotesValue(); + return !value.isEmpty() + && !isCredential(value, variablePatterns()) + && !SecretClassifier.isKnownNonSecret(value); } private static boolean isSuspiciousEnvGetDefault(Expression expression, SubscriptionContext ctx) { @@ -336,6 +347,8 @@ private static boolean isSuspiciousEnvGetDefault(Expression expression, Subscrip return TreeUtils.nthArgumentOrKeywordOptional(1, "default", call.arguments()) .map(RegularArgument::expression) .filter(HardCodedCredentialsCheck::isNonEmptyStringLiteral) + .map(defaultExpr -> ((StringLiteral) defaultExpr).trimmedQuotesValue()) + .filter(value -> !SecretClassifier.isKnownNonSecret(value)) .isPresent(); } @@ -347,18 +360,28 @@ private static boolean isCredential(String target, Stream patterns) { return patterns.anyMatch(pattern -> pattern.matcher(target).find()); } + private static Optional firstMatchingPattern(String target, Stream patterns) { + return patterns.map(pattern -> pattern.matcher(target)) + .filter(Matcher::find) + .findFirst(); + } + private static String matchedCredential(String target, Stream patterns) { - Optional matched = patterns.filter(pattern -> pattern.matcher(target).find()).findFirst(); - if (matched.isPresent()) { - String matchedPattern = matched.get().pattern(); - int suffixStart = matchedPattern.indexOf('='); - if (suffixStart > 0) { - return matchedPattern.substring(0, suffixStart); - } else { - return matchedPattern; - } - } - return null; + return firstMatchingPattern(target, patterns) + .map(matcher -> credentialNameFromPattern(matcher.pattern())) + .orElse(null); + } + + private static String credentialNameFromPattern(Pattern pattern) { + String regex = pattern.pattern(); + int suffixStart = regex.indexOf('='); + return suffixStart > 0 ? regex.substring(0, suffixStart) : regex; + } + + // literalPatterns() matches e.g. "password=hunter2" inside a literal; the value is whatever follows the first '='. + private static String extractValueAfterEquals(String match) { + int eq = match.indexOf('='); + return eq >= 0 ? match.substring(eq + 1) : match; } private List toPatterns(String suffix) { diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/HardCodedCredentialsEntropyCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/HardCodedCredentialsEntropyCheck.java index 10b509d56..adbfacfb7 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/HardCodedCredentialsEntropyCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/HardCodedCredentialsEntropyCheck.java @@ -36,6 +36,7 @@ import org.sonar.plugins.python.api.tree.Tree; import org.sonar.python.checks.utils.Expressions; import org.sonarsource.analyzer.commons.ShannonEntropy; +import org.sonarsource.analyzer.commons.appsec.SecretClassifier; @Rule(key = "S6418") public class HardCodedCredentialsEntropyCheck extends PythonSubscriptionCheck { @@ -76,7 +77,7 @@ private void patternMatch(Name name, Tree location, String value, SubscriptionCo } private void patternMatch(String name, Tree location, String value, SubscriptionContext subscriptionContext) { - if (!valuePassesPostValidation(value) || !entropyShouldRaise(value)) { + if (!valuePassesPostValidation(value) || !entropyShouldRaise(value) || SecretClassifier.isKnownNonSecret(value)) { return; } patterns().stream() diff --git a/python-checks/src/test/resources/checks/flaskHardCodedJWTSecretKey.py b/python-checks/src/test/resources/checks/flaskHardCodedJWTSecretKey.py index 15a6bbf0f..f5c1ad5f2 100644 --- a/python-checks/src/test/resources/checks/flaskHardCodedJWTSecretKey.py +++ b/python-checks/src/test/resources/checks/flaskHardCodedJWTSecretKey.py @@ -4,13 +4,13 @@ def test_non_compliant_assignment_expressions(x): assigned_secret = 'hardcoded_secret' # Tests for "flask.app.Flask.config" - app.config['JWT_SECRET_KEY'] = 'secret' # Noncompliant {{Don't disclose "Flask" JWT secret keys.}} + app.config['JWT_SECRET_KEY'] = 'Azerty123' # Noncompliant {{Don't disclose "Flask" JWT secret keys.}} # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^> {{Assignment to sensitive property.}} -# ^^^^^^^^@-1 +# ^^^^^^^^^^^@-1 app.config['JWT_SECRET_KEY'] = assigned_secret # Noncompliant # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^> ^^^^^^^^^^^^^^^ - _ = app.config['JWT_SECRET_KEY'] = 'secret' # Noncompliant -# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^> ^^^^^^^^ + _ = app.config['JWT_SECRET_KEY'] = 'Azerty123' # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^> ^^^^^^^^^^^ # False negatives. app.config['JWT_SECRET_KEY'], _ = 'secret', x # FN: Should be extended to ExpressionList in the lhs containing more than one expression @@ -18,19 +18,19 @@ def test_non_compliant_assignment_expressions(x): # Tests for "flask.globals.current_app.config" - current_app.config['JWT_SECRET_KEY'] = 'secret' # Noncompliant {{Don't disclose "Flask" JWT secret keys.}} + current_app.config['JWT_SECRET_KEY'] = 'Azerty123' # Noncompliant {{Don't disclose "Flask" JWT secret keys.}} # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^> {{Assignment to sensitive property.}} -# ^^^^^^^^@-1 +# ^^^^^^^^^^^@-1 current_app.config['JWT_SECRET_KEY'] = assigned_secret # Noncompliant - _ = current_app.config['JWT_SECRET_KEY'] = 'secret' # Noncompliant + _ = current_app.config['JWT_SECRET_KEY'] = 'Azerty123' # Noncompliant # False negatives. current_app.config['JWT_SECRET_KEY'], _ = 'mysecret', x # FN current_app.config['JWT_SECRET_KEY'], _ = _, current_app.config['JWT_SECRET_KEY'] = 'secret', x # FN - current_app.config['JWT_SECRET_KEY'] = app.config['JWT_SECRET_KEY'] = 'secret' # Noncompliant -# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^> ^^^^^^^^ + current_app.config['JWT_SECRET_KEY'] = app.config['JWT_SECRET_KEY'] = 'Azerty123' # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^> ^^^^^^^^^^^ diff --git a/python-checks/src/test/resources/checks/flaskHardCodedSecretKey.py b/python-checks/src/test/resources/checks/flaskHardCodedSecretKey.py index 48a75fab6..f95ff98fd 100644 --- a/python-checks/src/test/resources/checks/flaskHardCodedSecretKey.py +++ b/python-checks/src/test/resources/checks/flaskHardCodedSecretKey.py @@ -4,13 +4,13 @@ def test_non_compliant_assignment_expressions(x): assigned_secret = 'hardcoded_secret' # Tests for "flask.app.Flask.config" - app.config['SECRET_KEY'] = 'secret' # Noncompliant {{Don't disclose "Flask" secret keys.}} + app.config['SECRET_KEY'] = 'Azerty123' # Noncompliant {{Don't disclose "Flask" secret keys.}} # ^^^^^^^^^^^^^^^^^^^^^^^^> {{Assignment to sensitive property.}} -# ^^^^^^^^@-1 +# ^^^^^^^^^^^@-1 app.config['SECRET_KEY'] = assigned_secret # Noncompliant # ^^^^^^^^^^^^^^^^^^^^^^^^> ^^^^^^^^^^^^^^^ - _ = app.config['SECRET_KEY'] = 'secret' # Noncompliant -# ^^^^^^^^^^^^^^^^^^^^^^^^> ^^^^^^^^ + _ = app.config['SECRET_KEY'] = 'Azerty123' # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^^^^^> ^^^^^^^^^^^ # False negatives. app.config['SECRET_KEY'], _ = 'secret', x # FN: Should be extended to ExpressionList in the lhs containing more than one expression @@ -18,9 +18,9 @@ def test_non_compliant_assignment_expressions(x): # Tests for "flask.app.Flask.secret_key" - app.secret_key = 'secret' # Noncompliant {{Don't disclose "Flask" secret keys.}} + app.secret_key = 'Azerty123' # Noncompliant {{Don't disclose "Flask" secret keys.}} # ^^^^^^^^^^^^^^> {{Assignment to sensitive property.}} -# ^^^^^^^^@-1 +# ^^^^^^^^^^^@-1 app.secret_key = assigned_secret # Noncompliant _ = app.secret_key = 'mysecret' # Noncompliant @@ -30,11 +30,11 @@ def test_non_compliant_assignment_expressions(x): # Tests for "flask.globals.current_app.config" - current_app.config['SECRET_KEY'] = 'secret' # Noncompliant {{Don't disclose "Flask" secret keys.}} + current_app.config['SECRET_KEY'] = 'Azerty123' # Noncompliant {{Don't disclose "Flask" secret keys.}} # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^> {{Assignment to sensitive property.}} -# ^^^^^^^^@-1 +# ^^^^^^^^^^^@-1 current_app.config['SECRET_KEY'] = assigned_secret # Noncompliant - _ = current_app.config['SECRET_KEY'] = 'secret' # Noncompliant + _ = current_app.config['SECRET_KEY'] = 'Azerty123' # Noncompliant # False negatives. current_app.config['SECRET_KEY'], _ = 'mysecret', x # FN @@ -42,9 +42,9 @@ def test_non_compliant_assignment_expressions(x): # Tests for "flask.globals.current_app.secret_key" - current_app.secret_key = 'secret' # Noncompliant {{Don't disclose "Flask" secret keys.}} + current_app.secret_key = 'Azerty123' # Noncompliant {{Don't disclose "Flask" secret keys.}} # ^^^^^^^^^^^^^^^^^^^^^^> {{Assignment to sensitive property.}} -# ^^^^^^^^@-1 +# ^^^^^^^^^^^@-1 current_app.secret_key = assigned_secret # Noncompliant _ = current_app.secret_key = 'mysecret' # Noncompliant @@ -52,8 +52,8 @@ def test_non_compliant_assignment_expressions(x): current_app.secret_key, _ = assigned_secret, x # FN current_app.secret_key, _ = _, current_app.secret_key = 'secret', x # FN - current_app.config['SECRET_KEY'] = app.config['SECRET_KEY'] = 'secret' # Noncompliant -# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^> ^^^^^^^^^^^^^^^^^^^^^^^^> ^^^^^^^^ + current_app.config['SECRET_KEY'] = app.config['SECRET_KEY'] = 'Azerty123' # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^> ^^^^^^^^^^^^^^^^^^^^^^^^> ^^^^^^^^^^^ some_secret = assigned_secret some_secret1 = some_secret some_secret2 = some_secret1 diff --git a/python-checks/src/test/resources/checks/hardCodedCredentials.py b/python-checks/src/test/resources/checks/hardCodedCredentials.py index fcc61cb45..b6d40dc59 100644 --- a/python-checks/src/test/resources/checks/hardCodedCredentials.py +++ b/python-checks/src/test/resources/checks/hardCodedCredentials.py @@ -87,7 +87,7 @@ def a(self,pwd="azerty123", other=None): # Noncompliant {{"pwd" detected here, password = u'azerty123' # Noncompliant password = f"azerty123" # Noncompliant password = b"azerty123" # Noncompliant - password = "?" # Noncompliant + password = "Xk28vQ91" # Noncompliant variableNameWithPasswordInIt = 'azerty123' # Noncompliant variableNameWithPassphraseInIt = 'azerty123' # Noncompliant variableNameWithPasswdInIt ='azerty123' # Noncompliant @@ -139,10 +139,10 @@ def db(self, pwd): mysql.connector.connection.MySQLConnection(host='localhost', user='root', "") # OK pymysql.connect(host='localhost', user='root', password='Azerty123') # Noncompliant - pymysql.connect('localhost', 'root', 'password') # Noncompliant {{Review this potentially hard-coded credential.}} -# ^^^^^^^^^^ + pymysql.connect('localhost', 'root', 'Azerty123') # Noncompliant {{Review this potentially hard-coded credential.}} +# ^^^^^^^^^^^ pymysql.connections.Connection(host='localhost', user='root', password='password') # OK (avoid FPs) - pymysql.connections.Connection('localhost', 'root', 'password') # Noncompliant + pymysql.connections.Connection('localhost', 'root', 'Azerty123') # Noncompliant pymysql.connect(host='localhost', user='root', password=pwd) # OK pymysql.connect('localhost', 'root', pwd) # OK pymysql.connections.Connection(host='localhost', user='root', password=pwd) # OK @@ -156,24 +156,24 @@ def db(self, pwd): psycopg2.connect(host='localhost', user='postgres', password=pwd,) # OK pgdb.connect(host='localhost', user='postgres', password='Azerty123') # Noncompliant - pgdb.connect('localhost', 'postgres', 'password') # Noncompliant + pgdb.connect('localhost', 'postgres', 'Azerty123') # Noncompliant pgdb.connect(host='localhost', user='postgres', password=pwd) # OK pgdb.connect('localhost', 'postgres', pwd) # OK pg.DB(host='localhost', user='postgres', passwd='Azerty123') # Noncompliant - pg.DB(None, 'localhost', 5432, None, 'postgres', 'password') # Noncompliant + pg.DB(None, 'localhost', 5432, None, 'postgres', 'Azerty123') # Noncompliant pg.DB(host='localhost', user='postgres', passwd=pwd) # OK pg.DB(None, 'localhost', 5432, None, 'postgres', pwd) # OK pg.connect(host='localhost', user='postgres', passwd='Azerty123') # Noncompliant - pg.connect(None, 'localhost', 5432, None, 'postgres', 'password') # Noncompliant + pg.connect(None, 'localhost', 5432, None, 'postgres', 'Azerty123') # Noncompliant pg.connect(host='localhost', user='postgres', passwd=pwd) # OK pg.connect(None, 'localhost', 5432, None, 'postgres', pwd) # OK pg.connect(host='localhost', user='postgres', passwd='') # Compliant pg.connect(None, 'localhost', 5432, None, 'postgres', '') # Compliant random.call(None, password = 42) # OK - random.call(None, password = "hello") # Noncompliant + random.call(None, password = "Azerty123") # Noncompliant random.call(None, password = "") # OK pg.connect(*unpack, 'localhost', 5432, None, 'postgres', pwd) # OK @@ -186,7 +186,7 @@ def somePassword(self, password=42): # OK pass def somePassword(self, password=""): # OK pass - def somePassword(self, *, password="hello"): # Noncompliant + def somePassword(self, *, password="Azerty123"): # Noncompliant pass instance = A() @@ -235,3 +235,11 @@ def test_flask(): app.config["SECURITY_PASSWORD_HASH"] = "sha512_crypt" # Compliant a, app.config["SECRET_KEY"] = "foo", "foo" # Noncompliant app.config["SECURITY_PASSWORD_HASH"], app.config["SECRET_KEY"] = "foo", "foo" # Noncompliant + +def test_secret_classifier(): + # Values recognized by SecretClassifier as known non-secrets don't raise, even though the name matches. + password = "changeme" # Compliant, well-known placeholder secret + password = "Xk28" # Compliant, too short to be a real secret + password = "${SECRET_KEY}" # Compliant, variable interpolation + password = "op://vault/secret" # Compliant, external secret store reference + password = "{cipher}1e3faa2cdab2deae117dca102e52922a" # Compliant, encrypted marker diff --git a/python-checks/src/test/resources/checks/hardCodedCredentialsCustom.py b/python-checks/src/test/resources/checks/hardCodedCredentialsCustom.py index 0f31b33df..74140fd88 100644 --- a/python-checks/src/test/resources/checks/hardCodedCredentialsCustom.py +++ b/python-checks/src/test/resources/checks/hardCodedCredentialsCustom.py @@ -1,4 +1,4 @@ -watermelon = "Qwerty123" # Noncompliant {{"watermelon" detected here, review this potentially hard-coded credential.}} +watermelon = "Zx91Kdfg" # Noncompliant {{"watermelon" detected here, review this potentially hard-coded credential.}} pomelo = "Azerty123" # Noncompliant {{"pomelo" detected here, review this potentially hard-coded credential.}} password = "toto" # OK diff --git a/python-checks/src/test/resources/checks/hardcodedCredentialsCall.py b/python-checks/src/test/resources/checks/hardcodedCredentialsCall.py index 8892a1652..befb38234 100644 --- a/python-checks/src/test/resources/checks/hardcodedCredentialsCall.py +++ b/python-checks/src/test/resources/checks/hardcodedCredentialsCall.py @@ -24,27 +24,27 @@ def obj_creation_hardcoded_credentials_named_arguments(): username="username", password_hash="password_hash") # Noncompliant - temp_user = test_connection.TempUser(password="password") # Noncompliant + temp_user = test_connection.TempUser(password="Azerty123") # Noncompliant def obj_creation_hardcoded_assigned_value(password): temp_user = test_connection.TempUser(password=password) temp_user = test_connection.TempUser(password=foo()) - api_key = "abc" -# ^^^^^> 1 {{Revoke and change this password, as it is compromised.}} + api_key = "Azerty123" +# ^^^^^^^^^^^> 1 {{Revoke and change this password, as it is compromised.}} network = pylast.LibreFMNetwork(api_key=api_key) # Noncompliant # ^^^^^^^^^^^^^^^ 1 - value = "abcd" -# ^^^^^^> 1 {{Revoke and change this password, as it is compromised.}} + value = "Azerty123" +# ^^^^^^^^^^^> 1 {{Revoke and change this password, as it is compromised.}} api_secret = value network = pylast.LibreFMNetwork(api_secret=api_secret) # Noncompliant # ^^^^^^^^^^^^^^^^^^^^^ 1 def top_level_function_call(): - psycopg2cffi.connect(password="abc") # Noncompliant + psycopg2cffi.connect(password="Azerty123") # Noncompliant # Methods manually defined in "manual_hardcoded_credentials_call_check_meta.json" @@ -58,22 +58,22 @@ def top_level_function_call(): import boto3 def manually_defined_method_calls_with_named_params(): - psycopg.connect(password="abc") # Noncompliant - psycopg2.connect(password="abc") # Noncompliant - mysql.connector.connect(password='abc') # Noncompliant - mysql.connector.connect(passwd='abc') # Noncompliant - mysql.connector.connect(password1='abc', password2='abc', password3='abc') # Noncompliant 3 - MySQLConnection(password='abc') # Noncompliant - MySQLConnection(passwd='abc') # Noncompliant - MySQLConnection(password1='abc', password2='abc', password3='abc') # Noncompliant 3 - pymysql.connect(password="abc") # Noncompliant - pymysql.connect(passwd="abc") # Noncompliant - r.Redis(password="abc") # Noncompliant - MongoClient(password="abc") # Noncompliant - boto3.resource(aws_secret_access_key="abc") # Noncompliant + psycopg.connect(password="Azerty123") # Noncompliant + psycopg2.connect(password="Azerty123") # Noncompliant + mysql.connector.connect(password='Azerty123') # Noncompliant + mysql.connector.connect(passwd='Azerty123') # Noncompliant + mysql.connector.connect(password1='Azerty123', password2='Azerty123', password3='Azerty123') # Noncompliant 3 + MySQLConnection(password='Azerty123') # Noncompliant + MySQLConnection(passwd='Azerty123') # Noncompliant + MySQLConnection(password1='Azerty123', password2='Azerty123', password3='Azerty123') # Noncompliant 3 + pymysql.connect(password="Azerty123") # Noncompliant + pymysql.connect(passwd="Azerty123") # Noncompliant + r.Redis(password="Azerty123") # Noncompliant + MongoClient(password="Azerty123") # Noncompliant + boto3.resource(aws_secret_access_key="Azerty123") # Noncompliant def manually_defined_method_calls_with_positional_params(): - r.Redis("host", "port", "db", "password") # Noncompliant + r.Redis("host", "port", "db", "Azerty123") # Noncompliant # The following calls are compliant because the password can't be a positional parameter psycopg.connect("abc") psycopg2.connect("abc") @@ -119,10 +119,10 @@ def db_connect(pwd, PASS): mysql.connector.connection.MySQLConnection(host='localhost', user='sonarsource', password='') pymysql.connect(host='localhost', user='sonarsource', password='') - pymysql.connections.Connection(host='localhost', user='sonarsource', password='abc') # Noncompliant + pymysql.connections.Connection(host='localhost', user='sonarsource', password='Azerty123') # Noncompliant pymysql.connections.Connection(host='localhost', user='sonarsource', password=f'{PASS}') # Compliant pymysql.connections.Connection(host='localhost', user='sonarsource', password=f'') # Compliant - pymysql.connections.Connection(host='localhost', user='sonarsource', password=f'pass') # Noncompliant + pymysql.connections.Connection(host='localhost', user='sonarsource', password=f'Azerty123') # Noncompliant psycopg2.connect(host='localhost', user='postgres', password='') pgdb.connect(host='localhost', user='postgres', password='') @@ -132,8 +132,8 @@ def db_connect(pwd, PASS): def byte_decode_hardcoded_value(): - apiKey = b"abc".decode("utf-8") -# ^^^^^^> 1 {{Revoke and change this password, as it is compromised.}} + apiKey = b"Azerty123".decode("utf-8") +# ^^^^^^^^^^^^> 1 {{Revoke and change this password, as it is compromised.}} network = pylast.LibreFMNetwork(api_key = apiKey) # Noncompliant {{Revoke and change this password, as it is compromised.}} # ^^^^^^^^^^^^^^^^ 1 @@ -152,4 +152,4 @@ def oauth2_session(): oauth.fetch_token( 'https://api.example.com/o/oauth2/token', - client_secret='example_Password') # Noncompliant + client_secret='Azerty123') # Noncompliant From 056175be3a24aa60312ffd00d902c6a42e265c15 Mon Sep 17 00:00:00 2001 From: rombirli Date: Thu, 2 Jul 2026 15:07:36 +0200 Subject: [PATCH 169/322] SONARPY-4337 Introduce new `TEST` scope for sonar-python analyzer Inline cached token setup in sensor test GitOrigin-RevId: f609d326c22e3fcb7339ce12210eaa0f69cd3b85 --- .../sonar/plugins/python/PythonScanner.java | 6 +- .../plugins/python/PythonSensorTest.java | 92 ++++++++++++++++++- .../plugins/python/sensor/empty_test_case.py | 6 ++ .../sonar/plugins/python/api/PythonCheck.java | 1 + 4 files changed, 102 insertions(+), 3 deletions(-) create mode 100644 python-commons/src/test/resources/org/sonar/plugins/python/sensor/empty_test_case.py diff --git a/python-commons/src/main/java/org/sonar/plugins/python/PythonScanner.java b/python-commons/src/main/java/org/sonar/plugins/python/PythonScanner.java index 54d25a1d2..53f09f985 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/PythonScanner.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/PythonScanner.java @@ -392,7 +392,11 @@ private void maybeEmitHeuristicWarning() { } boolean isCheckNotApplicable(PythonCheck pythonCheck, InputFile.Type fileType) { - return fileType != InputFile.Type.MAIN && pythonCheck.scope() != PythonCheck.CheckScope.ALL; + return switch (pythonCheck.scope()) { + case MAIN -> fileType != InputFile.Type.MAIN; + case TESTS -> fileType != InputFile.Type.TEST; + case ALL -> false; + }; } // visible for testing diff --git a/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java index df3e517c0..c9d38cffc 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java @@ -764,6 +764,96 @@ void test_failFast_not_triggered_on_test_files() { assertThat(context.allIssues()).isEmpty(); } + @Test + void test_cases_should_contain_tests_runs_on_test_files() { + activeRules = new ActiveRulesBuilder() + .addRule(new NewActiveRule.Builder() + .setRuleKey(RuleKey.of(PythonRuleRepository.REPOSITORY_KEY, "S2187")) + .build()) + .build(); + + context.setSettings(new MapSettings().setProperty("sonar.tests", "tests")); + PythonInputFile inputFile = inputFile("empty_test_case.py", Type.TEST); + + sensor().execute(context); + + assertThat(context.allIssues()).hasSize(1); + Issue issue = context.allIssues().iterator().next(); + assertThat(issue.primaryLocation().inputComponent()).isEqualTo(inputFile.wrappedFile()); + assertThat(issue.ruleKey().rule()).isEqualTo("S2187"); + } + + @Test + void test_cases_should_contain_tests_skips_main_files() { + activeRules = new ActiveRulesBuilder() + .addRule(new NewActiveRule.Builder() + .setRuleKey(RuleKey.of(PythonRuleRepository.REPOSITORY_KEY, "S2187")) + .build()) + .build(); + + context.setSettings(new MapSettings().setProperty("sonar.tests", "tests")); + inputFile("empty_test_case.py", Type.MAIN); + + sensor().execute(context); + + assertThat(context.allIssues()).isEmpty(); + } + + @Test + void test_cases_should_contain_tests_skips_main_files_named_like_tests_when_sonar_tests_is_configured() { + activeRules = new ActiveRulesBuilder() + .addRule(new NewActiveRule.Builder() + .setRuleKey(RuleKey.of(PythonRuleRepository.REPOSITORY_KEY, "S2187")) + .build()) + .build(); + + context.setSettings(new MapSettings().setProperty("sonar.tests", "tests")); + inputFile("test_paths_loader.py", Type.MAIN); + + sensor().execute(context); + + assertThat(context.allIssues()).isEmpty(); + verify(analysisWarning, never()).addUnique(PythonScanner.UNSET_SONAR_TESTS_WARNING); + } + + @Test + void test_cases_should_contain_tests_runs_on_test_files_named_like_tests_when_sonar_tests_is_configured() { + activeRules = new ActiveRulesBuilder() + .addRule(new NewActiveRule.Builder() + .setRuleKey(RuleKey.of(PythonRuleRepository.REPOSITORY_KEY, "S2187")) + .build()) + .build(); + + context.setSettings(new MapSettings().setProperty("sonar.tests", "tests")); + PythonInputFile inputFile = inputFile("test_paths_loader.py", Type.TEST); + + sensor().execute(context); + + assertThat(context.allIssues()).hasSize(1); + Issue issue = context.allIssues().iterator().next(); + assertThat(issue.primaryLocation().inputComponent()).isEqualTo(inputFile.wrappedFile()); + assertThat(issue.ruleKey().rule()).isEqualTo("S2187"); + } + + @Test + void test_cases_should_contain_tests_runs_on_main_files_named_like_tests_when_sonar_tests_is_not_configured() { + activeRules = new ActiveRulesBuilder() + .addRule(new NewActiveRule.Builder() + .setRuleKey(RuleKey.of(PythonRuleRepository.REPOSITORY_KEY, "S2187")) + .build()) + .build(); + + PythonInputFile inputFile = inputFile("test_paths_loader.py", Type.MAIN); + + sensor().execute(context); + + assertThat(context.allIssues()).hasSize(1); + Issue issue = context.allIssues().iterator().next(); + assertThat(issue.primaryLocation().inputComponent()).isEqualTo(inputFile.wrappedFile()); + assertThat(issue.ruleKey().rule()).isEqualTo("S2187"); + verify(analysisWarning).addUnique(PythonScanner.UNSET_SONAR_TESTS_WARNING); + } + @Test void test_test_file_highlighting() { activeRules = new ActiveRulesBuilder().build(); @@ -1592,8 +1682,6 @@ void read_cpd_tokens_from_cache_corrupted_format() throws IOException { .build(); PythonInputFile inputFile = inputFile("pass.py", Type.MAIN, InputFile.Status.SAME); - var sslrToken = passToken(inputFile.wrappedFile().uri()); - List tokens = List.of(new TokenImpl(sslrToken)); TestReadCache readCache = getValidReadCache(); diff --git a/python-commons/src/test/resources/org/sonar/plugins/python/sensor/empty_test_case.py b/python-commons/src/test/resources/org/sonar/plugins/python/sensor/empty_test_case.py new file mode 100644 index 000000000..b1c6998ec --- /dev/null +++ b/python-commons/src/test/resources/org/sonar/plugins/python/sensor/empty_test_case.py @@ -0,0 +1,6 @@ +import unittest + + +class EmptyTestCase(unittest.TestCase): + def helper(self): + return 42 diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonCheck.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonCheck.java index 55fbe81b0..4f2b6c962 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonCheck.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonCheck.java @@ -97,6 +97,7 @@ public PythonCheck check() { enum CheckScope { MAIN, + TESTS, ALL } From d3ac178d0caee08755ab6c20453666bfe76185fb Mon Sep 17 00:00:00 2001 From: rombirli Date: Wed, 1 Jul 2026 17:08:50 +0200 Subject: [PATCH 170/322] SONARPY-4338 Refactor & refine heuristics to detect test files/classes Move unittest helpers into checks utils Fix skipTest whitelist typo Recognize pytest xunit lifecycle hooks GitOrigin-RevId: 5458405a60b5af77672d07e8843c9f005eda1d63 --- .../checks/tests/AssertAfterRaiseCheck.java | 2 +- .../tests/AssertOnDissimilarTypesCheck.java | 2 +- .../checks/tests/DedicatedAssertionCheck.java | 2 +- .../GroupSimilarTestsParameterizedCheck.java | 2 +- .../tests/ImplicitlySkippedTestCheck.java | 2 +- .../tests/NotDiscoverableTestMethodCheck.java | 2 +- ...SingleInvocationRuntimeExceptionCheck.java | 2 +- .../SpecificExceptionAssertionCheck.java | 42 +-- .../TestCasesShouldContainTestsCheck.java | 28 +- .../python/checks/utils/UnittestUtils.java | 207 +++++++++++ .../checks/utils/UnittestUtilsTest.java | 324 ++++++++++++++++++ .../tests/testCasesShouldContainTests_test.py | 80 ++++- .../python/sensor/test_paths_loader.py | 2 + .../org/sonar/python/tests/UnittestUtils.java | 83 ----- .../sonar/python/tests/UnittestUtilsTest.java | 73 ---- 15 files changed, 636 insertions(+), 217 deletions(-) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/utils/UnittestUtils.java create mode 100644 python-checks/src/test/java/org/sonar/python/checks/utils/UnittestUtilsTest.java create mode 100644 python-commons/src/test/resources/org/sonar/plugins/python/sensor/test_paths_loader.py delete mode 100644 python-frontend/src/main/java/org/sonar/python/tests/UnittestUtils.java delete mode 100644 python-frontend/src/test/java/org/sonar/python/tests/UnittestUtilsTest.java diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/AssertAfterRaiseCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/AssertAfterRaiseCheck.java index dde868f2b..0bb6089c0 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/AssertAfterRaiseCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/AssertAfterRaiseCheck.java @@ -34,7 +34,7 @@ import org.sonar.plugins.python.api.quickfix.PythonQuickFix; import org.sonar.plugins.python.api.quickfix.PythonTextEdit; import org.sonar.python.quickfix.TextEditUtils; -import org.sonar.python.tests.UnittestUtils; +import org.sonar.python.checks.utils.UnittestUtils; import org.sonar.python.tree.TreeUtils; @Rule(key = "S5915") diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/AssertOnDissimilarTypesCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/AssertOnDissimilarTypesCheck.java index 73db1c777..061b3c1e9 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/AssertOnDissimilarTypesCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/AssertOnDissimilarTypesCheck.java @@ -35,7 +35,7 @@ import org.sonar.plugins.python.api.tree.RegularArgument; import org.sonar.plugins.python.api.tree.Tree; import org.sonar.plugins.python.api.types.InferredType; -import org.sonar.python.tests.UnittestUtils; +import org.sonar.python.checks.utils.UnittestUtils; import org.sonar.python.tree.TreeUtils; import org.sonar.python.types.InferredTypes; diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/DedicatedAssertionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/DedicatedAssertionCheck.java index 3881cf849..952592f65 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/DedicatedAssertionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/DedicatedAssertionCheck.java @@ -33,7 +33,7 @@ import org.sonar.plugins.python.api.tree.RegularArgument; import org.sonar.plugins.python.api.tree.Tree; import org.sonar.python.checks.utils.Expressions; -import org.sonar.python.tests.UnittestUtils; +import org.sonar.python.checks.utils.UnittestUtils; import org.sonar.python.tree.TreeUtils; diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/GroupSimilarTestsParameterizedCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/GroupSimilarTestsParameterizedCheck.java index a49d00143..0e90205bb 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/GroupSimilarTestsParameterizedCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/GroupSimilarTestsParameterizedCheck.java @@ -35,7 +35,7 @@ import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; import org.sonar.python.checks.utils.CheckUtils; -import org.sonar.python.tests.UnittestUtils; +import org.sonar.python.checks.utils.UnittestUtils; import org.sonar.python.tree.TreeUtils; import javax.annotation.Nullable; diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/ImplicitlySkippedTestCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/ImplicitlySkippedTestCheck.java index beb377736..1b2298a3d 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/ImplicitlySkippedTestCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/ImplicitlySkippedTestCheck.java @@ -35,7 +35,7 @@ import org.sonar.plugins.python.api.tree.ReturnStatement; import org.sonar.plugins.python.api.tree.Statement; import org.sonar.plugins.python.api.tree.Tree; -import org.sonar.python.tests.UnittestUtils; +import org.sonar.python.checks.utils.UnittestUtils; @Rule(key = "S5918") public class ImplicitlySkippedTestCheck extends PythonSubscriptionCheck { diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/NotDiscoverableTestMethodCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/NotDiscoverableTestMethodCheck.java index bfbbae3e9..5451fdf8f 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/NotDiscoverableTestMethodCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/NotDiscoverableTestMethodCheck.java @@ -35,7 +35,7 @@ import org.sonar.plugins.python.api.tree.FunctionDef; import org.sonar.plugins.python.api.tree.Statement; import org.sonar.plugins.python.api.tree.Tree; -import org.sonar.python.tests.UnittestUtils; +import org.sonar.python.checks.utils.UnittestUtils; import org.sonar.python.tree.TreeUtils; @Rule(key = "S5899") diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheck.java index d99839c52..571d97db7 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheck.java @@ -38,7 +38,7 @@ import org.sonar.plugins.python.api.tree.Tree; import org.sonar.plugins.python.api.tree.WithItem; import org.sonar.plugins.python.api.tree.WithStatement; -import org.sonar.python.tests.UnittestUtils; +import org.sonar.python.checks.utils.UnittestUtils; @Rule(key = "S5778") public class SingleInvocationRuntimeExceptionCheck extends PythonSubscriptionCheck { diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/SpecificExceptionAssertionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/SpecificExceptionAssertionCheck.java index 7351d79a1..f55828361 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/SpecificExceptionAssertionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/SpecificExceptionAssertionCheck.java @@ -28,7 +28,7 @@ import org.sonar.plugins.python.api.tree.WithStatement; import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; -import org.sonar.python.tree.TreeUtils; +import org.sonar.python.checks.utils.UnittestUtils; import static org.sonar.plugins.python.api.types.BuiltinTypes.BASE_EXCEPTION; import static org.sonar.plugins.python.api.types.BuiltinTypes.EXCEPTION; @@ -36,20 +36,6 @@ @Rule(key = "S5958") public class SpecificExceptionAssertionCheck extends PythonSubscriptionCheck { private static final String MESSAGE = "Specify a more specific exception type here."; - private static final String UNITTEST_TEST_CASE_FQN_PREFIX = "unittest.case.TestCase."; - private static final String PYTEST_EXPECTED_EXCEPTION = "expected_exception"; - private static final String PYTEST_MATCH = "match"; - private static final String UNITTEST_EXCEPTION = "exception"; - private static final TypeMatcher PYTEST_RAISES_MATCHER = TypeMatchers.withFQN("pytest.raises"); - private static final TypeMatcher UNITTEST_ASSERT_RAISES_MATCHER = TypeMatchers.any( - TypeMatchers.withFQN(UNITTEST_TEST_CASE_FQN_PREFIX + "assertRaises"), - TypeMatchers.withFQN(UNITTEST_TEST_CASE_FQN_PREFIX + "assertRaisesRegex"), - TypeMatchers.withFQN(UNITTEST_TEST_CASE_FQN_PREFIX + "assertRaisesRegexp") - ); - private static final TypeMatcher UNITTEST_ASSERT_RAISES_WITH_MESSAGE_CHECK_MATCHER = TypeMatchers.any( - TypeMatchers.withFQN(UNITTEST_TEST_CASE_FQN_PREFIX + "assertRaisesRegex"), - TypeMatchers.withFQN(UNITTEST_TEST_CASE_FQN_PREFIX + "assertRaisesRegexp") - ); private static final TypeMatcher GENERIC_EXCEPTION_MATCHER = TypeMatchers.any( TypeMatchers.isObjectOfType(EXCEPTION), TypeMatchers.isObjectOfType(BASE_EXCEPTION), @@ -65,7 +51,7 @@ public void initialize(Context context) { @Override public CheckScope scope() { - return CheckScope.ALL; + return CheckScope.TESTS; } private static void checkWithStatement(SubscriptionContext ctx, WithStatement withStatement) { @@ -93,32 +79,20 @@ private static void checkCallExpression(SubscriptionContext ctx, CallExpression @Nullable private static Expression genericExceptionArgument(CallExpression callExpression, SubscriptionContext ctx) { RegularArgument exceptionArgument = null; - if (PYTEST_RAISES_MATCHER.isTrueFor(callExpression.callee(), ctx)) { - if (hasPytestMessageCheck(callExpression)) { + if (UnittestUtils.isPytestRaises(callExpression, ctx)) { + if (UnittestUtils.hasPytestRaisesMatchArgument(callExpression)) { return null; } - exceptionArgument = TreeUtils.nthArgumentOrKeyword(0, PYTEST_EXPECTED_EXCEPTION, callExpression.arguments()); - } else if (isUnittestAssertRaises(callExpression, ctx)) { - if (hasUnittestMessageCheck(callExpression, ctx)) { + exceptionArgument = UnittestUtils.pytestExpectedExceptionArgument(callExpression); + } else if (UnittestUtils.isUnittestAssertRaises(callExpression, ctx)) { + if (UnittestUtils.hasUnittestAssertRaisesMessageCheck(callExpression, ctx)) { return null; } - exceptionArgument = TreeUtils.nthArgumentOrKeyword(0, UNITTEST_EXCEPTION, callExpression.arguments()); + exceptionArgument = UnittestUtils.unittestExceptionArgument(callExpression); } if (exceptionArgument == null || !GENERIC_EXCEPTION_MATCHER.isTrueFor(exceptionArgument.expression(), ctx)) { return null; } return exceptionArgument.expression(); } - - private static boolean hasPytestMessageCheck(CallExpression callExpression) { - return TreeUtils.argumentByKeyword(PYTEST_MATCH, callExpression.arguments()) != null; - } - - private static boolean hasUnittestMessageCheck(CallExpression callExpression, SubscriptionContext ctx) { - return UNITTEST_ASSERT_RAISES_WITH_MESSAGE_CHECK_MATCHER.isTrueFor(callExpression.callee(), ctx); - } - - private static boolean isUnittestAssertRaises(CallExpression callExpression, SubscriptionContext ctx) { - return UNITTEST_ASSERT_RAISES_MATCHER.isTrueFor(callExpression.callee(), ctx); - } } diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/TestCasesShouldContainTestsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/TestCasesShouldContainTestsCheck.java index fc5c09ded..2415cfeb8 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/TestCasesShouldContainTestsCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/TestCasesShouldContainTestsCheck.java @@ -37,6 +37,7 @@ import org.sonar.plugins.python.api.tree.Tree; import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.checks.utils.UnittestUtils; import static java.util.function.Predicate.not; import static org.sonar.python.tree.TreeUtils.getClassSymbolFromDef; @@ -45,9 +46,6 @@ public class TestCasesShouldContainTestsCheck extends PythonSubscriptionCheck { private static final String CLASS_MESSAGE = "Add some tests to this class."; private static final String FILE_MESSAGE = "Add some tests to this file."; - private static final TypeMatcher UNITTEST_TEST_CASE_MATCHER = TypeMatchers.any( - TypeMatchers.isOrExtendsType("unittest.TestCase"), - TypeMatchers.isOrExtendsType("unittest.case.TestCase")); private static final TypeMatcher ABSTRACT_BASE_CLASS_MATCHER = TypeMatchers.isOrExtendsType("abc.ABC"); private static final TypeMatcher NOT_IMPLEMENTED_ERROR_MATCHER = TypeMatchers.any( TypeMatchers.isType("builtins.NotImplementedError"), @@ -65,7 +63,7 @@ private static void checkFileInput(SubscriptionContext ctx) { return; } - boolean pytestStyleFile = isPytestStyleFile(ctx); + boolean pytestStyleFile = UnittestUtils.isPytestFileName(ctx.pythonFile().fileName()); List candidateClasses = collectCandidateClasses(ctx, statements, pytestStyleFile); boolean hasCollectedTests = hasModuleLevelPytestTests(statements) || hasClassLevelTests(statements); @@ -97,7 +95,7 @@ private static boolean hasModuleLevelPytestTests(StatementList statements) { return statements.statements().stream() .filter(FunctionDef.class::isInstance) .map(FunctionDef.class::cast) - .anyMatch(TestCasesShouldContainTestsCheck::isTestMethod); + .anyMatch(TestCasesShouldContainTestsCheck::isCollectedTestMethod); } private static boolean hasClassLevelTests(StatementList statements) { @@ -108,16 +106,8 @@ private static boolean hasClassLevelTests(StatementList statements) { } private static boolean isCandidateTestClass(SubscriptionContext ctx, ClassDef classDef, boolean pytestStyleFile) { - return (pytestStyleFile && classDef.name().name().startsWith("Test")) || isUnittestTestCaseClass(classDef, ctx); - } - - private static boolean isPytestStyleFile(SubscriptionContext ctx) { - String fileName = ctx.pythonFile().fileName(); - return fileName.startsWith("test_") || fileName.endsWith("_test.py"); - } - - private static boolean isUnittestTestCaseClass(ClassDef classDef, SubscriptionContext ctx) { - return hasAncestorMatching(classDef, UNITTEST_TEST_CASE_MATCHER, ctx); + return (pytestStyleFile && UnittestUtils.isPytestStyleTestClass(classDef, ctx.pythonFile().fileName())) + || UnittestUtils.isUnittestTestCaseClass(classDef); } private static boolean hasCollectedTests(ClassDef classDef) { @@ -128,7 +118,7 @@ private static boolean hasLocalTestMethod(ClassDef classDef) { return classDef.body().statements().stream() .filter(FunctionDef.class::isInstance) .map(FunctionDef.class::cast) - .anyMatch(TestCasesShouldContainTestsCheck::isTestMethod); + .anyMatch(TestCasesShouldContainTestsCheck::isCollectedTestMethod); } private static boolean hasInheritedTestMethod(ClassDef classDef) { @@ -224,12 +214,12 @@ private static boolean isNotImplementedError(Expression expression, Subscription return NOT_IMPLEMENTED_ERROR_MATCHER.isTrueFor(expression, ctx); } - private static boolean isTestMethod(FunctionDef functionDef) { - return isTestMethodName(functionDef.name().name()); + private static boolean isCollectedTestMethod(FunctionDef functionDef) { + return UnittestUtils.isTestMethodName(functionDef.name().name()); } private static boolean isTestMethodName(String name) { - return name.startsWith("test"); + return UnittestUtils.isTestMethodName(name); } private record CandidateClass(ClassDef classDef, @Nullable ClassSymbol classSymbol, boolean hasCollectedTests) { diff --git a/python-checks/src/main/java/org/sonar/python/checks/utils/UnittestUtils.java b/python-checks/src/main/java/org/sonar/python/checks/utils/UnittestUtils.java new file mode 100644 index 000000000..4a3c97475 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/utils/UnittestUtils.java @@ -0,0 +1,207 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.utils; + +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; +import javax.annotation.Nullable; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.symbols.Symbol; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.ClassDef; +import org.sonar.plugins.python.api.tree.Decorator; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.FunctionDef; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.tree.TreeUtils; + +public class UnittestUtils { + private static final Set PYTEST_LIFECYCLE_METHODS = Set.of( + "setUp", "tearDown", "setUpClass", "tearDownClass", + "setup_method", "teardown_method", "setup_class", "teardown_class", "setup_module", "teardown_module"); + private static final String PYTEST_FIXTURE_DECORATOR_FQN = "pytest.fixture"; + private static final String UNITTEST_TEST_CASE_FQN_PREFIX = "unittest.case.TestCase."; + private static final String PYTEST_EXPECTED_EXCEPTION = "expected_exception"; + private static final String PYTEST_MATCH = "match"; + private static final String UNITTEST_EXCEPTION = "exception"; + private static final TypeMatcher PYTEST_RAISES_MATCHER = TypeMatchers.withFQN("pytest.raises"); + public static final String ASSERT_RAISES_REGEXP = "assertRaisesRegexp"; + public static final String ASSERT_RAISES_REGEX = "assertRaisesRegex"; + private static final TypeMatcher UNITTEST_ASSERT_RAISES_MATCHER = TypeMatchers.any( + TypeMatchers.withFQN(UNITTEST_TEST_CASE_FQN_PREFIX + "assertRaises"), + TypeMatchers.withFQN(UNITTEST_TEST_CASE_FQN_PREFIX + ASSERT_RAISES_REGEX), + TypeMatchers.withFQN(UNITTEST_TEST_CASE_FQN_PREFIX + ASSERT_RAISES_REGEXP) + ); + private static final TypeMatcher UNITTEST_ASSERT_RAISES_WITH_MESSAGE_CHECK_MATCHER = TypeMatchers.any( + TypeMatchers.withFQN(UNITTEST_TEST_CASE_FQN_PREFIX + ASSERT_RAISES_REGEX), + TypeMatchers.withFQN(UNITTEST_TEST_CASE_FQN_PREFIX + ASSERT_RAISES_REGEXP) + ); + + private UnittestUtils() { + + } + + public static final Set RUN_METHODS = Set.of("setUp", "tearDown", "setUpClass", "tearDownClass", "run", "skipTest", + "subTest", "debug", "asyncSetUp", "asyncTearDown"); + + public static final Set RAISE_METHODS = Set.of("assertRaises", ASSERT_RAISES_REGEXP, ASSERT_RAISES_REGEX); + + public static final Set ASSERTIONS_METHODS = Set.of("assertEqual", "assertNotEqual", "assertTrue", "assertFalse", "assertIs", + "assertIsNot", "assertIsNone", "assertIsNotNone", "assertIn", "assertNotIn", "assertIsInstance", "assertNotIsInstance", + "assertAlmostEqual", "assertNotAlmostEqual", "assertGreater", "assertGreaterEqual", "assertLess", "assertLessEqual", + "assertRegexpMatches", "assertNotRegexpMatches", "assertItemsEqual", "assertDictContainsSubset", "assertMultiLineEqual", + "assertSequenceEqual", "assertListEqual", "assertTupleEqual", "assertSetEqual", "assertDictEqual", "assertWarns", "assertWarnsRegex", + "assertLogs", "assertNoLogs", "assertRegex", "assertNotRegex", "assertCountEqual"); + + public static final Set UTIL_METHODS = Set.of("addTypeEqualityFunc", "fail", "failureException", "longMessage", "maxDiff"); + + public static final Set GATHER_INFO_METHODS = Set.of("countTestCases", "defaultTestResult", "id", "shortDescription", "addCleanup", + "doCleanups", "addClassCleanup", "doClassCleanups"); + + private static final Set ALL_METHODS = new HashSet<>(); + private static final Set ALL_ASSERT_METHODS = new HashSet<>(); + + static { + ALL_METHODS.addAll(RUN_METHODS); + ALL_METHODS.addAll(UTIL_METHODS); + ALL_METHODS.addAll(GATHER_INFO_METHODS); + ALL_METHODS.addAll(ASSERTIONS_METHODS); + ALL_METHODS.addAll(RAISE_METHODS); + ALL_ASSERT_METHODS.addAll(ASSERTIONS_METHODS); + ALL_ASSERT_METHODS.addAll(RAISE_METHODS); + } + + public static Set allMethods() { + return Collections.unmodifiableSet(ALL_METHODS); + } + + public static Set allAssertMethods() { + return Collections.unmodifiableSet(ALL_ASSERT_METHODS); + } + + public static boolean isTestMethodName(String name) { + return name.startsWith("test"); + } + + public static boolean isTestClassName(String name) { + return name.startsWith("Test"); + } + + public static boolean isPytestFileName(String fileName) { + return fileName.startsWith("test_") || fileName.endsWith("_test.py"); + } + + public static boolean hasConstructor(ClassDef classDef) { + return classDef.body().statements().stream() + .filter(FunctionDef.class::isInstance) + .map(FunctionDef.class::cast) + .anyMatch(functionDef -> { + String name = functionDef.name().name(); + return "__init__".equals(name) || "__new__".equals(name); + }); + } + + public static boolean hasPytestLifecycleMethods(ClassDef classDef) { + return classDef.body().statements().stream() + .filter(FunctionDef.class::isInstance) + .map(FunctionDef.class::cast) + .anyMatch(functionDef -> + PYTEST_LIFECYCLE_METHODS.contains(functionDef.name().name()) + || functionDef.decorators().stream() + .anyMatch(UnittestUtils::isPytestFixtureDecorator)); + } + + public static boolean isPytestStyleTestClass(ClassDef classDef, String fileName) { + return isPytestFileName(fileName) + && isTestClassName(classDef.name().name()) + && !hasConstructor(classDef) + && hasPytestLifecycleMethods(classDef); + } + + public static boolean isPytestStyleTestFunction(FunctionDef functionDef, String fileName) { + if (!isPytestFileName(fileName) || !isTestMethodName(functionDef.name().name())) { + return false; + } + ClassDef parentClass = directlyEnclosingClass(functionDef); + return parentClass == null || isTestClassName(parentClass.name().name()); + } + + public static boolean isPytestRaises(CallExpression callExpression, SubscriptionContext ctx) { + return PYTEST_RAISES_MATCHER.isTrueFor(callExpression.callee(), ctx); + } + + public static boolean hasPytestRaisesMatchArgument(CallExpression callExpression) { + return TreeUtils.argumentByKeyword(PYTEST_MATCH, callExpression.arguments()) != null; + } + + @Nullable + public static RegularArgument pytestExpectedExceptionArgument(CallExpression callExpression) { + return TreeUtils.nthArgumentOrKeyword(0, PYTEST_EXPECTED_EXCEPTION, callExpression.arguments()); + } + + public static boolean isUnittestAssertRaises(CallExpression callExpression, SubscriptionContext ctx) { + return UNITTEST_ASSERT_RAISES_MATCHER.isTrueFor(callExpression.callee(), ctx); + } + + public static boolean hasUnittestAssertRaisesMessageCheck(CallExpression callExpression, SubscriptionContext ctx) { + return UNITTEST_ASSERT_RAISES_WITH_MESSAGE_CHECK_MATCHER.isTrueFor(callExpression.callee(), ctx); + } + + @Nullable + public static RegularArgument unittestExceptionArgument(CallExpression callExpression) { + return TreeUtils.nthArgumentOrKeyword(0, UNITTEST_EXCEPTION, callExpression.arguments()); + } + + private static boolean isPytestFixtureDecorator(Decorator decorator) { + Expression expression = decorator.expression(); + if (expression instanceof CallExpression callExpression) { + expression = callExpression.callee(); + } + return TreeUtils.getSymbolFromTree(expression) + .map(Symbol::fullyQualifiedName) + .filter(PYTEST_FIXTURE_DECORATOR_FQN::equals) + .isPresent(); + } + + public static boolean isUnittestTestCaseClass(ClassDef classDef) { + return TreeUtils.getParentClassesFQN(classDef).stream().anyMatch(parentClass -> parentClass.contains("unittest") && parentClass.contains("TestCase")); + } + + public static boolean isWithinUnittestTestCase(Tree tree) { + ClassDef classDef = (ClassDef) TreeUtils.firstAncestorOfKind(tree, Tree.Kind.CLASSDEF); + return classDef != null && isUnittestTestCaseClass(classDef); + } + + @Nullable + private static ClassDef directlyEnclosingClass(Tree tree) { + Tree current = tree.parent(); + while (current != null) { + if (current.is(Tree.Kind.CLASSDEF)) { + return (ClassDef) current; + } + if (current.is(Tree.Kind.FUNCDEF, Tree.Kind.LAMBDA)) { + return null; + } + current = current.parent(); + } + return null; + } +} diff --git a/python-checks/src/test/java/org/sonar/python/checks/utils/UnittestUtilsTest.java b/python-checks/src/test/java/org/sonar/python/checks/utils/UnittestUtilsTest.java new file mode 100644 index 000000000..0f9e1941b --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/utils/UnittestUtilsTest.java @@ -0,0 +1,324 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.utils; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.BiConsumer; +import org.junit.jupiter.api.Test; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.PythonVisitorContext; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.ClassDef; +import org.sonar.plugins.python.api.tree.FileInput; +import org.sonar.plugins.python.api.tree.FunctionDef; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.python.SubscriptionVisitor; +import org.sonar.python.TestPythonVisitorRunner; +import org.sonar.python.parser.PythonParser; +import org.sonar.python.semantic.ProjectLevelSymbolTable; +import org.sonar.python.semantic.SymbolTableBuilder; +import org.sonar.python.tree.PythonTreeMaker; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.sonar.python.caching.CacheContextImpl.dummyCache; + +class UnittestUtilsTest { + + @Test + void test_isWithinUnittestTestCase() { + String code = "import unittest\nclass A(unittest.TestCase): ..."; + FileInput fileInput = parse("mod1.py", code); + Tree tree = lastDescendant(fileInput, t -> t.is(Tree.Kind.ELLIPSIS)); + assertThat(UnittestUtils.isWithinUnittestTestCase(tree)).isTrue(); + + code = "import unittest\nclass A(unittest.case.TestCase): ..."; + fileInput = parse("mod1.py", code); + tree = lastDescendant(fileInput, t -> t.is(Tree.Kind.ELLIPSIS)); + assertThat(UnittestUtils.isWithinUnittestTestCase(tree)).isTrue(); + + code = "import random_wrapper\nclass A(random_wrapper.unittest.TestCase): ..."; + fileInput = parse("mod1.py", code); + tree = lastDescendant(fileInput, t -> t.is(Tree.Kind.ELLIPSIS)); + assertThat(UnittestUtils.isWithinUnittestTestCase(tree)).isTrue(); + + code = "import random\nclass A(random.TestCase): ..."; + fileInput = parse("mod1.py", code); + tree = lastDescendant(fileInput, t -> t.is(Tree.Kind.ELLIPSIS)); + assertThat(UnittestUtils.isWithinUnittestTestCase(tree)).isFalse(); + + code = "import unittest\nclass A(unittest.other): ..."; + fileInput = parse("mod1.py", code); + tree = lastDescendant(fileInput, t -> t.is(Tree.Kind.ELLIPSIS)); + assertThat(UnittestUtils.isWithinUnittestTestCase(tree)).isFalse(); + + code = "..."; + fileInput = parse("mod1.py", code); + tree = lastDescendant(fileInput, t -> t.is(Tree.Kind.ELLIPSIS)); + assertThat(UnittestUtils.isWithinUnittestTestCase(tree)).isFalse(); + } + + @Test + void all_methods() { + assertThat(UnittestUtils.allMethods()) + .hasSize(61) + .contains("skipTest") + .doesNotContain("skiptTest"); + } + + @Test + void all_assert_methods() { + assertThat(UnittestUtils.allAssertMethods()).hasSize(38); + } + + @Test + void test_name_helpers() { + assertThat(UnittestUtils.isTestMethodName("test_something")).isTrue(); + assertThat(UnittestUtils.isTestMethodName("helper")).isFalse(); + assertThat(UnittestUtils.isTestClassName("TestSomething")).isTrue(); + assertThat(UnittestUtils.isTestClassName("Helper")).isFalse(); + assertThat(UnittestUtils.isPytestFileName("test_module.py")).isTrue(); + assertThat(UnittestUtils.isPytestFileName("module_test.py")).isTrue(); + assertThat(UnittestUtils.isPytestFileName("module.py")).isFalse(); + } + + @Test + void test_constructor_detection() { + FileInput fileInput = parse("test_module.py", """ + class TestWithInit: + def __init__(self): + pass + + class TestWithNew: + def __new__(cls): + return super().__new__(cls) + + class TestWithoutConstructor: + def helper(self): + pass + """); + + var classes = fileInput.statements().statements().stream() + .filter(ClassDef.class::isInstance) + .map(ClassDef.class::cast) + .toList(); + + assertThat(UnittestUtils.hasConstructor(classes.get(0))).isTrue(); + assertThat(UnittestUtils.hasConstructor(classes.get(1))).isTrue(); + assertThat(UnittestUtils.hasConstructor(classes.get(2))).isFalse(); + } + + @Test + void test_pytest_style_test_class() { + FileInput fileInput = parse("test_module.py", """ + import pytest + + class TestCollected: + @pytest.fixture() + def setup_data(self): + return 42 + + def test_ok(self): + pass + + class TestWithInit: + def __init__(self): + pass + + class TestWithSetUp: + def setUp(self): + pass + + class Helper: + def test_ok(self): + pass + """); + + var classes = fileInput.statements().statements().stream() + .filter(ClassDef.class::isInstance) + .map(ClassDef.class::cast) + .toList(); + + assertThat(UnittestUtils.isPytestStyleTestClass(classes.get(0), "test_module.py")).isTrue(); + assertThat(UnittestUtils.isPytestStyleTestClass(classes.get(1), "test_module.py")).isFalse(); + assertThat(UnittestUtils.isPytestStyleTestClass(classes.get(2), "test_module.py")).isTrue(); + assertThat(UnittestUtils.isPytestStyleTestClass(classes.get(3), "test_module.py")).isFalse(); + } + + @Test + void test_pytest_style_test_function() { + FileInput fileInput = parse("test_module.py", """ + def test_module_level(): + pass + + class TestContainer: + def test_in_class(self): + pass + + class Helper: + def test_helper(self): + pass + + def wrapper(self): + def test_nested(): + pass + return test_nested + + def helper(): + pass + """); + + var functions = allDescendants(fileInput, t -> t.is(Tree.Kind.FUNCDEF)).stream() + .map(FunctionDef.class::cast) + .toList(); + + assertThat(UnittestUtils.isPytestStyleTestFunction(functions.get(0), "test_module.py")).isTrue(); + assertThat(UnittestUtils.isPytestStyleTestFunction(functions.get(1), "test_module.py")).isTrue(); + assertThat(UnittestUtils.isPytestStyleTestFunction(functions.get(2), "test_module.py")).isFalse(); + assertThat(UnittestUtils.isPytestStyleTestFunction(functions.get(3), "test_module.py")).isFalse(); + assertThat(UnittestUtils.isPytestStyleTestFunction(functions.get(4), "test_module.py")).isTrue(); + assertThat(UnittestUtils.isPytestStyleTestFunction(functions.get(5), "test_module.py")).isFalse(); + assertThat(UnittestUtils.isPytestStyleTestFunction(functions.get(0), "module.py")).isFalse(); + } + + @Test + void test_pytest_lifecycle_methods() { + FileInput fileInput = parse("test_module.py", """ + import pytest + + class TestFixtureBased: + @pytest.fixture(scope="module") + def setup_data(self): + return 42 + + class TestTearDownBased: + def tearDown(self): + pass + + class TestXunitBased: + def teardown_method(self): + pass + + class TestWithoutLifecycle: + def helper(self): + pass + """); + + var classes = fileInput.statements().statements().stream() + .filter(ClassDef.class::isInstance) + .map(ClassDef.class::cast) + .toList(); + + assertThat(UnittestUtils.hasPytestLifecycleMethods(classes.get(0))).isTrue(); + assertThat(UnittestUtils.hasPytestLifecycleMethods(classes.get(1))).isTrue(); + assertThat(UnittestUtils.hasPytestLifecycleMethods(classes.get(2))).isTrue(); + assertThat(UnittestUtils.hasPytestLifecycleMethods(classes.get(3))).isFalse(); + } + + @Test + void test_isUnittestTestCaseClass() { + String code = "import unittest\nclass A(unittest.TestCase):\n ..."; + FileInput fileInput = parse("mod1.py", code); + ClassDef classDef = (ClassDef) fileInput.statements().statements().get(1); + assertThat(UnittestUtils.isUnittestTestCaseClass(classDef)).isTrue(); + + code = "import random\nclass A(random.TestCase):\n ..."; + fileInput = parse("mod1.py", code); + classDef = (ClassDef) fileInput.statements().statements().get(1); + assertThat(UnittestUtils.isUnittestTestCaseClass(classDef)).isFalse(); + } + + @Test + void test_pytest_raises_helpers() { + List isPytestRaises = new ArrayList<>(); + List hasMatchArgument = new ArrayList<>(); + List exceptionArguments = new ArrayList<>(); + + analyzeCallExpressions(""" + import pytest + from pytest import raises + pytest.raises(Exception, match="bad") + raises(ValueError) + """, (ctx, callExpression) -> { + isPytestRaises.add(UnittestUtils.isPytestRaises(callExpression, ctx)); + hasMatchArgument.add(UnittestUtils.hasPytestRaisesMatchArgument(callExpression)); + exceptionArguments.add(UnittestUtils.pytestExpectedExceptionArgument(callExpression).expression().firstToken().value()); + }); + + assertThat(isPytestRaises).containsExactly(true, true); + assertThat(hasMatchArgument).containsExactly(true, false); + assertThat(exceptionArguments).containsExactly("Exception", "ValueError"); + } + + @Test + void test_unittest_assert_raises_helpers() { + List isAssertRaises = new ArrayList<>(); + List hasMessageCheck = new ArrayList<>(); + List exceptionArguments = new ArrayList<>(); + + analyzeCallExpressions(""" + import unittest + + class MyTest(unittest.TestCase): + def test_ok(self): + self.assertRaises(Exception, explode) + self.assertRaisesRegex(Exception, "bad", explode) + """, (ctx, callExpression) -> { + isAssertRaises.add(UnittestUtils.isUnittestAssertRaises(callExpression, ctx)); + hasMessageCheck.add(UnittestUtils.hasUnittestAssertRaisesMessageCheck(callExpression, ctx)); + exceptionArguments.add(UnittestUtils.unittestExceptionArgument(callExpression).expression().firstToken().value()); + }); + + assertThat(isAssertRaises).containsExactly(true, true); + assertThat(hasMessageCheck).containsExactly(false, true); + assertThat(exceptionArguments).containsExactly("Exception", "Exception"); + } + + private static FileInput parse(String fileName, String code) { + FileInput fileInput = new PythonTreeMaker().fileInput(PythonParser.create().parse(code)); + new SymbolTableBuilder("", new TestPythonVisitorRunner.MockPythonFile("", fileName, code)).visitFileInput(fileInput); + return fileInput; + } + + private static void analyzeCallExpressions(String code, BiConsumer consumer) { + var file = new TestPythonVisitorRunner.MockPythonFile("", "mod1.py", code); + PythonVisitorContext context = TestPythonVisitorRunner.createContext(file, null, "", ProjectLevelSymbolTable.empty(), dummyCache()); + PythonSubscriptionCheck check = new PythonSubscriptionCheck() { + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, ctx -> consumer.accept(ctx, (CallExpression) ctx.syntaxNode())); + } + }; + SubscriptionVisitor.analyze(List.of(check), context); + } + + private static List allDescendants(Tree tree, java.util.function.Predicate predicate) { + List result = new ArrayList<>(); + for (Tree child : tree.children()) { + if (predicate.test(child)) { + result.add((T) child); + } + result.addAll(allDescendants(child, predicate)); + } + return result; + } + + private static T lastDescendant(Tree tree, java.util.function.Predicate predicate) { + List descendants = allDescendants(tree, predicate); + return descendants.get(descendants.size() - 1); + } +} diff --git a/python-checks/src/test/resources/checks/tests/testCasesShouldContainTests_test.py b/python-checks/src/test/resources/checks/tests/testCasesShouldContainTests_test.py index 9aff1ad8d..28dd8223e 100644 --- a/python-checks/src/test/resources/checks/tests/testCasesShouldContainTests_test.py +++ b/python-checks/src/test/resources/checks/tests/testCasesShouldContainTests_test.py @@ -1,4 +1,5 @@ import unittest +import pytest def test_module_level_test(): @@ -7,7 +8,8 @@ def test_module_level_test(): class TestPytestWithoutTests: # Noncompliant {{Add some tests to this class.}} # ^^^^^^^^^^^^^^^^^^^^^^ - def helper(self): + @pytest.fixture + def setup_data(self): return 42 @@ -16,11 +18,55 @@ def test_ok(self): assert True +class TestPytestEndpoint: + @pytest.fixture(autouse=True) + def setup_attrs(self): + self.value = 42 + + def teardown_method(self): + self.value = None + + +class TestPytestDeleteEndpoint(TestPytestEndpoint): + def test_ok(self): + assert self.value == 42 + + +class TestPytestXunitOnly: + def teardown_method(self): + self.value = None + + +class TestPytestXunitChild(TestPytestXunitOnly): + def test_ok(self): + assert True + + class HelperPytestClass: def helper(self): return 42 +class TestPytestHelperWithInit: + def __init__(self): + self.value = 42 + + def helper(self): + return self.value + + +class TestPytestHelperWithNew: + def __new__(cls): + return super().__new__(cls) + + def helper(self): + return 42 + + +class TestPlugin: + name = "test-plugin-cli" + + class EmptyUnittestCase(unittest.TestCase): # Noncompliant {{Add some tests to this class.}} # ^^^^^^^^^^^^^^^^^ def helper(self): @@ -109,6 +155,14 @@ def testSomething(self): class TestUnknownParent(UnknownParent): # Noncompliant {{Add some tests to this class.}} # ^^^^^^^^^^^^^^^^^ + def setUp(self): + return 42 + + def helper(self): + return 42 + + +class TestWithUnknownParentAndNoLifecycle(UnknownParent): def helper(self): return 42 @@ -119,6 +173,14 @@ def TestAmbiguous(): class TestAmbiguous: # Noncompliant {{Add some tests to this class.}} # ^^^^^^^^^^^^^ + def tearDown(self): + return 42 + + def helper(self): + return 42 + + +class TestAmbiguousWithoutLifecycle: def helper(self): return 42 @@ -147,6 +209,14 @@ def FactoryBase(): class TestFunctionBase(FactoryBase): # Noncompliant {{Add some tests to this class.}} # ^^^^^^^^^^^^^^^^ + def setUpClass(self): + return 42 + + def helper(self): + return 42 + + +class TestFunctionBaseWithoutLifecycle(FactoryBase): def helper(self): return 42 @@ -165,5 +235,13 @@ class RightNoTest(SharedNoTest): class TestDiamondNoTests(LeftNoTest, RightNoTest): # Noncompliant {{Add some tests to this class.}} # ^^^^^^^^^^^^^^^^^^ + def tearDownClass(self): + return 42 + + def helper(self): + return 42 + + +class TestDiamondNoTestsWithoutLifecycle(LeftNoTest, RightNoTest): def helper(self): return 42 diff --git a/python-commons/src/test/resources/org/sonar/plugins/python/sensor/test_paths_loader.py b/python-commons/src/test/resources/org/sonar/plugins/python/sensor/test_paths_loader.py new file mode 100644 index 000000000..27b630899 --- /dev/null +++ b/python-commons/src/test/resources/org/sonar/plugins/python/sensor/test_paths_loader.py @@ -0,0 +1,2 @@ +def load_paths(): + return [] diff --git a/python-frontend/src/main/java/org/sonar/python/tests/UnittestUtils.java b/python-frontend/src/main/java/org/sonar/python/tests/UnittestUtils.java deleted file mode 100644 index 3d834b9b3..000000000 --- a/python-frontend/src/main/java/org/sonar/python/tests/UnittestUtils.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * SonarQube Python Plugin - * Copyright (C) SonarSource Sàrl - * mailto:info AT sonarsource DOT com - * - * You can redistribute and/or modify this program under the terms of - * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the Sonar Source-Available License for more details. - * - * You should have received a copy of the Sonar Source-Available License - * along with this program; if not, see https://sonarsource.com/license/ssal/ - */ -package org.sonar.python.tests; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import org.sonar.plugins.python.api.tree.ClassDef; -import org.sonar.plugins.python.api.tree.Tree; -import org.sonar.python.tree.TreeUtils; - -public class UnittestUtils { - - private UnittestUtils() { - - } - - // Methods of unittest are the union of Python 2 and Python 3 methods: - // https://docs.python.org/2/library/unittest.html#unittest.TestCase - // https://docs.python.org/3/library/unittest.html#unittest.TestCase - public static final Set RUN_METHODS = Set.of("setUp", "tearDown", "setUpClass", "tearDownClass", "run", "skiptTest", - "subTest", "debug", "asyncSetUp", "asyncTearDown"); - - public static final Set RAISE_METHODS = Set.of("assertRaises", "assertRaisesRegexp", "assertRaisesRegex"); - - public static final Set ASSERTIONS_METHODS = Set.of("assertEqual", "assertNotEqual", "assertTrue", "assertFalse", "assertIs", - "assertIsNot", "assertIsNone", "assertIsNotNone", "assertIn", "assertNotIn", "assertIsInstance", "assertNotIsInstance", - "assertAlmostEqual", "assertNotAlmostEqual", "assertGreater", "assertGreaterEqual", "assertLess", "assertLessEqual", - "assertRegexpMatches", "assertNotRegexpMatches", "assertItemsEqual", "assertDictContainsSubset", "assertMultiLineEqual", - "assertSequenceEqual", "assertListEqual", "assertTupleEqual", "assertSetEqual", "assertDictEqual", "assertWarns", "assertWarnsRegex", - "assertLogs", "assertNoLogs", "assertRegex", "assertNotRegex", "assertCountEqual"); - - - public static final Set UTIL_METHODS = Set.of("addTypeEqualityFunc", "fail", "failureException", "longMessage", "maxDiff"); - - public static final Set GATHER_INFO_METHODS = Set.of("countTestCases", "defaultTestResult", "id", "shortDescription", "addCleanup", - "doCleanups", "addClassCleanup", "doClassCleanups"); - - private static final Set ALL_METHODS = new HashSet<>(); - private static final Set ALL_ASSERT_METHODS = new HashSet<>(); - - static { - ALL_METHODS.addAll(RUN_METHODS); - ALL_METHODS.addAll(UTIL_METHODS); - ALL_METHODS.addAll(GATHER_INFO_METHODS); - ALL_METHODS.addAll(ASSERTIONS_METHODS); - ALL_METHODS.addAll(RAISE_METHODS); - ALL_ASSERT_METHODS.addAll(ASSERTIONS_METHODS); - ALL_ASSERT_METHODS.addAll(RAISE_METHODS); - } - - public static Set allMethods() { - return Collections.unmodifiableSet(ALL_METHODS); - } - public static Set allAssertMethods() { - return Collections.unmodifiableSet(ALL_ASSERT_METHODS); - } - - public static boolean isWithinUnittestTestCase(Tree tree) { - List parentClassesFQN = new ArrayList<>(); - ClassDef classDef = (ClassDef) TreeUtils.firstAncestorOfKind(tree, Tree.Kind.CLASSDEF); - if (classDef != null) { - parentClassesFQN.addAll(TreeUtils.getParentClassesFQN(classDef)); - } - return parentClassesFQN.stream().anyMatch(parentClass -> parentClass.contains("unittest") && parentClass.contains("TestCase")); - } -} diff --git a/python-frontend/src/test/java/org/sonar/python/tests/UnittestUtilsTest.java b/python-frontend/src/test/java/org/sonar/python/tests/UnittestUtilsTest.java deleted file mode 100644 index 4fd975023..000000000 --- a/python-frontend/src/test/java/org/sonar/python/tests/UnittestUtilsTest.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * SonarQube Python Plugin - * Copyright (C) SonarSource Sàrl - * mailto:info AT sonarsource DOT com - * - * You can redistribute and/or modify this program under the terms of - * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the Sonar Source-Available License for more details. - * - * You should have received a copy of the Sonar Source-Available License - * along with this program; if not, see https://sonarsource.com/license/ssal/ - */ -package org.sonar.python.tests; - - -import org.junit.jupiter.api.Test; -import org.sonar.plugins.python.api.tree.FileInput; -import org.sonar.plugins.python.api.tree.Tree; -import org.sonar.python.PythonTestUtils; -import org.sonar.python.semantic.SymbolTableBuilder; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.sonar.python.PythonTestUtils.pythonFile; - -class UnittestUtilsTest { - - @Test - void test_isWithinUnittestTestCase() { - String code = "import unittest\nclass A(unittest.TestCase): ..."; - FileInput fileInput = PythonTestUtils.parse(new SymbolTableBuilder("", pythonFile("mod1.py")), code); - Tree tree = PythonTestUtils.getLastDescendant(fileInput, t -> t.is(Tree.Kind.ELLIPSIS)); - assertThat(UnittestUtils.isWithinUnittestTestCase(tree)).isTrue(); - - code = "import unittest\nclass A(unittest.case.TestCase): ..."; - fileInput = PythonTestUtils.parse(new SymbolTableBuilder("", pythonFile("mod1.py")), code); - tree = PythonTestUtils.getLastDescendant(fileInput, t -> t.is(Tree.Kind.ELLIPSIS)); - assertThat(UnittestUtils.isWithinUnittestTestCase(tree)).isTrue(); - - code = "import random_wrapper\nclass A(random_wrapper.unittest.TestCase): ..."; - fileInput = PythonTestUtils.parse(new SymbolTableBuilder("", pythonFile("mod1.py")), code); - tree = PythonTestUtils.getLastDescendant(fileInput, t -> t.is(Tree.Kind.ELLIPSIS)); - assertThat(UnittestUtils.isWithinUnittestTestCase(tree)).isTrue(); - - code = "import random\nclass A(random.TestCase): ..."; - fileInput = PythonTestUtils.parse(new SymbolTableBuilder("", pythonFile("mod1.py")), code); - tree = PythonTestUtils.getLastDescendant(fileInput, t -> t.is(Tree.Kind.ELLIPSIS)); - assertThat(UnittestUtils.isWithinUnittestTestCase(tree)).isFalse(); - - code = "import unittest\nclass A(unittest.other): ..."; - fileInput = PythonTestUtils.parse(new SymbolTableBuilder("", pythonFile("mod1.py")), code); - tree = PythonTestUtils.getLastDescendant(fileInput, t -> t.is(Tree.Kind.ELLIPSIS)); - assertThat(UnittestUtils.isWithinUnittestTestCase(tree)).isFalse(); - - code = "..."; - fileInput = PythonTestUtils.parse(new SymbolTableBuilder("", pythonFile("mod1.py")), code); - tree = PythonTestUtils.getLastDescendant(fileInput, t -> t.is(Tree.Kind.ELLIPSIS)); - assertThat(UnittestUtils.isWithinUnittestTestCase(tree)).isFalse(); - } - - @Test - void all_methods() { - assertThat(UnittestUtils.allMethods()).hasSize(61); - } - - @Test - void all_assert_methods() { - assertThat(UnittestUtils.allAssertMethods()).hasSize(38); - } -} From 4ca9302f995017fa0137aafc402440d623378a87 Mon Sep 17 00:00:00 2001 From: rombirli Date: Wed, 1 Jul 2026 16:44:22 +0200 Subject: [PATCH 171/322] SONARPY-4312 Restrict S2187 scope to tests Ignore pytest bases extended by test subclasses GitOrigin-RevId: 30939541fef35726cc741e0fccbaa690f41a0a57 --- .../TestCasesShouldContainTestsCheck.java | 42 +++++++++++-------- .../TestCasesShouldContainTestsCheckTest.java | 8 ++++ 2 files changed, 33 insertions(+), 17 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/TestCasesShouldContainTestsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/TestCasesShouldContainTestsCheck.java index 2415cfeb8..5c79a1afc 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/TestCasesShouldContainTestsCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/TestCasesShouldContainTestsCheck.java @@ -51,6 +51,11 @@ public class TestCasesShouldContainTestsCheck extends PythonSubscriptionCheck { TypeMatchers.isType("builtins.NotImplementedError"), TypeMatchers.isObjectInstanceOf("builtins.NotImplementedError")); + @Override + public CheckScope scope() { + return CheckScope.TESTS; + } + @Override public void initialize(Context context) { context.registerSyntaxNodeConsumer(Tree.Kind.FILE_INPUT, TestCasesShouldContainTestsCheck::checkFileInput); @@ -64,7 +69,10 @@ private static void checkFileInput(SubscriptionContext ctx) { } boolean pytestStyleFile = UnittestUtils.isPytestFileName(ctx.pythonFile().fileName()); - List candidateClasses = collectCandidateClasses(ctx, statements, pytestStyleFile); + List classes = collectClasses(ctx, statements, pytestStyleFile); + List candidateClasses = classes.stream() + .filter(ClassInfo::isCandidate) + .toList(); boolean hasCollectedTests = hasModuleLevelPytestTests(statements) || hasClassLevelTests(statements); if (pytestStyleFile && !hasCollectedTests) { @@ -74,21 +82,21 @@ private static void checkFileInput(SubscriptionContext ctx) { candidateClasses .stream() - .filter(not(CandidateClass::hasCollectedTests)) - .filter(candidateClass -> !hasDescendantWithTests(candidateClass, candidateClasses)) + .filter(not(ClassInfo::hasCollectedTests)) + .filter(candidateClass -> !hasDescendantWithTests(candidateClass, classes)) .filter(candidateClass -> !isLikelySharedBaseClass(candidateClass, ctx)) .forEach(candidateClass -> ctx.addIssue(candidateClass.classDef().name(), CLASS_MESSAGE)); } - private static List collectCandidateClasses(SubscriptionContext ctx, StatementList statements, boolean pytestStyleFile) { + private static List collectClasses(SubscriptionContext ctx, StatementList statements, boolean pytestStyleFile) { return statements.statements() - .stream().filter(ClassDef.class::isInstance) - .map(ClassDef.class::cast) - .filter(classDef -> isCandidateTestClass(ctx, classDef, pytestStyleFile)) - .map(classDef -> - new CandidateClass(classDef, getClassSymbolFromDef(classDef), hasCollectedTests(classDef)) - ) - .toList(); + .stream().filter(ClassDef.class::isInstance) + .map(ClassDef.class::cast) + .map(classDef -> { + ClassSymbol classSymbol = getClassSymbolFromDef(classDef); + return new ClassInfo(classDef, classSymbol, hasCollectedTests(classDef), isCandidateTestClass(ctx, classDef, pytestStyleFile)); + }) + .toList(); } private static boolean hasModuleLevelPytestTests(StatementList statements) { @@ -142,20 +150,20 @@ private static boolean superClassesDeclareTests(ClassSymbol classSymbol, Set candidateClasses) { + private static boolean hasDescendantWithTests(ClassInfo candidateClass, List classes) { ClassSymbol classSymbol = candidateClass.classSymbol(); if (classSymbol == null) { return false; } - return candidateClasses.stream() + return classes.stream() .filter(other -> other != candidateClass) - .filter(CandidateClass::hasCollectedTests) - .map(CandidateClass::classSymbol) + .filter(ClassInfo::hasCollectedTests) + .map(ClassInfo::classSymbol) .filter(Objects::nonNull) .anyMatch(otherClassSymbol -> otherClassSymbol.isOrExtends(classSymbol)); } - private static boolean isLikelySharedBaseClass(CandidateClass candidateClass, SubscriptionContext ctx) { + private static boolean isLikelySharedBaseClass(ClassInfo candidateClass, SubscriptionContext ctx) { ClassDef classDef = candidateClass.classDef(); String className = classDef.name().name(); return className.startsWith("Base") @@ -222,6 +230,6 @@ private static boolean isTestMethodName(String name) { return UnittestUtils.isTestMethodName(name); } - private record CandidateClass(ClassDef classDef, @Nullable ClassSymbol classSymbol, boolean hasCollectedTests) { + private record ClassInfo(ClassDef classDef, @Nullable ClassSymbol classSymbol, boolean hasCollectedTests, boolean isCandidate) { } } diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/TestCasesShouldContainTestsCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/TestCasesShouldContainTestsCheckTest.java index 2bb010644..956e81957 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/tests/TestCasesShouldContainTestsCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/TestCasesShouldContainTestsCheckTest.java @@ -17,10 +17,18 @@ package org.sonar.python.checks.tests; import org.junit.jupiter.api.Test; +import org.sonar.plugins.python.api.PythonCheck; import org.sonar.python.checks.utils.PythonCheckVerifier; +import static org.assertj.core.api.Assertions.assertThat; + class TestCasesShouldContainTestsCheckTest { + @Test + void scope() { + assertThat(new TestCasesShouldContainTestsCheck().scope()).isEqualTo(PythonCheck.CheckScope.TESTS); + } + @Test void test() { PythonCheckVerifier.verify("src/test/resources/checks/tests/testCasesShouldContainTests_test.py", new TestCasesShouldContainTestsCheck()); From 72f10c37fe7c6ad76e4c46826eb4a5eb5debfa1e Mon Sep 17 00:00:00 2001 From: rombirli Date: Thu, 2 Jul 2026 15:42:39 +0200 Subject: [PATCH 172/322] SONARPY-4302 Set S5958 scope to `CheckScope.TESTS` only & Refactor assertion helpers to UnitTestUtils Use isType for unittest assert matchers GitOrigin-RevId: 904bc6ef2fcdb34bfaeb06ecc2fc0da3a28fc2e5 --- .../org/sonar/python/checks/utils/UnittestUtils.java | 11 +++++------ .../tests/SpecificExceptionAssertionCheckTest.java | 8 ++++++++ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/utils/UnittestUtils.java b/python-checks/src/main/java/org/sonar/python/checks/utils/UnittestUtils.java index 4a3c97475..f637e6e29 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/utils/UnittestUtils.java +++ b/python-checks/src/main/java/org/sonar/python/checks/utils/UnittestUtils.java @@ -46,13 +46,13 @@ public class UnittestUtils { public static final String ASSERT_RAISES_REGEXP = "assertRaisesRegexp"; public static final String ASSERT_RAISES_REGEX = "assertRaisesRegex"; private static final TypeMatcher UNITTEST_ASSERT_RAISES_MATCHER = TypeMatchers.any( - TypeMatchers.withFQN(UNITTEST_TEST_CASE_FQN_PREFIX + "assertRaises"), - TypeMatchers.withFQN(UNITTEST_TEST_CASE_FQN_PREFIX + ASSERT_RAISES_REGEX), - TypeMatchers.withFQN(UNITTEST_TEST_CASE_FQN_PREFIX + ASSERT_RAISES_REGEXP) + TypeMatchers.isType(UNITTEST_TEST_CASE_FQN_PREFIX + "assertRaises"), + TypeMatchers.isType(UNITTEST_TEST_CASE_FQN_PREFIX + ASSERT_RAISES_REGEX), + TypeMatchers.isType(UNITTEST_TEST_CASE_FQN_PREFIX + ASSERT_RAISES_REGEXP) ); private static final TypeMatcher UNITTEST_ASSERT_RAISES_WITH_MESSAGE_CHECK_MATCHER = TypeMatchers.any( - TypeMatchers.withFQN(UNITTEST_TEST_CASE_FQN_PREFIX + ASSERT_RAISES_REGEX), - TypeMatchers.withFQN(UNITTEST_TEST_CASE_FQN_PREFIX + ASSERT_RAISES_REGEXP) + TypeMatchers.isType(UNITTEST_TEST_CASE_FQN_PREFIX + ASSERT_RAISES_REGEX), + TypeMatchers.isType(UNITTEST_TEST_CASE_FQN_PREFIX + ASSERT_RAISES_REGEXP) ); private UnittestUtils() { @@ -143,7 +143,6 @@ public static boolean isPytestStyleTestFunction(FunctionDef functionDef, String ClassDef parentClass = directlyEnclosingClass(functionDef); return parentClass == null || isTestClassName(parentClass.name().name()); } - public static boolean isPytestRaises(CallExpression callExpression, SubscriptionContext ctx) { return PYTEST_RAISES_MATCHER.isTrueFor(callExpression.callee(), ctx); } diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/SpecificExceptionAssertionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/SpecificExceptionAssertionCheckTest.java index 3145b95ea..17fb1de66 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/tests/SpecificExceptionAssertionCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/SpecificExceptionAssertionCheckTest.java @@ -17,10 +17,18 @@ package org.sonar.python.checks.tests; import org.junit.jupiter.api.Test; +import org.sonar.plugins.python.api.PythonCheck; import org.sonar.python.checks.utils.PythonCheckVerifier; +import static org.junit.jupiter.api.Assertions.assertEquals; + class SpecificExceptionAssertionCheckTest { + @Test + void scope() { + assertEquals(PythonCheck.CheckScope.TESTS, new SpecificExceptionAssertionCheck().scope()); + } + @Test void test() { PythonCheckVerifier.verify("src/test/resources/checks/tests/specificExceptionAssertion.py", new SpecificExceptionAssertionCheck()); From 80c172b01727603993ddb6c4f8fde9e039360788 Mon Sep 17 00:00:00 2001 From: rombirli Date: Thu, 2 Jul 2026 16:36:36 +0200 Subject: [PATCH 173/322] SONARPY-4303 Set S5976 scope to `CheckScope.TESTS` only & refactor helper functions to UnitTestUtils GitOrigin-RevId: 0a39f58bd4313b01ac0e4006521295ec99acb750 --- .../GroupSimilarTestsParameterizedCheck.java | 15 +++------------ .../sonar/python/checks/utils/UnittestUtils.java | 1 + .../GroupSimilarTestsParameterizedCheckTest.java | 3 ++- 3 files changed, 6 insertions(+), 13 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/GroupSimilarTestsParameterizedCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/GroupSimilarTestsParameterizedCheck.java index 0e90205bb..e3c5c6531 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/GroupSimilarTestsParameterizedCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/GroupSimilarTestsParameterizedCheck.java @@ -56,7 +56,7 @@ public void initialize(Context context) { @Override public CheckScope scope() { - return CheckScope.ALL; + return CheckScope.TESTS; } private static void checkFileInput(SubscriptionContext ctx, FileInput fileInput) { @@ -108,19 +108,10 @@ private static void checkStatementList(SubscriptionContext ctx, StatementList st } private static boolean isCandidateTestFunction(SubscriptionContext ctx, FunctionDef functionDef) { - return functionDef.name().name().startsWith("test") + return UnittestUtils.isTestMethodName(functionDef.name().name()) && functionDef.decorators().isEmpty() && !isPlaceholderTest(functionDef, ctx) - && (isPytestStyleTest(ctx, functionDef) || UnittestUtils.isWithinUnittestTestCase(functionDef)); - } - - private static boolean isPytestStyleTest(SubscriptionContext ctx, FunctionDef functionDef) { - String fileName = ctx.pythonFile().fileName(); - if (!(fileName.startsWith("test_") || fileName.endsWith("_test.py"))) { - return false; - } - ClassDef parentClass = CheckUtils.getParentClassDef(functionDef); - return parentClass == null || parentClass.name().name().startsWith("Test"); + && (UnittestUtils.isPytestStyleTestFunction(functionDef, ctx.pythonFile().fileName()) || UnittestUtils.isWithinUnittestTestCase(functionDef)); } private static boolean isPlaceholderTest(FunctionDef functionDef, SubscriptionContext ctx) { diff --git a/python-checks/src/main/java/org/sonar/python/checks/utils/UnittestUtils.java b/python-checks/src/main/java/org/sonar/python/checks/utils/UnittestUtils.java index f637e6e29..29e604051 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/utils/UnittestUtils.java +++ b/python-checks/src/main/java/org/sonar/python/checks/utils/UnittestUtils.java @@ -143,6 +143,7 @@ public static boolean isPytestStyleTestFunction(FunctionDef functionDef, String ClassDef parentClass = directlyEnclosingClass(functionDef); return parentClass == null || isTestClassName(parentClass.name().name()); } + public static boolean isPytestRaises(CallExpression callExpression, SubscriptionContext ctx) { return PYTEST_RAISES_MATCHER.isTrueFor(callExpression.callee(), ctx); } diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/GroupSimilarTestsParameterizedCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/GroupSimilarTestsParameterizedCheckTest.java index 12e906c41..879cf848a 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/tests/GroupSimilarTestsParameterizedCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/GroupSimilarTestsParameterizedCheckTest.java @@ -25,6 +25,7 @@ import java.util.List; import java.util.Map; import org.junit.jupiter.api.Test; +import org.sonar.plugins.python.api.PythonCheck; import org.sonar.plugins.python.api.SubscriptionContext; import org.sonar.plugins.python.api.symbols.ClassSymbol; import org.sonar.plugins.python.api.symbols.Symbol; @@ -64,7 +65,7 @@ void testEmptyFile() { @Test void scope() { - assertEquals(GroupSimilarTestsParameterizedCheck.CheckScope.ALL, new GroupSimilarTestsParameterizedCheck().scope()); + assertEquals(PythonCheck.CheckScope.TESTS, new GroupSimilarTestsParameterizedCheck().scope()); } @Test From 032528ea6381cb6f23aa4420a298c084325ef4ff Mon Sep 17 00:00:00 2001 From: rombirli Date: Thu, 2 Jul 2026 16:51:44 +0200 Subject: [PATCH 174/322] SONARPY-4305 Set S5778 scope to `CheckScope.TESTS` only GitOrigin-RevId: a96d6c6a4499822548ec321ee14a3b8210f2a2ab --- .../tests/SingleInvocationRuntimeExceptionCheck.java | 5 +++++ .../tests/SingleInvocationRuntimeExceptionCheckTest.java | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheck.java index 571d97db7..b74387226 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheck.java @@ -62,6 +62,11 @@ public void initialize(Context context) { context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, ctx -> checkDirectRaiseCall(ctx, (CallExpression) ctx.syntaxNode())); } + @Override + public CheckScope scope() { + return CheckScope.TESTS; + } + private static void checkWithStatement(SubscriptionContext ctx, WithStatement withStatement) { boolean isRaiseAssertion = withStatement.withItems().stream() .map(WithItem::test) diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheckTest.java index 667dbe55b..f03ff29f2 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheckTest.java @@ -17,10 +17,18 @@ package org.sonar.python.checks.tests; import org.junit.jupiter.api.Test; +import org.sonar.plugins.python.api.PythonCheck; import org.sonar.python.checks.utils.PythonCheckVerifier; +import static org.junit.jupiter.api.Assertions.assertEquals; + class SingleInvocationRuntimeExceptionCheckTest { + @Test + void scope() { + assertEquals(PythonCheck.CheckScope.TESTS, new SingleInvocationRuntimeExceptionCheck().scope()); + } + @Test void test() { PythonCheckVerifier.verify("src/test/resources/checks/tests/singleInvocationRuntimeException.py", new SingleInvocationRuntimeExceptionCheck()); From 135bc7ab424da6fb7bcc5351e990a3a3a0fb36ce Mon Sep 17 00:00:00 2001 From: rombirli Date: Thu, 2 Jul 2026 16:54:17 +0200 Subject: [PATCH 175/322] SONARPY-4306 Set S8714 scope to `CheckScope.TESTS` only GitOrigin-RevId: 4e9816db8649a2588f6e633565e7aa27062a5cac --- .../checks/tests/DedicatedExceptionAssertionCheck.java | 2 +- .../tests/DedicatedExceptionAssertionCheckTest.java | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/DedicatedExceptionAssertionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/DedicatedExceptionAssertionCheck.java index 4688b6661..7febee6af 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/DedicatedExceptionAssertionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/DedicatedExceptionAssertionCheck.java @@ -52,7 +52,7 @@ public void initialize(Context context) { @Override public CheckScope scope() { - return CheckScope.ALL; + return CheckScope.TESTS; } private static void checkTryStatement(SubscriptionContext ctx, TryStatement tryStatement) { diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/DedicatedExceptionAssertionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/DedicatedExceptionAssertionCheckTest.java index 76505896a..b20797b26 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/tests/DedicatedExceptionAssertionCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/DedicatedExceptionAssertionCheckTest.java @@ -20,17 +20,17 @@ import org.sonar.plugins.python.api.PythonCheck; import org.sonar.python.checks.utils.PythonCheckVerifier; -import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; class DedicatedExceptionAssertionCheckTest { @Test - void sample() { - PythonCheckVerifier.verify("src/test/resources/checks/tests/dedicatedExceptionAssertion.py", new DedicatedExceptionAssertionCheck()); + void scope() { + assertEquals(PythonCheck.CheckScope.TESTS, new DedicatedExceptionAssertionCheck().scope()); } @Test - void test_scope() { - assertThat(new DedicatedExceptionAssertionCheck().scope()).isEqualTo(PythonCheck.CheckScope.ALL); + void sample() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/dedicatedExceptionAssertion.py", new DedicatedExceptionAssertionCheck()); } } From 27ab2182bda659c20ec1b257c73f98711d4063a8 Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Mon, 6 Jul 2026 10:49:49 +0200 Subject: [PATCH 176/322] SONARPY-4336 Create rule S8966: pydantic-core serialization calls should provide fallback handlers (#1242) GitOrigin-RevId: bf40e7b945efa43fc2792dfac14b4b4a303fe586 --- .../python/checks/OpenSourceCheckList.java | 1 + ...ydanticCoreSerializationFallbackCheck.java | 79 +++++++++++++++ .../org/sonar/l10n/py/rules/python/S8966.html | 65 +++++++++++++ .../org/sonar/l10n/py/rules/python/S8966.json | 25 +++++ .../py/rules/python/Sonar_way_profile.json | 3 +- ...ticCoreSerializationFallbackCheckTest.java | 30 ++++++ .../pydanticCoreSerializationFallback.py | 81 ++++++++++++++++ .../custom_protobuf/pydantic_core.protobuf | 97 +++++++++++++++++++ .../checksums/custom.checksum | 4 +- .../custom/pydantic_core/__init__.pyi | 41 ++++++++ .../tests/test_serializers.py | 2 +- 11 files changed, 424 insertions(+), 4 deletions(-) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/PydanticCoreSerializationFallbackCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8966.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8966.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/PydanticCoreSerializationFallbackCheckTest.java create mode 100644 python-checks/src/test/resources/checks/pydanticCoreSerializationFallback.py create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic_core.protobuf create mode 100644 python-frontend/typeshed_serializer/resources/custom/pydantic_core/__init__.pyi diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 593722259..75226f41d 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -378,6 +378,7 @@ public Stream> getChecks() { PublicApiIsSecuritySensitiveCheck.class, PubliclyWritableDirectoriesCheck.class, PublicNetworkAccessToCloudResourcesCheck.class, + PydanticCoreSerializationFallbackCheck.class, PydanticOptionalFieldDefaultCheck.class, PyTorchDataLoaderNumWorkersCheck.class, PytzTimeZoneInDatetimeConstructorCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/PydanticCoreSerializationFallbackCheck.java b/python-checks/src/main/java/org/sonar/python/checks/PydanticCoreSerializationFallbackCheck.java new file mode 100644 index 000000000..785ea86f4 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/PydanticCoreSerializationFallbackCheck.java @@ -0,0 +1,79 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.tree.TreeUtils; + +@Rule(key = "S8966") +public class PydanticCoreSerializationFallbackCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Add a \"fallback\" parameter to this pydantic-core serialization call."; + private static final String FALLBACK_KEYWORD = "fallback"; + + private static final TypeMatcher SERIALIZATION_CALL_MATCHER = TypeMatchers.any( + TypeMatchers.isType("pydantic_core.to_json"), + TypeMatchers.isType("pydantic_core.to_jsonable_python")); + + private static final TypeMatcher IS_PYDANTIC_BASE_MODEL_INSTANCE = TypeMatchers.isObjectInstanceOf("pydantic.BaseModel"); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, PydanticCoreSerializationFallbackCheck::checkCall); + } + + private static void checkCall(SubscriptionContext ctx) { + CallExpression callExpression = (CallExpression) ctx.syntaxNode(); + if (!SERIALIZATION_CALL_MATCHER.isTrueFor(callExpression.callee(), ctx)) { + return; + } + + var arguments = callExpression.arguments(); + if (arguments.isEmpty()) { + return; + } + + var firstArg = arguments.get(0); + if (!(firstArg instanceof RegularArgument regularArgument)) { + return; + } + + if (isFirstArgumentPydanticBaseModelInstance(regularArgument, ctx)) { + return; + } + + if (TreeUtils.argumentByKeyword(FALLBACK_KEYWORD, callExpression.arguments()) != null) { + return; + } + + ctx.addIssue(callExpression.callee(), MESSAGE); + } + + private static boolean isFirstArgumentPydanticBaseModelInstance(RegularArgument firstArg, SubscriptionContext ctx) { + if (firstArg.keywordArgument() == null) { + return !IS_PYDANTIC_BASE_MODEL_INSTANCE.evaluateFor(firstArg.expression(), ctx).isFalse(); + } + return false; + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8966.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8966.html new file mode 100644 index 000000000..f4975352b --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8966.html @@ -0,0 +1,65 @@ +

              This rule raises an issue when calling serialization or data conversion functions without specifying a fallback parameter.

              +

              In Python, this specifically applies to the pydantic_core.to_json(), and pydantic_core.to_jsonable_python() +functions.

              +

              Why is this an issue?

              +

              When serializing data, encountering an unknown or custom type will cause a serialization error if no fallback handler is provided. This happens +because serialization mechanisms don’t know how to convert types they haven’t been explicitly configured to handle.

              +

              Without a fallback mechanism, your application will crash at runtime when it attempts to serialize unexpected data. This is particularly +problematic in production environments where:

              +
                +
              • Data structures may evolve over time
              • +
              • Third-party libraries may introduce new types
              • +
              • User input may contain unexpected custom objects
              • +
              • Debugging serialization failures becomes difficult
              • +
              +

              By providing a fallback handler, you create a safety net that prevents crashes and allows your application to handle unknown types gracefully, even +if the result isn’t perfect.

              +

              Exceptions

              +

              Instances of pydantic.BaseModel and its subclasses are natively serializable by pydantic-core, provided their +model_config does not set arbitrary_types_allowed = True. Calling to_json or to_jsonable_python on +such objects without a fallback is safe and will not raise a PydanticSerializationError.

              +

              What is the potential impact?

              +

              Without a fallback handler, the application will raise an unhandled serialization exception when attempting to serialize unknown types. This leads +to:

              +
                +
              • runtime crashes: The application terminates unexpectedly when encountering unsupported types
              • +
              • poor user experience: Users may lose data or see error messages instead of completed operations
              • +
              • difficult debugging: Identifying which specific object caused the serialization failure requires examining stack traces
              • +
              • reduced application resilience: The system becomes fragile and sensitive to data variations
              • +
              +

              How to fix it

              +

              Add a fallback parameter to your pydantic-core serialization calls. The fallback function receives the unknown object and should +return a serializable representation. A simple approach is to convert the object to a string using str().

              +

              Code examples

              +

              Noncompliant code example

              +
              +from pydantic_core import to_json
              +
              +class CustomObject:
              +    def __init__(self, value):
              +        self.value = value
              +
              +data = {"key": CustomObject(42)}
              +result = to_json(data)  # Noncompliant: raises PydanticSerializationError
              +
              +

              Compliant solution

              +
              +from pydantic_core import to_json
              +
              +class CustomObject:
              +    def __init__(self, value):
              +        self.value = value
              +
              +def handle_unknown(obj):
              +    return str(obj)
              +
              +data = {"key": CustomObject(42)}
              +result = to_json(data, fallback=handle_unknown)
              +
              +

              Resources

              +

              Documentation

              +
                +
              • Pydantic Documentation - to_json
              • +
              + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8966.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8966.json new file mode 100644 index 000000000..e5fb5506c --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8966.json @@ -0,0 +1,25 @@ +{ + "title": "pydantic-core serialization calls should provide fallback handlers", + "type": "BUG", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "pydantic", + "serialization", + "pitfall" + ], + "defaultSeverity": "Critical", + "ruleSpecification": "RSPEC-8966", + "sqKey": "S8966", + "scope": "All", + "quickfix": "unknown", + "code": { + "impacts": { + "RELIABILITY": "HIGH" + }, + "attribute": "COMPLETE" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 0bd91045e..5e7544891 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -363,6 +363,7 @@ "S8903", "S8904", "S8905", - "S8906" + "S8906", + "S8966" ] } diff --git a/python-checks/src/test/java/org/sonar/python/checks/PydanticCoreSerializationFallbackCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/PydanticCoreSerializationFallbackCheckTest.java new file mode 100644 index 000000000..c4e5e0184 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/PydanticCoreSerializationFallbackCheckTest.java @@ -0,0 +1,30 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.junit.jupiter.api.Test; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class PydanticCoreSerializationFallbackCheckTest { + @Test + void test() { + PythonCheckVerifier.verify( + "src/test/resources/checks/pydanticCoreSerializationFallback.py", + new PydanticCoreSerializationFallbackCheck() + ); + } +} diff --git a/python-checks/src/test/resources/checks/pydanticCoreSerializationFallback.py b/python-checks/src/test/resources/checks/pydanticCoreSerializationFallback.py new file mode 100644 index 000000000..ead00d45f --- /dev/null +++ b/python-checks/src/test/resources/checks/pydanticCoreSerializationFallback.py @@ -0,0 +1,81 @@ +import pydantic_core +from pydantic_core import to_json, to_jsonable_python + + +class CustomObject: + def __init__(self, value): + self.value = value + + +def handle_unknown(obj): + return str(obj) + +class CustomObject2(Unknown): + def __init__(self, value): + self.value = value + + +data = {"key": CustomObject(42)} + +# ===================== +# NON-COMPLIANT CASES +# ===================== + +result = to_json(data) # Noncompliant {{Add a "fallback" parameter to this pydantic-core serialization call.}} +result = to_jsonable_python(data) # Noncompliant + +result = to_json(data, indent=2) # Noncompliant +result = to_jsonable_python(data, exclude=None) # Noncompliant + +result = pydantic_core.to_json(data) # Noncompliant +result = pydantic_core.to_jsonable_python(data) # Noncompliant + +result = pydantic_core.to_json(CustomObject(42)) # Noncompliant + +# ===================== +# COMPLIANT CASES +# ===================== + +result = to_json(data, fallback=handle_unknown) +result = to_jsonable_python(data, fallback=handle_unknown) + +result = to_json(data, indent=2, fallback=handle_unknown) +result = to_jsonable_python(data, exclude=None, fallback=str) + +result = pydantic_core.to_json(data, fallback=handle_unknown) +result = pydantic_core.to_jsonable_python(data, fallback=handle_unknown) + +result = pydantic_core.to_jsonable_python(CustomObject2(42)) + +result = pydantic_core.to_json() +def foo(**kwargs): + result = pydantic_core.to_json(**kwargs) # Coverage + +# ===================== +# UNRELATED CALLS - should not trigger +# ===================== + +import other_lib +result = other_lib.to_json(data) + +# ===================== +# PYDANTIC BASEMODEL EXCEPTION - should not trigger +# ===================== + +from pydantic import BaseModel + +class MyModel(BaseModel): + value: int + +class MySubModel(MyModel): + name: str + +model = MyModel(value=42) +sub_model = MySubModel(value=1, name="test") + +result = to_json(model) # Compliant: pydantic.BaseModel instance +result = to_jsonable_python(model) # Compliant: pydantic.BaseModel instance +result = to_json(sub_model) # Compliant: subclass of pydantic.BaseModel +result = to_jsonable_python(sub_model) # Compliant: subclass of pydantic.BaseModel +result = pydantic_core.to_json(model) # Compliant: pydantic.BaseModel instance +result = pydantic_core.to_jsonable_python(model) # Compliant: pydantic.BaseModel instance diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic_core.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic_core.protobuf new file mode 100644 index 000000000..ef1768cf4 --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic_core.protobuf @@ -0,0 +1,97 @@ + + pydantic_core +to_jsonpydantic_core.to_json" +builtins.bytes"builtins.bytes* +value +Any*R +indentD +Union[builtins.int,None] + builtins.int" builtins.int +None *2 + ensure_ascii + builtins.bool" builtins.bool * +include +Any * +exclude +Any *. +by_alias + builtins.bool" builtins.bool *2 + exclude_none + builtins.bool" builtins.bool *0 + +round_trip + builtins.bool" builtins.bool *2 +timedelta_mode + builtins.str" builtins.str *1 + temporal_mode + builtins.str" builtins.str *. + +bytes_mode + builtins.str" builtins.str *0 + inf_nan_mode + builtins.str" builtins.str *7 +serialize_unknown + builtins.bool" builtins.bool * +fallback ++Union[CallableType[builtins.function],None]K +CallableType[builtins.function]& +builtins.function"builtins.function +None *6 +serialize_as_any + builtins.bool" builtins.bool *h +polymorphic_serializationG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None *5 +context& +Union[Any,None] +Any +None  +to_jsonable_python pydantic_core.to_jsonable_python" +Any* +value +Any* +include +Any * +exclude +Any *. +by_alias + builtins.bool" builtins.bool *2 + exclude_none + builtins.bool" builtins.bool *0 + +round_trip + builtins.bool" builtins.bool *2 +timedelta_mode + builtins.str" builtins.str *1 + temporal_mode + builtins.str" builtins.str *. + +bytes_mode + builtins.str" builtins.str *0 + inf_nan_mode + builtins.str" builtins.str *7 +serialize_unknown + builtins.bool" builtins.bool * +fallback ++Union[CallableType[builtins.function],None]K +CallableType[builtins.function]& +builtins.function"builtins.function +None *6 +serialize_as_any + builtins.bool" builtins.bool *h +polymorphic_serializationG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None *5 +context& +Union[Any,None] +Any +None *n +__path__pydantic_core.__path__J +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list* +__annotations__pydantic_core.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/typeshed_serializer/checksums/custom.checksum b/python-frontend/typeshed_serializer/checksums/custom.checksum index 0ba19f1e3..2cb234459 100644 --- a/python-frontend/typeshed_serializer/checksums/custom.checksum +++ b/python-frontend/typeshed_serializer/checksums/custom.checksum @@ -1,2 +1,2 @@ -231f65c4b64676dc0b057a3302c8c8634d301b44cbcc30d59f482443e41c2b76 -07c11cd37bb006167a8f8aa98f17625b6463e4449f2fee3c1dd5faf820becf34 \ No newline at end of file +02d6a6bdef0392652e6530c1d89de9edd38493695688db5e5a8b4e589ab9192d +57b8893adf40057e98a45e8067e1304cdf8839bfecff197a2d52c8456c8f19fa \ No newline at end of file diff --git a/python-frontend/typeshed_serializer/resources/custom/pydantic_core/__init__.pyi b/python-frontend/typeshed_serializer/resources/custom/pydantic_core/__init__.pyi new file mode 100644 index 000000000..72cfb6919 --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/pydantic_core/__init__.pyi @@ -0,0 +1,41 @@ +from typing import Any, Callable, Optional + +def to_json( + value: Any, + *, + indent: Optional[int] = ..., + ensure_ascii: bool = ..., + include: Any = ..., + exclude: Any = ..., + by_alias: bool = ..., + exclude_none: bool = ..., + round_trip: bool = ..., + timedelta_mode: str = ..., + temporal_mode: str = ..., + bytes_mode: str = ..., + inf_nan_mode: str = ..., + serialize_unknown: bool = ..., + fallback: Optional[Callable[..., Any]] = ..., + serialize_as_any: bool = ..., + polymorphic_serialization: Optional[bool] = ..., + context: Optional[Any] = ..., +) -> bytes: ... + +def to_jsonable_python( + value: Any, + *, + include: Any = ..., + exclude: Any = ..., + by_alias: bool = ..., + exclude_none: bool = ..., + round_trip: bool = ..., + timedelta_mode: str = ..., + temporal_mode: str = ..., + bytes_mode: str = ..., + inf_nan_mode: str = ..., + serialize_unknown: bool = ..., + fallback: Optional[Callable[..., Any]] = ..., + serialize_as_any: bool = ..., + polymorphic_serialization: Optional[bool] = ..., + context: Optional[Any] = ..., +) -> Any: ... diff --git a/python-frontend/typeshed_serializer/tests/test_serializers.py b/python-frontend/typeshed_serializer/tests/test_serializers.py index cce7678b9..d3ac09a4c 100644 --- a/python-frontend/typeshed_serializer/tests/test_serializers.py +++ b/python-frontend/typeshed_serializer/tests/test_serializers.py @@ -74,7 +74,7 @@ def test_custom_stubs_serializer(typeshed_custom_stubs): custom_stubs_serializer.serialize() assert custom_stubs_serializer.get_build_result.call_count == 1 # Not every files from "typeshed_custom_stubs" build are serialized, as some are builtins - assert symbols.save_module.call_count == 364 + assert symbols.save_module.call_count == 365 def test_importer_serializer(): From 53663739a205e80d0b98c0e1444d54444bfb94dc Mon Sep 17 00:00:00 2001 From: rombirli Date: Mon, 6 Jul 2026 11:13:19 +0200 Subject: [PATCH 177/322] SONARPY-4303 S5976 set scope to all GitOrigin-RevId: ca995d206885e82d34e70fe0b7d9879954d5cf7e --- .../checks/tests/GroupSimilarTestsParameterizedCheck.java | 2 +- .../checks/tests/GroupSimilarTestsParameterizedCheckTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/GroupSimilarTestsParameterizedCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/GroupSimilarTestsParameterizedCheck.java index e3c5c6531..e7e4926d2 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/GroupSimilarTestsParameterizedCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/GroupSimilarTestsParameterizedCheck.java @@ -56,7 +56,7 @@ public void initialize(Context context) { @Override public CheckScope scope() { - return CheckScope.TESTS; + return CheckScope.ALL; } private static void checkFileInput(SubscriptionContext ctx, FileInput fileInput) { diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/GroupSimilarTestsParameterizedCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/GroupSimilarTestsParameterizedCheckTest.java index 879cf848a..926587ef2 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/tests/GroupSimilarTestsParameterizedCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/GroupSimilarTestsParameterizedCheckTest.java @@ -65,7 +65,7 @@ void testEmptyFile() { @Test void scope() { - assertEquals(PythonCheck.CheckScope.TESTS, new GroupSimilarTestsParameterizedCheck().scope()); + assertEquals(PythonCheck.CheckScope.ALL, new GroupSimilarTestsParameterizedCheck().scope()); } @Test From 21de361d58debd77ad39b7648ed3818d41b5f1d3 Mon Sep 17 00:00:00 2001 From: rombirli Date: Mon, 6 Jul 2026 11:14:09 +0200 Subject: [PATCH 178/322] SONARPY-4302 S5958 set scope to all GitOrigin-RevId: ce8a752040ee635f262f5912319203d1cfb9d889 --- .../python/checks/tests/SpecificExceptionAssertionCheck.java | 2 +- .../checks/tests/SpecificExceptionAssertionCheckTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/SpecificExceptionAssertionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/SpecificExceptionAssertionCheck.java index f55828361..b4c103c3c 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/SpecificExceptionAssertionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/SpecificExceptionAssertionCheck.java @@ -51,7 +51,7 @@ public void initialize(Context context) { @Override public CheckScope scope() { - return CheckScope.TESTS; + return CheckScope.ALL; } private static void checkWithStatement(SubscriptionContext ctx, WithStatement withStatement) { diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/SpecificExceptionAssertionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/SpecificExceptionAssertionCheckTest.java index 17fb1de66..d7c7544d2 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/tests/SpecificExceptionAssertionCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/SpecificExceptionAssertionCheckTest.java @@ -26,7 +26,7 @@ class SpecificExceptionAssertionCheckTest { @Test void scope() { - assertEquals(PythonCheck.CheckScope.TESTS, new SpecificExceptionAssertionCheck().scope()); + assertEquals(PythonCheck.CheckScope.ALL, new SpecificExceptionAssertionCheck().scope()); } @Test From 22e6822d5bf2cb7017881d8348fca78eacbd5766 Mon Sep 17 00:00:00 2001 From: rombirli Date: Mon, 6 Jul 2026 11:15:30 +0200 Subject: [PATCH 179/322] SONARPY-4305 S5778 set scope to all GitOrigin-RevId: e06f5e8d59486566f96bd4d27580cade16da24cd --- .../checks/tests/SingleInvocationRuntimeExceptionCheck.java | 2 +- .../checks/tests/SingleInvocationRuntimeExceptionCheckTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheck.java index b74387226..171befae5 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheck.java @@ -64,7 +64,7 @@ public void initialize(Context context) { @Override public CheckScope scope() { - return CheckScope.TESTS; + return CheckScope.ALL; } private static void checkWithStatement(SubscriptionContext ctx, WithStatement withStatement) { diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheckTest.java index f03ff29f2..1c20ecd7e 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheckTest.java @@ -26,7 +26,7 @@ class SingleInvocationRuntimeExceptionCheckTest { @Test void scope() { - assertEquals(PythonCheck.CheckScope.TESTS, new SingleInvocationRuntimeExceptionCheck().scope()); + assertEquals(PythonCheck.CheckScope.ALL, new SingleInvocationRuntimeExceptionCheck().scope()); } @Test From 65bb2070702c3148108e77756da0d84e11afb426 Mon Sep 17 00:00:00 2001 From: rombirli Date: Mon, 6 Jul 2026 11:16:16 +0200 Subject: [PATCH 180/322] SONARPY-4306 S8714 set scope to all GitOrigin-RevId: e1c03d967e48fdc44ba73e2f1af5a5d05cdc545c --- .../python/checks/tests/DedicatedExceptionAssertionCheck.java | 2 +- .../checks/tests/DedicatedExceptionAssertionCheckTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/DedicatedExceptionAssertionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/DedicatedExceptionAssertionCheck.java index 7febee6af..4688b6661 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/DedicatedExceptionAssertionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/DedicatedExceptionAssertionCheck.java @@ -52,7 +52,7 @@ public void initialize(Context context) { @Override public CheckScope scope() { - return CheckScope.TESTS; + return CheckScope.ALL; } private static void checkTryStatement(SubscriptionContext ctx, TryStatement tryStatement) { diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/DedicatedExceptionAssertionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/DedicatedExceptionAssertionCheckTest.java index b20797b26..127afb023 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/tests/DedicatedExceptionAssertionCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/DedicatedExceptionAssertionCheckTest.java @@ -26,7 +26,7 @@ class DedicatedExceptionAssertionCheckTest { @Test void scope() { - assertEquals(PythonCheck.CheckScope.TESTS, new DedicatedExceptionAssertionCheck().scope()); + assertEquals(PythonCheck.CheckScope.ALL, new DedicatedExceptionAssertionCheck().scope()); } @Test From d90c0eee444b5b0a410ad5290916505eca3935b7 Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Tue, 7 Jul 2026 14:52:07 +0200 Subject: [PATCH 181/322] SONARPY-4316 Port S3415 to python: Assertion arguments should be passed in the correct order (#1261) GitOrigin-RevId: 40a67bf6be983498a25765b42ed1abb4635bbb2a --- .../quickfix/PythonQuickFixVerifier.java | 74 ++-- .../quickfix/PythonQuickFixVerifierTest.java | 134 +++++++ .../python/checks/OpenSourceCheckList.java | 2 + .../tests/AssertionArgumentOrderCheck.java | 347 ++++++++++++++++++ .../org/sonar/l10n/py/rules/python/S3415.html | 107 ++++++ .../org/sonar/l10n/py/rules/python/S3415.json | 24 ++ .../py/rules/python/Sonar_way_profile.json | 1 + .../AssertionArgumentOrderCheckTest.java | 281 ++++++++++++++ .../tests/test_assertionArgumentOrder.py | 79 ++++ ...test_assertionArgumentOrderExpectedLeft.py | 36 ++ .../types/custom_protobuf/assertpy.protobuf | 38 ++ .../types/custom_protobuf/pytest.protobuf | 18 + .../checksums/custom.checksum | 4 +- .../resources/custom/assertpy/__init__.pyi | 9 + .../resources/custom/pytest/__init__.pyi | 5 + .../tests/test_serializers.py | 11 +- 16 files changed, 1143 insertions(+), 27 deletions(-) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/tests/AssertionArgumentOrderCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S3415.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S3415.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/tests/AssertionArgumentOrderCheckTest.java create mode 100644 python-checks/src/test/resources/checks/tests/test_assertionArgumentOrder.py create mode 100644 python-checks/src/test/resources/checks/tests/test_assertionArgumentOrderExpectedLeft.py create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/assertpy.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pytest.protobuf create mode 100644 python-frontend/typeshed_serializer/resources/custom/assertpy/__init__.pyi create mode 100644 python-frontend/typeshed_serializer/resources/custom/pytest/__init__.pyi diff --git a/python-checks-testkit/src/main/java/org/sonar/python/checks/quickfix/PythonQuickFixVerifier.java b/python-checks-testkit/src/main/java/org/sonar/python/checks/quickfix/PythonQuickFixVerifier.java index 1cd9bbdba..41de242b1 100644 --- a/python-checks-testkit/src/main/java/org/sonar/python/checks/quickfix/PythonQuickFixVerifier.java +++ b/python-checks-testkit/src/main/java/org/sonar/python/checks/quickfix/PythonQuickFixVerifier.java @@ -22,6 +22,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; +import java.util.Map; import java.util.function.Function; import java.util.stream.Stream; import org.sonar.api.SonarProduct; @@ -33,6 +34,7 @@ import org.sonar.plugins.python.api.quickfix.PythonQuickFix; import org.sonar.plugins.python.api.quickfix.PythonTextEdit; import org.sonar.python.SubscriptionVisitor; +import org.sonar.python.TestPythonVisitorRunner; import org.sonar.python.caching.CacheContextImpl; import org.sonar.python.parser.PythonParser; import org.sonar.python.semantic.ProjectLevelSymbolTable; @@ -41,8 +43,11 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatCode; +import static org.sonar.python.semantic.SymbolUtils.pythonPackageName; public class PythonQuickFixVerifier { + private static final String SEMANTIC_BASE_DIR = "/tmp/pythonQuickFixVerifier"; + private PythonQuickFixVerifier() { } @@ -58,6 +63,18 @@ public static void verifyQuickFixMessages(PythonCheck check, String codeWithIssu verifyQuickFixMessages(PythonQuickFixVerifier::createPythonVisitorContext, check, codeWithIssue, expectedMessages); } + public static void verifySemantic(PythonCheck check, String path, String codeWithIssue, String... codesFixed) { + verify(code -> createSemanticVisitorContext(path, code), check, false, codeWithIssue, codesFixed); + } + + public static void verifySemanticQuickFixMessages(PythonCheck check, String path, String codeWithIssue, String... expectedMessages) { + verifyQuickFixMessages(code -> createSemanticVisitorContext(path, code), check, codeWithIssue, expectedMessages); + } + + public static void verifySemanticNoQuickFixes(PythonCheck check, String path, String codeWithIssue) { + verifyNoQuickFixes(code -> createSemanticVisitorContext(path, code), check, codeWithIssue); + } + public static void verifyIPython(PythonCheck check, String codeWithIssue, String... codesFixed) { verify(PythonQuickFixVerifier::createIPythonVisitorContext, check, true, codeWithIssue, codesFixed); } @@ -154,6 +171,13 @@ private static PythonVisitorContext createIPythonVisitorContext(String code) { return createVisitorContext(PythonParser.createIPythonParser(), new IPythonTreeMaker(), code); } + private static PythonVisitorContext createSemanticVisitorContext(String path, String code) { + var pythonFile = new TestPythonVisitorRunner.MockPythonFile(SEMANTIC_BASE_DIR, path, code); + ProjectLevelSymbolTable globalSymbols = TestPythonVisitorRunner.globalSymbols(Map.of(path, code), SEMANTIC_BASE_DIR); + String packageName = pythonPackageName(pythonFile.file(), SEMANTIC_BASE_DIR); + return TestPythonVisitorRunner.createContext(pythonFile, null, packageName, globalSymbols, CacheContextImpl.dummyCache()); + } + private static PythonVisitorContext createVisitorContext(PythonParser parser, PythonTreeMaker treeMaker, String code) { var pythonFile = new PythonQuickFixFile(code); var astNode = parser.parse(pythonFile.content()); @@ -206,30 +230,34 @@ private static void checkNoCollision(List pythonTextEdits) throw // we should return false private static boolean oneEnclosedByTheOther(PythonTextEdit toCheck, PythonTextEdit reference) { if (onSameLine(toCheck, reference)) { - // If on same line, we need to check that the bounds of toCheck are not contained in reference bounds - return !(toCheck.endLineOffset() < reference.startLineOffset() || toCheck.startLineOffset() > reference.endLineOffset()); - } else { - if (compactOnDifferentLines(toCheck, reference)) { - return false; - } else if (isCompact(toCheck)) { - return isSecondInFirst(toCheck, reference); - } else if (isCompact(reference)) { - return isSecondInFirst(reference, toCheck); - } else { - // Both edits exploded on different lines - if (noLineIntersection(toCheck, reference)) { - return false; - } else { - // There is an intersection between edits, only need to check valid case - if (reference.startLine() == toCheck.endLine()) { - return toCheck.endLineOffset() > reference.startLineOffset(); - } else if (reference.endLine() == toCheck.startLine()) { - return reference.endLineOffset() > toCheck.startLineOffset(); - } - } - } + return sameLineIntersection(toCheck, reference); + } + if (compactOnDifferentLines(toCheck, reference)) { + return false; + } + if (isCompact(toCheck)) { + return isSecondInFirst(toCheck, reference); + } + if (isCompact(reference)) { + return isSecondInFirst(reference, toCheck); + } + return explodedEditsIntersect(toCheck, reference); + } + + private static boolean sameLineIntersection(PythonTextEdit toCheck, PythonTextEdit reference) { + return !(toCheck.endLineOffset() < reference.startLineOffset() || toCheck.startLineOffset() > reference.endLineOffset()); + } + + private static boolean explodedEditsIntersect(PythonTextEdit toCheck, PythonTextEdit reference) { + if (noLineIntersection(toCheck, reference)) { + return false; + } + if (reference.startLine() == toCheck.endLine()) { + return toCheck.endLineOffset() > reference.startLineOffset(); + } + if (reference.endLine() == toCheck.startLine()) { + return reference.endLineOffset() > toCheck.startLineOffset(); } - // All other cases are invalid and will cause an intersection return true; } diff --git a/python-checks-testkit/src/test/java/org/sonar/python/checks/quickfix/PythonQuickFixVerifierTest.java b/python-checks-testkit/src/test/java/org/sonar/python/checks/quickfix/PythonQuickFixVerifierTest.java index cf0e56191..655cde231 100644 --- a/python-checks-testkit/src/test/java/org/sonar/python/checks/quickfix/PythonQuickFixVerifierTest.java +++ b/python-checks-testkit/src/test/java/org/sonar/python/checks/quickfix/PythonQuickFixVerifierTest.java @@ -16,6 +16,7 @@ */ package org.sonar.python.checks.quickfix; +import java.lang.reflect.Method; import org.junit.jupiter.api.Test; import org.opentest4j.AssertionFailedError; import org.sonar.plugins.python.api.PythonCheck; @@ -80,6 +81,16 @@ void test_verify() { PythonQuickFixVerifier.verify(new SimpleCheck(), "a=10", "a!=10"); } + @Test + void test_verify_no_quickfixes_wrapper() { + PythonQuickFixVerifier.verifyNoQuickFixes(new SimpleCheckNoQuickFix(), "a=10"); + } + + @Test + void test_verify_quick_fix_messages_wrapper() { + PythonQuickFixVerifier.verifyQuickFixMessages(new SimpleCheck(), "a=10", "Add '!' here."); + } + @Test void test_verify_invalid_after() { var expectedMsg = """ @@ -99,11 +110,101 @@ void verifyIPython() { PythonQuickFixVerifier.verifyIPythonQuickFixMessages(new SimpleCheck(), "a=10\n?a", "Add '!' here."); } + @Test + void verifyIPythonNoQuickFixes() { + PythonQuickFixVerifier.verifyIPythonNoQuickFixes(new SimpleCheckNoQuickFix(), "a=10\n?a"); + } + @Test void test_multiple_lines() { PythonQuickFixVerifier.verify(new SimpleCheck(), "b \na=10", "b \na!=10"); } + @Test + void verify_semantic() { + PythonQuickFixVerifier.verifySemantic(new SimpleCheck(), "pkg/test_file.py", "a=10", "a!=10"); + PythonQuickFixVerifier.verifySemanticQuickFixMessages(new SimpleCheck(), "pkg/test_file.py", "a=10", "Add '!' here."); + } + + @Test + void verify_semantic_no_quickfix() { + PythonQuickFixVerifier.verifySemanticNoQuickFixes(new SimpleCheckNoQuickFix(), "pkg/test_file.py", "a=10"); + } + + @Test + void test_multiple_text_edits_are_sorted_and_apply_on_windows_line_endings() { + PythonQuickFixVerifier.verify(new MultipleEditsCheck(), "a=10\r\nb=3", "a!=10\r\nb!=3"); + } + + @Test + void test_colliding_multiple_text_edits_fail() { + var check = new CollidingEditsCheck(); + assertThatThrownBy(() -> PythonQuickFixVerifier.verify(check, "a=10", "")) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("There is a collision between the range of the quickfixes."); + } + + @Test + void collision_helpers_cover_remaining_branches() throws Exception { + Method oneEnclosedByTheOther = PythonQuickFixVerifier.class.getDeclaredMethod("oneEnclosedByTheOther", PythonTextEdit.class, PythonTextEdit.class); + Method sameLineIntersection = PythonQuickFixVerifier.class.getDeclaredMethod("sameLineIntersection", PythonTextEdit.class, PythonTextEdit.class); + Method explodedEditsIntersect = PythonQuickFixVerifier.class.getDeclaredMethod("explodedEditsIntersect", PythonTextEdit.class, PythonTextEdit.class); + Method onSameLine = PythonQuickFixVerifier.class.getDeclaredMethod("onSameLine", PythonTextEdit.class, PythonTextEdit.class); + Method compactOnDifferentLines = PythonQuickFixVerifier.class.getDeclaredMethod("compactOnDifferentLines", PythonTextEdit.class, PythonTextEdit.class); + Method isCompact = PythonQuickFixVerifier.class.getDeclaredMethod("isCompact", PythonTextEdit.class); + Method isSecondInFirst = PythonQuickFixVerifier.class.getDeclaredMethod("isSecondInFirst", PythonTextEdit.class, PythonTextEdit.class); + Method noLineIntersection = PythonQuickFixVerifier.class.getDeclaredMethod("noLineIntersection", PythonTextEdit.class, PythonTextEdit.class); + oneEnclosedByTheOther.setAccessible(true); + sameLineIntersection.setAccessible(true); + explodedEditsIntersect.setAccessible(true); + onSameLine.setAccessible(true); + compactOnDifferentLines.setAccessible(true); + isCompact.setAccessible(true); + isSecondInFirst.setAccessible(true); + noLineIntersection.setAccessible(true); + + PythonTextEdit sameLineLeft = new PythonTextEdit("", 1, 0, 1, 0); + PythonTextEdit sameLineRight = new PythonTextEdit("", 1, 1, 1, 1); + PythonTextEdit sameLineOverlap = new PythonTextEdit("", 1, 0, 1, 2); + assertBoolean(sameLineIntersection, false, sameLineLeft, sameLineRight); + assertBoolean(sameLineIntersection, true, sameLineOverlap, sameLineRight); + assertBoolean(onSameLine, true, sameLineOverlap, sameLineRight); + + PythonTextEdit compact = new PythonTextEdit("", 2, 0, 2, 1); + PythonTextEdit compactSameStart = new PythonTextEdit("", 1, 1, 1, 3); + PythonTextEdit compactSameEnd = new PythonTextEdit("", 3, 0, 3, 2); + PythonTextEdit compactOtherLine = new PythonTextEdit("", 5, 0, 5, 1); + PythonTextEdit exploded = new PythonTextEdit("", 1, 0, 3, 0); + PythonTextEdit explodedSameEnd = new PythonTextEdit("", 1, 0, 3, 3); + PythonTextEdit separate = new PythonTextEdit("", 4, 0, 5, 0); + PythonTextEdit touchingEnd = new PythonTextEdit("", 2, 1, 4, 0); + PythonTextEdit crossingEnd = new PythonTextEdit("", 2, 0, 4, 0); + PythonTextEdit touchingStart = new PythonTextEdit("", 1, 0, 2, 1); + PythonTextEdit explodedEnclosing = new PythonTextEdit("", 1, 0, 4, 0); + PythonTextEdit explodedEnclosed = new PythonTextEdit("", 2, 0, 3, 0); + + assertBoolean(compactOnDifferentLines, true, compact, compactOtherLine); + assertBoolean(isCompact, true, compact); + assertBoolean(isCompact, false, exploded); + assertBoolean(isSecondInFirst, true, compactSameStart, exploded); + assertBoolean(isSecondInFirst, true, compactSameEnd, explodedSameEnd); + assertBoolean(isSecondInFirst, false, compact, separate); + assertBoolean(noLineIntersection, true, exploded, separate); + assertBoolean(noLineIntersection, false, exploded, touchingEnd); + assertBoolean(oneEnclosedByTheOther, true, sameLineOverlap, sameLineRight); + assertBoolean(oneEnclosedByTheOther, false, compact, compactOtherLine); + assertBoolean(oneEnclosedByTheOther, true, compactSameStart, exploded); + assertBoolean(oneEnclosedByTheOther, true, explodedSameEnd, compactSameEnd); + assertBoolean(oneEnclosedByTheOther, true, explodedEnclosing, explodedEnclosed); + assertBoolean(explodedEditsIntersect, false, exploded, separate); + assertBoolean(explodedEditsIntersect, true, touchingStart, crossingEnd); + assertBoolean(explodedEditsIntersect, true, explodedEnclosing, explodedEnclosed); + } + + private static void assertBoolean(Method method, boolean expected, Object... args) throws Exception { + org.assertj.core.api.Assertions.assertThat(method.invoke(null, args)).isEqualTo(expected); + } + private class SimpleCheck extends PythonSubscriptionCheck { @Override @@ -128,4 +229,37 @@ public void initialize(Context context) { context.registerSyntaxNodeConsumer(Tree.Kind.ASSIGNMENT_STMT, ctx -> ctx.addIssue(ctx.syntaxNode(), "")); } } + + private class MultipleEditsCheck extends PythonSubscriptionCheck { + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.ASSIGNMENT_STMT, ctx -> { + AssignmentStatement assignment = (AssignmentStatement) ctx.syntaxNode(); + if (assignment.firstToken().line() != 1) { + return; + } + PreciseIssue issue = ctx.addIssue(assignment.equalTokens().get(0), ""); + PythonQuickFix quickFix = PythonQuickFix.newQuickFix("Add '!' here.") + .addTextEdit(new PythonTextEdit("!", 2, 1, 2, 1)) + .addTextEdit(TextEditUtils.insertBefore(assignment.equalTokens().get(0), "!")) + .build(); + issue.addQuickFix(quickFix); + }); + } + } + + private class CollidingEditsCheck extends PythonSubscriptionCheck { + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.ASSIGNMENT_STMT, ctx -> { + AssignmentStatement assignment = (AssignmentStatement) ctx.syntaxNode(); + PreciseIssue issue = ctx.addIssue(assignment.equalTokens().get(0), ""); + PythonQuickFix quickFix = PythonQuickFix.newQuickFix("Broken quickfix") + .addTextEdit(new PythonTextEdit("!", 1, 1, 1, 1)) + .addTextEdit(new PythonTextEdit("!=", 1, 1, 1, 2)) + .build(); + issue.addQuickFix(quickFix); + }); + } + } } diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 75226f41d..4a203b8bd 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -93,6 +93,7 @@ import org.sonar.python.checks.tests.AssertAfterRaiseCheck; import org.sonar.python.checks.tests.AssertOnDissimilarTypesCheck; import org.sonar.python.checks.tests.AssertOnTupleLiteralCheck; +import org.sonar.python.checks.tests.AssertionArgumentOrderCheck; import org.sonar.python.checks.tests.DedicatedAssertionCheck; import org.sonar.python.checks.tests.DedicatedExceptionAssertionCheck; import org.sonar.python.checks.tests.GroupSimilarTestsParameterizedCheck; @@ -120,6 +121,7 @@ public Stream> getChecks() { AssertOnDissimilarTypesCheck.class, AssertAfterRaiseCheck.class, AssertOnTupleLiteralCheck.class, + AssertionArgumentOrderCheck.class, AsyncFunctionNotAsyncCheck.class, AsyncFunctionWithTimeoutCheck.class, AsyncioTaskNotStoredCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/AssertionArgumentOrderCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/AssertionArgumentOrderCheck.java new file mode 100644 index 000000000..254c5a490 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/AssertionArgumentOrderCheck.java @@ -0,0 +1,347 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import java.util.List; +import java.util.Optional; +import javax.annotation.Nullable; +import org.sonar.check.Rule; +import org.sonar.check.RuleProperty; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.TokenLocation; +import org.sonar.plugins.python.api.quickfix.PythonQuickFix; +import org.sonar.plugins.python.api.tree.Argument; +import org.sonar.plugins.python.api.tree.AssertStatement; +import org.sonar.plugins.python.api.tree.BinaryExpression; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.FunctionDef; +import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.QualifiedExpression; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.checks.utils.CheckUtils; +import org.sonar.python.checks.utils.Expressions; +import org.sonar.python.checks.utils.UnittestUtils; +import org.sonar.python.quickfix.TextEditUtils; +import org.sonar.python.tree.TreeUtils; + +@Rule(key = "S3415") +public class AssertionArgumentOrderCheck extends PythonSubscriptionCheck { + private static final boolean DEFAULT_EXPECTED_ON_RIGHT = true; + private static final String UNITTEST_MESSAGE = "Swap these 2 arguments so they are in the correct order: actual value, expected value."; + private static final String PYTEST_EXPECTED_ON_RIGHT_MESSAGE = "Swap these 2 sides so they are in the correct order: actual value, expected value."; + private static final String PYTEST_EXPECTED_ON_LEFT_MESSAGE = "Swap these 2 sides so they are in the correct order: expected value, actual value."; + private static final String ASSERTPY_MESSAGE = "Pass the actual value to \"assert_that\" and the expected value to \"is_equal_to\"."; + private static final String UNITTEST_QUICK_FIX_MESSAGE = "Swap the actual and expected arguments"; + private static final String PYTEST_QUICK_FIX_MESSAGE = "Swap the actual and expected operands"; + private static final String ASSERTPY_QUICK_FIX_MESSAGE = "Swap the actual and expected values"; + + private static final TypeMatcher UNITTEST_EQUALITY_ASSERTION_MATCHER = TypeMatchers.any( + TypeMatchers.isType("unittest.case.TestCase.assertEqual"), + TypeMatchers.isType("unittest.case.TestCase.assertNotEqual"), + TypeMatchers.isType("unittest.case.TestCase.assertAlmostEqual"), + TypeMatchers.isType("unittest.case.TestCase.assertNotAlmostEqual")); + private static final TypeMatcher UNITTEST_IDENTITY_ASSERTION_MATCHER = TypeMatchers.any( + TypeMatchers.isType("unittest.case.TestCase.assertIs"), + TypeMatchers.isType("unittest.case.TestCase.assertIsNot")); + private static final TypeMatcher PYTEST_APPROX_MATCHER = TypeMatchers.isType("pytest.approx"); + private static final TypeMatcher ASSERTPY_ASSERT_THAT_MATCHER = TypeMatchers.isType("assertpy.assert_that"); + private static final TypeMatcher ASSERTPY_IS_EQUAL_TO_MATCHER = TypeMatchers.isType("assertpy.AssertionBuilder.is_equal_to"); + + @RuleProperty( + key = "expectedOnRight", + description = "Whether the expected value should be on the right-hand side of pytest equality assertions.", + defaultValue = "" + DEFAULT_EXPECTED_ON_RIGHT) + public boolean expectedOnRight = DEFAULT_EXPECTED_ON_RIGHT; + + private record ParameterNames(String leftKeyword, String rightKeyword) { + } + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, ctx -> { + CallExpression callExpression = (CallExpression) ctx.syntaxNode(); + checkUnittestAssertion(ctx, callExpression); + checkAssertpyAssertion(ctx, callExpression); + }); + context.registerSyntaxNodeConsumer(Tree.Kind.ASSERT_STMT, ctx -> checkPytestAssertion(ctx, (AssertStatement) ctx.syntaxNode())); + } + + @Override + public CheckScope scope() { + return CheckScope.TESTS; + } + + private static void checkUnittestAssertion(SubscriptionContext ctx, CallExpression callExpression) { + if (!UnittestUtils.isWithinUnittestTestCase(callExpression)) { + return; + } + if (!(Expressions.removeParentheses(callExpression.callee()) instanceof QualifiedExpression qualifiedExpression) + || !CheckUtils.isSelf(qualifiedExpression.qualifier())) { + return; + } + + ParameterNames parameterNames = parameterNames(callExpression.callee(), ctx); + if (parameterNames == null) { + return; + } + + List arguments = callExpression.arguments(); + RegularArgument firstArg = TreeUtils.nthArgumentOrKeyword(0, parameterNames.leftKeyword(), arguments); + RegularArgument secondArg = TreeUtils.nthArgumentOrKeyword(1, parameterNames.rightKeyword(), arguments); + if (firstArg == null || secondArg == null) { + return; + } + + if (areInvertedForActualExpected(firstArg.expression(), secondArg.expression(), ctx)) { + var issue = ctx.addIssue(callExpression, UNITTEST_MESSAGE); + createSwapQuickFix(firstArg.expression(), secondArg.expression(), UNITTEST_QUICK_FIX_MESSAGE, ctx).ifPresent(issue::addQuickFix); + } + } + + private void checkPytestAssertion(SubscriptionContext ctx, AssertStatement assertStatement) { + if (!isPytestStyleTestFunction(ctx, assertStatement)) { + return; + } + + Expression condition = Expressions.removeParentheses(assertStatement.condition()); + if (!(condition instanceof BinaryExpression binaryExpression) || !"==".equals(binaryExpression.operator().value())) { + return; + } + + if (areInvertedForConfiguredPytestOrder(binaryExpression.leftOperand(), binaryExpression.rightOperand(), ctx)) { + var issue = ctx.addIssue(condition, pytestMessage()); + createPytestQuickFix(binaryExpression, ctx).ifPresent(issue::addQuickFix); + } + } + + private static void checkAssertpyAssertion(SubscriptionContext ctx, CallExpression callExpression) { + if (!isSupportedTestFunction(ctx, callExpression)) { + return; + } + if (!(Expressions.removeParentheses(callExpression.callee()) instanceof QualifiedExpression qualifiedExpression) + || !ASSERTPY_IS_EQUAL_TO_MATCHER.isTrueFor(callExpression.callee(), ctx)) { + return; + } + + CallExpression assertThatCall = originatingAssertThatCall(qualifiedExpression.qualifier(), ctx); + if (assertThatCall == null) { + return; + } + + RegularArgument actualArg = TreeUtils.nthArgumentOrKeyword(0, "val", assertThatCall.arguments()); + RegularArgument expectedArg = TreeUtils.nthArgumentOrKeyword(0, "other", callExpression.arguments()); + if (actualArg == null || expectedArg == null) { + return; + } + + if (areInvertedForActualExpected(actualArg.expression(), expectedArg.expression(), ctx)) { + var issue = ctx.addIssue(callExpression, ASSERTPY_MESSAGE); + createSwapQuickFix(actualArg.expression(), expectedArg.expression(), ASSERTPY_QUICK_FIX_MESSAGE, ctx).ifPresent(issue::addQuickFix); + } + } + + private Optional createPytestQuickFix(BinaryExpression binaryExpression, SubscriptionContext ctx) { + Expression actualOperand = expectedOnRight ? binaryExpression.leftOperand() : binaryExpression.rightOperand(); + Expression expectedOperand = expectedOnRight ? binaryExpression.rightOperand() : binaryExpression.leftOperand(); + CallExpression approxCall = asPytestApproxCall(expectedOperand, ctx); + if (approxCall == null) { + return createSwapQuickFix(binaryExpression.leftOperand(), binaryExpression.rightOperand(), PYTEST_QUICK_FIX_MESSAGE, ctx); + } + + RegularArgument approxExpectedArg = TreeUtils.nthArgumentOrKeyword(0, "expected", approxCall.arguments()); + if (approxExpectedArg == null) { + return Optional.empty(); + } + + String replacementForOperand = expressionText(approxExpectedArg.expression(), ctx); + String replacementForApproxExpectedArg = expressionText(actualOperand, ctx); + if (replacementForOperand == null || replacementForApproxExpectedArg == null) { + return Optional.empty(); + } + + return Optional.of(PythonQuickFix.newQuickFix(PYTEST_QUICK_FIX_MESSAGE) + .addTextEdit(TextEditUtils.replace(actualOperand, replacementForOperand)) + .addTextEdit(TextEditUtils.replace(approxExpectedArg.expression(), replacementForApproxExpectedArg)) + .build()); + } + + private static Optional createSwapQuickFix(Expression leftExpression, Expression rightExpression, String message, SubscriptionContext ctx) { + String leftText = expressionText(leftExpression, ctx); + String rightText = expressionText(rightExpression, ctx); + if (leftText == null || rightText == null) { + return Optional.empty(); + } + return Optional.of(PythonQuickFix.newQuickFix(message) + .addTextEdit(TextEditUtils.replace(leftExpression, rightText)) + .addTextEdit(TextEditUtils.replace(rightExpression, leftText)) + .build()); + } + + @Nullable + private static CallExpression asPytestApproxCall(Expression expression, SubscriptionContext ctx) { + Expression normalized = Expressions.removeParentheses(expression); + if (normalized instanceof CallExpression callExpression && PYTEST_APPROX_MATCHER.isTrueFor(callExpression.callee(), ctx)) { + return callExpression; + } + return null; + } + + @Nullable + private static String expressionText(Expression expression, SubscriptionContext ctx) { + String fileContent = ctx.pythonFile().content(); + int startIndex = convertPositionToIndex(fileContent, expression.firstToken().line(), expression.firstToken().column()); + TokenLocation endLocation = new TokenLocation(expression.lastToken()); + int endIndex = convertPositionToIndex(fileContent, endLocation.endLine(), endLocation.endLineOffset()); + if (startIndex < 0 || endIndex < startIndex || endIndex > fileContent.length()) { + return null; + } + return fileContent.substring(startIndex, endIndex); + } + + private static int convertPositionToIndex(String fileContent, int line, int lineOffset) { + int currentIndex = 0; + int currentLine = 1; + + while (currentLine < line && currentIndex < fileContent.length()) { + int nextIndex = nextIndex(fileContent, currentIndex); + if (isLineBreak(fileContent.charAt(currentIndex))) { + currentLine++; + } + currentIndex = nextIndex; + } + + if (currentLine != line) { + return -1; + } + + int lineEnd = findLineEnd(fileContent, currentIndex); + + if (lineOffset < 0 || currentIndex + lineOffset > lineEnd) { + return -1; + } + return currentIndex + lineOffset; + } + + private static int nextIndex(String fileContent, int currentIndex) { + char current = fileContent.charAt(currentIndex); + currentIndex++; + if (current == '\r') { + if (currentIndex < fileContent.length() && fileContent.charAt(currentIndex) == '\n') { + return currentIndex + 1; + } + return currentIndex; + } + if (current == '\n') { + return currentIndex; + } + return currentIndex; + } + + private static int findLineEnd(String fileContent, int currentIndex) { + int lineEnd = currentIndex; + while (lineEnd < fileContent.length() && !isLineBreak(fileContent.charAt(lineEnd))) { + lineEnd++; + } + return lineEnd; + } + + private static boolean isLineBreak(char current) { + return current == '\r' || current == '\n'; + } + + @Nullable + private static ParameterNames parameterNames(Expression callee, SubscriptionContext ctx) { + if (UNITTEST_EQUALITY_ASSERTION_MATCHER.isTrueFor(callee, ctx)) { + return new ParameterNames("first", "second"); + } + if (UNITTEST_IDENTITY_ASSERTION_MATCHER.isTrueFor(callee, ctx)) { + return new ParameterNames("expr1", "expr2"); + } + return null; + } + + private static boolean isAssertThatCall(CallExpression callExpression, SubscriptionContext ctx) { + return ASSERTPY_ASSERT_THAT_MATCHER.isTrueFor(callExpression.callee(), ctx); + } + + @Nullable + private static CallExpression originatingAssertThatCall(Expression expression, SubscriptionContext ctx) { + Expression qualifier = Expressions.removeParentheses(expression); + while (qualifier instanceof CallExpression callExpression) { + if (isAssertThatCall(callExpression, ctx)) { + return callExpression; + } + Expression callee = Expressions.removeParentheses(callExpression.callee()); + if (!(callee instanceof QualifiedExpression qualifiedExpression)) { + return null; + } + qualifier = Expressions.removeParentheses(qualifiedExpression.qualifier()); + } + return null; + } + + private static boolean areInvertedForActualExpected(Expression actualPosition, Expression expectedPosition, SubscriptionContext ctx) { + return isExpectedValue(actualPosition, ctx) && !isExpectedValue(expectedPosition, ctx); + } + + private boolean areInvertedForConfiguredPytestOrder(Expression leftOperand, Expression rightOperand, SubscriptionContext ctx) { + return expectedOnRight + ? areInvertedForActualExpected(leftOperand, rightOperand, ctx) + : areInvertedForActualExpected(rightOperand, leftOperand, ctx); + } + + private String pytestMessage() { + return expectedOnRight ? PYTEST_EXPECTED_ON_RIGHT_MESSAGE : PYTEST_EXPECTED_ON_LEFT_MESSAGE; + } + + private static boolean isExpectedValue(Expression expression, SubscriptionContext ctx) { + Expression unwrapped = Expressions.removeParentheses(expression); + if (CheckUtils.isConstant(unwrapped)) { + return true; + } + if (isPytestApproxExpectedValue(unwrapped, ctx)) { + return true; + } + if (unwrapped instanceof Name name) { + return Expressions.singleAssignedNonNameValue(name).filter(CheckUtils::isConstant).isPresent(); + } + return false; + } + + private static boolean isPytestApproxExpectedValue(Expression expression, SubscriptionContext ctx) { + if (!(expression instanceof CallExpression callExpression) || !PYTEST_APPROX_MATCHER.isTrueFor(callExpression.callee(), ctx)) { + return false; + } + RegularArgument expectedArg = TreeUtils.nthArgumentOrKeyword(0, "expected", callExpression.arguments()); + return expectedArg != null && isExpectedValue(expectedArg.expression(), ctx); + } + + private static boolean isSupportedTestFunction(SubscriptionContext ctx, Tree tree) { + FunctionDef functionDef = (FunctionDef) TreeUtils.firstAncestorOfKind(tree, Tree.Kind.FUNCDEF); + return functionDef != null && (UnittestUtils.isWithinUnittestTestCase(functionDef) || UnittestUtils.isPytestStyleTestFunction(functionDef, ctx.pythonFile().fileName())); + } + + private static boolean isPytestStyleTestFunction(SubscriptionContext ctx, Tree tree) { + FunctionDef functionDef = (FunctionDef) TreeUtils.firstAncestorOfKind(tree, Tree.Kind.FUNCDEF); + return functionDef != null && UnittestUtils.isPytestStyleTestFunction(functionDef, ctx.pythonFile().fileName()); + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S3415.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S3415.html new file mode 100644 index 000000000..02562eafd --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S3415.html @@ -0,0 +1,107 @@ +

              This rule raises an issue when the expected and actual values in an assertion appear to be inverted with respect to the testing framework’s +convention.

              +

              Why is this an issue?

              +

              Assertions are statements that check whether certain conditions are true. They validate that the actual results of a code snippet match the +expected outcomes. By using assertions, developers can ensure that their code behaves as intended and identify potential bugs or issues early in the +development process.

              +

              Python testing frameworks follow a convention for where expected and actual values should appear in assertions:

              +
                +
              • In unittest, methods like assertEqual() and assertIs() compare two values passed as arguments. The + documentation commonly shows the value from the code under test first and the expected value second, for example self.assertEqual(s.split(), + ['hello', 'world']). For consistency with that convention, place the actual value first and the expected value second.
              • +
              • In pytest, assertions should place the actual value on the left side and the expected value on the right side. The right-hand side + should be a literal or an identifier that represents the expected value, optionally wrapped in a helper such as pytest.approx(), rather + than a computation.
              • +
              • In assertpy, fluent assertions should place the actual value in assert_that(…​) and the expected value in the + assertion method, such as .is_equal_to(…​).
              • +
              +

              In all of these assertion styles, the value produced by the code under test comes first and the expected value comes second. Keeping each value in +the position expected by the assertion style makes the intent easier to understand and helps readers interpret failures more quickly.

              +

              Additionally, following each framework’s assertion conventions makes tests more consistent with the surrounding code and easier to read.

              +

              What is the potential impact?

              +

              Having the expected value and the actual value in the wrong order will not alter the outcome of tests (they will still succeed or fail +appropriately). However, the error messages will contain misleading information, making debugging more difficult.

              +

              For example, if you write self.assertEqual(0, runner.exit_code) where runner.exit_code is -1, the failure is +reported as 0 != -1. The message does not explicitly identify one value as expected and the other as actual, but following a consistent +convention still makes assertions easier to read and understand.

              +

              How to fix it in unittest

              +

              Swap the order of the assertion arguments so that the actual value (from the code under test) is passed as the first argument and the expected +value is passed as the second argument.

              +

              Code examples

              +

              Noncompliant code example

              +
              +import unittest
              +
              +class TestRunner(unittest.TestCase):
              +    def test_exit_code(self):
              +        runner = Runner()
              +        self.assertEqual(0, runner.exit_code, "Unexpected exit code")  # Noncompliant
              +
              +

              Compliant solution

              +
              +import unittest
              +
              +class TestRunner(unittest.TestCase):
              +    def test_exit_code(self):
              +        runner = Runner()
              +        self.assertEqual(runner.exit_code, 0, "Unexpected exit code")
              +
              +

              How to fix it in pytest

              +

              In pytest, place the actual value on the left side of the assertion and the expected value on the right side. The right-hand side should be limited +to a literal or an identifier representing the expected value, including when using helpers such as pytest.approx(), rather than an +expression that computes the value.

              +

              Code examples

              +

              Noncompliant code example

              +
              +import pytest
              +
              +EXPECTED_PI = 3.14
              +
              +def test_calculation():
              +    result = perform_calculation()
              +    assert 3.14 == result  # Noncompliant
              +    assert pytest.approx(EXPECTED_PI) == result  # Noncompliant
              +
              +

              Compliant solution

              +
              +import pytest
              +
              +EXPECTED_PI = 3.14
              +
              +def test_calculation():
              +    result = perform_calculation()
              +    assert result == 3.14
              +    assert result == pytest.approx(EXPECTED_PI)
              +
              +

              How to fix it in assertpy

              +

              In assertpy, place the actual value from the code under test in assert_that(…​) and pass the expected value to the +assertion method.

              +

              Code examples

              +

              Noncompliant code example

              +
              +from assertpy import assert_that
              +
              +EXPECTED_EXIT_CODE = 0
              +
              +def test_exit_code():
              +    runner = Runner()
              +    assert_that(EXPECTED_EXIT_CODE).is_equal_to(runner.exit_code)  # Noncompliant
              +
              +

              Compliant solution

              +
              +from assertpy import assert_that
              +
              +EXPECTED_EXIT_CODE = 0
              +
              +def test_exit_code():
              +    runner = Runner()
              +    assert_that(runner.exit_code).is_equal_to(EXPECTED_EXIT_CODE)
              +
              +

              Resources

              +

              Documentation

              + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S3415.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S3415.json new file mode 100644 index 000000000..98da952cc --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S3415.json @@ -0,0 +1,24 @@ +{ + "title": "Assertion arguments should be passed in the correct order", + "type": "CODE_SMELL", + "code": { + "impacts": { + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "LOGICAL" + }, + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "2min" + }, + "tags": [ + "tests", + "suspicious" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-3415", + "sqKey": "S3415", + "scope": "Tests", + "quickfix": "unknown" +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 5e7544891..07be2e82f 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -75,6 +75,7 @@ "S3330", "S3358", "S3403", + "S3415", "S3457", "S3516", "S3626", diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/AssertionArgumentOrderCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/AssertionArgumentOrderCheckTest.java new file mode 100644 index 000000000..badcc030f --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/AssertionArgumentOrderCheckTest.java @@ -0,0 +1,281 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import java.lang.reflect.Method; +import org.junit.jupiter.api.Test; +import org.sonar.plugins.python.api.PythonCheck; +import org.sonar.python.checks.quickfix.PythonQuickFixVerifier; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +import static org.assertj.core.api.Assertions.assertThat; + +class AssertionArgumentOrderCheckTest { + private static final AssertionArgumentOrderCheck CHECK = new AssertionArgumentOrderCheck(); + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/test_assertionArgumentOrder.py", CHECK); + } + + @Test + void test_expected_on_left() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/test_assertionArgumentOrderExpectedLeft.py", checkWithExpectedOnRight()); + } + + @Test + void test_scope() { + assertThat(CHECK.scope()).isEqualTo(PythonCheck.CheckScope.TESTS); + } + + @Test + void unittest_quick_fix() { + String before = """ + import unittest + + def value(): + return 41 + 1 + + class MyTest(unittest.TestCase): + def test_order(self): + self.assertEqual(first=42, second=value()) + """; + String after = """ + import unittest + + def value(): + return 41 + 1 + + class MyTest(unittest.TestCase): + def test_order(self): + self.assertEqual(first=value(), second=42) + """; + PythonQuickFixVerifier.verifySemantic(CHECK, "unittest_case.py", before, after); + PythonQuickFixVerifier.verifySemanticQuickFixMessages(CHECK, "unittest_case.py", before, "Swap the actual and expected arguments"); + } + + @Test + void pytest_quick_fix() { + String before = """ + def value(): + return 41 + 1 + + def test_order(): + assert 42 == value() + """; + String after = """ + def value(): + return 41 + 1 + + def test_order(): + assert value() == 42 + """; + PythonQuickFixVerifier.verifySemantic(CHECK, "test_pytest_case.py", before, after); + PythonQuickFixVerifier.verifySemanticQuickFixMessages(CHECK, "test_pytest_case.py", before, "Swap the actual and expected operands"); + } + + @Test + void pytest_approx_quick_fix() { + String before = """ + import pytest + + def value(): + return 3.14 + + def test_order(): + assert 42 == pytest.approx(value(), abs=0.1) + """; + String after = """ + import pytest + + def value(): + return 3.14 + + def test_order(): + assert value() == pytest.approx(42, abs=0.1) + """; + PythonQuickFixVerifier.verifySemantic(CHECK, "test_pytest_approx_case.py", before, after); + PythonQuickFixVerifier.verifySemanticQuickFixMessages(CHECK, "test_pytest_approx_case.py", before, "Swap the actual and expected operands"); + } + + @Test + void pytest_quick_fix_expected_on_left() { + String before = """ + def value(): + return 41 + 1 + + def test_order(): + assert value() == 42 + """; + String after = """ + def value(): + return 41 + 1 + + def test_order(): + assert 42 == value() + """; + PythonQuickFixVerifier.verifySemantic(checkWithExpectedOnRight(), "test_pytest_expected_left_case.py", before, after); + PythonQuickFixVerifier.verifySemanticQuickFixMessages(checkWithExpectedOnRight(), "test_pytest_expected_left_case.py", before, + "Swap the actual and expected operands"); + } + + @Test + void pytest_approx_quick_fix_expected_on_left() { + String before = """ + import pytest + + def value(): + return 3.14 + + def test_order(): + assert pytest.approx(value(), abs=0.1) == 42 + """; + String after = """ + import pytest + + def value(): + return 3.14 + + def test_order(): + assert pytest.approx(42, abs=0.1) == value() + """; + PythonQuickFixVerifier.verifySemantic(checkWithExpectedOnRight(), "test_pytest_approx_expected_left_case.py", before, after); + PythonQuickFixVerifier.verifySemanticQuickFixMessages(checkWithExpectedOnRight(), "test_pytest_approx_expected_left_case.py", before, + "Swap the actual and expected operands"); + } + + @Test + void assertpy_quick_fix() { + String before = """ + from assertpy import assert_that + + def value(): + return 41 + 1 + + def test_order(): + assert_that(42).described_as("count").is_equal_to(value()) + """; + String after = """ + from assertpy import assert_that + + def value(): + return 41 + 1 + + def test_order(): + assert_that(value()).described_as("count").is_equal_to(42) + """; + PythonQuickFixVerifier.verifySemantic(CHECK, "test_assertpy_case.py", before, after); + PythonQuickFixVerifier.verifySemanticQuickFixMessages(CHECK, "test_assertpy_case.py", before, "Swap the actual and expected values"); + } + + @Test + void quick_fix_for_multiline_operand() { + String before = """ + def value(): + return 41 + 1 + + def test_order(): + assert 42 == ( + value() + ) + """; + String after = """ + def value(): + return 41 + 1 + + def test_order(): + assert ( + value() + ) == 42 + """; + PythonQuickFixVerifier.verifySemantic(CHECK, "test_pytest_multiline_case.py", before, after); + PythonQuickFixVerifier.verifySemanticQuickFixMessages(CHECK, "test_pytest_multiline_case.py", before, "Swap the actual and expected operands"); + } + + @Test + void pytest_quick_fix_with_windows_line_endings() { + String before = """ + def value(): + return 41 + 1 + + def test_order(): + assert 42 == value() + """.replace("\n", "\r\n"); + String after = """ + def value(): + return 41 + 1 + + def test_order(): + assert value() == 42 + """.replace("\n", "\r\n"); + PythonQuickFixVerifier.verifySemantic(CHECK, "test_pytest_windows_case.py", before, after); + } + + @Test + void pytest_approx_quick_fix_with_expected_keyword() { + String before = """ + import pytest + + def value(): + return 3.14 + + def test_order(): + assert 42 == pytest.approx(expected=value(), abs=0.1) + """; + String after = """ + import pytest + + def value(): + return 3.14 + + def test_order(): + assert value() == pytest.approx(expected=42, abs=0.1) + """; + PythonQuickFixVerifier.verifySemantic(CHECK, "test_pytest_keyword_approx_case.py", before, after); + PythonQuickFixVerifier.verifySemanticQuickFixMessages(CHECK, "test_pytest_keyword_approx_case.py", before, "Swap the actual and expected operands"); + } + + @Test + void convert_position_to_index_handles_crlf_and_invalid_positions() throws Exception { + Method method = AssertionArgumentOrderCheck.class.getDeclaredMethod("convertPositionToIndex", String.class, int.class, int.class); + method.setAccessible(true); + + String code = "a = 1\r\nb = 2\r\n"; + assertThat(method.invoke(null, code, 2, 0)).isEqualTo(7); + assertThat(method.invoke(null, code, 2, 5)).isEqualTo(12); + assertThat(method.invoke(null, code, 4, 0)).isEqualTo(-1); + assertThat(method.invoke(null, code, 2, -1)).isEqualTo(-1); + assertThat(method.invoke(null, code, 2, 6)).isEqualTo(-1); + } + + @Test + void next_index_handles_all_line_break_variants() throws Exception { + Method method = AssertionArgumentOrderCheck.class.getDeclaredMethod("nextIndex", String.class, int.class); + method.setAccessible(true); + + assertThat(method.invoke(null, "a", 0)).isEqualTo(1); + assertThat(method.invoke(null, "\n", 0)).isEqualTo(1); + assertThat(method.invoke(null, "\r", 0)).isEqualTo(1); + assertThat(method.invoke(null, "\r\n", 0)).isEqualTo(2); + } + + private static AssertionArgumentOrderCheck checkWithExpectedOnRight() { + AssertionArgumentOrderCheck check = new AssertionArgumentOrderCheck(); + check.expectedOnRight = false; + return check; + } +} diff --git a/python-checks/src/test/resources/checks/tests/test_assertionArgumentOrder.py b/python-checks/src/test/resources/checks/tests/test_assertionArgumentOrder.py new file mode 100644 index 000000000..27d16d8a2 --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/test_assertionArgumentOrder.py @@ -0,0 +1,79 @@ +import unittest + +import pytest +from assertpy import assert_that + +EXPECTED_COUNT = 42 +EXPECTED_PI = 3.14 + +assert 42 == value() # OK, not inside a pytest-style test function +assert_that(42).is_equal_to(value()) # OK, not inside a supported test function + + +def value(): + return 41 + 1 + + +class TestUnittestAssertions(unittest.TestCase): + def test_swapped_equality_arguments(self): + self.assertEqual(42, value()) # Noncompliant {{Swap these 2 arguments so they are in the correct order: actual value, expected value.}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 0 + self.assertEqual(first=EXPECTED_COUNT, second=value()) # Noncompliant + self.assertIs(None, value()) # Noncompliant + self.assertAlmostEqual(EXPECTED_PI, value()) # Noncompliant + + self.assertEqual(value(), 42) + self.assertEqual(value(), value()) + self.assertIs(value(), None) + self.assertAlmostEqual(value(), EXPECTED_PI) + self.assertEqual(value()) + self.assertEqual(second=EXPECTED_COUNT) + self.assertTrue(value()) + helper.assertEqual(value(), 42) + + +class Helper: + def test_not_a_unittest_test_case(self): + self.assertEqual(value(), 42) + + +def test_pytest_assertions(): + assert 42 == value() # Noncompliant {{Swap these 2 sides so they are in the correct order: actual value, expected value.}} +# ^^^^^^^^^^^^^ 0 + assert EXPECTED_COUNT == value() # Noncompliant + assert pytest.approx(EXPECTED_PI) == value() # Noncompliant + + assert value() == 42 + assert value() == EXPECTED_COUNT + assert value() == pytest.approx(EXPECTED_PI) + assert value() == value() + assert 42 == EXPECTED_COUNT + assert value() + assert 42 != value() + assert 42 == pytest.approx(value()) # Noncompliant + assert 42 == pytest.approx(other=value()) # Noncompliant + + +def test_assertpy_assertions(): + assert_that(42).is_equal_to(value()) # Noncompliant {{Pass the actual value to "assert_that" and the expected value to "is_equal_to".}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 0 + assert_that(EXPECTED_COUNT).is_equal_to(value()) # Noncompliant + assert_that(42).described_as("count").is_equal_to(value()) # Noncompliant + assert_that(EXPECTED_COUNT).described_as("count").snapshot("baseline").is_equal_to(value()) # Noncompliant + + assert_that(value()).is_equal_to(42) + assert_that(value()).is_equal_to(EXPECTED_COUNT) + assert_that(value()).described_as("count").snapshot("baseline").is_equal_to(42) + assert_that(value()).is_equal_to(value()) + assert_that(42).is_equal_to(EXPECTED_COUNT) + assert_that(value()).is_equal_to() + assert_that().is_equal_to(value()) + assert_that(value()).is_not_equal_to(42) + builder.is_equal_to(42) + factory().is_equal_to(42) + other_call(value()).is_equal_to(42) + + +def helper_assertions(): + assert 42 == value() + assert_that(42).is_equal_to(value()) diff --git a/python-checks/src/test/resources/checks/tests/test_assertionArgumentOrderExpectedLeft.py b/python-checks/src/test/resources/checks/tests/test_assertionArgumentOrderExpectedLeft.py new file mode 100644 index 000000000..9d001c683 --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/test_assertionArgumentOrderExpectedLeft.py @@ -0,0 +1,36 @@ +import unittest + +import pytest +from assertpy import assert_that + +EXPECTED_COUNT = 42 +EXPECTED_PI = 3.14 + + +def value(): + return 41 + 1 + + +class TestUnittestAssertions(unittest.TestCase): + def test_unittest_assertions_are_unchanged(self): + self.assertEqual(42, value()) # Noncompliant {{Swap these 2 arguments so they are in the correct order: actual value, expected value.}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 0 + self.assertEqual(value(), 42) + + +def test_pytest_assertions_expected_on_left(): + assert value() == 42 # Noncompliant {{Swap these 2 sides so they are in the correct order: expected value, actual value.}} +# ^^^^^^^^^^^^^ 0 + assert value() == EXPECTED_COUNT # Noncompliant + assert value() == pytest.approx(EXPECTED_PI) # Noncompliant + + assert 42 == value() + assert EXPECTED_COUNT == value() + assert pytest.approx(EXPECTED_PI) == value() + assert 42 == EXPECTED_COUNT + + +def test_assertpy_assertions_are_unchanged(): + assert_that(42).is_equal_to(value()) # Noncompliant {{Pass the actual value to "assert_that" and the expected value to "is_equal_to".}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 0 + assert_that(value()).is_equal_to(42) diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/assertpy.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/assertpy.protobuf new file mode 100644 index 000000000..7749830f0 --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/assertpy.protobuf @@ -0,0 +1,38 @@ + +assertpy +AssertionBuilderassertpy.AssertionBuilder"*SonarPythonAnalyzerFakeStub.CustomStubBase* + described_as&assertpy.AssertionBuilder.described_as"6 +assertpy.AssertionBuilder"assertpy.AssertionBuilder*@ +self6 +assertpy.AssertionBuilder"assertpy.AssertionBuilder*- + description + builtins.str" builtins.str* +snapshot"assertpy.AssertionBuilder.snapshot"6 +assertpy.AssertionBuilder"assertpy.AssertionBuilder*@ +self6 +assertpy.AssertionBuilder"assertpy.AssertionBuilder*& +name + builtins.str" builtins.str* + is_equal_to%assertpy.AssertionBuilder.is_equal_to"6 +assertpy.AssertionBuilder"assertpy.AssertionBuilder*@ +self6 +assertpy.AssertionBuilder"assertpy.AssertionBuilder*/ +other" +builtins.object"builtins.object * +is_not_equal_to)assertpy.AssertionBuilder.is_not_equal_to"6 +assertpy.AssertionBuilder"assertpy.AssertionBuilder*@ +self6 +assertpy.AssertionBuilder"assertpy.AssertionBuilder*- +other" +builtins.object"builtins.object + assert_thatassertpy.assert_that"6 +assertpy.AssertionBuilder"assertpy.AssertionBuilder*- +val" +builtins.object"builtins.object *i +__path__assertpy.__path__J +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list* +__annotations__assertpy.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pytest.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pytest.protobuf new file mode 100644 index 000000000..d317ea117 --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pytest.protobuf @@ -0,0 +1,18 @@ + +pytestO + ApproxScalarpytest.ApproxScalar"*SonarPythonAnalyzerFakeStub.CustomStubBase +approx pytest.approx"* +pytest.ApproxScalar"pytest.ApproxScalar*2 +expected" +builtins.object"builtins.object *, +args" +builtins.object"builtins.object*. +kwargs" +builtins.object"builtins.object*g +__path__pytest.__path__J +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list* +__annotations__pytest.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/typeshed_serializer/checksums/custom.checksum b/python-frontend/typeshed_serializer/checksums/custom.checksum index 2cb234459..4ab67abb6 100644 --- a/python-frontend/typeshed_serializer/checksums/custom.checksum +++ b/python-frontend/typeshed_serializer/checksums/custom.checksum @@ -1,2 +1,2 @@ -02d6a6bdef0392652e6530c1d89de9edd38493695688db5e5a8b4e589ab9192d -57b8893adf40057e98a45e8067e1304cdf8839bfecff197a2d52c8456c8f19fa \ No newline at end of file +679caef659b943b42e50ebc33d31e0f4eb88cd52cdd02fe6a517baf5cdf1a16c +02380c7cb56a1edc33689a0215067634199038f9a8a31a79d1ae6f7f3a4eecc0 \ No newline at end of file diff --git a/python-frontend/typeshed_serializer/resources/custom/assertpy/__init__.pyi b/python-frontend/typeshed_serializer/resources/custom/assertpy/__init__.pyi new file mode 100644 index 000000000..4dafa0c2d --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/assertpy/__init__.pyi @@ -0,0 +1,9 @@ +from SonarPythonAnalyzerFakeStub import CustomStubBase + +class AssertionBuilder(CustomStubBase): + def described_as(self, description: str) -> "AssertionBuilder": ... + def snapshot(self, name: str) -> "AssertionBuilder": ... + def is_equal_to(self, other: object = ...) -> "AssertionBuilder": ... + def is_not_equal_to(self, other: object) -> "AssertionBuilder": ... + +def assert_that(val: object = ...) -> AssertionBuilder: ... diff --git a/python-frontend/typeshed_serializer/resources/custom/pytest/__init__.pyi b/python-frontend/typeshed_serializer/resources/custom/pytest/__init__.pyi new file mode 100644 index 000000000..74e14fcf7 --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/pytest/__init__.pyi @@ -0,0 +1,5 @@ +from SonarPythonAnalyzerFakeStub import CustomStubBase + +class ApproxScalar(CustomStubBase): ... + +def approx(expected: object = ..., *args: object, **kwargs: object) -> ApproxScalar: ... diff --git a/python-frontend/typeshed_serializer/tests/test_serializers.py b/python-frontend/typeshed_serializer/tests/test_serializers.py index d3ac09a4c..96673c738 100644 --- a/python-frontend/typeshed_serializer/tests/test_serializers.py +++ b/python-frontend/typeshed_serializer/tests/test_serializers.py @@ -73,8 +73,15 @@ def test_custom_stubs_serializer(typeshed_custom_stubs): ) custom_stubs_serializer.serialize() assert custom_stubs_serializer.get_build_result.call_count == 1 - # Not every files from "typeshed_custom_stubs" build are serialized, as some are builtins - assert symbols.save_module.call_count == 365 + expected_serialized_modules = sum( + file != serializers.SONAR_CUSTOM_BASE_STUB_MODULE + and typeshed_custom_stubs.files.get(file).path.startswith( + custom_stubs_serializer.path + ) + for file in typeshed_custom_stubs.files + ) + assert symbols.save_module.call_count == expected_serialized_modules + assert expected_serialized_modules > 0 def test_importer_serializer(): From c250381001cf155e9000f4c6882e2810df552cdf Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Tue, 7 Jul 2026 15:19:47 +0200 Subject: [PATCH 182/322] SONARPY-4334 Create rule S8963: Pydantic models should not use multiple inheritance with conflicting configurations (#1240) GitOrigin-RevId: 03391760b250a23d50f1453e70903e8a13a63cb7 --- .../python/checks/OpenSourceCheckList.java | 1 + ...ydanticMultipleInheritanceConfigCheck.java | 144 ++++++++++++ .../org/sonar/l10n/py/rules/python/S8963.html | 108 +++++++++ .../org/sonar/l10n/py/rules/python/S8963.json | 25 +++ .../py/rules/python/Sonar_way_profile.json | 1 + ...ticMultipleInheritanceConfigCheckTest.java | 29 +++ .../pydanticMultipleInheritanceConfigCheck.py | 205 ++++++++++++++++++ 7 files changed, 513 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/PydanticMultipleInheritanceConfigCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8963.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8963.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/PydanticMultipleInheritanceConfigCheckTest.java create mode 100644 python-checks/src/test/resources/checks/pydanticMultipleInheritanceConfigCheck.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 4a203b8bd..aff18365a 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -382,6 +382,7 @@ public Stream> getChecks() { PublicNetworkAccessToCloudResourcesCheck.class, PydanticCoreSerializationFallbackCheck.class, PydanticOptionalFieldDefaultCheck.class, + PydanticMultipleInheritanceConfigCheck.class, PyTorchDataLoaderNumWorkersCheck.class, PytzTimeZoneInDatetimeConstructorCheck.class, RaiseOutsideExceptCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/PydanticMultipleInheritanceConfigCheck.java b/python-checks/src/main/java/org/sonar/python/checks/PydanticMultipleInheritanceConfigCheck.java new file mode 100644 index 000000000..e0ce2764f --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/PydanticMultipleInheritanceConfigCheck.java @@ -0,0 +1,144 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.ArgList; +import org.sonar.plugins.python.api.tree.Argument; +import org.sonar.plugins.python.api.tree.ClassDef; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.ClassType; +import org.sonar.plugins.python.api.types.v2.Member; +import org.sonar.plugins.python.api.types.v2.PythonType; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; + +@Rule(key = "S8963") +public class PydanticMultipleInheritanceConfigCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Refactor this Pydantic model to avoid multiple inheritance with conflicting configurations."; + + private static final TypeMatcher IS_PYDANTIC_MODEL = TypeMatchers.isOrExtendsType("pydantic.BaseModel"); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.CLASSDEF, PydanticMultipleInheritanceConfigCheck::checkClassDef); + } + + private static void checkClassDef(SubscriptionContext ctx) { + ClassDef classDef = (ClassDef) ctx.syntaxNode(); + + if (!IS_PYDANTIC_MODEL.isTrueFor(classDef.name(), ctx)) { + return; + } + + ArgList argList = classDef.args(); + if (argList == null) { + return; + } + + List superClasses = collectSuperClasses(argList); + if (superClasses.size() < 2) { + return; + } + + // Exception: the model class itself explicitly defines model_config, making the + // configuration explicit and predictable (as stated in the rule's Exceptions section). + if (classDefinesModelConfigLocally(classDef)) { + return; + } + + Set visitedClassesDefiningModelConfig = new HashSet<>(); + List superClassesWithNewModelConfig = new ArrayList<>(); + + for (Expression superClass : superClasses) { + Set classesDefiningModelConfig = findModelConfigDefiners(superClass); + boolean introducesNewModelConfigClass = false; + for (ClassType classDefiningModelConfig : classesDefiningModelConfig) { + if (visitedClassesDefiningModelConfig.add(classDefiningModelConfig)) { + introducesNewModelConfigClass = true; + } + } + if (introducesNewModelConfigClass) { + superClassesWithNewModelConfig.add(superClass); + } + } + + reportIfConflictingConfigs(ctx, classDef, visitedClassesDefiningModelConfig, superClassesWithNewModelConfig); + } + + private static boolean classDefinesModelConfigLocally(ClassDef classDef) { + PythonType type = classDef.name().typeV2(); + if (type instanceof ClassType classType) { + return definesModelConfigLocally(classType); + } + return false; + } + + private static List collectSuperClasses(ArgList argList) { + List superClasses = new ArrayList<>(); + for (Argument argument : argList.arguments()) { + if (argument instanceof RegularArgument regularArgument && regularArgument.keywordArgument() == null) { + superClasses.add(regularArgument.expression()); + } + } + return superClasses; + } + + private static void reportIfConflictingConfigs( + SubscriptionContext ctx, + ClassDef classDef, + Set visitedClassesDefiningModelConfig, + List superClassesWithNewModelConfig) { + if (visitedClassesDefiningModelConfig.size() >= 2) { + PreciseIssue issue = ctx.addIssue(classDef.name(), MESSAGE); + for (Expression superClass : superClassesWithNewModelConfig) { + issue.secondary(superClass, "This base class defines \"model_config\"."); + } + } + } + + /** + * Returns the set of ClassType objects in the MRO of {@code superClass} that locally define + * {@code model_config}. + */ + private static Set findModelConfigDefiners(Expression superClass) { + PythonType type = superClass.typeV2(); + if (!(type instanceof ClassType classType)) { + return Set.of(); + } + Set classesDefiningModelConfig = new HashSet<>(); + for (ClassType ancestor : classType.mro().orElse(List.of())) { + if (definesModelConfigLocally(ancestor)) { + classesDefiningModelConfig.add(ancestor); + } + } + return classesDefiningModelConfig; + } + + private static boolean definesModelConfigLocally(ClassType classType) { + return classType.members().stream().map(Member::name).anyMatch("model_config"::equals); + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8963.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8963.html new file mode 100644 index 000000000..f33422477 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8963.html @@ -0,0 +1,108 @@ +

              This rule raises an issue when a Pydantic model class inherits from two or more base classes that each define a model_config +attribute, either directly or through their own inheritance chain. The rule uses the full C3 Method Resolution Order (MRO) when inspecting each direct +base class. This means it also detects configurations defined in grandparent classes that are inherited through intermediate base classes without +redefining model_config.

              +

              Note that the rule checks for the structural presence of model_config in multiple bases and does not compare the actual +ConfigDict values. Even if two bases currently define identical configurations, the rule still raises an issue. This is intentional: +identical configurations can diverge independently in future code changes, and Pydantic’s non-MRO merge behavior remains unpredictable regardless of +whether the values differ at analysis time.

              +

              Why is this an issue?

              +

              Pydantic models use the model_config class attribute with a ConfigDict to control validation, serialization, and other +behaviors.

              +

              When a Pydantic model inherits from a single base class, configuration inheritance works as expected: the child model inherits the parent’s +configuration, and any model_config defined on the child overrides the parent’s settings.

              +

              However, when a model inherits from multiple base classes that each define their own model_config, Pydantic does not +follow Python’s standard C3 Method Resolution Order (MRO) for merging configurations. Instead, it uses its own internal merging strategy, which means +you cannot reliably predict which configuration settings will be applied to your model.

              +

              For example, if Base1 enables a setting that converts string values to lowercase and Base2 enables a setting that +converts string values to uppercase, and your model inherits from both, the resulting behavior is undefined. The final configuration may use either +setting, neither, or potentially even raise an error, depending on Pydantic’s internal implementation details.

              +

              This unpredictability makes the code harder to understand and maintain. Developers reading the code cannot easily determine what configuration will +be applied without deep knowledge of Pydantic’s internals, and the behavior may change between Pydantic versions.

              +

              Exceptions

              +

              The rule does not raise an issue when the model class itself explicitly defines its own model_config. In that case, the developer has +made the configuration explicit, and Pydantic will use that definition directly, making the resolution predictable.

              +

              The Pydantic documentation explicitly warns: "If your model inherits from multiple bases, Pydantic currently doesn’t follow the [MRO] for +configuration merging."

              +

              What is the potential impact?

              +

              The unpredictable configuration merging can lead to several problems:

              +
                +
              • Data validation bugs: String transformations, type coercion, and validation rules may not behave as expected, potentially + allowing invalid data to pass validation or rejecting valid data.
              • +
              • Inconsistent behavior: The same code may behave differently across different framework versions or in different execution + contexts.
              • +
              • Maintenance difficulties: Developers cannot easily understand or predict model behavior without running tests, making the + codebase harder to maintain.
              • +
              • Hidden bugs: Issues may not surface immediately during development but could appear in production when specific data patterns + are encountered.
              • +
              +

              How to fix it

              +

              Use single inheritance and explicitly define the desired configuration on the final model class. This makes the configuration explicit and +predictable.

              +

              Code examples

              +

              Noncompliant code example

              +
              +from pydantic import BaseModel, ConfigDict
              +
              +class Base1(BaseModel):
              +    model_config = ConfigDict(str_to_lower=True)
              +
              +class Base2(BaseModel):
              +    model_config = ConfigDict(str_to_upper=True)
              +
              +class Model(Base1, Base2):  # Noncompliant
              +    x: str
              +
              +

              Compliant solution

              +
              +from pydantic import BaseModel, ConfigDict
              +
              +class Base1(BaseModel):
              +    model_config = ConfigDict(str_to_lower=True)
              +
              +class Model(Base1):
              +    model_config = ConfigDict(str_to_lower=True)
              +    x: str
              +
              +

              The rule also flags cases where a model_config is inherited indirectly through an intermediate class. In the example below, +Intermediate does not define its own model_config, but it inherits one from Base1. Because Model +inherits from both Intermediate (which carries Base1’s config) and `Base2 (which has its own config), the MRO-based check +raises an issue. Note that even though both configs are currently identical (frozen=True), the rule still raises an issue because the +configs can diverge independently in future changes.

              +

              Noncompliant code example

              +
              +from pydantic import BaseModel, ConfigDict
              +
              +class Base1(BaseModel):
              +    model_config = ConfigDict(frozen=True)
              +
              +class Base2(BaseModel):
              +    model_config = ConfigDict(frozen=True)
              +
              +class Intermediate(Base1):
              +    pass
              +
              +class Model(Intermediate, Base2):  # Noncompliant
              +    x: str
              +
              +

              Compliant solution

              +
              +from pydantic import BaseModel, ConfigDict
              +
              +class Base1(BaseModel):
              +    model_config = ConfigDict(frozen=True)
              +
              +class Intermediate(Base1):
              +    pass
              +
              +class Model(Intermediate):
              +    model_config = ConfigDict(frozen=True)
              +    x: str
              +
              +

              Resources

              +

              Documentation

              + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8963.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8963.json new file mode 100644 index 000000000..86ccefb21 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8963.json @@ -0,0 +1,25 @@ +{ + "title": "Pydantic models should not use multiple inheritance with conflicting configurations", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5 min" + }, + "tags": [ + "pydantic", + "pitfall", + "confusing" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-8963", + "sqKey": "S8963", + "scope": "All", + "quickfix": "unknown", + "code": { + "impacts": { + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "CLEAR" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 07be2e82f..06682ca2d 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -365,6 +365,7 @@ "S8904", "S8905", "S8906", + "S8963", "S8966" ] } diff --git a/python-checks/src/test/java/org/sonar/python/checks/PydanticMultipleInheritanceConfigCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/PydanticMultipleInheritanceConfigCheckTest.java new file mode 100644 index 000000000..ebd020911 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/PydanticMultipleInheritanceConfigCheckTest.java @@ -0,0 +1,29 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.junit.jupiter.api.Test; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class PydanticMultipleInheritanceConfigCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/pydanticMultipleInheritanceConfigCheck.py", new PydanticMultipleInheritanceConfigCheck()); + } + +} diff --git a/python-checks/src/test/resources/checks/pydanticMultipleInheritanceConfigCheck.py b/python-checks/src/test/resources/checks/pydanticMultipleInheritanceConfigCheck.py new file mode 100644 index 000000000..f9129807c --- /dev/null +++ b/python-checks/src/test/resources/checks/pydanticMultipleInheritanceConfigCheck.py @@ -0,0 +1,205 @@ +from pydantic import BaseModel, ConfigDict + + +# ===================== +# NON-COMPLIANT CASES +# ===================== + +class Base1(BaseModel): + model_config = ConfigDict(str_to_lower=True) + +class Base2(BaseModel): + model_config = ConfigDict(str_to_upper=True) + +class Model(Base1, Base2): # Noncompliant {{Refactor this Pydantic model to avoid multiple inheritance with conflicting configurations.}} +# ^^^^^ + x: str + + +class Base3(BaseModel): + model_config = ConfigDict(frozen=True) + +class Base4(BaseModel): + model_config = ConfigDict(populate_by_name=True) + +class ModelThreeBases(Base1, Base3, Base4): # Noncompliant +# ^^^^^^^^^^^^^^^ + y: int + + +# Multiple noncompliant models in the same file +class AnotherModel(Base1, Base2): # Noncompliant +# ^^^^^^^^^^^^ + z: str + + +# ===================== +# COMPLIANT CASES +# ===================== + +# Only one base has model_config +class Base5(BaseModel): + pass + +class ModelOneConfigBase(Base1, Base5): # Compliant - only Base1 has model_config + a: str + + +# Neither base defines model_config +class BaseNoConfig1(BaseModel): + x: int + +class BaseNoConfig2(BaseModel): + y: str + +class ModelNoConfig(BaseNoConfig1, BaseNoConfig2): # Compliant + z: float + + +# Single inheritance with config +class ModelSingleInheritance(Base1): # Compliant + b: int + + +# Single base with config, no multiple inheritance conflict +class ModelWithOwnConfig(Base1): # Compliant + model_config = ConfigDict(str_to_lower=True) + c: str + + +# Not a Pydantic BaseModel subclass +class NotPydantic: + model_config = ConfigDict(str_to_lower=True) + +class AlsoNotPydantic: + model_config = ConfigDict(str_to_upper=True) + +class NotPydanticMultiple(NotPydantic, AlsoNotPydantic): # Compliant - not a Pydantic model + pass + + +# BaseModel itself is not flagged +class DirectBaseModel(BaseModel): + pass + + +# Only the current class itself defines model_config (not multiple bases) +class ModelConfigOnChild(Base1): # Compliant - only one base (Base1) has model_config + model_config = ConfigDict(frozen=True) + d: int + + +# ===================== +# INDIRECT INHERITANCE (MRO-based detection) +# ===================== + +# Base that inherits model_config from Base1 without redefining it +class IntermediateBase(Base1): + pass + +# Both IntermediateBase (via Base1) and Base2 define model_config — conflict +class ModelIndirect(IntermediateBase, Base2): # Noncompliant {{Refactor this Pydantic model to avoid multiple inheritance with conflicting configurations.}} +# ^^^^^^^^^^^^^ + e: str + +# Two levels of indirection +class DeepBase(IntermediateBase): + pass + +class ModelDeep(DeepBase, Base2): # Noncompliant +# ^^^^^^^^^ + f: str + +# Both direct bases ultimately source model_config from the same class (Base1) — no conflict +class ModelSameSource(IntermediateBase, Base1): # Compliant - same model_config source + g: str + +# Intermediate base that does NOT carry a config, paired with a base that does — only one definer +class IntermediateNoConfig(Base5): + pass + +class ModelOneIndirectConfig(IntermediateNoConfig, Base1): # Compliant - only Base1 defines model_config + h: str + + +# ===================== +# EDGE CASES +# ===================== + +# Keyword argument in the base list must be ignored (not treated as a positional base) +class ModelWithKeywordArg(Base1, Base2, metaclass=type): # Noncompliant +# ^^^^^^^^^^^^^^^^^^^ + i: str + +# Diamond inheritance: A and B both inherit from Base1 (which defines model_config). +# The BFS visited-guard must deduplicate Base1 so it is only counted once — no conflict. +class DiamondA(Base1): + pass + +class DiamondB(Base1): + pass + +class ModelDiamond(DiamondA, DiamondB): # Compliant - single model_config source (Base1) + j: str + +# A base expression that does not resolve to a ClassType (e.g. a call) must be skipped +def make_base(): + return Base1 + +class ModelWithCallBase(make_base(), Base2): # Compliant - make_base() is not a ClassType + k: str + + +# ===================== +# EXCEPTION: child defines own model_config +# ===================== + +# Child defines its own model_config with multiple conflicting bases — compliant (exception) +class ModelOwnConfigMultiBases(Base1, Base2): # Compliant - child defines its own model_config + model_config = ConfigDict(frozen=True) + x: str + +# Same exception with three bases +class ModelOwnConfigThreeBases(Base1, Base2, Base3): # Compliant - child defines its own model_config + model_config = ConfigDict(frozen=True) + y: int + +# Exception holds even with indirect/MRO-based conflict +class ModelOwnConfigIndirect(IntermediateBase, Base2): # Compliant - child defines its own model_config + model_config = ConfigDict(str_to_lower=True) + z: str + + +# ===================== +# UNRESOLVED SUPERCLASSES +# ===================== + +# One superclass cannot be resolved to a ClassType (unknown import) — the rule skips it. +# Only Base1 contributes a model_config definer, so no conflict is raised. +class ModelOneUnresolved(UnknownBase, Base1): # Compliant - UnknownBase is unresolved + m: str + +# Both superclasses are unresolved — no ClassType definer is found at all, no issue raised. +class ModelBothUnresolved(UnknownBase1, UnknownBase2): # Compliant - both are unresolved + n: str + + +# ===================== +# KNOWN FALSE POSITIVE +# ===================== + +# Two bases define identical model_config values — no actual conflict exists, but the rule +# flags it anyway because it does not compare ConfigDict values, only structural presence. +# Pydantic's merge behavior is still non-MRO regardless of whether values currently agree, +# and they can diverge independently in future code changes. +class BaseIdentical1(BaseModel): + model_config = ConfigDict(frozen=True) + +class BaseIdentical2(BaseModel): + model_config = ConfigDict(frozen=True) + +# Known false positive: configs are identical but the rule flags it anyway because it does +# not compare ConfigDict values — only their structural presence. +class ModelIdenticalConfig(BaseIdentical1, BaseIdentical2): # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^ + l: str From be3de92dd10d6b0eeff5a4f75fc58e1d00e8f333 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Coet?= Date: Wed, 8 Jul 2026 15:10:29 +0200 Subject: [PATCH 183/322] SONARPY-4345 Update Copybara config to exclude renovate and pull request template from the sync (#1266) GitOrigin-RevId: 65266b4238b76bfedbc4d9421cb9a31753bf94a2 --- .github/PULL_REQUEST_TEMPLATE.md | 7 ---- renovate.json | 65 -------------------------------- 2 files changed, 72 deletions(-) delete mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 renovate.json diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 4ae372795..000000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,7 +0,0 @@ -Part of - diff --git a/renovate.json b/renovate.json deleted file mode 100644 index f23dd67a2..000000000 --- a/renovate.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": [ - "local>SonarSource/core-languages-tooling-public:renovate-config" - ], - "enabledManagers": [ - "maven", - "github-actions" - ], - "ignorePaths": [ - "python-frontend/typeshed_serializer/**" - ], - "packageRules": [ - { - "matchManagers": [ - "maven" - ], - "matchPackageNames": [ - "*" - ], - "matchUpdateTypes": [ - "minor", - "patch" - ], - "groupName": "all non-major dependencies", - "groupSlug": "all-minor-patch" - }, - { - "matchPackageNames": [ - "/sonar-plugin-api/", - "/org.sonarsource.sonarqube.*/" - ], - "groupName": "sonarqube", - "groupSlug": "sq" - }, - { - "matchPackageNames": [ - "com.google.protobuf:protobuf-java", - "com.google.protobuf:protoc" - ], - "groupName": "protobuf", - "groupSlug": "protobuf" - }, - { - "matchPackageNames": [ - "org.sonarsource.parent:parent", - "com.sonarsource.parent:parent" - ], - "groupName": "parent" - }, - { - "matchPackageNames": [ - "/org.sonarsource.sonarlint.core.*/" - ], - "groupName": "SL core" - }, - { - "matchDepTypes": [ - "action" - ], - "rollbackPrs": false, - "pinDigests": false - } - ] -} From 160acdc807d09f609f9d3816624de160e73b69e7 Mon Sep 17 00:00:00 2001 From: Victor Date: Wed, 8 Jul 2026 16:20:12 +0200 Subject: [PATCH 184/322] CLP-149 Clean up Renovate config in sonar-python-enterprise (#1264) GitOrigin-RevId: 1acd1657523dd64ee2445204c5eaa0ccafb13676 --- .github/renovate.json | 47 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 .github/renovate.json diff --git a/.github/renovate.json b/.github/renovate.json new file mode 100644 index 000000000..e8bb78b68 --- /dev/null +++ b/.github/renovate.json @@ -0,0 +1,47 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": [ + "github>SonarSource/renovate-config:quality-corelang-squad" + ], + "ignorePaths": [ + "python-frontend/typeshed_serializer/**" + ], + "packageRules": [ + { + "matchManagers": [ + "maven" + ], + "matchPackageNames": [ + "*" + ], + "matchUpdateTypes": [ + "minor", + "patch" + ], + "groupName": "all non-major dependencies", + "groupSlug": "all-minor-patch" + }, + { + "matchPackageNames": [ + "/sonar-plugin-api/", + "/org.sonarsource.sonarqube.*/" + ], + "groupName": "sonarqube", + "groupSlug": "sq" + }, + { + "matchPackageNames": [ + "com.google.protobuf:protobuf-java", + "com.google.protobuf:protoc" + ], + "groupName": "protobuf", + "groupSlug": "protobuf" + }, + { + "matchPackageNames": [ + "/org.sonarsource.sonarlint.core.*/" + ], + "groupName": "SL core" + } + ] +} From b3791b19c5debe5da0ab43783c799534df1b12b3 Mon Sep 17 00:00:00 2001 From: Guillaume Dequenne Date: Thu, 9 Jul 2026 12:02:16 +0200 Subject: [PATCH 185/322] SONARPY-2669 Parse dependency from requirements.txt file when there are no space between package name and operators (#1254) GitOrigin-RevId: bfa95818a86635055876d08a0e280bccb7952110 --- .../python/dependency/RequirementsTxtParser.java | 14 +++++++++++--- .../dependency/RequirementsTxtParserTest.java | 9 ++++++++- .../sonar/plugins/python/sensor/requirements.txt | 9 +++++++++ 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/python-commons/src/main/java/org/sonar/plugins/python/dependency/RequirementsTxtParser.java b/python-commons/src/main/java/org/sonar/plugins/python/dependency/RequirementsTxtParser.java index d340221fd..092942689 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/dependency/RequirementsTxtParser.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/dependency/RequirementsTxtParser.java @@ -18,8 +18,9 @@ import java.io.IOException; import java.util.HashSet; -import java.util.Locale; import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.sonar.api.batch.fs.InputFile; @@ -30,6 +31,10 @@ public class RequirementsTxtParser { private static final Logger LOG = LoggerFactory.getLogger(RequirementsTxtParser.class); + // Matches a PEP 508 package name, stopping before extras ("[...]") or version specifiers/markers glued without a space + private static final Pattern PACKAGE_NAME_PATTERN = + Pattern.compile("^[A-Za-z0-9](?:[A-Za-z0-9._-]*[A-Za-z0-9])?(?=$|[\\[<>=!~;@])"); + private RequirementsTxtParser(){} public static Dependencies parseRequirementFile(InputFile requirementFile) { @@ -47,8 +52,11 @@ public static Dependencies parseRequirementFile(InputFile requirementFile) { continue; } String[] splittedLine = line.split("\\s+"); - if (splittedLine.length >= 1 && splittedLine[0].toUpperCase(Locale.ENGLISH).matches("^([A-Z0-9]|[A-Z0-9][A-Z0-9._-]*[A-Z0-9])$")) { - dependencySet.add(new Dependency(splittedLine[0])); + if (splittedLine.length >= 1) { + Matcher matcher = PACKAGE_NAME_PATTERN.matcher(splittedLine[0]); + if (matcher.find()) { + dependencySet.add(new Dependency(matcher.group())); + } } } return new Dependencies(dependencySet); diff --git a/python-commons/src/test/java/org/sonar/plugins/python/dependency/RequirementsTxtParserTest.java b/python-commons/src/test/java/org/sonar/plugins/python/dependency/RequirementsTxtParserTest.java index fcdb1dac6..709e5698c 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/dependency/RequirementsTxtParserTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/dependency/RequirementsTxtParserTest.java @@ -58,7 +58,14 @@ void parse_requirement_files() { "packagewithleadingspaces", "packagewithfixedversion", "packagewithconstraints", - "packagewithvcs"); + "packagewithvcs", + "torch", + "labml-helpers", + "gym", + "numpy", + "flask", + "requests", + "certifi"); } private DefaultInputFile createRequirementFile() { diff --git a/python-commons/src/test/resources/org/sonar/plugins/python/sensor/requirements.txt b/python-commons/src/test/resources/org/sonar/plugins/python/sensor/requirements.txt index d66fb3607..ecb99f59e 100644 --- a/python-commons/src/test/resources/org/sonar/plugins/python/sensor/requirements.txt +++ b/python-commons/src/test/resources/org/sonar/plugins/python/sensor/requirements.txt @@ -15,6 +15,15 @@ packageWithFixedVersion == 0.6.1 packageWithConstraints [security] >= 2.8.1, == 2.8.* ; python_version < "2.7" packageWithVCS @ https://github.com/urllib3/urllib3/archive/refs/tags/1.26.8.zip +# Package names should also be recognized when there is no space before the operator or extras +torch>=1.10 +labml-helpers>=0.4.84 +gym[atari] +numpy==1.19 +flask[async]>=2.0 +requests;python_version<"3.8" +certifi@https://example.com/certifi.zip + # For know, we ignore extra requirements files referred in requirements.txt -r other-requirements.txt -c constraints.txt From f97bc0ad49404979ab0666365c73944ae675b260 Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Thu, 9 Jul 2026 13:40:06 +0200 Subject: [PATCH 186/322] SONARPY-4316 : S3415 add secondary issue locations for clarity & Mitigate FPs (#1265) GitOrigin-RevId: 9e1199adba7ff424296b083a39c0675742e743de --- .../tests/AssertionArgumentOrderCheck.java | 38 ++++++++++- .../tests/test_assertionArgumentOrder.py | 65 +++++++++++++++++-- ...test_assertionArgumentOrderExpectedLeft.py | 21 ++++-- 3 files changed, 108 insertions(+), 16 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/AssertionArgumentOrderCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/AssertionArgumentOrderCheck.java index 254c5a490..fcbe0f207 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/AssertionArgumentOrderCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/AssertionArgumentOrderCheck.java @@ -50,9 +50,12 @@ public class AssertionArgumentOrderCheck extends PythonSubscriptionCheck { private static final String PYTEST_EXPECTED_ON_RIGHT_MESSAGE = "Swap these 2 sides so they are in the correct order: actual value, expected value."; private static final String PYTEST_EXPECTED_ON_LEFT_MESSAGE = "Swap these 2 sides so they are in the correct order: expected value, actual value."; private static final String ASSERTPY_MESSAGE = "Pass the actual value to \"assert_that\" and the expected value to \"is_equal_to\"."; + private static final String EXPECTED_SECONDARY_MESSAGE = "Expected value."; + private static final String ACTUAL_SECONDARY_MESSAGE = "Actual value."; private static final String UNITTEST_QUICK_FIX_MESSAGE = "Swap the actual and expected arguments"; private static final String PYTEST_QUICK_FIX_MESSAGE = "Swap the actual and expected operands"; private static final String ASSERTPY_QUICK_FIX_MESSAGE = "Swap the actual and expected values"; + private static final String PYTEST_APPROX_EXPECTED_ARGUMENT_NAME = "expected"; private static final TypeMatcher UNITTEST_EQUALITY_ASSERTION_MATCHER = TypeMatchers.any( TypeMatchers.isType("unittest.case.TestCase.assertEqual"), @@ -113,6 +116,7 @@ private static void checkUnittestAssertion(SubscriptionContext ctx, CallExpressi if (areInvertedForActualExpected(firstArg.expression(), secondArg.expression(), ctx)) { var issue = ctx.addIssue(callExpression, UNITTEST_MESSAGE); + addActualExpectedSecondaryLocations(issue, secondArg.expression(), firstArg.expression()); createSwapQuickFix(firstArg.expression(), secondArg.expression(), UNITTEST_QUICK_FIX_MESSAGE, ctx).ifPresent(issue::addQuickFix); } } @@ -129,6 +133,7 @@ private void checkPytestAssertion(SubscriptionContext ctx, AssertStatement asser if (areInvertedForConfiguredPytestOrder(binaryExpression.leftOperand(), binaryExpression.rightOperand(), ctx)) { var issue = ctx.addIssue(condition, pytestMessage()); + addActualExpectedSecondaryLocations(issue, pytestActualExpression(binaryExpression, ctx), pytestExpectedExpression(binaryExpression, ctx)); createPytestQuickFix(binaryExpression, ctx).ifPresent(issue::addQuickFix); } } @@ -155,10 +160,18 @@ private static void checkAssertpyAssertion(SubscriptionContext ctx, CallExpressi if (areInvertedForActualExpected(actualArg.expression(), expectedArg.expression(), ctx)) { var issue = ctx.addIssue(callExpression, ASSERTPY_MESSAGE); + // On the noncompliant path the assertion arguments are inverted: the assert_that slot + // holds the expected value and the is_equal_to slot holds the actual value. + addActualExpectedSecondaryLocations(issue, expectedArg.expression(), actualArg.expression()); createSwapQuickFix(actualArg.expression(), expectedArg.expression(), ASSERTPY_QUICK_FIX_MESSAGE, ctx).ifPresent(issue::addQuickFix); } } + private static void addActualExpectedSecondaryLocations(org.sonar.plugins.python.api.PythonCheck.PreciseIssue issue, Expression actualExpression, Expression expectedExpression) { + issue.secondary(expectedExpression, EXPECTED_SECONDARY_MESSAGE); + issue.secondary(actualExpression, ACTUAL_SECONDARY_MESSAGE); + } + private Optional createPytestQuickFix(BinaryExpression binaryExpression, SubscriptionContext ctx) { Expression actualOperand = expectedOnRight ? binaryExpression.leftOperand() : binaryExpression.rightOperand(); Expression expectedOperand = expectedOnRight ? binaryExpression.rightOperand() : binaryExpression.leftOperand(); @@ -167,7 +180,7 @@ private Optional createPytestQuickFix(BinaryExpression binaryExp return createSwapQuickFix(binaryExpression.leftOperand(), binaryExpression.rightOperand(), PYTEST_QUICK_FIX_MESSAGE, ctx); } - RegularArgument approxExpectedArg = TreeUtils.nthArgumentOrKeyword(0, "expected", approxCall.arguments()); + RegularArgument approxExpectedArg = TreeUtils.nthArgumentOrKeyword(0, PYTEST_APPROX_EXPECTED_ARGUMENT_NAME, approxCall.arguments()); if (approxExpectedArg == null) { return Optional.empty(); } @@ -313,6 +326,16 @@ private String pytestMessage() { return expectedOnRight ? PYTEST_EXPECTED_ON_RIGHT_MESSAGE : PYTEST_EXPECTED_ON_LEFT_MESSAGE; } + private Expression pytestActualExpression(BinaryExpression binaryExpression, SubscriptionContext ctx) { + Expression actualExpression = expectedOnRight ? binaryExpression.rightOperand() : binaryExpression.leftOperand(); + return unwrapPytestApproxArgument(actualExpression, ctx); + } + + private Expression pytestExpectedExpression(BinaryExpression binaryExpression, SubscriptionContext ctx) { + Expression expectedExpression = expectedOnRight ? binaryExpression.leftOperand() : binaryExpression.rightOperand(); + return unwrapPytestApproxArgument(expectedExpression, ctx); + } + private static boolean isExpectedValue(Expression expression, SubscriptionContext ctx) { Expression unwrapped = Expressions.removeParentheses(expression); if (CheckUtils.isConstant(unwrapped)) { @@ -322,7 +345,7 @@ private static boolean isExpectedValue(Expression expression, SubscriptionContex return true; } if (unwrapped instanceof Name name) { - return Expressions.singleAssignedNonNameValue(name).filter(CheckUtils::isConstant).isPresent(); + return Expressions.singleAssignedNonNameValue(name).filter(CheckUtils::isImmutableConstant).isPresent(); } return false; } @@ -331,10 +354,19 @@ private static boolean isPytestApproxExpectedValue(Expression expression, Subscr if (!(expression instanceof CallExpression callExpression) || !PYTEST_APPROX_MATCHER.isTrueFor(callExpression.callee(), ctx)) { return false; } - RegularArgument expectedArg = TreeUtils.nthArgumentOrKeyword(0, "expected", callExpression.arguments()); + RegularArgument expectedArg = TreeUtils.nthArgumentOrKeyword(0, PYTEST_APPROX_EXPECTED_ARGUMENT_NAME, callExpression.arguments()); return expectedArg != null && isExpectedValue(expectedArg.expression(), ctx); } + private static Expression unwrapPytestApproxArgument(Expression expression, SubscriptionContext ctx) { + CallExpression approxCall = asPytestApproxCall(expression, ctx); + if (approxCall == null) { + return expression; + } + RegularArgument expectedArg = TreeUtils.nthArgumentOrKeyword(0, PYTEST_APPROX_EXPECTED_ARGUMENT_NAME, approxCall.arguments()); + return expectedArg != null ? expectedArg.expression() : expression; + } + private static boolean isSupportedTestFunction(SubscriptionContext ctx, Tree tree) { FunctionDef functionDef = (FunctionDef) TreeUtils.firstAncestorOfKind(tree, Tree.Kind.FUNCDEF); return functionDef != null && (UnittestUtils.isWithinUnittestTestCase(functionDef) || UnittestUtils.isPytestStyleTestFunction(functionDef, ctx.pythonFile().fileName())); diff --git a/python-checks/src/test/resources/checks/tests/test_assertionArgumentOrder.py b/python-checks/src/test/resources/checks/tests/test_assertionArgumentOrder.py index 27d16d8a2..c65d4f360 100644 --- a/python-checks/src/test/resources/checks/tests/test_assertionArgumentOrder.py +++ b/python-checks/src/test/resources/checks/tests/test_assertionArgumentOrder.py @@ -16,8 +16,11 @@ def value(): class TestUnittestAssertions(unittest.TestCase): def test_swapped_equality_arguments(self): - self.assertEqual(42, value()) # Noncompliant {{Swap these 2 arguments so they are in the correct order: actual value, expected value.}} -# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 0 + self.assertEqual(42, value()) +# Noncompliant@-1 {{Swap these 2 arguments so they are in the correct order: actual value, expected value.}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@-1 +# ^^@-2< {{Expected value.}} +# ^^^^^^^@-3< {{Actual value.}} self.assertEqual(first=EXPECTED_COUNT, second=value()) # Noncompliant self.assertIs(None, value()) # Noncompliant self.assertAlmostEqual(EXPECTED_PI, value()) # Noncompliant @@ -31,6 +34,33 @@ def test_swapped_equality_arguments(self): self.assertTrue(value()) helper.assertEqual(value(), 42) + def test_mutable_collection_actual_with_loop_expected(self): + for expected in ([3], [3, 1], [1]): + with self.subTest(expected=expected): + log = [] + log.append(1) + self.assertEqual(log, expected) + + def test_mutable_collection_append_before_assignment(self): + def f1(): + log.append(1) + + def f2(): + log.append(2) + + def f3(): + log.append(3) + + for what, expected in ( + (f1, [1]), + (f2, [2]), + (f3, [3]), + ): + with self.subTest(what=what.__name__, expected=expected): + log = [] + what() + self.assertEqual(log, expected) + class Helper: def test_not_a_unittest_test_case(self): @@ -38,8 +68,11 @@ def test_not_a_unittest_test_case(self): def test_pytest_assertions(): - assert 42 == value() # Noncompliant {{Swap these 2 sides so they are in the correct order: actual value, expected value.}} -# ^^^^^^^^^^^^^ 0 + assert 42 == value() +# Noncompliant@-1 {{Swap these 2 sides so they are in the correct order: actual value, expected value.}} +# ^^^^^^^^^^^^^@-1 +# ^^@-2< {{Expected value.}} +# ^^^^^^^@-3< {{Actual value.}} assert EXPECTED_COUNT == value() # Noncompliant assert pytest.approx(EXPECTED_PI) == value() # Noncompliant @@ -50,13 +83,20 @@ def test_pytest_assertions(): assert 42 == EXPECTED_COUNT assert value() assert 42 != value() - assert 42 == pytest.approx(value()) # Noncompliant + assert 42 == pytest.approx(value()) +# Noncompliant@-1 +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^@-1 +# ^^@-2< {{Expected value.}} +# ^^^^^^^@-3< {{Actual value.}} assert 42 == pytest.approx(other=value()) # Noncompliant def test_assertpy_assertions(): - assert_that(42).is_equal_to(value()) # Noncompliant {{Pass the actual value to "assert_that" and the expected value to "is_equal_to".}} -# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 0 + assert_that(42).is_equal_to(value()) +# Noncompliant@-1 {{Pass the actual value to "assert_that" and the expected value to "is_equal_to".}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@-1 +# ^^@-2< {{Expected value.}} +# ^^^^^^^@-3< {{Actual value.}} assert_that(EXPECTED_COUNT).is_equal_to(value()) # Noncompliant assert_that(42).described_as("count").is_equal_to(value()) # Noncompliant assert_that(EXPECTED_COUNT).described_as("count").snapshot("baseline").is_equal_to(value()) # Noncompliant @@ -77,3 +117,14 @@ def test_assertpy_assertions(): def helper_assertions(): assert 42 == value() assert_that(42).is_equal_to(value()) + + +def test_mutable_collection_actual(expected): + result = [] + assert result == expected + + +def test_assertion_with_message(close, expected): + result = [] + result.append(value()) + assert result == expected, (close, result, expected) diff --git a/python-checks/src/test/resources/checks/tests/test_assertionArgumentOrderExpectedLeft.py b/python-checks/src/test/resources/checks/tests/test_assertionArgumentOrderExpectedLeft.py index 9d001c683..81eb332d4 100644 --- a/python-checks/src/test/resources/checks/tests/test_assertionArgumentOrderExpectedLeft.py +++ b/python-checks/src/test/resources/checks/tests/test_assertionArgumentOrderExpectedLeft.py @@ -13,14 +13,20 @@ def value(): class TestUnittestAssertions(unittest.TestCase): def test_unittest_assertions_are_unchanged(self): - self.assertEqual(42, value()) # Noncompliant {{Swap these 2 arguments so they are in the correct order: actual value, expected value.}} -# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 0 + self.assertEqual(42, value()) +# Noncompliant@-1 {{Swap these 2 arguments so they are in the correct order: actual value, expected value.}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@-1 +# ^^@-2< {{Expected value.}} +# ^^^^^^^@-3< {{Actual value.}} self.assertEqual(value(), 42) def test_pytest_assertions_expected_on_left(): - assert value() == 42 # Noncompliant {{Swap these 2 sides so they are in the correct order: expected value, actual value.}} -# ^^^^^^^^^^^^^ 0 + assert value() == 42 +# Noncompliant@-1 {{Swap these 2 sides so they are in the correct order: expected value, actual value.}} +# ^^^^^^^^^^^^^@-1 +# ^^@-2< {{Expected value.}} +# ^^^^^^^@-3< {{Actual value.}} assert value() == EXPECTED_COUNT # Noncompliant assert value() == pytest.approx(EXPECTED_PI) # Noncompliant @@ -31,6 +37,9 @@ def test_pytest_assertions_expected_on_left(): def test_assertpy_assertions_are_unchanged(): - assert_that(42).is_equal_to(value()) # Noncompliant {{Pass the actual value to "assert_that" and the expected value to "is_equal_to".}} -# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 0 + assert_that(42).is_equal_to(value()) +# Noncompliant@-1 {{Pass the actual value to "assert_that" and the expected value to "is_equal_to".}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@-1 +# ^^@-2< {{Expected value.}} +# ^^^^^^^@-3< {{Actual value.}} assert_that(value()).is_equal_to(42) From 993dcfbd72aa13152fa7f11b0909ccd47686e476 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 9 Jul 2026 14:11:57 +0200 Subject: [PATCH 187/322] Update dependency python to v3.14.6 (#1270) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> GitOrigin-RevId: 395f9d07b05d55c89829672ec6328c581089a760 --- mise.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mise.toml b/mise.toml index 9c323f9d6..47bb4b7d5 100644 --- a/mise.toml +++ b/mise.toml @@ -1,6 +1,6 @@ [tools] java = "21.0" maven = "3.9" -python = "3.9" +python = "3.14.6" uv = "latest" # required for pipx backend "pipx:tox" = { version = "4.49.1", uvx = "true" } From a45cc5d02e5afe14621cd9b85e02fe4300bccdd5 Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Thu, 9 Jul 2026 14:19:28 +0200 Subject: [PATCH 188/322] SONARPY-4346 : Port S5779 to python: Assertions should not be made within the try block of a try-except catching AssertionErrors (#1272) GitOrigin-RevId: f54664adbdcb9ef58ca2c79f6c667fc2b226cfdb --- .../python/checks/OpenSourceCheckList.java | 2 + .../tests/AssertionArgumentOrderCheck.java | 24 +- .../checks/tests/AssertionInTryCheck.java | 242 +++++++++++++++++ .../python/checks/utils/AssertpyUtils.java | 53 ++++ .../org/sonar/l10n/py/rules/python/S5779.html | 220 ++++++++++++++++ .../org/sonar/l10n/py/rules/python/S5779.json | 26 ++ .../py/rules/python/Sonar_way_profile.json | 1 + .../checks/tests/AssertionInTryCheckTest.java | 36 +++ .../resources/checks/tests/assertionInTry.py | 249 ++++++++++++++++++ 9 files changed, 831 insertions(+), 22 deletions(-) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/tests/AssertionInTryCheck.java create mode 100644 python-checks/src/main/java/org/sonar/python/checks/utils/AssertpyUtils.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5779.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5779.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/tests/AssertionInTryCheckTest.java create mode 100644 python-checks/src/test/resources/checks/tests/assertionInTry.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index aff18365a..b7fac458a 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -91,6 +91,7 @@ import org.sonar.python.checks.regex.UnusedGroupNamesCheck; import org.sonar.python.checks.regex.VerboseRegexCheck; import org.sonar.python.checks.tests.AssertAfterRaiseCheck; +import org.sonar.python.checks.tests.AssertionInTryCheck; import org.sonar.python.checks.tests.AssertOnDissimilarTypesCheck; import org.sonar.python.checks.tests.AssertOnTupleLiteralCheck; import org.sonar.python.checks.tests.AssertionArgumentOrderCheck; @@ -122,6 +123,7 @@ public Stream> getChecks() { AssertAfterRaiseCheck.class, AssertOnTupleLiteralCheck.class, AssertionArgumentOrderCheck.class, + AssertionInTryCheck.class, AsyncFunctionNotAsyncCheck.class, AsyncFunctionWithTimeoutCheck.class, AsyncioTaskNotStoredCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/AssertionArgumentOrderCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/AssertionArgumentOrderCheck.java index fcbe0f207..4754d51d7 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/AssertionArgumentOrderCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/AssertionArgumentOrderCheck.java @@ -37,6 +37,7 @@ import org.sonar.plugins.python.api.tree.Tree; import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.checks.utils.AssertpyUtils; import org.sonar.python.checks.utils.CheckUtils; import org.sonar.python.checks.utils.Expressions; import org.sonar.python.checks.utils.UnittestUtils; @@ -66,7 +67,6 @@ public class AssertionArgumentOrderCheck extends PythonSubscriptionCheck { TypeMatchers.isType("unittest.case.TestCase.assertIs"), TypeMatchers.isType("unittest.case.TestCase.assertIsNot")); private static final TypeMatcher PYTEST_APPROX_MATCHER = TypeMatchers.isType("pytest.approx"); - private static final TypeMatcher ASSERTPY_ASSERT_THAT_MATCHER = TypeMatchers.isType("assertpy.assert_that"); private static final TypeMatcher ASSERTPY_IS_EQUAL_TO_MATCHER = TypeMatchers.isType("assertpy.AssertionBuilder.is_equal_to"); @RuleProperty( @@ -147,7 +147,7 @@ private static void checkAssertpyAssertion(SubscriptionContext ctx, CallExpressi return; } - CallExpression assertThatCall = originatingAssertThatCall(qualifiedExpression.qualifier(), ctx); + CallExpression assertThatCall = AssertpyUtils.originatingAssertThatCall(qualifiedExpression.qualifier(), ctx); if (assertThatCall == null) { return; } @@ -292,26 +292,6 @@ private static ParameterNames parameterNames(Expression callee, SubscriptionCont return null; } - private static boolean isAssertThatCall(CallExpression callExpression, SubscriptionContext ctx) { - return ASSERTPY_ASSERT_THAT_MATCHER.isTrueFor(callExpression.callee(), ctx); - } - - @Nullable - private static CallExpression originatingAssertThatCall(Expression expression, SubscriptionContext ctx) { - Expression qualifier = Expressions.removeParentheses(expression); - while (qualifier instanceof CallExpression callExpression) { - if (isAssertThatCall(callExpression, ctx)) { - return callExpression; - } - Expression callee = Expressions.removeParentheses(callExpression.callee()); - if (!(callee instanceof QualifiedExpression qualifiedExpression)) { - return null; - } - qualifier = Expressions.removeParentheses(qualifiedExpression.qualifier()); - } - return null; - } - private static boolean areInvertedForActualExpected(Expression actualPosition, Expression expectedPosition, SubscriptionContext ctx) { return isExpectedValue(actualPosition, ctx) && !isExpectedValue(expectedPosition, ctx); } diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/AssertionInTryCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/AssertionInTryCheck.java new file mode 100644 index 000000000..f01043ee3 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/AssertionInTryCheck.java @@ -0,0 +1,242 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import java.util.List; +import java.util.Map; +import java.util.Optional; +import javax.annotation.Nullable; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.ExceptClause; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.ExpressionStatement; +import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.QualifiedExpression; +import org.sonar.plugins.python.api.tree.RaiseStatement; +import org.sonar.plugins.python.api.tree.StatementList; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.tree.TryStatement; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.checks.utils.AssertpyUtils; +import org.sonar.python.checks.utils.CheckUtils; +import org.sonar.python.checks.utils.Expressions; +import org.sonar.python.checks.utils.UnittestUtils; +import org.sonar.python.tree.TreeUtils; + +import static org.sonar.plugins.python.api.types.BuiltinTypes.BASE_EXCEPTION; +import static org.sonar.plugins.python.api.types.BuiltinTypes.EXCEPTION; + +@Rule(key = "S5779") +public class AssertionInTryCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Don't use %s inside a try-except that catches AssertionError."; + private static final String ASSERTION_ERROR_SECONDARY_MESSAGE = "AssertionError is caught here."; + private static final String EXCEPTION_SECONDARY_MESSAGE = "Exception is caught here."; + private static final String BASE_EXCEPTION_SECONDARY_MESSAGE = "BaseException is caught here."; + private static final String BARE_EXCEPT_SECONDARY_MESSAGE = "All exceptions are caught here."; + + private static final TypeMatcher ASSERTION_ERROR_TYPE_MATCHER = TypeMatchers.any( + TypeMatchers.isType("AssertionError"), + TypeMatchers.isOrExtendsType("builtins.AssertionError")); + private static final TypeMatcher EXCEPTION_TYPE_MATCHER = TypeMatchers.any( + TypeMatchers.isObjectOfType(EXCEPTION), + TypeMatchers.isType(EXCEPTION)); + private static final TypeMatcher BASE_EXCEPTION_TYPE_MATCHER = TypeMatchers.any( + TypeMatchers.isObjectOfType(BASE_EXCEPTION), + TypeMatchers.isType(BASE_EXCEPTION)); + private static final TypeMatcher CATCHES_ASSERTION_ERROR_MATCHER = TypeMatchers.any( + ASSERTION_ERROR_TYPE_MATCHER, + EXCEPTION_TYPE_MATCHER, + BASE_EXCEPTION_TYPE_MATCHER); + private static final List> SECONDARY_MESSAGES_BY_EXCEPTION_TYPE = List.of( + Map.entry(ASSERTION_ERROR_TYPE_MATCHER, ASSERTION_ERROR_SECONDARY_MESSAGE), + Map.entry(EXCEPTION_TYPE_MATCHER, EXCEPTION_SECONDARY_MESSAGE), + Map.entry(BASE_EXCEPTION_TYPE_MATCHER, BASE_EXCEPTION_SECONDARY_MESSAGE)); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.ASSERT_STMT, ctx -> checkAssertion(ctx, ctx.syntaxNode(), "assert")); + context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, ctx -> checkCallExpression(ctx, (CallExpression) ctx.syntaxNode())); + } + + @Override + public CheckScope scope() { + return CheckScope.ALL; + } + + private static void checkCallExpression(SubscriptionContext ctx, CallExpression callExpression) { + String assertionName = unittestAssertionName(callExpression); + if (assertionName == null) { + assertionName = assertpyAssertionName(callExpression, ctx); + } + if (assertionName != null) { + checkAssertion(ctx, callExpression, assertionName); + } + } + + private static void checkAssertion(SubscriptionContext ctx, Tree assertion, String assertionName) { + findTrySwallowingAssertionError(assertion, ctx).ifPresent(tryStatement -> { + ExceptClause exceptClause = exceptClauseCatchingAssertionError(tryStatement, ctx); + ctx.addIssue(assertion, String.format(MESSAGE, assertionName)) + .secondary(exceptClause.exception() != null ? exceptClause.exception() : exceptClause.exceptKeyword(), + secondaryMessage(exceptClause, ctx)); + }); + } + + private static Optional findTrySwallowingAssertionError(Tree tree, SubscriptionContext ctx) { + TryStatement tryStatement = enclosingTryStatementInBody(tree); + while (tryStatement != null) { + ExceptClause exceptClause = exceptClauseCatchingAssertionError(tryStatement, ctx); + if (exceptClause != null && !exceptClauseReraises(exceptClause)) { + return Optional.of(tryStatement); + } + tryStatement = enclosingTryStatementInBody(tryStatement); + } + return Optional.empty(); + } + + @Nullable + private static TryStatement enclosingTryStatementInBody(Tree tree) { + TryStatement tryStatement = (TryStatement) TreeUtils.firstAncestorOfKind(tree, Tree.Kind.TRY_STMT); + while (tryStatement != null) { + if (isDescendantOf(tryStatement.body(), tree)) { + return tryStatement; + } + tryStatement = (TryStatement) TreeUtils.firstAncestorOfKind(tryStatement.parent(), Tree.Kind.TRY_STMT); + } + return null; + } + + @Nullable + private static ExceptClause exceptClauseCatchingAssertionError(TryStatement tryStatement, SubscriptionContext ctx) { + for (ExceptClause exceptClause : tryStatement.exceptClauses()) { + if (exceptClause.starToken() != null) { + continue; + } + Expression exception = exceptClause.exception(); + if (exception == null) { + return exceptClause; + } + for (Expression caughtException : TreeUtils.flattenTuples(exception).toList()) { + if (canCatchAssertionError(caughtException, ctx)) { + return exceptClause; + } + } + } + return null; + } + + private static boolean canCatchAssertionError(Expression caughtException, SubscriptionContext ctx) { + return CATCHES_ASSERTION_ERROR_MATCHER.isTrueFor(Expressions.removeParentheses(caughtException), ctx); + } + + private static boolean exceptClauseReraises(ExceptClause exceptClause) { + return TreeUtils.hasDescendant(exceptClause.body(), tree -> { + if (!tree.is(Tree.Kind.RAISE_STMT)) { + return false; + } + RaiseStatement raiseStatement = (RaiseStatement) tree; + if (raiseStatement.expressions().isEmpty()) { + return true; + } + if (exceptClause.exceptionInstance() == null || raiseStatement.expressions().size() != 1) { + return false; + } + return CheckUtils.areEquivalent( + Expressions.removeParentheses(exceptClause.exceptionInstance()), + Expressions.removeParentheses(raiseStatement.expressions().get(0))); + }); + } + + private static String secondaryMessage(ExceptClause exceptClause, SubscriptionContext ctx) { + Expression exception = exceptClause.exception(); + if (exception == null) { + return BARE_EXCEPT_SECONDARY_MESSAGE; + } + for (Expression caughtException : TreeUtils.flattenTuples(exception).toList()) { + String message = secondaryMessageForException(Expressions.removeParentheses(caughtException), ctx); + if (message != null) { + return message; + } + } + return ASSERTION_ERROR_SECONDARY_MESSAGE; + } + + @Nullable + private static String secondaryMessageForException(Expression caughtException, SubscriptionContext ctx) { + return SECONDARY_MESSAGES_BY_EXCEPTION_TYPE.stream() + .filter(entry -> entry.getKey().isTrueFor(caughtException, ctx)) + .map(Map.Entry::getValue) + .findFirst() + .orElse(null); + } + + @Nullable + private static String unittestAssertionName(CallExpression callExpression) { + ExpressionStatement parent = parentExpressionStatement(callExpression); + if (parent == null || parent.expressions().size() != 1) { + return null; + } + Expression callee = Expressions.removeParentheses(callExpression.callee()); + if (!(callee instanceof QualifiedExpression qualifiedExpression)) { + return null; + } + if (!(qualifiedExpression.qualifier() instanceof Name qualifier) || !"self".equals(qualifier.name())) { + return null; + } + String methodName = qualifiedExpression.name().name(); + return UnittestUtils.allAssertMethods().contains(methodName) ? methodName : null; + } + + @Nullable + private static String assertpyAssertionName(CallExpression callExpression, SubscriptionContext ctx) { + ExpressionStatement parent = parentExpressionStatement(callExpression); + if (parent == null) { + return null; + } + if (AssertpyUtils.isAssertThatCall(callExpression, ctx)) { + if (callExpression.parent().is(Tree.Kind.QUALIFIED_EXPR)) { + return null; + } + return "assert_that"; + } + Expression callee = Expressions.removeParentheses(callExpression.callee()); + if (!(callee instanceof QualifiedExpression qualifiedExpression)) { + return null; + } + if (AssertpyUtils.originatingAssertThatCall(qualifiedExpression.qualifier(), ctx) == null) { + return null; + } + return qualifiedExpression.name().name(); + } + + @Nullable + private static ExpressionStatement parentExpressionStatement(CallExpression callExpression) { + if (!(callExpression.parent() instanceof ExpressionStatement expressionStatement)) { + return null; + } + return expressionStatement; + } + + private static boolean isDescendantOf(StatementList statementList, Tree tree) { + return TreeUtils.hasDescendant(statementList, descendant -> descendant == tree); + } +} diff --git a/python-checks/src/main/java/org/sonar/python/checks/utils/AssertpyUtils.java b/python-checks/src/main/java/org/sonar/python/checks/utils/AssertpyUtils.java new file mode 100644 index 000000000..6dccd5698 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/utils/AssertpyUtils.java @@ -0,0 +1,53 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.utils; + +import javax.annotation.Nullable; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.QualifiedExpression; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; + +public final class AssertpyUtils { + + private static final TypeMatcher ASSERTPY_ASSERT_THAT_MATCHER = TypeMatchers.isType("assertpy.assert_that"); + + private AssertpyUtils() { + } + + public static boolean isAssertThatCall(CallExpression callExpression, SubscriptionContext ctx) { + return ASSERTPY_ASSERT_THAT_MATCHER.isTrueFor(callExpression.callee(), ctx); + } + + @Nullable + public static CallExpression originatingAssertThatCall(Expression expression, SubscriptionContext ctx) { + Expression qualifier = Expressions.removeParentheses(expression); + while (qualifier instanceof CallExpression callExpression) { + if (isAssertThatCall(callExpression, ctx)) { + return callExpression; + } + Expression callee = Expressions.removeParentheses(callExpression.callee()); + if (!(callee instanceof QualifiedExpression qualifiedExpression)) { + return null; + } + qualifier = Expressions.removeParentheses(qualifiedExpression.qualifier()); + } + return null; + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5779.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5779.html new file mode 100644 index 000000000..576308d34 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5779.html @@ -0,0 +1,220 @@ +

              This is an issue when assertion statements, assertion methods, or fluent assertions are placed within a try block that catches +AssertionError exceptions without properly handling or re-raising them.

              +

              Why is this an issue?

              +

              Assertions in Python raise an AssertionError when they fail. This includes built-in assert statements, +unittest assertion helpers such as assertEqual, and fluent assertions from libraries such as assertpy. This is +the mechanism testing frameworks use to detect test failures.

              +

              When you place assertions within a try-except block that catches AssertionError (or its parent class Exception), and you +don’t re-raise the exception or validate its properties, you create a silent failure scenario. The assertion can fail, but the exception gets +swallowed by the except block, causing the test to pass when it should have failed.

              +

              This defeats the entire purpose of writing assertions in tests. The test appears to pass, giving false confidence that the code works correctly, +when in reality the assertion failed and detected a problem.

              +

              The root cause of this anti-pattern is usually a misunderstanding of exception handling in tests. Developers might add try-except blocks around +assertions thinking they need to "handle" exceptions, but assertions are meant to propagate upward to the test framework.

              +

              This issue commonly occurs when:

              +
                +
              • Developers are testing code that raises exceptions and incorrectly wrap assertions in try-except blocks
              • +
              • Code is copied from production exception handling patterns and applied inappropriately in tests
              • +
              • Developers want to add context to assertion failures but do so incorrectly
              • +
              • Fluent assertions from libraries such as assertpy are treated like ordinary code inside a try-except AssertionError + block
              • +
              +

              What is the potential impact?

              +

              When assertions are silently caught and ignored, tests provide false confidence in the codebase. Code that should fail tests will appear to pass, +allowing bugs to reach production.

              +

              This can lead to:

              +
                +
              • Security vulnerabilities going undetected if security-related tests falsely pass
              • +
              • Functional bugs making it to production, causing user-facing issues
              • +
              • Regression of previously working features without detection
              • +
              • Wasted debugging time when issues are discovered later in the development cycle or in production
              • +
              • Loss of trust in the test suite’s reliability
              • +
              +

              How to fix it in unittest

              +

              Code examples

              +

              Noncompliant code example

              +

              The assertion (self.fail(…​)) raises an AssertionError, which is immediately caught by the surrounding except +AssertionError block and silently discarded. As a result, the test can never fail, even when do_something() does not behave as +expected.

              +
              +import unittest
              +
              +class MyTest(unittest.TestCase):
              +    def test_should_raise_error(self):
              +        try:
              +            self.do_something()
              +            self.fail("Expected an AssertionError!")  # Noncompliant
              +        except AssertionError:
              +            pass
              +
              +    def do_something(self):
              +        raise AssertionError("Something went wrong")
              +
              +

              This variation has the same problem: the AssertionError is caught locally and ignored. The test appears to check the exception +details, but it never validates anything about the caught error.

              +
              +import unittest
              +
              +class MyTest(unittest.TestCase):
              +    def test_error_message(self):
              +        try:
              +            self.do_something()
              +            self.fail("Expected an AssertionError!")  # Noncompliant
              +        except AssertionError as e:
              +            pass  # Exception caught but not validated
              +
              +    def do_something(self):
              +        raise AssertionError("Something went wrong")
              +
              +

              Compliant solution

              +

              Use the proper assertion context managers provided by the testing framework. The assertRaises context manager is designed specifically +for testing that exceptions are raised, without accidentally catching assertion failures.

              +
              +import unittest
              +
              +class MyTest(unittest.TestCase):
              +    def test_should_raise_error(self):
              +        with self.assertRaises(AssertionError):
              +            self.do_something()
              +
              +    def do_something(self):
              +        raise AssertionError("Something went wrong")
              +
              +

              If you need to verify specific properties of the exception, you can access the exception object through the context manager and make assertions +about it after the context exits. This ensures the exception is properly raised while still allowing you to validate its details.

              +
              +import unittest
              +
              +class MyTest(unittest.TestCase):
              +    def test_error_message(self):
              +        with self.assertRaises(AssertionError) as context:
              +            self.do_something()
              +
              +        self.assertEqual(str(context.exception), "Something went wrong")
              +
              +    def do_something(self):
              +        raise AssertionError("Something went wrong")
              +
              +

              How to fix it in pytest

              +

              Code examples

              +

              Noncompliant code example

              +

              The assert False statement raises an AssertionError, which is then swallowed by the surrounding except +AssertionError block. Because of that, the test can never fail when do_something() does not raise the expected error.

              +
              +import pytest
              +
              +def test_should_raise_error():
              +    try:
              +        do_something()
              +        assert False, "Expected an AssertionError!"  # Noncompliant
              +    except AssertionError:
              +        pass
              +
              +def do_something():
              +    raise AssertionError("Something went wrong")
              +
              +

              Here too, the caught AssertionError is never validated or re-raised. The test silently succeeds instead of checking that the expected +failure really happened.

              +
              +import pytest
              +
              +def test_error_details():
              +    try:
              +        do_something()
              +        assert False, "Expected an AssertionError!"  # Noncompliant
              +    except AssertionError as e:
              +        pass  # Exception details not validated
              +
              +def do_something():
              +    raise AssertionError("Something went wrong")
              +
              +

              Compliant solution

              +

              When using pytest, use the pytest.raises context manager to properly test for exceptions. This ensures that assertion failures are not +accidentally caught.

              +
              +import pytest
              +
              +def test_should_raise_error():
              +    with pytest.raises(AssertionError):
              +        do_something()
              +
              +def do_something():
              +    raise AssertionError("Something went wrong")
              +
              +

              To validate specific exception properties with pytest, access the exception info from the context manager. You can then make assertions about the +exception message or other attributes.

              +
              +import pytest
              +
              +def test_error_details():
              +    with pytest.raises(AssertionError) as exc_info:
              +        do_something()
              +
              +    assert str(exc_info.value) == "Something went wrong"
              +
              +def do_something():
              +    raise AssertionError("Something went wrong")
              +
              +

              How to fix it in assertpy

              +

              Code examples

              +

              Noncompliant code example

              +

              With assertpy, fluent assertions still raise AssertionError. Catching that exception in the surrounding +try-except block can hide a failing test.

              +
              +from assertpy import assert_that
              +
              +def test_result():
              +    try:
              +        result = get_result()
              +        assert_that(result).is_equal_to("expected")  # Noncompliant
              +    except AssertionError:
              +        pass
              +
              +

              This variation also catches the failing assertion locally and ignores it. Even if assert_that(…​) fails, the test still passes because +nothing validates or re-raises the caught exception.

              +
              +from assertpy import assert_that
              +
              +def test_error_message():
              +    try:
              +        do_something()
              +        assert_that(False).described_as("Expected an AssertionError!").is_true()  # Noncompliant
              +    except AssertionError as exc:
              +        pass  # Exception caught but not validated
              +
              +def do_something():
              +    raise AssertionError("Something went wrong")
              +
              +

              Compliant solution

              +

              Keep the assertpy assertion outside the try-except block so test failures are reported normally.

              +
              +from assertpy import assert_that
              +
              +def test_result():
              +    result = get_result()
              +    assert_that(result).is_equal_to("expected")
              +
              +

              When you intentionally verify an AssertionError, use a dedicated exception assertion and then validate the message.

              +
              +import pytest
              +
              +def test_error_message():
              +    with pytest.raises(AssertionError) as exc_info:
              +        do_something()
              +
              +    assert str(exc_info.value) == "Something went wrong"
              +
              +def do_something():
              +    raise AssertionError("Something went wrong")
              +
              +

              Resources

              +

              Documentation

              + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5779.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5779.json new file mode 100644 index 000000000..a67a3c56e --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5779.json @@ -0,0 +1,26 @@ +{ + "title": "Assertions should not be made within the try block of a try-except catching AssertionError", + "type": "BUG", + "code": { + "impacts": { + "RELIABILITY": "HIGH" + }, + "attribute": "LOGICAL" + }, + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "tests", + "assertpy", + "pytest", + "unittest" + ], + "defaultSeverity": "Critical", + "ruleSpecification": "RSPEC-5779", + "sqKey": "S5779", + "scope": "Tests", + "quickfix": "unknown" +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 06682ca2d..c34eff895 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -135,6 +135,7 @@ "S5754", "S5756", "S5778", + "S5779", "S5780", "S5781", "S5795", diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/AssertionInTryCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/AssertionInTryCheckTest.java new file mode 100644 index 000000000..30ca3aed2 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/AssertionInTryCheckTest.java @@ -0,0 +1,36 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import org.junit.jupiter.api.Test; +import org.sonar.plugins.python.api.PythonCheck; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class AssertionInTryCheckTest { + + @Test + void scope() { + assertEquals(PythonCheck.CheckScope.ALL, new AssertionInTryCheck().scope()); + } + + @Test + void sample() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/assertionInTry.py", new AssertionInTryCheck()); + } +} diff --git a/python-checks/src/test/resources/checks/tests/assertionInTry.py b/python-checks/src/test/resources/checks/tests/assertionInTry.py new file mode 100644 index 000000000..3168d5297 --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/assertionInTry.py @@ -0,0 +1,249 @@ +import unittest +import builtins + +import pytest +from assertpy import assert_that + + +def do_something(): + raise AssertionError("Something went wrong") + + +def get_result(): + return "actual" + + +def test_pytest_assert_in_try(): + try: + do_something() + assert False, "Expected an AssertionError!" # Noncompliant {{Don't use assert inside a try-except that catches AssertionError.}} + except AssertionError: + pass + + +def test_pytest_assert_with_exception_binding(): + try: + do_something() + assert False # Noncompliant {{Don't use assert inside a try-except that catches AssertionError.}} + except AssertionError as e: + pass + + +def test_pytest_assert_except_exception(): + try: + assert 1 == 2 # Noncompliant {{Don't use assert inside a try-except that catches AssertionError.}} + except Exception: + pass + + +def test_pytest_assert_except_base_exception(): + try: + assert 1 == 2 # Noncompliant {{Don't use assert inside a try-except that catches AssertionError.}} + except BaseException: + pass + + +def test_pytest_assert_bare_except(): + try: + assert 1 == 2 # Noncompliant {{Don't use assert inside a try-except that catches AssertionError.}} + except: + pass + + +class MyTest(unittest.TestCase): + def test_unittest_assert_equal(self): + try: + self.assertEqual(1, 2) # Noncompliant {{Don't use assertEqual inside a try-except that catches AssertionError.}} + except AssertionError: + pass + + def test_unittest_assert_true(self): + try: + self.assertTrue(False) # Noncompliant {{Don't use assertTrue inside a try-except that catches AssertionError.}} + except AssertionError as e: + pass + + +def test_assertpy(): + try: + result = get_result() + assert_that(result).is_equal_to("expected") # Noncompliant {{Don't use is_equal_to inside a try-except that catches AssertionError.}} + except AssertionError: + pass + + +def test_assert_in_nested_block(): + try: + if True: + assert 1 == 2 # Noncompliant {{Don't use assert inside a try-except that catches AssertionError.}} + except AssertionError: + pass + + +def test_nested_try_outer_swallows(): + try: + try: + assert 1 == 2 # Noncompliant {{Don't use assert inside a try-except that catches AssertionError.}} + except ValueError: + pass + except AssertionError: + pass + + +def test_tuple_except(): + try: + assert 1 == 2 # Noncompliant {{Don't use assert inside a try-except that catches AssertionError.}} + except (ValueError, AssertionError): + pass + + +def test_multiple_except_clauses(): + try: + assert 1 == 2 # Noncompliant {{Don't use assert inside a try-except that catches AssertionError.}} + except ValueError: + pass + except AssertionError: + pass + + +def test_multiple_except_clauses_exception(): + try: + assert 1 == 2 # Noncompliant {{Don't use assert inside a try-except that catches AssertionError.}} + except ValueError: + pass + except Exception: + pass + + +def test_assert_that_only(): + try: + assert_that(get_result()) # Noncompliant {{Don't use assert_that inside a try-except that catches AssertionError.}} + except AssertionError: + pass + + +def test_assertpy_described_as_chain(): + try: + assert_that(get_result()).described_as("msg").is_equal_to("expected") # Noncompliant {{Don't use is_equal_to inside a try-except that catches AssertionError.}} + except AssertionError: + pass + + +def test_multiple_assertions(): + try: + assert 1 == 2 # Noncompliant {{Don't use assert inside a try-except that catches AssertionError.}} + assert 3 == 4 # Noncompliant {{Don't use assert inside a try-except that catches AssertionError.}} + except AssertionError: + pass + + +def test_inner_reraise_outer_swallows(): + try: + try: + assert 1 == 2 # Noncompliant {{Don't use assert inside a try-except that catches AssertionError.}} + except AssertionError: + raise + except AssertionError: + pass + + +def test_assert_in_for_loop(): + try: + for _ in range(1): + assert 1 == 2 # Noncompliant {{Don't use assert inside a try-except that catches AssertionError.}} + except AssertionError: + pass + + +def test_qualified_assertion_error_except(): + try: + assert 1 == 2 # Noncompliant {{Don't use assert inside a try-except that catches AssertionError.}} + except builtins.AssertionError: + pass + + +def test_compliant_pytest_raises(): + with pytest.raises(AssertionError): + do_something() + + +def test_compliant_assert_outside_try(): + result = get_result() + assert_that(result).is_equal_to("actual") + + +def test_compliant_except_value_error_only(): + try: + assert 1 == 2 + except ValueError: + pass + + +def test_compliant_reraise(): + try: + assert 1 == 2 + except AssertionError: + raise + + +def test_compliant_reraise_with_binding(): + try: + assert 1 == 2 + except AssertionError as error: + raise error + + +def test_compliant_assert_in_except_block(): + try: + do_something() + except AssertionError: + assert True + + +def test_compliant_non_assert_call_in_try(): + try: + get_result() + except AssertionError: + pass + + +def test_compliant_assert_after_try(): + try: + do_something() + except AssertionError: + pass + assert True + + +def test_compliant_multiple_except_only_value_error_swallows(): + try: + raise ValueError() + except ValueError: + pass + except AssertionError: + pass + + +def test_compliant_star_except(): + try: + assert 1 == 2 + except* AssertionError: + pass + + +def test_compliant_inner_try_in_except_handler(): + try: + pass + except AssertionError: + try: + assert 1 == 2 + except ValueError: + pass + + +class MyOtherTest(unittest.TestCase): + def test_compliant_non_self_assert_call(self): + try: + unittest.TestCase.assertEqual(self, 1, 2) + except AssertionError: + pass From 2ea43a0fbe407d613c509ffe19b684161ce9ec43 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 9 Jul 2026 14:24:34 +0200 Subject: [PATCH 189/322] Update dependency pipx:tox to v4.56.1 (#1269) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> GitOrigin-RevId: 0b2f5e48107cbe4454c4b122200beac8aad337d1 --- mise.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mise.toml b/mise.toml index 47bb4b7d5..4c92fe811 100644 --- a/mise.toml +++ b/mise.toml @@ -3,4 +3,4 @@ java = "21.0" maven = "3.9" python = "3.14.6" uv = "latest" # required for pipx backend -"pipx:tox" = { version = "4.49.1", uvx = "true" } +"pipx:tox" = { version = "4.56.1", uvx = "true" } From 8a2988184dbb4d2144d92053f6e978e83bdecbe5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 9 Jul 2026 14:34:16 +0200 Subject: [PATCH 190/322] Update dependency java to v17.0.19+10 (#1267) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> GitOrigin-RevId: 689f17158c0af39f037d0d3b7cbed55952fbbfb0 --- mise.test-and-analyze.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mise.test-and-analyze.toml b/mise.test-and-analyze.toml index a040730e9..59d28a586 100644 --- a/mise.test-and-analyze.toml +++ b/mise.test-and-analyze.toml @@ -1,2 +1,2 @@ [tools] -java = "17.0" +java = "17.0.19+10" From 58bf74bad2464fd8fb68026d2b4af2c7117b1b08 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 9 Jul 2026 14:34:25 +0200 Subject: [PATCH 191/322] Update SL core to v11 (#1239) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> GitOrigin-RevId: 3b17f56a7cf535287ec9a3e425b99ae29af2eb5c --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 35011a3ca..38e761b6c 100644 --- a/pom.xml +++ b/pom.xml @@ -107,7 +107,7 @@ its/**,private/its-enterprise/**,python-frontend/typeshed_serializer/**,**/test/resources/** - 10.13.0.79996 + 11.5.0.85871 1.25.1.3886 4.29.0 6.2.7 From 5f5aa66adaca4bd0f844ccacbb34dc14bc72821d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 9 Jul 2026 14:50:47 +0200 Subject: [PATCH 192/322] Update sonarqube (#1238) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> GitOrigin-RevId: e86308d2c6bccadac9a2cf3d1b472ab9da1054db --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 38e761b6c..e32ff3d25 100644 --- a/pom.xml +++ b/pom.xml @@ -100,8 +100,8 @@ at SonarSource/sonarqube/gradle.properties --> Python Enterprise - 26.2.0.119303 - 13.0.0.3026 + 26.6.0.123539 + 13.8.0.4399 6.1.0.3962 2.25.0.4954 From 94e1b827953a67b965c0109dbcbed7b5d7954fb2 Mon Sep 17 00:00:00 2001 From: Victor Date: Thu, 9 Jul 2026 16:08:34 +0200 Subject: [PATCH 193/322] SONARPY-4355 Revert Renovate failing updates (#1278) GitOrigin-RevId: f9cddbc0d07018da628b98738c792a8c25a04c0d --- mise.test-and-analyze.toml | 2 +- mise.toml | 4 ++-- pom.xml | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/mise.test-and-analyze.toml b/mise.test-and-analyze.toml index 59d28a586..a040730e9 100644 --- a/mise.test-and-analyze.toml +++ b/mise.test-and-analyze.toml @@ -1,2 +1,2 @@ [tools] -java = "17.0.19+10" +java = "17.0" diff --git a/mise.toml b/mise.toml index 4c92fe811..9c323f9d6 100644 --- a/mise.toml +++ b/mise.toml @@ -1,6 +1,6 @@ [tools] java = "21.0" maven = "3.9" -python = "3.14.6" +python = "3.9" uv = "latest" # required for pipx backend -"pipx:tox" = { version = "4.56.1", uvx = "true" } +"pipx:tox" = { version = "4.49.1", uvx = "true" } diff --git a/pom.xml b/pom.xml index e32ff3d25..35011a3ca 100644 --- a/pom.xml +++ b/pom.xml @@ -100,14 +100,14 @@ at SonarSource/sonarqube/gradle.properties --> Python Enterprise - 26.6.0.123539 - 13.8.0.4399 + 26.2.0.119303 + 13.0.0.3026 6.1.0.3962 2.25.0.4954 its/**,private/its-enterprise/**,python-frontend/typeshed_serializer/**,**/test/resources/** - 11.5.0.85871 + 10.13.0.79996 1.25.1.3886 4.29.0 6.2.7 From d35f89834fb86a568cb6acd8e848acdfce95be29 Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Thu, 9 Jul 2026 16:54:16 +0200 Subject: [PATCH 194/322] SONARPY-4315 Port S5863 to python: Assertions should not be given twice the same argument #7237 (#1263) GitOrigin-RevId: 807c2ea937fa325d381038cb4f2aa5a0ac1ec4fd --- .../python/checks/OpenSourceCheckList.java | 2 + .../tests/AssertionArgumentOrderCheck.java | 115 ++++-------------- .../IdenticalAssertionArgumentsCheck.java | 97 +++++++++++++++ .../python/checks/utils/UnittestUtils.java | 110 +++++++++++++++++ .../org/sonar/l10n/py/rules/python/S5863.html | 92 ++++++++++++++ .../org/sonar/l10n/py/rules/python/S5863.json | 23 ++++ .../py/rules/python/Sonar_way_profile.json | 1 + .../IdenticalAssertionArgumentsCheckTest.java | 37 ++++++ .../tests/test_identicalAssertionArguments.py | 100 +++++++++++++++ 9 files changed, 486 insertions(+), 91 deletions(-) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/tests/IdenticalAssertionArgumentsCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5863.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5863.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/tests/IdenticalAssertionArgumentsCheckTest.java create mode 100644 python-checks/src/test/resources/checks/tests/test_identicalAssertionArguments.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index b7fac458a..9b67cdfa1 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -98,6 +98,7 @@ import org.sonar.python.checks.tests.DedicatedAssertionCheck; import org.sonar.python.checks.tests.DedicatedExceptionAssertionCheck; import org.sonar.python.checks.tests.GroupSimilarTestsParameterizedCheck; +import org.sonar.python.checks.tests.IdenticalAssertionArgumentsCheck; import org.sonar.python.checks.tests.ImplicitlySkippedTestCheck; import org.sonar.python.checks.tests.NotDiscoverableTestMethodCheck; import org.sonar.python.checks.tests.SingleInvocationRuntimeExceptionCheck; @@ -284,6 +285,7 @@ public Stream> getChecks() { IgnoredParameterCheck.class, IgnoredSystemExitCheck.class, IdenticalExpressionOnBinaryOperatorCheck.class, + IdenticalAssertionArgumentsCheck.class, IdentityComparisonWithCachedTypesCheck.class, IdentityComparisonWithNewObjectCheck.class, IgnoredPureOperationsCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/AssertionArgumentOrderCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/AssertionArgumentOrderCheck.java index 4754d51d7..8528d85bf 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/AssertionArgumentOrderCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/AssertionArgumentOrderCheck.java @@ -16,7 +16,6 @@ */ package org.sonar.python.checks.tests; -import java.util.List; import java.util.Optional; import javax.annotation.Nullable; import org.sonar.check.Rule; @@ -25,25 +24,23 @@ import org.sonar.plugins.python.api.SubscriptionContext; import org.sonar.plugins.python.api.TokenLocation; import org.sonar.plugins.python.api.quickfix.PythonQuickFix; -import org.sonar.plugins.python.api.tree.Argument; import org.sonar.plugins.python.api.tree.AssertStatement; import org.sonar.plugins.python.api.tree.BinaryExpression; import org.sonar.plugins.python.api.tree.CallExpression; import org.sonar.plugins.python.api.tree.Expression; -import org.sonar.plugins.python.api.tree.FunctionDef; import org.sonar.plugins.python.api.tree.Name; -import org.sonar.plugins.python.api.tree.QualifiedExpression; import org.sonar.plugins.python.api.tree.RegularArgument; -import org.sonar.plugins.python.api.tree.Tree; -import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; -import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; -import org.sonar.python.checks.utils.AssertpyUtils; import org.sonar.python.checks.utils.CheckUtils; import org.sonar.python.checks.utils.Expressions; import org.sonar.python.checks.utils.UnittestUtils; +import org.sonar.python.checks.utils.UnittestUtils.AssertionArguments; +import org.sonar.python.checks.utils.UnittestUtils.AssertionFrameworkHandlers; import org.sonar.python.quickfix.TextEditUtils; import org.sonar.python.tree.TreeUtils; +import static org.sonar.python.checks.utils.UnittestUtils.ASSERTPY_IS_EQUAL_TO_MATCHER; +import static org.sonar.python.checks.utils.UnittestUtils.PYTEST_APPROX_MATCHER; + @Rule(key = "S3415") public class AssertionArgumentOrderCheck extends PythonSubscriptionCheck { private static final boolean DEFAULT_EXPECTED_ON_RIGHT = true; @@ -58,34 +55,18 @@ public class AssertionArgumentOrderCheck extends PythonSubscriptionCheck { private static final String ASSERTPY_QUICK_FIX_MESSAGE = "Swap the actual and expected values"; private static final String PYTEST_APPROX_EXPECTED_ARGUMENT_NAME = "expected"; - private static final TypeMatcher UNITTEST_EQUALITY_ASSERTION_MATCHER = TypeMatchers.any( - TypeMatchers.isType("unittest.case.TestCase.assertEqual"), - TypeMatchers.isType("unittest.case.TestCase.assertNotEqual"), - TypeMatchers.isType("unittest.case.TestCase.assertAlmostEqual"), - TypeMatchers.isType("unittest.case.TestCase.assertNotAlmostEqual")); - private static final TypeMatcher UNITTEST_IDENTITY_ASSERTION_MATCHER = TypeMatchers.any( - TypeMatchers.isType("unittest.case.TestCase.assertIs"), - TypeMatchers.isType("unittest.case.TestCase.assertIsNot")); - private static final TypeMatcher PYTEST_APPROX_MATCHER = TypeMatchers.isType("pytest.approx"); - private static final TypeMatcher ASSERTPY_IS_EQUAL_TO_MATCHER = TypeMatchers.isType("assertpy.AssertionBuilder.is_equal_to"); - @RuleProperty( key = "expectedOnRight", description = "Whether the expected value should be on the right-hand side of pytest equality assertions.", defaultValue = "" + DEFAULT_EXPECTED_ON_RIGHT) public boolean expectedOnRight = DEFAULT_EXPECTED_ON_RIGHT; - private record ParameterNames(String leftKeyword, String rightKeyword) { - } - @Override public void initialize(Context context) { - context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, ctx -> { - CallExpression callExpression = (CallExpression) ctx.syntaxNode(); - checkUnittestAssertion(ctx, callExpression); - checkAssertpyAssertion(ctx, callExpression); - }); - context.registerSyntaxNodeConsumer(Tree.Kind.ASSERT_STMT, ctx -> checkPytestAssertion(ctx, (AssertStatement) ctx.syntaxNode())); + UnittestUtils.registerAssertionSyntaxNodeConsumers(context, new AssertionFrameworkHandlers( + AssertionArgumentOrderCheck::checkUnittestAssertion, + AssertionArgumentOrderCheck::checkAssertpyAssertion, + this::checkPytestAssertion)); } @Override @@ -94,35 +75,22 @@ public CheckScope scope() { } private static void checkUnittestAssertion(SubscriptionContext ctx, CallExpression callExpression) { - if (!UnittestUtils.isWithinUnittestTestCase(callExpression)) { - return; - } - if (!(Expressions.removeParentheses(callExpression.callee()) instanceof QualifiedExpression qualifiedExpression) - || !CheckUtils.isSelf(qualifiedExpression.qualifier())) { + AssertionArguments arguments = UnittestUtils.unittestAssertionArguments(callExpression, ctx); + if (arguments == null) { return; } - ParameterNames parameterNames = parameterNames(callExpression.callee(), ctx); - if (parameterNames == null) { - return; - } - - List arguments = callExpression.arguments(); - RegularArgument firstArg = TreeUtils.nthArgumentOrKeyword(0, parameterNames.leftKeyword(), arguments); - RegularArgument secondArg = TreeUtils.nthArgumentOrKeyword(1, parameterNames.rightKeyword(), arguments); - if (firstArg == null || secondArg == null) { - return; - } - - if (areInvertedForActualExpected(firstArg.expression(), secondArg.expression(), ctx)) { + if (areInvertedForActualExpected(arguments.actual(), arguments.expected(), ctx)) { var issue = ctx.addIssue(callExpression, UNITTEST_MESSAGE); - addActualExpectedSecondaryLocations(issue, secondArg.expression(), firstArg.expression()); - createSwapQuickFix(firstArg.expression(), secondArg.expression(), UNITTEST_QUICK_FIX_MESSAGE, ctx).ifPresent(issue::addQuickFix); + Expression actualValue = arguments.expected(); + Expression expectedValue = arguments.actual(); + addActualExpectedSecondaryLocations(issue, actualValue, expectedValue); + createSwapQuickFix(arguments.actual(), arguments.expected(), UNITTEST_QUICK_FIX_MESSAGE, ctx).ifPresent(issue::addQuickFix); } } private void checkPytestAssertion(SubscriptionContext ctx, AssertStatement assertStatement) { - if (!isPytestStyleTestFunction(ctx, assertStatement)) { + if (!UnittestUtils.isPytestStyleTestFunction(ctx, assertStatement)) { return; } @@ -139,31 +107,17 @@ private void checkPytestAssertion(SubscriptionContext ctx, AssertStatement asser } private static void checkAssertpyAssertion(SubscriptionContext ctx, CallExpression callExpression) { - if (!isSupportedTestFunction(ctx, callExpression)) { - return; - } - if (!(Expressions.removeParentheses(callExpression.callee()) instanceof QualifiedExpression qualifiedExpression) - || !ASSERTPY_IS_EQUAL_TO_MATCHER.isTrueFor(callExpression.callee(), ctx)) { - return; - } - - CallExpression assertThatCall = AssertpyUtils.originatingAssertThatCall(qualifiedExpression.qualifier(), ctx); - if (assertThatCall == null) { - return; - } - - RegularArgument actualArg = TreeUtils.nthArgumentOrKeyword(0, "val", assertThatCall.arguments()); - RegularArgument expectedArg = TreeUtils.nthArgumentOrKeyword(0, "other", callExpression.arguments()); - if (actualArg == null || expectedArg == null) { + AssertionArguments arguments = UnittestUtils.assertpyAssertionArguments(callExpression, ctx, ASSERTPY_IS_EQUAL_TO_MATCHER); + if (arguments == null) { return; } - if (areInvertedForActualExpected(actualArg.expression(), expectedArg.expression(), ctx)) { + if (areInvertedForActualExpected(arguments.actual(), arguments.expected(), ctx)) { var issue = ctx.addIssue(callExpression, ASSERTPY_MESSAGE); - // On the noncompliant path the assertion arguments are inverted: the assert_that slot - // holds the expected value and the is_equal_to slot holds the actual value. - addActualExpectedSecondaryLocations(issue, expectedArg.expression(), actualArg.expression()); - createSwapQuickFix(actualArg.expression(), expectedArg.expression(), ASSERTPY_QUICK_FIX_MESSAGE, ctx).ifPresent(issue::addQuickFix); + Expression actualValue = arguments.expected(); + Expression expectedValue = arguments.actual(); + addActualExpectedSecondaryLocations(issue, actualValue, expectedValue); + createSwapQuickFix(arguments.actual(), arguments.expected(), ASSERTPY_QUICK_FIX_MESSAGE, ctx).ifPresent(issue::addQuickFix); } } @@ -281,17 +235,6 @@ private static boolean isLineBreak(char current) { return current == '\r' || current == '\n'; } - @Nullable - private static ParameterNames parameterNames(Expression callee, SubscriptionContext ctx) { - if (UNITTEST_EQUALITY_ASSERTION_MATCHER.isTrueFor(callee, ctx)) { - return new ParameterNames("first", "second"); - } - if (UNITTEST_IDENTITY_ASSERTION_MATCHER.isTrueFor(callee, ctx)) { - return new ParameterNames("expr1", "expr2"); - } - return null; - } - private static boolean areInvertedForActualExpected(Expression actualPosition, Expression expectedPosition, SubscriptionContext ctx) { return isExpectedValue(actualPosition, ctx) && !isExpectedValue(expectedPosition, ctx); } @@ -346,14 +289,4 @@ private static Expression unwrapPytestApproxArgument(Expression expression, Subs RegularArgument expectedArg = TreeUtils.nthArgumentOrKeyword(0, PYTEST_APPROX_EXPECTED_ARGUMENT_NAME, approxCall.arguments()); return expectedArg != null ? expectedArg.expression() : expression; } - - private static boolean isSupportedTestFunction(SubscriptionContext ctx, Tree tree) { - FunctionDef functionDef = (FunctionDef) TreeUtils.firstAncestorOfKind(tree, Tree.Kind.FUNCDEF); - return functionDef != null && (UnittestUtils.isWithinUnittestTestCase(functionDef) || UnittestUtils.isPytestStyleTestFunction(functionDef, ctx.pythonFile().fileName())); - } - - private static boolean isPytestStyleTestFunction(SubscriptionContext ctx, Tree tree) { - FunctionDef functionDef = (FunctionDef) TreeUtils.firstAncestorOfKind(tree, Tree.Kind.FUNCDEF); - return functionDef != null && UnittestUtils.isPytestStyleTestFunction(functionDef, ctx.pythonFile().fileName()); - } } diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/IdenticalAssertionArgumentsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/IdenticalAssertionArgumentsCheck.java new file mode 100644 index 000000000..9b3d4ae11 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/IdenticalAssertionArgumentsCheck.java @@ -0,0 +1,97 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import java.util.Set; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.AssertStatement; +import org.sonar.plugins.python.api.tree.BinaryExpression; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.Name; +import org.sonar.python.checks.utils.CheckUtils; +import org.sonar.python.checks.utils.Expressions; +import org.sonar.python.checks.utils.UnittestUtils; +import org.sonar.python.checks.utils.UnittestUtils.AssertionArguments; +import org.sonar.python.checks.utils.UnittestUtils.AssertionFrameworkHandlers; + +import static org.sonar.python.checks.utils.UnittestUtils.ASSERTPY_EQUALITY_ASSERTION_MATCHER; + +@Rule(key = "S5863") +public class IdenticalAssertionArgumentsCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Replace this assertion to not have the same actual and expected expression."; + private static final String SECONDARY_ACTUAL_MESSAGE = "This is the same expression as the expected argument."; + private static final String SECONDARY_ASSIGNMENT_MESSAGE = "Assigned here."; + private static final Set PYTEST_OPERATORS = Set.of("==", "!="); + + @Override + public void initialize(Context context) { + UnittestUtils.registerAssertionSyntaxNodeConsumers(context, new AssertionFrameworkHandlers( + IdenticalAssertionArgumentsCheck::checkUnittestAssertion, + IdenticalAssertionArgumentsCheck::checkAssertpyAssertion, + IdenticalAssertionArgumentsCheck::checkPytestAssertion)); + } + + @Override + public CheckScope scope() { + return CheckScope.TESTS; + } + + private static void checkUnittestAssertion(SubscriptionContext ctx, CallExpression callExpression) { + AssertionArguments arguments = UnittestUtils.unittestAssertionArguments(callExpression, ctx); + if (arguments != null) { + reportIfIdenticalArguments(ctx, arguments); + } + } + + private static void checkPytestAssertion(SubscriptionContext ctx, AssertStatement assertStatement) { + if (!UnittestUtils.isPytestStyleTestFunction(ctx, assertStatement)) { + return; + } + + Expression condition = Expressions.removeParentheses(assertStatement.condition()); + if (!(condition instanceof BinaryExpression binaryExpression) + || !PYTEST_OPERATORS.contains(binaryExpression.operator().value())) { + return; + } + + reportIfIdenticalArguments(ctx, new AssertionArguments(binaryExpression.leftOperand(), binaryExpression.rightOperand())); + } + + private static void checkAssertpyAssertion(SubscriptionContext ctx, CallExpression callExpression) { + AssertionArguments arguments = UnittestUtils.assertpyAssertionArguments(callExpression, ctx, ASSERTPY_EQUALITY_ASSERTION_MATCHER); + if (arguments != null) { + reportIfIdenticalArguments(ctx, arguments); + } + } + + private static void reportIfIdenticalArguments(SubscriptionContext ctx, AssertionArguments arguments) { + if (CheckUtils.areEquivalent(arguments.actual(), arguments.expected())) { + var issue = ctx.addIssue(arguments.expected(), MESSAGE) + .secondary(arguments.actual(), SECONDARY_ACTUAL_MESSAGE); + if (arguments.actual() instanceof Name name) { + Expression assignment = Expressions.singleAssignedValue(name); + if (assignment != null) { + issue.secondary(assignment, SECONDARY_ASSIGNMENT_MESSAGE); + } + } + } + } +} diff --git a/python-checks/src/main/java/org/sonar/python/checks/utils/UnittestUtils.java b/python-checks/src/main/java/org/sonar/python/checks/utils/UnittestUtils.java index 29e604051..ea7d110ce 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/utils/UnittestUtils.java +++ b/python-checks/src/main/java/org/sonar/python/checks/utils/UnittestUtils.java @@ -18,15 +18,21 @@ import java.util.Collections; import java.util.HashSet; +import java.util.List; import java.util.Set; +import java.util.function.BiConsumer; import javax.annotation.Nullable; +import org.sonar.plugins.python.api.SubscriptionCheck; import org.sonar.plugins.python.api.SubscriptionContext; import org.sonar.plugins.python.api.symbols.Symbol; +import org.sonar.plugins.python.api.tree.Argument; +import org.sonar.plugins.python.api.tree.AssertStatement; import org.sonar.plugins.python.api.tree.CallExpression; import org.sonar.plugins.python.api.tree.ClassDef; import org.sonar.plugins.python.api.tree.Decorator; import org.sonar.plugins.python.api.tree.Expression; import org.sonar.plugins.python.api.tree.FunctionDef; +import org.sonar.plugins.python.api.tree.QualifiedExpression; import org.sonar.plugins.python.api.tree.RegularArgument; import org.sonar.plugins.python.api.tree.Tree; import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; @@ -54,6 +60,31 @@ public class UnittestUtils { TypeMatchers.isType(UNITTEST_TEST_CASE_FQN_PREFIX + ASSERT_RAISES_REGEX), TypeMatchers.isType(UNITTEST_TEST_CASE_FQN_PREFIX + ASSERT_RAISES_REGEXP) ); + public static final TypeMatcher UNITTEST_EQUALITY_ASSERTION_MATCHER = TypeMatchers.any( + TypeMatchers.isType(UNITTEST_TEST_CASE_FQN_PREFIX + "assertEqual"), + TypeMatchers.isType(UNITTEST_TEST_CASE_FQN_PREFIX + "assertNotEqual"), + TypeMatchers.isType(UNITTEST_TEST_CASE_FQN_PREFIX + "assertAlmostEqual"), + TypeMatchers.isType(UNITTEST_TEST_CASE_FQN_PREFIX + "assertNotAlmostEqual")); + public static final TypeMatcher UNITTEST_IDENTITY_ASSERTION_MATCHER = TypeMatchers.any( + TypeMatchers.isType(UNITTEST_TEST_CASE_FQN_PREFIX + "assertIs"), + TypeMatchers.isType(UNITTEST_TEST_CASE_FQN_PREFIX + "assertIsNot")); + public static final TypeMatcher PYTEST_APPROX_MATCHER = TypeMatchers.isType("pytest.approx"); + public static final TypeMatcher ASSERTPY_IS_EQUAL_TO_MATCHER = TypeMatchers.isType("assertpy.AssertionBuilder.is_equal_to"); + public static final TypeMatcher ASSERTPY_EQUALITY_ASSERTION_MATCHER = TypeMatchers.any( + TypeMatchers.isType("assertpy.AssertionBuilder.is_equal_to"), + TypeMatchers.isType("assertpy.AssertionBuilder.is_not_equal_to")); + + public record AssertionParameterNames(String leftKeyword, String rightKeyword) { + } + + public record AssertionArguments(Expression actual, Expression expected) { + } + + public record AssertionFrameworkHandlers( + BiConsumer unittest, + BiConsumer assertpy, + BiConsumer pytest) { + } private UnittestUtils() { @@ -190,6 +221,85 @@ public static boolean isWithinUnittestTestCase(Tree tree) { return classDef != null && isUnittestTestCaseClass(classDef); } + public static boolean isPytestStyleTestFunction(SubscriptionContext ctx, Tree tree) { + FunctionDef functionDef = (FunctionDef) TreeUtils.firstAncestorOfKind(tree, Tree.Kind.FUNCDEF); + return functionDef != null && isPytestStyleTestFunction(functionDef, ctx.pythonFile().fileName()); + } + + public static boolean isSupportedTestFunction(SubscriptionContext ctx, Tree tree) { + FunctionDef functionDef = (FunctionDef) TreeUtils.firstAncestorOfKind(tree, Tree.Kind.FUNCDEF); + return functionDef != null && (isWithinUnittestTestCase(functionDef) || isPytestStyleTestFunction(functionDef, ctx.pythonFile().fileName())); + } + + public static void registerAssertionSyntaxNodeConsumers(SubscriptionCheck.Context context, AssertionFrameworkHandlers handlers) { + context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, ctx -> { + CallExpression callExpression = (CallExpression) ctx.syntaxNode(); + handlers.unittest().accept(ctx, callExpression); + handlers.assertpy().accept(ctx, callExpression); + }); + context.registerSyntaxNodeConsumer(Tree.Kind.ASSERT_STMT, ctx -> handlers.pytest().accept(ctx, (AssertStatement) ctx.syntaxNode())); + } + + @Nullable + public static AssertionArguments unittestAssertionArguments(CallExpression callExpression, SubscriptionContext ctx) { + if (!isWithinUnittestTestCase(callExpression)) { + return null; + } + if (!(Expressions.removeParentheses(callExpression.callee()) instanceof QualifiedExpression qualifiedExpression) + || !CheckUtils.isSelf(qualifiedExpression.qualifier())) { + return null; + } + + AssertionParameterNames parameterNames = unittestAssertionParameterNames(callExpression.callee(), ctx); + if (parameterNames == null) { + return null; + } + + List arguments = callExpression.arguments(); + RegularArgument firstArg = TreeUtils.nthArgumentOrKeyword(0, parameterNames.leftKeyword(), arguments); + RegularArgument secondArg = TreeUtils.nthArgumentOrKeyword(1, parameterNames.rightKeyword(), arguments); + if (firstArg == null || secondArg == null) { + return null; + } + + return new AssertionArguments(firstArg.expression(), secondArg.expression()); + } + + @Nullable + public static AssertionArguments assertpyAssertionArguments(CallExpression callExpression, SubscriptionContext ctx, TypeMatcher equalityMatcher) { + if (!isSupportedTestFunction(ctx, callExpression)) { + return null; + } + if (!(Expressions.removeParentheses(callExpression.callee()) instanceof QualifiedExpression qualifiedExpression) + || !equalityMatcher.isTrueFor(callExpression.callee(), ctx)) { + return null; + } + + CallExpression assertThatCall = AssertpyUtils.originatingAssertThatCall(qualifiedExpression.qualifier(), ctx); + if (assertThatCall == null) { + return null; + } + + RegularArgument actualArg = TreeUtils.nthArgumentOrKeyword(0, "val", assertThatCall.arguments()); + RegularArgument expectedArg = TreeUtils.nthArgumentOrKeyword(0, "other", callExpression.arguments()); + if (actualArg == null || expectedArg == null) { + return null; + } + + return new AssertionArguments(actualArg.expression(), expectedArg.expression()); + } + + @Nullable + public static AssertionParameterNames unittestAssertionParameterNames(Expression callee, SubscriptionContext ctx) { + if (UNITTEST_EQUALITY_ASSERTION_MATCHER.isTrueFor(callee, ctx)) { + return new AssertionParameterNames("first", "second"); + } + if (UNITTEST_IDENTITY_ASSERTION_MATCHER.isTrueFor(callee, ctx)) { + return new AssertionParameterNames("expr1", "expr2"); + } + return null; + } + @Nullable private static ClassDef directlyEnclosingClass(Tree tree) { Tree current = tree.parent(); diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5863.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5863.html new file mode 100644 index 000000000..6bebe722b --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5863.html @@ -0,0 +1,92 @@ +

              This rule raises an issue when the actual expression of an assertion matches the expected expression, meaning the same expression is being compared +to itself.

              +

              Why is this an issue?

              +

              Assertions that compare the same expression to itself provide no meaningful validation. They usually indicate a copy-paste mistake where the +intended expected value was replaced by the actual one.

              +

              Such assertions will always pass, or always fail for inequality checks, regardless of the code’s correctness. As a result, the test gives false +confidence while verifying nothing useful.

              +

              How to fix it in unittest

              +

              Code examples

              +

              Noncompliant code example

              +
              +import unittest
              +
              +class TestCalculation(unittest.TestCase):
              +    def test_addition(self):
              +        result = 2 + 2
              +        self.assertEqual(result, result)  # Noncompliant
              +
              +

              For identity checks using assertIs, ensure you’re comparing against a different expected object, not the same one.

              +
              +import unittest
              +
              +class TestIdentity(unittest.TestCase):
              +    def test_singleton(self):
              +        obj = get_singleton()
              +        self.assertIs(obj, obj)  # Noncompliant
              +
              +

              Compliant solution

              +

              Replace the duplicate argument with the intended expected value.

              +
              +import unittest
              +
              +class TestCalculation(unittest.TestCase):
              +    def test_addition(self):
              +        result = 2 + 2
              +        expected = 4
              +        self.assertEqual(result, expected)
              +
              +

              For identity checks using assertIs, compare against a different expected object.

              +
              +import unittest
              +
              +class TestIdentity(unittest.TestCase):
              +    def test_singleton(self):
              +        obj1 = get_singleton()
              +        obj2 = get_singleton()
              +        self.assertIs(obj1, obj2)
              +
              +

              How to fix it in pytest

              +

              Replace the duplicate argument with the intended expected value.

              +

              Code examples

              +

              Noncompliant code example

              +
              +def test_string_conversion():
              +    actual = str(42)
              +    assert actual == actual  # Noncompliant
              +
              +

              Compliant solution

              +
              +def test_string_conversion():
              +    actual = str(42)
              +    expected = "42"
              +    assert actual == expected
              +
              +

              How to fix it in assertpy

              +

              Replace the duplicate argument with the intended expected value.

              +

              Code examples

              +

              Noncompliant code example

              +
              +from assertpy import assert_that
              +
              +def test_string_conversion():
              +    actual = str(42)
              +    assert_that(actual).is_equal_to(actual)  # Noncompliant
              +
              +

              Compliant solution

              +
              +from assertpy import assert_that
              +
              +def test_string_conversion():
              +    actual = str(42)
              +    expected = "42"
              +    assert_that(actual).is_equal_to(expected)
              +
              +

              Resources

              +

              Documentation

              + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5863.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5863.json new file mode 100644 index 000000000..c87776075 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5863.json @@ -0,0 +1,23 @@ +{ + "title": "Assertions should not be given twice the same argument", + "type": "BUG", + "code": { + "impacts": { + "RELIABILITY": "MEDIUM" + }, + "attribute": "LOGICAL" + }, + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "tests" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-5863", + "sqKey": "S5863", + "scope": "Tests", + "quickfix": "unknown" +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index c34eff895..af8605442 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -153,6 +153,7 @@ "S5855", "S5857", "S5860", + "S5863", "S5864", "S5868", "S5869", diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/IdenticalAssertionArgumentsCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/IdenticalAssertionArgumentsCheckTest.java new file mode 100644 index 000000000..1c09c37db --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/IdenticalAssertionArgumentsCheckTest.java @@ -0,0 +1,37 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import org.junit.jupiter.api.Test; +import org.sonar.plugins.python.api.PythonCheck; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +import static org.assertj.core.api.Assertions.assertThat; + +class IdenticalAssertionArgumentsCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/test_identicalAssertionArguments.py", new IdenticalAssertionArgumentsCheck()); + } + + @Test + void test_scope() { + assertThat(new IdenticalAssertionArgumentsCheck().scope()).isEqualTo(PythonCheck.CheckScope.TESTS); + } + +} diff --git a/python-checks/src/test/resources/checks/tests/test_identicalAssertionArguments.py b/python-checks/src/test/resources/checks/tests/test_identicalAssertionArguments.py new file mode 100644 index 000000000..1847e2b83 --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/test_identicalAssertionArguments.py @@ -0,0 +1,100 @@ +import unittest + +from assertpy import assert_that + + +def compute(): + return 2 + 2 + + +def value(): + return 41 + 1 + + +def identity(builder): + return builder + + +class Holder: + value = 42 + + +assert compute() == compute() +assert_that(compute()).is_equal_to(compute()) + + +class TestIdenticalArguments(unittest.TestCase): + def noncompliant_equality(self): + result = compute() +# ^^^^^^^^^> + self.assertEqual(result, result) # Noncompliant {{Replace this assertion to not have the same actual and expected expression.}} +# ^^^^^^> ^^^^^^ 2 + self.assertNotEqual(result, result) # Noncompliant + self.assertEqual(value(), value()) # Noncompliant + + def noncompliant_identity(self): + obj = value() + self.assertIs(obj, obj) # Noncompliant + self.assertIsNot(obj, obj) # Noncompliant + + def noncompliant_keyword_args(self): + result = compute() + self.assertEqual(first=result, second=result) # Noncompliant + self.assertIs(expr1=result, expr2=result) # Noncompliant + + def noncompliant_attribute_access(self): + holder = Holder() + self.assertEqual(holder.value, holder.value) # Noncompliant + self.assertEqual(unknown.attr, unknown.attr) # Noncompliant + + def compliant(self): + result = compute() + expected = 4 + self.assertEqual(result, expected) + self.assertEqual(value()) + self.assertIn(result, [expected]) + + def test_dynamic_call_not_checked(self): + assertion = self.assertEqual + assertion(value(), value()) + + +class HelperNonTestCase: + def test_not_a_unittest_test_case(self): + self.assertEqual(value(), value()) + + +def test_identical_pytest_assertions(): + actual = str(42) +# ^^^^^^^> + assert actual == actual # Noncompliant {{Replace this assertion to not have the same actual and expected expression.}} +# ^^^^^^> ^^^^^^ 2 + assert actual != actual # Noncompliant + assert value() == value() # Noncompliant + holder = Holder() + assert holder.value == holder.value # Noncompliant + assert unknown.attr == unknown.attr # Noncompliant + assert actual is actual + assert value() + assert actual == str(42) + + +def test_identical_assertpy_assertions(): + actual = str(42) +# ^^^^^^^> + assert_that(actual).is_equal_to(actual) # Noncompliant +# ^^^^^^> ^^^^^^ 2 + assert_that(actual).described_as("count").is_equal_to(actual) # Noncompliant + assert_that(actual).is_not_equal_to(actual) # Noncompliant + assert_that(value()).is_equal_to(value()) # Noncompliant + holder = Holder() + assert_that(holder.value).is_equal_to(holder.value) # Noncompliant + assert_that(unknown.attr).is_equal_to(unknown.attr) # Noncompliant + + expected = "42" + assert_that(actual).is_equal_to(expected) + assert_that(actual).is_equal_to() + assert_that().is_equal_to(actual) + builder = assert_that(actual) + builder.is_equal_to(actual) + identity(assert_that(actual)).is_equal_to(actual) From 78d56a4ec3f006c88ee9eefe4154f65079437ce4 Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Thu, 9 Jul 2026 17:26:09 +0200 Subject: [PATCH 195/322] SONARPY-4341 Create rule S8974: "json_schema_input_type" should not be used with "mode='after'" field validators (#1259) GitOrigin-RevId: 5e2f2aeefc3ef06aab8415e8181c93a3e987bfb9 --- .../python/checks/OpenSourceCheckList.java | 1 + ...JsonSchemaInputTypeWithAfterModeCheck.java | 136 +++++++++++++++ .../org/sonar/l10n/py/rules/python/S8974.html | 90 ++++++++++ .../org/sonar/l10n/py/rules/python/S8974.json | 24 +++ .../py/rules/python/Sonar_way_profile.json | 3 +- ...SchemaInputTypeWithAfterModeCheckTest.java | 29 ++++ ...ydanticJsonSchemaInputTypeWithAfterMode.py | 159 ++++++++++++++++++ .../pydantic.functional_validators.protobuf | 80 +++++++++ .../checksums/custom.checksum | 4 +- .../custom/pydantic/functional_validators.pyi | 34 ++++ 10 files changed, 557 insertions(+), 3 deletions(-) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/PydanticJsonSchemaInputTypeWithAfterModeCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8974.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8974.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/PydanticJsonSchemaInputTypeWithAfterModeCheckTest.java create mode 100644 python-checks/src/test/resources/checks/pydanticJsonSchemaInputTypeWithAfterMode.py create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.functional_validators.protobuf create mode 100644 python-frontend/typeshed_serializer/resources/custom/pydantic/functional_validators.pyi diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 9b67cdfa1..18172c411 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -385,6 +385,7 @@ public Stream> getChecks() { PubliclyWritableDirectoriesCheck.class, PublicNetworkAccessToCloudResourcesCheck.class, PydanticCoreSerializationFallbackCheck.class, + PydanticJsonSchemaInputTypeWithAfterModeCheck.class, PydanticOptionalFieldDefaultCheck.class, PydanticMultipleInheritanceConfigCheck.class, PyTorchDataLoaderNumWorkersCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/PydanticJsonSchemaInputTypeWithAfterModeCheck.java b/python-checks/src/main/java/org/sonar/python/checks/PydanticJsonSchemaInputTypeWithAfterModeCheck.java new file mode 100644 index 000000000..9fbdd646f --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/PydanticJsonSchemaInputTypeWithAfterModeCheck.java @@ -0,0 +1,136 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import javax.annotation.CheckForNull; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonCheck; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.ArgList; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.Decorator; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.StringLiteral; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.tree.TreeUtils; + +/** + * Detects usage of {@code json_schema_input_type} with {@code mode='after'} (or no mode, which defaults to 'after') + * in Pydantic's {@code @field_validator} decorator. This combination always causes a {@code PydanticUserError} + * at class definition time. + */ +@Rule(key = "S8974") +public class PydanticJsonSchemaInputTypeWithAfterModeCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Remove \"json_schema_input_type\" or change the validator mode to \"before\", \"plain\", or \"wrap\"."; + private static final String SECONDARY_MESSAGE = "mode is set here."; + + private static final String MODE_ARGUMENT = "mode"; + private static final String JSON_SCHEMA_INPUT_TYPE_ARGUMENT = "json_schema_input_type"; + private static final String AFTER_MODE_VALUE = "after"; + + /** + * Matches {@code pydantic.functional_validators.field_validator} (direct import): + * {@code from pydantic.functional_validators import field_validator} + *

              + * Also covers aliased imports, e.g.: + * {@code from pydantic.functional_validators import field_validator as fv} + */ + private static final TypeMatcher FIELD_VALIDATOR_DIRECT_MATCHER = TypeMatchers.isType("pydantic.functional_validators.field_validator"); + + /** + * Matches {@code field_validator} re-exported through the {@code pydantic} package root: + * {@code from pydantic import field_validator} + *

              + * Uses FQN matching because the pydantic v1 stub does not declare this re-export, + * so the type resolves to {@code UnresolvedImportType[pydantic.field_validator]}. + * Also covers aliased imports, e.g.: + * {@code from pydantic import field_validator as fv} + */ + private static final TypeMatcher FIELD_VALIDATOR_REEXPORT_MATCHER = TypeMatchers.withFQN("pydantic.field_validator"); + + private static final TypeMatcher FIELD_VALIDATOR_MATCHER = TypeMatchers.any(FIELD_VALIDATOR_DIRECT_MATCHER, FIELD_VALIDATOR_REEXPORT_MATCHER); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.DECORATOR, PydanticJsonSchemaInputTypeWithAfterModeCheck::checkDecorator); + } + + private static void checkDecorator(SubscriptionContext ctx) { + Decorator decorator = (Decorator) ctx.syntaxNode(); + Expression decoratorFunctionExpr = getDecoratorFunctionExpression(decorator); + if (!FIELD_VALIDATOR_MATCHER.isTrueFor(decoratorFunctionExpr, ctx)) { + return; + } + ArgList argList = decorator.arguments(); + if (argList == null || argList.arguments().isEmpty()) { + return; + } + + RegularArgument jsonSchemaArg = TreeUtils.argumentByKeyword(JSON_SCHEMA_INPUT_TYPE_ARGUMENT, argList.arguments()); + if (jsonSchemaArg == null) { + return; + } + + var keywordArgument = jsonSchemaArg.keywordArgument(); + if (keywordArgument == null) { + return; + } + + RegularArgument modeArg = TreeUtils.argumentByKeyword(MODE_ARGUMENT, argList.arguments()); + if (!isAfterModeOrDefault(modeArg)) { + return; + } + + PythonCheck.PreciseIssue issue = ctx.addIssue(keywordArgument, MESSAGE); + if (modeArg != null) { + issue.secondary(modeArg.expression(), SECONDARY_MESSAGE); + } + } + + private static Expression getDecoratorFunctionExpression(Decorator decorator) { + Expression expr = decorator.expression(); + if (expr instanceof CallExpression callExpr) { + return callExpr.callee(); + } + return expr; + } + + /** + * Returns {@code true} if {@code mode} is absent (defaults to {@code 'after'}) or explicitly set to {@code 'after'}. + * Returns {@code false} for {@code 'before'}, {@code 'plain'}, {@code 'wrap'}, or any non-literal value. + */ + private static boolean isAfterModeOrDefault(@CheckForNull RegularArgument modeArg) { + if (modeArg == null) { + // No mode argument — defaults to 'after' + return true; + } + return isAfterLiteralValue(modeArg.expression()); + } + + private static boolean isAfterLiteralValue(Expression expression) { + // Only flag when mode is explicitly 'after'; unknown (non-literal) mode values → no issue + if (expression instanceof StringLiteral stringLiteral) { + return AFTER_MODE_VALUE.equals(stringLiteral.trimmedQuotesValue()); + } + return false; + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8974.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8974.html new file mode 100644 index 000000000..18df6784f --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8974.html @@ -0,0 +1,90 @@ +

              This rule raises an issue when a schema type specification parameter is used in a field validation decorator configured to run after type +conversion, or when the validation timing is not explicitly specified (which defaults to running after conversion).

              +

              In Python/Pydantic, this specifically refers to using the json_schema_input_type parameter in a @field_validator +decorator.

              +

              Why is this an issue?

              +

              In validation frameworks, field validation mechanisms allow you to add custom validation logic to data fields. These mechanisms typically support +different validation modes that determine when your validation function runs relative to the framework’s built-in validation:

              +
                +
              • Before-mode: Runs before the framework’s standard validation
              • +
              • After-mode: Runs after the framework’s standard validation (often the default)
              • +
              • Plain-mode: Replaces the framework’s standard validation entirely
              • +
              • Wrap-mode: Wraps around the framework’s standard validation, giving you control over when it runs
              • +
              +

              Schema generation parameters for input types help validation frameworks generate accurate data schemas for validation. These parameters tell the +framework what input type to expect when generating the schema, which is particularly useful for validators that accept raw, unvalidated input.

              +

              However, such parameters only make sense for validators that run before or instead of the framework’s type validation. When using after-mode +validation, your validator receives data that has already been validated and converted to the correct type. At this point, the input type is already +known and fixed, so specifying an input type parameter for schema generation serves no purpose and is not supported.

              +

              Using an input type schema parameter with an incompatible validation mode will cause the framework to raise a user error when your model is +defined, preventing your application from starting.

              +

              In Pydantic specifically, this refers to the @field_validator decorator with its json_schema_input_type parameter. Using +json_schema_input_type with mode='after' will cause Pydantic to raise a PydanticUserError when your model is +defined. There is no valid use of json_schema_input_type with mode='after'; this combination always fails at class +definition time.

              +

              What is the potential impact?

              +

              This issue will cause an immediate runtime error when the affected class or type is defined. The application will fail to start, making it +impossible to use any functionality that depends on the affected type definition.

              +

              This is a critical bug that will be discovered as soon as the code path defining the type is executed, typically during application startup or when +the relevant code unit is first loaded.

              +

              How to fix it

              +

              If you need to specify json_schema_input_type, change the validator mode to before, plain, or +wrap:

              +
                +
              • mode='before' is typically the best choice. The validator runs before Pydantic’s type conversion, so + json_schema_input_type correctly describes the raw input type the schema should expect.
              • +
              • mode='plain' replaces Pydantic’s built-in validation entirely. Use it when the validator handles all type checking itself and + Pydantic’s standard conversion should not run.
              • +
              • mode='wrap' gives the validator control over when Pydantic’s built-in validation runs by receiving a handler argument. + Use it when you need to inspect or modify the value both before and after Pydantic’s conversion.
              • +
              +

              Code examples

              +

              Noncompliant code example

              +
              +from pydantic import BaseModel, field_validator
              +
              +class Model(BaseModel):
              +    a: str
              +
              +    @field_validator('a', mode='after', json_schema_input_type=str)  # Noncompliant
              +    @classmethod
              +    def validate_a(cls, v):
              +        return v
              +
              +

              Compliant solution

              +
              +from pydantic import BaseModel, field_validator
              +
              +class Model(BaseModel):
              +    a: str
              +
              +    @field_validator('a', mode='before', json_schema_input_type=str)
              +    @classmethod
              +    def validate_a(cls, v):
              +        return v
              +
              +

              Pitfalls

              +

              When switching to mode='wrap', the validator function must accept a second handler argument in addition to the value. +Using the standard (cls, v) signature with mode='wrap' causes a separate PydanticUserError about an +unrecognized function signature.

              +
              +from pydantic import BaseModel, field_validator
              +
              +class Model(BaseModel):
              +    a: str
              +
              +    # mode='wrap' requires (cls, v, handler), not (cls, v)
              +    @field_validator('a', mode='wrap', json_schema_input_type=str)
              +    @classmethod
              +    def validate_a(cls, v, handler):
              +        return handler(v)
              +
              +

              Resources

              +

              Documentation

              + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8974.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8974.json new file mode 100644 index 000000000..98a0d962d --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8974.json @@ -0,0 +1,24 @@ +{ + "title": "\"json_schema_input_type\" should not be used with \"mode\u003d\u0027after\u0027\" field validators", + "type": "BUG", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5 min" + }, + "tags": [ + "pydantic", + "pitfall" + ], + "defaultSeverity": "Critical", + "ruleSpecification": "RSPEC-8974", + "sqKey": "S8974", + "scope": "Main", + "quickfix": "unknown", + "code": { + "impacts": { + "RELIABILITY": "HIGH" + }, + "attribute": "LOGICAL" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index af8605442..b597b3242 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -368,6 +368,7 @@ "S8905", "S8906", "S8963", - "S8966" + "S8966", + "S8974" ] } diff --git a/python-checks/src/test/java/org/sonar/python/checks/PydanticJsonSchemaInputTypeWithAfterModeCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/PydanticJsonSchemaInputTypeWithAfterModeCheckTest.java new file mode 100644 index 000000000..8ef190497 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/PydanticJsonSchemaInputTypeWithAfterModeCheckTest.java @@ -0,0 +1,29 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.junit.jupiter.api.Test; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class PydanticJsonSchemaInputTypeWithAfterModeCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/pydanticJsonSchemaInputTypeWithAfterMode.py", new PydanticJsonSchemaInputTypeWithAfterModeCheck()); + } + +} diff --git a/python-checks/src/test/resources/checks/pydanticJsonSchemaInputTypeWithAfterMode.py b/python-checks/src/test/resources/checks/pydanticJsonSchemaInputTypeWithAfterMode.py new file mode 100644 index 000000000..4f70b4bc1 --- /dev/null +++ b/python-checks/src/test/resources/checks/pydanticJsonSchemaInputTypeWithAfterMode.py @@ -0,0 +1,159 @@ +from pydantic import BaseModel, field_validator + +# ===================== +# NON-COMPLIANT CASES +# ===================== + +class ModelAfterMode(BaseModel): + a: str + + @field_validator('a', mode='after', json_schema_input_type=str) # Noncompliant {{Remove "json_schema_input_type" or change the validator mode to "before", "plain", or "wrap".}} + # ^^^^^^^^^^^^^^^^^^^^^^ + # ^^^^^^^@-1< {{mode is set here.}} + @classmethod + def validate_a(cls, v): + return v + + +class ModelDefaultMode(BaseModel): + a: str + + @field_validator('a', json_schema_input_type=str) # Noncompliant {{Remove "json_schema_input_type" or change the validator mode to "before", "plain", or "wrap".}} + @classmethod + def validate_a_default(cls, v): + return v + + +class ModelAfterModeMultipleFields(BaseModel): + a: str + b: int + + @field_validator('a', 'b', mode='after', json_schema_input_type=str) # Noncompliant {{Remove "json_schema_input_type" or change the validator mode to "before", "plain", or "wrap".}} + @classmethod + def validate_ab(cls, v): + return v + + +class ModelModeAfterExplicit(BaseModel): + a: str + + @field_validator('a', json_schema_input_type=int, mode='after') # Noncompliant {{Remove "json_schema_input_type" or change the validator mode to "before", "plain", or "wrap".}} + @classmethod + def validate_a2(cls, v): + return v + +# ===================== +# COMPLIANT CASES +# ===================== + +class ModelBeforeMode(BaseModel): + a: str + + @field_validator('a', mode='before', json_schema_input_type=str) + @classmethod + def validate_a(cls, v): + return v + + +class ModelPlainMode(BaseModel): + a: str + + @field_validator('a', mode='plain', json_schema_input_type=str) + @classmethod + def validate_a(cls, v): + return v + + +class ModelWrapMode(BaseModel): + a: str + + @field_validator('a', mode='wrap', json_schema_input_type=str) + @classmethod + def validate_a(cls, v, handler): + return handler(v) + + +class ModelAfterModeNoJsonSchemaInputType(BaseModel): + a: str + + @field_validator('a', mode='after') + @classmethod + def validate_a(cls, v): + return v + + +class ModelNoJsonSchemaInputType(BaseModel): + a: str + + @field_validator('a') + @classmethod + def validate_a(cls, v): + return v + + +class ModelModeIsVariable(BaseModel): + a: str + + VALIDATOR_MODE = 'after' + + @field_validator('a', mode=VALIDATOR_MODE, json_schema_input_type=str) + @classmethod + def validate_a(cls, v): + return v + + +# A function with the same name but no pydantic import should not be flagged +def field_validator(*fields, **kwargs): + pass + +@field_validator('a', mode='after', json_schema_input_type=str) +def validate_local(cls, v): + return v + + +# ===================== +# DIRECT MODULE IMPORT +# ===================== + +from pydantic.functional_validators import field_validator as fv_direct # noqa: E402 + +class ModelDirectImportNoncompliant(BaseModel): + a: str + + @fv_direct('a', mode='after', json_schema_input_type=str) # Noncompliant {{Remove "json_schema_input_type" or change the validator mode to "before", "plain", or "wrap".}} + @classmethod + def validate_a(cls, v): + return v + + +class ModelDirectImportCompliant(BaseModel): + a: str + + @fv_direct('a', mode='before', json_schema_input_type=str) + @classmethod + def validate_a(cls, v): + return v + + +# ===================== +# ALIASED IMPORT +# ===================== + +from pydantic import field_validator as fv_alias # noqa: E402 + +class ModelAliasedImportNoncompliant(BaseModel): + a: str + + @fv_alias('a', json_schema_input_type=str) # Noncompliant {{Remove "json_schema_input_type" or change the validator mode to "before", "plain", or "wrap".}} + @classmethod + def validate_a(cls, v): + return v + + +class ModelAliasedImportCompliant(BaseModel): + a: str + + @fv_alias('a', mode='before', json_schema_input_type=str) + @classmethod + def validate_a(cls, v): + return v diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.functional_validators.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.functional_validators.protobuf new file mode 100644 index 000000000..f1d3f28a5 --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.functional_validators.protobuf @@ -0,0 +1,80 @@ + +pydantic.functional_validators +AfterValidator-pydantic.functional_validators.AfterValidator"*SonarPythonAnalyzerFakeStub.CustomStubBase* +__init__6pydantic.functional_validators.AfterValidator.__init__" +None*h +self^ +-pydantic.functional_validators.AfterValidator"-pydantic.functional_validators.AfterValidator*U +funcK +CallableType[builtins.function]& +builtins.function"builtins.function +BeforeValidator.pydantic.functional_validators.BeforeValidator"*SonarPythonAnalyzerFakeStub.CustomStubBase* +__init__7pydantic.functional_validators.BeforeValidator.__init__" +None*j +self` +.pydantic.functional_validators.BeforeValidator".pydantic.functional_validators.BeforeValidator*U +funcK +CallableType[builtins.function]& +builtins.function"builtins.function*% +json_schema_input_type +Any  +PlainValidator-pydantic.functional_validators.PlainValidator"*SonarPythonAnalyzerFakeStub.CustomStubBase* +__init__6pydantic.functional_validators.PlainValidator.__init__" +None*h +self^ +-pydantic.functional_validators.PlainValidator"-pydantic.functional_validators.PlainValidator*U +funcK +CallableType[builtins.function]& +builtins.function"builtins.function*% +json_schema_input_type +Any  + WrapValidator,pydantic.functional_validators.WrapValidator"*SonarPythonAnalyzerFakeStub.CustomStubBase* +__init__5pydantic.functional_validators.WrapValidator.__init__" +None*f +self\ +,pydantic.functional_validators.WrapValidator",pydantic.functional_validators.WrapValidator*U +funcK +CallableType[builtins.function]& +builtins.function"builtins.function*% +json_schema_input_type +Any c + +InstanceOf)pydantic.functional_validators.InstanceOf"*SonarPythonAnalyzerFakeStub.CustomStubBasek +SkipValidation-pydantic.functional_validators.SkipValidation"*SonarPythonAnalyzerFakeStub.CustomStubBase +field_validator.pydantic.functional_validators.field_validator"K +CallableType[builtins.function]& +builtins.function"builtins.function* + builtins.str" builtins.str*( +fields + builtins.str" builtins.str* +mode +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"2pydantic.functional_validators.FieldValidatorModes *[ + check_fieldsG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None *% +json_schema_input_type +Any  +model_validator.pydantic.functional_validators.model_validator" +Any* +mode +HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str* +__annotations__.pydantic.functional_validators.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/typeshed_serializer/checksums/custom.checksum b/python-frontend/typeshed_serializer/checksums/custom.checksum index 4ab67abb6..655f85a2c 100644 --- a/python-frontend/typeshed_serializer/checksums/custom.checksum +++ b/python-frontend/typeshed_serializer/checksums/custom.checksum @@ -1,2 +1,2 @@ -679caef659b943b42e50ebc33d31e0f4eb88cd52cdd02fe6a517baf5cdf1a16c -02380c7cb56a1edc33689a0215067634199038f9a8a31a79d1ae6f7f3a4eecc0 \ No newline at end of file +3855f931e2a653ed8b70e4f45ed8b8a2fb8e5dcafe67bd40082e399c9c991899 +bdcb9c5fb13d133bfbe25dfc7a77ced3f3e699ed8bc36cc929e64b8ea39595fa \ No newline at end of file diff --git a/python-frontend/typeshed_serializer/resources/custom/pydantic/functional_validators.pyi b/python-frontend/typeshed_serializer/resources/custom/pydantic/functional_validators.pyi new file mode 100644 index 000000000..ebd7e168a --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/pydantic/functional_validators.pyi @@ -0,0 +1,34 @@ +from typing import Any, Callable, Literal +from SonarPythonAnalyzerFakeStub import CustomStubBase + +FieldValidatorModes = Literal['before', 'after', 'wrap', 'plain'] + +def field_validator( + field: str, + /, + *fields: str, + mode: FieldValidatorModes = ..., + check_fields: bool | None = ..., + json_schema_input_type: Any = ..., +) -> Callable[..., Any]: ... + +def model_validator( + *, + mode: Literal['wrap', 'before', 'after'], +) -> Any: ... + +class AfterValidator(CustomStubBase): + def __init__(self, func: Callable[..., Any]) -> None: ... + +class BeforeValidator(CustomStubBase): + def __init__(self, func: Callable[..., Any], json_schema_input_type: Any = ...) -> None: ... + +class PlainValidator(CustomStubBase): + def __init__(self, func: Callable[..., Any], json_schema_input_type: Any = ...) -> None: ... + +class WrapValidator(CustomStubBase): + def __init__(self, func: Callable[..., Any], json_schema_input_type: Any = ...) -> None: ... + +class InstanceOf(CustomStubBase): ... + +class SkipValidation(CustomStubBase): ... From 5ce3c3f8c9970e0e9092813d3e81bfd78c2708ba Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Thu, 9 Jul 2026 17:40:48 +0200 Subject: [PATCH 196/322] SONARPY-4343 Create rule S8971: "SkipValidation" should not be combined with validation constraints (#1258) GitOrigin-RevId: 3c8aece07c7b4416fe51ba01109406169e027c75 --- .../python/checks/OpenSourceCheckList.java | 1 + ...ticSkipValidationWithConstraintsCheck.java | 230 ++++++++++++++++++ .../org/sonar/l10n/py/rules/python/S8971.html | 67 +++++ .../org/sonar/l10n/py/rules/python/S8971.json | 26 ++ .../py/rules/python/Sonar_way_profile.json | 1 + ...kipValidationWithConstraintsCheckTest.java | 31 +++ .../pydanticSkipValidationWithConstraints.py | 135 ++++++++++ 7 files changed, 491 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/PydanticSkipValidationWithConstraintsCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8971.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8971.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/PydanticSkipValidationWithConstraintsCheckTest.java create mode 100644 python-checks/src/test/resources/checks/pydanticSkipValidationWithConstraints.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 18172c411..f6e5ff16e 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -388,6 +388,7 @@ public Stream> getChecks() { PydanticJsonSchemaInputTypeWithAfterModeCheck.class, PydanticOptionalFieldDefaultCheck.class, PydanticMultipleInheritanceConfigCheck.class, + PydanticSkipValidationWithConstraintsCheck.class, PyTorchDataLoaderNumWorkersCheck.class, PytzTimeZoneInDatetimeConstructorCheck.class, RaiseOutsideExceptCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/PydanticSkipValidationWithConstraintsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/PydanticSkipValidationWithConstraintsCheck.java new file mode 100644 index 000000000..034aa6487 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/PydanticSkipValidationWithConstraintsCheck.java @@ -0,0 +1,230 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.AnnotatedAssignment; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.ClassDef; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.SubscriptionExpression; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.tree.TypeAnnotation; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.checks.utils.Expressions; +import org.sonar.python.tree.TreeUtils; + +@Rule(key = "S8971") +public class PydanticSkipValidationWithConstraintsCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Remove either \"SkipValidation\" or the validation constraints from this annotation."; + + private static final TypeMatcher IS_PYDANTIC_MODEL = TypeMatchers.isOrExtendsType("pydantic.BaseModel"); + + private static final TypeMatcher IS_TYPING_ANNOTATED = TypeMatchers.any( + TypeMatchers.isType("typing.Annotated"), + TypeMatchers.isType("typing_extensions.Annotated")); + + private static final TypeMatcher IS_SKIP_VALIDATION = TypeMatchers.any( + TypeMatchers.withFQN("pydantic.SkipValidation"), + TypeMatchers.withFQN("pydantic.functional_validators.SkipValidation")); + + private static final TypeMatcher IS_PYDANTIC_FIELD = TypeMatchers.isType("pydantic.fields.Field"); + + /** + * Keyword arguments of pydantic.Field() that impose actual value constraints on field inputs. + * Only pure value-bound constraints are included: numeric bounds, length limits, and pattern. + * Arguments such as default, alias, description, title, etc. are metadata-only. + * Behavioral flags are intentionally excluded: + * - strict, allow_inf_nan, coerce_numbers_to_str, fail_fast: control how validation runs, + * but with SkipValidation no validation runs at all, so these have no effect. + * - discriminator: structural union routing metadata, not a value constraint. + */ + private static final Set FIELD_VALIDATION_CONSTRAINT_ARGS = Set.of( + "gt", "ge", "lt", "le", + "multiple_of", + "min_length", "max_length", + "pattern", + "max_digits", "decimal_places"); + + private static final TypeMatcher IS_VALIDATION_CONSTRAINT = TypeMatchers.any( + TypeMatchers.withFQN("pydantic.StringConstraints"), + TypeMatchers.withFQN("pydantic.types.StringConstraints"), + TypeMatchers.withFQN("pydantic.AfterValidator"), + TypeMatchers.withFQN("pydantic.functional_validators.AfterValidator"), + TypeMatchers.withFQN("pydantic.BeforeValidator"), + TypeMatchers.withFQN("pydantic.functional_validators.BeforeValidator"), + TypeMatchers.withFQN("pydantic.PlainValidator"), + TypeMatchers.withFQN("pydantic.functional_validators.PlainValidator"), + TypeMatchers.withFQN("pydantic.WrapValidator"), + TypeMatchers.withFQN("pydantic.functional_validators.WrapValidator"), + TypeMatchers.withFQN("pydantic.WrapSerializer"), + TypeMatchers.withFQN("pydantic.functional_serializers.WrapSerializer"), + TypeMatchers.withFQN("pydantic.PlainSerializer"), + TypeMatchers.withFQN("pydantic.functional_serializers.PlainSerializer")); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.CLASSDEF, PydanticSkipValidationWithConstraintsCheck::checkClassDef); + } + + private static void checkClassDef(SubscriptionContext ctx) { + ClassDef classDef = (ClassDef) ctx.syntaxNode(); + + if (!IS_PYDANTIC_MODEL.isTrueFor(classDef.name(), ctx)) { + return; + } + + classDef.body().statements().stream() + .flatMap(TreeUtils.toStreamInstanceOfMapper(AnnotatedAssignment.class)) + .forEach(annotatedAssignment -> checkFieldAnnotation(ctx, annotatedAssignment)); + } + + private static void checkFieldAnnotation(SubscriptionContext ctx, AnnotatedAssignment annotatedAssignment) { + TypeAnnotation annotation = annotatedAssignment.annotation(); + Expression annotationExpr = annotation.expression(); + + if (!(annotationExpr instanceof SubscriptionExpression subscriptionExpr) || + !IS_TYPING_ANNOTATED.isTrueFor(subscriptionExpr.object(), ctx)) { + return; + } + + // Collect all subscript elements from this Annotated and any nested Annotated + List allElements = collectAnnotatedElements(subscriptionExpr, ctx); + + Expression skipValidationExpr = allElements.stream() + .filter(expr -> isSkipValidation(expr, ctx)) + .findFirst() + .orElse(null); + + if (skipValidationExpr == null) { + return; + } + + List constraintSecondaryExprs = allElements.stream() + .map(expr -> resolveConstraintSecondary(expr, ctx)) + .filter(Optional::isPresent) + .map(Optional::get) + .toList(); + + if (!constraintSecondaryExprs.isEmpty()) { + var issue = ctx.addIssue(skipValidationExpr, MESSAGE); + constraintSecondaryExprs.forEach(expr -> issue.secondary(expr, "Validation constraint is set here.")); + } + } + + /** + * Recursively collects all non-type elements from Annotated[...] subscripts. + * The first element in Annotated is the actual type (skipped). All subsequent + * elements are metadata/constraints. Nested Annotated[...] are unwrapped. + */ + private static List collectAnnotatedElements(SubscriptionExpression annotatedExpr, SubscriptionContext ctx) { + List elements = new ArrayList<>(); + List subscriptExprs = annotatedExpr.subscripts().expressions(); + + // subscriptExprs[0] is the annotated type, subscriptExprs[1..] are metadata + for (int i = 1; i < subscriptExprs.size(); i++) { + Expression element = subscriptExprs.get(i); + // If this element is itself an Annotated[...], flatten it recursively + if (element instanceof SubscriptionExpression nestedSubscription + && IS_TYPING_ANNOTATED.isTrueFor(nestedSubscription.object(), ctx)) { + elements.addAll(collectAnnotatedElements(nestedSubscription, ctx)); + } else { + elements.add(element); + } + } + + // Also recurse into the type argument if it is a nested Annotated + if (!subscriptExprs.isEmpty()) { + Expression typeArg = subscriptExprs.get(0); + if (typeArg instanceof SubscriptionExpression nestedAnnotated + && IS_TYPING_ANNOTATED.isTrueFor(nestedAnnotated.object(), ctx)) { + elements.addAll(collectAnnotatedElements(nestedAnnotated, ctx)); + } + } + + return elements; + } + + private static boolean isSkipValidation(Expression expr, SubscriptionContext ctx) { + // SkipValidation can appear as a bare name or as SkipValidation[T] subscription + if (expr instanceof SubscriptionExpression subscriptionExpr) { + return IS_SKIP_VALIDATION.isTrueFor(subscriptionExpr.object(), ctx); + } + return IS_SKIP_VALIDATION.isTrueFor(expr, ctx); + } + + /** + * Returns the expression to use as the secondary location if the given expression is a validation + * constraint (or a name that resolves to one), or empty otherwise. + * + *

              For direct constraint expressions (e.g. {@code Field(gt=0)}, {@code AfterValidator(...)}), + * the expression itself is returned. For bare name references (e.g. {@code constraint} where + * {@code constraint = Field(gt=0)} is assigned in the class body), the single assigned value is + * returned so the secondary location points at the constraint definition, not the reference.

              + */ + private static Optional resolveConstraintSecondary(Expression expr, SubscriptionContext ctx) { + if (isDirectConstraint(expr, ctx)) { + return Optional.of(expr); + } + // If expr is a bare name, check whether it was assigned a single constraint value. + if (expr instanceof Name name) { + Expression assigned = Expressions.singleAssignedValue(name); + if (assigned != null && isDirectConstraint(assigned, ctx)) { + return Optional.of(assigned); + } + } + return Optional.empty(); + } + + private static boolean isDirectConstraint(Expression expr, SubscriptionContext ctx) { + // Constraints typically appear as CallExpression: Field(gt=0), StringConstraints(...) + if (expr instanceof CallExpression callExpr) { + // Non-Field constraints (validators, serializers, StringConstraints): always count + if (IS_VALIDATION_CONSTRAINT.isTrueFor(callExpr.callee(), ctx)) { + return true; + } + // Field(): only count as a constraint when at least one validation-specific kwarg is present. + // Calls like Field(default=0), Field(alias="x"), Field(description="...") are metadata-only + // and should not be flagged when combined with SkipValidation. + if (IS_PYDANTIC_FIELD.isTrueFor(callExpr.callee(), ctx)) { + return hasFieldValidationConstraintArg(callExpr); + } + } + // Some validators can be used as bare references too + return IS_VALIDATION_CONSTRAINT.isTrueFor(expr, ctx); + } + + private static boolean hasFieldValidationConstraintArg(CallExpression callExpr) { + return callExpr.arguments().stream() + .filter(RegularArgument.class::isInstance) + .map(arg -> ((RegularArgument) arg).keywordArgument()) + .filter(Objects::nonNull) + .map(Name::name) + .anyMatch(FIELD_VALIDATION_CONSTRAINT_ARGS::contains); + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8971.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8971.html new file mode 100644 index 000000000..521e6d119 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8971.html @@ -0,0 +1,67 @@ +

              This rule raises an issue when SkipValidation is used in an Annotated type that also contains validation constraints like +Field, StringConstraints, or other Pydantic validators.

              +

              Why is this an issue?

              +

              In Pydantic, SkipValidation converts a field’s validation schema to any_schema, which accepts any value without type or +constraint checks. Combining it with validation constraints in the same type annotation leads to broken behavior regardless of ordering:

              +
                +
              • When SkipValidation is the outermost annotation, it replaces the entire validation schema with any_schema. Any + constraints defined in an inner Annotated block are silently dropped — the field accepts any value, including values that violate the + constraints.
              • +
              • When SkipValidation is not the outermost annotation, constraints may still be applied as post-validation functions on top of + any_schema. The type check is skipped, so passing a value of the wrong type does not produce a clean ValidationError but + instead causes a TypeError at runtime.
              • +
              +

              This pattern suggests a misunderstanding of how SkipValidation works. Developers likely intended either to validate the data OR to +skip validation entirely, not both. The presence of both indicates a logic error in the code.

              +

              For example, in Annotated[Annotated[int, Field(gt=0)], SkipValidation], the Field(gt=0) constraint is completely ignored +because SkipValidation as the outermost annotation converts the whole schema to any_schema, allowing any value to pass +through without validation.

              +

              What is the potential impact?

              +

              Using SkipValidation alongside validation constraints can lead to security vulnerabilities and data integrity issues:

              +
                +
              • Invalid data acceptance: Data that should be rejected based on the defined constraints will be accepted without validation
              • +
              • False security: The code appears to validate input (constraints are visible in the type definition), but actually accepts any + data, creating a false sense of security
              • +
              • Runtime errors: Passing a value of the wrong type bypasses the type check and causes a TypeError instead of a + ValidationError, crashing downstream code
              • +
              • Compliance violations: Applications subject to data validation requirements may unknowingly violate compliance rules
              • +
              +

              The severity depends on what the data is used for - user input, configuration data, or data from external systems represent higher risk +scenarios.

              +

              How to fix it

              +

              The fix depends on what was intended:

              +
                +
              • To enforce validation constraints: remove SkipValidation. All constraints will be properly applied.
              • +
              • To skip validation intentionally: remove the validation constraints and use SkipValidation[Type] on its own. This + is appropriate when the data is already validated upstream (for example, passing a previously-constructed model instance), or when the performance + cost of re-validation is not worth it and the caller guarantees valid data. The type annotation is still present for IDE and type-checker support — + only the runtime validation is skipped.
              • +
              +

              Code examples

              +

              Noncompliant code example

              +
              +from typing import Annotated
              +from pydantic import BaseModel, SkipValidation, Field
              +
              +class Model(BaseModel):
              +    value: Annotated[Annotated[int, Field(gt=0)], SkipValidation]  # Noncompliant - Field(gt=0) is silently ignored
              +    other: Annotated[int, SkipValidation, Field(gt=0)]  # Noncompliant - type check is skipped, wrong types cause TypeError
              +
              +

              Compliant solution

              +
              +from typing import Annotated
              +from pydantic import BaseModel, SkipValidation, Field
              +
              +class Model(BaseModel):
              +    validated: Annotated[int, Field(gt=0)]  # constraints properly enforced at runtime
              +    trusted: SkipValidation[int]  # validation intentionally skipped; data is already trusted
              +
              +

              Resources

              +

              Documentation

              + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8971.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8971.json new file mode 100644 index 000000000..0b5daae6b --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8971.json @@ -0,0 +1,26 @@ +{ + "title": "\"SkipValidation\" should not be combined with validation constraints", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "pydantic", + "type-hint", + "pitfall" + ], + "defaultSeverity": "Minor", + "ruleSpecification": "RSPEC-8971", + "sqKey": "S8971", + "scope": "Main", + "quickfix": "unknown", + "code": { + "impacts": { + "RELIABILITY": "LOW", + "MAINTAINABILITY": "LOW" + }, + "attribute": "CLEAR" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index b597b3242..96f642334 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -369,6 +369,7 @@ "S8906", "S8963", "S8966", + "S8971", "S8974" ] } diff --git a/python-checks/src/test/java/org/sonar/python/checks/PydanticSkipValidationWithConstraintsCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/PydanticSkipValidationWithConstraintsCheckTest.java new file mode 100644 index 000000000..7931bfaa9 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/PydanticSkipValidationWithConstraintsCheckTest.java @@ -0,0 +1,31 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.junit.jupiter.api.Test; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class PydanticSkipValidationWithConstraintsCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify( + "src/test/resources/checks/pydanticSkipValidationWithConstraints.py", + new PydanticSkipValidationWithConstraintsCheck()); + } + +} diff --git a/python-checks/src/test/resources/checks/pydanticSkipValidationWithConstraints.py b/python-checks/src/test/resources/checks/pydanticSkipValidationWithConstraints.py new file mode 100644 index 000000000..2f2937d8c --- /dev/null +++ b/python-checks/src/test/resources/checks/pydanticSkipValidationWithConstraints.py @@ -0,0 +1,135 @@ +from typing import Annotated +from pydantic import BaseModel, SkipValidation, Field +from pydantic import StringConstraints, AfterValidator, BeforeValidator, PlainValidator, WrapValidator + +# ===================== +# NON-COMPLIANT CASES +# ===================== + +class Model(BaseModel): + # SkipValidation combined with Field in the same Annotated + value: Annotated[int, SkipValidation, Field(gt=0)] # Noncompliant {{Remove either "SkipValidation" or the validation constraints from this annotation.}} + # ^^^^^^^^^^^^^^ 1^^^^^^^^^^^< {{Validation constraint is set here.}} + + constraint = Field(gt=0) + # ^^^^^^^^^^^> {{Validation constraint is set here.}} + value: Annotated[int, SkipValidation, constraint] # Noncompliant {{Remove either "SkipValidation" or the validation constraints from this annotation.}} + # ^^^^^^^^^^^^^^ + # Field constraint in inner Annotated, SkipValidation in outer + other: Annotated[Annotated[int, Field(gt=0)], SkipValidation] # Noncompliant + # ^^^^^^^^^^^> {{Validation constraint is set here.}} + # ^^^^^^^^^^^^^^@-1 1 + + # SkipValidation with StringConstraints + name: Annotated[str, SkipValidation, StringConstraints(min_length=1)] # Noncompliant + # ^^^^^^^^^^^^^^ 1^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Validation constraint is set here.}} + + # SkipValidation combined with AfterValidator + validated: Annotated[int, SkipValidation, AfterValidator(lambda x: x)] # Noncompliant + # ^^^^^^^^^^^^^^ 1^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Validation constraint is set here.}} + + # SkipValidation combined with BeforeValidator (constraint before SkipValidation) + pre_validated: Annotated[int, BeforeValidator(lambda x: x), SkipValidation] # Noncompliant + # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^> {{Validation constraint is set here.}} + # ^^^^^^^^^^^^^^@-1 1 + + # SkipValidation in outer, StringConstraints in nested inner Annotated + nested_str: Annotated[Annotated[str, StringConstraints(min_length=1)], SkipValidation] # Noncompliant + # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^> {{Validation constraint is set here.}} + # ^^^^^^^^^^^^^^@-1 1 + + # SkipValidation combined with PlainValidator + plain: Annotated[int, SkipValidation, PlainValidator(lambda x: x)] # Noncompliant + # ^^^^^^^^^^^^^^ 1^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Validation constraint is set here.}} + + # SkipValidation combined with WrapValidator + wrapped: Annotated[int, SkipValidation, WrapValidator(lambda x, handler: handler(x))] # Noncompliant + # ^^^^^^^^^^^^^^ 1^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Validation constraint is set here.}} + + # Field with min_length kwarg + SkipValidation + min_len_field: Annotated[str, SkipValidation, Field(min_length=1)] # Noncompliant + # ^^^^^^^^^^^^^^ 1^^^^^^^^^^^^^^^^^^^< {{Validation constraint is set here.}} + + # Field with multiple constraint kwargs + SkipValidation + multi_constraint: Annotated[int, SkipValidation, Field(ge=0, le=100)] # Noncompliant + # ^^^^^^^^^^^^^^ 1^^^^^^^^^^^^^^^^^^^< {{Validation constraint is set here.}} + + # Field with constraint kwarg mixed with metadata kwargs + SkipValidation: still a constraint + mixed_field: Annotated[int, SkipValidation, Field(default=0, gt=0)] # Noncompliant + # ^^^^^^^^^^^^^^ 1^^^^^^^^^^^^^^^^^^^^^^< {{Validation constraint is set here.}} + + +# ===================== +# COMPLIANT CASES +# ===================== + +class CompliantModel(BaseModel): + # SkipValidation alone with a subscript type - OK + trusted: SkipValidation[int] + + # SkipValidation as only annotation in Annotated - OK + also_trusted: Annotated[int, SkipValidation] + + # Field alone without SkipValidation - OK + constrained: Annotated[int, Field(gt=0)] + + # StringConstraints alone - OK + string_field: Annotated[str, StringConstraints(min_length=1)] + + # Nested Annotated without SkipValidation - OK + nested: Annotated[Annotated[int, Field(gt=0)], Field(lt=100)] + + # AfterValidator alone - OK + after: Annotated[int, AfterValidator(lambda x: x)] + + # Plain type annotation - OK + plain_type: int + + # Field with a default - OK + optional: Annotated[int, Field(default=0)] + + # Field with only default + SkipValidation: no validation constraint, so OK + default_trusted: Annotated[int, SkipValidation, Field(default=0)] + + # Field with only alias + SkipValidation: alias is metadata, not a constraint + alias_trusted: Annotated[str, SkipValidation, Field(alias="x")] + + # Field with only description + SkipValidation: description is metadata, not a constraint + desc_trusted: Annotated[str, SkipValidation, Field(description="some description")] + + # Field with only serialization_alias + SkipValidation + ser_alias_trusted: Annotated[str, SkipValidation, Field(serialization_alias="x")] + + # Field with only validation_alias + SkipValidation + val_alias_trusted: Annotated[str, SkipValidation, Field(validation_alias="x")] + + # Field with default_factory + SkipValidation: no constraint, OK + factory_trusted: Annotated[list, SkipValidation, Field(default_factory=list)] + + # Field with title + SkipValidation: metadata only + title_trusted: Annotated[str, SkipValidation, Field(title="My Field")] + + # Field with exclude + SkipValidation: serialization flag, not a constraint + exclude_trusted: Annotated[str, SkipValidation, Field(exclude=True)] + + # Behavioral flags: with SkipValidation, no validation runs so these have no effect regardless of value + strict_true: Annotated[int, SkipValidation, Field(strict=True)] + strict_false: Annotated[int, SkipValidation, Field(strict=False)] + allow_inf_nan_true: Annotated[float, SkipValidation, Field(allow_inf_nan=True)] + allow_inf_nan_false: Annotated[float, SkipValidation, Field(allow_inf_nan=False)] + coerce_str: Annotated[str, SkipValidation, Field(coerce_numbers_to_str=True)] + fail_fast_field: Annotated[int, SkipValidation, Field(fail_fast=True)] + discriminator_field: Annotated[int, SkipValidation, Field(discriminator="type")] + + +# Regular class (not a Pydantic model) - should not trigger +class RegularClass: + value: Annotated[int, SkipValidation, Field(gt=0)] + + +# Standalone annotations outside any class - should not trigger +standalone: Annotated[int, SkipValidation, Field(gt=0)] + + +def process(value: Annotated[int, SkipValidation, Field(gt=0)]) -> None: + pass From d7aebcf5fcb65a148cb1bcb1a5b31058d4381e62 Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Thu, 9 Jul 2026 18:00:00 +0200 Subject: [PATCH 197/322] SONARPY-4342 Create rule S8973: Double leading underscores should not be used for private attributes in Pydantic models" (#1260) GitOrigin-RevId: a8248c5307170aa4f572873b212edf9580ddcc05 --- .../python/checks/OpenSourceCheckList.java | 1 + ...DoubleUnderscorePrivateAttributeCheck.java | 91 +++++++++++++++++++ .../org/sonar/l10n/py/rules/python/S8973.html | 72 +++++++++++++++ .../org/sonar/l10n/py/rules/python/S8973.json | 24 +++++ .../py/rules/python/Sonar_way_profile.json | 1 + ...leUnderscorePrivateAttributeCheckTest.java | 29 ++++++ ...ydanticDoubleUnderscorePrivateAttribute.py | 78 ++++++++++++++++ 7 files changed, 296 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/PydanticDoubleUnderscorePrivateAttributeCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8973.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8973.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/PydanticDoubleUnderscorePrivateAttributeCheckTest.java create mode 100644 python-checks/src/test/resources/checks/pydanticDoubleUnderscorePrivateAttribute.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index f6e5ff16e..7f79e2747 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -385,6 +385,7 @@ public Stream> getChecks() { PubliclyWritableDirectoriesCheck.class, PublicNetworkAccessToCloudResourcesCheck.class, PydanticCoreSerializationFallbackCheck.class, + PydanticDoubleUnderscorePrivateAttributeCheck.class, PydanticJsonSchemaInputTypeWithAfterModeCheck.class, PydanticOptionalFieldDefaultCheck.class, PydanticMultipleInheritanceConfigCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/PydanticDoubleUnderscorePrivateAttributeCheck.java b/python-checks/src/main/java/org/sonar/python/checks/PydanticDoubleUnderscorePrivateAttributeCheck.java new file mode 100644 index 000000000..b5578a2ac --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/PydanticDoubleUnderscorePrivateAttributeCheck.java @@ -0,0 +1,91 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.AnnotatedAssignment; +import org.sonar.plugins.python.api.tree.AssignmentStatement; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.ClassDef; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.tree.TreeUtils; + +@Rule(key = "S8973") +public class PydanticDoubleUnderscorePrivateAttributeCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Replace this double underscore prefix with a single underscore to avoid Python name mangling."; + + private static final TypeMatcher IS_PYDANTIC_MODEL = TypeMatchers.isOrExtendsType("pydantic.BaseModel"); + private static final TypeMatcher IS_PYDANTIC_PRIVATE_ATTR = TypeMatchers.isType("pydantic.PrivateAttr"); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.CLASSDEF, PydanticDoubleUnderscorePrivateAttributeCheck::checkClassDef); + } + + private static void checkClassDef(SubscriptionContext ctx) { + ClassDef classDef = (ClassDef) ctx.syntaxNode(); + + if (!IS_PYDANTIC_MODEL.isTrueFor(classDef.name(), ctx)) { + return; + } + + classDef.body().statements().stream() + .flatMap(TreeUtils.toStreamInstanceOfMapper(AnnotatedAssignment.class)) + .forEach(annotatedAssignment -> checkAttribute(ctx, annotatedAssignment.variable())); + + classDef.body().statements().stream() + .flatMap(TreeUtils.toStreamInstanceOfMapper(AssignmentStatement.class)) + .filter(stmt -> isPrivateAttrCall(ctx, stmt.assignedValue())) + .flatMap(stmt -> stmt.lhsExpressions().stream()) + .flatMap(exprList -> exprList.expressions().stream()) + .forEach(variable -> checkAttribute(ctx, variable)); + } + + private static boolean isPrivateAttrCall(SubscriptionContext ctx, Expression assignedValue) { + if (!(assignedValue instanceof CallExpression callExpression)) { + return false; + } + return IS_PYDANTIC_PRIVATE_ATTR.isTrueFor(callExpression.callee(), ctx); + } + + private static void checkAttribute(SubscriptionContext ctx, Expression variable) { + if (!(variable instanceof Name name)) { + return; + } + + String attributeName = name.name(); + if (hasDoubleUnderscorePrefix(attributeName)) { + ctx.addIssue(name, MESSAGE); + } + } + + /** + * Returns true if the name has a double leading underscore prefix but is NOT a dunder method/attribute + * (i.e., does not also end with double underscore like {@code __init__}). + */ + private static boolean hasDoubleUnderscorePrefix(String name) { + return name.startsWith("__") && !name.endsWith("__"); + } + +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8973.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8973.html new file mode 100644 index 000000000..b800a368a --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8973.html @@ -0,0 +1,72 @@ +

              This rule raises an issue when private attributes in data validation or modeling frameworks use a double leading underscore prefix (like +__attr).

              +

              In Python, this specifically applies to Pydantic models.

              +

              Why is this an issue?

              +

              In data validation frameworks, private attributes are typically defined using a specific naming convention (e.g., prefixing the attribute name with +a single underscore). These attributes are not validated during object instantiation and are excluded from the schema or type definition.

              +

              When an attribute is declared with a double leading underscore (e.g., __attr), Python applies name mangling at the class body level, +renaming the attribute to _ClassName__attr before the framework even sees it. The class will define and instantiate without any error, +but this creates a silent behavioral trap:

              +
                +
              • Accessing the attribute from outside the class using the original name (e.g., obj.__attr) raises an AttributeError, + because the stored name is _ClassName__attr
              • +
              • A subclass method referring to self.__attr mangles the name to _SubClass__attr, not _ParentClass__attr, + causing an AttributeError at runtime
              • +
              • The attribute’s default value and configuration still apply, but only under the obscure mangled name, which is an implementation detail not + intended to be used directly
              • +
              +

              This behavior causes subtle bugs that are difficult to detect, because the class appears to be defined correctly and instantiation succeeds without +any warning.

              +

              In Pydantic, private attributes must be declared with a single leading underscore (e.g., _private_attr). When an attribute is declared +with a double leading underscore (e.g., __private_attr), Python’s name mangling silently renames it to +_ClassName__private_attr before Pydantic processes the class. This causes two concrete problems:

              +
                +
              • Broken external access: Accessing the attribute from outside the class using the original name (e.g., + model.__private_attr) raises an AttributeError. Only the mangled name model._ClassName__private_attr works, + which is an implementation detail callers are not supposed to use.
              • +
              • Broken subclass access: A subclass method that refers to self.__private_attr will mangle the name to + _SubClass__private_attr, not _ParentClass__private_attr, resulting in an AttributeError at runtime.
              • +
              +

              What is the potential impact?

              +

              Using a double leading underscore for private attributes in data modeling frameworks leads to:

              +
                +
              • Runtime errors: Code outside the defining class that attempts to access the attribute using its original name will raise an + AttributeError
              • +
              • Broken inheritance: Subclass methods that reference the attribute will fail because name mangling produces a different key than + what the parent class stored
              • +
              • Obscured intent: The attribute is technically registered but only accessible via the mangled name, which is an implementation + detail not part of the intended API
              • +
              • Maintenance issues: The class definition and instantiation succeed without any error, so the bug only surfaces when the + attribute is accessed in a specific context, making it hard to diagnose
              • +
              +

              How to fix it

              +

              Replace the double leading underscores with a single underscore prefix. Pydantic recognizes single-underscore attributes as private and initializes +them correctly.

              +

              Code examples

              +

              Noncompliant code example

              +
              +from pydantic import BaseModel, PrivateAttr
              +
              +class Model(BaseModel):
              +    __counter: int = PrivateAttr(default=0)  # Noncompliant: name mangling prevents expected access
              +
              +m = Model()
              +print(m.__counter)  # Raises AttributeError: 'Model' object has no attribute '__counter'
              +
              +

              Compliant solution

              +
              +from pydantic import BaseModel, PrivateAttr
              +
              +class Model(BaseModel):
              +    _counter: int = PrivateAttr(default=0)  # Compliant: single underscore prefix
              +
              +m = Model()
              +print(m._counter)  # Works correctly: outputs 0
              +
              +

              Resources

              +

              Documentation

              + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8973.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8973.json new file mode 100644 index 000000000..969ccfb2a --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8973.json @@ -0,0 +1,24 @@ +{ + "title": "Double leading underscores should not be used for private attributes in Pydantic models", + "type": "BUG", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5 min" + }, + "tags": [ + "pydantic", + "pitfall" + ], + "defaultSeverity": "Critical", + "ruleSpecification": "RSPEC-8973", + "sqKey": "S8973", + "scope": "Main", + "quickfix": "unknown", + "code": { + "impacts": { + "RELIABILITY": "HIGH" + }, + "attribute": "LOGICAL" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 96f642334..a0eae4abb 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -370,6 +370,7 @@ "S8963", "S8966", "S8971", + "S8973", "S8974" ] } diff --git a/python-checks/src/test/java/org/sonar/python/checks/PydanticDoubleUnderscorePrivateAttributeCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/PydanticDoubleUnderscorePrivateAttributeCheckTest.java new file mode 100644 index 000000000..37937f090 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/PydanticDoubleUnderscorePrivateAttributeCheckTest.java @@ -0,0 +1,29 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.junit.jupiter.api.Test; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class PydanticDoubleUnderscorePrivateAttributeCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/pydanticDoubleUnderscorePrivateAttribute.py", new PydanticDoubleUnderscorePrivateAttributeCheck()); + } + +} diff --git a/python-checks/src/test/resources/checks/pydanticDoubleUnderscorePrivateAttribute.py b/python-checks/src/test/resources/checks/pydanticDoubleUnderscorePrivateAttribute.py new file mode 100644 index 000000000..ad69e4e5d --- /dev/null +++ b/python-checks/src/test/resources/checks/pydanticDoubleUnderscorePrivateAttribute.py @@ -0,0 +1,78 @@ +from pydantic import BaseModel, PrivateAttr + +# ===================== +# NON-COMPLIANT CASES +# ===================== + +class Model(BaseModel): + __counter: int = PrivateAttr(default=0) # Noncompliant {{Replace this double underscore prefix with a single underscore to avoid Python name mangling.}} +# ^^^^^^^^^ + +class ModelWithMultipleIssues(BaseModel): + __name: str = PrivateAttr(default="") # Noncompliant + __value: int = PrivateAttr(default=0) # Noncompliant + _ok: str = PrivateAttr(default="ok") # Compliant + +class ModelWithDunderAndRegular(BaseModel): + __private: str = PrivateAttr(default="") # Noncompliant + name: str # Compliant: not private at all + _single: int = PrivateAttr(default=1) # Compliant + +class SubModel(BaseModel): + __sub_attr: float = PrivateAttr(default=0.0) # Noncompliant + +# ===================== +# COMPLIANT CASES +# ===================== + +class CompliantModel(BaseModel): + _counter: int = PrivateAttr(default=0) # Compliant: single underscore prefix + name: str # Compliant: regular field, no underscore + _private: str = PrivateAttr(default="hello") # Compliant + +class ModelWithDunderMethod(BaseModel): + name: str # Compliant + # Dunder methods should not be flagged (they're not private attributes with double underscore prefix) + +class RegularClass: + __attr: int = 0 # Compliant: not a Pydantic model + +class ModelWithoutDoubleUnderscore(BaseModel): + _attr: str = PrivateAttr(default="") # Compliant: single underscore + +# Inheritance from non-Pydantic class should not be flagged +class NonPydanticBase: + pass + +class DerivedFromNonPydantic(NonPydanticBase): + __attr: int = 0 # Compliant: not a Pydantic model + +# ===================== +# EDGE CASES +# ===================== + +class EmptyModel(BaseModel): + pass # Compliant: no fields + +class ModelWithRegularFields(BaseModel): + id: int # Compliant: no underscore + name: str # Compliant: no underscore + _status: str = PrivateAttr(default="active") # Compliant: single underscore + +# Unannotated assignments with PrivateAttr should be flagged +class ModelWithUnannotatedPrivateAttr(BaseModel): + __counter = PrivateAttr(default=0) # Noncompliant {{Replace this double underscore prefix with a single underscore to avoid Python name mangling.}} +# ^^^^^^^^^ + +class ModelWithMultipleUnannotatedIssues(BaseModel): + __id = PrivateAttr(default=0) # Noncompliant + __label = PrivateAttr(default="") # Noncompliant + _ok = PrivateAttr(default=0) # Compliant: single underscore + +# Unannotated plain class variable (not a PrivateAttr call) should not be flagged +class ModelWithUnannotatedPlainVar(BaseModel): + __plain = 0 # Compliant: not a PrivateAttr call + +# Non-pydantic class with unannotated double-underscore PrivateAttr should not be flagged +class RegularClassWithUnannotatedPrivateAttr: + __counter = PrivateAttr(default=0) # Compliant: not a Pydantic model From 9c3cd505543955b8baefe834d6855fd40542dfd6 Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Fri, 10 Jul 2026 09:22:32 +0200 Subject: [PATCH 198/322] SONARPY-4364 S8963: Fix bug where issue was raised without conflict (#1287) GitOrigin-RevId: 03e35777bf279c04d5c3a7bb39617bf4145ae69f --- ...ydanticMultipleInheritanceConfigCheck.java | 2 +- .../pydanticMultipleInheritanceConfigCheck.py | 38 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/PydanticMultipleInheritanceConfigCheck.java b/python-checks/src/main/java/org/sonar/python/checks/PydanticMultipleInheritanceConfigCheck.java index e0ce2764f..126195987 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/PydanticMultipleInheritanceConfigCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/PydanticMultipleInheritanceConfigCheck.java @@ -112,7 +112,7 @@ private static void reportIfConflictingConfigs( ClassDef classDef, Set visitedClassesDefiningModelConfig, List superClassesWithNewModelConfig) { - if (visitedClassesDefiningModelConfig.size() >= 2) { + if (superClassesWithNewModelConfig.size() >= 2) { PreciseIssue issue = ctx.addIssue(classDef.name(), MESSAGE); for (Expression superClass : superClassesWithNewModelConfig) { issue.secondary(superClass, "This base class defines \"model_config\"."); diff --git a/python-checks/src/test/resources/checks/pydanticMultipleInheritanceConfigCheck.py b/python-checks/src/test/resources/checks/pydanticMultipleInheritanceConfigCheck.py index f9129807c..a9463437d 100644 --- a/python-checks/src/test/resources/checks/pydanticMultipleInheritanceConfigCheck.py +++ b/python-checks/src/test/resources/checks/pydanticMultipleInheritanceConfigCheck.py @@ -1,4 +1,7 @@ from pydantic import BaseModel, ConfigDict +from typing import Generic, TypeVar + +T = TypeVar("T") # ===================== @@ -203,3 +206,38 @@ class BaseIdentical2(BaseModel): class ModelIdenticalConfig(BaseIdentical1, BaseIdentical2): # Noncompliant # ^^^^^^^^^^^^^^^^^^^^ l: str + + +# ===================== +# SINGLE BRANCH FP REGRESSION +# ===================== + +# PatchTaskInstanceBody defines model_config locally; PlainBaseModel does not. +# The only model_config "branch" is PatchTaskInstanceBody (BaseModel is shared root). +# No conflict → must not raise. +class PatchTaskInstanceBody(BaseModel): + model_config = ConfigDict(str_to_lower=True) + task_id: str + +class PlainBaseModel(BaseModel): + pass + +class BulkTaskInstanceBody(PatchTaskInstanceBody, PlainBaseModel): # Compliant - only one branch defines model_config + dag_id: str + + +# ===================== +# GENERIC BASE CLASS (FP regression) +# ===================== + +class StrictBaseModel(BaseModel): + model_config = ConfigDict(strict=True) + +# Compliant - only one Pydantic base with model_config; Generic[T] is not a Pydantic config source +class BulkBaseAction(StrictBaseModel, Generic[T]): # Compliant + pass + +# Two distinct Pydantic bases each with their own model_config — still noncompliant even with Generic[T] mixed in +class ConflictingGenericModel(Base1, Base2, Generic[T]): # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^^^^ + pass From ae022bc8a073abf17738fe5953b1aee2f21959eb Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Fri, 10 Jul 2026 09:23:30 +0200 Subject: [PATCH 199/322] SONARPY-4318 Update rule metadata (#1288) GitOrigin-RevId: 7b6d7a792efdaffc5fe429e3dc84ec5aefcfe890 --- .../org/sonar/l10n/py/rules/python/S1110.json | 1 - .../org/sonar/l10n/py/rules/python/S1313.html | 1 + .../org/sonar/l10n/py/rules/python/S2068.json | 3 +- .../org/sonar/l10n/py/rules/python/S2115.json | 3 +- .../org/sonar/l10n/py/rules/python/S2187.html | 4 +- .../org/sonar/l10n/py/rules/python/S5778.html | 8 ++-- .../org/sonar/l10n/py/rules/python/S5779.html | 43 +++---------------- .../org/sonar/l10n/py/rules/python/S6418.json | 3 +- .../org/sonar/l10n/py/rules/python/S6437.json | 3 +- .../org/sonar/l10n/py/rules/python/S6781.json | 3 +- .../org/sonar/l10n/py/rules/python/S8963.json | 2 +- .../org/sonar/l10n/py/rules/python/S8966.json | 2 +- .../org/sonar/l10n/py/rules/python/S8971.json | 2 +- .../org/sonar/l10n/py/rules/python/S8974.html | 13 ------ sonarpedia.json | 2 +- 15 files changed, 28 insertions(+), 65 deletions(-) diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1110.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1110.json index ba3c690aa..3fabb622d 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1110.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1110.json @@ -7,7 +7,6 @@ "constantCost": "2 min" }, "tags": [ - "clippy", "redundant", "readability" ], diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1313.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1313.html index b2eacdeda..39606667e 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1313.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1313.html @@ -47,6 +47,7 @@

              Compliant solution

              Resources

              Standards

                +
              • CWE - CWE-547 - Use of Hard-coded, Security-relevant Constants
              • OWASP - Top 10 2021 Category A1 - Broken Access Control
              • OWASP - Top 10 2017 Category A3 - Sensitive Data Exposure
              • diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2068.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2068.json index a1abd7e14..fb776e608 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2068.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2068.json @@ -15,7 +15,8 @@ "quickfix": "infeasible", "tags": [ "cwe", - "former-hotspot" + "former-hotspot", + "secret" ], "defaultSeverity": "Major", "ruleSpecification": "RSPEC-2068", diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2115.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2115.json index 38369e62a..c7eb38ce5 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2115.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2115.json @@ -13,7 +13,8 @@ "constantCost": "45min" }, "tags": [ - "cwe" + "cwe", + "secret" ], "defaultSeverity": "Blocker", "ruleSpecification": "RSPEC-2115", diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2187.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2187.html index 9df340e6e..f8fbf80f7 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2187.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S2187.html @@ -66,7 +66,7 @@

                Compliant solution

                Resources

                Documentation

                diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5778.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5778.html index 35406602e..dd23db20e 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5778.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5778.html @@ -7,10 +7,10 @@

                Why is this an issue?

                 pytest.raises(IndexError, lambda: get_item().process())
                 
                -

                Here, both get_item() and process() could potentially raise an IndexError. If the test passes, you cannot be -certain which method actually raised the exception. This ambiguity reduces test reliability.

                -

                By isolating the method call you want to test, you make your test explicit and unambiguous. This improves test reliability and makes your test -suite a better specification of expected behavior.

                +

                Here, both get_item() and process() could potentially raise an IndexError. The test does not make it +explicit which method is expected to raise the exception. This ambiguity makes the test harder to read and maintain.

                +

                By isolating the method call you want to test, you make your test explicit and unambiguous. This improves readability and maintainability, and +makes your test suite a better specification of expected behavior.

                What is the potential impact?

                Writing tests with multiple method calls when testing for exceptions reduces test quality:

                  diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5779.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5779.html index 576308d34..a6e4c2424 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5779.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5779.html @@ -1,11 +1,11 @@ -

                  This is an issue when assertion statements, assertion methods, or fluent assertions are placed within a try block that catches +

                  This rule raises an issue when assertion statements, assertion methods, or fluent assertions are placed within a try block that catches AssertionError exceptions without properly handling or re-raising them.

                  Why is this an issue?

                  Assertions in Python raise an AssertionError when they fail. This includes built-in assert statements, unittest assertion helpers such as assertEqual, and fluent assertions from libraries such as assertpy. This is the mechanism testing frameworks use to detect test failures.

                  When you place assertions within a try-except block that catches AssertionError (or its parent class Exception), and you -don’t re-raise the exception or validate its properties, you create a silent failure scenario. The assertion can fail, but the exception gets +do not re-raise the exception or validate its properties, you create a silent failure scenario. The assertion can fail, but the exception gets swallowed by the except block, causing the test to pass when it should have failed.

                  This defeats the entire purpose of writing assertions in tests. The test appears to pass, giving false confidence that the code works correctly, when in reality the assertion failed and detected a problem.

                  @@ -25,7 +25,7 @@

                  What is the potential impact?

                  This can lead to:

                  • Security vulnerabilities going undetected if security-related tests falsely pass
                  • -
                  • Functional bugs making it to production, causing user-facing issues
                  • +
                  • Functional bugs making it to production
                  • Regression of previously working features without detection
                  • Wasted debugging time when issues are discovered later in the development cycle or in production
                  • Loss of trust in the test suite’s reliability
                  • @@ -60,7 +60,7 @@

                    Noncompliant code example

                    try: self.do_something() self.fail("Expected an AssertionError!") # Noncompliant - except AssertionError as e: + except AssertionError: pass # Exception caught but not validated def do_something(self): @@ -122,7 +122,7 @@

                    Noncompliant code example

                    try: do_something() assert False, "Expected an AssertionError!" # Noncompliant - except AssertionError as e: + except AssertionError: pass # Exception details not validated def do_something(): @@ -170,21 +170,6 @@

                    Noncompliant code example

                    except AssertionError: pass
            -

            This variation also catches the failing assertion locally and ignores it. Even if assert_that(…​) fails, the test still passes because -nothing validates or re-raises the caught exception.

            -
            -from assertpy import assert_that
            -
            -def test_error_message():
            -    try:
            -        do_something()
            -        assert_that(False).described_as("Expected an AssertionError!").is_true()  # Noncompliant
            -    except AssertionError as exc:
            -        pass  # Exception caught but not validated
            -
            -def do_something():
            -    raise AssertionError("Something went wrong")
            -

            Compliant solution

            Keep the assertpy assertion outside the try-except block so test failures are reported normally.

            @@ -194,27 +179,13 @@ 

            Compliant solution

            result = get_result() assert_that(result).is_equal_to("expected")
            -

            When you intentionally verify an AssertionError, use a dedicated exception assertion and then validate the message.

            -
            -import pytest
            -
            -def test_error_message():
            -    with pytest.raises(AssertionError) as exc_info:
            -        do_something()
            -
            -    assert str(exc_info.value) == "Something went wrong"
            -
            -def do_something():
            -    raise AssertionError("Something went wrong")
            -

            Resources

            Documentation

            diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6418.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6418.json index 7c8d27469..47b33fc8b 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6418.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6418.json @@ -15,7 +15,8 @@ "quickfix": "infeasible", "tags": [ "cwe", - "former-hotspot" + "former-hotspot", + "secret" ], "defaultSeverity": "Blocker", "ruleSpecification": "RSPEC-6418", diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6437.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6437.json index 757d768d0..70c5fa990 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6437.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6437.json @@ -13,7 +13,8 @@ "constantCost": "60min" }, "tags": [ - "cwe" + "cwe", + "secret" ], "defaultSeverity": "Blocker", "ruleSpecification": "RSPEC-6437", diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6781.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6781.json index d0c729cd6..935b50481 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6781.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S6781.json @@ -13,7 +13,8 @@ "constantCost": "30min" }, "tags": [ - "cwe" + "cwe", + "secret" ], "defaultSeverity": "Blocker", "ruleSpecification": "RSPEC-6781", diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8963.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8963.json index 86ccefb21..8da50bbe6 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8963.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8963.json @@ -14,7 +14,7 @@ "defaultSeverity": "Major", "ruleSpecification": "RSPEC-8963", "sqKey": "S8963", - "scope": "All", + "scope": "Main", "quickfix": "unknown", "code": { "impacts": { diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8966.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8966.json index e5fb5506c..0ec5564e9 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8966.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8966.json @@ -14,7 +14,7 @@ "defaultSeverity": "Critical", "ruleSpecification": "RSPEC-8966", "sqKey": "S8966", - "scope": "All", + "scope": "Main", "quickfix": "unknown", "code": { "impacts": { diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8971.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8971.json index 0b5daae6b..9da62989a 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8971.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8971.json @@ -1,6 +1,6 @@ { "title": "\"SkipValidation\" should not be combined with validation constraints", - "type": "CODE_SMELL", + "type": "BUG", "status": "ready", "remediation": { "func": "Constant\/Issue", diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8974.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8974.html index 18df6784f..1dcd169cf 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8974.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8974.html @@ -3,19 +3,6 @@

            In Python/Pydantic, this specifically refers to using the json_schema_input_type parameter in a @field_validator decorator.

            Why is this an issue?

            -

            In validation frameworks, field validation mechanisms allow you to add custom validation logic to data fields. These mechanisms typically support -different validation modes that determine when your validation function runs relative to the framework’s built-in validation:

            -
              -
            • Before-mode: Runs before the framework’s standard validation
            • -
            • After-mode: Runs after the framework’s standard validation (often the default)
            • -
            • Plain-mode: Replaces the framework’s standard validation entirely
            • -
            • Wrap-mode: Wraps around the framework’s standard validation, giving you control over when it runs
            • -
            -

            Schema generation parameters for input types help validation frameworks generate accurate data schemas for validation. These parameters tell the -framework what input type to expect when generating the schema, which is particularly useful for validators that accept raw, unvalidated input.

            -

            However, such parameters only make sense for validators that run before or instead of the framework’s type validation. When using after-mode -validation, your validator receives data that has already been validated and converted to the correct type. At this point, the input type is already -known and fixed, so specifying an input type parameter for schema generation serves no purpose and is not supported.

            Using an input type schema parameter with an incompatible validation mode will cause the framework to raise a user error when your model is defined, preventing your application from starting.

            In Pydantic specifically, this refers to the @field_validator decorator with its json_schema_input_type parameter. Using diff --git a/sonarpedia.json b/sonarpedia.json index ff4da8df8..2322795bb 100644 --- a/sonarpedia.json +++ b/sonarpedia.json @@ -3,7 +3,7 @@ "languages": [ "PY" ], - "latest-update": "2026-06-30T07:19:01.975842Z", + "latest-update": "2026-07-10T06:57:15.476735Z", "options": { "no-language-in-filenames": true, "preserve-filenames": true From 7a2d6e15bc0ee5442ea4e3a8f48d07d259e77025 Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Fri, 10 Jul 2026 10:12:34 +0200 Subject: [PATCH 200/322] SONARPY-4366 Fix unused parameter (#1289) GitOrigin-RevId: 4a61d64be408b6fada0bdad87e73cdc909e50e75 --- .../python/checks/PydanticMultipleInheritanceConfigCheck.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/PydanticMultipleInheritanceConfigCheck.java b/python-checks/src/main/java/org/sonar/python/checks/PydanticMultipleInheritanceConfigCheck.java index 126195987..25deb2dc3 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/PydanticMultipleInheritanceConfigCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/PydanticMultipleInheritanceConfigCheck.java @@ -86,7 +86,7 @@ private static void checkClassDef(SubscriptionContext ctx) { } } - reportIfConflictingConfigs(ctx, classDef, visitedClassesDefiningModelConfig, superClassesWithNewModelConfig); + reportIfConflictingConfigs(ctx, classDef, superClassesWithNewModelConfig); } private static boolean classDefinesModelConfigLocally(ClassDef classDef) { @@ -110,7 +110,6 @@ private static List collectSuperClasses(ArgList argList) { private static void reportIfConflictingConfigs( SubscriptionContext ctx, ClassDef classDef, - Set visitedClassesDefiningModelConfig, List superClassesWithNewModelConfig) { if (superClassesWithNewModelConfig.size() >= 2) { PreciseIssue issue = ctx.addIssue(classDef.name(), MESSAGE); From 3a35bf2c3718b54b773de3bae996222ebdaca2af Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Fri, 10 Jul 2026 15:01:06 +0200 Subject: [PATCH 201/322] SONARPY-4323 Create rule S8953: Pydantic models should enable either alias or name validation (#1226) GitOrigin-RevId: 66ee57fc648748360b51afa054e1feceb39482e9 --- .../python/checks/OpenSourceCheckList.java | 1 + ...anticConfigDictValidationOptionsCheck.java | 65 ++++++++ .../org/sonar/l10n/py/rules/python/S8953.html | 55 ++++++ .../org/sonar/l10n/py/rules/python/S8953.json | 24 +++ .../py/rules/python/Sonar_way_profile.json | 1 + ...cConfigDictValidationOptionsCheckTest.java | 29 ++++ .../pydanticConfigDictValidationOptions.py | 157 ++++++++++++++++++ .../custom_protobuf/pydantic.config.protobuf | 14 ++ .../custom_protobuf/pydantic.fields.protobuf | 22 +++ .../custom_protobuf/pydantic.main.protobuf | 7 + .../types/custom_protobuf/pydantic.protobuf | 45 +++++ .../custom_protobuf/pydantic.types.protobuf | 17 ++ .../checksums/custom.checksum | 4 +- .../resources/custom/pydantic/__init__.pyi | 4 + .../resources/custom/pydantic/config.pyi | 4 + .../resources/custom/pydantic/fields.pyi | 8 + .../resources/custom/pydantic/main.pyi | 1 + .../resources/custom/pydantic/types.pyi | 3 + 18 files changed, 459 insertions(+), 2 deletions(-) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/PydanticConfigDictValidationOptionsCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8953.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8953.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/PydanticConfigDictValidationOptionsCheckTest.java create mode 100644 python-checks/src/test/resources/checks/pydanticConfigDictValidationOptions.py create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.config.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.fields.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.main.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.types.protobuf create mode 100644 python-frontend/typeshed_serializer/resources/custom/pydantic/__init__.pyi create mode 100644 python-frontend/typeshed_serializer/resources/custom/pydantic/config.pyi create mode 100644 python-frontend/typeshed_serializer/resources/custom/pydantic/fields.pyi create mode 100644 python-frontend/typeshed_serializer/resources/custom/pydantic/main.pyi create mode 100644 python-frontend/typeshed_serializer/resources/custom/pydantic/types.pyi diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 7f79e2747..f8c81c6eb 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -384,6 +384,7 @@ public Stream> getChecks() { PublicApiIsSecuritySensitiveCheck.class, PubliclyWritableDirectoriesCheck.class, PublicNetworkAccessToCloudResourcesCheck.class, + PydanticConfigDictValidationOptionsCheck.class, PydanticCoreSerializationFallbackCheck.class, PydanticDoubleUnderscorePrivateAttributeCheck.class, PydanticJsonSchemaInputTypeWithAfterModeCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/PydanticConfigDictValidationOptionsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/PydanticConfigDictValidationOptionsCheck.java new file mode 100644 index 000000000..9164baba2 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/PydanticConfigDictValidationOptionsCheck.java @@ -0,0 +1,65 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.checks.utils.Expressions; +import org.sonar.python.tree.TreeUtils; + +@Rule(key = "S8953") +public class PydanticConfigDictValidationOptionsCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Enable at least one of \"validate_by_alias\" or \"validate_by_name\"."; + private static final String SECONDARY_MESSAGE = "Also set to \"False\" here."; + + private static final String VALIDATE_BY_ALIAS = "validate_by_alias"; + private static final String VALIDATE_BY_NAME = "validate_by_name"; + + private static final TypeMatcher IS_PYDANTIC_CONFIG_DICT = TypeMatchers.isType("pydantic.ConfigDict"); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, PydanticConfigDictValidationOptionsCheck::checkCallExpression); + } + + private static void checkCallExpression(SubscriptionContext ctx) { + CallExpression callExpression = (CallExpression) ctx.syntaxNode(); + + if (!IS_PYDANTIC_CONFIG_DICT.isTrueFor(callExpression.callee(), ctx)) { + return; + } + + RegularArgument validateByAliasArg = TreeUtils.argumentByKeyword(VALIDATE_BY_ALIAS, callExpression.arguments()); + RegularArgument validateByNameArg = TreeUtils.argumentByKeyword(VALIDATE_BY_NAME, callExpression.arguments()); + + if (validateByAliasArg == null || validateByNameArg == null) { + return; + } + + if (Expressions.isFalsy(validateByAliasArg.expression()) && Expressions.isFalsy(validateByNameArg.expression())) { + ctx.addIssue(validateByNameArg, MESSAGE).secondary(validateByAliasArg, SECONDARY_MESSAGE); + } + } + +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8953.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8953.html new file mode 100644 index 000000000..6a0fca344 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8953.html @@ -0,0 +1,55 @@ +

            This rule raises an issue when both validate_by_alias and validate_by_name are explicitly set to False in a +Pydantic v2 ConfigDict.

            +

            Why is this an issue?

            +

            Data modeling frameworks use configuration options to determine how field values can be provided during object instantiation: one option controls +whether fields can be populated using alternative names (aliases), and another controls whether they can be populated using their declared attribute +names. These options control the valid input methods for providing data to the model’s fields.

            +

            When both options are disabled, the model has no way to accept input data. This creates an invalid configuration that will cause errors when +describing the model, as there is no valid method to pass values to any field.

            +

            According to the framework documentation:

            +
            +

            You cannot set both validation options to disable alias-based and name-based population. This would make it impossible to populate an + attribute.

            +
            +

            This misconfiguration typically occurs when developers are trying to restrict how data is provided to the model, but inadvertently disable all +input methods.

            +

            In Pydantic specifically, these configuration options are validate_by_alias and validate_by_name in the model’s +ConfigDict or Config class.

            +

            What is the potential impact?

            +

            When both validation options are disabled, a PydanticUserError is raised at class definition time. This prevents the application from +starting up correctly and requires the developer to fix the configuration before the model can be used.

            +

            How to fix it

            +

            Enable validate_by_name to allow field population using attribute names. This is the most straightforward solution and allows fields +to be populated using their Python attribute names.

            +

            Code examples

            +

            Noncompliant code example

            +
            +from pydantic import BaseModel, ConfigDict, Field
            +
            +class Model(BaseModel):
            +    model_config = ConfigDict(
            +        validate_by_alias=False,
            +        validate_by_name=False  # Noncompliant
            +    )
            +    my_field: str = Field(alias='my_alias')
            +
            +

            Compliant solution

            +
            +from pydantic import BaseModel, ConfigDict, Field
            +
            +class Model(BaseModel):
            +    model_config = ConfigDict(
            +        validate_by_alias=False,
            +        validate_by_name=True
            +    )
            +    my_field: str = Field(alias='my_alias')
            +
            +

            Resources

            +

            Documentation

            + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8953.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8953.json new file mode 100644 index 000000000..73ed615d9 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8953.json @@ -0,0 +1,24 @@ +{ + "title": "Pydantic models should enable either alias or name validation", + "type": "BUG", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "pydantic", + "pitfall" + ], + "defaultSeverity": "Critical", + "ruleSpecification": "RSPEC-8953", + "sqKey": "S8953", + "scope": "Main", + "quickfix": "unknown", + "code": { + "impacts": { + "RELIABILITY": "HIGH" + }, + "attribute": "LOGICAL" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index a0eae4abb..60aecca1f 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -367,6 +367,7 @@ "S8904", "S8905", "S8906", + "S8953", "S8963", "S8966", "S8971", diff --git a/python-checks/src/test/java/org/sonar/python/checks/PydanticConfigDictValidationOptionsCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/PydanticConfigDictValidationOptionsCheckTest.java new file mode 100644 index 000000000..e4fa2f9ca --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/PydanticConfigDictValidationOptionsCheckTest.java @@ -0,0 +1,29 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.junit.jupiter.api.Test; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class PydanticConfigDictValidationOptionsCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/pydanticConfigDictValidationOptions.py", new PydanticConfigDictValidationOptionsCheck()); + } + +} diff --git a/python-checks/src/test/resources/checks/pydanticConfigDictValidationOptions.py b/python-checks/src/test/resources/checks/pydanticConfigDictValidationOptions.py new file mode 100644 index 000000000..ed970e731 --- /dev/null +++ b/python-checks/src/test/resources/checks/pydanticConfigDictValidationOptions.py @@ -0,0 +1,157 @@ +from pydantic import BaseModel, ConfigDict, Field + + +# ===================== +# NON-COMPLIANT CASES +# ===================== + +class ModelBothFalse(BaseModel): + model_config = ConfigDict( + validate_by_alias=False, # < 1 {{Also set to "False" here.}} + # ^^^^^^^^^^^^^^^^^^^^^^^> + validate_by_name=False # Noncompliant {{Enable at least one of "validate_by_alias" or "validate_by_name".}} + # ^^^^^^^^^^^^^^^^^^^^^^ + ) + my_field: str = Field(alias='my_alias') + + +class ModelBothFalseOrderReversed(BaseModel): + model_config = ConfigDict( + validate_by_name=False, # Noncompliant {{Enable at least one of "validate_by_alias" or "validate_by_name".}} + validate_by_alias=False # < 1 {{Also set to "False" here.}} + ) + my_field: str = Field(alias='my_alias') + + +class ModelBothFalseOtherArgs(BaseModel): + model_config = ConfigDict( + frozen=True, + validate_by_alias=False, # < 1 {{Also set to "False" here.}} + validate_by_name=False # Noncompliant {{Enable at least one of "validate_by_alias" or "validate_by_name".}} + ) + my_field: str = Field(alias='my_alias') + + +# Variable holding False +flag_false = False + +class ModelBothVarFalse(BaseModel): + model_config = ConfigDict( + validate_by_alias=flag_false, # < 1 {{Also set to "False" here.}} + # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^> + validate_by_name=flag_false # Noncompliant {{Enable at least one of "validate_by_alias" or "validate_by_name".}} + # ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ) + my_field: str = Field(alias='my_alias') + + +class ModelAliasFalseLiteralNameVarFalse(BaseModel): + model_config = ConfigDict( + validate_by_alias=False, # < 1 {{Also set to "False" here.}} + # ^^^^^^^^^^^^^^^^^^^^^^^> + validate_by_name=flag_false # Noncompliant {{Enable at least one of "validate_by_alias" or "validate_by_name".}} + # ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ) + my_field: str = Field(alias='my_alias') + + +class ModelAliasVarFalseNameFalseLiteral(BaseModel): + model_config = ConfigDict( + validate_by_alias=flag_false, # < 1 {{Also set to "False" here.}} + # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^> + validate_by_name=False # Noncompliant {{Enable at least one of "validate_by_alias" or "validate_by_name".}} + # ^^^^^^^^^^^^^^^^^^^^^^ + ) + my_field: str = Field(alias='my_alias') + + +# ===================== +# COMPLIANT CASES +# ===================== + +class ModelAliasTrue(BaseModel): + model_config = ConfigDict( + validate_by_alias=True, + validate_by_name=False + ) + my_field: str = Field(alias='my_alias') + + +class ModelNameTrue(BaseModel): + model_config = ConfigDict( + validate_by_alias=False, + validate_by_name=True + ) + my_field: str = Field(alias='my_alias') + + +class ModelBothTrue(BaseModel): + model_config = ConfigDict( + validate_by_alias=True, + validate_by_name=True + ) + my_field: str = Field(alias='my_alias') + + +class ModelOnlyAlias(BaseModel): + model_config = ConfigDict( + validate_by_alias=False + ) + my_field: str = Field(alias='my_alias') + + +class ModelOnlyName(BaseModel): + model_config = ConfigDict( + validate_by_name=False + ) + my_field: str + + +class ModelEmpty(BaseModel): + model_config = ConfigDict() + my_field: str + + +class ModelNoValidation(BaseModel): + model_config = ConfigDict(frozen=True) + my_field: str + + +class ModelAliasFalseNameMissing(BaseModel): + model_config = ConfigDict(validate_by_alias=False) + my_field: str + + +flag_true = True + +class ModelAliasVarTrueNameFalse(BaseModel): + model_config = ConfigDict( + validate_by_alias=flag_true, + validate_by_name=False + ) + my_field: str = Field(alias='my_alias') + + +class ModelBothVarTrue(BaseModel): + model_config = ConfigDict( + validate_by_alias=flag_true, + validate_by_name=flag_true + ) + my_field: str = Field(alias='my_alias') + + +# ConfigDict is always from pydantic, so this is still flagged even in non-BaseModel classes +class NotPydanticSubclass: + model_config = ConfigDict( + validate_by_alias=False, # < 1 {{Also set to "False" here.}} + validate_by_name=False # Noncompliant {{Enable at least one of "validate_by_alias" or "validate_by_name".}} + ) + + +from some_other_lib import ConfigDict as OtherConfigDict + +class NotFlaggedNonPydanticConfigDict: + model_config = OtherConfigDict( + validate_by_alias=False, + validate_by_name=False + ) diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.config.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.config.protobuf new file mode 100644 index 000000000..ac8859f1f --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.config.protobuf @@ -0,0 +1,14 @@ + +pydantic.config + +ConfigDictpydantic.config.ConfigDict"builtins.object* +__init__#pydantic.config.ConfigDict.__init__" +None*B +self8 +pydantic.config.ConfigDict"pydantic.config.ConfigDict* +kwargs +Any* +__annotations__pydantic.config.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.fields.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.fields.protobuf new file mode 100644 index 000000000..12e37f16b --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.fields.protobuf @@ -0,0 +1,22 @@ + +pydantic.fields7 + FieldInfopydantic.fields.FieldInfo"builtins.object + PrivateAttrpydantic.fields.PrivateAttr"builtins.object* +__init__$pydantic.fields.PrivateAttr.__init__" +None*D +self: +pydantic.fields.PrivateAttr"pydantic.fields.PrivateAttr* +default +Any * +kwargs +Any +Fieldpydantic.fields.Field"6 +pydantic.fields.FieldInfo"pydantic.fields.FieldInfo* +default +Any * +kwargs +Any* +__annotations__pydantic.fields.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.main.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.main.protobuf new file mode 100644 index 000000000..50aecea20 --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.main.protobuf @@ -0,0 +1,7 @@ + + pydantic.main5 + BaseModelpydantic.main.BaseModel"builtins.object* +__annotations__pydantic.main.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.protobuf new file mode 100644 index 000000000..845382468 --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.protobuf @@ -0,0 +1,45 @@ + +pydantic + +ConfigDictpydantic.config.ConfigDict"builtins.object* +__init__#pydantic.config.ConfigDict.__init__" +None*B +self8 +pydantic.config.ConfigDict"pydantic.config.ConfigDict* +kwargs +Any7 + FieldInfopydantic.fields.FieldInfo"builtins.object + PrivateAttrpydantic.fields.PrivateAttr"builtins.object* +__init__$pydantic.fields.PrivateAttr.__init__" +None*D +self: +pydantic.fields.PrivateAttr"pydantic.fields.PrivateAttr* +default +Any * +kwargs +Any5 + BaseModelpydantic.main.BaseModel"builtins.object + SecretStrpydantic.types.SecretStr"builtins.object* +__init__!pydantic.types.SecretStr.__init__" +None*> +self4 +pydantic.types.SecretStr"pydantic.types.SecretStr*. + secret_value + builtins.str" builtins.str* +get_secret_value)pydantic.types.SecretStr.get_secret_value" + builtins.str" builtins.str*> +self4 +pydantic.types.SecretStr"pydantic.types.SecretStr +Fieldpydantic.fields.Field"6 +pydantic.fields.FieldInfo"pydantic.fields.FieldInfo* +default +Any * +kwargs +Any*i +__path__pydantic.__path__J +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list* +__annotations__pydantic.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.types.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.types.protobuf new file mode 100644 index 000000000..f3f971424 --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.types.protobuf @@ -0,0 +1,17 @@ + +pydantic.types + SecretStrpydantic.types.SecretStr"builtins.object* +__init__!pydantic.types.SecretStr.__init__" +None*> +self4 +pydantic.types.SecretStr"pydantic.types.SecretStr*. + secret_value + builtins.str" builtins.str* +get_secret_value)pydantic.types.SecretStr.get_secret_value" + builtins.str" builtins.str*> +self4 +pydantic.types.SecretStr"pydantic.types.SecretStr* +__annotations__pydantic.types.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/typeshed_serializer/checksums/custom.checksum b/python-frontend/typeshed_serializer/checksums/custom.checksum index 655f85a2c..3212768b3 100644 --- a/python-frontend/typeshed_serializer/checksums/custom.checksum +++ b/python-frontend/typeshed_serializer/checksums/custom.checksum @@ -1,2 +1,2 @@ -3855f931e2a653ed8b70e4f45ed8b8a2fb8e5dcafe67bd40082e399c9c991899 -bdcb9c5fb13d133bfbe25dfc7a77ced3f3e699ed8bc36cc929e64b8ea39595fa \ No newline at end of file +164d3a058e1ec22c87b6e47b861e27f6dc7a1859adae3bb976ff12460c8fb52d +067592afaf42d934dbf0c6b935b881a794d1a67e46d986238c079d9e73c4512f \ No newline at end of file diff --git a/python-frontend/typeshed_serializer/resources/custom/pydantic/__init__.pyi b/python-frontend/typeshed_serializer/resources/custom/pydantic/__init__.pyi new file mode 100644 index 000000000..f027bb03a --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/pydantic/__init__.pyi @@ -0,0 +1,4 @@ +from pydantic.config import ConfigDict +from pydantic.fields import Field, FieldInfo, PrivateAttr +from pydantic.main import BaseModel +from pydantic.types import SecretStr diff --git a/python-frontend/typeshed_serializer/resources/custom/pydantic/config.pyi b/python-frontend/typeshed_serializer/resources/custom/pydantic/config.pyi new file mode 100644 index 000000000..0928de363 --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/pydantic/config.pyi @@ -0,0 +1,4 @@ +from typing import Any + +class ConfigDict: + def __init__(self, **kwargs: Any) -> None: ... diff --git a/python-frontend/typeshed_serializer/resources/custom/pydantic/fields.pyi b/python-frontend/typeshed_serializer/resources/custom/pydantic/fields.pyi new file mode 100644 index 000000000..b8463adb4 --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/pydantic/fields.pyi @@ -0,0 +1,8 @@ +from typing import Any + +class FieldInfo: ... + +class PrivateAttr: + def __init__(self, default: Any = ..., **kwargs: Any) -> None: ... + +def Field(default: Any = ..., **kwargs: Any) -> FieldInfo: ... diff --git a/python-frontend/typeshed_serializer/resources/custom/pydantic/main.pyi b/python-frontend/typeshed_serializer/resources/custom/pydantic/main.pyi new file mode 100644 index 000000000..5f61c2efd --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/pydantic/main.pyi @@ -0,0 +1 @@ +class BaseModel: ... diff --git a/python-frontend/typeshed_serializer/resources/custom/pydantic/types.pyi b/python-frontend/typeshed_serializer/resources/custom/pydantic/types.pyi new file mode 100644 index 000000000..68a960d47 --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/pydantic/types.pyi @@ -0,0 +1,3 @@ +class SecretStr: + def __init__(self, secret_value: str) -> None: ... + def get_secret_value(self) -> str: ... From 1e8e229891cec07b75f68a14b74d17f104dbef6a Mon Sep 17 00:00:00 2001 From: "hashicorp-vault-sonar-prod[bot]" <111297361+hashicorp-vault-sonar-prod[bot]@users.noreply.github.com> Date: Fri, 10 Jul 2026 13:13:12 +0000 Subject: [PATCH 202/322] SONARPY-4368 Prepare for next development iteration (#1292) Co-authored-by: rombirli <56340680+rombirli@users.noreply.github.com> GitOrigin-RevId: 87e38b0914709ee0318d551a785e974ffc980d3f --- docs/pom.xml | 2 +- docs/python-custom-rules-example/pom.xml | 2 +- its/commons/pom.xml | 2 +- its/plugin/it-python-plugin-test/pom.xml | 2 +- its/plugin/pom.xml | 2 +- its/plugin/python-custom-rules-plugin/pom.xml | 2 +- its/pom.xml | 2 +- pom.xml | 2 +- python-checks-testkit/pom.xml | 2 +- python-checks/pom.xml | 2 +- python-commons/pom.xml | 2 +- python-frontend/pom.xml | 2 +- sonar-python-plugin/pom.xml | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/pom.xml b/docs/pom.xml index 4ae9d3042..1fda1badd 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.python python - 5.25-SNAPSHOT + 5.26-SNAPSHOT docs diff --git a/docs/python-custom-rules-example/pom.xml b/docs/python-custom-rules-example/pom.xml index 5d0efff3c..a27e828f2 100644 --- a/docs/python-custom-rules-example/pom.xml +++ b/docs/python-custom-rules-example/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python docs - 5.25-SNAPSHOT + 5.26-SNAPSHOT python-custom-rules-example diff --git a/its/commons/pom.xml b/its/commons/pom.xml index a77389664..ea99021a3 100644 --- a/its/commons/pom.xml +++ b/its/commons/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python python-its - 5.25-SNAPSHOT + 5.26-SNAPSHOT Python :: ITs :: Commons diff --git a/its/plugin/it-python-plugin-test/pom.xml b/its/plugin/it-python-plugin-test/pom.xml index a6024bd5c..4d50bf299 100644 --- a/its/plugin/it-python-plugin-test/pom.xml +++ b/its/plugin/it-python-plugin-test/pom.xml @@ -7,7 +7,7 @@ it-python-plugin org.sonarsource.python - 5.25-SNAPSHOT + 5.26-SNAPSHOT it-python-plugin-test diff --git a/its/plugin/pom.xml b/its/plugin/pom.xml index 0e3f467ba..e1cd93964 100644 --- a/its/plugin/pom.xml +++ b/its/plugin/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.python python-its - 5.25-SNAPSHOT + 5.26-SNAPSHOT diff --git a/its/plugin/python-custom-rules-plugin/pom.xml b/its/plugin/python-custom-rules-plugin/pom.xml index 5bb49fcf1..0e3f3cfe6 100644 --- a/its/plugin/python-custom-rules-plugin/pom.xml +++ b/its/plugin/python-custom-rules-plugin/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python it-python-plugin - 5.25-SNAPSHOT + 5.26-SNAPSHOT python-custom-rules-plugin diff --git a/its/pom.xml b/its/pom.xml index 541bb1ae1..3dead7015 100644 --- a/its/pom.xml +++ b/its/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.python python - 5.25-SNAPSHOT + 5.26-SNAPSHOT python-its diff --git a/pom.xml b/pom.xml index 35011a3ca..c17f2c278 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ org.sonarsource.python python - 5.25-SNAPSHOT + 5.26-SNAPSHOT pom Python diff --git a/python-checks-testkit/pom.xml b/python-checks-testkit/pom.xml index 5c59d2704..eff9196d8 100644 --- a/python-checks-testkit/pom.xml +++ b/python-checks-testkit/pom.xml @@ -6,7 +6,7 @@ python org.sonarsource.python - 5.25-SNAPSHOT + 5.26-SNAPSHOT python-checks-testkit diff --git a/python-checks/pom.xml b/python-checks/pom.xml index 717470f15..6165dba1b 100644 --- a/python-checks/pom.xml +++ b/python-checks/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.python python - 5.25-SNAPSHOT + 5.26-SNAPSHOT python-checks diff --git a/python-commons/pom.xml b/python-commons/pom.xml index 09faba74a..3486bfec1 100644 --- a/python-commons/pom.xml +++ b/python-commons/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python python - 5.25-SNAPSHOT + 5.26-SNAPSHOT python-commons diff --git a/python-frontend/pom.xml b/python-frontend/pom.xml index e2d7e18c1..30f1f47c4 100644 --- a/python-frontend/pom.xml +++ b/python-frontend/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python python - 5.25-SNAPSHOT + 5.26-SNAPSHOT python-frontend diff --git a/sonar-python-plugin/pom.xml b/sonar-python-plugin/pom.xml index 110299efc..09e625328 100644 --- a/sonar-python-plugin/pom.xml +++ b/sonar-python-plugin/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python python - 5.25-SNAPSHOT + 5.26-SNAPSHOT sonar-python-plugin From 4ff43a3ba33d5b073cc4f7abc61d460a7593c689 Mon Sep 17 00:00:00 2001 From: Nils Werner <64034005+nils-werner-sonarsource@users.noreply.github.com> Date: Fri, 10 Jul 2026 15:53:41 +0200 Subject: [PATCH 203/322] SONARPY-4182 S5659: don't raise on "peek then verify" JWT pattern GitOrigin-RevId: deef8df6207a505d346859b30930f64d20f94a03 --- .../python/checks/JwtVerificationCheck.java | 60 ++++++++++++++++++- .../test/resources/checks/jwtVerification.py | 47 +++++++++++++++ .../checks/pythonJoseVerification.py | 19 ++++++ 3 files changed, 125 insertions(+), 1 deletion(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/JwtVerificationCheck.java b/python-checks/src/main/java/org/sonar/python/checks/JwtVerificationCheck.java index ae5c6d7b6..b1c1524e0 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/JwtVerificationCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/JwtVerificationCheck.java @@ -96,7 +96,7 @@ private static void verifyCallExpression(SubscriptionContext ctx) { String calleeFqn = calleeSymbol.fullyQualifiedName(); if (WHERE_VERIFY_KWARG_SHOULD_BE_TRUE_FQNS.contains(calleeFqn)) { RegularArgument verifyArg = TreeUtils.argumentByKeyword("verify", call.arguments()); - if (verifyArg != null && Expressions.isFalsy(verifyArg.expression())) { + if (verifyArg != null && Expressions.isFalsy(verifyArg.expression()) && !isVerifiedElsewhere(call)) { ctx.addIssue(verifyArg, MESSAGE); return; } @@ -114,10 +114,68 @@ private static void verifyCallExpression(SubscriptionContext ctx) { Optional.ofNullable(TreeUtils.argumentByKeyword("options", call.arguments())) .map(RegularArgument::expression) .filter(JwtVerificationCheck::isListOrDictWithSensitiveEntry) + .filter(expression -> !isVerifiedElsewhere(call)) .ifPresent(expression -> ctx.addIssue(expression, MESSAGE)); } } + /** + * "Peek then verify" pattern (multi-tenant JWT key discovery): an unverified decode of a token is + * compliant if the same token is decoded again elsewhere in the same function/module with real + * signature verification. If the token argument can't be resolved to a symbol, we can't disprove + * such a call exists, so we assume compliance rather than raise a false positive. + */ + private static boolean isVerifiedElsewhere(CallExpression unverifiedCall) { + Symbol tokenSymbol = tokenArgumentSymbol(unverifiedCall); + if (tokenSymbol == null) { + return true; + } + Tree scope = TreeUtils.firstAncestorOfKind(unverifiedCall, Kind.FILE_INPUT, Kind.FUNCDEF); + return scope != null && TreeUtils.hasDescendant(scope, tree -> isVerifyingCallOnToken(tree, unverifiedCall, tokenSymbol)); + } + + private static boolean isVerifyingCallOnToken(Tree tree, CallExpression unverifiedCall, Symbol tokenSymbol) { + return TreeUtils.toOptionalInstanceOf(CallExpression.class, tree) + .filter(call -> call != unverifiedCall) + .filter(JwtVerificationCheck::isDecodeOrVerifyCall) + .filter(call -> tokenSymbol.equals(tokenArgumentSymbol(call))) + .filter(call -> !isUnverifiedShape(call)) + .filter(JwtVerificationCheck::hasKeyArgument) + .isPresent(); + } + + private static boolean hasKeyArgument(CallExpression call) { + RegularArgument keyArg = TreeUtils.nthArgumentOrKeyword(1, "key", call.arguments()); + return keyArg != null && !Expressions.isFalsy(keyArg.expression()); + } + + private static boolean isDecodeOrVerifyCall(CallExpression call) { + return Optional.ofNullable(call.calleeSymbol()) + .map(Symbol::fullyQualifiedName) + .filter(fqn -> WHERE_VERIFY_KWARG_SHOULD_BE_TRUE_FQNS.contains(fqn) || VERIFY_SIGNATURE_OPTION_SUPPORTING_FUNCTION_FQNS.contains(fqn)) + .isPresent(); + } + + private static boolean isUnverifiedShape(CallExpression call) { + RegularArgument verifyArg = TreeUtils.argumentByKeyword("verify", call.arguments()); + if (verifyArg != null && Expressions.isFalsy(verifyArg.expression())) { + return true; + } + return Optional.ofNullable(TreeUtils.argumentByKeyword("options", call.arguments())) + .map(RegularArgument::expression) + .filter(JwtVerificationCheck::isListOrDictWithSensitiveEntry) + .isPresent(); + } + + @Nullable + private static Symbol tokenArgumentSymbol(CallExpression call) { + return Optional.ofNullable(TreeUtils.nthArgumentOrKeyword(0, "jwt", call.arguments())) + .map(RegularArgument::expression) + .filter(expression -> expression.is(Kind.NAME)) + .map(expression -> ((Name) expression).symbol()) + .orElse(null); + } + private static boolean isListOrDictWithSensitiveEntry(@Nullable Expression expression) { if (expression == null) { return false; diff --git a/python-checks/src/test/resources/checks/jwtVerification.py b/python-checks/src/test/resources/checks/jwtVerification.py index d381db0df..864762900 100644 --- a/python-checks/src/test/resources/checks/jwtVerification.py +++ b/python-checks/src/test/resources/checks/jwtVerification.py @@ -40,6 +40,53 @@ def pyjwt_decode_token_secure_1(token): def pyjwt_decode_token_secure_2(token): return jwt.decode(token, algorithms="HS256") # Compliant +def peek_then_verify_options_dict(token, keys): + unverified = jwt.decode(token, options={"verify_signature": False, "require": ["iss"]}) # Compliant: same token is re-decoded below with real verification + issuer = unverified["iss"] + key = keys[issuer] + return jwt.decode(token, key, algorithms=["HS256"]) + +def peek_then_verify_options_list(token, keys): + unverified = jwt.decode(token, options=[("verify_signature", False), ("require", ["iss"])]) # Compliant: same token is re-decoded below with real verification + issuer = unverified["iss"] + key = keys[issuer] + return jwt.decode(token, key, algorithms=["HS256"]) + +def peek_then_verify_verify_kwarg(token, keys): + unverified = jwt.decode(token, verify=False) # Compliant: same token is re-decoded below with real verification + issuer = unverified["iss"] + key = keys[issuer] + return jwt.decode(token, key, algorithms=["HS256"]) + +# only token_b is re-verified below, not token_a +def peek_then_verify_different_variable(token_a, token_b, keys): + unverified = jwt.decode(token_a, options={"verify_signature": False}) # Noncompliant + key = keys[unverified["iss"]] + return jwt.decode(token_b, key, algorithms=["HS256"]) + +# the later call on the same token is also unverified +def peek_then_verify_second_call_also_unverified(token, keys): + unverified = jwt.decode(token, options={"verify_signature": False}) # Noncompliant + issuer = unverified["iss"] + key = keys[issuer] + return jwt.decode(token, key, algorithms=["HS256"], verify=False) # Noncompliant + +def peek_then_verify_unresolvable_token(keys): + return jwt.decode(get_token(), options={"verify_signature": False}) # Compliant: token argument isn't a resolvable variable, assume compliant + +# real verification below is in a different function, out of scope +def peek_then_verify_wrong_scope(token, keys): + def inner(): + return jwt.decode(token, options={"verify_signature": False}) # Noncompliant + def other(): + return jwt.decode(token, keys["k"], algorithms=["HS256"]) + return inner(), other() + +module_token = "..." +module_key = "secret" +module_unverified = jwt.decode(module_token, options={"verify_signature": False}) # Compliant: real verification happens at module scope below +module_verified = jwt.decode(module_token, module_key, algorithms=["HS256"]) + def pyjwt_decode_unverified_header(token): return jwt.get_unverified_header(token) # Noncompliant diff --git a/python-checks/src/test/resources/checks/pythonJoseVerification.py b/python-checks/src/test/resources/checks/pythonJoseVerification.py index 682daa634..fc4827115 100644 --- a/python-checks/src/test/resources/checks/pythonJoseVerification.py +++ b/python-checks/src/test/resources/checks/pythonJoseVerification.py @@ -217,6 +217,25 @@ async def compliant_verify(token: str | None = None): ... +@router.get('/compliant_peek_then_verify_jws') +async def compliant_peek_then_verify_jws(token: str | None = None, key=None): + unverified = jws.verify(token, None, None, verify=False) # Compliant: same token is re-verified below + return jws.verify(token, key, ["HS256"], verify=True) + + +@router.get('/compliant_peek_then_verify_decode_dict') +async def compliant_peek_then_verify_decode_dict(token: str | None = None, key=None): + unverified = jwt.decode(token, None, options={"verify_signature": False}) # Compliant: same token is re-decoded below with a real key + return jwt.decode(token, key, algorithms=["HS256"]) + + +# only other_token is re-verified below, not token +@router.get('/noncompliant_peek_then_verify_different_token') +async def noncompliant_peek_then_verify_different_token(token: str | None = None, other_token: str | None = None, key=None): + unverified = jwt.decode(token, None, options={"verify_signature": False}) # Noncompliant + return jwt.decode(other_token, key, algorithms=["HS256"]) + + x = [] class TestInfiniteRecursion(): x = x From c4a1868cf31def1ae560c8df2adea0c7f9dc3b72 Mon Sep 17 00:00:00 2001 From: Nils Werner <64034005+nils-werner-sonarsource@users.noreply.github.com> Date: Fri, 10 Jul 2026 16:55:29 +0200 Subject: [PATCH 204/322] SONARPY-3436 S5659: recognize comparison-only and validated-algorithm JWT header usage as safe GitOrigin-RevId: 3933d5a5ae2f61f334b56d25abc8841a81210c0f --- .../python/checks/JwtVerificationCheck.java | 254 +++++++++++++++--- .../test/resources/checks/jwtVerification.py | 105 ++++++++ 2 files changed, 320 insertions(+), 39 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/JwtVerificationCheck.java b/python-checks/src/main/java/org/sonar/python/checks/JwtVerificationCheck.java index b1c1524e0..1e8d8a894 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/JwtVerificationCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/JwtVerificationCheck.java @@ -20,6 +20,7 @@ import java.util.List; import java.util.Optional; import java.util.Set; +import java.util.function.Predicate; import java.util.stream.Stream; import javax.annotation.Nullable; import org.sonar.check.Rule; @@ -29,10 +30,12 @@ import org.sonar.plugins.python.api.symbols.Usage; import org.sonar.plugins.python.api.tree.Argument; import org.sonar.plugins.python.api.tree.AssignmentStatement; +import org.sonar.plugins.python.api.tree.BinaryExpression; import org.sonar.plugins.python.api.tree.CallExpression; import org.sonar.plugins.python.api.tree.DictionaryLiteral; import org.sonar.plugins.python.api.tree.Expression; import org.sonar.plugins.python.api.tree.ExpressionList; +import org.sonar.plugins.python.api.tree.InExpression; import org.sonar.plugins.python.api.tree.KeyValuePair; import org.sonar.plugins.python.api.tree.ListLiteral; import org.sonar.plugins.python.api.tree.Name; @@ -80,6 +83,10 @@ public class JwtVerificationCheck extends PythonSubscriptionCheck { public static final Set VERIFY_SIGNATURE_OPTION_SUPPORTING_FUNCTION_FQNS = Set.of("jose.jwt.decode", "jwt.decode"); + private static final Set EQUALITY_COMPARATORS = Set.of("==", "!="); + + private static final String ALGORITHMS_KEYWORD = "algorithms"; + @Override public void initialize(Context context) { context.registerSyntaxNodeConsumer(Kind.CALL_EXPR, JwtVerificationCheck::verifyCallExpression); @@ -240,56 +247,228 @@ private static boolean isCallToVerifyJwt(Tree t) { .isPresent(); } + /** + * Fail-open: a call is compliant unless a concrete unsafe usage of the header/claims value (or a value + * extracted from it) is found. A usage shape this check doesn't recognize is not, by itself, grounds to raise - + * only known-unsafe sinks (bare pass-through, return, disallowed key access) do, unless that same usage also + * matches one of the safe patterns (allowed key, comparison-only, or validated-then-used-as-algorithm). + */ private static boolean accessOnlyAllowedHeaderKeys(CallExpression call) { + // the call's own result can itself be a comparison operand, e.g. `jwt.get_unverified_header(token) == expected` + // - here `call` is the operand, not `call.parent()` (which is already the COMPARISON node), unlike the + // `.get(...)`/`[...]` chained-access shapes below where the extra level of nesting means the parent is + // the right thing to inspect. + if (isComparisonOperand(call)) { + return true; + } + // direct chained access on the call's own result, e.g. `jwt.get_unverified_header(token).get("x5u")`, + // is always checked - independent of whether the whole chained expression is itself assigned to some + // unrelated name (`x5u = jwt.get_unverified_header(token).get("x5u")`). + if (isSafeUsageSite(call.parent())) { + return true; + } Tree assignment = TreeUtils.firstAncestorOfKind(call, Tree.Kind.ASSIGNMENT_STMT); - Stream headerKeysAccessedDirectly = accessToHeaderKeyWithoutAssignment(call); if (assignment == null) { - return areStringLiteralsPartOfAllowedKeys(headerKeysAccessedDirectly); - } else { - List lhsExpressions = ((AssignmentStatement) assignment).lhsExpressions().stream() - .map(ExpressionList::expressions) - .flatMap(Collection::stream).toList(); - if (lhsExpressions.size() == 1 && lhsExpressions.get(0).is(Tree.Kind.NAME)) { - Name name = (Name) lhsExpressions.get(0); - Symbol symbol = name.symbol(); - if (symbol != null) { - Stream argumentsOfGet = usagesAccessedByGet(symbol, call); - Stream argumentsOfSubscription = usagesAccessedBySubscription(symbol, call); - Stream headerKeysAccessFromAssignedValues = Stream.concat(argumentsOfGet, argumentsOfSubscription); - return areStringLiteralsPartOfAllowedKeys(Stream.concat(headerKeysAccessFromAssignedValues, headerKeysAccessedDirectly)); - } + return false; + } + List lhsExpressions = ((AssignmentStatement) assignment).lhsExpressions().stream() + .map(ExpressionList::expressions) + .flatMap(Collection::stream).toList(); + if (lhsExpressions.size() == 1 && lhsExpressions.get(0).is(Tree.Kind.NAME)) { + Name name = (Name) lhsExpressions.get(0); + Symbol symbol = name.symbol(); + if (symbol != null) { + Tree scope = TreeUtils.firstAncestorOfKind(call, Kind.FILE_INPUT, Kind.FUNCDEF); + List usages = getForwardUsages(symbol, call).toList(); + return !usages.isEmpty() && usages.stream().allMatch(usage -> isSafeUsage(usage, scope)); } } return false; } - private static boolean areStringLiteralsPartOfAllowedKeys(Stream literals) { - var literalList = literals.toList(); - return !literalList.isEmpty() && literalList.stream().allMatch(str -> ALLOWED_KEYS_ACCESS.contains(str.trimmedQuotesValue())); + /** + * Classifies one forward usage of the header/claims Name (e.g. the `header` in `header = jwt.get_unverified_header(token)`). + * Two things can make a usage safe, checked at two different tree depths: + * - the bare Name itself is compared (`header == expected`) - checked directly on {@code usage.tree()}; + * - a value extracted from it via `.get(key)`/`[key]` is either an allowed key, compared, or validated-then-used + * as an algorithm - checked on {@code usageParent}, which is the `.get(...)` call or `[...]` subscription + * sitting immediately on top of this usage. + * Anything else (bare pass-through, `return header`, disallowed key) falls through to `false` - this is the + * pre-existing sink detection carried over unchanged from before this ticket, not a new way to raise issues. + */ + private static boolean isSafeUsage(Usage usage, @Nullable Tree scope) { + Tree usageParent = usage.tree().parent(); + if (isComparisonOperand(usage.tree())) { + return true; + } + Optional getCall = getCallExprWhereDictIsAccessedWithGet(Stream.of(usageParent)).findFirst(); + if (getCall.isPresent()) { + Stream keys = getStringLiteralArguments(getArgumentsFromCallExpr(Stream.of(getCall.get()))); + return isSafeExtractedValueSite(getCall.get(), keys, scope); + } + Optional subscription = getSubscriptions(Stream.of(usageParent)).findFirst(); + if (subscription.isPresent()) { + Stream keys = getSubscriptsStringLiteral(Stream.of(subscription.get())); + return isSafeExtractedValueSite(subscription.get(), keys, scope); + } + return false; + } + + /** + * Whether a value extracted from the header (e.g. the `.get("alg")` call itself, or a `["alg"]` subscription) + * is safe to use unrestricted: it's directly compared, its key is in the {@link #ALLOWED_KEYS_ACCESS} allowlist, + * or (algorithm pattern only) it's validated against an allowlist before being used as `algorithms=`. + */ + private static boolean isSafeExtractedValueSite(Tree extractionSite, Stream keyLiterals, @Nullable Tree scope) { + if (isComparisonOperand(extractionSite)) { + return true; + } + List keys = keyLiterals.toList(); + if (!keys.isEmpty() && keys.stream().allMatch(str -> ALLOWED_KEYS_ACCESS.contains(str.trimmedQuotesValue()))) { + return true; + } + return scope != null && isValidatedBeforeAlgorithmsUse(extractionSite, scope); } - private static Stream accessToHeaderKeyWithoutAssignment(CallExpression call) { - Stream callExpressionFromGetUnverifiedHeaders = getCallExprWhereDictIsAccessedWithGet(Stream.of(call.parent())); - Stream argumentsOfCallExpr = getArgumentsFromCallExpr(callExpressionFromGetUnverifiedHeaders); - Stream stringLiteralArgumentsFromGet = getStringLiteralArguments(argumentsOfCallExpr); - Stream subscriptionFromGetUnverifiedHeaders = getSubscriptions(Stream.of(call.parent())); - Stream stringLiteralArgumentFromSubscription = getSubscriptsStringLiteral(subscriptionFromGetUnverifiedHeaders); - return Stream.concat(stringLiteralArgumentsFromGet, stringLiteralArgumentFromSubscription); + /** Whether {@code tree}'s parent is a `==`/`!=` comparison with {@code tree} as one of its two operands. */ + private static boolean isComparisonOperand(Tree extractionSiteOrName) { + Tree parent = extractionSiteOrName.parent(); + if (!parent.is(Kind.COMPARISON)) { + return false; + } + return EQUALITY_COMPARATORS.contains(((BinaryExpression) parent).operator().value()); } - private static Stream usagesAccessedByGet(Symbol symbol, CallExpression call) { - var usages = getForwardUsages(symbol, call); - var parentOfUsages = usages.map(Usage::tree).map(Tree::parent); - var callExpressionsFromUsages = getCallExprWhereDictIsAccessedWithGet(parentOfUsages); - return getStringLiteralArguments(getArgumentsFromCallExpr(callExpressionsFromUsages)); + /** + * Whether {@code extractionSite} (e.g. {@code header.get("alg")}) flows, via the Name it's assigned to, into an + * {@code in}/{@code not in} check against a literal list/tuple allowlist that appears strictly before the + * value is passed as the {@code algorithms=} argument to a decode/verify call, anywhere in {@code scope}. + * Line position is used as a lightweight ordering proxy rather than full control-flow dominance, matching + * this file's existing line-number heuristics (e.g. {@link #getForwardUsages}) - the guard must be found + * on an earlier line than the algorithms= use, otherwise the algorithm-confusion attack this rule targets + * (using an unvalidated alg to decode, then validating too late or in unreachable code) would go undetected. + */ + private static boolean isValidatedBeforeAlgorithmsUse(Tree extractionSite, Tree scope) { + Optional symbol = extractedValueSymbol(extractionSite); + if (symbol.isEmpty()) { + return false; + } + Optional guardLine = firstDescendantLine(scope, tree -> isAllowlistGuardOnSymbol(tree, symbol.get())); + Optional algorithmsUseLine = firstDescendantLine(scope, tree -> isAlgorithmsArgumentUsingSymbol(tree, symbol.get())); + return guardLine.isPresent() && algorithmsUseLine.isPresent() && guardLine.get() < algorithmsUseLine.get(); } - private static Stream getArgumentsFromCallExpr(Stream callExprs) { - return callExprs.map(CallExpression::arguments).flatMap(Collection::stream); + private static Optional firstDescendantLine(Tree tree, Predicate predicate) { + for (Tree child : tree.children()) { + if (predicate.test(child)) { + return Optional.of(child.firstToken().line()); + } + Optional nested = firstDescendantLine(child, predicate); + if (nested.isPresent()) { + return nested; + } + } + return Optional.empty(); + } + + /** + * The symbol a `.get(key)`/`[key]` extraction result is bound to, e.g. `alg` in `alg = header.get("alg")`. + * Only handles the direct single-Name-LHS shape; if the extraction is used inline (e.g. + * `algorithms=[header.get("alg")]`) or the target isn't a plain Name, there's no symbol to track the + * value's later validation/use through, so this - and therefore the algorithm-validation pattern - doesn't + * apply. That's intentional: without a trackable symbol we can't confirm the value was validated, so the + * usage falls through to the pre-existing sink detection in {@link #isSafeUsage} instead of being exempted. + */ + private static Optional extractedValueSymbol(Tree extractionSite) { + Tree assignment = TreeUtils.firstAncestorOfKind(extractionSite, Kind.ASSIGNMENT_STMT); + return Optional.ofNullable(assignment) + .map(AssignmentStatement.class::cast) + .map(AssignmentStatement::lhsExpressions) + .filter(list -> list.size() == 1) + .map(list -> list.get(0).expressions()) + .filter(list -> list.size() == 1 && list.get(0).is(Kind.NAME)) + .map(list -> ((Name) list.get(0)).symbol()); + } + + /** Whether {@code tree} is `symbol in [...]`/`symbol not in [...]` against a literal list/tuple (or a Name bound to one). */ + private static boolean isAllowlistGuardOnSymbol(Tree tree, Symbol symbol) { + return TreeUtils.toOptionalInstanceOf(InExpression.class, tree) + .filter(inExpr -> isNameOfSymbol(inExpr.leftOperand(), symbol)) + .map(InExpression::rightOperand) + .flatMap(Expressions::ifNameGetSingleAssignedNonNameValue) + .map(Expressions::expressionsFromListOrTuple) + .filter(elements -> !elements.isEmpty()) + .isPresent(); + } + + /** Whether {@code tree} is a `jwt.decode`/`jose.jwt.decode` call whose `algorithms=` argument uses {@code symbol}. */ + private static boolean isAlgorithmsArgumentUsingSymbol(Tree tree, Symbol symbol) { + return TreeUtils.toOptionalInstanceOf(CallExpression.class, tree) + .map(CallExpression::calleeSymbol) + .map(Symbol::fullyQualifiedName) + .filter(VERIFY_SIGNATURE_OPTION_SUPPORTING_FUNCTION_FQNS::contains) + .map(fqn -> ((CallExpression) tree).arguments()) + .map(arguments -> TreeUtils.argumentByKeyword(ALGORITHMS_KEYWORD, arguments)) + .map(RegularArgument::expression) + .filter(algorithms -> algorithmsExpressionUsesSymbol(algorithms, symbol)) + .isPresent(); + } + + private static boolean algorithmsExpressionUsesSymbol(Expression algorithms, Symbol symbol) { + if (isNameOfSymbol(algorithms, symbol)) { + return true; + } + return Expressions.expressionsFromListOrTuple(algorithms).stream().anyMatch(element -> isNameOfSymbol(element, symbol)); + } + + private static boolean isNameOfSymbol(Expression expression, Symbol symbol) { + return expression.is(Kind.NAME) && symbol.equals(((Name) expression).symbol()); } + /** + * Same safety check as {@link #isSafeExtractedValueSite}, but for the "no assignment" path where the header + * result is chain-accessed directly (`jwt.get_unverified_header(token).get("x5u")`) instead of first bound + * to a Name. There's no extracted-value symbol to track here, so only comparison and allowed-key access + * apply - the algorithm-validation pattern needs a Name to check the `in`/`not in` guard against, see + * {@link #extractedValueSymbol}. {@code usageSite} is the node directly above the call - i.e. the + * `QualifiedExpression` for `.get(...)` chains or the `SubscriptionExpression` for `[...]` - so the + * comparison check must run on the resolved `.get(...)` call / subscription itself, not on {@code usageSite}: + * for a `.get(...)` chain, {@code usageSite} is the intermediate `.get` qualified expression, which is never + * itself a comparison operand (its parent is always the enclosing call). + */ + private static boolean isSafeUsageSite(Tree usageSite) { + Optional getCall = getCallExprWhereDictIsAccessedWithGet(Stream.of(usageSite)).findFirst(); + if (getCall.isPresent()) { + if (isComparisonOperand(getCall.get())) { + return true; + } + return isAllowedKeyAccess(getStringLiteralArguments(getArgumentsFromCallExpr(Stream.of(getCall.get())))); + } + Optional subscription = getSubscriptions(Stream.of(usageSite)).findFirst(); + if (subscription.isPresent()) { + if (isComparisonOperand(subscription.get())) { + return true; + } + return isAllowedKeyAccess(getSubscriptsStringLiteral(Stream.of(subscription.get()))); + } + return false; + } + + private static boolean isAllowedKeyAccess(Stream keyLiterals) { + List keys = keyLiterals.toList(); + return !keys.isEmpty() && keys.stream().allMatch(str -> ALLOWED_KEYS_ACCESS.contains(str.trimmedQuotesValue())); + } + + /** + * All reads of {@code symbol} after {@code call}, using line number as a cheap proxy for "later" (this file + * doesn't do real control-flow analysis). Binding usages are excluded: if the same variable name is rebound + * later in the function (`header = jwt.get_unverified_header(token)` again), that's a fresh, independently + * checked call, not a use of *this* call's result - counting it here would attribute a later call's usages + * to this one and could wrongly flag (or wrongly clear) either call based on the other's usages. + */ private static Stream getForwardUsages(Symbol symbol, CallExpression call) { return symbol.usages().stream() + .filter(usage -> !usage.isBindingUsage()) .filter(usage -> usage.tree().firstToken().line() > call.callee().firstToken().line()); } @@ -303,6 +482,10 @@ private static Stream getCallExprWhereDictIsAccessedWithGet(Stre .flatMap(TreeUtils.toStreamInstanceOfMapper(CallExpression.class)); } + private static Stream getArgumentsFromCallExpr(Stream callExprs) { + return callExprs.map(CallExpression::arguments).flatMap(Collection::stream); + } + private static Stream getStringLiteralArguments(Stream arguments) { return arguments.filter(arg -> arg.is(Tree.Kind.REGULAR_ARGUMENT)) .flatMap(TreeUtils.toStreamInstanceOfMapper(RegularArgument.class)) @@ -310,13 +493,6 @@ private static Stream getStringLiteralArguments(Stream .flatMap(TreeUtils.toStreamInstanceOfMapper(StringLiteral.class)); } - private static Stream usagesAccessedBySubscription(Symbol symbol, CallExpression call) { - var usages = getForwardUsages(symbol, call); - var parentFromUsages = usages.map(Usage::tree).map(Tree::parent); - var subscriptionsFromUsages = getSubscriptions(parentFromUsages); - return getSubscriptsStringLiteral(subscriptionsFromUsages); - } - private static Stream getSubscriptions(Stream subscriptions) { return subscriptions .filter(subscription -> subscription.is(Tree.Kind.SUBSCRIPTION)) diff --git a/python-checks/src/test/resources/checks/jwtVerification.py b/python-checks/src/test/resources/checks/jwtVerification.py index 864762900..f5c381334 100644 --- a/python-checks/src/test/resources/checks/jwtVerification.py +++ b/python-checks/src/test/resources/checks/jwtVerification.py @@ -139,3 +139,108 @@ def get_unverified_header_compliant(token: str, keys): key = keys[jku] claims = jwt.decode(token, key, algorithms=["HS256"]) return claims + +def header_comparison_whole_header(token: str): + expected_header = {"alg": "RS256", "typ": "JWT"} + received_header = jwt.get_unverified_header(token) # Compliant: only compared, never used for a decision + if expected_header != received_header: + raise ValueError("Invalid header") + return True + +def header_comparison_inline_no_assignment(token: str, expected): + if jwt.get_unverified_header(token) == expected: # Compliant: compared inline, never assigned + return True + return False + +def header_comparison_extracted_value_inline_no_assignment(token: str): + if jwt.get_unverified_header(token).get("alg") != "RS256": # Compliant: extracted value compared inline + raise ValueError("Wrong algorithm") + return True + +def header_comparison_subscription_inline_no_assignment(token: str): + if jwt.get_unverified_header(token)["alg"] != "RS256": # Compliant: extracted value compared inline + raise ValueError("Wrong algorithm") + return True + +def header_comparison_extracted_value(token: str): + received_header = jwt.get_unverified_header(token) # Compliant: extracted value only compared + if received_header.get("alg") != "RS256": + raise ValueError("Wrong algorithm") + return True + +def header_comparison_subscription(token: str): + received_header = jwt.get_unverified_header(token) # Compliant: extracted value only compared + if received_header["alg"] != "RS256": + raise ValueError("Wrong algorithm") + return True + +def header_comparison_multiple_safe_usages(token: str): + expected_header = {"alg": "RS256", "typ": "JWT"} + received_header = jwt.get_unverified_header(token) # Compliant: every usage is a safe comparison + if expected_header != received_header: + raise ValueError("Invalid header") + if received_header == expected_header: + return True + if received_header.get("alg") != "RS256": + raise ValueError("Wrong algorithm") + return True + + +# header is also returned raw below - comparing it once doesn't make the other, unsafe usage safe +def header_comparison_mixed_with_unsafe_use(token: str) -> Dict[str, str]: + header = jwt.get_unverified_header(token) # Noncompliant + if header.get("alg") != "RS256": + raise ValueError("Wrong algorithm") + return header + +def algorithm_validated_then_used(token: str, key): + header = jwt.get_unverified_header(token) # Compliant: alg is validated against an allowlist before use + alg = header.get("alg") + if alg not in ["RS256", "ES256"]: + raise ValueError("Unsupported algorithm") + return jwt.decode(token, key, algorithms=[alg]) + +def algorithm_validated_then_used_subscription(token: str, key): + header = jwt.get_unverified_header(token) # Compliant: alg is validated against an allowlist before use + alg = header["alg"] + if alg not in ("RS256", "ES256"): + raise ValueError("Unsupported algorithm") + return jwt.decode(token, key, algorithms=[alg]) + +# alg is used to decode BEFORE it's validated - the guard doesn't protect this decode call +def algorithm_used_before_validated(token: str, key): + header = jwt.get_unverified_header(token) # Noncompliant + alg = header.get("alg") + payload = jwt.decode(token, key, algorithms=[alg]) + if alg not in ["RS256", "ES256"]: + raise ValueError("Unsupported algorithm") + return payload + + +# alg is used directly in algorithms=[...] without ever being validated against an allowlist +def algorithm_used_without_validation(token: str, key): + header = jwt.get_unverified_header(token) # Noncompliant + alg = header.get("alg") + return jwt.decode(token, key, algorithms=[alg]) + +def validate_alg_elsewhere(alg): + if alg not in ["RS256"]: + raise ValueError("Unsupported algorithm") + +# the allowlist guard lives in a sibling function, out of scope for this one +def algorithm_validated_wrong_scope(token: str, key): + header = jwt.get_unverified_header(token) # Noncompliant + alg = header.get("alg") + return jwt.decode(token, key, algorithms=[alg]) + +def algorithm_validated_then_used_bare_name(token: str, key): + header = jwt.get_unverified_header(token) # Compliant: alg is validated before being passed as a bare algorithms= value + alg = header.get("alg") + if alg not in ["RS256", "ES256"]: + raise ValueError("Unsupported algorithm") + return jwt.decode(token, key, algorithms=alg) + +# alg is never bound to a simple name (used inline), so it can't be tracked for validation +def algorithm_extracted_inline_no_validation(token: str, key): + header = jwt.get_unverified_header(token) # Noncompliant + return jwt.decode(token, key, algorithms=[header.get("alg")]) From 1b39f71dd4d14adfba0b0240a5362fd47438a2b0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 13 Jul 2026 10:56:25 +0200 Subject: [PATCH 205/322] Update dependency pipx:tox to v4.56.1 Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> GitOrigin-RevId: 57dbff1eaab3ac27eefe98c00df62538275bff34 --- mise.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mise.toml b/mise.toml index 9c323f9d6..9f8d94066 100644 --- a/mise.toml +++ b/mise.toml @@ -3,4 +3,4 @@ java = "21.0" maven = "3.9" python = "3.9" uv = "latest" # required for pipx backend -"pipx:tox" = { version = "4.49.1", uvx = "true" } +"pipx:tox" = { version = "4.56.1", uvx = "true" } From 3bda4056ef414cfc10088676f188894c4a3178ce Mon Sep 17 00:00:00 2001 From: Nils Werner <64034005+nils-werner-sonarsource@users.noreply.github.com> Date: Mon, 13 Jul 2026 12:13:48 +0200 Subject: [PATCH 206/322] SONARPY-3473 S5659: recognize "issuer routing" whitelist pattern as safe Co-authored-by: Gitar GitOrigin-RevId: b029fd02d26c404eaec4224142221386c73e46a7 --- .../python/checks/JwtVerificationCheck.java | 180 +++++++++++++++-- .../python/checks/utils/Expressions.java | 8 + .../python/checks/utils/ExpressionsTest.java | 9 + .../test/resources/checks/jwtVerification.py | 188 ++++++++++++++++++ 4 files changed, 372 insertions(+), 13 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/JwtVerificationCheck.java b/python-checks/src/main/java/org/sonar/python/checks/JwtVerificationCheck.java index 1e8d8a894..ac851f9ac 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/JwtVerificationCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/JwtVerificationCheck.java @@ -28,7 +28,6 @@ import org.sonar.plugins.python.api.SubscriptionContext; import org.sonar.plugins.python.api.symbols.Symbol; import org.sonar.plugins.python.api.symbols.Usage; -import org.sonar.plugins.python.api.tree.Argument; import org.sonar.plugins.python.api.tree.AssignmentStatement; import org.sonar.plugins.python.api.tree.BinaryExpression; import org.sonar.plugins.python.api.tree.CallExpression; @@ -41,11 +40,14 @@ import org.sonar.plugins.python.api.tree.Name; import org.sonar.plugins.python.api.tree.QualifiedExpression; import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.StringElement; import org.sonar.plugins.python.api.tree.StringLiteral; import org.sonar.plugins.python.api.tree.SubscriptionExpression; import org.sonar.plugins.python.api.tree.Tree; import org.sonar.plugins.python.api.tree.Tree.Kind; import org.sonar.plugins.python.api.tree.Tuple; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; import org.sonar.python.checks.utils.Expressions; import org.sonar.python.tree.TreeUtils; @@ -87,6 +89,10 @@ public class JwtVerificationCheck extends PythonSubscriptionCheck { private static final String ALGORITHMS_KEYWORD = "algorithms"; + private static final Set ISSUER_CLAIM_KEY = Set.of("iss"); + + private static final TypeMatcher IS_ENUM_MATCHER = TypeMatchers.isOrExtendsType("enum.Enum"); + @Override public void initialize(Context context) { context.registerSyntaxNodeConsumer(Kind.CALL_EXPR, JwtVerificationCheck::verifyCallExpression); @@ -103,7 +109,7 @@ private static void verifyCallExpression(SubscriptionContext ctx) { String calleeFqn = calleeSymbol.fullyQualifiedName(); if (WHERE_VERIFY_KWARG_SHOULD_BE_TRUE_FQNS.contains(calleeFqn)) { RegularArgument verifyArg = TreeUtils.argumentByKeyword("verify", call.arguments()); - if (verifyArg != null && Expressions.isFalsy(verifyArg.expression()) && !isVerifiedElsewhere(call)) { + if (verifyArg != null && Expressions.isFalsy(verifyArg.expression()) && !isVerifiedElsewhere(call) && !isIssuerRoutingPattern(call, ctx)) { ctx.addIssue(verifyArg, MESSAGE); return; } @@ -121,7 +127,7 @@ private static void verifyCallExpression(SubscriptionContext ctx) { Optional.ofNullable(TreeUtils.argumentByKeyword("options", call.arguments())) .map(RegularArgument::expression) .filter(JwtVerificationCheck::isListOrDictWithSensitiveEntry) - .filter(expression -> !isVerifiedElsewhere(call)) + .filter(expression -> !isVerifiedElsewhere(call) && !isIssuerRoutingPattern(call, ctx)) .ifPresent(expression -> ctx.addIssue(expression, MESSAGE)); } } @@ -183,6 +189,152 @@ private static Symbol tokenArgumentSymbol(CallExpression call) { .orElse(null); } + /** + * "Issuer routing" pattern: an unverified decode is compliant if its payload's ONLY use is reading the + * {@code iss} claim, and that issuer is then checked against a static whitelist (enum conversion, set/list/tuple + * membership, or an all-literal-keys dict lookup) - the real signature verification typically happens in the + * caller, using a key resolved from the whitelisted issuer, so unlike {@link #isVerifiedElsewhere} this doesn't + * require the same token to be re-decoded in this function. No ordering is enforced between the payload access + * and the whitelist check (unlike {@link #isValidatedBeforeAlgorithmsUse}) - there's no sink this rule can see + * the issuer flow into (the resolved key is typically returned or passed to a caller-supplied parameter), so + * there's nothing to protect by requiring the whitelist check to come first. + */ + private static boolean isIssuerRoutingPattern(CallExpression unverifiedCall, SubscriptionContext ctx) { + Tree assignment = TreeUtils.firstAncestorOfKind(unverifiedCall, Tree.Kind.ASSIGNMENT_STMT); + if (assignment == null) { + return false; + } + List lhsExpressions = ((AssignmentStatement) assignment).lhsExpressions().stream() + .map(ExpressionList::expressions) + .flatMap(Collection::stream).toList(); + if (lhsExpressions.size() != 1 || !lhsExpressions.get(0).is(Tree.Kind.NAME)) { + return false; + } + Symbol payloadSymbol = ((Name) lhsExpressions.get(0)).symbol(); + if (payloadSymbol == null) { + return false; + } + List usages = getForwardUsages(payloadSymbol, unverifiedCall).toList(); + if (usages.isEmpty()) { + return false; + } + Tree scope = TreeUtils.firstAncestorOfKind(unverifiedCall, Kind.FILE_INPUT, Kind.FUNCDEF); + return scope != null && usages.stream().allMatch(usage -> isIssuerClaimAccessWhitelistedElsewhere(usage, scope, ctx)); + } + + /** + * Whether one usage of the payload Name is a `.get("iss")`/`["iss"]` access whose extracted value (the issuer) + * is validated against a static whitelist somewhere in {@code scope} - either via the Name it's assigned to + * ({@link #isIssuerWhitelisted}), or, when never assigned at all, by being a direct operand of an inline + * `in`/`not in` membership check against a literal collection ({@link #isInlineLiteralMembershipOperand}). + * The inline case mirrors the same "no trackable symbol" limitation {@link #extractedValueSymbol} already + * has for the algorithm-validation pattern elsewhere in this file - see review discussion on PR #1294. + */ + private static boolean isIssuerClaimAccessWhitelistedElsewhere(Usage usage, Tree scope, SubscriptionContext ctx) { + Tree usageParent = usage.tree().parent(); + Optional getCall = getCallExprWhereDictIsAccessedWithGet(Stream.of(usageParent)).findFirst(); + if (getCall.isPresent()) { + Stream keys = getStringLiteralKeyArgument(getCall.get()); + return isIssuerClaimKey(keys) && (isIssuerWhitelisted(getCall.get(), scope, ctx) || isInlineLiteralMembershipOperand(getCall.get())); + } + Optional subscription = getSubscriptions(Stream.of(usageParent)).findFirst(); + if (subscription.isPresent()) { + Stream keys = getSubscriptsStringLiteral(Stream.of(subscription.get())); + return isIssuerClaimKey(keys) && (isIssuerWhitelisted(subscription.get(), scope, ctx) || isInlineLiteralMembershipOperand(subscription.get())); + } + return false; + } + + /** + * Whether {@code extractionSite} (e.g. {@code payload.get("iss")}) is itself a direct operand of an + * `in`/`not in` check against a literal string collection, e.g. {@code payload.get("iss") not in {"a", "b"}}. + * Unlike {@link #isLiteralMembershipGuardOnSymbol}, this needs no assignment/symbol - the extraction site is + * checked directly, covering the case where the claim is compared without ever being bound to a variable. + */ + private static boolean isInlineLiteralMembershipOperand(Tree extractionSite) { + return TreeUtils.toOptionalInstanceOf(InExpression.class, extractionSite.parent()) + .filter(inExpr -> inExpr.leftOperand() == extractionSite) + .map(InExpression::rightOperand) + .flatMap(Expressions::ifNameGetSingleAssignedNonNameValue) + .map(Expressions::expressionsFromListOrTuple) + .filter(elements -> !elements.isEmpty() && elements.stream().allMatch(JwtVerificationCheck::isNonInterpolatedStringLiteral)) + .isPresent(); + } + + private static boolean isNonInterpolatedStringLiteral(Expression element) { + return TreeUtils.toOptionalInstanceOf(StringLiteral.class, element) + .filter(literal -> literal.stringElements().stream().noneMatch(StringElement::isInterpolated)) + .isPresent(); + } + + private static boolean isIssuerClaimKey(Stream keyLiterals) { + List keys = keyLiterals.toList(); + return !keys.isEmpty() && keys.stream().allMatch(str -> ISSUER_CLAIM_KEY.contains(str.trimmedQuotesValue())); + } + + private static boolean isIssuerWhitelisted(Tree issuerExtractionSite, Tree scope, SubscriptionContext ctx) { + Optional issuerSymbol = extractedValueSymbol(issuerExtractionSite); + if (issuerSymbol.isEmpty()) { + return false; + } + Symbol symbol = issuerSymbol.get(); + return TreeUtils.hasDescendant(scope, tree -> isEnumConversionOfSymbol(tree, symbol, ctx)) + || TreeUtils.hasDescendant(scope, tree -> isLiteralMembershipGuardOnSymbol(tree, symbol)) + || TreeUtils.hasDescendant(scope, tree -> isDictLookupOnSymbolWithLiteralKeys(tree, symbol)); + } + + /** + * Whether {@code tree} is `symbol in [...]`/`symbol not in [...]` against a list/tuple/set literal (or a Name + * bound to one) whose elements are ALL string literals. Stricter than {@link #isAllowlistGuardOnSymbol} - that + * one only requires the guard to exist (enough to prevent algorithm confusion, since any real check beats none), + * but the ticket's "static whitelist" requirement here means a guard containing even one dynamic element + * (`issuer in {"a", dynamic_value}`) doesn't qualify: the whitelist isn't actually static. + */ + private static boolean isLiteralMembershipGuardOnSymbol(Tree tree, Symbol symbol) { + return TreeUtils.toOptionalInstanceOf(InExpression.class, tree) + .filter(inExpr -> isNameOfSymbol(inExpr.leftOperand(), symbol)) + .map(InExpression::rightOperand) + .flatMap(Expressions::ifNameGetSingleAssignedNonNameValue) + .map(Expressions::expressionsFromListOrTuple) + .filter(elements -> !elements.isEmpty() && elements.stream().allMatch(JwtVerificationCheck::isNonInterpolatedStringLiteral)) + .isPresent(); + } + + /** Whether {@code tree} is a call passing {@code symbol} to a callee whose type is a declared Enum subclass, e.g. {@code AuthIssuer(issuer)}. */ + private static boolean isEnumConversionOfSymbol(Tree tree, Symbol symbol, SubscriptionContext ctx) { + return TreeUtils.toOptionalInstanceOf(CallExpression.class, tree) + .filter(call -> call.arguments().stream() + .flatMap(TreeUtils.toStreamInstanceOfMapper(RegularArgument.class)) + .map(RegularArgument::expression) + .anyMatch(expression -> isNameOfSymbol(expression, symbol))) + .map(CallExpression::callee) + .filter(callee -> IS_ENUM_MATCHER.isTrueFor(callee, ctx)) + .isPresent(); + } + + /** Whether {@code tree} is `symbol[key]` (or `key = symbol[...]`'s RHS) where the subscripted base is a dict literal with only string-literal keys. */ + private static boolean isDictLookupOnSymbolWithLiteralKeys(Tree tree, Symbol symbol) { + return TreeUtils.toOptionalInstanceOf(SubscriptionExpression.class, tree) + .filter(subscription -> subscription.subscripts().expressions().stream().anyMatch(expression -> isNameOfSymbol(expression, symbol))) + .map(SubscriptionExpression::object) + .flatMap(Expressions::ifNameGetSingleAssignedNonNameValue) + .flatMap(TreeUtils.toOptionalInstanceOfMapper(DictionaryLiteral.class)) + .filter(JwtVerificationCheck::hasOnlyStringLiteralKeys) + .isPresent(); + } + + private static boolean hasOnlyStringLiteralKeys(DictionaryLiteral dictionaryLiteral) { + if (dictionaryLiteral.elements().isEmpty()) { + return false; + } + List pairs = dictionaryLiteral.elements().stream() + .filter(KeyValuePair.class::isInstance) + .map(KeyValuePair.class::cast) + .toList(); + return pairs.size() == dictionaryLiteral.elements().size() + && pairs.stream().allMatch(pair -> pair.key().is(Kind.STRING_LITERAL)); + } + private static boolean isListOrDictWithSensitiveEntry(@Nullable Expression expression) { if (expression == null) { return false; @@ -303,7 +455,7 @@ private static boolean isSafeUsage(Usage usage, @Nullable Tree scope) { } Optional getCall = getCallExprWhereDictIsAccessedWithGet(Stream.of(usageParent)).findFirst(); if (getCall.isPresent()) { - Stream keys = getStringLiteralArguments(getArgumentsFromCallExpr(Stream.of(getCall.get()))); + Stream keys = getStringLiteralKeyArgument(getCall.get()); return isSafeExtractedValueSite(getCall.get(), keys, scope); } Optional subscription = getSubscriptions(Stream.of(usageParent)).findFirst(); @@ -442,7 +594,7 @@ private static boolean isSafeUsageSite(Tree usageSite) { if (isComparisonOperand(getCall.get())) { return true; } - return isAllowedKeyAccess(getStringLiteralArguments(getArgumentsFromCallExpr(Stream.of(getCall.get())))); + return isAllowedKeyAccess(getStringLiteralKeyArgument(getCall.get())); } Optional subscription = getSubscriptions(Stream.of(usageSite)).findFirst(); if (subscription.isPresent()) { @@ -482,15 +634,17 @@ private static Stream getCallExprWhereDictIsAccessedWithGet(Stre .flatMap(TreeUtils.toStreamInstanceOfMapper(CallExpression.class)); } - private static Stream getArgumentsFromCallExpr(Stream callExprs) { - return callExprs.map(CallExpression::arguments).flatMap(Collection::stream); - } - - private static Stream getStringLiteralArguments(Stream arguments) { - return arguments.filter(arg -> arg.is(Tree.Kind.REGULAR_ARGUMENT)) - .flatMap(TreeUtils.toStreamInstanceOfMapper(RegularArgument.class)) + /** + * The `.get(key)` call's key argument, as a StringLiteral if it is one. Only the first positional/keyword + * argument is considered - `.get(key, default)`'s second argument is a fallback value, not part of the key, + * and must not be treated as an additional accessed key (e.g. `header.get("kid", "fallback")` must still be + * recognized as accessing only `"kid"`, not `{"kid", "fallback"}`). + */ + private static Stream getStringLiteralKeyArgument(CallExpression getCall) { + return Optional.ofNullable(TreeUtils.nthArgumentOrKeyword(0, "key", getCall.arguments())) .map(RegularArgument::expression) - .flatMap(TreeUtils.toStreamInstanceOfMapper(StringLiteral.class)); + .flatMap(TreeUtils.toOptionalInstanceOfMapper(StringLiteral.class)) + .stream(); } private static Stream getSubscriptions(Stream subscriptions) { diff --git a/python-checks/src/main/java/org/sonar/python/checks/utils/Expressions.java b/python-checks/src/main/java/org/sonar/python/checks/utils/Expressions.java index afc6f5ee8..1cc283e55 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/utils/Expressions.java +++ b/python-checks/src/main/java/org/sonar/python/checks/utils/Expressions.java @@ -42,6 +42,7 @@ import org.sonar.plugins.python.api.tree.NumericLiteral; import org.sonar.plugins.python.api.tree.ParenthesizedExpression; import org.sonar.plugins.python.api.tree.QualifiedExpression; +import org.sonar.plugins.python.api.tree.SetLiteral; import org.sonar.plugins.python.api.tree.SliceExpression; import org.sonar.plugins.python.api.tree.StringElement; import org.sonar.plugins.python.api.tree.StringLiteral; @@ -189,12 +190,19 @@ public static Optional ifNameGetSingleAssignedNonNameValue(Expressio return Optional.of(expression); } + /** + * Extracts the element expressions of a list, tuple, or set literal. Named for its original list/tuple-only + * scope; widened to also cover {@link SetLiteral} since a set is just as valid a literal-collection allowlist + * shape (e.g. {@code x in {"a", "b"}}) as a list or tuple. + */ public static List expressionsFromListOrTuple(Expression expression) { return TreeUtils.toOptionalInstanceOf(ListLiteral.class, expression) .map(ListLiteral::elements) .map(ExpressionList::expressions) .or(() -> TreeUtils.toOptionalInstanceOf(Tuple.class, expression) .map(Tuple::elements)) + .or(() -> TreeUtils.toOptionalInstanceOf(SetLiteral.class, expression) + .map(SetLiteral::elements)) .orElseGet(Collections::emptyList); } diff --git a/python-checks/src/test/java/org/sonar/python/checks/utils/ExpressionsTest.java b/python-checks/src/test/java/org/sonar/python/checks/utils/ExpressionsTest.java index a486fb75c..01fd7c1f2 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/utils/ExpressionsTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/utils/ExpressionsTest.java @@ -37,6 +37,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.sonar.python.checks.utils.Expressions.containsSpreadOperator; +import static org.sonar.python.checks.utils.Expressions.expressionsFromListOrTuple; import static org.sonar.python.checks.utils.Expressions.getAssignedName; import static org.sonar.python.checks.utils.Expressions.isFalsy; import static org.sonar.python.checks.utils.Expressions.isTruthy; @@ -226,6 +227,14 @@ void testContainsSpreadOperator() { assertThat(containsSpreadOperator(args("some()"))).isFalse(); } + @Test + void expressionsFromListOrTuple_list_tuple_set_and_other() { + assertThat(expressionsFromListOrTuple(exp("[1, 2, 3]"))).hasSize(3); + assertThat(expressionsFromListOrTuple(exp("(1, 2, 3)"))).hasSize(3); + assertThat(expressionsFromListOrTuple(exp("{1, 2, 3}"))).hasSize(3); + assertThat(expressionsFromListOrTuple(exp("42"))).isEmpty(); + } + private List args(String source) { Expression callExpr = exp(source); assertThat(callExpr).isInstanceOf(CallExpression.class); diff --git a/python-checks/src/test/resources/checks/jwtVerification.py b/python-checks/src/test/resources/checks/jwtVerification.py index f5c381334..d3e72f2e9 100644 --- a/python-checks/src/test/resources/checks/jwtVerification.py +++ b/python-checks/src/test/resources/checks/jwtVerification.py @@ -1,5 +1,14 @@ import jwt import python_jwt +from enum import Enum + +class AuthIssuer(Enum): + ISSUER_A = "issuer1" + ISSUER_B = "issuer2" + +class NotAnEnum: + def __init__(self, value): + self.value = value def jwt_decode_argument(token): jwt.decode(token) @@ -82,6 +91,180 @@ def other(): return jwt.decode(token, keys["k"], algorithms=["HS256"]) return inner(), other() +def issuer_routing_enum_conversion(token: str, verification_key: str) -> AuthIssuer: + try: + payload = jwt.decode(token, options={"verify_signature": False}) # Compliant: only iss accessed, validated via enum conversion + except jwt.DecodeError: + raise ValueError("Invalid token format") + issuer_string = payload.get("iss") + if not issuer_string: + raise ValueError("Token missing 'iss' (issuer) claim") + try: + iss_enum_member = AuthIssuer(issuer_string) + except ValueError: + raise ValueError(f"Unsupported token issuer: {issuer_string}") + return iss_enum_member + +def issuer_routing_verify_kwarg(token: str): + payload = jwt.decode(token, verify=False) # Compliant: same pattern via the verify= kwarg shape instead of options= + issuer = payload.get("iss") + if issuer not in {"issuer1", "issuer2"}: + raise ValueError("Unsupported token issuer") + return issuer + +def issuer_routing_set_membership(token: str): + payload = jwt.decode(token, options={"verify_signature": False}) # Compliant: only iss accessed, validated via set membership + issuer = payload.get("iss") + if issuer not in {"issuer1", "issuer2"}: + raise ValueError("Unsupported token issuer") + return issuer + +def issuer_routing_dict_lookup(token: str): + KEY_BY_ISSUER = {"issuer1": "secret1", "issuer2": "secret2"} + payload = jwt.decode(token, options={"verify_signature": False}) # Compliant: only iss accessed, validated via dict lookup + issuer = payload["iss"] + key = KEY_BY_ISSUER[issuer] + return jwt.decode(token, key, algorithms=["HS256"]) + +def issuer_routing_get_with_default(token: str): + payload = jwt.decode(token, options={"verify_signature": False}) # Compliant: the "default_issuer" fallback isn't an additional accessed key + issuer = payload.get("iss", "default_issuer") + if issuer not in {"issuer1", "issuer2", "default_issuer"}: + raise ValueError("Unsupported token issuer") + return issuer + +# an empty dict is never a valid static whitelist - the lookup would always KeyError +def issuer_routing_empty_dict_lookup(token: str): + KEY_BY_ISSUER = {} + payload = jwt.decode(token, options={"verify_signature": False}) # Noncompliant + issuer = payload["iss"] + return KEY_BY_ISSUER[issuer] + + +# dict has a non-literal key, not a valid static whitelist +def issuer_routing_dict_lookup_non_literal_key(token: str, dynamic_key): + KEY_BY_ISSUER = {"issuer1": "secret1", dynamic_key: "secret2"} + payload = jwt.decode(token, options={"verify_signature": False}) # Noncompliant + issuer = payload["iss"] + return KEY_BY_ISSUER[issuer] + +# dict is built with a spread rather than only literal key/value pairs, not a valid static whitelist +def issuer_routing_dict_lookup_with_spread(token: str, other_dict): + KEY_BY_ISSUER = {"issuer1": "secret1", **other_dict} + payload = jwt.decode(token, options={"verify_signature": False}) # Noncompliant + issuer = payload["iss"] + return KEY_BY_ISSUER[issuer] + +# set contains a non-literal element, not a valid static whitelist +def issuer_routing_set_with_non_literal_element(token: str, dynamic_issuer): + payload = jwt.decode(token, options={"verify_signature": False}) # Noncompliant + issuer = payload.get("iss") + if issuer not in {"issuer1", dynamic_issuer}: + raise ValueError("Unsupported token issuer") + return issuer + +# NotAnEnum isn't a declared Enum subclass, so this doesn't count as enum-conversion validation +def issuer_routing_not_actually_an_enum(token: str): + payload = jwt.decode(token, options={"verify_signature": False}) # Noncompliant + issuer_string = payload.get("iss") + try: + wrapped = NotAnEnum(issuer_string) + except ValueError: + raise ValueError(f"Unsupported token issuer: {issuer_string}") + return wrapped + +# AuthIssuer(...) is called in scope, but not with the issuer symbol - doesn't count as validating it +def issuer_routing_enum_call_without_issuer_argument(token: str): + payload = jwt.decode(token, options={"verify_signature": False}) # Noncompliant + issuer = payload.get("iss") + default_issuer = AuthIssuer("issuer1") + return issuer, default_issuer + +# sub is also read from the payload, so the "only iss" requirement isn't met +def issuer_routing_disallowed_claim_access(token: str): + payload = jwt.decode(token, options={"verify_signature": False}) # Noncompliant + issuer = payload.get("iss") + subject = payload.get("sub") + if issuer not in {"issuer1", "issuer2"}: + raise ValueError("Unsupported token issuer") + return issuer, subject + +# payload itself is returned, not just the iss claim +def issuer_routing_payload_returned_raw(token: str): + payload = jwt.decode(token, options={"verify_signature": False}) # Noncompliant + issuer = payload.get("iss") + if issuer not in {"issuer1", "issuer2"}: + raise ValueError("Unsupported token issuer") + return payload + +def validate_issuer_elsewhere(issuer): + if issuer not in {"issuer1", "issuer2"}: + raise ValueError("Unsupported token issuer") + +# the whitelist check lives in a sibling function, out of scope for this one +def issuer_routing_wrong_scope(token: str): + payload = jwt.decode(token, options={"verify_signature": False}) # Noncompliant + issuer = payload.get("iss") + return issuer + +# the decode result isn't assigned to a local variable at all, so there's nothing to trace usages of +def issuer_routing_no_assignment(token: str): + return jwt.decode(token, options={"verify_signature": False}) # Noncompliant + +# passed to another function rather than only having "iss" read - not a recognized safe usage +def issuer_routing_payload_passed_to_other_function(token: str, do_something_with): + payload = jwt.decode(token, options={"verify_signature": False}) # Noncompliant + return do_something_with(payload) + +# the dict subscript in scope doesn't actually use the issuer symbol, so it doesn't count as a whitelist check +def issuer_routing_unrelated_dict_lookup(token: str, other_key): + OTHER_LOOKUP = {"a": "1", "b": "2"} + payload = jwt.decode(token, options={"verify_signature": False}) # Noncompliant + issuer = payload.get("iss") + return OTHER_LOOKUP[other_key] + +# .get() called with no key argument at all - nothing to classify as the iss claim +def issuer_routing_get_no_arguments(token: str): + payload = jwt.decode(token, options={"verify_signature": False}) # Noncompliant + issuer = payload.get() + return issuer + +# .get() called with a non-literal key - can't tell if it's "iss" or something else +def issuer_routing_get_non_literal_key(token: str, claim_name): + payload = jwt.decode(token, options={"verify_signature": False}) # Noncompliant + issuer = payload.get(claim_name) + return issuer + +# subscription with a non-literal key - same ambiguity as the .get() case above +def issuer_routing_subscription_non_literal_key(token: str, claim_name): + payload = jwt.decode(token, options={"verify_signature": False}) # Noncompliant + issuer = payload[claim_name] + return issuer + +# decode result is assigned to a tuple target (a, b = ..., ...), not a single Name +def issuer_routing_tuple_assignment_target(token: str, other_token): + payload, other_payload = jwt.decode(token, options={"verify_signature": False}), jwt.decode(other_token) # Noncompliant + return payload, other_payload + +def issuer_routing_iss_accessed_inline_no_binding(token: str): + payload = jwt.decode(token, options={"verify_signature": False}) # Compliant: iss is compared inline against a literal whitelist, never bound to a Name + if payload.get("iss") not in {"issuer1", "issuer2"}: + raise ValueError("Unsupported token issuer") + return True + +def issuer_routing_iss_accessed_inline_no_binding_subscription(token: str): + payload = jwt.decode(token, options={"verify_signature": False}) # Compliant: same as above but via subscription access + if payload["iss"] not in {"issuer1", "issuer2"}: + raise ValueError("Unsupported token issuer") + return True + +# right operand of the inline `in` check isn't a literal collection, so this isn't a static whitelist +def issuer_routing_iss_accessed_inline_no_binding_dynamic_whitelist(token: str, allowed_issuers): + payload = jwt.decode(token, options={"verify_signature": False}) # Noncompliant + if payload.get("iss") not in allowed_issuers: + raise ValueError("Unsupported token issuer") + return True + module_token = "..." module_key = "secret" module_unverified = jwt.decode(module_token, options={"verify_signature": False}) # Compliant: real verification happens at module scope below @@ -140,6 +323,11 @@ def get_unverified_header_compliant(token: str, keys): claims = jwt.decode(token, key, algorithms=["HS256"]) return claims +def get_unverified_header_compliant_get_with_default(token: str): + header = jwt.get_unverified_header(token) # Compliant: the "none" fallback isn't an additional accessed key + kid = header.get("kid", "none") + return kid + def header_comparison_whole_header(token: str): expected_header = {"alg": "RS256", "typ": "JWT"} received_header = jwt.get_unverified_header(token) # Compliant: only compared, never used for a decision From 9e1ad765cc62f8d40f20ffa4256a006f30a80f18 Mon Sep 17 00:00:00 2001 From: David Andersson <51036209+jdkandersson@users.noreply.github.com> Date: Mon, 13 Jul 2026 13:07:08 +0200 Subject: [PATCH 207/322] SONARPY-4096 Skip readability rules on generated Python files Co-authored-by: Lijun Chen GitOrigin-RevId: 5b918c185d8c6fd3d8a5bb0e72955747d97beb94 --- .../CognitiveComplexityFunctionCheck.java | 18 ++++- .../python/checks/CommentedCodeCheck.java | 20 +++++ .../checks/StringLiteralDuplicationCheck.java | 4 +- .../python/checks/django/DjangoUtils.java | 60 +++++++++++++++ .../checks/utils/GeneratedFileUtils.java | 48 ++++++++++++ .../CognitiveComplexityFunctionCheckTest.java | 19 +++++ .../python/checks/CommentedCodeCheckTest.java | 16 ++++ .../StringLiteralDuplicationCheckTest.java | 16 ++++ .../python/checks/django/DjangoUtilsTest.java | 76 +++++++++++++++++++ .../checks/utils/GeneratedFileUtilsTest.java | 64 ++++++++++++++++ .../migrations/0001_generated_migration.py | 41 ++++++++++ .../generated/cognitiveComplexity_pb2_test.py | 10 +++ .../generated/commentedCode_pb2_test.py | 8 ++ .../stringLiteralDuplication_pb2_test.py | 6 ++ .../resources/checks/generated/user_pb2.py | 19 +++++ .../checks/generated/user_pb2_grpc.py | 19 +++++ 16 files changed, 442 insertions(+), 2 deletions(-) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/utils/GeneratedFileUtils.java create mode 100644 python-checks/src/test/java/org/sonar/python/checks/django/DjangoUtilsTest.java create mode 100644 python-checks/src/test/java/org/sonar/python/checks/utils/GeneratedFileUtilsTest.java create mode 100644 python-checks/src/test/resources/checks/django/migrations/0001_generated_migration.py create mode 100644 python-checks/src/test/resources/checks/generated/cognitiveComplexity_pb2_test.py create mode 100644 python-checks/src/test/resources/checks/generated/commentedCode_pb2_test.py create mode 100644 python-checks/src/test/resources/checks/generated/stringLiteralDuplication_pb2_test.py create mode 100644 python-checks/src/test/resources/checks/generated/user_pb2.py create mode 100644 python-checks/src/test/resources/checks/generated/user_pb2_grpc.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/CognitiveComplexityFunctionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/CognitiveComplexityFunctionCheck.java index 37953c23d..4eab6d610 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/CognitiveComplexityFunctionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/CognitiveComplexityFunctionCheck.java @@ -22,8 +22,10 @@ import org.sonar.check.RuleProperty; import org.sonar.plugins.python.api.IssueLocation; import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; import org.sonar.plugins.python.api.tree.FunctionDef; import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.python.checks.utils.GeneratedFileUtils; import org.sonar.python.metrics.CognitiveComplexityVisitor; @Rule(key = CognitiveComplexityFunctionCheck.CHECK_KEY) @@ -33,6 +35,8 @@ public class CognitiveComplexityFunctionCheck extends PythonSubscriptionCheck { public static final String CHECK_KEY = "S3776"; private static final int DEFAULT_THRESHOLD = 15; + private Boolean isGeneratedFile; + @RuleProperty( key = "threshold", description = "The maximum authorized complexity.", @@ -43,7 +47,7 @@ public class CognitiveComplexityFunctionCheck extends PythonSubscriptionCheck { public void initialize(Context context) { context.registerSyntaxNodeConsumer(Tree.Kind.FUNCDEF, ctx -> { FunctionDef functionDef = (FunctionDef) ctx.syntaxNode(); - if (isInnerFunction(functionDef)) { + if (isInnerFunction(functionDef) || isGeneratedFile(ctx)) { return; } List secondaryLocations = new ArrayList<>(); @@ -57,6 +61,18 @@ public void initialize(Context context) { }); } + @Override + public void leaveFile() { + isGeneratedFile = null; + } + + private boolean isGeneratedFile(SubscriptionContext ctx) { + if (isGeneratedFile == null) { + isGeneratedFile = GeneratedFileUtils.isGeneratedFileForReadabilityRules(ctx.pythonFile(), ctx.syntaxNode()); + } + return isGeneratedFile; + } + private static boolean isInnerFunction(FunctionDef functionDef) { Tree parent = functionDef.parent(); while (parent != null) { diff --git a/python-checks/src/main/java/org/sonar/python/checks/CommentedCodeCheck.java b/python-checks/src/main/java/org/sonar/python/checks/CommentedCodeCheck.java index 0b7e493a2..e04c31755 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/CommentedCodeCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/CommentedCodeCheck.java @@ -33,6 +33,7 @@ import org.sonar.plugins.python.api.tree.Tree; import org.sonar.plugins.python.api.tree.Trivia; import org.sonar.python.checks.utils.Expressions; +import org.sonar.python.checks.utils.GeneratedFileUtils; import org.sonar.python.parser.PythonParser; import org.sonar.python.tree.PythonTreeMaker; @@ -50,6 +51,7 @@ public class CommentedCodeCheck extends PythonSubscriptionCheck { private final PythonParser parser = PythonParser.create(); private Pattern exceptionPattern; + private Boolean isGeneratedFile; @RuleProperty( key = "exception", @@ -62,6 +64,9 @@ public void initialize(Context context) { exceptionPattern = Pattern.compile(exception); context.registerSyntaxNodeConsumer(Tree.Kind.TOKEN, ctx -> { + if (isGeneratedFile(ctx)) { + return; + } Token token = (Token) ctx.syntaxNode(); List> groupedTrivias = groupTrivias(token); for (List triviaGroup : groupedTrivias) { @@ -70,6 +75,9 @@ public void initialize(Context context) { }); context.registerSyntaxNodeConsumer(Tree.Kind.STRING_LITERAL, ctx -> { + if (isGeneratedFile(ctx)) { + return; + } StringLiteral stringLiteral = (StringLiteral) ctx.syntaxNode(); if (isMultilineComment(stringLiteral)) { visitMultilineComment(stringLiteral, ctx); @@ -77,6 +85,18 @@ public void initialize(Context context) { }); } + @Override + public void leaveFile() { + isGeneratedFile = null; + } + + private boolean isGeneratedFile(SubscriptionContext ctx) { + if (isGeneratedFile == null) { + isGeneratedFile = GeneratedFileUtils.isGeneratedFileForReadabilityRules(ctx.pythonFile(), ctx.syntaxNode()); + } + return isGeneratedFile; + } + private static boolean isMultilineComment(StringLiteral stringLiteral) { Tree parent = stringLiteral.parent(); StringElement firstElement = stringLiteral.stringElements().get(0); diff --git a/python-checks/src/main/java/org/sonar/python/checks/StringLiteralDuplicationCheck.java b/python-checks/src/main/java/org/sonar/python/checks/StringLiteralDuplicationCheck.java index 37e680f09..e133da84e 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/StringLiteralDuplicationCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/StringLiteralDuplicationCheck.java @@ -35,6 +35,7 @@ import org.sonar.plugins.python.api.tree.Tree; import org.sonar.plugins.python.api.tree.TypeAnnotation; import org.sonar.python.checks.utils.Expressions; +import org.sonar.python.checks.utils.GeneratedFileUtils; import org.sonar.python.tree.TreeUtils; @Rule(key = "S1192") @@ -85,7 +86,8 @@ private Optional customExclusionPattern() { public void visitFileInput(FileInput fileInput) { literalsByValue.clear(); - if (this.getContext().pythonFile().fileName().startsWith("test")) { + if (this.getContext().pythonFile().fileName().startsWith("test") + || GeneratedFileUtils.isGeneratedFileForReadabilityRules(this.getContext().pythonFile(), fileInput)) { return; } super.visitFileInput(fileInput); diff --git a/python-checks/src/main/java/org/sonar/python/checks/django/DjangoUtils.java b/python-checks/src/main/java/org/sonar/python/checks/django/DjangoUtils.java index ead1539ff..6f7e21bd3 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/django/DjangoUtils.java +++ b/python-checks/src/main/java/org/sonar/python/checks/django/DjangoUtils.java @@ -19,16 +19,32 @@ import java.util.Collection; import java.util.Objects; import java.util.Optional; +import java.util.regex.Pattern; +import org.sonar.plugins.python.api.PythonFile; import org.sonar.plugins.python.api.tree.AssignmentStatement; import org.sonar.plugins.python.api.tree.ClassDef; +import org.sonar.plugins.python.api.tree.Expression; import org.sonar.plugins.python.api.tree.ExpressionList; +import org.sonar.plugins.python.api.tree.FileInput; import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.python.tree.TreeUtils; public class DjangoUtils { + private static final Pattern GENERATED_MIGRATION_FILE_PATTERN = Pattern.compile("(^|.*/)migrations/0[^/]*\\.py$"); + private static final String MIGRATION_CLASS_NAME = "Migration"; + private static final String MIGRATIONS_MIGRATION = "migrations.Migration"; + private static final String DJANGO_DB_MIGRATIONS_MIGRATION = "django.db.migrations.Migration"; + private DjangoUtils() { } + public static boolean isDjangoGeneratedMigrationFile(PythonFile pythonFile, Tree tree) { + return isDjangoGeneratedMigrationPath(pythonFile) && findFileInput(tree).map(DjangoUtils::hasMigrationClass).orElse(false); + } + public static Optional getMetaClass(ClassDef formClass) { return formClass.body() .statements() @@ -54,4 +70,48 @@ public static Optional getFieldAssignment(ClassDef metaClas .anyMatch(name -> fieldName.equals(name.name()))) .findFirst(); } + + private static boolean isDjangoGeneratedMigrationPath(PythonFile pythonFile) { + String path = pythonFile.uri().getPath(); + if (path == null) { + return false; + } + return GENERATED_MIGRATION_FILE_PATTERN.matcher(path.replace('\\', '/')).matches(); + } + + private static Optional findFileInput(Tree tree) { + Tree current = tree; + while (current != null && !current.is(Tree.Kind.FILE_INPUT)) { + current = current.parent(); + } + return Optional.ofNullable(current).map(FileInput.class::cast); + } + + private static boolean hasMigrationClass(FileInput fileInput) { + if (fileInput.statements() == null) { + return false; + } + return fileInput.statements().statements().stream() + .filter(ClassDef.class::isInstance) + .map(ClassDef.class::cast) + .filter(classDef -> MIGRATION_CLASS_NAME.equals(classDef.name().name())) + .anyMatch(DjangoUtils::inheritsFromDjangoMigration); + } + + private static boolean inheritsFromDjangoMigration(ClassDef classDef) { + if (classDef.args() == null) { + return false; + } + return classDef.args().arguments().stream() + .filter(argument -> argument.is(Tree.Kind.REGULAR_ARGUMENT)) + .map(RegularArgument.class::cast) + .map(RegularArgument::expression) + .anyMatch(DjangoUtils::isDjangoMigrationBaseClass); + } + + private static boolean isDjangoMigrationBaseClass(Expression expression) { + return TreeUtils.fullyQualifiedNameFromExpression(expression) + .filter(fqn -> MIGRATIONS_MIGRATION.equals(fqn) || DJANGO_DB_MIGRATIONS_MIGRATION.equals(fqn)) + .isPresent(); + } } diff --git a/python-checks/src/main/java/org/sonar/python/checks/utils/GeneratedFileUtils.java b/python-checks/src/main/java/org/sonar/python/checks/utils/GeneratedFileUtils.java new file mode 100644 index 000000000..1a043d851 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/utils/GeneratedFileUtils.java @@ -0,0 +1,48 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.utils; + +import org.sonar.plugins.python.api.PythonFile; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.python.checks.django.DjangoUtils; + +public final class GeneratedFileUtils { + private static final String PROTOBUF_GENERATED_MARKER = "# Generated by the protocol buffer compiler."; + private static final String GRPC_GENERATED_MARKER = "# Generated by the gRPC Python protocol compiler plugin."; + + private GeneratedFileUtils() { + } + + public static boolean isGeneratedFileForReadabilityRules(PythonFile pythonFile, Tree tree) { + return DjangoUtils.isDjangoGeneratedMigrationFile(pythonFile, tree) || isProtobufGeneratedFile(pythonFile); + } + + private static boolean isProtobufGeneratedFile(PythonFile pythonFile) { + String path = pythonFile.uri().getPath(); + if (path == null) { + return false; + } + + String normalizedPath = path.replace('\\', '/'); + if (!normalizedPath.endsWith("_pb2.py") && !normalizedPath.endsWith("_pb2_grpc.py")) { + return false; + } + + return pythonFile.content().contains(PROTOBUF_GENERATED_MARKER) + || pythonFile.content().contains(GRPC_GENERATED_MARKER); + } +} diff --git a/python-checks/src/test/java/org/sonar/python/checks/CognitiveComplexityFunctionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/CognitiveComplexityFunctionCheckTest.java index 25833308e..f4f5ba638 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/CognitiveComplexityFunctionCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/CognitiveComplexityFunctionCheckTest.java @@ -33,4 +33,23 @@ void test() { void default_threshold() { PythonCheckVerifier.verify("src/test/resources/checks/cognitiveComplexityFunctionDefault.py", check); } + + @Test + void no_issue_on_django_generated_migration() { + check.setThreshold(0); + PythonCheckVerifier.verifyNoIssue("src/test/resources/checks/django/migrations/0001_generated_migration.py", check); + } + + @Test + void no_issue_on_protobuf_generated_code() { + check.setThreshold(0); + PythonCheckVerifier.verifyNoIssue("src/test/resources/checks/generated/user_pb2.py", check); + PythonCheckVerifier.verifyNoIssue("src/test/resources/checks/generated/user_pb2_grpc.py", check); + } + + @Test + void issue_on_protobuf_suffix_near_match() { + check.setThreshold(0); + PythonCheckVerifier.verify("src/test/resources/checks/generated/cognitiveComplexity_pb2_test.py", check); + } } diff --git a/python-checks/src/test/java/org/sonar/python/checks/CommentedCodeCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/CommentedCodeCheckTest.java index 4b3f7add1..dc02be8c2 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/CommentedCodeCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/CommentedCodeCheckTest.java @@ -39,4 +39,20 @@ void test_encoding() { PythonCheckVerifier.verify("src/test/resources/checks/commentedCodeEncoding.py", check); } + @Test + void no_issue_on_django_generated_migration() { + PythonCheckVerifier.verifyNoIssue("src/test/resources/checks/django/migrations/0001_generated_migration.py", check); + } + + @Test + void no_issue_on_protobuf_generated_code() { + PythonCheckVerifier.verifyNoIssue("src/test/resources/checks/generated/user_pb2.py", check); + PythonCheckVerifier.verifyNoIssue("src/test/resources/checks/generated/user_pb2_grpc.py", check); + } + + @Test + void issue_on_protobuf_suffix_near_match() { + PythonCheckVerifier.verify("src/test/resources/checks/generated/commentedCode_pb2_test.py", check); + } + } diff --git a/python-checks/src/test/java/org/sonar/python/checks/StringLiteralDuplicationCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/StringLiteralDuplicationCheckTest.java index e3327d390..4074a6323 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/StringLiteralDuplicationCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/StringLiteralDuplicationCheckTest.java @@ -34,6 +34,22 @@ void test_no_issue_on_test_code() { PythonCheckVerifier.verifyNoIssue("src/test/resources/checks/test_stringLiteralDuplication.py", new StringLiteralDuplicationCheck()); } + @Test + void test_no_issue_on_django_generated_migration() { + PythonCheckVerifier.verifyNoIssue("src/test/resources/checks/django/migrations/0001_generated_migration.py", new StringLiteralDuplicationCheck()); + } + + @Test + void test_no_issue_on_protobuf_generated_code() { + PythonCheckVerifier.verifyNoIssue("src/test/resources/checks/generated/user_pb2.py", new StringLiteralDuplicationCheck()); + PythonCheckVerifier.verifyNoIssue("src/test/resources/checks/generated/user_pb2_grpc.py", new StringLiteralDuplicationCheck()); + } + + @Test + void test_issue_on_protobuf_suffix_near_match() { + PythonCheckVerifier.verify("src/test/resources/checks/generated/stringLiteralDuplication_pb2_test.py", new StringLiteralDuplicationCheck()); + } + @Test void test_custom_pattern() { StringLiteralDuplicationCheck check = new StringLiteralDuplicationCheck(); diff --git a/python-checks/src/test/java/org/sonar/python/checks/django/DjangoUtilsTest.java b/python-checks/src/test/java/org/sonar/python/checks/django/DjangoUtilsTest.java new file mode 100644 index 000000000..75c750c23 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/django/DjangoUtilsTest.java @@ -0,0 +1,76 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.django; + +import com.sonar.sslr.api.AstNode; +import org.junit.jupiter.api.Test; +import org.sonar.plugins.python.api.PythonFile; +import org.sonar.plugins.python.api.tree.FileInput; +import org.sonar.python.TestPythonVisitorRunner; +import org.sonar.python.parser.PythonParser; +import org.sonar.python.tree.PythonTreeMaker; + +import static org.assertj.core.api.Assertions.assertThat; + +class DjangoUtilsTest { + + @Test + void isDjangoGeneratedMigrationFile() { + FileInput fileInput = parse(""" + from django.db import migrations + + class Migration(migrations.Migration): + pass + """); + + assertThat(DjangoUtils.isDjangoGeneratedMigrationFile(pythonFile("accounts/migrations/0001_initial.py"), fileInput)).isTrue(); + assertThat(DjangoUtils.isDjangoGeneratedMigrationFile(pythonFile("accounts\\migrations\\0001_initial.py"), fileInput)).isTrue(); + assertThat(DjangoUtils.isDjangoGeneratedMigrationFile(pythonFile("accounts/migrations/manual_migration.py"), fileInput)).isFalse(); + assertThat(DjangoUtils.isDjangoGeneratedMigrationFile(pythonFile("accounts/models/0001_initial.py"), fileInput)).isFalse(); + } + + @Test + void isDjangoGeneratedMigrationFile_requires_migration_class() { + FileInput fileInput = parse(""" + from django.db import migrations + + class NotMigration(migrations.Migration): + pass + """); + + assertThat(DjangoUtils.isDjangoGeneratedMigrationFile(pythonFile("accounts/migrations/0001_initial.py"), fileInput)).isFalse(); + } + + @Test + void isDjangoGeneratedMigrationFile_accepts_fully_qualified_migration_base() { + FileInput fileInput = parse(""" + class Migration(django.db.migrations.Migration): + pass + """); + + assertThat(DjangoUtils.isDjangoGeneratedMigrationFile(pythonFile("accounts/migrations/0001_initial.py"), fileInput)).isTrue(); + } + + private static PythonFile pythonFile(String path) { + return new TestPythonVisitorRunner.MockPythonFile("", path, ""); + } + + private static FileInput parse(String code) { + AstNode astNode = PythonParser.create().parse(code); + return new PythonTreeMaker().fileInput(astNode); + } +} diff --git a/python-checks/src/test/java/org/sonar/python/checks/utils/GeneratedFileUtilsTest.java b/python-checks/src/test/java/org/sonar/python/checks/utils/GeneratedFileUtilsTest.java new file mode 100644 index 000000000..9c28dedab --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/utils/GeneratedFileUtilsTest.java @@ -0,0 +1,64 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.utils; + +import com.sonar.sslr.api.AstNode; +import org.junit.jupiter.api.Test; +import org.sonar.plugins.python.api.PythonFile; +import org.sonar.plugins.python.api.tree.FileInput; +import org.sonar.python.TestPythonVisitorRunner; +import org.sonar.python.parser.PythonParser; +import org.sonar.python.tree.PythonTreeMaker; + +import static org.assertj.core.api.Assertions.assertThat; + +class GeneratedFileUtilsTest { + + @Test + void isGeneratedFileForReadabilityRules_detects_protobuf_generated_files() { + String code = "# Generated by the protocol buffer compiler.\nx = 1"; + FileInput fileInput = parse(code); + + assertThat(GeneratedFileUtils.isGeneratedFileForReadabilityRules(pythonFile("service/user_pb2.py", code), fileInput)).isTrue(); + assertThat(GeneratedFileUtils.isGeneratedFileForReadabilityRules(pythonFile("service/user_pb2_grpc.py", code), fileInput)).isTrue(); + assertThat(GeneratedFileUtils.isGeneratedFileForReadabilityRules(pythonFile("service/user_pb2_test.py", code), fileInput)).isFalse(); + } + + @Test + void isGeneratedFileForReadabilityRules_detects_grpc_generated_files() { + String code = "# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!\nx = 1"; + FileInput fileInput = parse(code); + + assertThat(GeneratedFileUtils.isGeneratedFileForReadabilityRules(pythonFile("service/user_pb2_grpc.py", code), fileInput)).isTrue(); + } + + @Test + void isGeneratedFileForReadabilityRules_requires_protobuf_generated_header() { + FileInput fileInput = parse("x = 1"); + + assertThat(GeneratedFileUtils.isGeneratedFileForReadabilityRules(pythonFile("service/user_pb2.py", "x = 1"), fileInput)).isFalse(); + } + + private static PythonFile pythonFile(String path, String content) { + return new TestPythonVisitorRunner.MockPythonFile("", path, content); + } + + private static FileInput parse(String code) { + AstNode astNode = PythonParser.create().parse(code); + return new PythonTreeMaker().fileInput(astNode); + } +} diff --git a/python-checks/src/test/resources/checks/django/migrations/0001_generated_migration.py b/python-checks/src/test/resources/checks/django/migrations/0001_generated_migration.py new file mode 100644 index 000000000..2d46a8f77 --- /dev/null +++ b/python-checks/src/test/resources/checks/django/migrations/0001_generated_migration.py @@ -0,0 +1,41 @@ +from django.db import migrations, models + + +# if legacy_users: +# migrate_users() +"""if legacy_users: + migrate_users() +""" + + +def copy_legacy_users(apps, schema_editor): + if apps is None: + return + if schema_editor is None: + return + if schema_editor.connection.alias == "default": + if apps.get_model("accounts", "User").objects.exists(): + return + for user in apps.get_model("legacy", "User").objects.all(): + if user.is_active: + if user.email: + continue + + +class Migration(migrations.Migration): + dependencies = [ + ("accounts", "0001_initial"), + ] + + operations = [ + migrations.AddField( + model_name="raffle", + name="address_req", + field=models.CharField( + choices=[("REQ", "Address required"), ("OPT", "Address required"), ("NOT", "Address required")], + default="NOT", + max_length=3, + ), + ), + migrations.RunPython(copy_legacy_users, migrations.RunPython.noop), + ] diff --git a/python-checks/src/test/resources/checks/generated/cognitiveComplexity_pb2_test.py b/python-checks/src/test/resources/checks/generated/cognitiveComplexity_pb2_test.py new file mode 100644 index 000000000..bc774913d --- /dev/null +++ b/python-checks/src/test/resources/checks/generated/cognitiveComplexity_pb2_test.py @@ -0,0 +1,10 @@ +def serialize_user(value): # Noncompliant {{Refactor this function to reduce its Cognitive Complexity from 8 to the 0 allowed.}} + if value is None: + return None + if value.name == "default": + if value.email == "default": + return "default generated value" + if value.phone == "default": + return "default generated value" + if value.address == "default": + return "default generated value" diff --git a/python-checks/src/test/resources/checks/generated/commentedCode_pb2_test.py b/python-checks/src/test/resources/checks/generated/commentedCode_pb2_test.py new file mode 100644 index 000000000..53fe3fc49 --- /dev/null +++ b/python-checks/src/test/resources/checks/generated/commentedCode_pb2_test.py @@ -0,0 +1,8 @@ +# if legacy_users: +# migrate_users() + +# Noncompliant@-3 {{Remove this commented out code.}} + + +def serialize_user(value): + return value diff --git a/python-checks/src/test/resources/checks/generated/stringLiteralDuplication_pb2_test.py b/python-checks/src/test/resources/checks/generated/stringLiteralDuplication_pb2_test.py new file mode 100644 index 000000000..ad8ff1be1 --- /dev/null +++ b/python-checks/src/test/resources/checks/generated/stringLiteralDuplication_pb2_test.py @@ -0,0 +1,6 @@ +def serialize_user(value): + if value.name == "default": + return "default generated value" # Noncompliant {{Define a constant instead of duplicating this literal "default generated value" 3 times.}} + if value.email == "default": + return "default generated value" + return "default generated value" diff --git a/python-checks/src/test/resources/checks/generated/user_pb2.py b/python-checks/src/test/resources/checks/generated/user_pb2.py new file mode 100644 index 000000000..f16fcc99e --- /dev/null +++ b/python-checks/src/test/resources/checks/generated/user_pb2.py @@ -0,0 +1,19 @@ +# Generated by the protocol buffer compiler. +# if legacy_users: +# migrate_users() +"""if legacy_users: + migrate_users() +""" + + +def serialize_user(value): + if value is None: + return None + if value.name == "default": + if value.email == "default": + return "default generated value" + if value.phone == "default": + return "default generated value" + if value.address == "default": + return "default generated value" + return "default generated value" diff --git a/python-checks/src/test/resources/checks/generated/user_pb2_grpc.py b/python-checks/src/test/resources/checks/generated/user_pb2_grpc.py new file mode 100644 index 000000000..5e9eb483e --- /dev/null +++ b/python-checks/src/test/resources/checks/generated/user_pb2_grpc.py @@ -0,0 +1,19 @@ +# Generated by the protocol buffer compiler. +# if legacy_users: +# migrate_users() +"""if legacy_users: + migrate_users() +""" + + +def add_UserServicer_to_server(servicer, server): + if servicer is None: + return None + if server is None: + return None + if server.started: + if servicer.active: + return "default generated value" + if servicer.ready: + return "default generated value" + return "default generated value" From ccf256e65eb285a1fdde4b39bc493eca48fadbb3 Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Mon, 13 Jul 2026 15:47:13 +0200 Subject: [PATCH 208/322] SONARPY-4371 Updated Pydantic Field stubs GitOrigin-RevId: d3c7778913822268a5c730b3167d33416c09714a --- .../python/types/custom_protobuf/pydantic.fields.protobuf | 6 +++--- .../sonar/python/types/custom_protobuf/pydantic.protobuf | 6 +++--- .../typeshed_serializer/checksums/custom.checksum | 4 ++-- .../resources/custom/pydantic/fields.pyi | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.fields.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.fields.protobuf index 12e37f16b..c11f4a523 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.fields.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.fields.protobuf @@ -9,9 +9,9 @@ default Any * kwargs -Any -Fieldpydantic.fields.Field"6 -pydantic.fields.FieldInfo"pydantic.fields.FieldInfo* +AnyT +Fieldpydantic.fields.Field" +Any* default Any * kwargs diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.protobuf index 845382468..d72070ecb 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.protobuf @@ -29,9 +29,9 @@ ConfigDictpydantic.config.ConfigDict"builtins.object* get_secret_value)pydantic.types.SecretStr.get_secret_value" builtins.str" builtins.str*> self4 -pydantic.types.SecretStr"pydantic.types.SecretStr -Fieldpydantic.fields.Field"6 -pydantic.fields.FieldInfo"pydantic.fields.FieldInfo* +pydantic.types.SecretStr"pydantic.types.SecretStrT +Fieldpydantic.fields.Field" +Any* default Any * kwargs diff --git a/python-frontend/typeshed_serializer/checksums/custom.checksum b/python-frontend/typeshed_serializer/checksums/custom.checksum index 3212768b3..eb9746d4f 100644 --- a/python-frontend/typeshed_serializer/checksums/custom.checksum +++ b/python-frontend/typeshed_serializer/checksums/custom.checksum @@ -1,2 +1,2 @@ -164d3a058e1ec22c87b6e47b861e27f6dc7a1859adae3bb976ff12460c8fb52d -067592afaf42d934dbf0c6b935b881a794d1a67e46d986238c079d9e73c4512f \ No newline at end of file +ade4b3ecdc51464c4df5ed6a34d5fc812a98ca8b4a4295271a7e95eabf0ea40c +bcedf4de70ef2d2ba3c6cd0de0dfce24299f3f7180181acd1f7cc5e7933571ea \ No newline at end of file diff --git a/python-frontend/typeshed_serializer/resources/custom/pydantic/fields.pyi b/python-frontend/typeshed_serializer/resources/custom/pydantic/fields.pyi index b8463adb4..e05fc5a55 100644 --- a/python-frontend/typeshed_serializer/resources/custom/pydantic/fields.pyi +++ b/python-frontend/typeshed_serializer/resources/custom/pydantic/fields.pyi @@ -5,4 +5,4 @@ class FieldInfo: ... class PrivateAttr: def __init__(self, default: Any = ..., **kwargs: Any) -> None: ... -def Field(default: Any = ..., **kwargs: Any) -> FieldInfo: ... +def Field(default: Any = ..., **kwargs: Any) -> Any: ... From 919a6f48df9da34346553fb9635130db1fe54ea0 Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Mon, 13 Jul 2026 15:52:01 +0200 Subject: [PATCH 209/322] SONARPY-4363 Added telemetry for imports GitOrigin-RevId: 548a64864dccde1603b9970f0ce92b2183168579 --- .../sonar/plugins/python/PythonScanner.java | 13 +- .../sonar/plugins/python/PythonSensor.java | 12 ++ .../python/telemetry/TelemetryMetricKey.java | 2 + .../collectors/ImportsTelemetry.java | 33 +++++ .../collectors/ImportsTelemetryCollector.java | 98 +++++++++++++ .../plugins/python/PythonSensorTest.java | 14 ++ .../ImportsTelemetryCollectorTest.java | 133 ++++++++++++++++++ 7 files changed, 304 insertions(+), 1 deletion(-) create mode 100644 python-commons/src/main/java/org/sonar/plugins/python/telemetry/collectors/ImportsTelemetry.java create mode 100644 python-commons/src/main/java/org/sonar/plugins/python/telemetry/collectors/ImportsTelemetryCollector.java create mode 100644 python-commons/src/test/java/org/sonar/plugins/python/telemetry/collectors/ImportsTelemetryCollectorTest.java diff --git a/python-commons/src/main/java/org/sonar/plugins/python/PythonScanner.java b/python-commons/src/main/java/org/sonar/plugins/python/PythonScanner.java index 53f09f985..b337c65fb 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/PythonScanner.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/PythonScanner.java @@ -33,6 +33,7 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; +import java.util.function.Consumer; import java.util.function.Supplier; import java.util.regex.Pattern; import org.slf4j.Logger; @@ -53,6 +54,8 @@ import org.sonar.plugins.python.cpd.PythonCpdAnalyzer; import org.sonar.plugins.python.indexer.PythonIndexer; import org.sonar.plugins.python.nosonar.NoSonarLineInfoCollector; +import org.sonar.plugins.python.telemetry.collectors.ImportsTelemetry; +import org.sonar.plugins.python.telemetry.collectors.ImportsTelemetryCollector; import org.sonar.plugins.python.telemetry.collectors.TestFileTelemetry; import org.sonar.plugins.python.telemetry.collectors.TestFileTelemetryCollector; import org.sonar.plugins.python.telemetry.collectors.TypeInferenceTelemetry; @@ -87,6 +90,8 @@ public class PythonScanner extends Scanner { private final Lock lock; private final TypeInferenceTelemetryCollector typeInferenceTelemetryCollector; private final TestFileTelemetryCollector testFileTelemetryCollector; + private final ImportsTelemetryCollector importsTelemetryCollector; + private final List> telemetryCollectors; private final boolean testSourcesConfigured; private final AnalysisWarningsWrapper analysisWarnings; private final AtomicBoolean heuristicWarningEmitted = new AtomicBoolean(false); @@ -120,6 +125,8 @@ public PythonScanner( this.measuresRepository = new MeasuresRepository(context, noSonarFilter, fileLinesContextFactory, isInSonarLint(context), noSonarLineInfoCollector, lock); this.typeInferenceTelemetryCollector = new TypeInferenceTelemetryCollector(); this.testFileTelemetryCollector = new TestFileTelemetryCollector(); + this.importsTelemetryCollector = new ImportsTelemetryCollector(); + this.telemetryCollectors = List.of(typeInferenceTelemetryCollector::collect, importsTelemetryCollector::collect); } @Override @@ -167,7 +174,7 @@ protected void scanFile(PythonInputFile inputFile) throws IOException { if (visitorContext.rootTree() != null && !isInSonarLint(context)) { newSymbolsCollector.collect(context.newSymbolTable().onFile(inputFile.wrappedFile()), visitorContext.rootTree()); pythonHighlighter.highlight(context, visitorContext, inputFile); - typeInferenceTelemetryCollector.collect(visitorContext.rootTree()); + telemetryCollectors.forEach(c -> c.accept(visitorContext.rootTree())); testFileTelemetryCollector.collect(visitorContext.rootTree(), fileType, inputFile.wrappedFile().uri().getPath()); } @@ -451,6 +458,10 @@ public TestFileTelemetry getTestFileTelemetry() { return testFileTelemetryCollector.getTelemetry(); } + public ImportsTelemetry getImportsTelemetry() { + return importsTelemetryCollector.getTelemetry(); + } + public boolean wasTestFileHeuristicTriggered() { return heuristicWarningEmitted.get(); } diff --git a/python-commons/src/main/java/org/sonar/plugins/python/PythonSensor.java b/python-commons/src/main/java/org/sonar/plugins/python/PythonSensor.java index 903872f0d..1c63c6892 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/PythonSensor.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/PythonSensor.java @@ -23,6 +23,7 @@ import java.util.Collections; import java.util.List; import java.util.Optional; +import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.sonar.api.SonarProduct; @@ -51,6 +52,7 @@ import org.sonar.plugins.python.indexer.PythonIndexer; import org.sonar.plugins.python.indexer.PythonIndexerWrapper; import org.sonar.plugins.python.indexer.SonarQubePythonIndexer; +import org.sonar.plugins.python.telemetry.collectors.ImportsTelemetry; import org.sonar.plugins.python.nosonar.NoSonarLineInfoCollector; import org.sonar.plugins.python.telemetry.SensorTelemetryStorage; import org.sonar.plugins.python.telemetry.TelemetryMetricKey; @@ -161,6 +163,7 @@ public void execute(SensorContext context) { updateDatabricksTelemetry(scanner); updateTypeInferenceTelemetry(scanner); updateTestFileTelemetry(scanner); + updateImportsTelemetry(scanner); updateCacheAnalysisTelemetry(context, pythonIndexer, scanner); sensorTelemetryStorage.updateMetric(TelemetryMetricKey.NOSONAR_RULE_ID_KEY, noSonarLineInfoCollector.getSuppressedRuleIds()); sensorTelemetryStorage.updateMetric(TelemetryMetricKey.NOSONAR_COMMENTS_KEY, noSonarLineInfoCollector.getCommentWithExactlyOneRuleSuppressed()); @@ -222,6 +225,15 @@ private void updateTestFileTelemetry(PythonScanner scanner) { sensorTelemetryStorage.updateMetric(TelemetryMetricKey.PYTHON_TEST_FILE_HEURISTIC_TRIGGERED, scanner.wasTestFileHeuristicTriggered()); } + private void updateImportsTelemetry(PythonScanner scanner) { + ImportsTelemetry telemetry = scanner.getImportsTelemetry(); + String importsString = telemetry.importedModules().stream() + .sorted() + .collect(Collectors.joining(",")); + sensorTelemetryStorage.updateMetric(TelemetryMetricKey.PYTHON_IMPORTS, importsString); + sensorTelemetryStorage.updateMetric(TelemetryMetricKey.PYTHON_IMPORTS_FORMAT_VERSION, "1"); + } + private void updateNamespacePackageTelemetry(PythonIndexer pythonIndexer) { NamespacePackageTelemetry telemetry = pythonIndexer.namespacePackageTelemetry(); if (telemetry != null) { diff --git a/python-commons/src/main/java/org/sonar/plugins/python/telemetry/TelemetryMetricKey.java b/python-commons/src/main/java/org/sonar/plugins/python/telemetry/TelemetryMetricKey.java index c9d92cf24..ec63fde4f 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/telemetry/TelemetryMetricKey.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/telemetry/TelemetryMetricKey.java @@ -27,6 +27,8 @@ public enum TelemetryMetricKey { IPYNB_DATABRICKS_FOUND("python.notebook.databricks.ipynb"), PYTHON_DEPENDENCIES("python.dependencies"), PYTHON_DEPENDENCIES_FORMAT_VERSION("python.dependencies.format_version"), + PYTHON_IMPORTS("python.imports"), + PYTHON_IMPORTS_FORMAT_VERSION("python.imports.format_version"), NOSONAR_RULE_ID_KEY("python.nosonar.rule_ids"), NOSONAR_COMMENTS_KEY("python.nosonar.comments"), NOSONAR_NOTEBOOK_RULE_ID_KEY("python.notebook.nosonar.rule_ids"), diff --git a/python-commons/src/main/java/org/sonar/plugins/python/telemetry/collectors/ImportsTelemetry.java b/python-commons/src/main/java/org/sonar/plugins/python/telemetry/collectors/ImportsTelemetry.java new file mode 100644 index 000000000..dc6a35084 --- /dev/null +++ b/python-commons/src/main/java/org/sonar/plugins/python/telemetry/collectors/ImportsTelemetry.java @@ -0,0 +1,33 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.plugins.python.telemetry.collectors; + +import java.util.Collections; +import java.util.Set; + +/** + * Telemetry data for top-level module names found in Python import statements. + * + * @param importedModules Set of normalized top-level module names (e.g. "pandas", "numpy") + */ +public record ImportsTelemetry(Set importedModules) { + + public ImportsTelemetry(Set importedModules) { + this.importedModules = Collections.unmodifiableSet(importedModules); + } + +} diff --git a/python-commons/src/main/java/org/sonar/plugins/python/telemetry/collectors/ImportsTelemetryCollector.java b/python-commons/src/main/java/org/sonar/plugins/python/telemetry/collectors/ImportsTelemetryCollector.java new file mode 100644 index 000000000..dd008a34b --- /dev/null +++ b/python-commons/src/main/java/org/sonar/plugins/python/telemetry/collectors/ImportsTelemetryCollector.java @@ -0,0 +1,98 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.plugins.python.telemetry.collectors; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import org.sonar.plugins.python.api.tree.AliasedName; +import org.sonar.plugins.python.api.tree.BaseTreeVisitor; +import org.sonar.plugins.python.api.tree.FileInput; +import org.sonar.plugins.python.api.tree.ImportFrom; +import org.sonar.plugins.python.api.tree.ImportName; +import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.dependency.model.Dependency; + +/** + * Collects top-level module names from Python import statements across all analyzed files. + * Thread-safe: may be called from parallel file scans. + */ +public class ImportsTelemetryCollector { + + private static final int NAME_LENGTH_LIMIT = 100; + + private final Set importedModules = ConcurrentHashMap.newKeySet(); + + public void collect(FileInput rootTree) { + var visitor = new CollectorVisitor(); + rootTree.accept(visitor); + importedModules.addAll(visitor.getCollected()); + } + + public ImportsTelemetry getTelemetry() { + return new ImportsTelemetry(importedModules); + } + + private static class CollectorVisitor extends BaseTreeVisitor { + private final Set collected = new HashSet<>(); + + @Override + public void visitImportName(ImportName importName) { + // import X.Y.Z -> top-level is X + for (AliasedName aliasedName : importName.modules()) { + List names = aliasedName.dottedName().names(); + if (!names.isEmpty()) { + addIfShortEnough(names.get(0).name()); + } + } + super.visitImportName(importName); + } + + @Override + public void visitImportFrom(ImportFrom importFrom) { + // Skip relative imports (from . import foo, from ..utils import bar) + if (!importFrom.dottedPrefixForModule().isEmpty()) { + super.visitImportFrom(importFrom); + return; + } + // module() can be null for bare relative imports + if (importFrom.module() == null) { + super.visitImportFrom(importFrom); + return; + } + // Collect the top-level module name — works for both regular and wildcard imports + List names = importFrom.module().names(); + if (!names.isEmpty()) { + addIfShortEnough(names.get(0).name()); + } + super.visitImportFrom(importFrom); + } + + private void addIfShortEnough(String rawName) { + // Reuse Dependency normalization (lowercase + [._-]+ -> -) + String normalized = new Dependency(rawName).name(); + if (normalized.length() < NAME_LENGTH_LIMIT) { + collected.add(normalized); + } + } + + Set getCollected() { + return collected; + } + } +} diff --git a/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java index c9d38cffc..3ce68814d 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java @@ -1976,6 +1976,20 @@ void detects_databricks_negative() { verify(spyContext, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_DATABRICKS_FOUND.key(), "0"); } + @Test + void send_telemetry_imports_comma_separated_list() { + activeRules = new ActiveRulesBuilder().build(); + // main.py contains "from mod import add" -> top-level module "mod" + // uses_typeshed.py contains "import math" and "from fastapi ..." -> top-level modules "math", "fastapi" + // Result is sorted and comma-separated: "fastapi,math,mod" + inputFile("main.py"); + inputFile("uses_typeshed.py"); + var contextSpy = spy(context); + sensor().execute(contextSpy); + verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_IMPORTS.key(), "fastapi,math,mod"); + verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_IMPORTS_FORMAT_VERSION.key(), "1"); + } + @Test void send_telemetry_threads_and_files() { activeRules = new ActiveRulesBuilder() diff --git a/python-commons/src/test/java/org/sonar/plugins/python/telemetry/collectors/ImportsTelemetryCollectorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/telemetry/collectors/ImportsTelemetryCollectorTest.java new file mode 100644 index 000000000..87f8df481 --- /dev/null +++ b/python-commons/src/test/java/org/sonar/plugins/python/telemetry/collectors/ImportsTelemetryCollectorTest.java @@ -0,0 +1,133 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.plugins.python.telemetry.collectors; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; +import org.sonar.plugins.python.api.PythonVisitorContext; +import org.sonar.python.TestPythonVisitorRunner; +import org.sonar.python.caching.CacheContextImpl; +import org.sonar.python.semantic.ProjectLevelSymbolTable; + +import static org.assertj.core.api.Assertions.assertThat; + +class ImportsTelemetryCollectorTest { + + private static PythonVisitorContext createContext(String code) { + var mockFile = new TestPythonVisitorRunner.MockPythonFile("", "test.py", code); + return TestPythonVisitorRunner.createContext(mockFile, null, "", ProjectLevelSymbolTable.empty(), CacheContextImpl.dummyCache()); + } + + private static ImportsTelemetry collectFrom(String code) { + var collector = new ImportsTelemetryCollector(); + collector.collect(createContext(code).rootTree()); + return collector.getTelemetry(); + } + + @Test + void simpleImport() { + var telemetry = collectFrom("import pandas"); + assertThat(telemetry.importedModules()).containsExactly("pandas"); + } + + @Test + void dottedImportRecordsOnlyTopLevel() { + var telemetry = collectFrom("import os.path"); + assertThat(telemetry.importedModules()).containsExactly("os"); + } + + @Test + void fromImportRecordsModule() { + var telemetry = collectFrom("from pandas import DataFrame"); + assertThat(telemetry.importedModules()).containsExactly("pandas"); + } + + @Test + void fromDottedImportRecordsOnlyTopLevel() { + var telemetry = collectFrom("from os.path import join"); + assertThat(telemetry.importedModules()).containsExactly("os"); + } + + @Test + void wildcardImportRecordsModule() { + var telemetry = collectFrom("from os import *"); + assertThat(telemetry.importedModules()).containsExactly("os"); + } + + @ParameterizedTest + @ValueSource(strings = { + "from . import foo", + "from ..utils import bar", + "", + "x = 1\nprint(x)" + }) + void producesEmptyImportedModules(String code) { + var telemetry = collectFrom(code); + assertThat(telemetry.importedModules()).isEmpty(); + } + + @Test + void multipleModulesOnOneImportStatement() { + var telemetry = collectFrom("import os, sys"); + assertThat(telemetry.importedModules()).containsExactlyInAnyOrder("os", "sys"); + } + + @Test + void duplicatesAreDeduplicatedAcrossFiles() { + var collector = new ImportsTelemetryCollector(); + collector.collect(createContext("import pandas").rootTree()); + collector.collect(createContext("import pandas\nimport numpy").rootTree()); + var telemetry = collector.getTelemetry(); + assertThat(telemetry.importedModules()).containsExactlyInAnyOrder("pandas", "numpy"); + } + + @Test + void namesAreNormalized() { + // Module names with uppercase are lowercased + var telemetry = collectFrom("import Pandas"); + assertThat(telemetry.importedModules()).containsExactly("pandas"); + } + + @Test + void nameLongerThan100CharsIsFiltered() { + String longName = "a".repeat(100); + var telemetry = collectFrom("import " + longName); + assertThat(telemetry.importedModules()).isEmpty(); + } + + @Test + void nameShorterThan100CharsIsKept() { + String shortName = "a".repeat(99); + var telemetry = collectFrom("import " + shortName); + assertThat(telemetry.importedModules()).containsExactly(shortName); + } + + @Test + void mixOfImportTypes() { + var telemetry = collectFrom(""" + import os + import os.path + from pandas import DataFrame + from numpy.linalg import norm + from . import local_module + from ..utils import helper + from sys import * + """); + assertThat(telemetry.importedModules()).containsExactlyInAnyOrder("os", "pandas", "numpy", "sys"); + } +} From 0f774bd80f2c33c313aa80fc3ef82ed4f33e6575 Mon Sep 17 00:00:00 2001 From: Nils Werner <64034005+nils-werner-sonarsource@users.noreply.github.com> Date: Mon, 13 Jul 2026 16:57:53 +0200 Subject: [PATCH 210/322] SONARPY-4370 S6785/S6786: recognize set-literal middleware/validation_rules GitOrigin-RevId: e4cfd20b24be13c60d9bc06ece46ff919bbf3533 --- .../checks/GraphQLDenialOfServiceCheck.java | 8 +++--- .../hotspots/GraphQLIntrospectionCheck.java | 8 +++--- .../checks/graphQLDenialOfService.py | 26 +++++++++++++++++++ .../checks/hotspots/graphQLIntrospection.py | 24 ++++++++++++++++- 4 files changed, 57 insertions(+), 9 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/GraphQLDenialOfServiceCheck.java b/python-checks/src/main/java/org/sonar/python/checks/GraphQLDenialOfServiceCheck.java index 21c83e725..0fa3c2f66 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/GraphQLDenialOfServiceCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/GraphQLDenialOfServiceCheck.java @@ -93,8 +93,8 @@ private static boolean hasSafeMiddlewares(List arguments) { } Optional argumentValue = Expressions.ifNameGetSingleAssignedNonNameValue(argument.expression()); - boolean isNotTupleNorListLiteral = argumentValue.filter(a -> a.is(Tree.Kind.LIST_LITERAL, Tree.Kind.TUPLE)).isEmpty(); - return isNotTupleNorListLiteral || Expressions.expressionsFromListOrTuple(argumentValue.get()).stream().anyMatch(GraphQLDenialOfServiceCheck::isSafeMiddlewareName); + boolean isNotCollectionLiteral = argumentValue.filter(a -> a.is(Tree.Kind.LIST_LITERAL, Tree.Kind.TUPLE, Tree.Kind.SET_LITERAL)).isEmpty(); + return isNotCollectionLiteral || Expressions.expressionsFromListOrTuple(argumentValue.get()).stream().anyMatch(GraphQLDenialOfServiceCheck::isSafeMiddlewareName); } private static boolean hasSafeValidationRules(List arguments) { @@ -104,8 +104,8 @@ private static boolean hasSafeValidationRules(List arguments) { } Optional argumentValue = Expressions.ifNameGetSingleAssignedNonNameValue(argument.expression()); - boolean isNotTupleNorListLiteral = argumentValue.filter(a -> a.is(Tree.Kind.LIST_LITERAL, Tree.Kind.TUPLE)).isEmpty(); - return isNotTupleNorListLiteral || Expressions.expressionsFromListOrTuple(argumentValue.get()).stream().anyMatch(GraphQLDenialOfServiceCheck::isSafeValidationRule); + boolean isNotCollectionLiteral = argumentValue.filter(a -> a.is(Tree.Kind.LIST_LITERAL, Tree.Kind.TUPLE, Tree.Kind.SET_LITERAL)).isEmpty(); + return isNotCollectionLiteral || Expressions.expressionsFromListOrTuple(argumentValue.get()).stream().anyMatch(GraphQLDenialOfServiceCheck::isSafeValidationRule); } private static boolean isSafeValidationRule(Expression value) { diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/GraphQLIntrospectionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/GraphQLIntrospectionCheck.java index 7fd2fd6c7..8b4615f07 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/GraphQLIntrospectionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/GraphQLIntrospectionCheck.java @@ -71,8 +71,8 @@ private static boolean hasSafeMiddlewares(List arguments) { } Optional argumentValue = Expressions.ifNameGetSingleAssignedNonNameValue(argument.expression()); - boolean isNotTupleNorListLiteral = argumentValue.filter(a -> a.is(Tree.Kind.LIST_LITERAL, Tree.Kind.TUPLE)).isEmpty(); - return isNotTupleNorListLiteral || Expressions.expressionsFromListOrTuple(argumentValue.get()).stream().anyMatch(GraphQLIntrospectionCheck::isSafeMiddlewareName); + boolean isNotCollectionLiteral = argumentValue.filter(a -> a.is(Tree.Kind.LIST_LITERAL, Tree.Kind.TUPLE, Tree.Kind.SET_LITERAL)).isEmpty(); + return isNotCollectionLiteral || Expressions.expressionsFromListOrTuple(argumentValue.get()).stream().anyMatch(GraphQLIntrospectionCheck::isSafeMiddlewareName); } private static boolean hasSafeValidationRules(List arguments) { @@ -82,8 +82,8 @@ private static boolean hasSafeValidationRules(List arguments) { } Optional argumentValue = Expressions.ifNameGetSingleAssignedNonNameValue(argument.expression()); - boolean isNotTupleNorListLiteral = argumentValue.filter(a -> a.is(Tree.Kind.LIST_LITERAL, Tree.Kind.TUPLE)).isEmpty(); - return isNotTupleNorListLiteral || Expressions.expressionsFromListOrTuple(argumentValue.get()).stream().anyMatch(GraphQLIntrospectionCheck::isSafeValidationRule); + boolean isNotCollectionLiteral = argumentValue.filter(a -> a.is(Tree.Kind.LIST_LITERAL, Tree.Kind.TUPLE, Tree.Kind.SET_LITERAL)).isEmpty(); + return isNotCollectionLiteral || Expressions.expressionsFromListOrTuple(argumentValue.get()).stream().anyMatch(GraphQLIntrospectionCheck::isSafeValidationRule); } private static boolean isSafeValidationRule(Expression value) { diff --git a/python-checks/src/test/resources/checks/graphQLDenialOfService.py b/python-checks/src/test/resources/checks/graphQLDenialOfService.py index 4d373825e..3bc4e831d 100644 --- a/python-checks/src/test/resources/checks/graphQLDenialOfService.py +++ b/python-checks/src/test/resources/checks/graphQLDenialOfService.py @@ -47,6 +47,14 @@ def non_compliant(): ) ) + app.add_url_rule("/api", + view_func=GraphQLView.as_view( # Noncompliant + name="api", + schema=schema, + middleware={UnknownMiddleware} + ) + ) + app.add_url_rule("/api", view_func=GraphQLView.as_view() # Noncompliant ) @@ -121,3 +129,21 @@ def compliant(): schema=schema, validation_rules=some_middleware, # if it is not a list or a tuple we should not raise an issue ) + + app.add_url_rule( + '/compliant/graphql', + view_func=GraphQLView.as_view( # Compliant + 'compliant', + schema=schema, + middleware={DepthProtectionMiddleware} # Safe middleware, set literal + ) + ) + + app.add_url_rule( + '/compliant/graphql', + view_func=GraphQLView.as_view( # Compliant + 'compliant', + schema=schema, + validation_rules={DepthLimitValidator} # Safe validation rules, set literal + ) + ) diff --git a/python-checks/src/test/resources/checks/hotspots/graphQLIntrospection.py b/python-checks/src/test/resources/checks/hotspots/graphQLIntrospection.py index 8711fa55e..1d81c1872 100644 --- a/python-checks/src/test/resources/checks/hotspots/graphQLIntrospection.py +++ b/python-checks/src/test/resources/checks/hotspots/graphQLIntrospection.py @@ -173,6 +173,14 @@ def flask_graphql_validation_rules_non_compliant(schema, some_rule): validation_rules=[some_rule] ) + GraphQLView.as_view( # Noncompliant +# ^^^^^^^^^^^^^^^^^^^ + name="introspection", + schema=schema, + graphiql=True, + validation_rules={some_rule} + ) + class UnsafeCustomMiddleware: ... my_custom_middleware = UnsafeCustomMiddleware() @@ -185,7 +193,7 @@ class UnsafeCustomMiddleware: middleware=[my_custom_middleware] ) -def flask_graphql_validation_rules_compliant(schema, some_rule, some_middleware, introspection_rule): +def flask_graphql_validation_rules_compliant(schema, some_rule, some_middleware, introspection_rule, introspection_middleware): from flask_graphql import GraphQLView import graphene from graphene.validation import DisableIntrospection @@ -230,6 +238,20 @@ def flask_graphql_validation_rules_compliant(schema, some_rule, some_middleware, validation_rules=[introspection_rule] ) + GraphQLView.as_view( + name="introspection", + schema=schema, + graphiql=True, + validation_rules={DisableIntrospection, some_rule} + ) + + GraphQLView.as_view( + name="introspection", + schema=schema, + graphiql=True, + middleware={introspection_middleware} + ) + def graphql_server_middleware_non_compliant(schema, some_middleware, CustomBackend, format_custom_error, some_module): from graphql_server.flask import GraphQLView From 3ddb46998dea7f5e93cad98c17b7b83871eaa293 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 14 Jul 2026 00:41:23 +0200 Subject: [PATCH 211/322] Update sonarqube Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Victor Diez GitOrigin-RevId: 10552067c83d11257dd472483936ad9776342f8a --- pom.xml | 17 +++++++++-- python-commons/pom.xml | 10 +++++++ .../python/DependencyTelemetrySensorTest.java | 4 +-- .../python/GeneratedIPythonFileTest.java | 2 +- .../sonar/plugins/python/IPynbSensorTest.java | 14 ++++----- .../plugins/python/MockSonarLintIssue.java | 30 ++++++++++++++++++- .../python/NewSymbolsCollectorTest.java | 10 +++---- .../plugins/python/PythonHighlighterTest.java | 6 ++-- .../plugins/python/PythonSensorTest.java | 20 ++++++------- .../org/sonar/plugins/python/TestUtils.java | 2 +- .../python/bandit/BanditSensorTest.java | 6 ++-- .../coverage/PythonCoverageSensorTest.java | 10 +++---- .../python/cpd/PythonCpdAnalyzerTest.java | 8 ++--- .../dependency/DependencyTelemetryTest.java | 4 +-- .../dependency/PyProjectTomlParserTest.java | 2 +- .../dependency/RequirementsTxtParserTest.java | 4 +-- .../python/flake8/Flake8SensorTest.java | 6 ++-- .../indexer/SonarLintPythonIndexerTest.java | 4 +-- .../indexer/SonarQubePythonIndexerTest.java | 2 +- .../plugins/python/mypy/MypySensorTest.java | 6 ++-- .../python/pylint/PylintSensorTest.java | 6 ++-- .../plugins/python/ruff/RuffSensorTest.java | 6 ++-- .../telemetry/SensorTelemetryStorageTest.java | 2 +- .../python/xunit/PythonXUnitSensorTest.java | 8 ++--- python-frontend/pom.xml | 5 ++++ .../python/IpynbNotebookParserTest.java | 2 +- .../python/PythonInputFileImplTest.java | 2 +- .../org/sonar/python/IssueLocationTest.java | 2 +- 28 files changed, 128 insertions(+), 72 deletions(-) diff --git a/pom.xml b/pom.xml index c17f2c278..43d599ad4 100644 --- a/pom.xml +++ b/pom.xml @@ -100,8 +100,9 @@ at SonarSource/sonarqube/gradle.properties --> Python Enterprise - 26.2.0.119303 - 13.0.0.3026 + 26.7.0.124771 + 13.8.0.4399 + 13.4.0.3968 6.1.0.3962 2.25.0.4954 @@ -235,6 +236,18 @@ ${sonar.version} test + + org.sonarsource.scanner.engine + plugin-api-scanner-impl + ${scanner-engine.version} + test + + + org.sonarsource.scanner.engine + sensor-test-fixtures + ${scanner-engine.version} + test + org.sonarsource.sslr sslr-testing-harness diff --git a/python-commons/pom.xml b/python-commons/pom.xml index 3486bfec1..058113518 100644 --- a/python-commons/pom.xml +++ b/python-commons/pom.xml @@ -100,6 +100,16 @@ sonar-plugin-api-test-fixtures test + + org.sonarsource.scanner.engine + plugin-api-scanner-impl + test + + + org.sonarsource.scanner.engine + sensor-test-fixtures + test + org.junit.jupiter junit-jupiter diff --git a/python-commons/src/test/java/org/sonar/plugins/python/DependencyTelemetrySensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/DependencyTelemetrySensorTest.java index ac11f5fc6..54b57a348 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/DependencyTelemetrySensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/DependencyTelemetrySensorTest.java @@ -18,8 +18,8 @@ import java.nio.file.Paths; import org.junit.jupiter.api.Test; -import org.sonar.api.batch.sensor.internal.DefaultSensorDescriptor; -import org.sonar.api.batch.sensor.internal.SensorContextTester; +import org.sonar.scanner.plugin.api.impl.sensor.DefaultSensorDescriptor; +import com.sonarsource.scanner.engine.sensor.test.fixtures.SensorContextTester; import org.sonar.plugins.python.telemetry.TelemetryMetricKey; import static org.assertj.core.api.Assertions.assertThat; diff --git a/python-commons/src/test/java/org/sonar/plugins/python/GeneratedIPythonFileTest.java b/python-commons/src/test/java/org/sonar/plugins/python/GeneratedIPythonFileTest.java index 8aea15d8d..d529f5f0e 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/GeneratedIPythonFileTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/GeneratedIPythonFileTest.java @@ -20,7 +20,7 @@ import java.util.Map; import org.junit.jupiter.api.Test; import org.sonar.api.batch.fs.InputFile; -import org.sonar.api.batch.fs.internal.TestInputFileBuilder; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; import org.sonar.plugins.python.PythonInputFile.Kind; import static org.assertj.core.api.Assertions.assertThat; diff --git a/python-commons/src/test/java/org/sonar/plugins/python/IPynbSensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/IPynbSensorTest.java index ef69f854c..fc7cf0260 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/IPynbSensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/IPynbSensorTest.java @@ -27,15 +27,15 @@ import org.slf4j.event.Level; import org.sonar.api.SonarRuntime; import org.sonar.api.batch.fs.InputFile; -import org.sonar.api.batch.fs.internal.TestInputFileBuilder; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; import org.sonar.api.batch.rule.ActiveRules; import org.sonar.api.batch.rule.CheckFactory; -import org.sonar.api.batch.rule.internal.ActiveRulesBuilder; -import org.sonar.api.batch.rule.internal.NewActiveRule; -import org.sonar.api.batch.sensor.cpd.internal.TokensLine; -import org.sonar.api.batch.sensor.internal.DefaultSensorDescriptor; -import org.sonar.api.batch.sensor.internal.SensorContextTester; -import org.sonar.api.config.internal.MapSettings; +import org.sonar.scanner.plugin.api.impl.rule.ActiveRulesBuilder; +import org.sonar.scanner.plugin.api.impl.rule.NewActiveRule; +import org.sonar.duplications.internal.pmd.TokensLine; +import org.sonar.scanner.plugin.api.impl.sensor.DefaultSensorDescriptor; +import com.sonarsource.scanner.engine.sensor.test.fixtures.SensorContextTester; +import org.sonar.scanner.plugin.api.impl.config.MapSettings; import org.sonar.api.internal.SonarRuntimeImpl; import org.sonar.api.issue.NoSonarFilter; import org.sonar.api.measures.CoreMetrics; diff --git a/python-commons/src/test/java/org/sonar/plugins/python/MockSonarLintIssue.java b/python-commons/src/test/java/org/sonar/plugins/python/MockSonarLintIssue.java index a1ee7657e..ef1e9d2a4 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/MockSonarLintIssue.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/MockSonarLintIssue.java @@ -22,7 +22,7 @@ import java.util.stream.StreamSupport; import javax.annotation.Nullable; import org.sonar.api.batch.rule.Severity; -import org.sonar.api.batch.sensor.internal.SensorContextTester; +import com.sonarsource.scanner.engine.sensor.test.fixtures.SensorContextTester; import org.sonar.api.batch.sensor.issue.Issue; import org.sonar.api.batch.sensor.issue.IssueLocation; import org.sonar.api.batch.sensor.issue.NewIssue; @@ -40,6 +40,7 @@ class MockSonarLintIssue implements NewIssue, Issue { private boolean isQuickFixAvailable = false; @Nullable private List codeVariants = null; + private List internalTags = List.of(); private boolean saved; MockSonarLintIssue(SensorContextTester context) { @@ -105,6 +106,28 @@ public NewIssue addFlow(Iterable iterable, FlowType flowType, return null; } + @Override + public NewIssue setInternalTags(java.util.Collection internalTags) { + this.internalTags = List.copyOf(internalTags); + return this; + } + + @Override + public NewIssue addInternalTag(String internalTag) { + var tags = new java.util.ArrayList<>(internalTags); + tags.add(internalTag); + internalTags = List.copyOf(tags); + return this; + } + + @Override + public NewIssue addInternalTags(java.util.Collection internalTags) { + var tags = new java.util.ArrayList<>(this.internalTags); + tags.addAll(internalTags); + this.internalTags = List.copyOf(tags); + return this; + } + @Override public NewIssueLocation newLocation() { return parent.newLocation(); @@ -168,6 +191,11 @@ public List codeVariants() { return codeVariants; } + @Override + public List internalTags() { + return internalTags; + } + @Override public NewIssue setRuleDescriptionContextKey(String ruleDescriptionContextKey) { return this; diff --git a/python-commons/src/test/java/org/sonar/plugins/python/NewSymbolsCollectorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/NewSymbolsCollectorTest.java index c4541fc1f..49a9f1028 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/NewSymbolsCollectorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/NewSymbolsCollectorTest.java @@ -23,11 +23,11 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.sonar.api.batch.fs.TextRange; -import org.sonar.api.batch.fs.internal.DefaultInputFile; -import org.sonar.api.batch.fs.internal.DefaultTextPointer; -import org.sonar.api.batch.fs.internal.DefaultTextRange; -import org.sonar.api.batch.fs.internal.TestInputFileBuilder; -import org.sonar.api.batch.sensor.internal.SensorContextTester; +import org.sonar.scanner.plugin.api.impl.fs.DefaultInputFile; +import org.sonar.scanner.plugin.api.impl.fs.DefaultTextPointer; +import org.sonar.scanner.plugin.api.impl.fs.DefaultTextRange; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; +import com.sonarsource.scanner.engine.sensor.test.fixtures.SensorContextTester; import org.sonar.python.TestPythonVisitorRunner; import static org.assertj.core.api.Assertions.assertThat; diff --git a/python-commons/src/test/java/org/sonar/plugins/python/PythonHighlighterTest.java b/python-commons/src/test/java/org/sonar/plugins/python/PythonHighlighterTest.java index efaaaffac..31b120a94 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/PythonHighlighterTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/PythonHighlighterTest.java @@ -23,10 +23,10 @@ import javax.annotation.Nullable; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.sonar.api.batch.fs.internal.DefaultInputFile; -import org.sonar.api.batch.fs.internal.TestInputFileBuilder; +import org.sonar.scanner.plugin.api.impl.fs.DefaultInputFile; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; import org.sonar.api.batch.sensor.highlighting.TypeOfText; -import org.sonar.api.batch.sensor.internal.SensorContextTester; +import com.sonarsource.scanner.engine.sensor.test.fixtures.SensorContextTester; import org.sonar.python.IPythonLocation; import org.sonar.python.TestPythonVisitorRunner; import org.sonar.python.caching.CacheContextImpl; diff --git a/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java index 3ce68814d..04ba851fe 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java @@ -49,24 +49,24 @@ import org.sonar.api.batch.fs.InputFile.Type; import org.sonar.api.batch.fs.TextPointer; import org.sonar.api.batch.fs.TextRange; -import org.sonar.api.batch.fs.internal.DefaultInputFile; -import org.sonar.api.batch.fs.internal.DefaultTextPointer; -import org.sonar.api.batch.fs.internal.DefaultTextRange; -import org.sonar.api.batch.fs.internal.TestInputFileBuilder; +import org.sonar.scanner.plugin.api.impl.fs.DefaultInputFile; +import org.sonar.scanner.plugin.api.impl.fs.DefaultTextPointer; +import org.sonar.scanner.plugin.api.impl.fs.DefaultTextRange; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; import org.sonar.api.batch.rule.ActiveRules; import org.sonar.api.batch.rule.CheckFactory; -import org.sonar.api.batch.rule.internal.ActiveRulesBuilder; -import org.sonar.api.batch.rule.internal.NewActiveRule; -import org.sonar.api.batch.sensor.cpd.internal.TokensLine; +import org.sonar.scanner.plugin.api.impl.rule.ActiveRulesBuilder; +import org.sonar.scanner.plugin.api.impl.rule.NewActiveRule; +import org.sonar.duplications.internal.pmd.TokensLine; import org.sonar.api.batch.sensor.error.AnalysisError; -import org.sonar.api.batch.sensor.internal.DefaultSensorDescriptor; -import org.sonar.api.batch.sensor.internal.SensorContextTester; +import org.sonar.scanner.plugin.api.impl.sensor.DefaultSensorDescriptor; +import com.sonarsource.scanner.engine.sensor.test.fixtures.SensorContextTester; import org.sonar.api.batch.sensor.issue.Issue; import org.sonar.api.batch.sensor.issue.IssueLocation; import org.sonar.api.batch.sensor.issue.fix.NewQuickFix; import org.sonar.api.batch.sensor.issue.fix.QuickFix; import org.sonar.api.batch.sensor.issue.fix.TextEdit; -import org.sonar.api.config.internal.MapSettings; +import org.sonar.scanner.plugin.api.impl.config.MapSettings; import org.sonar.api.internal.SonarRuntimeImpl; import org.sonar.api.issue.NoSonarFilter; import org.sonar.api.measures.CoreMetrics; diff --git a/python-commons/src/test/java/org/sonar/plugins/python/TestUtils.java b/python-commons/src/test/java/org/sonar/plugins/python/TestUtils.java index d67cecbaf..80b3ffb50 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/TestUtils.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/TestUtils.java @@ -25,7 +25,7 @@ import org.sonar.api.SonarQubeSide; import org.sonar.api.SonarRuntime; import org.sonar.api.batch.fs.InputFile; -import org.sonar.api.batch.fs.internal.TestInputFileBuilder; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; import org.sonar.api.internal.SonarRuntimeImpl; import org.sonar.api.utils.Version; diff --git a/python-commons/src/test/java/org/sonar/plugins/python/bandit/BanditSensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/bandit/BanditSensorTest.java index c275dd85e..09f5e6e7f 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/bandit/BanditSensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/bandit/BanditSensorTest.java @@ -31,10 +31,10 @@ import org.sonar.api.SonarQubeSide; import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.fs.TextRange; -import org.sonar.api.batch.fs.internal.TestInputFileBuilder; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; import org.sonar.api.batch.rule.Severity; -import org.sonar.api.batch.sensor.internal.DefaultSensorDescriptor; -import org.sonar.api.batch.sensor.internal.SensorContextTester; +import org.sonar.scanner.plugin.api.impl.sensor.DefaultSensorDescriptor; +import com.sonarsource.scanner.engine.sensor.test.fixtures.SensorContextTester; import org.sonar.api.batch.sensor.issue.ExternalIssue; import org.sonar.api.batch.sensor.issue.IssueLocation; import org.sonar.api.internal.SonarRuntimeImpl; diff --git a/python-commons/src/test/java/org/sonar/plugins/python/coverage/PythonCoverageSensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/coverage/PythonCoverageSensorTest.java index 5017046f7..83fbcb31f 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/coverage/PythonCoverageSensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/coverage/PythonCoverageSensorTest.java @@ -31,11 +31,11 @@ import org.slf4j.event.Level; import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.fs.InputFile.Type; -import org.sonar.api.batch.fs.internal.DefaultInputFile; -import org.sonar.api.batch.fs.internal.TestInputFileBuilder; -import org.sonar.api.batch.sensor.internal.DefaultSensorDescriptor; -import org.sonar.api.batch.sensor.internal.SensorContextTester; -import org.sonar.api.config.internal.MapSettings; +import org.sonar.scanner.plugin.api.impl.fs.DefaultInputFile; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; +import org.sonar.scanner.plugin.api.impl.sensor.DefaultSensorDescriptor; +import com.sonarsource.scanner.engine.sensor.test.fixtures.SensorContextTester; +import org.sonar.scanner.plugin.api.impl.config.MapSettings; import org.sonar.api.testfixtures.log.LogTesterJUnit5; import org.sonar.plugins.python.PythonReportSensor; import org.sonar.plugins.python.TestUtils; diff --git a/python-commons/src/test/java/org/sonar/plugins/python/cpd/PythonCpdAnalyzerTest.java b/python-commons/src/test/java/org/sonar/plugins/python/cpd/PythonCpdAnalyzerTest.java index daa24d712..d463773d7 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/cpd/PythonCpdAnalyzerTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/cpd/PythonCpdAnalyzerTest.java @@ -23,10 +23,10 @@ import java.util.concurrent.locks.ReentrantLock; import org.junit.jupiter.api.Test; import org.sonar.api.batch.fs.InputFile; -import org.sonar.api.batch.fs.internal.DefaultInputFile; -import org.sonar.api.batch.fs.internal.TestInputFileBuilder; -import org.sonar.api.batch.sensor.cpd.internal.TokensLine; -import org.sonar.api.batch.sensor.internal.SensorContextTester; +import org.sonar.scanner.plugin.api.impl.fs.DefaultInputFile; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; +import org.sonar.duplications.internal.pmd.TokensLine; +import com.sonarsource.scanner.engine.sensor.test.fixtures.SensorContextTester; import org.sonar.plugins.python.Python; import org.sonar.plugins.python.TestUtils; import org.sonar.plugins.python.api.PythonVisitorContext; diff --git a/python-commons/src/test/java/org/sonar/plugins/python/dependency/DependencyTelemetryTest.java b/python-commons/src/test/java/org/sonar/plugins/python/dependency/DependencyTelemetryTest.java index 60cf30839..b4638f607 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/dependency/DependencyTelemetryTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/dependency/DependencyTelemetryTest.java @@ -25,8 +25,8 @@ import org.junit.jupiter.api.Test; import org.mockito.ArgumentMatcher; import org.sonar.api.batch.fs.InputFile; -import org.sonar.api.batch.fs.internal.TestInputFileBuilder; -import org.sonar.api.batch.sensor.internal.SensorContextTester; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; +import com.sonarsource.scanner.engine.sensor.test.fixtures.SensorContextTester; import org.sonar.plugins.python.telemetry.SensorTelemetryStorage; import org.sonar.plugins.python.telemetry.TelemetryMetricKey; diff --git a/python-commons/src/test/java/org/sonar/plugins/python/dependency/PyProjectTomlParserTest.java b/python-commons/src/test/java/org/sonar/plugins/python/dependency/PyProjectTomlParserTest.java index 777002c05..b2707db66 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/dependency/PyProjectTomlParserTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/dependency/PyProjectTomlParserTest.java @@ -22,7 +22,7 @@ import org.assertj.core.api.Assertions; import org.assertj.core.api.ObjectAssert; import org.junit.jupiter.api.Test; -import org.sonar.api.batch.fs.internal.TestInputFileBuilder; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; import org.sonar.plugins.python.dependency.model.Dependencies; import org.sonar.plugins.python.dependency.model.Dependency; diff --git a/python-commons/src/test/java/org/sonar/plugins/python/dependency/RequirementsTxtParserTest.java b/python-commons/src/test/java/org/sonar/plugins/python/dependency/RequirementsTxtParserTest.java index 709e5698c..dbe0b744b 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/dependency/RequirementsTxtParserTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/dependency/RequirementsTxtParserTest.java @@ -21,8 +21,8 @@ import java.io.IOException; import java.nio.file.Path; import org.junit.jupiter.api.Test; -import org.sonar.api.batch.fs.internal.DefaultInputFile; -import org.sonar.api.batch.fs.internal.TestInputFileBuilder; +import org.sonar.scanner.plugin.api.impl.fs.DefaultInputFile; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; import org.sonar.plugins.python.TestUtils; import org.sonar.plugins.python.dependency.model.Dependencies; import org.sonar.plugins.python.dependency.model.Dependency; diff --git a/python-commons/src/test/java/org/sonar/plugins/python/flake8/Flake8SensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/flake8/Flake8SensorTest.java index b79e75ce3..56675e1bb 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/flake8/Flake8SensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/flake8/Flake8SensorTest.java @@ -31,10 +31,10 @@ import org.sonar.api.SonarQubeSide; import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.fs.TextRange; -import org.sonar.api.batch.fs.internal.TestInputFileBuilder; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; import org.sonar.api.batch.rule.Severity; -import org.sonar.api.batch.sensor.internal.DefaultSensorDescriptor; -import org.sonar.api.batch.sensor.internal.SensorContextTester; +import org.sonar.scanner.plugin.api.impl.sensor.DefaultSensorDescriptor; +import com.sonarsource.scanner.engine.sensor.test.fixtures.SensorContextTester; import org.sonar.api.batch.sensor.issue.ExternalIssue; import org.sonar.api.batch.sensor.issue.IssueLocation; import org.sonar.api.internal.SonarRuntimeImpl; diff --git a/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarLintPythonIndexerTest.java b/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarLintPythonIndexerTest.java index 955efb9a6..5d54031c8 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarLintPythonIndexerTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarLintPythonIndexerTest.java @@ -30,8 +30,8 @@ import org.junit.jupiter.api.extension.RegisterExtension; import org.slf4j.event.Level; import org.sonar.api.batch.fs.InputFile; -import org.sonar.api.batch.fs.internal.TestInputFileBuilder; -import org.sonar.api.batch.sensor.internal.SensorContextTester; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; +import com.sonarsource.scanner.engine.sensor.test.fixtures.SensorContextTester; import org.sonar.api.testfixtures.log.LogTesterJUnit5; import org.sonar.plugins.python.Python; import org.sonar.plugins.python.PythonInputFile; diff --git a/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexerTest.java b/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexerTest.java index 3e2ca04ed..553165a67 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexerTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexerTest.java @@ -33,7 +33,7 @@ import org.slf4j.event.Level; import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.sensor.SensorContext; -import org.sonar.api.batch.sensor.internal.SensorContextTester; +import com.sonarsource.scanner.engine.sensor.test.fixtures.SensorContextTester; import org.sonar.api.testfixtures.log.LogTesterJUnit5; import org.sonar.plugins.python.PythonInputFile; import org.sonar.plugins.python.api.caching.PythonReadCache; diff --git a/python-commons/src/test/java/org/sonar/plugins/python/mypy/MypySensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/mypy/MypySensorTest.java index 16b894d4e..711c2f21d 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/mypy/MypySensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/mypy/MypySensorTest.java @@ -32,10 +32,10 @@ import org.sonar.api.SonarRuntime; import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.fs.TextRange; -import org.sonar.api.batch.fs.internal.TestInputFileBuilder; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; import org.sonar.api.batch.rule.Severity; -import org.sonar.api.batch.sensor.internal.DefaultSensorDescriptor; -import org.sonar.api.batch.sensor.internal.SensorContextTester; +import org.sonar.scanner.plugin.api.impl.sensor.DefaultSensorDescriptor; +import com.sonarsource.scanner.engine.sensor.test.fixtures.SensorContextTester; import org.sonar.api.batch.sensor.issue.ExternalIssue; import org.sonar.api.batch.sensor.issue.IssueLocation; import org.sonar.api.internal.SonarRuntimeImpl; diff --git a/python-commons/src/test/java/org/sonar/plugins/python/pylint/PylintSensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/pylint/PylintSensorTest.java index 18ea07820..35d636be6 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/pylint/PylintSensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/pylint/PylintSensorTest.java @@ -31,10 +31,10 @@ import org.sonar.api.SonarQubeSide; import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.fs.TextRange; -import org.sonar.api.batch.fs.internal.TestInputFileBuilder; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; import org.sonar.api.batch.rule.Severity; -import org.sonar.api.batch.sensor.internal.DefaultSensorDescriptor; -import org.sonar.api.batch.sensor.internal.SensorContextTester; +import org.sonar.scanner.plugin.api.impl.sensor.DefaultSensorDescriptor; +import com.sonarsource.scanner.engine.sensor.test.fixtures.SensorContextTester; import org.sonar.api.batch.sensor.issue.ExternalIssue; import org.sonar.api.batch.sensor.issue.IssueLocation; import org.sonar.api.internal.SonarRuntimeImpl; diff --git a/python-commons/src/test/java/org/sonar/plugins/python/ruff/RuffSensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/ruff/RuffSensorTest.java index 779a343be..05d6fdd65 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/ruff/RuffSensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/ruff/RuffSensorTest.java @@ -31,10 +31,10 @@ import org.sonar.api.SonarQubeSide; import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.fs.TextRange; -import org.sonar.api.batch.fs.internal.TestInputFileBuilder; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; import org.sonar.api.batch.rule.Severity; -import org.sonar.api.batch.sensor.internal.DefaultSensorDescriptor; -import org.sonar.api.batch.sensor.internal.SensorContextTester; +import org.sonar.scanner.plugin.api.impl.sensor.DefaultSensorDescriptor; +import com.sonarsource.scanner.engine.sensor.test.fixtures.SensorContextTester; import org.sonar.api.batch.sensor.issue.ExternalIssue; import org.sonar.api.batch.sensor.issue.IssueLocation; import org.sonar.api.internal.SonarRuntimeImpl; diff --git a/python-commons/src/test/java/org/sonar/plugins/python/telemetry/SensorTelemetryStorageTest.java b/python-commons/src/test/java/org/sonar/plugins/python/telemetry/SensorTelemetryStorageTest.java index 3e28e9474..c01d5c4bc 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/telemetry/SensorTelemetryStorageTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/telemetry/SensorTelemetryStorageTest.java @@ -24,7 +24,7 @@ import org.sonar.api.SonarEdition; import org.sonar.api.SonarQubeSide; import org.sonar.api.batch.sensor.SensorContext; -import org.sonar.api.batch.sensor.internal.SensorContextTester; +import com.sonarsource.scanner.engine.sensor.test.fixtures.SensorContextTester; import org.sonar.api.internal.SonarRuntimeImpl; import org.sonar.api.testfixtures.log.LogTesterJUnit5; import org.sonar.api.utils.Version; diff --git a/python-commons/src/test/java/org/sonar/plugins/python/xunit/PythonXUnitSensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/xunit/PythonXUnitSensorTest.java index ddad326b0..af39fe0eb 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/xunit/PythonXUnitSensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/xunit/PythonXUnitSensorTest.java @@ -22,10 +22,10 @@ import org.junit.jupiter.api.extension.RegisterExtension; import org.slf4j.event.Level; import org.sonar.api.batch.fs.InputComponent; -import org.sonar.api.batch.fs.internal.DefaultFileSystem; -import org.sonar.api.batch.fs.internal.DefaultInputFile; -import org.sonar.api.batch.fs.internal.TestInputFileBuilder; -import org.sonar.api.batch.sensor.internal.SensorContextTester; +import org.sonar.scanner.plugin.api.impl.fs.DefaultFileSystem; +import org.sonar.scanner.plugin.api.impl.fs.DefaultInputFile; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; +import com.sonarsource.scanner.engine.sensor.test.fixtures.SensorContextTester; import org.sonar.api.config.internal.ConfigurationBridge; import org.sonar.api.config.internal.MapSettings; import org.sonar.api.measures.CoreMetrics; diff --git a/python-frontend/pom.xml b/python-frontend/pom.xml index 30f1f47c4..6201646c1 100644 --- a/python-frontend/pom.xml +++ b/python-frontend/pom.xml @@ -37,6 +37,11 @@ sonar-plugin-api-test-fixtures test + + org.sonarsource.scanner.engine + sensor-test-fixtures + test + org.junit.jupiter diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/IpynbNotebookParserTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/IpynbNotebookParserTest.java index 937d9fd77..01934ccbb 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/IpynbNotebookParserTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/IpynbNotebookParserTest.java @@ -26,7 +26,7 @@ import org.junit.jupiter.api.extension.RegisterExtension; import org.slf4j.event.Level; import org.sonar.api.batch.fs.InputFile; -import org.sonar.api.batch.fs.internal.TestInputFileBuilder; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; import org.sonar.api.internal.apachecommons.lang3.StringUtils; import org.sonar.api.testfixtures.log.LogTesterJUnit5; import org.sonar.python.IPythonLocation; diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/PythonInputFileImplTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/PythonInputFileImplTest.java index cf3cf625b..00b428a41 100755 --- a/python-frontend/src/test/java/org/sonar/plugins/python/PythonInputFileImplTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/PythonInputFileImplTest.java @@ -19,7 +19,7 @@ import java.io.IOException; import org.junit.jupiter.api.Test; import org.sonar.api.batch.fs.InputFile; -import org.sonar.api.batch.fs.internal.TestInputFileBuilder; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; import org.sonar.plugins.python.PythonInputFile.Kind; import static org.assertj.core.api.Assertions.assertThat; diff --git a/python-frontend/src/test/java/org/sonar/python/IssueLocationTest.java b/python-frontend/src/test/java/org/sonar/python/IssueLocationTest.java index d1f129ffc..32ba31021 100644 --- a/python-frontend/src/test/java/org/sonar/python/IssueLocationTest.java +++ b/python-frontend/src/test/java/org/sonar/python/IssueLocationTest.java @@ -20,7 +20,7 @@ import java.util.List; import java.util.Map; import org.junit.jupiter.api.Test; -import org.sonar.api.batch.fs.internal.TestInputFileBuilder; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; import org.sonar.plugins.python.GeneratedIPythonFile; import org.sonar.plugins.python.PythonInputFile; import org.sonar.plugins.python.SonarQubePythonFile; From 8d601da099cbe7fb307d4582d1c2b526053c5697 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 14 Jul 2026 02:15:39 +0200 Subject: [PATCH 212/322] Update SL core to v11 Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Victor Diez GitOrigin-RevId: ff546e41d4524dcf7a2fabf04e163bdef11a7a87 --- its/plugin/it-python-plugin-test/pom.xml | 22 +- .../it/plugin/SonarLintBackendTestUtils.java | 150 +++++++++++++ .../it/plugin/SonarLintIPythonTest.java | 201 +++--------------- .../sonar/python/it/plugin/SonarLintTest.java | 193 +++-------------- mise.test-and-analyze.toml | 2 +- pom.xml | 2 +- 6 files changed, 225 insertions(+), 345 deletions(-) create mode 100644 its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/SonarLintBackendTestUtils.java diff --git a/its/plugin/it-python-plugin-test/pom.xml b/its/plugin/it-python-plugin-test/pom.xml index 4d50bf299..83341a581 100644 --- a/its/plugin/it-python-plugin-test/pom.xml +++ b/its/plugin/it-python-plugin-test/pom.xml @@ -35,7 +35,21 @@ org.sonarsource.sonarlint.core - sonarlint-core + sonarlint-core-test-utils + ${sonarlint-core.version} + test + + + org.sonarsource.sonarlint.core + sonarlint-rpc-protocol + ${sonarlint-core.version} + test + + + + com.fasterxml.jackson.core + jackson-annotations + 2.21 test @@ -60,6 +74,12 @@ ${sonar.version} test + + org.awaitility + awaitility + 4.3.0 + test + org.sonarsource.orchestrator sonar-orchestrator-junit5 diff --git a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/SonarLintBackendTestUtils.java b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/SonarLintBackendTestUtils.java new file mode 100644 index 000000000..ed8154f19 --- /dev/null +++ b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/SonarLintBackendTestUtils.java @@ -0,0 +1,150 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package com.sonar.python.it.plugin; + +import static org.awaitility.Awaitility.await; + +import com.sonar.python.it.PluginLocator; +import java.io.IOException; +import java.io.UncheckedIOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.time.Duration; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Consumer; +import java.util.stream.Collectors; +import java.util.regex.Pattern; +import org.sonarsource.sonarlint.core.rpc.protocol.backend.file.DidOpenFileParams; +import org.sonarsource.sonarlint.core.rpc.protocol.backend.rules.StandaloneRuleConfigDto; +import org.sonarsource.sonarlint.core.rpc.protocol.backend.rules.UpdateStandaloneRulesConfigurationParams; +import org.sonarsource.sonarlint.core.rpc.protocol.client.issue.RaisedIssueDto; +import org.sonarsource.sonarlint.core.rpc.protocol.common.ClientFileDto; +import org.sonarsource.sonarlint.core.rpc.protocol.common.Language; +import org.sonarsource.sonarlint.core.test.utils.SonarLintBackendFixture; +import org.sonarsource.sonarlint.core.test.utils.SonarLintTestRpcServer; +import org.sonarsource.sonarlint.core.test.utils.junit5.SonarLintTestHarness; +import org.sonarsource.sonarlint.core.test.utils.plugins.Plugin; + +final class SonarLintBackendTestUtils { + + static final String CONFIG_SCOPE_ID = "python-sonarlint-test"; + private static final Duration TIMEOUT = Duration.ofSeconds(15); + + private SonarLintBackendTestUtils() { + // utility class + } + + static ClientFileDto writeFile(Path baseDir, String relativePath, String content, Language language) { + var filePath = baseDir.resolve(relativePath); + try { + Files.createDirectories(filePath.getParent()); + Files.writeString(filePath, content, StandardCharsets.UTF_8); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + return clientFile(baseDir, filePath, language); + } + + static ClientFileDto copyFile(Path baseDir, Path sourceFile, String relativePath, Language language) { + var targetPath = baseDir.resolve(relativePath); + try { + Files.createDirectories(targetPath.getParent()); + Files.copy(sourceFile, targetPath); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + return clientFile(baseDir, targetPath, language); + } + + static SonarLintBackendFixture.FakeSonarLintRpcClient createClient(SonarLintTestHarness harness, Path baseDir, ClientFileDto... inputFiles) { + return harness.newFakeClient() + .withInitialFs(CONFIG_SCOPE_ID, baseDir, List.of(inputFiles)) + .build(); + } + + static SonarLintTestRpcServer startBackend(SonarLintTestHarness harness, SonarLintBackendFixture.FakeSonarLintRpcClient client, + Set languages, Set activeRuleKeys) { + var backend = harness.newBackend() + .withStandaloneEmbeddedPluginAndEnabledLanguage(new Plugin(languages, pythonPluginLocation(), "", "")) + .withUnboundConfigScope(CONFIG_SCOPE_ID) + .start(client); + + var rulesByKey = backend.getRulesService().listAllStandaloneRulesDefinitions().join().getRulesByKey(); + if (!rulesByKey.keySet().containsAll(activeRuleKeys)) { + throw new IllegalStateException("Missing standalone SonarLint rules: " + activeRuleKeys.stream() + .filter(ruleKey -> !rulesByKey.containsKey(ruleKey)) + .toList()); + } + + var ruleConfigByKey = rulesByKey.values().stream() + .filter(rule -> languages.contains(rule.getLanguage())) + .collect(Collectors.toMap( + rule -> rule.getKey(), + rule -> new StandaloneRuleConfigDto(activeRuleKeys.contains(rule.getKey()), Map.of()))); + backend.getRulesService().updateStandaloneRulesConfiguration(new UpdateStandaloneRulesConfigurationParams(ruleConfigByKey)); + return backend; + } + + static void openFile(SonarLintTestRpcServer backend, ClientFileDto inputFile) { + backend.getFileService().didOpenFile(new DidOpenFileParams(CONFIG_SCOPE_ID, inputFile.getUri())); + } + + static void awaitIssues(SonarLintBackendFixture.FakeSonarLintRpcClient client, + Consumer>> assertion) { + await() + .atMost(TIMEOUT) + .untilAsserted(() -> assertion.accept(client.getRaisedIssuesForScopeId(CONFIG_SCOPE_ID))); + } + + private static ClientFileDto clientFile(Path baseDir, Path filePath, Language language) { + var absoluteBaseDir = baseDir.toAbsolutePath().normalize(); + var absoluteFilePath = filePath.toAbsolutePath().normalize(); + return new ClientFileDto( + absoluteFilePath.toUri(), + absoluteBaseDir.relativize(absoluteFilePath), + CONFIG_SCOPE_ID, + false, + StandardCharsets.UTF_8.name(), + absoluteFilePath, + null, + language, + true); + } + + private static Path pythonPluginLocation() { + return PluginLocator.isEnterpriseTest() + ? findPluginArtifact(Path.of("../../../private/sonar-python-enterprise-plugin/target"), + Pattern.compile("sonar-python-enterprise-plugin-[0-9.]*(?:-SNAPSHOT)?\\.jar")) + : findPluginArtifact(Path.of("../../../sonar-python-plugin/target"), + Pattern.compile("sonar-python-plugin-[0-9.]*(?:-SNAPSHOT)?\\.jar")); + } + + private static Path findPluginArtifact(Path targetDir, Pattern filenamePattern) { + var absoluteTargetDir = targetDir.toAbsolutePath().normalize(); + try (var entries = Files.list(absoluteTargetDir)) { + return entries + .filter(path -> filenamePattern.matcher(path.getFileName().toString()).matches()) + .findFirst() + .orElseThrow(() -> new IllegalStateException("Cannot find plugin artifact in " + absoluteTargetDir)); + } catch (IOException e) { + throw new UncheckedIOException("Failed to resolve plugin artifact from " + absoluteTargetDir, e); + } + } +} diff --git a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/SonarLintIPythonTest.java b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/SonarLintIPythonTest.java index 9c3f36cd9..f0d9b7c6e 100755 --- a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/SonarLintIPythonTest.java +++ b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/SonarLintIPythonTest.java @@ -16,187 +16,42 @@ */ package com.sonar.python.it.plugin; -import com.sonar.orchestrator.locator.Locators; -import com.sonar.python.it.PluginLocator; -import com.sonar.python.it.TestsUtils; -import java.io.IOException; -import java.io.InputStream; -import java.net.URI; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; import java.nio.file.Path; -import java.util.ArrayList; -import java.util.EnumMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; import java.util.Set; -import java.util.concurrent.ExecutionException; -import java.util.stream.Stream; -import javax.annotation.Nullable; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; -import org.sonar.api.batch.fs.InputFile; -import org.sonarsource.sonarlint.core.analysis.AnalysisEngine; -import org.sonarsource.sonarlint.core.analysis.api.ActiveRule; -import org.sonarsource.sonarlint.core.analysis.api.AnalysisConfiguration; -import org.sonarsource.sonarlint.core.analysis.api.AnalysisEngineConfiguration; -import org.sonarsource.sonarlint.core.analysis.api.ClientInputFile; -import org.sonarsource.sonarlint.core.analysis.api.ClientModuleFileSystem; -import org.sonarsource.sonarlint.core.analysis.api.ClientModuleInfo; -import org.sonarsource.sonarlint.core.analysis.api.Issue; -import org.sonarsource.sonarlint.core.analysis.api.WithTextRange; -import org.sonarsource.sonarlint.core.analysis.command.AnalyzeCommand; -import org.sonarsource.sonarlint.core.analysis.command.RegisterModuleCommand; -import org.sonarsource.sonarlint.core.commons.api.SonarLanguage; -import org.sonarsource.sonarlint.core.commons.log.LogOutput; -import org.sonarsource.sonarlint.core.commons.log.LogOutput.Level; -import org.sonarsource.sonarlint.core.commons.log.SonarLintLogger; -import org.sonarsource.sonarlint.core.commons.progress.ProgressMonitor; -import org.sonarsource.sonarlint.core.plugin.commons.PluginsLoader; +import org.sonarsource.sonarlint.core.rpc.protocol.common.Language; +import org.sonarsource.sonarlint.core.test.utils.junit5.SonarLintTest; +import org.sonarsource.sonarlint.core.test.utils.junit5.SonarLintTestHarness; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.tuple; public class SonarLintIPythonTest { - @TempDir - public static Path temp; - - private static AnalysisEngine sonarlintEngine; - private final ProgressMonitor progressMonitor = new ProgressMonitor(null); - - - @BeforeAll - static void prepare() { - var sonarLintConfig = AnalysisEngineConfiguration.builder() - .setWorkDir(temp) - .build(); - - var logOutput = new LogOutput() { - @Override - public void log(String formattedMessage, Level level, @Nullable String stacktrace) { - /* Don't pollute logs */ - } - }; - SonarLintLogger.setTarget(logOutput); - Locators locators = new Locators(TestsUtils.dynamicOrchestrator.getConfiguration()); - var pluginJarLocation = Set - .of(locators.locate(PluginLocator.Plugins.PYTHON.get(PluginLocator.isEnterpriseTest())).toPath()); - var enabledLanguages = Set.of(SonarLanguage.IPYTHON); - var pluginConfiguration = new PluginsLoader.Configuration(pluginJarLocation, enabledLanguages, false, Optional.empty()); - var pluginLoader = new PluginsLoader().load(pluginConfiguration, Set.of()); - - sonarlintEngine = new AnalysisEngine(sonarLintConfig, pluginLoader.getLoadedPlugins(), logOutput); - } - - @AfterAll - static void stop() { - SonarLintLogger.setTarget(null); - sonarlintEngine.stop(); - } - - @Test - void shouldRaiseIssues() throws InterruptedException, ExecutionException { - var inputFile = createInputFile(Path.of("projects/ipynb_project/file1.ipynb"), "file1.ipynb", false); - var issues = new ArrayList(); - - var configuration = AnalysisConfiguration.builder() - .setBaseDir(Path.of("projects/ipynb_project")) - .addInputFile(inputFile) - .addActiveRules(new ActiveRule("ipython:PrintStatementUsage", SonarLanguage.IPYTHON.name()), - new ActiveRule("ipython:S1172", SonarLanguage.IPYTHON.name()), - new ActiveRule("ipython:S930", SonarLanguage.IPYTHON.name()), - new ActiveRule("ipython:S1542", SonarLanguage.IPYTHON.name()), - new ActiveRule("ipython:BackticksUsage", SonarLanguage.IPYTHON.name())) - .build(); - - Map> logsByLevel = new EnumMap<>(Level.class); - var logOutput = createClientLogOutput(logsByLevel); - var clientFileSystem = createClientFileSystem(inputFile); - sonarlintEngine.post(new RegisterModuleCommand(new ClientModuleInfo("myModule", clientFileSystem)), progressMonitor).get(); - var command = new AnalyzeCommand("myModule", configuration, issues::add, logOutput); - sonarlintEngine.post(command, progressMonitor).get(); - assertThat(issues) - .extracting(Issue::getRuleKey, WithTextRange::getStartLine, i -> i.getInputFile().uri()) - .containsOnly( - tuple("ipython:PrintStatementUsage", 32, inputFile.uri()), - tuple("ipython:S1172", 40, inputFile.uri()), - tuple("ipython:S930", 41, inputFile.uri()), - tuple("ipython:S1172", 42, inputFile.uri()), - tuple("ipython:S1542", 57, inputFile.uri()), - tuple("ipython:BackticksUsage", 58, inputFile.uri())); - } - - private static LogOutput createClientLogOutput(Map> logsByLevel) { - return new LogOutput() { - @Override - public void log(String formattedMessage, Level level, @Nullable String stacktrace) { - logsByLevel.computeIfAbsent(level, k -> new ArrayList<>()).add(formattedMessage); - } - }; - } - - private static ClientModuleFileSystem createClientFileSystem(ClientInputFile... inputFiles) { - return new ClientModuleFileSystem() { - @Override - public Stream files(String s, InputFile.Type type) { - return Stream.of(inputFiles); - } - - @Override - public Stream files() { - return Stream.of(inputFiles); - } - }; - } - - private static ClientInputFile createInputFile(final Path path, String relativePath, final boolean isTest) { - return new ClientInputFile() { - - @Override - public String getPath() { - return path.toString(); - } - - @Override - public boolean isTest() { - return isTest; - } - - @Override - public Charset getCharset() { - return StandardCharsets.UTF_8; - } - - @Override - public G getClientObject() { - return null; - } - - @Override - public InputStream inputStream() throws IOException { - return Files.newInputStream(path); - } - - @Override - public String contents() throws IOException { - return new String(Files.readAllBytes(path), StandardCharsets.UTF_8); - } - - @Override - public String relativePath() { - return relativePath; - } - - @Override - public URI uri() { - return path.toUri(); - } - - }; + @SonarLintTest + void shouldRaiseIssues(SonarLintTestHarness harness, @TempDir Path baseDir) { + var fixture = Path.of("projects/ipynb_project/file1.ipynb"); + var inputFile = SonarLintBackendTestUtils.copyFile(baseDir, fixture, "file1.ipynb", Language.IPYTHON); + var client = SonarLintBackendTestUtils.createClient(harness, baseDir, inputFile); + var backend = SonarLintBackendTestUtils.startBackend( + harness, + client, + Set.of(Language.IPYTHON), + Set.of("ipython:PrintStatementUsage", "ipython:S1172", "ipython:S930", "ipython:S1542", "ipython:BackticksUsage")); + + SonarLintBackendTestUtils.openFile(backend, inputFile); + + SonarLintBackendTestUtils.awaitIssues(client, issuesByUri -> assertThat( + issuesByUri.entrySet().stream() + .flatMap(entry -> entry.getValue().stream() + .map(issue -> tuple(issue.getRuleKey(), issue.getTextRange().getStartLine(), entry.getKey()))) + .toList()) + .containsExactlyInAnyOrder( + tuple("ipython:PrintStatementUsage", 32, inputFile.getUri()), + tuple("ipython:S1172", 40, inputFile.getUri()), + tuple("ipython:S930", 41, inputFile.getUri()), + tuple("ipython:S1172", 42, inputFile.getUri()), + tuple("ipython:S1542", 57, inputFile.getUri()), + tuple("ipython:BackticksUsage", 58, inputFile.getUri()))); } } diff --git a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/SonarLintTest.java b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/SonarLintTest.java index 79d98299e..67593ffc7 100644 --- a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/SonarLintTest.java +++ b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/SonarLintTest.java @@ -16,188 +16,43 @@ */ package com.sonar.python.it.plugin; -import com.sonar.orchestrator.locator.Locators; -import com.sonar.python.it.PluginLocator; -import com.sonar.python.it.TestsUtils; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.net.URI; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; import java.nio.file.Path; -import java.util.ArrayList; -import java.util.EnumMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; import java.util.Set; -import java.util.concurrent.ExecutionException; -import java.util.stream.Stream; -import javax.annotation.Nullable; -import org.apache.commons.io.FileUtils; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; -import org.sonar.api.batch.fs.InputFile; -import org.sonarsource.sonarlint.core.analysis.AnalysisEngine; -import org.sonarsource.sonarlint.core.analysis.api.ActiveRule; -import org.sonarsource.sonarlint.core.analysis.api.AnalysisConfiguration; -import org.sonarsource.sonarlint.core.analysis.api.AnalysisEngineConfiguration; -import org.sonarsource.sonarlint.core.analysis.api.ClientInputFile; -import org.sonarsource.sonarlint.core.analysis.api.ClientModuleFileSystem; -import org.sonarsource.sonarlint.core.analysis.api.ClientModuleInfo; -import org.sonarsource.sonarlint.core.analysis.api.Issue; -import org.sonarsource.sonarlint.core.analysis.command.AnalyzeCommand; -import org.sonarsource.sonarlint.core.analysis.command.RegisterModuleCommand; -import org.sonarsource.sonarlint.core.commons.api.SonarLanguage; -import org.sonarsource.sonarlint.core.commons.log.LogOutput; -import org.sonarsource.sonarlint.core.commons.log.LogOutput.Level; -import org.sonarsource.sonarlint.core.commons.log.SonarLintLogger; -import org.sonarsource.sonarlint.core.commons.progress.ProgressMonitor; -import org.sonarsource.sonarlint.core.plugin.commons.PluginsLoader; +import org.sonarsource.sonarlint.core.rpc.protocol.common.Language; +import org.sonarsource.sonarlint.core.test.utils.junit5.SonarLintTestHarness; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.tuple; public class SonarLintTest { - @TempDir - public static Path temp; - - private static AnalysisEngine sonarlintEngine; - private final ProgressMonitor progressMonitor = new ProgressMonitor(null); - - private static File baseDir; - - @BeforeAll - static void prepare() { - var sonarLintConfig = AnalysisEngineConfiguration.builder() - .setWorkDir(temp) - .build(); - - var logOutput = new LogOutput() { - @Override - public void log(String formattedMessage, Level level, @Nullable String stacktrace) { - /* Don't pollute logs */ - } - }; - SonarLintLogger.setTarget(logOutput); - Locators locators = new Locators(TestsUtils.dynamicOrchestrator.getConfiguration()); - var pluginJarLocation = Set - .of(locators.locate(PluginLocator.Plugins.PYTHON.get(PluginLocator.isEnterpriseTest())).toPath()); - var enabledLanguages = Set.of(SonarLanguage.PYTHON); - var pluginConfiguration = new PluginsLoader.Configuration(pluginJarLocation, enabledLanguages, false, Optional.empty()); - var pluginLoader = new PluginsLoader().load(pluginConfiguration, Set.of()); - - sonarlintEngine = new AnalysisEngine(sonarLintConfig, pluginLoader.getLoadedPlugins(), logOutput); - baseDir = temp.toFile(); - } - - @AfterAll - static void stop() { - SonarLintLogger.setTarget(null); - sonarlintEngine.stop(); - } - - @Test - void should_raise_issues() throws IOException, InterruptedException, ExecutionException { - ClientInputFile inputFile = prepareInputFile("foo.py", + @org.sonarsource.sonarlint.core.test.utils.junit5.SonarLintTest + void should_raise_issues(SonarLintTestHarness harness, @TempDir Path baseDir) { + var inputFile = SonarLintBackendTestUtils.writeFile(baseDir, "foo.py", """ def fooBar(): `1` `1` #NOSONAR """, - false); - - List issues = new ArrayList<>(); - var configuration = AnalysisConfiguration.builder() - .setBaseDir(baseDir.toPath()) - .addInputFile(inputFile) - .addActiveRules( - new ActiveRule("python:S1542", SonarLanguage.PYTHON.name()), - new ActiveRule("python:BackticksUsage", SonarLanguage.PYTHON.name())) - .build(); - - Map> logsByLevel = new EnumMap<>(Level.class); - LogOutput logOutput = new LogOutput() { - @Override - public void log(String formattedMessage, Level level, @Nullable String stacktrace) { - logsByLevel.computeIfAbsent(level, k -> new ArrayList<>()).add(formattedMessage); - } - }; - ClientModuleFileSystem clientFileSystem = new ClientModuleFileSystem() { - @Override - public Stream files(String s, InputFile.Type type) { - return Stream.of(inputFile); - } - - @Override - public Stream files() { - return Stream.of(inputFile); - } - }; - sonarlintEngine.post(new RegisterModuleCommand(new ClientModuleInfo("myModule", clientFileSystem)), progressMonitor).get(); - var command = new AnalyzeCommand("myModule", configuration, issues::add, logOutput); - sonarlintEngine.post(command, progressMonitor).get(); - - assertThat(logsByLevel.get(Level.WARN)).containsExactly("No workDir in SonarLint"); - assertThat(issues).extracting("ruleKey", "textRange.startLine", "inputFile.path").containsOnly( - tuple("python:BackticksUsage", 2, inputFile.uri().getPath()), - tuple("python:S1542", 1, inputFile.uri().getPath())); - } - - private static ClientInputFile prepareInputFile(String relativePath, String content, final boolean isTest) throws IOException { - File file = new File(baseDir, relativePath); - FileUtils.write(file, content, StandardCharsets.UTF_8); - return createInputFile(file.toPath(), relativePath, isTest); - } - - private static ClientInputFile createInputFile(final Path path, String relativePath, final boolean isTest) { - return new ClientInputFile() { - - @Override - public String getPath() { - return path.toString(); - } - - @Override - public boolean isTest() { - return isTest; - } - - @Override - public Charset getCharset() { - return StandardCharsets.UTF_8; - } - - @Override - public G getClientObject() { - return null; - } - - @Override - public InputStream inputStream() throws IOException { - return Files.newInputStream(path); - } - - @Override - public String contents() throws IOException { - return new String(Files.readAllBytes(path), StandardCharsets.UTF_8); - } - - @Override - public String relativePath() { - return relativePath; - } - - @Override - public URI uri() { - return path.toUri(); - } - - }; + Language.PYTHON); + + var client = SonarLintBackendTestUtils.createClient(harness, baseDir, inputFile); + var backend = SonarLintBackendTestUtils.startBackend( + harness, + client, + Set.of(Language.PYTHON), + Set.of("python:S1542", "python:BackticksUsage")); + + SonarLintBackendTestUtils.openFile(backend, inputFile); + + SonarLintBackendTestUtils.awaitIssues(client, issuesByUri -> assertThat( + issuesByUri.entrySet().stream() + .flatMap(entry -> entry.getValue().stream() + .map(issue -> tuple(issue.getRuleKey(), issue.getTextRange().getStartLine(), entry.getKey()))) + .toList()) + .containsExactlyInAnyOrder( + tuple("python:BackticksUsage", 2, inputFile.getUri()), + tuple("python:S1542", 1, inputFile.getUri()))); } } diff --git a/mise.test-and-analyze.toml b/mise.test-and-analyze.toml index a040730e9..6086b5632 100644 --- a/mise.test-and-analyze.toml +++ b/mise.test-and-analyze.toml @@ -1,2 +1,2 @@ [tools] -java = "17.0" +java = "21.0" diff --git a/pom.xml b/pom.xml index 43d599ad4..c028c8e31 100644 --- a/pom.xml +++ b/pom.xml @@ -108,7 +108,7 @@ its/**,private/its-enterprise/**,python-frontend/typeshed_serializer/**,**/test/resources/** - 10.13.0.79996 + 11.6.0.85952 1.25.1.3886 4.29.0 6.2.7 From 1934fd99d3c80f5d6eaba1eb7e7f61a133af3545 Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Tue, 14 Jul 2026 08:56:58 +0200 Subject: [PATCH 213/322] SONARPY-4373 Updated Pydantic stubs for networks and types GitOrigin-RevId: 953b9b3ae54960e5af89e78dd15459522657c6ef --- .../pydantic.networks.protobuf | 104 +++++++ .../types/custom_protobuf/pydantic.protobuf | 285 +++++++++++++++++- .../custom_protobuf/pydantic.types.protobuf | 187 +++++++++++- .../custom_protobuf/pydantic_core.protobuf | 40 ++- .../checksums/custom.checksum | 4 +- .../resources/custom/pydantic/__init__.pyi | 3 +- .../resources/custom/pydantic/networks.pyi | 54 ++++ .../resources/custom/pydantic/types.pyi | 76 +++++ .../custom/pydantic_core/__init__.pyi | 15 + 9 files changed, 762 insertions(+), 6 deletions(-) create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.networks.protobuf create mode 100644 python-frontend/typeshed_serializer/resources/custom/pydantic/networks.pyi diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.networks.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.networks.protobuf new file mode 100644 index 000000000..d42134fe6 --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.networks.protobuf @@ -0,0 +1,104 @@ + +pydantic.networks +AnyUrlpydantic.networks.AnyUrl"builtins.object* +unicode_string'pydantic.networks.AnyUrl.unicode_string" + builtins.str" builtins.str*> +self4 +pydantic.networks.AnyUrl"pydantic.networks.AnyUrl* + unicode_host%pydantic.networks.AnyUrl.unicode_host" + builtins.str" builtins.str*> +self4 +pydantic.networks.AnyUrl"pydantic.networks.AnyUrl* + query_params%pydantic.networks.AnyUrl.query_params", +builtins.list[Any] +Any" builtins.list*> +self4 +pydantic.networks.AnyUrl"pydantic.networks.AnyUrl* +encoded_string'pydantic.networks.AnyUrl.encoded_string" + builtins.str" builtins.str*> +self4 +pydantic.networks.AnyUrl"pydantic.networks.AnyUrlrG +schemepydantic.networks.AnyUrl.scheme + builtins.str" builtins.strrC +hostpydantic.networks.AnyUrl.host + builtins.str" builtins.strrC +pathpydantic.networks.AnyUrl.path + builtins.str" builtins.strrC +portpydantic.networks.AnyUrl.port + builtins.int" builtins.intrm +querypydantic.networks.AnyUrl.queryD +Union[builtins.str,None] + builtins.str" builtins.str +Noners +fragment!pydantic.networks.AnyUrl.fragmentD +Union[builtins.str,None] + builtins.str" builtins.str +Noners +username!pydantic.networks.AnyUrl.usernameD +Union[builtins.str,None] + builtins.str" builtins.str +Noners +password!pydantic.networks.AnyUrl.passwordD +Union[builtins.str,None] + builtins.str" builtins.str +NoneD + +AnyHttpUrlpydantic.networks.AnyHttpUrl"pydantic.networks.AnyUrl> +HttpUrlpydantic.networks.HttpUrl"pydantic.networks.AnyUrl> +FileUrlpydantic.networks.FileUrl"pydantic.networks.AnyUrlN +AnyWebsocketUrl!pydantic.networks.AnyWebsocketUrl"pydantic.networks.AnyUrlH + WebsocketUrlpydantic.networks.WebsocketUrl"pydantic.networks.AnyUrl< +FtpUrlpydantic.networks.FtpUrl"pydantic.networks.AnyUrl> +AmqpDsnpydantic.networks.AmqpDsn"pydantic.networks.AnyUrlH + CockroachDsnpydantic.networks.CockroachDsn"pydantic.networks.AnyUrl@ +KafkaDsnpydantic.networks.KafkaDsn"pydantic.networks.AnyUrl@ +RedisDsnpydantic.networks.RedisDsn"pydantic.networks.AnyUrlF + PostgresDsnpydantic.networks.PostgresDsn"pydantic.networks.AnyUrl@ +MongoDsnpydantic.networks.MongoDsn"pydantic.networks.AnyUrl +Urlpydantic.networks.Url"builtins.object* +unicode_string$pydantic.networks.Url.unicode_string" + builtins.str" builtins.str*8 +self. +pydantic.networks.Url"pydantic.networks.Url* + unicode_host"pydantic.networks.Url.unicode_host" + builtins.str" builtins.str*8 +self. +pydantic.networks.Url"pydantic.networks.Url* + query_params"pydantic.networks.Url.query_params", +builtins.list[Any] +Any" builtins.list*8 +self. +pydantic.networks.Url"pydantic.networks.UrlrD +schemepydantic.networks.Url.scheme + builtins.str" builtins.strr@ +hostpydantic.networks.Url.host + builtins.str" builtins.strr@ +pathpydantic.networks.Url.path + builtins.str" builtins.strr@ +portpydantic.networks.Url.port + builtins.int" builtins.intrj +querypydantic.networks.Url.queryD +Union[builtins.str,None] + builtins.str" builtins.str +Nonerp +fragmentpydantic.networks.Url.fragmentD +Union[builtins.str,None] + builtins.str" builtins.str +Nonerp +usernamepydantic.networks.Url.usernameD +Union[builtins.str,None] + builtins.str" builtins.str +Nonerp +passwordpydantic.networks.Url.passwordD +Union[builtins.str,None] + builtins.str" builtins.str +NoneA + IPvAnyAddresspydantic.networks.IPvAnyAddress"builtins.objectE +IPvAnyInterface!pydantic.networks.IPvAnyInterface"builtins.objectA + IPvAnyNetworkpydantic.networks.IPvAnyNetwork"builtins.object4 +EmailStrpydantic.networks.EmailStr" builtins.str9 + NameEmailpydantic.networks.NameEmail"builtins.object* +__annotations__!pydantic.networks.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.protobuf index d72070ecb..e9a3d4e6c 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.protobuf @@ -29,7 +29,290 @@ ConfigDictpydantic.config.ConfigDict"builtins.object* get_secret_value)pydantic.types.SecretStr.get_secret_value" builtins.str" builtins.str*> self4 -pydantic.types.SecretStr"pydantic.types.SecretStrT +pydantic.types.SecretStr"pydantic.types.SecretStr1 +ByteSizepydantic.types.ByteSize" builtins.int, +Jsonpydantic.types.Json"builtins.object< + ImportStringpydantic.types.ImportString"builtins.objectF +StringConstraints pydantic.types.StringConstraints"builtins.objectF +PaymentCardNumber pydantic.types.PaymentCardNumber"builtins.object2 +PastDatepydantic.types.PastDate" datetime.date6 + +FutureDatepydantic.types.FutureDate" datetime.date> + PastDatetimepydantic.types.PastDatetime"datetime.datetimeB +FutureDatetimepydantic.types.FutureDatetime"datetime.datetime@ + AwareDatetimepydantic.types.AwareDatetime"datetime.datetime@ + NaiveDatetimepydantic.types.NaiveDatetime"datetime.datetime +conintpydantic.types.conint" builtins.int* +__init__pydantic.types.conint.__init__" +None*8 +self. +pydantic.types.conint"pydantic.types.conint*, +strict + builtins.bool" builtins.bool *& +gt + builtins.int" builtins.int *& +ge + builtins.int" builtins.int *& +lt + builtins.int" builtins.int *& +le + builtins.int" builtins.int */ + multiple_of + builtins.int" builtins.int  +conlistpydantic.types.conlist" builtins.list* +__init__pydantic.types.conlist.__init__" +None*: +self0 +pydantic.types.conlist"pydantic.types.conlist* + item_type +Any *. + +min_length + builtins.int" builtins.int *. + +max_length + builtins.int" builtins.int  +consetpydantic.types.conset" builtins.set* +__init__pydantic.types.conset.__init__" +None*8 +self. +pydantic.types.conset"pydantic.types.conset* + item_type +Any *. + +min_length + builtins.int" builtins.int *. + +max_length + builtins.int" builtins.int  + confrozensetpydantic.types.confrozenset"builtins.frozenset* +__init__$pydantic.types.confrozenset.__init__" +None*D +self: +pydantic.types.confrozenset"pydantic.types.confrozenset* + item_type +Any *. + +min_length + builtins.int" builtins.int *. + +max_length + builtins.int" builtins.int  +conbytespydantic.types.conbytes"builtins.bytes* +__init__ pydantic.types.conbytes.__init__" +None*< +self2 +pydantic.types.conbytes"pydantic.types.conbytes*, +strict + builtins.bool" builtins.bool *. + +min_length + builtins.int" builtins.int *. + +max_length + builtins.int" builtins.int  +constrpydantic.types.constr" builtins.str* +__init__pydantic.types.constr.__init__" +None*8 +self. +pydantic.types.constr"pydantic.types.constr*6 +strip_whitespace + builtins.bool" builtins.bool *. +to_upper + builtins.bool" builtins.bool *. +to_lower + builtins.bool" builtins.bool *, +strict + builtins.bool" builtins.bool *. + +min_length + builtins.int" builtins.int *. + +max_length + builtins.int" builtins.int *+ +pattern + builtins.str" builtins.str *0 + +ascii_only + builtins.bool" builtins.bool  +confloatpydantic.types.confloat"builtins.float* +__init__ pydantic.types.confloat.__init__" +None*< +self2 +pydantic.types.confloat"pydantic.types.confloat*, +strict + builtins.bool" builtins.bool ** +gt +builtins.float"builtins.float ** +ge +builtins.float"builtins.float ** +lt +builtins.float"builtins.float ** +le +builtins.float"builtins.float *3 + multiple_of +builtins.float"builtins.float *3 + allow_inf_nan + builtins.bool" builtins.bool  + +condecimalpydantic.types.condecimal"_decimal.Decimal* +__init__"pydantic.types.condecimal.__init__" +None*@ +self6 +pydantic.types.condecimal"pydantic.types.condecimal*, +strict + builtins.bool" builtins.bool * +gt +Any * +ge +Any * +lt +Any * +le +Any * + multiple_of +Any *. + +max_digits + builtins.int" builtins.int *2 +decimal_places + builtins.int" builtins.int *3 + allow_inf_nan + builtins.bool" builtins.bool  +condatepydantic.types.condate" datetime.date* +__init__pydantic.types.condate.__init__" +None*: +self0 +pydantic.types.condate"pydantic.types.condate*, +strict + builtins.bool" builtins.bool *( +gt + datetime.date" datetime.date *( +ge + datetime.date" datetime.date *( +lt + datetime.date" datetime.date *( +le + datetime.date" datetime.date 3 + StrictStrpydantic.types.StrictStr" builtins.str7 + PositiveIntpydantic.types.PositiveInt" builtins.int7 + NegativeIntpydantic.types.NegativeInt" builtins.int= +NonNegativeIntpydantic.types.NonNegativeInt" builtins.int= +NonPositiveIntpydantic.types.NonPositiveInt" builtins.int= + PositiveFloatpydantic.types.PositiveFloat"builtins.float= + NegativeFloatpydantic.types.NegativeFloat"builtins.floatC +NonNegativeFloatpydantic.types.NonNegativeFloat"builtins.floatC +NonPositiveFloatpydantic.types.NonPositiveFloat"builtins.float9 + FiniteFloatpydantic.types.FiniteFloat"builtins.float1 +FilePathpydantic.types.FilePath" pathlib.Path; + DirectoryPathpydantic.types.DirectoryPath" pathlib.Path/ +NewPathpydantic.types.NewPath" pathlib.Path9 + Base64Bytespydantic.types.Base64Bytes"builtins.bytes? +Base64UrlBytespydantic.types.Base64UrlBytes"builtins.bytes3 + Base64Strpydantic.types.Base64Str" builtins.str9 + Base64UrlStrpydantic.types.Base64UrlStr" builtins.str( +UUID1pydantic.types.UUID1" uuid.UUID( +UUID3pydantic.types.UUID3" uuid.UUID( +UUID4pydantic.types.UUID4" uuid.UUID( +UUID5pydantic.types.UUID5" uuid.UUID +AnyUrlpydantic.networks.AnyUrl"builtins.object* +unicode_string'pydantic.networks.AnyUrl.unicode_string" + builtins.str" builtins.str*> +self4 +pydantic.networks.AnyUrl"pydantic.networks.AnyUrl* + unicode_host%pydantic.networks.AnyUrl.unicode_host" + builtins.str" builtins.str*> +self4 +pydantic.networks.AnyUrl"pydantic.networks.AnyUrl* + query_params%pydantic.networks.AnyUrl.query_params", +builtins.list[Any] +Any" builtins.list*> +self4 +pydantic.networks.AnyUrl"pydantic.networks.AnyUrl* +encoded_string'pydantic.networks.AnyUrl.encoded_string" + builtins.str" builtins.str*> +self4 +pydantic.networks.AnyUrl"pydantic.networks.AnyUrlrG +schemepydantic.networks.AnyUrl.scheme + builtins.str" builtins.strrC +hostpydantic.networks.AnyUrl.host + builtins.str" builtins.strrC +pathpydantic.networks.AnyUrl.path + builtins.str" builtins.strrC +portpydantic.networks.AnyUrl.port + builtins.int" builtins.intrm +querypydantic.networks.AnyUrl.queryD +Union[builtins.str,None] + builtins.str" builtins.str +Noners +fragment!pydantic.networks.AnyUrl.fragmentD +Union[builtins.str,None] + builtins.str" builtins.str +Noners +username!pydantic.networks.AnyUrl.usernameD +Union[builtins.str,None] + builtins.str" builtins.str +Noners +password!pydantic.networks.AnyUrl.passwordD +Union[builtins.str,None] + builtins.str" builtins.str +NoneD + +AnyHttpUrlpydantic.networks.AnyHttpUrl"pydantic.networks.AnyUrl> +HttpUrlpydantic.networks.HttpUrl"pydantic.networks.AnyUrl> +FileUrlpydantic.networks.FileUrl"pydantic.networks.AnyUrlN +AnyWebsocketUrl!pydantic.networks.AnyWebsocketUrl"pydantic.networks.AnyUrlH + WebsocketUrlpydantic.networks.WebsocketUrl"pydantic.networks.AnyUrl< +FtpUrlpydantic.networks.FtpUrl"pydantic.networks.AnyUrl> +AmqpDsnpydantic.networks.AmqpDsn"pydantic.networks.AnyUrlH + CockroachDsnpydantic.networks.CockroachDsn"pydantic.networks.AnyUrl@ +KafkaDsnpydantic.networks.KafkaDsn"pydantic.networks.AnyUrl@ +RedisDsnpydantic.networks.RedisDsn"pydantic.networks.AnyUrlF + PostgresDsnpydantic.networks.PostgresDsn"pydantic.networks.AnyUrl@ +MongoDsnpydantic.networks.MongoDsn"pydantic.networks.AnyUrl +Urlpydantic.networks.Url"builtins.object* +unicode_string$pydantic.networks.Url.unicode_string" + builtins.str" builtins.str*8 +self. +pydantic.networks.Url"pydantic.networks.Url* + unicode_host"pydantic.networks.Url.unicode_host" + builtins.str" builtins.str*8 +self. +pydantic.networks.Url"pydantic.networks.Url* + query_params"pydantic.networks.Url.query_params", +builtins.list[Any] +Any" builtins.list*8 +self. +pydantic.networks.Url"pydantic.networks.UrlrD +schemepydantic.networks.Url.scheme + builtins.str" builtins.strr@ +hostpydantic.networks.Url.host + builtins.str" builtins.strr@ +pathpydantic.networks.Url.path + builtins.str" builtins.strr@ +portpydantic.networks.Url.port + builtins.int" builtins.intrj +querypydantic.networks.Url.queryD +Union[builtins.str,None] + builtins.str" builtins.str +Nonerp +fragmentpydantic.networks.Url.fragmentD +Union[builtins.str,None] + builtins.str" builtins.str +Nonerp +usernamepydantic.networks.Url.usernameD +Union[builtins.str,None] + builtins.str" builtins.str +Nonerp +passwordpydantic.networks.Url.passwordD +Union[builtins.str,None] + builtins.str" builtins.str +NoneA + IPvAnyAddresspydantic.networks.IPvAnyAddress"builtins.objectE +IPvAnyInterface!pydantic.networks.IPvAnyInterface"builtins.objectA + IPvAnyNetworkpydantic.networks.IPvAnyNetwork"builtins.object4 +EmailStrpydantic.networks.EmailStr" builtins.str9 + NameEmailpydantic.networks.NameEmail"builtins.objectT Fieldpydantic.fields.Field" Any* default diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.types.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.types.protobuf index f3f971424..f79d6434f 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.types.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic.types.protobuf @@ -10,7 +10,192 @@ get_secret_value)pydantic.types.SecretStr.get_secret_value" builtins.str" builtins.str*> self4 -pydantic.types.SecretStr"pydantic.types.SecretStr* +pydantic.types.SecretStr"pydantic.types.SecretStr1 +ByteSizepydantic.types.ByteSize" builtins.int, +Jsonpydantic.types.Json"builtins.object< + ImportStringpydantic.types.ImportString"builtins.objectF +StringConstraints pydantic.types.StringConstraints"builtins.objectF +PaymentCardNumber pydantic.types.PaymentCardNumber"builtins.object2 +PastDatepydantic.types.PastDate" datetime.date6 + +FutureDatepydantic.types.FutureDate" datetime.date> + PastDatetimepydantic.types.PastDatetime"datetime.datetimeB +FutureDatetimepydantic.types.FutureDatetime"datetime.datetime@ + AwareDatetimepydantic.types.AwareDatetime"datetime.datetime@ + NaiveDatetimepydantic.types.NaiveDatetime"datetime.datetime +conintpydantic.types.conint" builtins.int* +__init__pydantic.types.conint.__init__" +None*8 +self. +pydantic.types.conint"pydantic.types.conint*, +strict + builtins.bool" builtins.bool *& +gt + builtins.int" builtins.int *& +ge + builtins.int" builtins.int *& +lt + builtins.int" builtins.int *& +le + builtins.int" builtins.int */ + multiple_of + builtins.int" builtins.int  +conlistpydantic.types.conlist" builtins.list* +__init__pydantic.types.conlist.__init__" +None*: +self0 +pydantic.types.conlist"pydantic.types.conlist* + item_type +Any *. + +min_length + builtins.int" builtins.int *. + +max_length + builtins.int" builtins.int  +consetpydantic.types.conset" builtins.set* +__init__pydantic.types.conset.__init__" +None*8 +self. +pydantic.types.conset"pydantic.types.conset* + item_type +Any *. + +min_length + builtins.int" builtins.int *. + +max_length + builtins.int" builtins.int  + confrozensetpydantic.types.confrozenset"builtins.frozenset* +__init__$pydantic.types.confrozenset.__init__" +None*D +self: +pydantic.types.confrozenset"pydantic.types.confrozenset* + item_type +Any *. + +min_length + builtins.int" builtins.int *. + +max_length + builtins.int" builtins.int  +conbytespydantic.types.conbytes"builtins.bytes* +__init__ pydantic.types.conbytes.__init__" +None*< +self2 +pydantic.types.conbytes"pydantic.types.conbytes*, +strict + builtins.bool" builtins.bool *. + +min_length + builtins.int" builtins.int *. + +max_length + builtins.int" builtins.int  +constrpydantic.types.constr" builtins.str* +__init__pydantic.types.constr.__init__" +None*8 +self. +pydantic.types.constr"pydantic.types.constr*6 +strip_whitespace + builtins.bool" builtins.bool *. +to_upper + builtins.bool" builtins.bool *. +to_lower + builtins.bool" builtins.bool *, +strict + builtins.bool" builtins.bool *. + +min_length + builtins.int" builtins.int *. + +max_length + builtins.int" builtins.int *+ +pattern + builtins.str" builtins.str *0 + +ascii_only + builtins.bool" builtins.bool  +confloatpydantic.types.confloat"builtins.float* +__init__ pydantic.types.confloat.__init__" +None*< +self2 +pydantic.types.confloat"pydantic.types.confloat*, +strict + builtins.bool" builtins.bool ** +gt +builtins.float"builtins.float ** +ge +builtins.float"builtins.float ** +lt +builtins.float"builtins.float ** +le +builtins.float"builtins.float *3 + multiple_of +builtins.float"builtins.float *3 + allow_inf_nan + builtins.bool" builtins.bool  + +condecimalpydantic.types.condecimal"_decimal.Decimal* +__init__"pydantic.types.condecimal.__init__" +None*@ +self6 +pydantic.types.condecimal"pydantic.types.condecimal*, +strict + builtins.bool" builtins.bool * +gt +Any * +ge +Any * +lt +Any * +le +Any * + multiple_of +Any *. + +max_digits + builtins.int" builtins.int *2 +decimal_places + builtins.int" builtins.int *3 + allow_inf_nan + builtins.bool" builtins.bool  +condatepydantic.types.condate" datetime.date* +__init__pydantic.types.condate.__init__" +None*: +self0 +pydantic.types.condate"pydantic.types.condate*, +strict + builtins.bool" builtins.bool *( +gt + datetime.date" datetime.date *( +ge + datetime.date" datetime.date *( +lt + datetime.date" datetime.date *( +le + datetime.date" datetime.date 3 + StrictStrpydantic.types.StrictStr" builtins.str7 + PositiveIntpydantic.types.PositiveInt" builtins.int7 + NegativeIntpydantic.types.NegativeInt" builtins.int= +NonNegativeIntpydantic.types.NonNegativeInt" builtins.int= +NonPositiveIntpydantic.types.NonPositiveInt" builtins.int= + PositiveFloatpydantic.types.PositiveFloat"builtins.float= + NegativeFloatpydantic.types.NegativeFloat"builtins.floatC +NonNegativeFloatpydantic.types.NonNegativeFloat"builtins.floatC +NonPositiveFloatpydantic.types.NonPositiveFloat"builtins.float9 + FiniteFloatpydantic.types.FiniteFloat"builtins.float1 +FilePathpydantic.types.FilePath" pathlib.Path; + DirectoryPathpydantic.types.DirectoryPath" pathlib.Path/ +NewPathpydantic.types.NewPath" pathlib.Path9 + Base64Bytespydantic.types.Base64Bytes"builtins.bytes? +Base64UrlBytespydantic.types.Base64UrlBytes"builtins.bytes3 + Base64Strpydantic.types.Base64Str" builtins.str9 + Base64UrlStrpydantic.types.Base64UrlStr" builtins.str( +UUID1pydantic.types.UUID1" uuid.UUID( +UUID3pydantic.types.UUID3" uuid.UUID( +UUID4pydantic.types.UUID4" uuid.UUID( +UUID5pydantic.types.UUID5" uuid.UUID* __annotations__pydantic.types.__annotations__W builtins.dict[builtins.str,Any] builtins.str" builtins.str diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic_core.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic_core.protobuf index ef1768cf4..c4d5a5af8 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic_core.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pydantic_core.protobuf @@ -1,5 +1,43 @@ - pydantic_core + pydantic_core +Urlpydantic_core.Url"builtins.object* +unicode_string pydantic_core.Url.unicode_string" + builtins.str" builtins.str*0 +self& +pydantic_core.Url"pydantic_core.Url*~ + unicode_hostpydantic_core.Url.unicode_host" + builtins.str" builtins.str*0 +self& +pydantic_core.Url"pydantic_core.Url* + query_paramspydantic_core.Url.query_params", +builtins.list[Any] +Any" builtins.list*0 +self& +pydantic_core.Url"pydantic_core.Urlr@ +schemepydantic_core.Url.scheme + builtins.str" builtins.strr< +hostpydantic_core.Url.host + builtins.str" builtins.strr< +pathpydantic_core.Url.path + builtins.str" builtins.strr< +portpydantic_core.Url.port + builtins.int" builtins.intrf +querypydantic_core.Url.queryD +Union[builtins.str,None] + builtins.str" builtins.str +Nonerl +fragmentpydantic_core.Url.fragmentD +Union[builtins.str,None] + builtins.str" builtins.str +Nonerl +usernamepydantic_core.Url.usernameD +Union[builtins.str,None] + builtins.str" builtins.str +Nonerl +passwordpydantic_core.Url.passwordD +Union[builtins.str,None] + builtins.str" builtins.str +None to_jsonpydantic_core.to_json" builtins.bytes"builtins.bytes* value diff --git a/python-frontend/typeshed_serializer/checksums/custom.checksum b/python-frontend/typeshed_serializer/checksums/custom.checksum index eb9746d4f..306ed0ce9 100644 --- a/python-frontend/typeshed_serializer/checksums/custom.checksum +++ b/python-frontend/typeshed_serializer/checksums/custom.checksum @@ -1,2 +1,2 @@ -ade4b3ecdc51464c4df5ed6a34d5fc812a98ca8b4a4295271a7e95eabf0ea40c -bcedf4de70ef2d2ba3c6cd0de0dfce24299f3f7180181acd1f7cc5e7933571ea \ No newline at end of file +8e1d3d75aa65524f697a3a0bf08e003623c27d4faf645274a659113f14f0f6b4 +400db68fc1c2e086c4219c993e22675d87158b8af647ef3a760cddbd08079b76 \ No newline at end of file diff --git a/python-frontend/typeshed_serializer/resources/custom/pydantic/__init__.pyi b/python-frontend/typeshed_serializer/resources/custom/pydantic/__init__.pyi index f027bb03a..e8575a880 100644 --- a/python-frontend/typeshed_serializer/resources/custom/pydantic/__init__.pyi +++ b/python-frontend/typeshed_serializer/resources/custom/pydantic/__init__.pyi @@ -1,4 +1,5 @@ from pydantic.config import ConfigDict from pydantic.fields import Field, FieldInfo, PrivateAttr from pydantic.main import BaseModel -from pydantic.types import SecretStr +from pydantic.types import * +from pydantic.networks import * diff --git a/python-frontend/typeshed_serializer/resources/custom/pydantic/networks.pyi b/python-frontend/typeshed_serializer/resources/custom/pydantic/networks.pyi new file mode 100644 index 000000000..d151eec3c --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/pydantic/networks.pyi @@ -0,0 +1,54 @@ +# URL types (FQN: pydantic.networks.*) +# All URL classes share the same interface — they wrap pydantic_core.Url internally. +class AnyUrl: + scheme: str + host: str + path: str + port: int + query: str | None + fragment: str | None + username: str | None + password: str | None + def unicode_string(self) -> str: ... + def unicode_host(self) -> str: ... + def query_params(self) -> list: ... + def encoded_string(self) -> str: ... + +class AnyHttpUrl(AnyUrl): ... +class HttpUrl(AnyUrl): ... +class FileUrl(AnyUrl): ... +class AnyWebsocketUrl(AnyUrl): ... +class WebsocketUrl(AnyUrl): ... +class FtpUrl(AnyUrl): ... +class AmqpDsn(AnyUrl): ... +class CockroachDsn(AnyUrl): ... +class KafkaDsn(AnyUrl): ... +class RedisDsn(AnyUrl): ... +class PostgresDsn(AnyUrl): ... +class MongoDsn(AnyUrl): ... + +# pydantic.networks.Url — identical to pydantic_core.Url at runtime (same object in pydantic v2). +# Defined here as a class so `from pydantic.networks import Url` resolves to FQN pydantic.networks.Url +# (cross-stub re-exports are not followed by the type engine). +# TODO: consolidate to pydantic_core.Url on the security side (FastApiSource.java). +class Url: + scheme: str + host: str + path: str + port: int + query: str | None + fragment: str | None + username: str | None + password: str | None + def unicode_string(self) -> str: ... + def unicode_host(self) -> str: ... + def query_params(self) -> list: ... + +# Network address types (FQN: pydantic.networks.*) +class IPvAnyAddress: ... +class IPvAnyInterface: ... +class IPvAnyNetwork: ... + +# Email / name types (FQN: pydantic.networks.*) +class EmailStr(str): ... +class NameEmail: ... diff --git a/python-frontend/typeshed_serializer/resources/custom/pydantic/types.pyi b/python-frontend/typeshed_serializer/resources/custom/pydantic/types.pyi index 68a960d47..a286fe043 100644 --- a/python-frontend/typeshed_serializer/resources/custom/pydantic/types.pyi +++ b/python-frontend/typeshed_serializer/resources/custom/pydantic/types.pyi @@ -1,3 +1,79 @@ +from typing import Any +from decimal import Decimal +from datetime import date, datetime +from pathlib import Path +from uuid import UUID + +# Real classes defined in pydantic.types (FQN: pydantic.types.*) class SecretStr: def __init__(self, secret_value: str) -> None: ... def get_secret_value(self) -> str: ... + +class ByteSize(int): ... +class Json: ... +class ImportString: ... +class StringConstraints: ... +class PaymentCardNumber: ... +class PastDate(date): ... +class FutureDate(date): ... +class PastDatetime(datetime): ... +class FutureDatetime(datetime): ... +class AwareDatetime(datetime): ... +class NaiveDatetime(datetime): ... + +# Constrained type factories (FQN: pydantic.types.*) +class conint(int): + def __init__(self, *, strict: bool = ..., gt: int = ..., ge: int = ..., lt: int = ..., le: int = ..., multiple_of: int = ...) -> None: ... + +class conlist(list): + def __init__(self, item_type: Any = ..., *, min_length: int = ..., max_length: int = ...) -> None: ... + +class conset(set): + def __init__(self, item_type: Any = ..., *, min_length: int = ..., max_length: int = ...) -> None: ... + +class confrozenset(frozenset): + def __init__(self, item_type: Any = ..., *, min_length: int = ..., max_length: int = ...) -> None: ... + +class conbytes(bytes): + def __init__(self, *, strict: bool = ..., min_length: int = ..., max_length: int = ...) -> None: ... + +class constr(str): + def __init__(self, *, strip_whitespace: bool = ..., to_upper: bool = ..., to_lower: bool = ..., strict: bool = ..., min_length: int = ..., max_length: int = ..., pattern: str = ..., ascii_only: bool = ...) -> None: ... + +class confloat(float): + def __init__(self, *, strict: bool = ..., gt: float = ..., ge: float = ..., lt: float = ..., le: float = ..., multiple_of: float = ..., allow_inf_nan: bool = ...) -> None: ... + +class condecimal(Decimal): + def __init__(self, *, strict: bool = ..., gt: Any = ..., ge: Any = ..., lt: Any = ..., le: Any = ..., multiple_of: Any = ..., max_digits: int = ..., decimal_places: int = ..., allow_inf_nan: bool = ...) -> None: ... + +class condate(date): + def __init__(self, *, strict: bool = ..., gt: date = ..., ge: date = ..., lt: date = ..., le: date = ...) -> None: ... + +# Annotated aliases — no real class, defined in pydantic.types as Annotated[, ...] +# Best FQN is pydantic.types.* (where they are defined in pydantic source) +class StrictStr(str): ... + +class PositiveInt(int): ... +class NegativeInt(int): ... +class NonNegativeInt(int): ... +class NonPositiveInt(int): ... + +class PositiveFloat(float): ... +class NegativeFloat(float): ... +class NonNegativeFloat(float): ... +class NonPositiveFloat(float): ... +class FiniteFloat(float): ... + +class FilePath(Path): ... +class DirectoryPath(Path): ... +class NewPath(Path): ... + +class Base64Bytes(bytes): ... +class Base64UrlBytes(bytes): ... +class Base64Str(str): ... +class Base64UrlStr(str): ... + +class UUID1(UUID): ... +class UUID3(UUID): ... +class UUID4(UUID): ... +class UUID5(UUID): ... diff --git a/python-frontend/typeshed_serializer/resources/custom/pydantic_core/__init__.pyi b/python-frontend/typeshed_serializer/resources/custom/pydantic_core/__init__.pyi index 72cfb6919..c743224cc 100644 --- a/python-frontend/typeshed_serializer/resources/custom/pydantic_core/__init__.pyi +++ b/python-frontend/typeshed_serializer/resources/custom/pydantic_core/__init__.pyi @@ -1,5 +1,20 @@ from typing import Any, Callable, Optional +# URL type (FQN: pydantic_core._pydantic_core.Url, exposed as pydantic_core.Url) +# Identical interface to pydantic.networks.AnyUrl/_BaseUrl — same object in pydantic v2. +class Url: + scheme: str + host: str + path: str + port: int + query: Optional[str] + fragment: Optional[str] + username: Optional[str] + password: Optional[str] + def unicode_string(self) -> str: ... + def unicode_host(self) -> str: ... + def query_params(self) -> list: ... + def to_json( value: Any, *, From 1739a656298c98ec60ffba49989276a6a853683e Mon Sep 17 00:00:00 2001 From: Lijun Chen Date: Tue, 14 Jul 2026 11:50:38 +0200 Subject: [PATCH 214/322] SONARPY-3868 S8411 Fix FPs with more accurate modelling of fastapi's dependency injection system Telemetry showed S8411 had about a 27% false-positive rate. The hypothesis is that there are several other ways path parameters can be used in FastAPI, that we don't model correctly. To reduce FPs, model FastAPI dependency injection system more accurately: - Follow `Security` in addition to `Depends` to collect dependencies. - Handle `Annotated` type aliases and `typing_extensions.Annotated` - Support `Path(alias=...)` in both annotations and default values - Include dependencies declared on each path operation decorators and globally on FastAPI routers and applications - Inspect locally resolvable class and callable-instance dependencies Overall, to avoid FPs, bail out in cases where too much dynamic information is required or it is too complex to statically analyze. We accept that we can introduce more FNs due to this. Note that this PR does not handle `include_router`, so dependencies defined there are ignored. This is a potential source of of FPs. But handling it is non-trivial and left as future work, after assessing the telemetry data. See https://github.com/SonarSource/sonar-python-enterprise/pull/1273#discussion_r3571893060 for the full discussion. GitOrigin-RevId: 0655a754d14585705ac43e653773d6728ca37595 --- .../checks/FastAPIPathParametersCheck.java | 511 +++++++++++++++--- .../resources/checks/fastapiPathParameters.py | 457 +++++++++++++++- 2 files changed, 879 insertions(+), 89 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/FastAPIPathParametersCheck.java b/python-checks/src/main/java/org/sonar/python/checks/FastAPIPathParametersCheck.java index 6d9e8bde3..8fc051aa9 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/FastAPIPathParametersCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/FastAPIPathParametersCheck.java @@ -21,18 +21,24 @@ import java.util.Objects; import java.util.Optional; import java.util.Set; +import java.util.function.Consumer; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.IntStream; import java.util.stream.Stream; +import javax.annotation.Nullable; import org.sonar.check.Rule; import org.sonar.plugins.python.api.PythonSubscriptionCheck; import org.sonar.plugins.python.api.SubscriptionContext; import org.sonar.plugins.python.api.symbols.v2.SymbolV2; import org.sonar.plugins.python.api.symbols.v2.UsageV2; import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.ClassDef; import org.sonar.plugins.python.api.tree.Decorator; import org.sonar.plugins.python.api.tree.Expression; import org.sonar.plugins.python.api.tree.FunctionDef; +import org.sonar.plugins.python.api.tree.LambdaExpression; +import org.sonar.plugins.python.api.tree.ListLiteral; import org.sonar.plugins.python.api.tree.Name; import org.sonar.plugins.python.api.tree.Parameter; import org.sonar.plugins.python.api.tree.ParameterList; @@ -40,14 +46,11 @@ import org.sonar.plugins.python.api.tree.RegularArgument; import org.sonar.plugins.python.api.tree.SubscriptionExpression; import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.tree.Tuple; import org.sonar.plugins.python.api.tree.TypeAnnotation; -import org.sonar.plugins.python.api.types.v2.FunctionType; -import org.sonar.plugins.python.api.types.v2.ParameterV2; import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; import org.sonar.python.checks.utils.Expressions; -import org.sonar.python.checks.utils.FunctionParameterUtils; -import org.sonar.python.checks.utils.FunctionParameterUtils.FunctionParameterInfo; import org.sonar.python.tree.TreeUtils; @Rule(key = "S8411") @@ -59,7 +62,7 @@ public class FastAPIPathParametersCheck extends PythonSubscriptionCheck { private static final List HTTP_METHODS = List.of( "get", "post", "put", "delete", "patch", "options", "head", "trace"); - private static final Pattern PATH_PARAM_PATTERN = Pattern.compile("\\{([^}:]+)(?::[^}]*)?\\}"); + private static final Pattern PATH_PARAM_PATTERN = Pattern.compile("\\{([a-zA-Z_]\\w*)(?::[a-zA-Z_]\\w*)?\\}"); private static final TypeMatcher FASTAPI_ROUTE_MATCHER = TypeMatchers.any( HTTP_METHODS.stream() @@ -68,8 +71,23 @@ public class FastAPIPathParametersCheck extends PythonSubscriptionCheck { TypeMatchers.isType("fastapi.APIRouter." + method))) ); - private static final TypeMatcher FASTAPI_DEPENDS_MATCHER = TypeMatchers.isType("fastapi.param_functions.Depends"); + private static final TypeMatcher FASTAPI_DEPENDS_MATCHER = TypeMatchers.any( + TypeMatchers.isType("fastapi.param_functions.Depends"), + TypeMatchers.isType("fastapi.param_functions.Security")); + private static final TypeMatcher FASTAPI_PATH_MATCHER = TypeMatchers.isType("fastapi.param_functions.Path"); private static final TypeMatcher TYPING_ANNOTATED_MATCHER = TypeMatchers.isType("typing.Annotated"); + private static final TypeMatcher FASTAPI_APPLICATION_OR_ROUTER_MATCHER = TypeMatchers.any( + TypeMatchers.isType("fastapi.FastAPI"), + TypeMatchers.isType("fastapi.applications.FastAPI"), + TypeMatchers.isType("fastapi.APIRouter"), + TypeMatchers.isType("fastapi.routing.APIRouter")); + private static final Set FASTAPI_APPLICATION_OR_ROUTER_NAMES = Set.of( + "FastAPI", + "fastapi.FastAPI", + "fastapi.applications.FastAPI", + "APIRouter", + "fastapi.APIRouter", + "fastapi.routing.APIRouter"); @Override public void initialize(Context context) { @@ -98,88 +116,410 @@ private static void checkDecorator(SubscriptionContext ctx, Decorator decorator, return; } - FunctionParameterInfo paramInfo = FunctionParameterUtils.extractFunctionParameters(functionDef); - pathParams.removeAll(extractDependencyParameters(functionDef, ctx)); - reportIssues(ctx, functionDef, pathParams, paramInfo); - } + DependencyCollector dependencyCollector = new DependencyCollector(ctx); + dependencyCollector.collect(functionDef, callExpr); - private static Set extractDependencyParameters(FunctionDef functionDef, SubscriptionContext ctx) { - return extractDependencyParameters(functionDef, ctx, new HashSet<>()); + reportIssues(ctx, functionDef, pathParams, dependencyCollector); } - private static Set extractDependencyParameters(FunctionDef functionDef, SubscriptionContext ctx, Set visited) { - if (!visited.add(functionDef)) { - return Set.of(); - } - ParameterList parameterList = functionDef.parameters(); - if (parameterList == null) { - return Set.of(); - } - Set dependencyParams = new HashSet<>(); - parameterList.nonTuple().stream() - .map(param -> getDependsCall(param, ctx)) - .filter(Optional::isPresent) - .map(Optional::get) - .forEach(dependsCall -> collectDependencyParams(dependsCall, dependencyParams, visited, ctx)); - return dependencyParams; - } + private static final class DependencyCollector { + private final SubscriptionContext ctx; + private final Set names = new HashSet<>(); + private final Set positionalOnlyParams = new HashSet<>(); + private final Set visitedFunctions = new HashSet<>(); + // True when a dynamic, unresolved, or unsupported source could still provide route-visible parameters. + // In that case missing-parameter issues are not reliable, but positional-only issues are still reported. + private boolean hasUnresolvedOrUnsupportedParameterSources; - private static Optional getDependsCall(Parameter param, SubscriptionContext ctx) { - Expression defaultValue = param.defaultValue(); - if (defaultValue instanceof CallExpression callExpr && FASTAPI_DEPENDS_MATCHER.isTrueFor(callExpr.callee(), ctx)) { - return Optional.of(callExpr); - } - TypeAnnotation typeAnnotation = param.typeAnnotation(); - if (typeAnnotation != null && typeAnnotation.expression() instanceof SubscriptionExpression subscriptionExpr - && TYPING_ANNOTATED_MATCHER.isTrueFor(subscriptionExpr.object(), ctx)) { - return subscriptionExpr.subscripts().expressions().stream() - .filter(e -> e instanceof CallExpression ce && FASTAPI_DEPENDS_MATCHER.isTrueFor(ce.callee(), ctx)) - .map(e -> (CallExpression) e) - .findFirst(); + DependencyCollector(SubscriptionContext ctx) { + this.ctx = ctx; + } + + void collect(FunctionDef pathOperationFunction, CallExpression pathOperationDecoratorCall) { + visitFunction(pathOperationFunction, false, true); + visitDependenciesArgument(pathOperationDecoratorCall); + visitApplicationOrRouterDependencies(pathOperationDecoratorCall); } - return Optional.empty(); - } - private static void collectDependencyParams(CallExpression dependsCall, Set dependencyParams, Set visited, SubscriptionContext ctx) { - TreeUtils.nthArgumentOrKeywordOptional(0, "dependency", dependsCall.arguments()) - .map(RegularArgument::expression) - .ifPresent(argExpr -> { - if (argExpr.typeV2() instanceof FunctionType funcType) { - funcType.parameters().stream() - .filter(param -> !param.isVariadic()) - .map(ParameterV2::name) - .filter(Objects::nonNull) - .forEach(dependencyParams::add); + private void visitApplicationOrRouterDependencies(CallExpression pathOperationDecoratorCall) { + // FastAPI applies dependencies declared on FastAPI(...) / APIRouter(...) to every route + // registered on that object. For `router = APIRouter(dependencies=[Depends(dep)])` and + // `@router.get(...)`, inspect the receiver (`router`) as another dependency entry point. + if (!(pathOperationDecoratorCall.callee() instanceof QualifiedExpression qualifiedExpression)) { + return; + } + + Expression receiver = resolveLocalAliasChain(qualifiedExpression.qualifier()); + if (receiver instanceof CallExpression callExpression && isFastApiApplicationOrRouterCall(callExpression)) { + visitDependenciesArgument(callExpression); + } + } + + private void visitDependenciesArgument(CallExpression callExpression) { + RegularArgument dependenciesArgument = TreeUtils.argumentByKeyword("dependencies", callExpression.arguments()); + if (dependenciesArgument == null) { + return; + } + + Expression dependenciesExpression = resolveLocalAliasChain(dependenciesArgument.expression()); + if (!(dependenciesExpression instanceof ListLiteral || dependenciesExpression instanceof Tuple)) { + if (dependenciesExpression instanceof Name || dependenciesExpression instanceof QualifiedExpression) { + markUnresolvedParameterSource(); + } else { + markUnsupportedParameterSource(); } - getFunctionDef(argExpr).ifPresent(depFuncDef -> - dependencyParams.addAll(extractDependencyParameters(depFuncDef, ctx, visited)) - ); - }); - } + return; + } + + Expressions.expressionsFromListOrTuple(dependenciesExpression).forEach(this::visitDependencyListElement); + } + + private void visitDependencyListElement(Expression element) { + Expression dependency = resolveLocalAliasChain(element); + if (dependency instanceof CallExpression callExpression && isDependsCall(callExpression)) { + visitDependsCall(callExpression, null); + } else if (dependency instanceof Name || dependency instanceof QualifiedExpression) { + markUnresolvedParameterSource(); + } else { + markUnsupportedParameterSource(); + } + } + + private void visitFunction(FunctionDef functionDef, boolean skipFirstParameter, boolean recordPositionalOnlyParams) { + if (!visitedFunctions.add(functionDef)) { + return; + } + + ParameterList parameterList = functionDef.parameters(); + if (parameterList == null) { + return; + } + + visitParameterList(parameterList, skipFirstParameter, recordPositionalOnlyParams); + } + + private void visitLambda(LambdaExpression lambdaExpression) { + ParameterList parameterList = lambdaExpression.parameters(); + if (parameterList == null) { + return; + } + visitParameterList(parameterList, false, false); + } + + private void visitParameterList(ParameterList parameterList, boolean skipFirstParameter, boolean recordPositionalOnlyParams) { + List parameters = parameterList.nonTuple().stream() + .skip(skipFirstParameter ? 1 : 0) + .toList(); + + int slashParameterIndex = IntStream.range(0, parameters.size()) + .filter(i -> isSlashParameter(parameters.get(i))) + .findFirst() + .orElse(-1); + for (int i = 0; i < parameters.size(); i++) { + Parameter parameter = parameters.get(i); + if (parameter.name() != null) { + visitParameter(parameter, slashParameterIndex != -1 && i < slashParameterIndex, recordPositionalOnlyParams); + } + } + } + + private void visitParameter(Parameter parameter, boolean isPositionalOnly, boolean recordPositionalOnlyParams) { + if (parameter.starToken() != null) { + if ("**".equals(parameter.starToken().value())) { + markUnresolvedParameterSource(); + } + return; + } + + Set pathAliases = new HashSet<>(); + Expression parameterType = visitTypeAnnotation(parameter.typeAnnotation(), pathAliases::add).orElse(null); + visitDefaultValue(parameter.defaultValue(), parameterType, pathAliases::add); + + Name parameterName = parameter.name(); + if (parameterName != null) { + if (pathAliases.isEmpty()) { + names.add(parameterName.name()); + if (isPositionalOnly && recordPositionalOnlyParams) { + positionalOnlyParams.add(parameterName.name()); + } + } else { + names.addAll(pathAliases); + if (isPositionalOnly && recordPositionalOnlyParams) { + positionalOnlyParams.addAll(pathAliases); + } + } + } + } + + private Optional visitTypeAnnotation(@Nullable TypeAnnotation typeAnnotation, Consumer pathAliasConsumer) { + if (typeAnnotation == null) { + return Optional.empty(); + } + return visitTypeAnnotationExpression(typeAnnotation.expression(), new HashSet<>(), pathAliasConsumer); + } + + private Optional visitTypeAnnotationExpression(Expression annotationExpression, Set visitedAliases, Consumer pathAliasConsumer) { + // Parenthesized annotations are common in formatted multiline Annotated[...] expressions. + Expression expression = Expressions.removeParentheses(annotationExpression); + + if (expression instanceof Name name) { + Optional assignedExpression = assignedTypeAliasValue(name, visitedAliases); + if (assignedExpression.isPresent()) { + return visitTypeAnnotationExpression(assignedExpression.get(), visitedAliases, pathAliasConsumer); + } + } + + if (expression instanceof SubscriptionExpression subscriptionExpression && isAnnotatedObject(subscriptionExpression.object())) { + // Annotated stores the real type first; FastAPI metadata such as Depends and Path follows. + List subscripts = subscriptionExpression.subscripts().expressions(); + if (subscripts.isEmpty()) { + return Optional.empty(); + } + Expression baseType = subscripts.get(0); + subscripts.stream() + .skip(1) + .forEach(metadata -> visitAnnotationMetadata(metadata, baseType, pathAliasConsumer)); + return Optional.of(baseType); + } + + if (expression instanceof CallExpression) { + markUnsupportedParameterSource(); + } + + return Optional.of(expression); + } + + private void visitAnnotationMetadata(Expression metadata, @Nullable Expression parameterType, Consumer pathAliasConsumer) { + visitDependencyMarkerExpression(metadata, parameterType, pathAliasConsumer); + } + + private void visitDefaultValue(@Nullable Expression defaultValue, @Nullable Expression parameterType, Consumer pathAliasConsumer) { + if (defaultValue != null) { + visitDependencyMarkerExpression(defaultValue, parameterType, pathAliasConsumer); + } + } + + // FastAPI reads dependency/path marker objects from both parameter defaults + // and Annotated[...] metadata, so both contexts share the same handling. + private void visitDependencyMarkerExpression(Expression expression, @Nullable Expression parameterType, Consumer pathAliasConsumer) { + Expression resolvedExpression = resolveLocalAliasChain(expression); + if (resolvedExpression instanceof CallExpression callExpression) { + if (isDependsCall(callExpression)) { + visitDependsCall(callExpression, parameterType); + } else if (isPathCall(callExpression)) { + visitPathAlias(callExpression, pathAliasConsumer); + } else { + markUnsupportedParameterSource(); + } + } else if (resolvedExpression instanceof Name || resolvedExpression instanceof QualifiedExpression) { + markUnresolvedParameterSource(); + } + } + + private void visitDependsCall(CallExpression dependsCall, @Nullable Expression parameterType) { + Optional explicitTarget = TreeUtils.nthArgumentOrKeywordOptional(0, "dependency", dependsCall.arguments()) + .map(RegularArgument::expression); + Expression target = explicitTarget.orElse(parameterType); + if (target == null) { + // Bare Depends() without a parameter type gives FastAPI no callable to inspect. + return; + } + visitDependencyCallable(target); + } + + private void visitPathAlias(CallExpression pathCall, Consumer pathAliasConsumer) { + RegularArgument aliasArgument = TreeUtils.argumentByKeyword("alias", pathCall.arguments()); + if (aliasArgument == null) { + return; + } + Optional alias = extractStringValue(aliasArgument.expression()); + if (alias.isPresent()) { + pathAliasConsumer.accept(alias.get()); + } else { + markUnresolvedParameterSource(); + } + } + + private void visitDependencyCallable(Expression expression) { + // FastAPI accepts any callable dependency. We only inspect callable shapes that can be resolved locally. + Expression target = resolveLocalAliasChain(expression); + + Optional functionDef = getFunctionDef(target); + if (functionDef.isPresent()) { + // Depends(get_item) / Depends(SomeClass.get_item): FastAPI inspects the dependency function signature. + visitFunction(functionDef.get(), false, false); + return; + } + + Optional classDef = getClassDef(target); + if (classDef.isPresent()) { + // Depends(ItemQuery) / Depends() with an Annotated class type: FastAPI inspects the constructor signature. + visitClassConstructor(classDef.get()); + return; + } + + if (target instanceof CallExpression callExpression) { + // Depends(ItemChecker()) / checker = ItemChecker(); Depends(checker): FastAPI inspects the instance __call__ signature. + // FastAPI accepts arbitrary callable results from dependency factory functions, but we cannot inspect them statically. + Expression callee = resolveLocalAliasChain(callExpression.callee()); + Optional calleeClassDef = getClassDef(callee); + if (calleeClassDef.isPresent()) { + visitCallableInstance(calleeClassDef.get()); + return; + } + } + + if (target instanceof LambdaExpression lambdaExpression) { + // Depends(lambda item_id: ...): FastAPI accepts any callable, including lambdas. + visitLambda(lambdaExpression); + return; + } + + if (target instanceof Name || target instanceof QualifiedExpression) { + markUnresolvedParameterSource(); + } else { + markUnsupportedParameterSource(); + } + } + + private void visitClassConstructor(ClassDef classDef) { + Optional initFunction = topLevelMethod(classDef, "__init__"); + if (initFunction.isPresent()) { + visitFunction(initFunction.get(), true, false); + } else if (!classDef.decorators().isEmpty() || classDef.args() != null) { + // Decorators and base classes can generate or inherit constructor parameters. + markUnsupportedParameterSource(); + } + } + + private void visitCallableInstance(ClassDef classDef) { + Optional callFunction = topLevelMethod(classDef, "__call__"); + if (callFunction.isPresent()) { + visitFunction(callFunction.get(), true, false); + } else if (!classDef.decorators().isEmpty() || classDef.args() != null) { + // Decorators and base classes can generate or inherit callable behavior. + markUnsupportedParameterSource(); + } + } + + private static Expression resolveLocalAliasChain(Expression expression) { + // Follow simple local aliases like `route_deps = [Deps(...)]` while preserving the last expression when resolution stops. + Expression target = Expressions.removeParentheses(expression); + Set visitedAliases = new HashSet<>(); + while (target instanceof Name name) { + Expression assignedValue = Expressions.singleAssignedValue(name, visitedAliases); + if (assignedValue == null) { + return target; + } + target = Expressions.removeParentheses(assignedValue); + } + return target; + } + + private Optional assignedTypeAliasValue(Name name, Set visitedAliases) { + Expression assignedValue = Expressions.singleAssignedValue(name); + if (assignedValue == null) { + return Optional.empty(); + } + SymbolV2 symbol = name.symbolV2(); + if (symbol != null && !visitedAliases.add(symbol)) { + // Stop chasing type aliases such as A = B; B = A. The unresolved alias chain may hide Annotated metadata. + markUnresolvedParameterSource(); + return Optional.empty(); + } + return Optional.of(Expressions.removeParentheses(assignedValue)); + } + + private static Optional topLevelMethod(ClassDef classDef, String methodName) { + return TreeUtils.topLevelFunctionDefs(classDef).stream() + .filter(functionDef -> methodName.equals(functionDef.name().name())) + .findFirst(); + } + + private static Optional getFunctionDef(Expression expression) { + return findDeclarationAncestor(expression, UsageV2.Kind.FUNC_DECLARATION, FunctionDef.class, Tree.Kind.FUNCDEF); + } + + private static Optional getClassDef(Expression expression) { + return findDeclarationAncestor(expression, UsageV2.Kind.CLASS_DECLARATION, ClassDef.class, Tree.Kind.CLASSDEF); + } + + private static Optional findDeclarationAncestor(Expression expression, UsageV2.Kind usageKind, Class declarationClass, Tree.Kind declarationKind) { + // Map a resolved symbol usage back to the local declaration syntax node. + Name name; + if (expression instanceof Name n) { + name = n; + } else if (expression instanceof QualifiedExpression qe) { + name = qe.name(); + } else { + name = null; + } + if (name == null) { + return Optional.empty(); + } + SymbolV2 symbol = name.symbolV2(); + if (symbol == null) { + return Optional.empty(); + } + return symbol.usages().stream() + .filter(u -> u.kind() == usageKind) + .map(UsageV2::tree) + .map(tree -> TreeUtils.firstAncestorOfKind(tree, declarationKind)) + .filter(Objects::nonNull) + .map(declarationClass::cast) + .findFirst(); + } + + private boolean isAnnotatedObject(Expression expression) { + if (TYPING_ANNOTATED_MATCHER.isTrueFor(expression, ctx)) { + return true; + } + return localAliasResolvedName(expression) + .filter(name -> "Annotated".equals(name) || "typing.Annotated".equals(name) || "typing_extensions.Annotated".equals(name)) + .isPresent(); + } + + private boolean isDependsCall(CallExpression callExpression) { + return FASTAPI_DEPENDS_MATCHER.isTrueFor(callExpression.callee(), ctx) + || localAliasResolvedName(callExpression.callee()).filter(name -> "Depends".equals(name) || "Security".equals(name)).isPresent(); + } + + private boolean isPathCall(CallExpression callExpression) { + return FASTAPI_PATH_MATCHER.isTrueFor(callExpression.callee(), ctx) + || localAliasResolvedName(callExpression.callee()).filter("Path"::equals).isPresent(); + } + + private boolean isFastApiApplicationOrRouterCall(CallExpression callExpression) { + return FASTAPI_APPLICATION_OR_ROUTER_MATCHER.isTrueFor(callExpression.callee(), ctx) + || localAliasResolvedName(callExpression.callee()) + .filter(FASTAPI_APPLICATION_OR_ROUTER_NAMES::contains) + .isPresent(); + } + + private static Optional localAliasResolvedName(Expression expression) { + return TreeUtils.stringValueFromNameOrQualifiedExpression(resolveLocalAliasChain(expression)); + } + + private static boolean isSlashParameter(Parameter parameter) { + return parameter.starToken() != null && "/".equals(parameter.starToken().value()); + } + + private void markUnresolvedParameterSource() { + // Use when resolving further would likely require dynamic or intermodule data-flow analysis. + hasUnresolvedOrUnsupportedParameterSources = true; + } + + private void markUnsupportedParameterSource() { + // Use when the expression is not one of the FastAPI shapes we explicitly support. Some such + // expressions may still be valid FastAPI usage that we do not model statically yet, such as + // unpacking, calls, conditional expressions, or subscriptions producing Depends(...) or + // Path(...) values; + // others may be plainly invalid API usage and could theoretically be ignored. Proving that + // precisely is non-trivial and better left to type checking, so keep the rule conservative + // and bail out. + hasUnresolvedOrUnsupportedParameterSources = true; + } - private static Optional getFunctionDef(Expression expression) { - Name name; - if (expression instanceof Name n) { - name = n; - } else if (expression instanceof QualifiedExpression qe) { - name = qe.name(); - } else { - name = null; - } - if (name == null) { - return Optional.empty(); - } - SymbolV2 symbol = name.symbolV2(); - if (symbol == null) { - return Optional.empty(); - } - return symbol.usages().stream() - .filter(u -> u.kind() == UsageV2.Kind.FUNC_DECLARATION) - .map(UsageV2::tree) - .map(tree -> TreeUtils.firstAncestorOfKind(tree, Tree.Kind.FUNCDEF)) - .filter(Objects::nonNull) - .map(FunctionDef.class::cast) - .findFirst(); } private static Set extractPathParameters(CallExpression callExpr) { @@ -202,13 +542,18 @@ private static Optional extractStringValue(Expression expression) { .map(Expressions::unescape); } - private static void reportIssues(SubscriptionContext ctx, FunctionDef functionDef, Set pathParams, FunctionParameterInfo paramInfo) { + private static void reportIssues( + SubscriptionContext ctx, + FunctionDef functionDef, + Set pathParams, + DependencyCollector dependencyCollector) { pathParams.stream() - .filter(paramInfo::isMissingFromSignature) + .filter(param -> !dependencyCollector.names.contains(param)) + .filter(param -> !dependencyCollector.hasUnresolvedOrUnsupportedParameterSources) .forEach(param -> ctx.addIssue(functionDef.name(), String.format(MISSING_PARAM_MESSAGE, param))); pathParams.stream() - .filter(paramInfo.positionalOnlyParams()::contains) + .filter(dependencyCollector.positionalOnlyParams::contains) .forEach(param -> ctx.addIssue(functionDef.name(), String.format(POSITIONAL_ONLY_MESSAGE, param))); } } diff --git a/python-checks/src/test/resources/checks/fastapiPathParameters.py b/python-checks/src/test/resources/checks/fastapiPathParameters.py index fe6105ef3..d85f3a4da 100644 --- a/python-checks/src/test/resources/checks/fastapiPathParameters.py +++ b/python-checks/src/test/resources/checks/fastapiPathParameters.py @@ -1,6 +1,9 @@ import typing -from fastapi import FastAPI, APIRouter, Depends +from fastapi import FastAPI, APIRouter, Depends, Security, Path from typing import Annotated +from pydantic import BaseModel +from dataclasses import dataclass +import typing_extensions app = FastAPI() router = APIRouter() @@ -122,11 +125,11 @@ def compliant_with_converter(item_id: int): return {"item_id": item_id} @app.get("/items/{item_id}") -def compliant_with_kwargs(**kwargs): +def no_issue_bailout_with_kwargs(**kwargs): return kwargs @app.get("/items/{item_id}") -def compliant_with_args_kwargs(*args, **kwargs): +def no_issue_bailout_with_args_kwargs(*args, **kwargs): return {"args": args, "kwargs": kwargs} @app.get(status_code=200, path="/items/{item_id}") @@ -170,19 +173,113 @@ def compliant_empty_path(): def compliant_path_is_not_a_string(): pass +# --- starlette route syntax --- +# FastAPI builts upon starlette. +# It documents support for "path convert" +# See https://fastapi.tiangolo.com/tutorial/path-params/?h=convert#path-convertor +# But starlette supports also other kinds of coverters (int, float, uuid, etc.) +# See https://starlette.dev/routing/ + +@app.get("/items/{item_id:int}") +def noncompliant_path_param_with_int_converter(): # Noncompliant + pass + +@app.get("/items/{item_id:path}") +def noncompliant_path_param_with_path_converter(): # Noncompliant + pass + +@app.get("/items/{item_id : path}") +def compliant_ignore_invalid_starlette_route_0(): + pass + +@app.get("/items/{ item_id }") +def compliant_ignore_invalid_starlette_route_1(): + pass + # --- Depends() path parameter delegation --- def get_item(item_id: int): return {"item_id": item_id} +def get_item_positional_only(item_id: int, /): + return {"item_id": item_id} + @router.get("/items/{item_id}") def compliant_depends_default_value(item=Depends(get_item)): return item +@router.get("/items/{item_id}") +def compliant_depends_positional_only_dependency(item=Depends(get_item_positional_only)): + # Theoretically it is also valuable to raise on positional-only parameters + # in dependency callables. But let's not do that for now to limit the scope + # of our work. And, perhaps not using positional-only parameters can be + # an entirely different rule, that is orthogonal to path parameters. + return item + +@router.get("/items/{item_id}") +def compliant_depends_dependency_keyword(item=Depends(dependency=get_item)): + return item + +@app.get("/items/{item_id}") +def no_issue_bailout_unresolved_dependency(item=Depends(unknown_dependency)): + # `unknown_dependency` cannot be resolved. Bail out to avoid FPs. + pass + +@app.get("/users/{user_id}/items/{item_id}") +def noncompliant_positional_only_and_missing_bailout(user_id: int, /, item=Depends(unknown_dependency)): # Noncompliant {{Path parameter "user_id" should not be positional-only.}} + # We don't raise for `item_id`. Bail out to avoid FPs. + # But `user_id` is positional and this shoudl be raised even though we cannot resolve `unknown_dependency` + pass + +def dependency_factory(): + return dep_without_item_id + +@app.get("/items/{item_id}") +def no_issue_bailout_dynamic_dependency(item=Depends(dependency_factory())): + # We don't try to analyze the dynamic behavior of `dependency_factory`. + # Bail out to avoid FPs. + pass + +def dependency_marker_factory(): + return Depends(get_item) + +@app.get("/items/{item_id}") +def no_issue_bailout_dynamic_default_value_dependency(item=dependency_marker_factory()): + # The default value may still evaluate to a valid FastAPI dependency marker. + # Bail out rather than report a FP. + pass + @app.get("/items/{item_id}") def compliant_depends_annotated(item: Annotated[dict, Depends(get_item)]): return item +ItemDependency = Annotated[dict, Depends(get_item)] + +@app.get("/items/{item_id}") +def compliant_depends_annotated_type_alias(item: ItemDependency): + pass + +def get_dependency_annotation(): + return Annotated[dict, Depends(dep_without_item_id)] + +DynamicDependency = get_dependency_annotation() + +@app.get("/items/{item_id}") +def no_issue_bailout_runtime_type_alias(item: DynamicDependency): + # Type alias is not. Bail out to avoid FPs. + pass + +CyclicDependencyA = CyclicDependencyB +CyclicDependencyB = CyclicDependencyA + +@app.get("/items/{item_id}") +def no_issue_bailout_cyclic_type_alias(item: CyclicDependencyA): + pass + +@app.get("/items/{item_id}") +def compliant_depends_annotated_from_typing_extension(item: typing_extensions.Annotated[dict, Depends(get_item)]): + return item + @app.get("/users/{user_id}/items/{item_id}") def compliant_depends_partial(user_id: int, item=Depends(get_item)): return {"user_id": user_id, "item": item} @@ -205,6 +302,27 @@ def noncompliant_depends_param_not_in_dep(item=Depends(dep_without_item_id)): # def compliant_depends_annotated_qualified(item: typing.Annotated[dict, Depends(get_item)]): return item +@app.get("/items/{item_id}") +def compliant_security_dependency(item=Security(get_item)): + # Security works in the same way of Depends. + # See https://fastapi.tiangolo.com/reference/dependencies/?h=depends+securi#fastapi.Security + pass + +# --- Multiple dependencies in Annotated --- +# Note: FastAPI only documents Annotated with a single Depends(). It is thus an invalid use of FastAPI. +# ruff bails out in this situation. +# We currently just pick the first Depends. + +@app.get("/items/{item_id}") +def compliant_multiple_depends_metadata_union(item: Annotated[dict, Depends(dep_without_item_id), Depends(get_item)]): + pass + + +@app.get("/items/{item_id}") +def noncompliant_multiple_depends_metadata_no_match(item: Annotated[dict, Depends(dep_without_item_id), Depends(dep_without_item_id)]): # Noncompliant + pass + + # --- Nested/recursive Depends() --- def get_item_wrapper(item=Depends(get_item)): @@ -231,8 +349,18 @@ def dep_level1_no_id(x=Depends(dep_level2_no_id)): def noncompliant_nested_depends_not_covering(item=Depends(dep_level1_no_id)): # Noncompliant {{Add path parameter "item_id" to the function signature.}} return item +def wrapper(dep=Depends(unknown_dependency)): + return dep + + +@app.get("/items/{item_id}") +def no_issue_bailout_unknown_nested_dependency(item=Depends(wrapper)): + # wrapper depends on `unknown_dependency`, which we cannot resolve. + # Bail out to avoid FPs. + pass + # --- Circular dependency detection (cycle in Depends chain) --- -# dep_b_circular references dep_a_circular (defined below) - tests cycle detection at line 112 +# dep_b_circular references dep_a_circular (defined below) def dep_b_circular(dep=Depends(dep_a_circular)): return dep @@ -243,7 +371,7 @@ def dep_a_circular(item_id: int, dep=Depends(dep_b_circular)): def compliant_circular_depends(dep=Depends(dep_a_circular)): return dep -# --- QualifiedExpression as Depends argument (tests lines 164-165 and 174) --- +# --- QualifiedExpression as Depends argument --- class ItemDepsHolder: @staticmethod def get_item(item_id: int): @@ -253,7 +381,324 @@ def get_item(item_id: int): def compliant_qualified_expr_depends(dep=Depends(ItemDepsHolder.get_item)): return dep -# --- Non-Name/non-QualifiedExpression as Depends argument (tests lines 167 and 170) --- +# --- Non-Name/non-QualifiedExpression as Depends argument --- @app.get("/items/{item_id}") def noncompliant_lambda_depends(dep=Depends(lambda: None)): # Noncompliant {{Add path parameter "item_id" to the function signature.}} return dep + + +@app.get("/items/{item_id}") +def compliant_lambda_depends_with_path_param(dep=Depends(lambda item_id: item_id)): + return dep + +@app.get("/items/{item_id}") +def noncompliant_depends_without_target(dep=Depends()): # Noncompliant + pass + + +# --- Dependencies specified in path operation decorators --- +# See https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/ + +@app.get("/items/{item_id}", dependencies=[Depends(get_item)]) +def compliant_route_dependency_covers_path_param(): + pass + + +@app.get("/items/{item_id}", dependencies=[Depends(dep_without_item_id)]) +def noncompliant_route_dependency_does_not_cover_path_param(): # Noncompliant + pass + +dependencies = [Depends(unknown_dependency)] + +@app.get("/items/{item_id}", dependencies=dependencies) +def no_issue_bailout_route_dependencies_alias_with_unresolved_dependency(): + pass + + +@app.get("/items/{item_id}", dependencies=unknown_dependencies) +def no_issue_bailout_unresolved_route_dependencies_argument(): + pass + + +@app.get("/items/{item_id}", dependencies=get_route_dependencies()) +def no_issue_bailout_dynamic_route_dependencies_argument(): + pass + + +@app.get("/items/{item_id}", dependencies=[dependency_marker_factory()]) +def no_issue_bailout_dynamic_route_dependency_list_entry(): + pass + + +@app.get("/items/{item_id}", dependencies=[Depends(unknown_dependency)]) +def no_issue_bailout_dependency_unresolved(): + pass + + +@app.get("/items/{item_id}", dependencies=[unknown_dependency]) +def no_issue_bailout_unresolved_direct_route_dependency(): + pass + + +@app.get("/items/{item_id}", dependencies=[*dependencies]) +def no_issue_bailout_on_dependencies_sequence_unpacking(): + pass + + +@app.get("/items/{item_id}", dependencies=[object()]) +def no_issue_bailout_invalid_route_dependency_list_entry_object(): + # Not a dependency entry we support. And in this case it's clearly wrong + # FastAPI usage. We bail out. + pass + +@app.get("/items/{item_id}", dependencies=[42]) +def no_issue_bailout_invalid_route_dependency_list_entry_integer(): + # Not a dependency entry we support. And in this case it's clearly wrong + # FastAPI usage. We bail out. + pass + + +# --- Dependencies specified in FastAPI/APIRouter constructors --- +# See https://fastapi.tiangolo.com/tutorial/dependencies/global-dependencies/ + +router_with_dependency = APIRouter(dependencies=[Depends(get_item)]) + +@router_with_dependency.get("/items/{item_id}") +def compliant_router_dependency_covers_path_param(): + pass + + +router_without_path_dependency = APIRouter(dependencies=[Depends(dep_without_item_id)]) + +@router_without_path_dependency.get("/items/{item_id}") +def noncompliant_router_dependency_does_not_cover_path_param(): # Noncompliant + pass + + +app_with_dependency = FastAPI(dependencies=[Depends(get_item)]) + +@app_with_dependency.get("/items/{item_id}") +def compliant_app_dependency_covers_path_param(): + pass + + +FastAPIAlias = FastAPI +app_with_aliased_fastapi_dependency = FastAPIAlias(dependencies=[Depends(get_item)]) + +@app_with_aliased_fastapi_dependency.get("/items/{item_id}") +def compliant_aliased_app_dependency_covers_path_param(): + pass + + +# --- Path aliases --- +# See docs on `alias` param at https://fastapi.tiangolo.com/reference/parameters/?h=Path+reference#fastapi.Path + +@app.get("/items/{item-id}") +def compliant_literal_path_alias(item_id: Annotated[int, Path(alias="item-id")]): + pass + + +@app.get("/items/{item_id}") +def noncompliant_path_alias_replaces_parameter_name(item_id: Annotated[int, Path(alias="other_id")]): # Noncompliant {{Add path parameter "item_id" to the function signature.}} + pass + + +@app.get("/items/{item-id}") +def compliant_default_value_path_alias(item_id: int = Path(alias="item-id")): + pass + + +@app.get("/items/{item_id}") +def compliant_default_value_path_without_alias(item_id: int = Path()): + pass + + +@app.get("/items/{item_id}") +def noncompliant_default_value_path_without_alias(other_id: int = Path()): # Noncompliant + pass + +ITEM_ID_ALIAS = "item-id" + +@app.get("/items/{item-id}") +def compliant_constant_path_alias(item_id: Annotated[int, Path(alias=ITEM_ID_ALIAS)]): + pass + + +@app.get("/items/{item-id}") +def no_issue_bailout_unknown_path_alias(item_id: Annotated[int, Path(alias=get_alias_unresolved())]): + pass + + +@app.get("/items/{item-id}") +def no_issue_bailout_unknown_default_value_path_alias(item_id: int = Path(alias=get_alias_unresolved())): + pass + + +def get_item_with_alias(item_id: Annotated[int, Path(alias="item-id")]): + return item_id + + +@app.get("/items/{item-id}") +def compliant_dependency_has_path_alias(item=Depends(get_item_with_alias)): + pass + + +def get_item_with_default_alias(item_id: int = Path(alias="item-id")): + return item_id + + +@app.get("/items/{item-id}") +def compliant_dependency_default_value_path_alias(item=Depends(get_item_with_default_alias)): + pass + +# --- Class dependencies --- +# --- Callable dependency instances --- +# See https://fastapi.tiangolo.com/tutorial/dependencies/classes-as-dependencies/ + +class ItemQuery: + def __init__(self, item_id: int): + pass + + +@app.get("/items/{item_id}") +def compliant_class_dependency(query: Annotated[ItemQuery, Depends(ItemQuery)]): + pass + + +@app.get("/items/{item_id}") +def compliant_class_dependency_default_value(query: ItemQuery = Depends(ItemQuery)): + pass + + +class EmptyItemQuery: + pass + + +@app.get("/items/{item_id}") +def noncompliant_class_dependency_without_path_param_in_init(query: Annotated[EmptyItemQuery, Depends(EmptyItemQuery)]): # Noncompliant + pass + + +class PydanticItemQueryWithoutPathParam(BaseModel): + name: str + + +@app.get("/items/{item_id}") +def no_issue_bailout_pydantic_dependency(query: Annotated[PydanticItemQueryWithoutPathParam, Depends(PydanticItemQueryWithoutPathParam)]): + pass + + +@dataclass +class DataclassItemQueryWithoutPathParam: + name: str + + +@app.get("/items/{item_id}") +def no_issue_bailout_dataclass_dependency(query: Annotated[DataclassItemQueryWithoutPathParam, Depends(DataclassItemQueryWithoutPathParam)]): + pass + + +def generated_constructor(cls): + return cls + + +@generated_constructor +class DecoratedItemQuery: + item_id: int + + +@app.get("/items/{item_id}") +def no_issue_bailout_decorated_class_without_explicit_init(query: Annotated[DecoratedItemQuery, Depends(DecoratedItemQuery)]): + pass + + +class ItemChecker: + def __call__(self, item_id: int): + return item_id + + +checker = ItemChecker() + + +@app.get("/items/{item_id}") +def compliant_callable_instance_dependency(item=Depends(checker)): + pass + + +@app.get("/items/{item_id}") +def compliant_callable_constructor_instance_dependency(item=Depends(ItemChecker())): + pass + + +class DependencyWithoutCall: + pass + + +dependency_without_call = DependencyWithoutCall() + + +@app.get("/items/{item_id}") +def noncompliant_dependency_instance_without_call(item=Depends(dependency_without_call)): # Noncompliant {{Add path parameter "item_id" to the function signature.}} + pass + + +class InheritedCallableDependency(ItemChecker): + pass + + +inherited_callable_dependency = InheritedCallableDependency() + + +@app.get("/items/{other_id}") +def no_issue_bailout_inherited_callable_dependency(item=Depends(inherited_callable_dependency)): + pass + + +class ItemCheckerClassReference: + def __call__(self, item_id: int): + return item_id + + +@app.get("/items/{item_id}") +def noncompliant_class_dependency_without_init_path_param(item=Depends(ItemCheckerClassReference)): # Noncompliant {{Add path parameter "item_id" to the function signature.}} + # FastAPI inspects __init__ when Depends receives a class, not the __call__ method used by instances. + pass + + +# --- Shortcut when class callable is used as dependency --- +# See https://fastapi.tiangolo.com/tutorial/dependencies/classes-as-dependencies/?h=shortcut#type-annotation-vs-depends + +@app.get("/items/{item_id}") +def compliant_depends_shortcut_annotated(query: Annotated[ItemQuery, Depends()]): + pass + + +@app.get("/items/{item_id}") +def compliant_depends_shortcut_default(query: ItemQuery = Depends()): + pass + + +# --- Known FPs: include_router(..., dependencies=...) is currently out of scope --- + +def require_item_access(item_id: int): + return item_id + +router_included_with_dependency = APIRouter() +@router_included_with_dependency.get("/items/{item_id}") +def known_fp_app_include_router_dependency(): # Noncompliant + # Known FP: `app.include_router(..., dependencies=[Depends(require_item_access)])` + # covers `item_id`, but include_router dependencies are currently not modeled by this rule. + pass + +app_with_include_router_dependency = FastAPI() +app_with_include_router_dependency.include_router(router_included_with_dependency, dependencies=[Depends(require_item_access)]) + +parent_router_with_include_router_dependency = APIRouter() +child_router_included_with_dependency = APIRouter() +parent_router_with_include_router_dependency.include_router(child_router_included_with_dependency, dependencies=[Depends(require_item_access)]) + +@child_router_included_with_dependency.get("/items/{item_id}/issues") +def known_fp_router_include_router_dependency(): # Noncompliant + # Known FP: `parent_router.include_router(..., dependencies=[Depends(require_item_access)])` + # covers `item_id`, but nested include_router dependencies are currently not modeled by this rule. + pass From 53e4627c3cddc8ea7d48221314add8c22739ac27 Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Tue, 14 Jul 2026 13:57:33 +0200 Subject: [PATCH 215/322] SONARPY-4362 Create rule S8978: Pydantic models with dataclass fields should set "revalidate_instances" to "always" GitOrigin-RevId: 91109dbe8ebe462df25fd5db22e6f6d8038630cc --- .../python/checks/OpenSourceCheckList.java | 1 + .../PydanticDataclassRevalidationCheck.java | 247 +++++++++++++ .../org/sonar/l10n/py/rules/python/S8978.html | 72 ++++ .../org/sonar/l10n/py/rules/python/S8978.json | 26 ++ .../py/rules/python/Sonar_way_profile.json | 3 +- ...ydanticDataclassRevalidationCheckTest.java | 29 ++ .../checks/pydanticDataclassRevalidation.py | 330 ++++++++++++++++++ 7 files changed, 707 insertions(+), 1 deletion(-) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/PydanticDataclassRevalidationCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8978.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8978.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/PydanticDataclassRevalidationCheckTest.java create mode 100644 python-checks/src/test/resources/checks/pydanticDataclassRevalidation.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index f8c81c6eb..382e6e0e6 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -386,6 +386,7 @@ public Stream> getChecks() { PublicNetworkAccessToCloudResourcesCheck.class, PydanticConfigDictValidationOptionsCheck.class, PydanticCoreSerializationFallbackCheck.class, + PydanticDataclassRevalidationCheck.class, PydanticDoubleUnderscorePrivateAttributeCheck.class, PydanticJsonSchemaInputTypeWithAfterModeCheck.class, PydanticOptionalFieldDefaultCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/PydanticDataclassRevalidationCheck.java b/python-checks/src/main/java/org/sonar/python/checks/PydanticDataclassRevalidationCheck.java new file mode 100644 index 000000000..a23fcd61c --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/PydanticDataclassRevalidationCheck.java @@ -0,0 +1,247 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import javax.annotation.Nullable; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.symbols.v2.SymbolV2; +import org.sonar.plugins.python.api.symbols.v2.UsageV2; +import org.sonar.plugins.python.api.tree.AnnotatedAssignment; +import org.sonar.plugins.python.api.tree.ArgList; +import org.sonar.plugins.python.api.tree.Argument; +import org.sonar.plugins.python.api.tree.AssignmentStatement; +import org.sonar.plugins.python.api.tree.BinaryExpression; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.ClassDef; +import org.sonar.plugins.python.api.tree.DictionaryLiteral; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.KeyValuePair; +import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.StringLiteral; +import org.sonar.plugins.python.api.tree.SubscriptionExpression; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.ClassType; +import org.sonar.plugins.python.api.types.v2.PythonType; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.checks.utils.Expressions; +import org.sonar.python.tree.TreeUtils; + +@Rule(key = "S8978") +public class PydanticDataclassRevalidationCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Explicitly set 'revalidate_instances' in this Pydantic model's configuration."; + + private static final TypeMatcher IS_PYDANTIC_MODEL = TypeMatchers.isOrExtendsType("pydantic.BaseModel"); + + private static final TypeMatcher IS_CONFIG_DICT = TypeMatchers.isType("pydantic.ConfigDict"); + + private static final TypeMatcher IS_DATACLASS_DECORATOR = TypeMatchers.isType("dataclasses.dataclass"); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.CLASSDEF, PydanticDataclassRevalidationCheck::checkClassDef); + } + + private static final String SECONDARY_MESSAGE = "The dataclass-typed field is defined here."; + + private static void checkClassDef(SubscriptionContext ctx) { + ClassDef classDef = (ClassDef) ctx.syntaxNode(); + + if (!IS_PYDANTIC_MODEL.isTrueFor(classDef.name(), ctx)) { + return; + } + + if (hasExplicitRevalidateInstances(classDef, ctx) + || hasRevalidateInstancesKeywordArg(classDef) + || hasInheritedRevalidateInstances(classDef, ctx)) { + return; + } + + List dataclassFields = classDef.body().statements().stream() + .flatMap(TreeUtils.toStreamInstanceOfMapper(AnnotatedAssignment.class)) + .filter(aa -> isDataclassAnnotation(aa.annotation().expression(), ctx)) + .toList(); + + if (!dataclassFields.isEmpty()) { + var issue = ctx.addIssue(classDef.name(), MESSAGE); + dataclassFields.forEach(aa -> issue.secondary(aa.variable(), SECONDARY_MESSAGE)); + } + } + + /** + * Returns true if any ancestor of this class (per Python's MRO) explicitly sets + * {@code revalidate_instances} — either via {@code ConfigDict}/dict-literal assignment or as a + * class keyword argument. Uses {@link ClassType#mro()} for correct C3-linearized traversal, + * including diamond inheritance. Only ancestors whose {@code ClassDef} can be resolved in the + * same file are inspected; cross-file ancestors are conservatively ignored. + */ + private static boolean hasInheritedRevalidateInstances(ClassDef classDef, SubscriptionContext ctx) { + PythonType type = classDef.name().typeV2(); + if (!(type instanceof ClassType classType)) { + return false; + } + // Collect the full set of ancestor ClassTypes (skip self at index 0) + Set ancestors = new HashSet<>(classType.mro().orElse(List.of())); + ancestors.remove(classType); + if (ancestors.isEmpty()) { + return false; + } + // Walk base class Name expressions; for each one resolved to a same-file ClassDef, + // check whether it (or any of its same-file ancestors) sets revalidate_instances. + return collectSameFileClassDefs(classDef, ancestors).stream() + .anyMatch(ancestorDef -> hasExplicitRevalidateInstances(ancestorDef, ctx) + || hasRevalidateInstancesKeywordArg(ancestorDef)); + } + + /** + * Collects {@link ClassDef} AST nodes for all ancestors of {@code classDef} that appear in + * {@code ancestorTypes}, resolving transitively through same-file base classes. + */ + private static List collectSameFileClassDefs(ClassDef classDef, Set ancestorTypes) { + ArgList argList = classDef.args(); + if (argList == null) { + return List.of(); + } + List result = new ArrayList<>(); + for (Argument arg : argList.arguments()) { + if (!(arg instanceof RegularArgument regArg) || + regArg.keywordArgument() != null || + !(regArg.expression() instanceof Name name)) { + continue; + } + findClassDef(name.symbolV2()).ifPresent(baseClassDef -> { + if (ancestorTypes.contains(baseClassDef.name().typeV2())) { + result.add(baseClassDef); + result.addAll(collectSameFileClassDefs(baseClassDef, ancestorTypes)); + } + }); + } + return result; + } + + /** + * Returns true if the class body contains a {@code ConfigDict(revalidate_instances=...)} assignment + * with any value for {@code revalidate_instances}. + * The variable name on the left-hand side is not checked; instead the callee type is matched. + */ + private static boolean hasExplicitRevalidateInstances(ClassDef classDef, SubscriptionContext ctx) { + return classDef.body().statements().stream() + .flatMap(TreeUtils.toStreamInstanceOfMapper(AssignmentStatement.class)) + .anyMatch(stmt -> assignsConfigDictWithRevalidateInstances(stmt, ctx)); + } + + /** + * Returns true if the class declaration uses a keyword argument for {@code revalidate_instances}, + * e.g. {@code class Foo(BaseModel, revalidate_instances='always')}. + */ + private static boolean hasRevalidateInstancesKeywordArg(ClassDef classDef) { + ArgList argList = classDef.args(); + if (argList == null) { + return false; + } + return hasRevalidateInstancesKeyword(argList.arguments()); + } + + /** + * Returns true if the assignment's right-hand side explicitly sets {@code revalidate_instances}. + * Recognizes two forms: + *
              + *
            • {@code ConfigDict(revalidate_instances=...)} — call identified by callee type
            • + *
            • {@code {'revalidate_instances': ...}} — plain dict literal
            • + *
            + * If the RHS is a variable reference, it is resolved to its single assigned value first. + * This handles patterns like {@code COMMON_CONFIG = ConfigDict(revalidate_instances='always')} + * used as {@code model_config = COMMON_CONFIG} (possibly at module level or via chained aliases). + */ + private static boolean assignsConfigDictWithRevalidateInstances(AssignmentStatement stmt, SubscriptionContext ctx) { + Expression rhs = Expressions.ifNameGetSingleAssignedNonNameValue(stmt.assignedValue()).orElse(null); + if (rhs == null) { + return false; + } + if (rhs instanceof CallExpression callExpr && IS_CONFIG_DICT.isTrueFor(callExpr.callee(), ctx)) { + return hasRevalidateInstancesKeyword(callExpr.arguments()); + } + if (rhs instanceof DictionaryLiteral dict) { + return dict.elements().stream() + .flatMap(TreeUtils.toStreamInstanceOfMapper(KeyValuePair.class)) + .map(KeyValuePair::key) + .anyMatch(k -> k instanceof StringLiteral sl && "revalidate_instances".equals(sl.trimmedQuotesValue())); + } + return false; + } + + private static boolean hasRevalidateInstancesKeyword(List arguments) { + return arguments.stream() + .flatMap(TreeUtils.toStreamInstanceOfMapper(RegularArgument.class)) + .anyMatch(arg -> { + Name keyword = arg.keywordArgument(); + return keyword != null && "revalidate_instances".equals(keyword.name()); + }); + } + + /** + * Returns true if the given annotation expression refers to a class decorated with {@code @dataclass} + * that is defined in the same file. + * Handles bare names, generic wrappers ({@code Optional[X]}, {@code List[X]}, {@code Annotated[X, ...]}, etc.) + * and PEP-604 union syntax ({@code X | Y}). + */ + private static boolean isDataclassAnnotation(Expression annotationExpr, SubscriptionContext ctx) { + if (annotationExpr instanceof Name nameExpr) { + return findClassDef(nameExpr.symbolV2()) + .map(referencedClassDef -> isDecoratedWithDataclass(referencedClassDef, ctx)) + .orElse(false); + } + if (annotationExpr instanceof SubscriptionExpression subscriptionExpr) { + return subscriptionExpr.subscripts().expressions().stream() + .anyMatch(inner -> isDataclassAnnotation(inner, ctx)); + } + if (annotationExpr.is(Tree.Kind.BITWISE_OR)) { + BinaryExpression binExpr = (BinaryExpression) annotationExpr; + return isDataclassAnnotation(binExpr.leftOperand(), ctx) + || isDataclassAnnotation(binExpr.rightOperand(), ctx); + } + return false; + } + + private static Optional findClassDef(@Nullable SymbolV2 symbolV2) { + if (symbolV2 == null) { + return Optional.empty(); + } + return symbolV2.usages().stream() + .filter(usage -> usage.kind() == UsageV2.Kind.CLASS_DECLARATION) + .map(usage -> TreeUtils.firstAncestorOfKind(usage.tree(), Tree.Kind.CLASSDEF)) + .filter(Objects::nonNull) + .map(ClassDef.class::cast) + .findFirst(); + } + + private static boolean isDecoratedWithDataclass(ClassDef classDef, SubscriptionContext ctx) { + return classDef.decorators().stream() + .map(decorator -> decorator.expression() instanceof CallExpression callExpr ? callExpr.callee() : decorator.expression()) + .anyMatch(decoratorExpr -> IS_DATACLASS_DECORATOR.isTrueFor(decoratorExpr, ctx)); + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8978.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8978.html new file mode 100644 index 000000000..d53cc4131 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8978.html @@ -0,0 +1,72 @@ +

            This rule raises an issue when a validation model class has fields typed to accept instances of structured data types (such as dataclasses), but +does not explicitly configure the framework’s revalidation behavior for those instances.

            +

            In Pydantic specifically, this refers to BaseModel classes with fields typed as standard library or Pydantic dataclasses.

            +

            Why is this an issue?

            +

            Validation frameworks do not revalidate pre-existing data structure instances by default. When an already-instantiated object is passed as a field +value, the framework skips validation and accepts it as-is — even if the object was constructed with invalid data. Because lightweight data structures +such as dataclasses perform no runtime type checking themselves, invalid field values can silently enter a validated model without raising any +error.

            +

            Exceptions

            +

            This rule does not raise an issue when revalidate_instances is explicitly set, regardless of the value. An explicit +'never' signals that the developer has made a conscious choice to skip revalidation — for example, when dataclass instances are always +constructed from trusted, pre-validated data.

            +

            In Pydantic, for example, constructing User(name=['not', 'a', 'string']) succeeds because dataclasses.dataclass does not +check types at runtime. Passing that instance to a BaseModel field typed as User raises no ValidationError — +the list is stored silently in place of the expected string.

            +

            What is the potential impact?

            +

            Without proper revalidation, your application may process invalid data that should have been rejected. This can lead to:

            +
              +
            • Runtime errors when code assumes data has been validated
            • +
            • Incorrect business logic execution due to unexpected data types
            • +
            • Data corruption if invalid data is persisted to a database
            • +
            • Security vulnerabilities if validation is used to enforce security constraints
            • +
            +

            How to fix it

            +

            Explicitly set revalidate_instances on the BaseModel that holds the dataclass field. This can be done with +ConfigDict or as a class keyword argument.

            +

            Choose the value that matches your intent:

            +
              +
            • 'always' — Pydantic revalidates every dataclass instance passed to the model, including ones constructed elsewhere.
            • +
            • 'subclass-instances' — revalidates only when the instance is of a subclass of the declared field type.
            • +
            • 'never' — skips revalidation; use this only when dataclass instances are guaranteed to be constructed from trusted, pre-validated + data.
            • +
            +

            Code examples

            +

            Noncompliant code example

            +
            +import dataclasses
            +from pydantic import BaseModel
            +
            +@dataclasses.dataclass
            +class User:
            +    name: str
            +
            +class Foo(BaseModel):  # Noncompliant
            +    user: User
            +
            +

            Compliant solution

            +
            +import dataclasses
            +from pydantic import BaseModel, ConfigDict
            +
            +@dataclasses.dataclass
            +class User:
            +    name: str
            +
            +class Foo(BaseModel, revalidate_instances='always'):  # always revalidate
            +    user: User
            +
            +class Bar(BaseModel):  # ConfigDict syntax
            +    model_config = ConfigDict(revalidate_instances='always')
            +    user: User
            +
            +class Baz(BaseModel, revalidate_instances='never'):  # explicitly opt out
            +    user: User
            +
            +

            Resources

            +

            Documentation

            + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8978.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8978.json new file mode 100644 index 000000000..18a184f00 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8978.json @@ -0,0 +1,26 @@ +{ + "title": "Pydantic models with dataclass fields should set \"revalidate_instances\" to \"always\"", + "type": "BUG", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5 min" + }, + "tags": [ + "pydantic", + "validation", + "pitfall" + ], + "defaultSeverity": "Critical", + "ruleSpecification": "RSPEC-8978", + "sqKey": "S8978", + "scope": "All", + "quickfix": "unknown", + "code": { + "impacts": { + "RELIABILITY": "HIGH", + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "COMPLETE" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 60aecca1f..42a218326 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -372,6 +372,7 @@ "S8966", "S8971", "S8973", - "S8974" + "S8974", + "S8978" ] } diff --git a/python-checks/src/test/java/org/sonar/python/checks/PydanticDataclassRevalidationCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/PydanticDataclassRevalidationCheckTest.java new file mode 100644 index 000000000..cdd5ae202 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/PydanticDataclassRevalidationCheckTest.java @@ -0,0 +1,29 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.junit.jupiter.api.Test; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class PydanticDataclassRevalidationCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/pydanticDataclassRevalidation.py", new PydanticDataclassRevalidationCheck()); + } + +} diff --git a/python-checks/src/test/resources/checks/pydanticDataclassRevalidation.py b/python-checks/src/test/resources/checks/pydanticDataclassRevalidation.py new file mode 100644 index 000000000..717f52d10 --- /dev/null +++ b/python-checks/src/test/resources/checks/pydanticDataclassRevalidation.py @@ -0,0 +1,330 @@ +import dataclasses +import pydantic.dataclasses as pydantic_dataclasses +from pydantic import BaseModel, ConfigDict +from typing import Optional, List, Annotated, Union + + +# ===================== +# NON-COMPLIANT CASES +# ===================== + +@dataclasses.dataclass +class User: + name: str + + +class Foo(BaseModel): # Noncompliant {{Explicitly set 'revalidate_instances' in this Pydantic model's configuration.}} +# ^^^ + user: User +# ^^^^< {{The dataclass-typed field is defined here.}} + + +@dataclasses.dataclass +class Address: + street: str + + +class Bar(BaseModel): # Noncompliant +# ^^^ + address: Address +# ^^^^^^^< {{The dataclass-typed field is defined here.}} + + +# model_config present but without revalidate_instances +class Baz(BaseModel): # Noncompliant +# ^^^ + model_config = ConfigDict(frozen=True) + user: User +# ^^^^< {{The dataclass-typed field is defined here.}} + + +# multiple dataclass fields - one issue per class, secondary on each field +class MultiField(BaseModel): # Noncompliant +# ^^^^^^^^^^ + user: User +# ^^^^< {{The dataclass-typed field is defined here.}} + address: Address +# ^^^^^^^< {{The dataclass-typed field is defined here.}} + + +# ===================== +# FINDING 2: WRAPPED ANNOTATION TYPES (NON-COMPLIANT) +# ===================== + +class WrappedOptional(BaseModel): # Noncompliant +# ^^^^^^^^^^^^^^^ + user: Optional[User] +# ^^^^< {{The dataclass-typed field is defined here.}} + +class WrappedList(BaseModel): # Noncompliant +# ^^^^^^^^^^^ + users: List[User] +# ^^^^^< {{The dataclass-typed field is defined here.}} + +class WrappedAnnotated(BaseModel): # Noncompliant +# ^^^^^^^^^^^^^^^^ + user: Annotated[User, 'meta'] +# ^^^^< {{The dataclass-typed field is defined here.}} + +class WrappedUnion(BaseModel): # Noncompliant +# ^^^^^^^^^^^^ + user: Union[User, None] +# ^^^^< {{The dataclass-typed field is defined here.}} + +class WrappedNestedGeneric(BaseModel): # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^ + data: dict[str, User] +# ^^^^< {{The dataclass-typed field is defined here.}} + + +# ===================== +# PYDANTIC DATACLASS AS FIELD TYPE +# ===================== + +@pydantic_dataclasses.dataclass +class PydanticUser: + name: str + + +class WithPydanticDataclass(BaseModel): # already validated + user: PydanticUser + + +# ===================== +# COMPLIANT CASES +# ===================== + +# revalidate_instances='always' via ConfigDict +class Compliant(BaseModel): + model_config = ConfigDict(revalidate_instances='always') + user: User + + +# ConfigDict assigned to a non-standard variable name — still detected by callee type +class CompliantNonStandardVarName(BaseModel): + my_config = ConfigDict(revalidate_instances='always') + user: User + + +# revalidate_instances='always' with other options +class CompliantWithOtherOptions(BaseModel): + model_config = ConfigDict(frozen=True, revalidate_instances='always') + user: User + + +# revalidate_instances='never' — any explicit value is acceptable +class CompliantNever(BaseModel): + model_config = ConfigDict(revalidate_instances='never') + user: User + + +# revalidate_instances='subclass-instances' — any explicit value is acceptable +class CompliantSubclassInstances(BaseModel): + model_config = ConfigDict(revalidate_instances='subclass-instances') + user: User + + +# class keyword argument syntax — 'always' +class CompliantKwargAlways(BaseModel, revalidate_instances='always'): + user: User + + +# class keyword argument syntax — 'never' (explicit opt-out) +class CompliantKwargNever(BaseModel, revalidate_instances='never'): + user: User + + +# class keyword argument syntax — 'subclass-instances' +class CompliantKwargSubclass(BaseModel, revalidate_instances='subclass-instances'): + user: User + + +# No dataclass-typed fields — no issue +class NoDataclassField(BaseModel): + name: str + age: int + + +# Field typed as a plain class (not a dataclass) — no issue +class PlainClass: + name: str + +class WithPlainClass(BaseModel): + obj: PlainClass + + +# Not a BaseModel subclass — no issue +@dataclasses.dataclass +class StandaloneDataclass: + value: int + + +# Not a BaseModel — dataclass with dataclass field +@dataclasses.dataclass +class Container: + user: User + + +# ===================== +# FINDING 1: DICT-LITERAL model_config (COMPLIANT) +# ===================== + +# dict-literal with revalidate_instances — any explicit value is acceptable +class CompliantDictLiteralAlways(BaseModel): + model_config = {'revalidate_instances': 'always'} + user: User + +class CompliantDictLiteralNever(BaseModel): + model_config = {'revalidate_instances': 'never'} + user: User + +class CompliantDictLiteralWithOtherKeys(BaseModel): + model_config = {'frozen': True, 'revalidate_instances': 'always'} + user: User + + +# ===================== +# FINDING 2: WRAPPED ANNOTATION TYPES (COMPLIANT) +# ===================== + +class CompliantWrappedOptional(BaseModel): + model_config = ConfigDict(revalidate_instances='always') + user: Optional[User] + +class CompliantWrappedList(BaseModel): + model_config = ConfigDict(revalidate_instances='always') + users: List[User] + + +# ===================== +# FINDING 3: INHERITED revalidate_instances (COMPLIANT) +# ===================== + +class BaseWithConfigDictReval(BaseModel): + model_config = ConfigDict(revalidate_instances='always') + +class ChildOfConfigDictBase(BaseWithConfigDictReval): # Compliant — inherits via ConfigDict + user: User + +class BaseWithKwargReval(BaseModel, revalidate_instances='always'): + pass + +class ChildOfKwargBase(BaseWithKwargReval): # Compliant — inherits via keyword arg + user: User + +# Multi-hop: grandchild inherits from a child that inherits revalidate_instances +class GrandchildOfConfigDictBase(ChildOfConfigDictBase): # Compliant — inherits transitively + address: Address + + +# ===================== +# FINDING 4: MODULE-LEVEL / ALIASED ConfigDict VARIABLE (COMPLIANT) +# ===================== + +# module-level variable holding ConfigDict with revalidate_instances +COMMON_CONFIG = ConfigDict(revalidate_instances='always') + +class CompliantModuleLevelConfigVar(BaseModel): + model_config = COMMON_CONFIG + user: User + + +# chained alias: A = ConfigDict(...); B = A; model_config = B +ALIAS_A = ConfigDict(revalidate_instances='always') +ALIAS_B = ALIAS_A + +class CompliantChainedAlias(BaseModel): + model_config = ALIAS_B + user: User + + +# module-level dict literal with revalidate_instances +DICT_CONFIG = {'revalidate_instances': 'always'} + +class CompliantModuleLevelDictVar(BaseModel): + model_config = DICT_CONFIG + user: User + + +# module-level variable WITHOUT revalidate_instances — still noncompliant +BAD_CONFIG = ConfigDict(frozen=True) + +class NoncompliantModuleLevelConfigVar(BaseModel): # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + model_config = BAD_CONFIG + user: User +# ^^^^< {{The dataclass-typed field is defined here.}} + + +# ===================== +# EDGE CASES +# ===================== + +# Class with no fields — no issue +class EmptyModel(BaseModel): + pass + + +# BaseModel with only class variables — no issue (no AnnotatedAssignment without annotation being a dataclass) +class ModelWithClassVar(BaseModel): + name: str + + +# Cross-file dataclass fields cannot be detected — treated as unknown type, no issue raised +# (no test case needed here since we only detect same-file dataclasses) + +# Unresolved type annotation — no issue (unknown type, conservative) +class ModelWithUnresolved(BaseModel): + user: UnknownType + + +# ===================== +# COVERAGE: ADDITIONAL EDGE CASES +# ===================== + +# PEP-604 union syntax (X | Y) — noncompliant +class PEP604Union(BaseModel): # Noncompliant +# ^^^^^^^^^^^ + user: User | None +# ^^^^< {{The dataclass-typed field is defined here.}} + + +# PEP-604 union syntax — compliant with revalidate_instances set +class CompliantPEP604Union(BaseModel): + model_config = ConfigDict(revalidate_instances='always') + user: User | None + + +# PEP-604 union where right operand is the dataclass — noncompliant +class PEP604UnionRightOperand(BaseModel): # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^^^^ + user: None | User +# ^^^^< {{The dataclass-typed field is defined here.}} + + +# model_config assigned something that is not a ConfigDict call, dict literal, or variable reference — +# no revalidate_instances found, so issue IS raised +def make_config(): + return ConfigDict(revalidate_instances='always') + +class ModelWithCallRHS(BaseModel): # Noncompliant +# ^^^^^^^^^^^^^^^^ + model_config = make_config() + user: User +# ^^^^< {{The dataclass-typed field is defined here.}} + + +# Ambiguous Name RHS (assigned in multiple places) — conservative, treated as no config +AMBIGUOUS_CONFIG = ConfigDict(revalidate_instances='always') +AMBIGUOUS_CONFIG = ConfigDict(frozen=True) + +class ModelWithAmbiguousConfig(BaseModel): # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^^^^^ + model_config = AMBIGUOUS_CONFIG + user: User +# ^^^^< {{The dataclass-typed field is defined here.}} + + +# Annotation that is not a Name, SubscriptionExpression, or BinaryExpression — no issue +class ModelWithLiteralAnnotation(BaseModel): + value: 42 From a73cb416d896a118e61a29254cb631a64c7355e7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 15 Jul 2026 09:23:47 +0200 Subject: [PATCH 216/322] Update all non-major dependencies Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Victor Diez GitOrigin-RevId: d113ad6fdb839e0b5fac24177694630fd9c69e5d --- .github/renovate.json | 34 +++---------------- its/plugin/it-python-plugin-test/pom.xml | 2 +- pom.xml | 26 +++++++------- .../checks/flaskHardCodedJWTSecretKey.py | 10 +++--- .../checks/flaskHardCodedSecretKey.py | 20 +++++------ .../resources/checks/hardCodedCredentials.py | 12 +++---- .../checks/hardcodedCredentialsCall.py | 8 ++--- sonar-python-plugin/pom.xml | 2 +- 8 files changed, 44 insertions(+), 70 deletions(-) diff --git a/.github/renovate.json b/.github/renovate.json index e8bb78b68..6b5a352bc 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -8,40 +8,14 @@ ], "packageRules": [ { + "description": "Keep Python on 3.9 for typeshed serialization", "matchManagers": [ - "maven" + "mise" ], "matchPackageNames": [ - "*" + "python" ], - "matchUpdateTypes": [ - "minor", - "patch" - ], - "groupName": "all non-major dependencies", - "groupSlug": "all-minor-patch" - }, - { - "matchPackageNames": [ - "/sonar-plugin-api/", - "/org.sonarsource.sonarqube.*/" - ], - "groupName": "sonarqube", - "groupSlug": "sq" - }, - { - "matchPackageNames": [ - "com.google.protobuf:protobuf-java", - "com.google.protobuf:protoc" - ], - "groupName": "protobuf", - "groupSlug": "protobuf" - }, - { - "matchPackageNames": [ - "/org.sonarsource.sonarlint.core.*/" - ], - "groupName": "SL core" + "allowedVersions": "<3.10" } ] } diff --git a/its/plugin/it-python-plugin-test/pom.xml b/its/plugin/it-python-plugin-test/pom.xml index 83341a581..311748a75 100644 --- a/its/plugin/it-python-plugin-test/pom.xml +++ b/its/plugin/it-python-plugin-test/pom.xml @@ -49,7 +49,7 @@ com.fasterxml.jackson.core jackson-annotations - 2.21 + 2.22 test diff --git a/pom.xml b/pom.xml index c028c8e31..ddcf80f2d 100644 --- a/pom.xml +++ b/pom.xml @@ -86,15 +86,15 @@ false - 2.21.0 + 2.22.0 3.20.0 1.15.0 3.27.7 - 6.0.2 - 1.5.27 - 2.0.17 + 6.1.1 + 1.5.38 + 2.0.18 2.2.1 - 5.21.0 + 5.23.0 11 @@ -205,7 +205,7 @@ com.google.guava guava - 33.5.0-jre + 33.6.0-jre com.fasterxml.jackson.core @@ -269,7 +269,7 @@ org.junit.platform junit-platform-suite-engine - 6.0.2 + 6.1.1 test diff --git a/python-checks/src/test/resources/checks/flaskHardCodedJWTSecretKey.py b/python-checks/src/test/resources/checks/flaskHardCodedJWTSecretKey.py index f5c1ad5f2..89b419607 100644 --- a/python-checks/src/test/resources/checks/flaskHardCodedJWTSecretKey.py +++ b/python-checks/src/test/resources/checks/flaskHardCodedJWTSecretKey.py @@ -1,7 +1,7 @@ from flask import Flask, current_app def test_non_compliant_assignment_expressions(x): app = Flask(__name__) - assigned_secret = 'hardcoded_secret' + assigned_secret = 'Azerty123' # Tests for "flask.app.Flask.config" app.config['JWT_SECRET_KEY'] = 'Azerty123' # Noncompliant {{Don't disclose "Flask" JWT secret keys.}} @@ -13,8 +13,8 @@ def test_non_compliant_assignment_expressions(x): # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^> ^^^^^^^^^^^ # False negatives. - app.config['JWT_SECRET_KEY'], _ = 'secret', x # FN: Should be extended to ExpressionList in the lhs containing more than one expression - app.config['JWT_SECRET_KEY'], _ = _, app.config['JWT_SECRET_KEY'] = 'secret', x # FN: Same as above + app.config['JWT_SECRET_KEY'], _ = 'Azerty123', x # FN: Should be extended to ExpressionList in the lhs containing more than one expression + app.config['JWT_SECRET_KEY'], _ = _, app.config['JWT_SECRET_KEY'] = 'Azerty123', x # FN: Same as above # Tests for "flask.globals.current_app.config" @@ -25,8 +25,8 @@ def test_non_compliant_assignment_expressions(x): _ = current_app.config['JWT_SECRET_KEY'] = 'Azerty123' # Noncompliant # False negatives. - current_app.config['JWT_SECRET_KEY'], _ = 'mysecret', x # FN - current_app.config['JWT_SECRET_KEY'], _ = _, current_app.config['JWT_SECRET_KEY'] = 'secret', x # FN + current_app.config['JWT_SECRET_KEY'], _ = 'Azerty123', x # FN + current_app.config['JWT_SECRET_KEY'], _ = _, current_app.config['JWT_SECRET_KEY'] = 'Azerty123', x # FN current_app.config['JWT_SECRET_KEY'] = app.config['JWT_SECRET_KEY'] = 'Azerty123' # Noncompliant diff --git a/python-checks/src/test/resources/checks/flaskHardCodedSecretKey.py b/python-checks/src/test/resources/checks/flaskHardCodedSecretKey.py index f95ff98fd..f2a4792cd 100644 --- a/python-checks/src/test/resources/checks/flaskHardCodedSecretKey.py +++ b/python-checks/src/test/resources/checks/flaskHardCodedSecretKey.py @@ -1,7 +1,7 @@ from flask import Flask, current_app def test_non_compliant_assignment_expressions(x): app = Flask(__name__) - assigned_secret = 'hardcoded_secret' + assigned_secret = 'Azerty123' # Tests for "flask.app.Flask.config" app.config['SECRET_KEY'] = 'Azerty123' # Noncompliant {{Don't disclose "Flask" secret keys.}} @@ -13,8 +13,8 @@ def test_non_compliant_assignment_expressions(x): # ^^^^^^^^^^^^^^^^^^^^^^^^> ^^^^^^^^^^^ # False negatives. - app.config['SECRET_KEY'], _ = 'secret', x # FN: Should be extended to ExpressionList in the lhs containing more than one expression - app.config['SECRET_KEY'], _ = _, app.config['SECRET_KEY'] = 'secret', x # FN: Same as above + app.config['SECRET_KEY'], _ = 'Azerty123', x # FN: Should be extended to ExpressionList in the lhs containing more than one expression + app.config['SECRET_KEY'], _ = _, app.config['SECRET_KEY'] = 'Azerty123', x # FN: Same as above # Tests for "flask.app.Flask.secret_key" @@ -22,11 +22,11 @@ def test_non_compliant_assignment_expressions(x): # ^^^^^^^^^^^^^^> {{Assignment to sensitive property.}} # ^^^^^^^^^^^@-1 app.secret_key = assigned_secret # Noncompliant - _ = app.secret_key = 'mysecret' # Noncompliant + _ = app.secret_key = 'Azerty123' # Noncompliant # False negatives. - app.secret_key, _ = 'secret', x # FN: Should be extended to ExpressionList in the lhs containing more than one expression - app.secret_key, _ = _, app.secret_key = 'secret', x # FN: Same as above + app.secret_key, _ = 'Azerty123', x # FN: Should be extended to ExpressionList in the lhs containing more than one expression + app.secret_key, _ = _, app.secret_key = 'Azerty123', x # FN: Same as above # Tests for "flask.globals.current_app.config" @@ -37,8 +37,8 @@ def test_non_compliant_assignment_expressions(x): _ = current_app.config['SECRET_KEY'] = 'Azerty123' # Noncompliant # False negatives. - current_app.config['SECRET_KEY'], _ = 'mysecret', x # FN - current_app.config['SECRET_KEY'], _ = _, current_app.config['SECRET_KEY'] = 'secret', x # FN + current_app.config['SECRET_KEY'], _ = 'Azerty123', x # FN + current_app.config['SECRET_KEY'], _ = _, current_app.config['SECRET_KEY'] = 'Azerty123', x # FN # Tests for "flask.globals.current_app.secret_key" @@ -46,11 +46,11 @@ def test_non_compliant_assignment_expressions(x): # ^^^^^^^^^^^^^^^^^^^^^^> {{Assignment to sensitive property.}} # ^^^^^^^^^^^@-1 current_app.secret_key = assigned_secret # Noncompliant - _ = current_app.secret_key = 'mysecret' # Noncompliant + _ = current_app.secret_key = 'Azerty123' # Noncompliant # False negatives. current_app.secret_key, _ = assigned_secret, x # FN - current_app.secret_key, _ = _, current_app.secret_key = 'secret', x # FN + current_app.secret_key, _ = _, current_app.secret_key = 'Azerty123', x # FN current_app.config['SECRET_KEY'] = app.config['SECRET_KEY'] = 'Azerty123' # Noncompliant # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^> ^^^^^^^^^^^^^^^^^^^^^^^^> ^^^^^^^^^^^ diff --git a/python-checks/src/test/resources/checks/hardCodedCredentials.py b/python-checks/src/test/resources/checks/hardCodedCredentials.py index b6d40dc59..a99b2d451 100644 --- a/python-checks/src/test/resources/checks/hardCodedCredentials.py +++ b/python-checks/src/test/resources/checks/hardCodedCredentials.py @@ -44,8 +44,8 @@ def __init__(self): self.passed = "passed" fieldNameWithPasswordInIt = "azerty123" # Noncompliant {{"password" detected here, review this potentially hard-coded credential.}} fieldNameWithPasswordInIt = os.getenv("password", "") # OK - fieldNameWithPasswordInIt = os.getenv("password", "hardcodedPassword") # Noncompliant - fieldNameWithPasswordInIt = os.environ.get("password", "hardcodedPassword") # Noncompliant + fieldNameWithPasswordInIt = os.getenv("password", "Azerty123") # Noncompliant + fieldNameWithPasswordInIt = os.environ.get("password", "Azerty123") # Noncompliant self.fieldNameWithPasswordInIt = "azerty123" # Noncompliant {{"password" detected here, review this potentially hard-coded credential.}} self.fieldNameWithPasswordInIt = os.getenv("password", "") # OK @@ -199,8 +199,8 @@ def somePassword(self, *, password="Azerty123"): # Noncompliant 'USER': 'sonarsource', 'PASSWORD': 'azerty123', # Noncompliant 'PASSWORD': os.getenv('DB_PASSWORD'), # Compliant - 'PASSWORD': os.getenv("DB_PASSWORD", "hardcodedPassword"), # Noncompliant - 'PASSWORD': os.environ.get("DB_PASSWORD", "hardcodedPassword"), # Noncompliant + 'PASSWORD': os.getenv("DB_PASSWORD", "Azerty123"), # Noncompliant + 'PASSWORD': os.environ.get("DB_PASSWORD", "Azerty123"), # Noncompliant 'HOST': 'localhost', 'PORT': '5432' }, @@ -210,8 +210,8 @@ def somePassword(self, *, password="Azerty123"): # Noncompliant 'USER': 'sonarsource', 'PASSWORD': 'azerty123', # Noncompliant 'PASSWORD': os.getenv('DB_PASSWORD'), # Compliant - 'PASSWORD': os.getenv("DB_PASSWORD", "hardcodedPassword"), # Noncompliant - 'PASSWORD': os.environ.get("DB_PASSWORD", "hardcodedPassword"), # Noncompliant + 'PASSWORD': os.getenv("DB_PASSWORD", "Azerty123"), # Noncompliant + 'PASSWORD': os.environ.get("DB_PASSWORD", "Azerty123"), # Noncompliant 'HOST': 'localhost', 'PORT': '5432' } diff --git a/python-checks/src/test/resources/checks/hardcodedCredentialsCall.py b/python-checks/src/test/resources/checks/hardcodedCredentialsCall.py index befb38234..684a78e32 100644 --- a/python-checks/src/test/resources/checks/hardcodedCredentialsCall.py +++ b/python-checks/src/test/resources/checks/hardcodedCredentialsCall.py @@ -5,10 +5,10 @@ def obj_creation_hardcoded_credentials(): network = pylast.LibreFMNetwork("api_key", # Noncompliant {{Revoke and change this password, as it is compromised.}} # ^^^^^^^^^ 0 - "api_secret", # Noncompliant + "Azerty123", # Noncompliant "session_key", "username", - "password_hash") # Noncompliant + "Azerty123") # Noncompliant def obj_creation_empty_credentials(): network = pylast.LibreFMNetwork("", "", "", "", "") @@ -19,10 +19,10 @@ def obj_creation_empty_credentials(): def obj_creation_hardcoded_credentials_named_arguments(): network = pylast.LibreFMNetwork(api_key="api_key", # Noncompliant {{Revoke and change this password, as it is compromised.}} # ^^^^^^^^^^^^^^^^^ 0 - api_secret="api_secret", # Noncompliant + api_secret="Azerty123", # Noncompliant session_key="session_key", username="username", - password_hash="password_hash") # Noncompliant + password_hash="Azerty123") # Noncompliant temp_user = test_connection.TempUser(password="Azerty123") # Noncompliant diff --git a/sonar-python-plugin/pom.xml b/sonar-python-plugin/pom.xml index 09e625328..fb67b9481 100644 --- a/sonar-python-plugin/pom.xml +++ b/sonar-python-plugin/pom.xml @@ -195,7 +195,7 @@ maven-resources-plugin - 3.4.0 + 3.5.0 copy-main-license From 599e359caf6e8ab3301bdef52fe7e49b1e47dd77 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 15 Jul 2026 10:03:50 +0200 Subject: [PATCH 217/322] Update jackson.version Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Victor Diez GitOrigin-RevId: 1e60ef60b00427a0967766f2b401d8e19da6dba5 --- .github/renovate.json | 11 +++++++++++ pom.xml | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/.github/renovate.json b/.github/renovate.json index 6b5a352bc..cb644dd7f 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -16,6 +16,17 @@ "python" ], "allowedVersions": "<3.10" + }, + { + "description": "Keep protobuf Java and protoc compatible with the Python runtime used for typeshed serialization", + "matchDatasources": [ + "maven" + ], + "matchPackageNames": [ + "com.google.protobuf:protobuf-java", + "com.google.protobuf:protoc" + ], + "allowedVersions": "<=4.29.3" } ] } diff --git a/pom.xml b/pom.xml index ddcf80f2d..8dfc6c97e 100644 --- a/pom.xml +++ b/pom.xml @@ -110,10 +110,10 @@
            11.6.0.85952 1.26.0.4194 - 4.29.0 + 4.29.3 6.2.7 2.14.0 - 2.21.4 + 2.22.1 2.26.0.6023 From 7fa6a6bee1ee1573c7cd514ded91b4512a5322c5 Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Thu, 16 Jul 2026 15:27:09 +0200 Subject: [PATCH 218/322] SONARPY-4378 Implement S8992: pytest autouse fixtures should not use params GitOrigin-RevId: 03283a7367d7bfca7c41645e5f44376371aefac3 --- .../python/checks/OpenSourceCheckList.java | 2 + ...PytestAutouseParametrizedFixtureCheck.java | 87 +++++++++++++++++++ .../org/sonar/l10n/py/rules/python/S8992.html | 53 +++++++++++ .../org/sonar/l10n/py/rules/python/S8992.json | 26 ++++++ .../py/rules/python/Sonar_way_profile.json | 3 +- ...stAutouseParametrizedFixtureCheckTest.java | 37 ++++++++ .../tests/pytestAutouseParametrizedFixture.py | 59 +++++++++++++ 7 files changed, 266 insertions(+), 1 deletion(-) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/tests/PytestAutouseParametrizedFixtureCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8992.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8992.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/tests/PytestAutouseParametrizedFixtureCheckTest.java create mode 100644 python-checks/src/test/resources/checks/tests/pytestAutouseParametrizedFixture.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 382e6e0e6..61bb35e9e 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -101,6 +101,7 @@ import org.sonar.python.checks.tests.IdenticalAssertionArgumentsCheck; import org.sonar.python.checks.tests.ImplicitlySkippedTestCheck; import org.sonar.python.checks.tests.NotDiscoverableTestMethodCheck; +import org.sonar.python.checks.tests.PytestAutouseParametrizedFixtureCheck; import org.sonar.python.checks.tests.SingleInvocationRuntimeExceptionCheck; import org.sonar.python.checks.tests.SkippedTestNoReasonCheck; import org.sonar.python.checks.tests.SpecificExceptionAssertionCheck; @@ -392,6 +393,7 @@ public Stream> getChecks() { PydanticOptionalFieldDefaultCheck.class, PydanticMultipleInheritanceConfigCheck.class, PydanticSkipValidationWithConstraintsCheck.class, + PytestAutouseParametrizedFixtureCheck.class, PyTorchDataLoaderNumWorkersCheck.class, PytzTimeZoneInDatetimeConstructorCheck.class, RaiseOutsideExceptCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/PytestAutouseParametrizedFixtureCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/PytestAutouseParametrizedFixtureCheck.java new file mode 100644 index 000000000..7d491701b --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/PytestAutouseParametrizedFixtureCheck.java @@ -0,0 +1,87 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.ArgList; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.Decorator; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.checks.utils.Expressions; +import org.sonar.python.tree.TreeUtils; + +@Rule(key = "S8992") +public class PytestAutouseParametrizedFixtureCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Remove the \"params\" argument or set \"autouse\" to False."; + private static final String AUTOUSE_ARGUMENT = "autouse"; + private static final String PARAMS_ARGUMENT = "params"; + + private static final TypeMatcher PYTEST_FIXTURE_MATCHER = TypeMatchers.withFQN("pytest.fixture"); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.DECORATOR, PytestAutouseParametrizedFixtureCheck::checkDecorator); + } + + private static void checkDecorator(SubscriptionContext ctx) { + Decorator decorator = (Decorator) ctx.syntaxNode(); + Expression decoratorFunctionExpression = getDecoratorFunctionExpression(decorator); + if (!PYTEST_FIXTURE_MATCHER.isTrueFor(decoratorFunctionExpression, ctx)) { + return; + } + + ArgList argList = decorator.arguments(); + if (argList == null) { + return; + } + + RegularArgument autouseArgument = TreeUtils.argumentByKeyword(AUTOUSE_ARGUMENT, argList.arguments()); + if (autouseArgument == null || !Expressions.isTruthy(autouseArgument.expression())) { + return; + } + + RegularArgument paramsArgument = TreeUtils.argumentByKeyword(PARAMS_ARGUMENT, argList.arguments()); + if (paramsArgument == null || Expressions.isFalsy(paramsArgument.expression())) { + return; + } + + var keywordArgument = paramsArgument.keywordArgument(); + if (keywordArgument != null) { + ctx.addIssue(keywordArgument, MESSAGE); + } + } + + private static Expression getDecoratorFunctionExpression(Decorator decorator) { + Expression expression = decorator.expression(); + if (expression instanceof CallExpression callExpression) { + return callExpression.callee(); + } + return expression; + } + + @Override + public CheckScope scope() { + return CheckScope.ALL; + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8992.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8992.html new file mode 100644 index 000000000..17ac05ece --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8992.html @@ -0,0 +1,53 @@ +

            This rule raises an issue when a @pytest.fixture decorator includes both autouse=True and a params argument +with values.

            +

            Why is this an issue?

            +

            Test fixtures serve two important purposes: setting up test prerequisites and providing test data through parametrization. Pytest allows combining +automatic fixture usage (autouse=True) with fixture parametrization (params=), but the result is discouraged for most test +suites.

            +

            When you mark a fixture to run automatically, pytest uses it in every test function within its scope, without requiring the test to explicitly +request it. This is useful for setup tasks that should always run, like initializing a database connection or configuring logging.

            +

            Parametrized fixtures use the params argument to provide multiple values. Each test that requests the fixture is executed once for +each parameter value.

            +

            When both options are combined, pytest parametrizes every test in scope, even tests that do not reference the fixture, because the autouse fixture +is injected implicitly. A single test function can therefore run once per parameter value without any visible parametrization on the test itself, +leading to readability and maintainability issues such as:

            +
              +
            • Test counts increase unexpectedly; for example, one test with three params values produces three test runs.
            • +
            • The source of the multiplied tests is not obvious when reading the test function.
            • +
            • Test selection and debugging become harder because the parametrization is hidden in the autouse fixture.
            • +
            +

            This pattern is valid pytest syntax, but it makes test behavior harder to understand and maintain. This discouraged combination should never be +suppressed. Hidden test multiplication from autouse parametrization is always a genuine issue, not an accepted trade-off.

            +

            What is the potential impact?

            +

            As test suites grow, hidden autouse parametrization increases CI runtime and makes failures harder to diagnose for developers who are not familiar +with the fixture graph.

            +

            How to fix it

            +

            Remove the params argument if the fixture needs to be automatically used. Use a single, default configuration instead of multiple +parameter values.

            +

            If you need multiple setup variants for every test, parametrize the tests themselves with @pytest.mark.parametrize instead of +parametrizing an autouse fixture. If only some tests need the fixture, drop autouse=True and declare the fixture as a test parameter so +each test opts in explicitly.

            +

            Fixtures that use params without autouse=True are valid. This rule flags only the discouraged combination of both +options.

            +

            Code examples

            +

            Noncompliant code example

            +
            +@pytest.fixture(autouse=True, params=[1, 2, 3])  # Noncompliant
            +def my_fixture():
            +    return 'value'
            +
            +

            Compliant solution

            +
            +@pytest.fixture(autouse=True)
            +def my_fixture():
            +    return 'value'
            +
            +

            Resources

            +

            Documentation

            + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8992.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8992.json new file mode 100644 index 000000000..991b0097d --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8992.json @@ -0,0 +1,26 @@ +{ + "title": "Pytest fixtures should not combine \"autouse\" with \"params\"", + "type": "BUG", + "status": "beta", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5 min" + }, + "tags": [ + "pytest", + "pitfall", + "confusing" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-8992", + "sqKey": "S8992", + "scope": "All", + "quickfix": "unknown", + "code": { + "impacts": { + "RELIABILITY": "MEDIUM", + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "LOGICAL" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 42a218326..933531cb4 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -373,6 +373,7 @@ "S8971", "S8973", "S8974", - "S8978" + "S8978", + "S8992" ] } diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/PytestAutouseParametrizedFixtureCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/PytestAutouseParametrizedFixtureCheckTest.java new file mode 100644 index 000000000..fdc78ea97 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/PytestAutouseParametrizedFixtureCheckTest.java @@ -0,0 +1,37 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import org.junit.jupiter.api.Test; +import org.sonar.plugins.python.api.PythonCheck; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +import static org.assertj.core.api.Assertions.assertThat; + +class PytestAutouseParametrizedFixtureCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/pytestAutouseParametrizedFixture.py", new PytestAutouseParametrizedFixtureCheck()); + } + + @Test + void test_scope() { + assertThat(new PytestAutouseParametrizedFixtureCheck().scope()).isEqualTo(PythonCheck.CheckScope.ALL); + } + +} diff --git a/python-checks/src/test/resources/checks/tests/pytestAutouseParametrizedFixture.py b/python-checks/src/test/resources/checks/tests/pytestAutouseParametrizedFixture.py new file mode 100644 index 000000000..b53ac37df --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/pytestAutouseParametrizedFixture.py @@ -0,0 +1,59 @@ +import pytest +from pytest import fixture + + +@pytest.fixture(autouse=True, params=[1, 2, 3]) # Noncompliant {{Remove the "params" argument or set "autouse" to False.}} +def noncompliant_module_fixture(): + return "value" + + +@pytest.fixture(params=[1, 2, 3], autouse=True) # Noncompliant +def noncompliant_reordered_arguments(): + return "value" + + +@pytest.fixture(autouse=True) +def compliant_autouse_only(): + return "value" + + +@pytest.fixture(params=[1, 2, 3]) +def compliant_params_only(request): + return request.param + + +@pytest.fixture(autouse=False, params=[1, 2, 3]) +def compliant_autouse_false_with_params(): + return "value" + + +@pytest.fixture(autouse=True, params=[]) +def compliant_empty_params(): + return "value" + + +@pytest.fixture(autouse=True, params=None) +def compliant_none_params(): + return "value" + + +@pytest.fixture +def compliant_no_arguments(): + return "value" + + +class TestSomething: + @pytest.fixture(autouse=True, params=[1, 2]) # Noncompliant + def noncompliant_class_fixture(self): + pass + + +@fixture(autouse=True, params=[1]) # Noncompliant +def noncompliant_imported_fixture(): + return "value" + + +PARAMS = [1, 2] +@pytest.fixture(autouse=True, params=PARAMS) # Noncompliant +def noncompliant_params_from_variable(): + return "value" From d400731eea1b33385adcc8678303afc993b0cbab Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 16 Jul 2026 18:09:46 +0200 Subject: [PATCH 219/322] Update scanner-engine.version to v13.4.1.4007 Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> GitOrigin-RevId: 7b7fb0876104a53155871cacd0f8df7effcf0edf --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8dfc6c97e..28b9ed0e8 100644 --- a/pom.xml +++ b/pom.xml @@ -102,7 +102,7 @@ Python Enterprise 26.7.0.124771 13.8.0.4399 - 13.4.0.3968 + 13.4.1.4007 6.3.0.4464 2.27.0.5007 From 18e7aef402b3a298a64d3f7ce0dfe800ae87a737 Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Fri, 17 Jul 2026 09:05:16 +0200 Subject: [PATCH 220/322] SONARPY-4397 Deduplicate rule-implementation guidance behind Claude skill GitOrigin-RevId: 7c3a646dbf1ede9f5cf08a8aecac23ccef3a4f10 --- .../rules-implementation.instructions.md | 67 ++----------------- 1 file changed, 5 insertions(+), 62 deletions(-) diff --git a/.github/instructions/rules-implementation.instructions.md b/.github/instructions/rules-implementation.instructions.md index 9666d1bab..6340de151 100644 --- a/.github/instructions/rules-implementation.instructions.md +++ b/.github/instructions/rules-implementation.instructions.md @@ -1,67 +1,10 @@ --- applyTo: "**/*checks*/**/*.java" --- -Here is some information about basic rule implementation: +# Rule implementation -- When implementing a new rule, the rule has to be added to [OpenSourceCheckList.java](../../python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java). -- The class name ends in `Check`, for example `SleepZeroInAsyncCheck` -- Annotate the class with @Rule(key = "YourRuleKey"): -Replace "YourRuleKey" with a unique identifier for your rule (e.g., "S1234"). -- Always start out by having the rule extend `PythonSubscriptionCheck` as a first step -- Override the initialize(Context context) method: - This method is called once when the analysis starts. - Use context.registerSyntaxNodeConsumer(Kind.YOUR_TARGET_KIND, this::yourCheckMethod) to register a callback method for specific Python Abstract Syntax Tree (AST) node kinds you want to inspect. - Kind.YOUR_TARGET_KIND refers to the type of Python code structure you're interested in (e.g., Kind.CALL_EXPR for function calls, Kind.FUNCTION_DEF for function definitions, Kind.IF_STMT for if statements, etc.). - Make sure to use a Kind that exists in the Enum. -this::yourCheckMethod is a method reference to the method in your rule class that will be called when a node of the specified Kind is encountered. -- Implement your check method(s) (e.g., yourCheckMethod(SubscriptionContext context)): - This method will be called for each AST node of the Kind you registered in initialize. - Get the current AST node being visited using context.syntaxNode(). You'll likely need to cast it to its specific type (e.g., (CallExpression) context.syntaxNode()). - Implement the logic to analyze the AST node and its properties. - You can use TreeUtils for helper functions to navigate or inspect the AST (e.g., TreeUtils.firstAncestorOfKind(...), TreeUtils.nthArgumentOrKeyword(...)). - If you need to perform type checking: - You can initialize a TypeCheckMap in a method registered for Kind.FILE_INPUT (as seen with initializeTypeCheckMap in the example). - Use context.typeChecker().typeCheckBuilder() to define type checks (e.g., checking for a fully qualified name like isTypeWithFqn("module.submodule.function")). - Always prefer using the type checkers instead fully qualified names on the symbol -- Report issues: - If your rule's conditions are met and an issue should be raised, use context.addIssue(treeNode, message). - treeNode is the AST node to which the issue should be attached. - message is the description of the issue. - You can add secondary locations to an issue using issue.secondary(anotherTreeNode, secondaryMessage). -- Define message strings: - Use constants for messages (e.g., private static final String MESSAGE = "Your informative message here."). - Use String.format() if your messages need to include dynamic parts. -- (Optional) Create helper records or classes: - For more complex logic or to hold state/configuration related to specific checks (like MessageHolder in the example), you can define inner records or classes. +Do **not** follow outdated guidance that may appear elsewhere. The single source of truth is: -Commonly Used APIs and Utilities for Rule Implementation -- TreeUtils (org.sonar.python.tree.TreeUtils): - firstAncestorOfKind(tree, Kind...): Find the first ancestor node of a given kind. - firstAncestor(tree, Predicate): Find the first ancestor matching a predicate. - hasDescendant(tree, Predicate): Check if a tree has a descendant matching a predicate. - getSymbolFromTree(tree): Get the symbol associated with a tree node, if any. - getClassSymbolFromDef(classDef), getFunctionSymbolFromDef(functionDef): Get class/function symbol from definition node. - nthArgumentOrKeyword(int pos, String keyword, List): Get the nth or keyword argument from a call. Also has an Optional variant - argumentByKeyword(String keyword, List): Get argument by keyword. - isBooleanLiteral(tree): Check if a tree is a boolean literal. - toOptionalInstanceOf(Class, tree), toStreamInstanceOfMapper(Class): Safe casting and mapping for tree nodes. Useful for Optionals and avoiding nulls. - firstChild(tree, Predicate): Find the first child matching a predicate. -- Type Checking: - TypeCheckMap and TypeCheckBuilder (org.sonar.python.types.v2): Used to map type checks to actions or data, e.g., for matching function calls by type. - context.typeChecker().typeCheckBuilder().isTypeWithFqn("..."), isTypeOrInstanceWithName("..."), etc.: Build type checks for use in rules. -- SubscriptionContext (org.sonar.plugins.python.api.SubscriptionContext): - syntaxNode(): Get the current AST node being visited. - addIssue(tree, message): Report an issue at a given node. - typeChecker(): Access type checking utilities. - pythonFile(): Access file-level information. -- Tree.Kind (org.sonar.plugins.python.api.tree.Tree.Kind): - Used to register node consumers and to check node types (e.g., Kind.CALL_EXPR, Kind.FUNCDEF, Kind.CLASSDEF, etc.). -Patterns: - Use context.registerSyntaxNodeConsumer(Kind.X, this::method) in initialize to register callbacks for AST node kinds. - Use type checks and TypeCheckMap for rules that depend on type information. - Prefer using TypeV2 instead of the V1 symbols - When initializing TypeCheckBuilder objects, make a separate method. - In general, the callbacks should be in their own functions and not a lambda - Make sure to use the correct classes, for exemple most of the Tree objects have names that do not end in Tree. Before using, make sure the types exist. - When building type checkers, always recreate the builder from the context. Do not reuse one. - When casting to a tree, use a variable name that makes sense like expr, callExpression, ... \ No newline at end of file +`.claude/skills/rule-implementation/SKILL.md` + +Read that skill and follow it whenever implementing, placing, or wiring a new or existing Python check (open-source or enterprise). From bbade0cef09918f4e5b21d960fda4c4a68a504dc Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Fri, 17 Jul 2026 09:54:22 +0200 Subject: [PATCH 221/322] SONARPY-4381 S9001 Expected test failures should provide a reason GitOrigin-RevId: 5e320cf194958318a23db558d3c9c9294802e8cb --- .../python/checks/OpenSourceCheckList.java | 2 + .../checks/tests/XfailNoReasonCheck.java | 95 +++++++++++++++++++ .../org/sonar/l10n/py/rules/python/S9001.html | 32 +++++++ .../org/sonar/l10n/py/rules/python/S9001.json | 24 +++++ .../py/rules/python/Sonar_way_profile.json | 3 +- .../checks/tests/XfailNoReasonCheckTest.java | 42 ++++++++ .../resources/checks/tests/xfailNoReason.py | 51 ++++++++++ .../checks/tests/xfailNoReasonWithImport.py | 17 ++++ .../custom_protobuf/pytest.mark.protobuf | 41 ++++++++ .../types/custom_protobuf/pytest.protobuf | 3 +- .../checksums/custom.checksum | 4 +- .../resources/custom/pytest/__init__.pyi | 2 + .../resources/custom/pytest/mark/__init__.pyi | 12 +++ 13 files changed, 324 insertions(+), 4 deletions(-) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/tests/XfailNoReasonCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9001.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9001.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/tests/XfailNoReasonCheckTest.java create mode 100644 python-checks/src/test/resources/checks/tests/xfailNoReason.py create mode 100644 python-checks/src/test/resources/checks/tests/xfailNoReasonWithImport.py create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pytest.mark.protobuf create mode 100644 python-frontend/typeshed_serializer/resources/custom/pytest/mark/__init__.pyi diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 61bb35e9e..5384bd29c 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -107,6 +107,7 @@ import org.sonar.python.checks.tests.SpecificExceptionAssertionCheck; import org.sonar.python.checks.tests.TestCasesShouldContainTestsCheck; import org.sonar.python.checks.tests.UnconditionalAssertionCheck; +import org.sonar.python.checks.tests.XfailNoReasonCheck; public class OpenSourceCheckList { @@ -527,6 +528,7 @@ public Stream> getChecks() { WeakSSLProtocolCheck.class, WildcardImportCheck.class, WrongAssignmentOperatorCheck.class, + XfailNoReasonCheck.class, XMLParserXXEVulnerableCheck.class, XMLSignatureValidationCheck.class, DjangoModelFormFieldsCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/XfailNoReasonCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/XfailNoReasonCheck.java new file mode 100644 index 000000000..6fb44f96c --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/XfailNoReasonCheck.java @@ -0,0 +1,95 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import javax.annotation.Nullable; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.ArgList; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.Decorator; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.StringLiteral; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.tree.TreeUtils; + +@Rule(key = "S9001") +public class XfailNoReasonCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Provide a reason for marking this test as expected to fail."; + + private static final TypeMatcher PYTEST_XFAIL_MATCHER = TypeMatchers.isType("pytest.mark.xfail"); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.DECORATOR, ctx -> checkDecorator(ctx, (Decorator) ctx.syntaxNode())); + } + + @Override + public CheckScope scope() { + return CheckScope.ALL; + } + + private static void checkDecorator(SubscriptionContext ctx, Decorator decorator) { + Expression expression = decorator.expression(); + Expression xfailExpression = getXfailExpression(expression); + if (!PYTEST_XFAIL_MATCHER.isTrueFor(xfailExpression, ctx)) { + return; + } + + checkMissingReason(ctx, decorator, getArguments(decorator, expression)); + } + + private static Expression getXfailExpression(Expression expression) { + if (expression.is(Tree.Kind.CALL_EXPR)) { + return ((CallExpression) expression).callee(); + } + return expression; + } + + @Nullable + private static ArgList getArguments(Decorator decorator, Expression expression) { + if (expression.is(Tree.Kind.CALL_EXPR)) { + return ((CallExpression) expression).argumentList(); + } + return decorator.arguments(); + } + + private static void checkMissingReason(SubscriptionContext ctx, Tree issueTree, @Nullable ArgList args) { + if (args == null || args.arguments().isEmpty()) { + ctx.addIssue(issueTree, MESSAGE); + return; + } + + RegularArgument reasonArgument = TreeUtils.argumentByKeyword("reason", args.arguments()); + if (reasonArgument == null) { + ctx.addIssue(issueTree, MESSAGE); + return; + } + + if (reasonArgument.expression().is(Tree.Kind.STRING_LITERAL)) { + StringLiteral stringLiteral = (StringLiteral) reasonArgument.expression(); + if (stringLiteral.trimmedQuotesValue().isEmpty()) { + ctx.addIssue(issueTree, MESSAGE); + } + } + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9001.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9001.html new file mode 100644 index 000000000..3ddf54095 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9001.html @@ -0,0 +1,32 @@ +

            This rule raises an issue when @pytest.mark.xfail is used without a reason parameter.

            +

            Why is this an issue?

            +

            When writing tests, @pytest.mark.xfail marks a test as expected to fail, for example while a known bug remains unfixed.

            +

            @pytest.mark.xfail without reason leaves future maintainers without context for why the failure is expected. The +reason must appear on the decorator; comments or docstrings do not satisfy this rule.

            +

            What is the potential impact?

            +

            Undocumented expected failures accumulate as the codebase changes, so teams cannot tell which markers still reflect real defects.

            +

            How to fix it

            +

            Add the reason parameter with a concise explanation or issue reference.

            +

            Code examples

            +

            Noncompliant code example

            +
            +@pytest.mark.xfail  # Noncompliant
            +def test_division_by_zero():
            +    result = divide(10, 0)
            +    assert result is None
            +
            +

            Compliant solution

            +
            +@pytest.mark.xfail(reason='Issue #456: divide() should raise ValueError for zero divisor')
            +def test_division_by_zero():
            +    result = divide(10, 0)
            +    assert result is None
            +
            +

            Resources

            +

            Documentation

            + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9001.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9001.json new file mode 100644 index 000000000..96a18ba42 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9001.json @@ -0,0 +1,24 @@ +{ + "title": "Expected test failures should provide a reason", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5 min" + }, + "tags": [ + "pytest", + "tests" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-9001", + "sqKey": "S9001", + "scope": "Tests", + "quickfix": "unknown", + "code": { + "impacts": { + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "CLEAR" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 933531cb4..3d119e171 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -374,6 +374,7 @@ "S8973", "S8974", "S8978", - "S8992" + "S8992", + "S9001" ] } diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/XfailNoReasonCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/XfailNoReasonCheckTest.java new file mode 100644 index 000000000..e69442ad5 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/XfailNoReasonCheckTest.java @@ -0,0 +1,42 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import org.junit.jupiter.api.Test; +import org.sonar.plugins.python.api.PythonCheck; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +import static org.assertj.core.api.Assertions.assertThat; + +class XfailNoReasonCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/xfailNoReason.py", new XfailNoReasonCheck()); + } + + @Test + void testWithImport() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/xfailNoReasonWithImport.py", new XfailNoReasonCheck()); + } + + @Test + void test_scope() { + assertThat(new XfailNoReasonCheck().scope()).isEqualTo(PythonCheck.CheckScope.ALL); + } + +} diff --git a/python-checks/src/test/resources/checks/tests/xfailNoReason.py b/python-checks/src/test/resources/checks/tests/xfailNoReason.py new file mode 100644 index 000000000..194113253 --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/xfailNoReason.py @@ -0,0 +1,51 @@ +import pytest + + +class UsingPytest: + @pytest.mark.xfail # Noncompliant {{Provide a reason for marking this test as expected to fail.}} +# ^^^^^^^^^^^^^^^^^^ + def test_xfail_no_reason(self): + assert 1 == 2 + + @pytest.mark.xfail() # Noncompliant {{Provide a reason for marking this test as expected to fail.}} +# ^^^^^^^^^^^^^^^^^^^^ + def test_xfail_call_without_reason(self): + assert 1 == 2 + + @pytest.mark.xfail(reason="Issue #456: known bug") + def test_xfail_with_reason(self): + assert 1 == 2 + + @pytest.mark.xfail(reason="") # Noncompliant {{Provide a reason for marking this test as expected to fail.}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + def test_xfail_empty_reason(self): + assert 1 == 2 + + @pytest.mark.xfail(reason=" ") + def test_xfail_blank_reason(self): + assert 1 == 2 + + @pytest.mark.xfail(condition=True) # Noncompliant {{Provide a reason for marking this test as expected to fail.}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + def test_xfail_with_condition_only(self): + assert 1 == 2 + + @pytest.mark.xfail(reason=other_var) + def test_xfail_with_variable_reason(self): + assert 1 == 2 + + @pytest.mark.skip + def test_skip_not_xfail(self): + assert 1 == 2 + + @bob.bob + def test_qualified_expression_null_symbol(self): + assert 1 == 2 + + @xfail() + def test_xfail_symbol_not_defined_ok(self): + assert 1 == 2 + + @"my string" + def test_decorator_without_symbol_ok(self): + assert 1 == 2 diff --git a/python-checks/src/test/resources/checks/tests/xfailNoReasonWithImport.py b/python-checks/src/test/resources/checks/tests/xfailNoReasonWithImport.py new file mode 100644 index 000000000..86e662e6b --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/xfailNoReasonWithImport.py @@ -0,0 +1,17 @@ +from pytest.mark import xfail + + +class UsingPytest: + @xfail # Noncompliant {{Provide a reason for marking this test as expected to fail.}} +# ^^^^^^ + def test_xfail_no_reason(self): + assert 1 == 2 + + @xfail() # Noncompliant {{Provide a reason for marking this test as expected to fail.}} +# ^^^^^^^^ + def test_xfail_call_without_reason(self): + assert 1 == 2 + + @xfail(reason="Issue #456: known bug") + def test_xfail_with_reason(self): + assert 1 == 2 diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pytest.mark.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pytest.mark.protobuf new file mode 100644 index 000000000..16f85aa51 --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pytest.mark.protobuf @@ -0,0 +1,41 @@ + + pytest.mark +xfailpytest.mark.xfail"K +CallableType[builtins.function]& +builtins.function"builtins.function* +args +Any** +reason + builtins.str" builtins.str * +kwargs +Any +skippytest.mark.skip"K +CallableType[builtins.function]& +builtins.function"builtins.function* +args +Any** +reason + builtins.str" builtins.str * +kwargs +Any + parametrizepytest.mark.parametrize"K +CallableType[builtins.function]& +builtins.function"builtins.function* +argnames +1Union[builtins.str,typing.Sequence[builtins.str]] + builtins.str" builtins.strN +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.Sequence*1 + argvalues" +builtins.object"builtins.object* +args +Any* +kwargs +Any*l +__path__pytest.mark.__path__J +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list* +__annotations__pytest.mark.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pytest.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pytest.protobuf index d317ea117..2d2f4e192 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pytest.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pytest.protobuf @@ -15,4 +15,5 @@ __annotations__pytest.__annotations__W builtins.dict[builtins.str,Any] builtins.str" builtins.str -Any" builtins.dict \ No newline at end of file +Any" builtins.dict* +mark pytest.mark  \ No newline at end of file diff --git a/python-frontend/typeshed_serializer/checksums/custom.checksum b/python-frontend/typeshed_serializer/checksums/custom.checksum index 306ed0ce9..56748b57f 100644 --- a/python-frontend/typeshed_serializer/checksums/custom.checksum +++ b/python-frontend/typeshed_serializer/checksums/custom.checksum @@ -1,2 +1,2 @@ -8e1d3d75aa65524f697a3a0bf08e003623c27d4faf645274a659113f14f0f6b4 -400db68fc1c2e086c4219c993e22675d87158b8af647ef3a760cddbd08079b76 \ No newline at end of file +12c8a61efcc4b738e698f3a8ec6e6a9bcc348cc44360c427233f67cd174e0256 +80e487ddcfd4725b32f40b5ef53b6bfa68b593af624ba6b162cc7f543866e4b2 \ No newline at end of file diff --git a/python-frontend/typeshed_serializer/resources/custom/pytest/__init__.pyi b/python-frontend/typeshed_serializer/resources/custom/pytest/__init__.pyi index 74e14fcf7..bac9d58d7 100644 --- a/python-frontend/typeshed_serializer/resources/custom/pytest/__init__.pyi +++ b/python-frontend/typeshed_serializer/resources/custom/pytest/__init__.pyi @@ -3,3 +3,5 @@ from SonarPythonAnalyzerFakeStub import CustomStubBase class ApproxScalar(CustomStubBase): ... def approx(expected: object = ..., *args: object, **kwargs: object) -> ApproxScalar: ... + +import pytest.mark as mark diff --git a/python-frontend/typeshed_serializer/resources/custom/pytest/mark/__init__.pyi b/python-frontend/typeshed_serializer/resources/custom/pytest/mark/__init__.pyi new file mode 100644 index 000000000..def9801e1 --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/pytest/mark/__init__.pyi @@ -0,0 +1,12 @@ +from typing import Any, Callable, Sequence, TypeVar, Union + +_T = TypeVar("_T") + +def xfail(*args: Any, reason: str = ..., **kwargs: Any) -> Callable[[_T], _T]: ... +def skip(*args: Any, reason: str = ..., **kwargs: Any) -> Callable[[_T], _T]: ... +def parametrize( + argnames: Union[str, Sequence[str]], + argvalues: object, + *args: Any, + **kwargs: Any, +) -> Callable[[_T], _T]: ... From 1aa384e31f6b5e78e73617e0661ef47fca3b0f1b Mon Sep 17 00:00:00 2001 From: Mallow Date: Fri, 17 Jul 2026 13:47:46 +0200 Subject: [PATCH 222/322] SONARPY-2729 Fix crash when Jupyter notebook source arrays contain multiline strings GitOrigin-RevId: 28fde6dc6151ba8a9bc8e2f2f3fa538018e1d0c9 --- .../IpynbNotebookParserScannerTest.java | 35 +++++ .../notebook_multiline_string_in_array.ipynb | 22 +++ ..._string_in_array_no_trailing_newline.ipynb | 23 ++++ .../plugins/python/IpynbNotebookParser.java | 129 +++++++++++++++--- .../python/IpynbNotebookParserTest.java | 51 +++++++ .../notebook_multiline_string_in_array.ipynb | 22 +++ ..._string_in_array_no_trailing_newline.ipynb | 23 ++++ 7 files changed, 286 insertions(+), 19 deletions(-) create mode 100644 python-commons/src/test/resources/org/sonar/plugins/python/notebook_multiline_string_in_array.ipynb create mode 100644 python-commons/src/test/resources/org/sonar/plugins/python/notebook_multiline_string_in_array_no_trailing_newline.ipynb create mode 100644 python-frontend/src/test/resources/org/sonar/plugins/python/notebook_multiline_string_in_array.ipynb create mode 100644 python-frontend/src/test/resources/org/sonar/plugins/python/notebook_multiline_string_in_array_no_trailing_newline.ipynb diff --git a/python-commons/src/test/java/org/sonar/plugins/python/IpynbNotebookParserScannerTest.java b/python-commons/src/test/java/org/sonar/plugins/python/IpynbNotebookParserScannerTest.java index 6e00deb07..89bb47ff1 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/IpynbNotebookParserScannerTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/IpynbNotebookParserScannerTest.java @@ -92,4 +92,39 @@ void trailing_whitespace_compressed() throws IOException { assertThat(issues.get(2).primaryLocation().endLineOffset()).isEqualTo(249); // Should be 255 } + @Test + void multiline_string_in_source_array() throws IOException { + var inputFile = createInputFile(baseDir, "notebook_multiline_string_in_array.ipynb", InputFile.Status.CHANGED, InputFile.Type.MAIN); + var result = IpynbNotebookParser.parseNotebook(inputFile).get(); + + // Should not throw IllegalStateException("No IPythonLocation found for line ...") + var fileInput = TestPythonVisitorRunner.parseNotebookFile(result.locationMap(), result.contents()); + + var statements = fileInput.statements().statements(); + // Every statement lives on the same raw ipynb line, since the whole array element is one JSON string + // spanning a single physical line; columns must still strictly increase to reflect their real position. + assertThat(statements) + .hasSize(8) + .allSatisfy(stmt -> assertThat(stmt.firstToken().line()).isEqualTo(9)) + .extracting(stmt -> stmt.firstToken().column()).isSorted(); + } + + @Test + void multiline_array_element_without_trailing_newline_continues_next_element() throws IOException { + // "source": ["x = 1\ny", " = 2"]: the first element's last split line ("y") has no trailing newline of + // its own, so the second element (" = 2") continues it on the same physical line instead of starting + // a new one. This used to add one locationMap entry too many, misaligning every line after it. + var inputFile = createInputFile(baseDir, "notebook_multiline_string_in_array_no_trailing_newline.ipynb", InputFile.Status.CHANGED, InputFile.Type.MAIN); + var result = IpynbNotebookParser.parseNotebook(inputFile).get(); + + var fileInput = TestPythonVisitorRunner.parseNotebookFile(result.locationMap(), result.contents()); + + var statements = fileInput.statements().statements(); + assertThat(statements).hasSize(2); + assertThat(statements.get(0).firstToken().line()).isEqualTo(9); + assertThat(statements.get(1).firstToken().line()).isEqualTo(9); + // "y = 2" starts further along the raw ipynb line than "x = 1" + assertThat(statements.get(1).firstToken().column()).isGreaterThan(statements.get(0).firstToken().column()); + } + } diff --git a/python-commons/src/test/resources/org/sonar/plugins/python/notebook_multiline_string_in_array.ipynb b/python-commons/src/test/resources/org/sonar/plugins/python/notebook_multiline_string_in_array.ipynb new file mode 100644 index 000000000..8c14af694 --- /dev/null +++ b/python-commons/src/test/resources/org/sonar/plugins/python/notebook_multiline_string_in_array.ipynb @@ -0,0 +1,22 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 0, + "metadata": {}, + "outputs": [], + "source": [ + "print(\"Test 1\")\ntestA = \"1\"\nprint(\"Test 2\")\ntestB = \"2\"\nprint(\"Test 3\")\ntestC = \"3\"\n\n\ntestAll = testA + testB + testC\n\nprint(testAll)" + ] + } + ], + "metadata": { + "language_info": { + "name": "python" + }, + "name": "test", + "notebookId": 1 + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/python-commons/src/test/resources/org/sonar/plugins/python/notebook_multiline_string_in_array_no_trailing_newline.ipynb b/python-commons/src/test/resources/org/sonar/plugins/python/notebook_multiline_string_in_array_no_trailing_newline.ipynb new file mode 100644 index 000000000..a27406576 --- /dev/null +++ b/python-commons/src/test/resources/org/sonar/plugins/python/notebook_multiline_string_in_array_no_trailing_newline.ipynb @@ -0,0 +1,23 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 0, + "metadata": {}, + "outputs": [], + "source": [ + "x = 1\ny", + " = 2" + ] + } + ], + "metadata": { + "language_info": { + "name": "python" + }, + "name": "test", + "notebookId": 1 + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/IpynbNotebookParser.java b/python-frontend/src/main/java/org/sonar/plugins/python/IpynbNotebookParser.java index 533ccdc4e..e75f06104 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/IpynbNotebookParser.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/IpynbNotebookParser.java @@ -240,57 +240,148 @@ private static NotebookParsingData parseSourceArray(int startLine, JsonParser jP JsonLocation tokenLocation = jParser.currentTokenLocation(); // In case of an empty cell, we don't add an extra line var lastSourceLine = "\n"; + var lastOffset = LineSplitOffset.NONE; + // Whether the array element about to be processed starts on a fresh physical line. An element only + // does if the previous one ended with a newline; otherwise it is glued onto the previous element's + // still-open line and must not get its own locationMap entry (there is only room for one per line). + var startsNewLine = true; while (jParser.nextToken() != JsonToken.END_ARRAY) { String sourceLine = jParser.getValueAsString(); var newTokenLocation = jParser.currentTokenLocation(); - var countEscapedChar = countEscapeCharacters(sourceLine); - cellData.addLineToSource(sourceLine, newTokenLocation.getLineNr(), newTokenLocation.getColumnNr(), countEscapedChar, isCompressed); + lastOffset = addSourceArrayElement(cellData, sourceLine, newTokenLocation, isCompressed, startsNewLine); + startsNewLine = sourceLine.endsWith("\n"); lastSourceLine = sourceLine; tokenLocation = newTokenLocation; } + // Column right after the last array element's content, accounting for any lines split out of a + // multiline string contained in that element. + int lastColumn = tokenLocation.getColumnNr() + lastOffset.length() + lastOffset.extraChars(); if (!lastSourceLine.endsWith("\n")) { cellData.appendToSource("\n"); } else { // if the last string of the array ends with a newline character we should add this new line to our representation var newLineLocation = new IPythonLocation( tokenLocation.getLineNr(), - tokenLocation.getColumnNr(), - List.of(new EscapeCharPositionInfo(tokenLocation.getColumnNr(), 1)), + lastColumn, + List.of(new EscapeCharPositionInfo(lastColumn, 1)), false); cellData.addLineToSource("\n", newLineLocation); } // Account for the last cell delimiter - cellData.addDelimiterToSource(SONAR_PYTHON_NOTEBOOK_CELL_DELIMITER + "\n", tokenLocation.getLineNr(), tokenLocation.getColumnNr()); + cellData.addDelimiterToSource(SONAR_PYTHON_NOTEBOOK_CELL_DELIMITER + "\n", tokenLocation.getLineNr(), lastColumn); return cellData; } + /** + * Adds a single "source" array element to the cell data. Most array elements represent exactly one + * Python source line, but the JSON schema also allows an element to itself contain embedded newlines + * (a multiline string used as one array item), in which case it is split the same way a top-level + * multiline string "source" value is. Returns the raw-content offset consumed within the element's + * JSON token, relative to its token location, so the caller can correctly position whatever follows it. + * + *

            If the previous element did not end with a newline, this element continues that still-open + * physical line rather than starting a new one: its first (or only) segment is appended as plain text, + * with no locationMap entry of its own, since a generated line can only be anchored to a single + * original position. + */ + private static LineSplitOffset addSourceArrayElement(NotebookParsingData cellData, String sourceLine, JsonLocation tokenLocation, boolean isCompressed, + boolean startsNewLine) { + List lines = sourceLine.lines().toList(); + if (lines.size() <= 1) { + if (!startsNewLine) { + cellData.appendToSource(sourceLine); + return LineSplitOffset.NONE; + } + var countEscapedChar = countEscapeCharacters(sourceLine); + cellData.addLineToSource(sourceLine, tokenLocation.getLineNr(), tokenLocation.getColumnNr(), countEscapedChar, isCompressed); + return LineSplitOffset.NONE; + } + // The element packs multiple Python lines into a single array entry: each embedded line needs its + // own location entry, the same way parseSourceMultilineString handles a plain-string "source" - + // except its first line, which only gets one if it genuinely starts a new physical line. + var offset = addSourceLinesToCellData(cellData, lines, tokenLocation, true, startsNewLine); + if (sourceLine.endsWith("\n")) { + cellData.appendToSource("\n"); + offset = offset.plusNewline(); + } + return offset; + } + private static NotebookParsingData parseSourceMultilineString(int startLine, JsonParser jParser) throws IOException { NotebookParsingData cellData = NotebookParsingData.fromLine(startLine); String sourceLine = jParser.getValueAsString(); JsonLocation tokenLocation = jParser.currentTokenLocation(); - var previousLen = 0; - var previousExtraChars = 0; - for (String line : sourceLine.lines().toList()) { - var countEscapedChar = countEscapeCharacters(line); - var currentCount = countEscapedChar.stream().mapToInt(EscapeCharPositionInfo::numberOfExtraChars).sum(); - cellData.addLineToSource(line, new IPythonLocation(tokenLocation.getLineNr(), - tokenLocation.getColumnNr() + previousLen + previousExtraChars, countEscapedChar, true)); - cellData.appendToSource("\n"); - previousLen += line.length() + 2; - previousExtraChars += currentCount; - } + var offset = addSourceLinesToCellData(cellData, sourceLine.lines().toList(), tokenLocation, true, true); + // The last split line is always followed by a newline: either the cell delimiter or the next cell's content. + cellData.appendToSource("\n"); + offset = offset.plusNewline(); if (sourceLine.endsWith("\n")) { - var column = tokenLocation.getColumnNr() + previousExtraChars + previousLen; + var column = tokenLocation.getColumnNr() + offset.length() + offset.extraChars(); cellData.addLineToSource("\n", new IPythonLocation(tokenLocation.getLineNr(), column, List.of(new EscapeCharPositionInfo(column, 1)), true)); - previousLen += 2; + offset = offset.plusNewline(); } // Account for the last cell delimiter - cellData.addDelimiterToSource(SONAR_PYTHON_NOTEBOOK_CELL_DELIMITER + "\n", tokenLocation.getLineNr(), tokenLocation.getColumnNr() + previousExtraChars + previousLen); + cellData.addDelimiterToSource(SONAR_PYTHON_NOTEBOOK_CELL_DELIMITER + "\n", tokenLocation.getLineNr(), tokenLocation.getColumnNr() + offset.length() + offset.extraChars()); return cellData; } + /** + * Splits a JSON string value's content into individual Python source lines and adds each to the cell + * data, computing the column of every line within the original JSON token. Every line except the last + * is followed by an explicit newline in the aggregated source, since it was followed by an embedded + * newline in the JSON value; the caller decides how to terminate the last one. + * + *

            When {@code firstLineStartsNewLine} is false, the first line continues a still-open physical line + * from whatever was appended just before it, so it is added as plain text with no locationMap entry of + * its own (a generated line can only be anchored to a single original position). + */ + private static LineSplitOffset addSourceLinesToCellData(NotebookParsingData cellData, List lines, JsonLocation tokenLocation, boolean isCompressed, + boolean firstLineStartsNewLine) { + var offset = LineSplitOffset.NONE; + for (int i = 0; i < lines.size(); i++) { + String line = lines.get(i); + var countEscapedChar = countEscapeCharacters(line); + var currentExtraChars = countEscapedChar.stream().mapToInt(EscapeCharPositionInfo::numberOfExtraChars).sum(); + if (i > 0 || firstLineStartsNewLine) { + cellData.addLineToSource(line, new IPythonLocation(tokenLocation.getLineNr(), + tokenLocation.getColumnNr() + offset.length() + offset.extraChars(), countEscapedChar, isCompressed)); + } else { + cellData.appendToSource(line); + } + boolean hasMoreLines = i < lines.size() - 1; + if (hasMoreLines) { + cellData.appendToSource("\n"); + offset = offset.plusLine(line.length(), currentExtraChars); + } else { + offset = offset.plusLastLine(line.length(), currentExtraChars); + } + } + return offset; + } + + /** + * Tracks how many raw JSON characters (and how many of those are "extra" escape characters) have + * been consumed from a JSON string token while splitting it into individual source lines. + */ + private record LineSplitOffset(int length, int extraChars) { + static final LineSplitOffset NONE = new LineSplitOffset(0, 0); + + LineSplitOffset plusLine(int lineLength, int lineExtraChars) { + // +2 accounts for the JSON-escaped "\n" (backslash + n) separating this line from the next one. + return new LineSplitOffset(length + lineLength + 2, extraChars + lineExtraChars); + } + + LineSplitOffset plusLastLine(int lineLength, int lineExtraChars) { + return new LineSplitOffset(length + lineLength, extraChars + lineExtraChars); + } + + LineSplitOffset plusNewline() { + return new LineSplitOffset(length + 2, extraChars); + } + } + private static List countEscapeCharacters(String sourceLine) { List escapeCharPositionInfoList = new LinkedList<>(); var arr = sourceLine.toCharArray(); diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/IpynbNotebookParserTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/IpynbNotebookParserTest.java index 01934ccbb..beed8cf18 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/IpynbNotebookParserTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/IpynbNotebookParserTest.java @@ -260,6 +260,57 @@ void testParseNotebookSingleLine() throws IOException { assertThat(result.locationMap()).containsEntry(8, new IPythonLocation(1, 636, mapToColumnMappingList(Map.of(1, 1, 2, 1, 0, 1)), true)); } + @Test + void testParseNotebookWithMultilineArrayElementWithoutTrailingNewline() throws IOException { + // "source": ["x = 1\ny", " = 2"] - the first element has no trailing newline, so its last split + // line ("y") is continued, not terminated, by the next array element (" = 2"), giving 2 python lines + // ("x = 1" and "y = 2") rather than 3. Before the fix, each array element always got its own + // locationMap entry regardless of whether the previous one ended with a newline, producing one more + // entry than there are physical lines and misaligning every location after it. + var inputFile = createInputFile(baseDir, "notebook_multiline_string_in_array_no_trailing_newline.ipynb", InputFile.Status.CHANGED, InputFile.Type.MAIN); + + var resultOptional = IpynbNotebookParser.parseNotebook(inputFile); + + assertThat(resultOptional).isPresent(); + + var result = resultOptional.get(); + assertThat(result.contents()).hasLineCount(3); + assertThat(result.locationMap().keySet()).hasSize(3); + //"x = 1" + assertThat(result.locationMap()).extractingByKey(1).isEqualTo(new IPythonLocation(9, 9, List.of(), true)); + //"y = 2" ("y" starts the line, " = 2" from the next array element continues it) + assertThat(result.locationMap()).extractingByKey(2).isEqualTo(new IPythonLocation(9, 16, List.of(), true)); + // the cell delimiter + assertThat(result.locationMap()).extractingByKey(3).isEqualTo(new IPythonLocation(10, 9, List.of(), false)); + } + + @Test + void testParseNotebookWithMultilineStringInSourceArray() throws IOException { + var inputFile = createInputFile(baseDir, "notebook_multiline_string_in_array.ipynb", InputFile.Status.CHANGED, InputFile.Type.MAIN); + + var resultOptional = IpynbNotebookParser.parseNotebook(inputFile); + + assertThat(resultOptional).isPresent(); + + var result = resultOptional.get(); + // 11 python lines packed into the single "source" array element, plus the cell delimiter. + // Before the fix, only 2 entries were produced (the whole array element counted as a single line), + // which made TokenEnricher fail with "No IPythonLocation found for line 3". + assertThat(result.contents()).hasLineCount(12); + assertThat(result.locationMap().keySet()).hasSize(12); + //"print(\"Test 1\")" + assertThat(result.locationMap()).extractingByKey(1).isEqualTo(new IPythonLocation(9, 9, mapToColumnMappingList(Map.of(6, 1, 13, 1)), true)); + //"testA = \"1\"" + assertThat(result.locationMap()).extractingByKey(2).isEqualTo(new IPythonLocation(9, 28, mapToColumnMappingList(Map.of(8, 1, 10, 1)), true)); + // two consecutive empty lines + assertThat(result.locationMap()).extractingByKey(7).isEqualTo(new IPythonLocation(9, 111, List.of(), true)); + assertThat(result.locationMap()).extractingByKey(8).isEqualTo(new IPythonLocation(9, 113, List.of(), true)); + //"print(testAll)" (last content line, no trailing newline in the JSON value) + assertThat(result.locationMap()).extractingByKey(11).isEqualTo(new IPythonLocation(9, 150, List.of(), true)); + // the cell delimiter + assertThat(result.locationMap()).extractingByKey(12).isEqualTo(new IPythonLocation(9, 164, List.of(), false)); + } + @Test void testParseNotebook1() throws IOException { var inputFile = createInputFile(baseDir, "notebook_no_code.ipynb", InputFile.Status.CHANGED, InputFile.Type.MAIN); diff --git a/python-frontend/src/test/resources/org/sonar/plugins/python/notebook_multiline_string_in_array.ipynb b/python-frontend/src/test/resources/org/sonar/plugins/python/notebook_multiline_string_in_array.ipynb new file mode 100644 index 000000000..8c14af694 --- /dev/null +++ b/python-frontend/src/test/resources/org/sonar/plugins/python/notebook_multiline_string_in_array.ipynb @@ -0,0 +1,22 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 0, + "metadata": {}, + "outputs": [], + "source": [ + "print(\"Test 1\")\ntestA = \"1\"\nprint(\"Test 2\")\ntestB = \"2\"\nprint(\"Test 3\")\ntestC = \"3\"\n\n\ntestAll = testA + testB + testC\n\nprint(testAll)" + ] + } + ], + "metadata": { + "language_info": { + "name": "python" + }, + "name": "test", + "notebookId": 1 + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/python-frontend/src/test/resources/org/sonar/plugins/python/notebook_multiline_string_in_array_no_trailing_newline.ipynb b/python-frontend/src/test/resources/org/sonar/plugins/python/notebook_multiline_string_in_array_no_trailing_newline.ipynb new file mode 100644 index 000000000..a27406576 --- /dev/null +++ b/python-frontend/src/test/resources/org/sonar/plugins/python/notebook_multiline_string_in_array_no_trailing_newline.ipynb @@ -0,0 +1,23 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 0, + "metadata": {}, + "outputs": [], + "source": [ + "x = 1\ny", + " = 2" + ] + } + ], + "metadata": { + "language_info": { + "name": "python" + }, + "name": "test", + "notebookId": 1 + }, + "nbformat": 4, + "nbformat_minor": 0 +} From 3455a0da507b2991607b678602f5bdeabac3317d Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Fri, 17 Jul 2026 13:49:42 +0200 Subject: [PATCH 223/322] SONARPY-4379 Implement S8993: Test functions should declare fixture dependencies as parameters GitOrigin-RevId: f1696429373e77f62788ca0b923a43418cee798a --- .../python/checks/OpenSourceCheckList.java | 2 + .../tests/FixtureParamDependenciesCheck.java | 114 ++++++++++++++++++ .../python/checks/utils/UnittestUtils.java | 2 +- .../org/sonar/l10n/py/rules/python/S8993.html | 96 +++++++++++++++ .../org/sonar/l10n/py/rules/python/S8993.json | 25 ++++ .../py/rules/python/Sonar_way_profile.json | 1 + .../FixtureParamDependenciesCheckTest.java | 51 ++++++++ .../test/resources/checks/tests/conftest.py | 21 ++++ .../fixtureParamDependenciesNonPytestFile.py | 5 + ...fixtureParamDependenciesPytestHook_test.py | 15 +++ .../tests/fixtureParamDependencies_test.py | 75 ++++++++++++ .../v2/types/TrivialTypeInferenceVisitor.java | 31 +++++ .../v2/typeshed/TypeShedConstants.java | 2 + .../custom_protobuf/_pytest.fixtures.protobuf | 13 ++ .../types/custom_protobuf/_pytest.protobuf | 9 ++ .../types/custom_protobuf/pytest.protobuf | 12 ++ .../semantic/v2/TypeInferenceV2Test.java | 108 +++++++++++++++++ .../checksums/custom.checksum | 4 +- .../resources/custom/_pytest/__init__.pyi | 0 .../resources/custom/_pytest/fixtures.pyi | 4 + .../resources/custom/pytest/__init__.pyi | 3 + 21 files changed, 590 insertions(+), 3 deletions(-) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/tests/FixtureParamDependenciesCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8993.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8993.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/tests/FixtureParamDependenciesCheckTest.java create mode 100644 python-checks/src/test/resources/checks/tests/conftest.py create mode 100644 python-checks/src/test/resources/checks/tests/fixtureParamDependenciesNonPytestFile.py create mode 100644 python-checks/src/test/resources/checks/tests/fixtureParamDependenciesPytestHook_test.py create mode 100644 python-checks/src/test/resources/checks/tests/fixtureParamDependencies_test.py create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/_pytest.fixtures.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/_pytest.protobuf create mode 100644 python-frontend/typeshed_serializer/resources/custom/_pytest/__init__.pyi create mode 100644 python-frontend/typeshed_serializer/resources/custom/_pytest/fixtures.pyi diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 5384bd29c..ff035784e 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -97,6 +97,7 @@ import org.sonar.python.checks.tests.AssertionArgumentOrderCheck; import org.sonar.python.checks.tests.DedicatedAssertionCheck; import org.sonar.python.checks.tests.DedicatedExceptionAssertionCheck; +import org.sonar.python.checks.tests.FixtureParamDependenciesCheck; import org.sonar.python.checks.tests.GroupSimilarTestsParameterizedCheck; import org.sonar.python.checks.tests.IdenticalAssertionArgumentsCheck; import org.sonar.python.checks.tests.ImplicitlySkippedTestCheck; @@ -249,6 +250,7 @@ public Stream> getChecks() { FilePermissionsCheck.class, FileHeaderCopyrightCheck.class, FixmeCommentCheck.class, + FixtureParamDependenciesCheck.class, FlaskErrorHandlerStatusCheck.class, FlaskHardCodedJWTSecretKeyCheck.class, FlaskHardCodedSecretKeyCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/FixtureParamDependenciesCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/FixtureParamDependenciesCheck.java new file mode 100644 index 000000000..2f14ff153 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/FixtureParamDependenciesCheck.java @@ -0,0 +1,114 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import javax.annotation.Nullable; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.Decorator; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.FunctionDef; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.checks.utils.UnittestUtils; +import org.sonar.python.semantic.v2.typeshed.TypeShedConstants; +import org.sonar.python.tree.TreeUtils; + +@Rule(key = "S8993") +public class FixtureParamDependenciesCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Declare this fixture as a test function parameter instead of using \"request.getfixturevalue()\" with a string literal."; + private static final String CONFTEST_FILE_NAME = "conftest.py"; + private static final String PYTEST_HOOK_PREFIX = "pytest_"; + private static final TypeMatcher GET_FIXTURE_VALUE_MATCHER = TypeMatchers.isType( + TypeShedConstants.PYTEST_FIXTURE_REQUEST_GET_FIXTURE_VALUE_FQN + ); + private static final TypeMatcher PYTEST_FIXTURE_MATCHER = TypeMatchers.withFQN(UnittestUtils.PYTEST_FIXTURE_DECORATOR_FQN); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, FixtureParamDependenciesCheck::checkCallExpression); + } + + private static void checkCallExpression(SubscriptionContext ctx) { + CallExpression callExpression = (CallExpression) ctx.syntaxNode(); + if (!GET_FIXTURE_VALUE_MATCHER.isTrueFor(callExpression.callee(), ctx)) { + return; + } + + FunctionDef enclosingFunction = (FunctionDef) TreeUtils.firstAncestorOfKind(callExpression, Tree.Kind.FUNCDEF); + if (enclosingFunction == null || !isCollectedTestFunction(ctx, enclosingFunction)) { + return; + } + + Expression fixtureNameExpression = fixtureNameArgument(callExpression); + if (fixtureNameExpression == null || !fixtureNameExpression.is(Tree.Kind.STRING_LITERAL)) { + return; + } + + ctx.addIssue(fixtureNameExpression, MESSAGE); + } + + private static boolean isCollectedTestFunction(SubscriptionContext ctx, FunctionDef functionDef) { + if (isPytestFixture(functionDef, ctx)) { + return false; + } + if (isPytestHook(functionDef)) { + return false; + } + if (isConftestFile(ctx.pythonFile().fileName())) { + return false; + } + return UnittestUtils.isPytestStyleTestFunction(functionDef, ctx.pythonFile().fileName()); + } + + private static boolean isPytestFixture(FunctionDef functionDef, SubscriptionContext ctx) { + return functionDef.decorators().stream() + .anyMatch(decorator -> PYTEST_FIXTURE_MATCHER.isTrueFor(getDecoratorFunctionExpression(decorator), ctx)); + } + + private static boolean isPytestHook(FunctionDef functionDef) { + return functionDef.name().name().startsWith(PYTEST_HOOK_PREFIX); + } + + private static boolean isConftestFile(String fileName) { + return CONFTEST_FILE_NAME.equals(fileName); + } + + private static Expression getDecoratorFunctionExpression(Decorator decorator) { + Expression expression = decorator.expression(); + if (expression instanceof CallExpression callExpression) { + return callExpression.callee(); + } + return expression; + } + + @Nullable + private static Expression fixtureNameArgument(CallExpression callExpression) { + RegularArgument argument = TreeUtils.nthArgumentOrKeyword(0, "argname", callExpression.arguments()); + return argument == null ? null : argument.expression(); + } + + @Override + public CheckScope scope() { + return CheckScope.ALL; + } +} diff --git a/python-checks/src/main/java/org/sonar/python/checks/utils/UnittestUtils.java b/python-checks/src/main/java/org/sonar/python/checks/utils/UnittestUtils.java index ea7d110ce..799302c7e 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/utils/UnittestUtils.java +++ b/python-checks/src/main/java/org/sonar/python/checks/utils/UnittestUtils.java @@ -43,7 +43,7 @@ public class UnittestUtils { private static final Set PYTEST_LIFECYCLE_METHODS = Set.of( "setUp", "tearDown", "setUpClass", "tearDownClass", "setup_method", "teardown_method", "setup_class", "teardown_class", "setup_module", "teardown_module"); - private static final String PYTEST_FIXTURE_DECORATOR_FQN = "pytest.fixture"; + public static final String PYTEST_FIXTURE_DECORATOR_FQN = "pytest.fixture"; private static final String UNITTEST_TEST_CASE_FQN_PREFIX = "unittest.case.TestCase."; private static final String PYTEST_EXPECTED_EXCEPTION = "expected_exception"; private static final String PYTEST_MATCH = "match"; diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8993.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8993.html new file mode 100644 index 000000000..6f7da0785 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8993.html @@ -0,0 +1,96 @@ +

            This rule raises an issue when a collected test function calls request.getfixturevalue() with a string literal fixture name instead of +declaring that fixture as a function parameter.

            +

            In Python’s pytest framework, this specifically refers to the request.getfixturevalue() method.

            +

            Why is this an issue?

            +

            request.getfixturevalue('fixture_name') with a string literal hides dependencies from the function signature and static analysis. +Refactoring fixture names leaves no trace until runtime.

            +

            Declare known fixtures as test parameters instead. Dynamic lookup remains appropriate when the name comes from parametrization or inside fixture +chains.

            +

            In pytest specifically, this anti-pattern manifests when a collected test function calls request.getfixturevalue() with a string +literal fixture name. When the fixture name is known at write time, declare it as a test parameter so dependencies stay visible to readers and static +analysis.

            +

            request.getfixturevalue() remains appropriate inside @pytest.fixture functions for fixture chains, and in tests that +resolve fixture names from parametrization or configuration when the name is not fixed at write time.

            +

            Exceptions

            +

            Fixture chains

            +

            Using request.getfixturevalue() inside @pytest.fixture functions is acceptable when one fixture must load another +conditionally.

            +

            Parametrized fixture-name resolution

            +

            When the fixture name comes from a variable, for example via @pytest.mark.parametrize, dynamic lookup is intentional and out of scope +for this rule.

            +

            conftest.py and hooks

            +

            Fixture and hook definitions in conftest.py are not collected test functions and are not reported.

            +

            Plugin and meta tests

            +

            Tests that exercise pytest plugins or the fixture request API itself may legitimately call getfixturevalue with a runtime name. Review +manually and suppress only when the test’s purpose requires dynamic fixture resolution.

            +

            What is the potential impact?

            +

            Refactoring fixture names leaves no static trace in test signatures, so broken dependencies surface only when tests execute.

            +

            How to fix it

            +

            Declare known fixtures as test parameters. Keep request.getfixturevalue() inside fixture functions or when the name is resolved at +runtime from parametrization.

            +

            Code examples

            +

            Noncompliant code example

            +
            +import pytest
            +
            +@pytest.fixture
            +def database():
            +    class DB:
            +        def query(self, sql):
            +            return 1
            +
            +    return DB()
            +
            +def test_database_query(request):
            +    # Noncompliant: known fixture name loaded dynamically
            +    db = request.getfixturevalue('database')
            +    result = db.query('SELECT 1')
            +    assert result == 1
            +
            +

            Compliant solution

            +
            +import pytest
            +
            +@pytest.fixture
            +def database():
            +    class DB:
            +        def query(self, sql):
            +            return 1
            +
            +    return DB()
            +
            +def test_database_query(database):
            +    # Fixture dependency is now explicit
            +    result = database.query('SELECT 1')
            +    assert result == 1
            +
            +

            Parametrized fixture-name resolution and fixture chains are acceptable and not reported:

            +
            +import pytest
            +
            +@pytest.fixture
            +def database():
            +    return object()
            +
            +@pytest.fixture
            +def cache():
            +    return object()
            +
            +@pytest.fixture
            +def combined(request):
            +    # Compliant: fixture-to-fixture lookup
            +    return request.getfixturevalue('database')
            +
            +@pytest.mark.parametrize('fixture_name', ['database', 'cache'])
            +def test_matrix(request, fixture_name):
            +    # Compliant: fixture name comes from parametrization
            +    fixture = request.getfixturevalue(fixture_name)
            +    assert fixture is not None
            +
            +

            Resources

            +

            Documentation

            + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8993.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8993.json new file mode 100644 index 000000000..45ad20b31 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8993.json @@ -0,0 +1,25 @@ +{ + "title": "Test functions should declare fixture dependencies as parameters instead of using \"request.getfixturevalue\" with string literals", + "type": "CODE_SMELL", + "status": "beta", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5 min" + }, + "tags": [ + "pytest", + "testing", + "confusing" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-8993", + "sqKey": "S8993", + "scope": "Tests", + "quickfix": "unknown", + "code": { + "impacts": { + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "CLEAR" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 3d119e171..1c5b918b4 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -375,6 +375,7 @@ "S8974", "S8978", "S8992", + "S8993", "S9001" ] } diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/FixtureParamDependenciesCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/FixtureParamDependenciesCheckTest.java new file mode 100644 index 000000000..601877e73 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/FixtureParamDependenciesCheckTest.java @@ -0,0 +1,51 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import org.junit.jupiter.api.Test; +import org.sonar.plugins.python.api.PythonCheck; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +import static org.assertj.core.api.Assertions.assertThat; + +class FixtureParamDependenciesCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/fixtureParamDependencies_test.py", new FixtureParamDependenciesCheck()); + } + + @Test + void test_conftest() { + PythonCheckVerifier.verifyNoIssue("src/test/resources/checks/tests/conftest.py", new FixtureParamDependenciesCheck()); + } + + @Test + void test_non_pytest_file() { + PythonCheckVerifier.verifyNoIssue("src/test/resources/checks/tests/fixtureParamDependenciesNonPytestFile.py", new FixtureParamDependenciesCheck()); + } + + @Test + void test_pytest_hooks_and_imported_fixture() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/fixtureParamDependenciesPytestHook_test.py", new FixtureParamDependenciesCheck()); + } + + @Test + void test_scope() { + assertThat(new FixtureParamDependenciesCheck().scope()).isEqualTo(PythonCheck.CheckScope.ALL); + } +} diff --git a/python-checks/src/test/resources/checks/tests/conftest.py b/python-checks/src/test/resources/checks/tests/conftest.py new file mode 100644 index 000000000..a9cdb777d --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/conftest.py @@ -0,0 +1,21 @@ +import pytest + + +@pytest.fixture +def database(): + return object() + + +@pytest.fixture +def combined(request): + return request.getfixturevalue('database') + + +def pytest_configure(config): + request = config + request.getfixturevalue('database') + + +def test_in_conftest_should_be_ignored(request): + # Tests in conftest.py are not collected; still exercise the conftest exclusion path. + request.getfixturevalue('database') diff --git a/python-checks/src/test/resources/checks/tests/fixtureParamDependenciesNonPytestFile.py b/python-checks/src/test/resources/checks/tests/fixtureParamDependenciesNonPytestFile.py new file mode 100644 index 000000000..7f320f5f6 --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/fixtureParamDependenciesNonPytestFile.py @@ -0,0 +1,5 @@ +import pytest + + +def helper(request): + request.getfixturevalue('database') diff --git a/python-checks/src/test/resources/checks/tests/fixtureParamDependenciesPytestHook_test.py b/python-checks/src/test/resources/checks/tests/fixtureParamDependenciesPytestHook_test.py new file mode 100644 index 000000000..c5f17cb00 --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/fixtureParamDependenciesPytestHook_test.py @@ -0,0 +1,15 @@ +from pytest import fixture + + +@fixture +def combined(request): + return request.getfixturevalue('database') + + +def pytest_runtest_setup(request): + request.getfixturevalue('database') + + +def test_with_imported_fixture_decorator(request): + request.getfixturevalue('database') # Noncompliant {{Declare this fixture as a test function parameter instead of using "request.getfixturevalue()" with a string literal.}} +# ^^^^^^^^^^ diff --git a/python-checks/src/test/resources/checks/tests/fixtureParamDependencies_test.py b/python-checks/src/test/resources/checks/tests/fixtureParamDependencies_test.py new file mode 100644 index 000000000..4a3fc4005 --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/fixtureParamDependencies_test.py @@ -0,0 +1,75 @@ +import pytest + + +@pytest.fixture +def database(): + class DB: + def query(self, sql): + return 1 + + return DB() + + +@pytest.fixture +def cache(): + return object() + + +def test_database_query(request): + db = request.getfixturevalue('database') # Noncompliant {{Declare this fixture as a test function parameter instead of using "request.getfixturevalue()" with a string literal.}} +# ^^^^^^^^^^ + result = db.query('SELECT 1') + assert result == 1 + + +def test_database_query_keyword(request): + db = request.getfixturevalue(argname='database') # Noncompliant {{Declare this fixture as a test function parameter instead of using "request.getfixturevalue()" with a string literal.}} + assert db is not None + + +def test_database_query_compliant(database): + result = database.query('SELECT 1') + assert result == 1 + + +@pytest.fixture(scope="module") +def combined_with_scope(request): + return request.getfixturevalue('database') + + +@pytest.fixture +def combined(request): + return request.getfixturevalue('database') + + +def test_no_fixture_name_argument(request): + request.getfixturevalue() + + +def test_other_calls(request, database): + database.query('SELECT 1') + + +def test_other_fixture_request_method(request): + request.addfinalizer('cleanup') + + +@pytest.mark.parametrize('fixture_name', ['database', 'cache']) +def test_matrix(request, fixture_name): + fixture = request.getfixturevalue(fixture_name) + assert fixture is not None + + +def test_dynamic_fixture_name(request): + name = 'database' + fixture = request.getfixturevalue(name) + assert fixture is not None + + +def helper_not_a_test(request): + request.getfixturevalue('database') + + +class TestClass: + def test_in_class(self, request): + request.getfixturevalue('database') # Noncompliant {{Declare this fixture as a test function parameter instead of using "request.getfixturevalue()" with a string literal.}} diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/TrivialTypeInferenceVisitor.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/TrivialTypeInferenceVisitor.java index 6715c70f7..5830fefd8 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/TrivialTypeInferenceVisitor.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/TrivialTypeInferenceVisitor.java @@ -89,6 +89,7 @@ import org.sonar.python.semantic.v2.types.typecalculator.CallReturnTypeCalculator; import org.sonar.python.semantic.v2.types.typecalculator.QualifiedExpressionCalculator; import org.sonar.python.semantic.v2.typetable.TypeTable; +import org.sonar.python.semantic.v2.typeshed.TypeShedConstants; import org.sonar.python.tree.AwaitExpressionImpl; import org.sonar.python.tree.BinaryExpressionImpl; import org.sonar.python.tree.CallExpressionImpl; @@ -132,6 +133,9 @@ public class TrivialTypeInferenceVisitor extends BaseTreeVisitor { TypeInferenceMatchers.withFQN("typing.Self"), TypeInferenceMatchers.withFQN("typing_extensions.Self"))); + private static final String PYTEST_MODULE = "pytest"; + private static final String PYTEST_REQUEST_PARAMETER = "request"; + private record DeferredTree(Tree tree, Scope scope) { } @@ -399,6 +403,7 @@ public void visitFunctionDef(FunctionDef functionDef) { scan(functionDef.typeParams()); scan(functionDef.parameters()); setSelfParameterType(functionDef); + setPytestRequestParameterType(functionDef); deferTree(functionDef.body()); }); } @@ -480,6 +485,32 @@ private void setSelfParameterType(FunctionDef functionDef) { } } + private void setPytestRequestParameterType(FunctionDef functionDef) { + if (!importedModulesFQN.contains(PYTEST_MODULE)) { + return; + } + + var parameterList = functionDef.parameters(); + if (parameterList == null) { + return; + } + + PythonType fixtureRequestType = projectLevelTypeTable.getType(TypeShedConstants.PYTEST_FIXTURE_REQUEST_FQN); + if (fixtureRequestType instanceof UnknownType) { + return; + } + + var requestObjectType = ObjectType.Builder.fromType(fixtureRequestType) + .withTypeSource(TypeSource.EXACT) + .build(); + + parameterList.nonTuple().stream() + .filter(parameter -> parameter.typeAnnotation() == null) + .map(Parameter::name) + .filter(name -> name != null && PYTEST_REQUEST_PARAMETER.equals(name.name())) + .forEach(name -> setTypeToName(name, requestObjectType)); + } + @Override public void visitImportName(ImportName importName) { importName.modules() diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/TypeShedConstants.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/TypeShedConstants.java index 560a445c9..7608a7eba 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/TypeShedConstants.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/TypeShedConstants.java @@ -23,6 +23,8 @@ public class TypeShedConstants { public static final String BUILTINS_NONE_TYPE_FQN = BUILTINS_PREFIX + "NoneType"; public static final String BUILTINS_TUPLE_FQN = BUILTINS_PREFIX + "tuple"; public static final String BUILTINS_DICT_FQN = BUILTINS_PREFIX + "dict"; + public static final String PYTEST_FIXTURE_REQUEST_FQN = "_pytest.fixtures.FixtureRequest"; + public static final String PYTEST_FIXTURE_REQUEST_GET_FIXTURE_VALUE_FQN = PYTEST_FIXTURE_REQUEST_FQN + ".getfixturevalue"; private TypeShedConstants() { } diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/_pytest.fixtures.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/_pytest.fixtures.protobuf new file mode 100644 index 000000000..126f31b6e --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/_pytest.fixtures.protobuf @@ -0,0 +1,13 @@ + +_pytest.fixtures +FixtureRequest_pytest.fixtures.FixtureRequest"*SonarPythonAnalyzerFakeStub.CustomStubBase* +getfixturevalue/_pytest.fixtures.FixtureRequest.getfixturevalue"" +builtins.object"builtins.object*L +selfB +_pytest.fixtures.FixtureRequest"_pytest.fixtures.FixtureRequest*) +argname + builtins.str" builtins.str* +__annotations__ _pytest.fixtures.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/_pytest.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/_pytest.protobuf new file mode 100644 index 000000000..38417e9d5 --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/_pytest.protobuf @@ -0,0 +1,9 @@ + +_pytest*h +__path___pytest.__path__J +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list* +__annotations___pytest.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pytest.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pytest.protobuf index 2d2f4e192..1c59e26ca 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pytest.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pytest.protobuf @@ -8,6 +8,18 @@ args" builtins.object"builtins.object*. kwargs" +builtins.object"builtins.object +fixturepytest.fixture" +Any*, +args" +builtins.object"builtins.object*. +kwargs" +builtins.object"builtins.object~ +raises pytest.raises" +Any*, +args" +builtins.object"builtins.object*. +kwargs" builtins.object"builtins.object*g __path__pytest.__path__J builtins.list[builtins.str] diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/TypeInferenceV2Test.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/TypeInferenceV2Test.java index fc11f3ebe..1de4ab15f 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/TypeInferenceV2Test.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/TypeInferenceV2Test.java @@ -83,6 +83,7 @@ import org.sonar.python.semantic.ProjectLevelSymbolTable; import org.sonar.python.semantic.SymbolUtils; import org.sonar.python.semantic.v2.typetable.ProjectLevelTypeTable; +import org.sonar.python.semantic.v2.typeshed.TypeShedConstants; import org.sonar.python.tree.ExpressionStatementImpl; import org.sonar.python.tree.TreeUtils; import org.sonar.python.tree.TupleImpl; @@ -4183,6 +4184,21 @@ private static FileInput inferTypes(String lines) { return inferTypes(lines, PROJECT_LEVEL_TYPE_TABLE); } + private static Name pytestRequestName(FileInput root) { + return PythonTestUtils.getLastDescendant(root, t -> t instanceof Name name && "request".equals(name.name())); + } + + private static PythonType fixtureRequestType() { + return PROJECT_LEVEL_TYPE_TABLE.getType(TypeShedConstants.PYTEST_FIXTURE_REQUEST_FQN); + } + + private static void assertRequestIsFixtureRequest(FileInput root) { + PythonType requestType = pytestRequestName(root).typeV2(); + assertThat(requestType).isInstanceOf(ObjectType.class); + assertThat(fixtureRequestType()).isNotEqualTo(PythonType.UNKNOWN); + assertThat(((ObjectType) requestType).unwrappedType()).isEqualTo(fixtureRequestType()); + } + public static FileInput inferTypes(String lines, ProjectLevelTypeTable projectLevelTypeTable) { FileInput root = parse(lines); @@ -4383,6 +4399,98 @@ def foo((a, b)): assertThat(fooMethodDef.name().typeV2()).isInstanceOf(FunctionType.class); } + @ParameterizedTest + @MethodSource("pytestRequestParameterTypedWithPytestImportSource") + void pytestRequestParameterIsTypedWithPytestImport(String code) { + assertRequestIsFixtureRequest(inferTypes(code)); + } + + static Stream pytestRequestParameterTypedWithPytestImportSource() { + return Stream.of( + """ + import pytest + + def test_foo(request): + request + """, + """ + from pytest import fixture + + def test_foo(request): + request + """, + """ + import pytest as pt + + def test_foo(request): + request + """ + ); + } + + @Test + void pytestRequestParameterIsNotTypedWithoutPytestImport() { + FileInput root = inferTypes(""" + def test_foo(request): + request + """); + + assertThat(pytestRequestName(root).typeV2()).isEqualTo(PythonType.UNKNOWN); + } + + @Test + void pytestRequestParameterKeepsExplicitAnnotation() { + FileInput root = inferTypes(""" + import pytest + + def test_foo(request: str): + request + """); + + assertThat(pytestRequestName(root).typeV2()).is(TypesTestUtils.objectTypeOf(PROJECT_LEVEL_TYPE_TABLE.getType("builtins.str"))); + } + + @Test + void pytestRequestParameterIsNotTypedForOtherParameterNames() { + FileInput root = inferTypes(""" + import pytest + + def test_foo(other): + other + """); + + Name otherName = PythonTestUtils.getLastDescendant(root, t -> t instanceof Name name && "other".equals(name.name())); + assertThat(otherName.typeV2()).isEqualTo(PythonType.UNKNOWN); + } + + @Test + void pytestRequestParameterIsTypedInFixtureFunction() { + FileInput root = inferTypes(""" + import pytest + + @pytest.fixture + def my_fixture(request): + request + """); + + assertThat(((ObjectType) pytestRequestName(root).typeV2()).unwrappedType()).isEqualTo(fixtureRequestType()); + } + + @Test + void pytestRequestParameterIsNotTypedWhenFixtureRequestTypeUnknown() { + ProjectLevelTypeTable typeTable = spy(PROJECT_LEVEL_TYPE_TABLE); + doReturn(PythonType.UNKNOWN).when(typeTable).getType(TypeShedConstants.PYTEST_FIXTURE_REQUEST_FQN); + + FileInput root = inferTypes(""" + import pytest + + def test_foo(request): + request + """, typeTable); + + assertThat(pytestRequestName(root).typeV2()).isEqualTo(PythonType.UNKNOWN); + } + @Test void inferParameterTypeHintedWithTypingSelf() { FileInput root = inferTypes(""" diff --git a/python-frontend/typeshed_serializer/checksums/custom.checksum b/python-frontend/typeshed_serializer/checksums/custom.checksum index 56748b57f..ad9d85cfb 100644 --- a/python-frontend/typeshed_serializer/checksums/custom.checksum +++ b/python-frontend/typeshed_serializer/checksums/custom.checksum @@ -1,2 +1,2 @@ -12c8a61efcc4b738e698f3a8ec6e6a9bcc348cc44360c427233f67cd174e0256 -80e487ddcfd4725b32f40b5ef53b6bfa68b593af624ba6b162cc7f543866e4b2 \ No newline at end of file +45cfef0a508f7778c60fc3c189df3d9d8c8526a9e1d6eb80cb81ba796e19d2bf +b0f89d4c2c7ca304bcd19013ee1c301c4a7add5d73d8466573d58fae95a54a1e \ No newline at end of file diff --git a/python-frontend/typeshed_serializer/resources/custom/_pytest/__init__.pyi b/python-frontend/typeshed_serializer/resources/custom/_pytest/__init__.pyi new file mode 100644 index 000000000..e69de29bb diff --git a/python-frontend/typeshed_serializer/resources/custom/_pytest/fixtures.pyi b/python-frontend/typeshed_serializer/resources/custom/_pytest/fixtures.pyi new file mode 100644 index 000000000..9ee628976 --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/_pytest/fixtures.pyi @@ -0,0 +1,4 @@ +from SonarPythonAnalyzerFakeStub import CustomStubBase + +class FixtureRequest(CustomStubBase): + def getfixturevalue(self, argname: str) -> object: ... diff --git a/python-frontend/typeshed_serializer/resources/custom/pytest/__init__.pyi b/python-frontend/typeshed_serializer/resources/custom/pytest/__init__.pyi index bac9d58d7..1909347e1 100644 --- a/python-frontend/typeshed_serializer/resources/custom/pytest/__init__.pyi +++ b/python-frontend/typeshed_serializer/resources/custom/pytest/__init__.pyi @@ -1,7 +1,10 @@ from SonarPythonAnalyzerFakeStub import CustomStubBase +from _pytest.fixtures import FixtureRequest class ApproxScalar(CustomStubBase): ... def approx(expected: object = ..., *args: object, **kwargs: object) -> ApproxScalar: ... +def fixture(*args: object, **kwargs: object): ... +def raises(*args: object, **kwargs: object): ... import pytest.mark as mark From 58ad5be13989e46b1c06aaa369c900911ad56ce3 Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Fri, 17 Jul 2026 14:18:21 +0200 Subject: [PATCH 224/322] SONARPY-4377 Implement S8994: Pytest fixtures should contain at most one yield statement GitOrigin-RevId: c94e6f4a8b08cee640bba7388f4ec4c8130a2780 --- .../python/checks/OpenSourceCheckList.java | 2 + .../PytestFixtureMultipleYieldCheck.java | 219 ++++++++++++++++++ .../org/sonar/l10n/py/rules/python/S8994.html | 37 +++ .../org/sonar/l10n/py/rules/python/S8994.json | 27 +++ .../py/rules/python/Sonar_way_profile.json | 1 + .../PytestFixtureMultipleYieldCheckTest.java | 41 ++++ .../tests/pytestFixtureMultipleYield.py | 219 ++++++++++++++++++ .../pytestFixtureMultipleYieldNonFixture.py | 3 + 8 files changed, 549 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/tests/PytestFixtureMultipleYieldCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8994.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8994.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/tests/PytestFixtureMultipleYieldCheckTest.java create mode 100644 python-checks/src/test/resources/checks/tests/pytestFixtureMultipleYield.py create mode 100644 python-checks/src/test/resources/checks/tests/pytestFixtureMultipleYieldNonFixture.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index ff035784e..5ebd5dcb5 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -103,6 +103,7 @@ import org.sonar.python.checks.tests.ImplicitlySkippedTestCheck; import org.sonar.python.checks.tests.NotDiscoverableTestMethodCheck; import org.sonar.python.checks.tests.PytestAutouseParametrizedFixtureCheck; +import org.sonar.python.checks.tests.PytestFixtureMultipleYieldCheck; import org.sonar.python.checks.tests.SingleInvocationRuntimeExceptionCheck; import org.sonar.python.checks.tests.SkippedTestNoReasonCheck; import org.sonar.python.checks.tests.SpecificExceptionAssertionCheck; @@ -397,6 +398,7 @@ public Stream> getChecks() { PydanticMultipleInheritanceConfigCheck.class, PydanticSkipValidationWithConstraintsCheck.class, PytestAutouseParametrizedFixtureCheck.class, + PytestFixtureMultipleYieldCheck.class, PyTorchDataLoaderNumWorkersCheck.class, PytzTimeZoneInDatetimeConstructorCheck.class, RaiseOutsideExceptCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/PytestFixtureMultipleYieldCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/PytestFixtureMultipleYieldCheck.java new file mode 100644 index 000000000..49bff25c0 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/PytestFixtureMultipleYieldCheck.java @@ -0,0 +1,219 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Nullable; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.Decorator; +import org.sonar.plugins.python.api.tree.ElseClause; +import org.sonar.plugins.python.api.tree.ExceptClause; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.FinallyClause; +import org.sonar.plugins.python.api.tree.ForStatement; +import org.sonar.plugins.python.api.tree.FunctionDef; +import org.sonar.plugins.python.api.tree.IfStatement; +import org.sonar.plugins.python.api.tree.RaiseStatement; +import org.sonar.plugins.python.api.tree.ReturnStatement; +import org.sonar.plugins.python.api.tree.Statement; +import org.sonar.plugins.python.api.tree.StatementList; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.tree.TryStatement; +import org.sonar.plugins.python.api.tree.WhileStatement; +import org.sonar.plugins.python.api.tree.WithStatement; +import org.sonar.plugins.python.api.tree.YieldStatement; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; + +@Rule(key = "S8994") +public class PytestFixtureMultipleYieldCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Pytest fixtures should contain at most one yield statement."; + private static final TypeMatcher PYTEST_FIXTURE_MATCHER = TypeMatchers.withFQN("pytest.fixture"); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.FUNCDEF, PytestFixtureMultipleYieldCheck::checkFunctionDef); + } + + @Override + public CheckScope scope() { + return CheckScope.ALL; + } + + private static void checkFunctionDef(SubscriptionContext ctx) { + FunctionDef functionDef = (FunctionDef) ctx.syntaxNode(); + if (!isPytestFixture(functionDef, ctx)) { + return; + } + + YieldPathAnalyzer yieldPathAnalyzer = new YieldPathAnalyzer(); + yieldPathAnalyzer.analyze(functionDef.body()); + for (YieldStatement yieldStatement : yieldPathAnalyzer.violations()) { + ctx.addIssue(yieldStatement, MESSAGE); + } + } + + private static boolean isPytestFixture(FunctionDef functionDef, SubscriptionContext ctx) { + return functionDef.decorators().stream().anyMatch(decorator -> matchesPytestFixtureDecorator(decorator, ctx)); + } + + private static boolean matchesPytestFixtureDecorator(Decorator decorator, SubscriptionContext ctx) { + Expression expression = decorator.expression(); + if (expression instanceof CallExpression callExpression) { + return PYTEST_FIXTURE_MATCHER.isTrueFor(callExpression.callee(), ctx); + } + return PYTEST_FIXTURE_MATCHER.isTrueFor(expression, ctx); + } + + private static final class YieldPathAnalyzer { + + private final List violations = new ArrayList<>(); + + void analyze(StatementList body) { + analyzeStatements(body.statements(), 0); + } + + List violations() { + return violations; + } + + private int analyzeStatements(List statements, int yieldsBefore) { + int yieldsSoFar = yieldsBefore; + for (Statement statement : statements) { + yieldsSoFar = analyzeStatement(statement, yieldsSoFar); + } + return yieldsSoFar; + } + + private int analyzeStatement(Statement statement, int yieldsBefore) { + if (statement instanceof YieldStatement yieldStatement) { + if (yieldsBefore >= 1) { + violations.add(yieldStatement); + } + return yieldsBefore + 1; + } + if (statement instanceof IfStatement ifStatement) { + return analyzeIfStatement(ifStatement, yieldsBefore); + } + if (statement instanceof TryStatement tryStatement) { + return analyzeTryStatement(tryStatement, yieldsBefore); + } + if (statement instanceof ForStatement forStatement) { + return analyzeLoopBody(forStatement.body(), forStatement.elseClause(), yieldsBefore); + } + if (statement instanceof WhileStatement whileStatement) { + return analyzeLoopBody(whileStatement.body(), whileStatement.elseClause(), yieldsBefore); + } + if (statement instanceof WithStatement withStatement) { + return analyzeStatements(withStatement.statements().statements(), yieldsBefore); + } + if (statement instanceof FunctionDef) { + return yieldsBefore; + } + return yieldsBefore; + } + + private int analyzeIfStatement(IfStatement ifStatement, int yieldsBefore) { + if (ifStatement.elseBranch() != null || !ifStatement.elifBranches().isEmpty()) { + return analyzeExclusiveBranches(ifStatement, yieldsBefore); + } + BranchResult ifBranch = analyzeBranch(ifStatement.body(), yieldsBefore); + return YieldPathAnalyzer.mergeBranchOutcomes(yieldsBefore, List.of(ifBranch)); + } + + private int analyzeExclusiveBranches(IfStatement ifStatement, int yieldsBefore) { + List branchResults = new ArrayList<>(); + branchResults.add(analyzeBranch(ifStatement.body(), yieldsBefore)); + for (IfStatement elifBranch : ifStatement.elifBranches()) { + branchResults.add(analyzeBranch(elifBranch.body(), yieldsBefore)); + } + ElseClause elseBranch = ifStatement.elseBranch(); + if (elseBranch != null) { + branchResults.add(analyzeBranch(elseBranch.body(), yieldsBefore)); + } + return YieldPathAnalyzer.mergeBranchOutcomes(yieldsBefore, branchResults); + } + + private static int mergeBranchOutcomes(int yieldsBefore, List branchResults) { + int maxAfter = yieldsBefore; + for (BranchResult branchResult : branchResults) { + if (branchResult.exits()) { + maxAfter = Math.max(maxAfter, yieldsBefore); + } else { + maxAfter = Math.max(maxAfter, branchResult.yieldsAfter()); + } + } + return maxAfter; + } + + private int analyzeTryStatement(TryStatement tryStatement, int yieldsBefore) { + List branchResults = new ArrayList<>(); + branchResults.add(analyzeBranch(tryStatement.body(), yieldsBefore)); + for (ExceptClause exceptClause : tryStatement.exceptClauses()) { + branchResults.add(analyzeBranch(exceptClause.body(), yieldsBefore)); + } + int maxAfter = YieldPathAnalyzer.mergeBranchOutcomes(yieldsBefore, branchResults); + ElseClause elseClause = tryStatement.elseClause(); + if (elseClause != null) { + maxAfter = analyzeStatements(elseClause.body().statements(), maxAfter); + } + FinallyClause finallyClause = tryStatement.finallyClause(); + if (finallyClause != null) { + maxAfter = analyzeStatements(finallyClause.body().statements(), maxAfter); + } + return maxAfter; + } + + private int analyzeLoopBody(StatementList body, @Nullable ElseClause elseClause, int yieldsBefore) { + int maxAfter = analyzeStatements(body.statements(), yieldsBefore); + if (elseClause != null) { + maxAfter = Math.max(maxAfter, analyzeStatements(elseClause.body().statements(), yieldsBefore)); + } + return maxAfter; + } + + private BranchResult analyzeBranch(StatementList body, int yieldsBefore) { + int yieldsAfter = analyzeStatements(body.statements(), yieldsBefore); + return new BranchResult(yieldsAfter, branchExits(body)); + } + + private static boolean branchExits(StatementList body) { + for (Statement statement : body.statements()) { + if (statement instanceof ReturnStatement || statement instanceof RaiseStatement) { + return true; + } + if (statement instanceof IfStatement ifStatement) { + if (branchExits(ifStatement.body()) || ifStatement.elifBranches().stream().anyMatch(elif -> branchExits(elif.body()))) { + return true; + } + ElseClause elseBranch = ifStatement.elseBranch(); + if (elseBranch != null && branchExits(elseBranch.body())) { + return true; + } + } + } + return false; + } + + private record BranchResult(int yieldsAfter, boolean exits) {} + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8994.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8994.html new file mode 100644 index 000000000..109f9cc45 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8994.html @@ -0,0 +1,37 @@ +

            This rule raises an issue when a @pytest.fixture function contains more than one yield statement.

            +

            Why is this an issue?

            +

            Pytest yield fixtures allow exactly one yield. A second yield triggers Failed: fixture function has more than one +'yield' at teardown, and cleanup after it never runs.

            +

            What is the potential impact?

            +

            Tests can satisfy their assertions yet still fail during teardown, producing confusing pass-then-fail diagnostics in CI until the fixture is +corrected.

            +

            How to fix it

            +

            Remove the extra yield statements and keep only one. If you need to return multiple values, yield a tuple or other collection. If +setup differs by condition, compute the value first and yield once on a single code path so teardown always runs afterward.

            +

            Use return instead of yield when the fixture does not need teardown logic.

            +

            Code examples

            +

            Noncompliant code example

            +
            +@pytest.fixture
            +def database_connection():
            +    db = create_connection()
            +    yield db  # Noncompliant
            +    # Pytest raises "fixture function has more than one 'yield'" at teardown
            +    yield db
            +    db.close()
            +
            +

            Compliant solution

            +
            +@pytest.fixture
            +def database_connection():
            +    db = create_connection()
            +    yield db
            +    db.close()
            +
            +

            Resources

            +

            Documentation

            + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8994.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8994.json new file mode 100644 index 000000000..757c8d292 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8994.json @@ -0,0 +1,27 @@ +{ + "title": "Pytest fixtures should contain at most one yield statement", + "type": "BUG", + "status": "beta", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5 min" + }, + "tags": [ + "tests", + "pitfall", + "resource-leak", + "pytest" + ], + "defaultSeverity": "Critical", + "ruleSpecification": "RSPEC-8994", + "sqKey": "S8994", + "scope": "Tests", + "quickfix": "unknown", + "code": { + "impacts": { + "RELIABILITY": "HIGH", + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "LOGICAL" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 1c5b918b4..b2d960174 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -376,6 +376,7 @@ "S8978", "S8992", "S8993", + "S8994", "S9001" ] } diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/PytestFixtureMultipleYieldCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/PytestFixtureMultipleYieldCheckTest.java new file mode 100644 index 000000000..6e42ab31a --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/PytestFixtureMultipleYieldCheckTest.java @@ -0,0 +1,41 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import org.junit.jupiter.api.Test; +import org.sonar.plugins.python.api.PythonCheck; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +import static org.assertj.core.api.Assertions.assertThat; + +class PytestFixtureMultipleYieldCheckTest { + + @Test + void scope() { + assertThat(new PytestFixtureMultipleYieldCheck().scope()).isEqualTo(PythonCheck.CheckScope.ALL); + } + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/pytestFixtureMultipleYield.py", new PytestFixtureMultipleYieldCheck()); + } + + @Test + void nonFixtureGeneratorsAreIgnored() { + PythonCheckVerifier.verifyNoIssue("src/test/resources/checks/tests/pytestFixtureMultipleYieldNonFixture.py", new PytestFixtureMultipleYieldCheck()); + } +} diff --git a/python-checks/src/test/resources/checks/tests/pytestFixtureMultipleYield.py b/python-checks/src/test/resources/checks/tests/pytestFixtureMultipleYield.py new file mode 100644 index 000000000..bd423fb73 --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/pytestFixtureMultipleYield.py @@ -0,0 +1,219 @@ +import pytest + + +@pytest.fixture +def database_connection(): + db = create_connection() + yield db + yield db # Noncompliant {{Pytest fixtures should contain at most one yield statement.}} +# ^^^^^^^^ + db.close() + + +@pytest.fixture +def single_yield_fixture(): + resource = acquire() + yield resource + release(resource) + + +@pytest.fixture +def return_only_fixture(): + return create_connection() + + +def generator_with_multiple_yields(): + yield 1 + yield 2 + + +@pytest.fixture() +def fixture_with_call_decorator(): + value = setup() + yield value + teardown(value) + + +@pytest.fixture +def fixture_with_nested_generator(): + def inner(): + yield 1 + yield 2 + + inner() + yield "ok" + + +@pytest.fixture +def triple_yield_fixture(): + yield 1 + yield 2 # Noncompliant {{Pytest fixtures should contain at most one yield statement.}} +# ^^^^^^^ + yield 3 # Noncompliant {{Pytest fixtures should contain at most one yield statement.}} +# ^^^^^^^ + + +import unittest + + +class MyTest(unittest.TestCase): + + @pytest.fixture + def class_fixture(self): + yield "setup" + yield "again" # Noncompliant {{Pytest fixtures should contain at most one yield statement.}} +# ^^^^^^^^^^^^^ + self.teardown() + + + +from pytest import fixture as pytest_fixture + + +@pytest_fixture +def imported_fixture_decorator(): + value = setup() + yield value + yield value # Noncompliant {{Pytest fixtures should contain at most one yield statement.}} +# ^^^^^^^^^^^ + teardown(value) + + +@pytest.fixture +def exclusive_branch_yields(condition): + if condition: + yield "a" + else: + yield "b" + + +@pytest.fixture +def yield_then_return_on_branch(terminal_reporter): + if terminal_reporter is None: + yield + return + yield "value" + + +@pytest.fixture +def sequential_after_non_exiting_if(condition): + if condition: + yield "a" + yield "b" # Noncompliant {{Pytest fixtures should contain at most one yield statement.}} +# ^^^^^^^^^ + + +@pytest.fixture +def try_except_exclusive_yields(): + try: + risky() + yield "try-path" + except ValueError: + yield "except-path" + + +@pytest.fixture +def try_body_with_two_yields(): + try: + yield 1 + yield 2 # Noncompliant {{Pytest fixtures should contain at most one yield statement.}} +# ^^^^^^^ + except ValueError: + pass + + +@pytest.fixture +def elif_chain_exclusive_yields(mode): + if mode == 1: + yield "first" + elif mode == 2: + yield "second" + else: + yield "third" + + +@pytest.fixture +def with_block_single_yield(): + with open("resource.txt") as resource: + yield resource + + +@pytest.fixture +def for_loop_single_yield(items): + for item in items: + yield item + + +@pytest.fixture +def nested_return_skips_following_yield(flag): + if flag: + return + yield "value" + + +@pytest.fixture +def while_loop_yield(): + while cond(): + yield next_item() + + +@pytest.fixture +def try_else_single_yield(): + try: + work() + except ValueError: + pass + else: + yield "done" + + +@pytest.fixture +def try_finally_double_yield(): + try: + yield "a" + finally: + yield "b" # Noncompliant {{Pytest fixtures should contain at most one yield statement.}} +# ^^^^^^^^^ + + +@pytest.fixture +def try_finally_single_yield(): + try: + work() + finally: + cleanup() + yield "done" + + +@pytest.fixture +def nested_function_yields_ignored(): + def inner(): + yield 1 + yield 2 + + yield "outer" + + +@pytest.fixture +def elif_branch_returns(mode): + if mode == 1: + pass + elif mode == 2: + return + yield "value" + + +@pytest.fixture +def raise_exits_branch(flag): + if flag: + raise ValueError("stop") + yield "ok" + + +@pytest.fixture +def for_with_else_yield(items): + for item in items: + if item: + return + else: + yield "done" diff --git a/python-checks/src/test/resources/checks/tests/pytestFixtureMultipleYieldNonFixture.py b/python-checks/src/test/resources/checks/tests/pytestFixtureMultipleYieldNonFixture.py new file mode 100644 index 000000000..d6fbb006c --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/pytestFixtureMultipleYieldNonFixture.py @@ -0,0 +1,3 @@ +def generator_with_multiple_yields(): + yield 1 + yield 2 From bca963628485e5f0aa4dad09b438e5df2aacf9ee Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Fri, 17 Jul 2026 14:37:58 +0200 Subject: [PATCH 225/322] SONARPY-4385 S8998 Detect empty @pytest.mark.parametrize values GitOrigin-RevId: 9761a11e1c3f9e0ad18605f6e1a919d40ac1cce1 --- .../python/checks/OpenSourceCheckList.java | 2 + .../tests/EmptyParametrizeValuesCheck.java | 222 ++++++++++++ .../org/sonar/l10n/py/rules/python/S8998.html | 61 ++++ .../org/sonar/l10n/py/rules/python/S8998.json | 26 ++ .../py/rules/python/Sonar_way_profile.json | 1 + .../EmptyParametrizeValuesCheckTest.java | 36 ++ .../checks/tests/emptyParametrizeValues.py | 342 ++++++++++++++++++ 7 files changed, 690 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/tests/EmptyParametrizeValuesCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8998.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8998.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/tests/EmptyParametrizeValuesCheckTest.java create mode 100644 python-checks/src/test/resources/checks/tests/emptyParametrizeValues.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 5ebd5dcb5..c32b2e81c 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -97,6 +97,7 @@ import org.sonar.python.checks.tests.AssertionArgumentOrderCheck; import org.sonar.python.checks.tests.DedicatedAssertionCheck; import org.sonar.python.checks.tests.DedicatedExceptionAssertionCheck; +import org.sonar.python.checks.tests.EmptyParametrizeValuesCheck; import org.sonar.python.checks.tests.FixtureParamDependenciesCheck; import org.sonar.python.checks.tests.GroupSimilarTestsParameterizedCheck; import org.sonar.python.checks.tests.IdenticalAssertionArgumentsCheck; @@ -199,6 +200,7 @@ public Stream> getChecks() { DebugModeCheck.class, DedicatedAssertionCheck.class, DedicatedExceptionAssertionCheck.class, + EmptyParametrizeValuesCheck.class, DefaultFactoryArgumentCheck.class, DeprecatedNumpyTypesCheck.class, DictKeysMembershipTestCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/EmptyParametrizeValuesCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/EmptyParametrizeValuesCheck.java new file mode 100644 index 000000000..371c9137d --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/EmptyParametrizeValuesCheck.java @@ -0,0 +1,222 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import java.util.HashSet; +import java.util.Set; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.symbols.v2.SymbolV2; +import org.sonar.plugins.python.api.symbols.v2.UsageV2; +import org.sonar.plugins.python.api.tree.Argument; +import org.sonar.plugins.python.api.tree.AssignmentStatement; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.Decorator; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.ExpressionList; +import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.NumericLiteral; +import org.sonar.plugins.python.api.tree.QualifiedExpression; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.tree.UnaryExpression; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.checks.utils.Expressions; +import org.sonar.python.tree.TreeUtils; + +@Rule(key = "S8998") +public class EmptyParametrizeValuesCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Add at least one case to the parametrize values."; + + private static final TypeMatcher PYTEST_PARAMETRIZE_MATCHER = TypeMatchers.isType("pytest.mark.parametrize"); + private static final TypeMatcher POPULATING_METHOD_MATCHER = TypeMatchers.any( + TypeMatchers.isType("list.append"), + TypeMatchers.isType("list.extend"), + TypeMatchers.isType("list.insert"), + TypeMatchers.isType("dict.update"), + TypeMatchers.isType("dict.setdefault"), + TypeMatchers.isType("set.add"), + TypeMatchers.isType("set.update"), + TypeMatchers.isType("typing.MutableMapping.update"), + TypeMatchers.isType("typing.MutableMapping.setdefault")); + private static final TypeMatcher EMPTY_NO_ARG_CONSTRUCTOR_MATCHER = TypeMatchers.any( + TypeMatchers.isType("list"), + TypeMatchers.isType("dict"), + TypeMatchers.isType("set"), + TypeMatchers.isType("tuple")); + private static final TypeMatcher RANGE_MATCHER = TypeMatchers.isType("range"); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.DECORATOR, EmptyParametrizeValuesCheck::checkDecorator); + } + + @Override + public CheckScope scope() { + return CheckScope.ALL; + } + + private static void checkDecorator(SubscriptionContext ctx) { + Decorator decorator = (Decorator) ctx.syntaxNode(); + Expression expression = decorator.expression(); + if (!expression.is(Tree.Kind.CALL_EXPR)) { + return; + } + + CallExpression callExpression = (CallExpression) expression; + if (!PYTEST_PARAMETRIZE_MATCHER.isTrueFor(callExpression.callee(), ctx)) { + return; + } + + RegularArgument valuesArgument = TreeUtils.nthArgumentOrKeyword(1, "argvalues", callExpression.arguments()); + if (valuesArgument == null) { + return; + } + + Expression valuesExpression = Expressions.removeParentheses(valuesArgument.expression()); + if (isEmptyParametrizeValues(valuesExpression, ctx) && !isCollectionPopulatedBeforeTest(valuesExpression, ctx)) { + ctx.addIssue(valuesExpression, MESSAGE); + } + } + + private static boolean isEmptyParametrizeValues(Expression valuesExpression, SubscriptionContext ctx) { + if (Expressions.isFalsy(valuesExpression) || isEmptyIterableConstructor(valuesExpression, ctx)) { + return true; + } + if (!(valuesExpression instanceof Name name)) { + return false; + } + Expression assigned = Expressions.singleAssignedValue(name); + return assigned != null && isEmptyIterableConstructor(Expressions.removeParentheses(assigned), ctx); + } + + private static boolean isEmptyIterableConstructor(Expression expression, SubscriptionContext ctx) { + if (!(expression instanceof CallExpression callExpression)) { + return false; + } + if (EMPTY_NO_ARG_CONSTRUCTOR_MATCHER.isTrueFor(callExpression.callee(), ctx) && callExpression.arguments().isEmpty()) { + return true; + } + return isEmptyRange(callExpression, ctx); + } + + private static boolean isEmptyRange(CallExpression callExpression, SubscriptionContext ctx) { + if (!RANGE_MATCHER.isTrueFor(callExpression.callee(), ctx) || callExpression.arguments().size() != 1) { + return false; + } + Argument argument = callExpression.arguments().get(0); + if (!(argument instanceof RegularArgument regularArgument)) { + return false; + } + Long bound = numericLiteralValue(Expressions.removeParentheses(regularArgument.expression())); + return bound != null && bound <= 0L; + } + + private static Long numericLiteralValue(Expression expression) { + if (expression instanceof NumericLiteral numericLiteral) { + try { + return numericLiteral.valueAsLong(); + } catch (NumberFormatException e) { + return null; + } + } + if (expression instanceof UnaryExpression unaryExpression && "-".equals(unaryExpression.operator().value())) { + Long positive = numericLiteralValue(Expressions.removeParentheses(unaryExpression.expression())); + return positive == null ? null : -positive; + } + return null; + } + + /** + * Collections that start empty but are filled before tests run are not empty at runtime, + * even when the mutation appears after the parametrize decorator in source order. + * Only mutations that execute at import / class-definition time are considered. + */ + private static boolean isCollectionPopulatedBeforeTest(Expression valuesExpression, SubscriptionContext ctx) { + if (!(valuesExpression instanceof Name name)) { + return false; + } + SymbolV2 symbol = name.symbolV2(); + if (symbol == null) { + return false; + } + for (SymbolV2 relatedSymbol : symbolsIncludingSimpleAliases(symbol)) { + for (UsageV2 usage : relatedSymbol.usages()) { + Tree usageTree = usage.tree(); + if (isExecutedBeforeCollection(usageTree) && isPopulatingMethodCallOnReceiver(usageTree, ctx)) { + return true; + } + } + } + return false; + } + + private static Set symbolsIncludingSimpleAliases(SymbolV2 symbol) { + Set symbols = new HashSet<>(); + symbols.add(symbol); + for (UsageV2 usage : symbol.usages()) { + symbols.addAll(collectSimpleAliasSymbols(usage.tree())); + } + return symbols; + } + + private static Set collectSimpleAliasSymbols(Tree usageTree) { + if (!(usageTree instanceof Name)) { + return Set.of(); + } + Tree assignmentTree = TreeUtils.firstAncestorOfKind(usageTree, Tree.Kind.ASSIGNMENT_STMT); + if (!(assignmentTree instanceof AssignmentStatement assignment)) { + return Set.of(); + } + if (Expressions.removeParentheses(assignment.assignedValue()) != usageTree) { + return Set.of(); + } + Set aliases = new HashSet<>(); + for (ExpressionList lhsList : assignment.lhsExpressions()) { + if (lhsList.expressions().size() != 1) { + continue; + } + Expression lhs = lhsList.expressions().get(0); + if (lhs instanceof Name lhsName && lhsName.symbolV2() != null) { + aliases.add(lhsName.symbolV2()); + } + } + return aliases; + } + + /** + * Pytest collects parametrize values at import time. Mutations nested inside functions + * (which are not executed during collection) must not suppress the issue. + */ + private static boolean isExecutedBeforeCollection(Tree tree) { + return TreeUtils.firstAncestorOfKind(tree, Tree.Kind.FUNCDEF) == null; + } + + private static boolean isPopulatingMethodCallOnReceiver(Tree usageTree, SubscriptionContext ctx) { + Tree parent = usageTree.parent(); + if (!(parent instanceof QualifiedExpression qualifiedExpression) || qualifiedExpression.qualifier() != usageTree) { + return false; + } + if (!(qualifiedExpression.parent() instanceof CallExpression callExpression)) { + return false; + } + return POPULATING_METHOD_MATCHER.isTrueFor(callExpression.callee(), ctx); + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8998.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8998.html new file mode 100644 index 000000000..af7d46dca --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8998.html @@ -0,0 +1,61 @@ +

            This rule raises an issue when a test parameterization mechanism is configured with an empty collection as the source of test values.

            +

            In Python with pytest, this specifically occurs when using the @pytest.mark.parametrize decorator with an empty sequence (list, tuple, +or other iterable) as the values argument.

            +

            Why is this an issue?

            +

            Passing an empty list to @pytest.mark.parametrize collects the test but skips it with got empty parameter set for (…​). +The suite still passes while providing no coverage for that function.

            +

            When @pytest.mark.parametrize has no value sets to iterate over, the test is silently skipped during collection:

            +
              +
            • Your test suite appears to pass, but this test isn’t actually running
            • +
            • You have no test coverage for the function being tested
            • +
            • Bugs in your code may go undetected
            • +
            +

            This situation typically occurs due to:

            +
              +
            • Accidentally deleting or commenting out all test cases
            • +
            • Incomplete test implementation (test structure created but cases not yet added)
            • +
            • Copy-paste errors when creating new tests
            • +
            • Refactoring mistakes where test cases were moved or removed
            • +
            +

            Unlike mistakes that cause failures, an empty parametrized test collection fails silently. The test won’t raise an error — it simply won’t run, +which makes the problem easy to miss until you discover missing coverage.

            +

            An empty parameter list is never a valid end state for a committed test. Suppressing this issue is not appropriate, as the test will not run until +values are provided.

            +

            What is the potential impact?

            +

            Regressions can go undetected when tests are skipped silently without failing the build.

            +

            How to fix it

            +

            Add at least one case tuple to the @pytest.mark.parametrize values list so the test body actually runs.

            +

            If the test is not ready yet, do not simply remove the decorator while keeping its parameters: pytest will treat those names as fixtures and fail +at setup with fixture '…​' not found. Instead, either add the missing cases, rewrite the test without parametrization (inline the values +in the function body), or mark the test explicitly with @pytest.mark.skip(reason="…​") on a parameterless function.

            +

            Code examples

            +

            Noncompliant code example

            +
            +import pytest
            +
            +@pytest.mark.parametrize('operand,expected', [])
            +def test_double(operand, expected):
            +    assert double(operand) == expected  # Noncompliant
            +
            +

            Compliant solution

            +
            +import pytest
            +
            +@pytest.mark.parametrize('operand,expected', [
            +    (1, 2),
            +    (2, 4),
            +    (3, 6),
            +    (0, 0),
            +])
            +def test_double(operand, expected):
            +    assert double(operand) == expected
            +
            +

            Resources

            +

            Documentation

            + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8998.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8998.json new file mode 100644 index 000000000..eeaa4fd47 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8998.json @@ -0,0 +1,26 @@ +{ + "title": "Parametrize decorators should not have empty parameter lists", + "type": "BUG", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5 min" + }, + "tags": [ + "pytest", + "tests", + "pitfall" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-8998", + "sqKey": "S8998", + "scope": "Tests", + "quickfix": "unknown", + "code": { + "impacts": { + "RELIABILITY": "MEDIUM", + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "LOGICAL" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index b2d960174..4ee5a56d8 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -377,6 +377,7 @@ "S8992", "S8993", "S8994", + "S8998", "S9001" ] } diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/EmptyParametrizeValuesCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/EmptyParametrizeValuesCheckTest.java new file mode 100644 index 000000000..67b1da564 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/EmptyParametrizeValuesCheckTest.java @@ -0,0 +1,36 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import org.junit.jupiter.api.Test; +import org.sonar.plugins.python.api.PythonCheck; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +import static org.assertj.core.api.Assertions.assertThat; + +class EmptyParametrizeValuesCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/emptyParametrizeValues.py", new EmptyParametrizeValuesCheck()); + } + + @Test + void test_scope() { + assertThat(new EmptyParametrizeValuesCheck().scope()).isEqualTo(PythonCheck.CheckScope.ALL); + } +} diff --git a/python-checks/src/test/resources/checks/tests/emptyParametrizeValues.py b/python-checks/src/test/resources/checks/tests/emptyParametrizeValues.py new file mode 100644 index 000000000..6c9cc1c4b --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/emptyParametrizeValues.py @@ -0,0 +1,342 @@ +import pytest + + +def double(operand): + return operand * 2 + + +@pytest.mark.parametrize('operand,expected', []) # Noncompliant {{Add at least one case to the parametrize values.}} +# ^^ +def test_double_empty_list(operand, expected): + assert double(operand) == expected + + +@pytest.mark.parametrize('operand,expected', ()) # Noncompliant {{Add at least one case to the parametrize values.}} +# ^^ +def test_double_empty_tuple(operand, expected): + assert double(operand) == expected + + +@pytest.mark.parametrize('operand,expected', [ + (1, 2), + (2, 4), +]) +def test_double_populated_list(operand, expected): + assert double(operand) == expected + + +@pytest.mark.parametrize('operand,expected', ( + (1, 2), + (2, 4), +)) +def test_double_non_empty_tuple(operand, expected): + assert double(operand) == expected + + +empty_cases = [] + + +@pytest.mark.parametrize('operand', empty_cases) # Noncompliant {{Add at least one case to the parametrize values.}} +# ^^^^^^^^^^^ +def test_empty_list_variable_never_appended(operand): + assert double(operand) == operand * 2 + + +populated_before = [] +populated_before.append(1) +populated_before.append(2) + + +@pytest.mark.parametrize('operand', populated_before) +def test_list_populated_via_append_before(operand): + assert double(operand) == operand * 2 + + +populated_after = [] + + +@pytest.mark.parametrize('operand', populated_after) +def test_list_populated_via_append_after(operand): + assert double(operand) == operand * 2 + + +populated_after.append(1) + + +populated_via_extend = [] +populated_via_extend.extend([(1, 2)]) + + +@pytest.mark.parametrize('case', populated_via_extend) +def test_list_populated_via_extend(case): + assert double(case[0]) == case[1] + + +populated_via_iadd = [] +populated_via_iadd += [(1, 2)] + + +@pytest.mark.parametrize('case', populated_via_iadd) +def test_list_populated_via_iadd(case): + assert double(case[0]) == case[1] + + +populated_via_insert = [] +populated_via_insert.insert(0, (1, 2)) + + +@pytest.mark.parametrize('case', populated_via_insert) +def test_list_populated_via_insert(case): + assert double(case[0]) == case[1] + + +wrong_method = [] +wrong_method.count(0) + + +@pytest.mark.parametrize('operand', wrong_method) # Noncompliant {{Add at least one case to the parametrize values.}} +# ^^^^^^^^^^^^ +def test_list_with_non_populating_method_call(operand): + assert operand is None + + +dict_cases = {} +dict_cases.update({'a': 1}) + + +@pytest.mark.parametrize('case', dict_cases) +def test_dict_populated_via_update(case): + assert case == 'a' + + +setdefault_cases = {} +setdefault_cases.setdefault('a', 1) + + +@pytest.mark.parametrize('case', setdefault_cases) +def test_dict_populated_via_setdefault(case): + assert case == 'a' + + +merged_dict_cases = {} +merged_dict_cases |= {'a': 1} + + +@pytest.mark.parametrize('case', merged_dict_cases) +def test_dict_populated_via_ior(case): + assert case == 'a' + + +class TestOffsets: + offset_cases = [] + offset_cases.append( + (1, 2), + ) + offset_cases.append( + (2, 4), + ) + + @pytest.mark.parametrize("case", offset_cases) + def test_offset(self, case): + operand, expected = case + assert double(operand) == expected + + +class TestClassCases: + class_cases = [] + class_cases.append(1) + + @pytest.mark.parametrize('case', class_cases) + def test_class_cases(self, case): + assert case == 1 + + +def plain_decorator(func): + return func + + +@plain_decorator +def test_non_call_decorator(): + assert True + + +@pytest.mark.skip() +def test_unrelated_call_decorator(): + assert True + + +@pytest.mark.parametrize('operand') +def test_parametrize_without_values(operand): + assert operand is not None + + +@pytest.mark.parametrize('operand', argvalues=unresolved_var) +def test_parametrize_unresolved_values(operand): + assert operand is not None + + +@pytest.mark.parametrize('operand', argvalues=[]) # Noncompliant {{Add at least one case to the parametrize values.}} +# ^^ +def test_empty_list_keyword(operand): + assert double(operand) == operand * 2 + + +@pytest.mark.parametrize('operand', argvalues=()) # Noncompliant {{Add at least one case to the parametrize values.}} +# ^^ +def test_empty_tuple_keyword(operand): + assert double(operand) == operand * 2 + + +@pytest.mark.parametrize('operand', ([])) # Noncompliant {{Add at least one case to the parametrize values.}} +# ^^ +def test_empty_list_parenthesized(operand): + assert double(operand) == operand * 2 + + +not_a_list = None + + +@pytest.mark.parametrize('operand', not_a_list) # Noncompliant {{Add at least one case to the parametrize values.}} +# ^^^^^^^^^^ +def test_none_variable(operand): + assert operand is None + + +aliased = [] +other = aliased +other.append(1) + + +@pytest.mark.parametrize('operand', aliased) +def test_append_via_different_name(operand): + assert operand == 1 + + +split_alias_cases = [] +left, right = split_alias_cases + + +@pytest.mark.parametrize('operand', split_alias_cases) # Noncompliant {{Add at least one case to the parametrize values.}} +# ^^^^^^^^^^^^^^^^^ +def test_unpacking_assignment_is_not_simple_alias(operand): + assert operand is None + + +attr_alias_cases = [] +holder = type('Holder', (), {})() +holder.cases = attr_alias_cases + + +@pytest.mark.parametrize('operand', attr_alias_cases) # Noncompliant {{Add at least one case to the parametrize values.}} +# ^^^^^^^^^^^^^^^^ +def test_assignment_to_attribute_is_not_alias_population(operand): + assert operand is None + + +nested_population = [] + + +def populate_nested_population(): + nested_population.append(1) + + +@pytest.mark.parametrize('operand', nested_population) # Noncompliant {{Add at least one case to the parametrize values.}} +# ^^^^^^^^^^^^^^^^^ +def test_append_only_inside_never_called_function(operand): + assert operand == 1 + + +@pytest.mark.parametrize('operand', set()) # Noncompliant {{Add at least one case to the parametrize values.}} +# ^^^^^ +def test_empty_set_constructor(operand): + assert operand is None + + +@pytest.mark.parametrize('operand', range(0)) # Noncompliant {{Add at least one case to the parametrize values.}} +# ^^^^^^^^ +def test_empty_range_constructor(operand): + assert operand is None + + +@pytest.mark.parametrize('operand', range(-1)) # Noncompliant {{Add at least one case to the parametrize values.}} +# ^^^^^^^^^ +def test_empty_negative_range_constructor(operand): + assert operand is None + + +@pytest.mark.parametrize('operand', range(1, 1)) +def test_two_arg_empty_range_not_detected(operand): + assert operand is None + + +@pytest.mark.parametrize('operand', range(0.5)) +def test_float_range_argument_not_detected(operand): + assert operand is None + + +n = 0 + + +@pytest.mark.parametrize('operand', range(n)) +def test_range_with_non_literal_argument(operand): + assert operand is None + + +range_args = (0,) + + +@pytest.mark.parametrize('operand', range(*range_args)) +def test_range_with_unpacked_argument(operand): + assert operand is None + + +@pytest.mark.parametrize('operand', list()) # Noncompliant {{Add at least one case to the parametrize values.}} +# ^^^^^^ +def test_empty_list_constructor(operand): + assert double(operand) == operand * 2 + + +@pytest.mark.parametrize('operand', dict()) # Noncompliant {{Add at least one case to the parametrize values.}} +# ^^^^^^ +def test_empty_dict_constructor(operand): + assert operand is None + + +@pytest.mark.parametrize('operand', tuple()) # Noncompliant {{Add at least one case to the parametrize values.}} +# ^^^^^^^ +def test_empty_tuple_constructor(operand): + assert operand is None + + +empty_set_var = set() + + +@pytest.mark.parametrize('operand', empty_set_var) # Noncompliant {{Add at least one case to the parametrize values.}} +# ^^^^^^^^^^^^^ +def test_empty_set_variable(operand): + assert operand is None + + +populated_set = set() +populated_set.add(1) + + +@pytest.mark.parametrize('operand', populated_set) +def test_set_populated_via_add(operand): + assert operand == 1 + + +@pytest.mark.parametrize('operand', []) # Noncompliant {{Add at least one case to the parametrize values.}} +# ^^ +def test_empty_literal_despite_unrelated_append(operand): + assert operand is None + + +cases_with_attr_access = [] +_ = cases_with_attr_access.append +cases_with_attr_access.append(1) + + +@pytest.mark.parametrize('operand', cases_with_attr_access) +def test_append_call_and_attribute_ref(operand): + assert operand == 1 From 84404d1ea446ba0569d4af2362961ed4905699e0 Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Fri, 17 Jul 2026 15:02:59 +0200 Subject: [PATCH 226/322] SONARPY-4384 S8999 pytest_plugins should be defined in conftest.py files GitOrigin-RevId: f10005f242063589f7080b464a9d386ba24cb09c --- .../python/checks/OpenSourceCheckList.java | 2 + .../tests/PytestPluginsConftestCheck.java | 85 +++++++++++++++++++ .../org/sonar/l10n/py/rules/python/S8999.html | 43 ++++++++++ .../org/sonar/l10n/py/rules/python/S8999.json | 13 +++ .../py/rules/python/Sonar_way_profile.json | 1 + .../tests/PytestPluginsConftestCheckTest.java | 59 +++++++++++++ .../checks/pytestPluginsNonTestModule.py | 2 + .../conftestLikeFilenames/conftest_utils.py | 1 + .../checks/tests/conftestPlugins/conftest.py | 1 + .../checks/tests/package/__init__.py | 1 + .../tests/test_pytestPluginsConftest.py | 14 +++ 11 files changed, 222 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/tests/PytestPluginsConftestCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8999.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8999.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/tests/PytestPluginsConftestCheckTest.java create mode 100644 python-checks/src/test/resources/checks/pytestPluginsNonTestModule.py create mode 100644 python-checks/src/test/resources/checks/tests/conftestLikeFilenames/conftest_utils.py create mode 100644 python-checks/src/test/resources/checks/tests/conftestPlugins/conftest.py create mode 100644 python-checks/src/test/resources/checks/tests/package/__init__.py create mode 100644 python-checks/src/test/resources/checks/tests/test_pytestPluginsConftest.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index c32b2e81c..ae4545ed6 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -105,6 +105,7 @@ import org.sonar.python.checks.tests.NotDiscoverableTestMethodCheck; import org.sonar.python.checks.tests.PytestAutouseParametrizedFixtureCheck; import org.sonar.python.checks.tests.PytestFixtureMultipleYieldCheck; +import org.sonar.python.checks.tests.PytestPluginsConftestCheck; import org.sonar.python.checks.tests.SingleInvocationRuntimeExceptionCheck; import org.sonar.python.checks.tests.SkippedTestNoReasonCheck; import org.sonar.python.checks.tests.SpecificExceptionAssertionCheck; @@ -401,6 +402,7 @@ public Stream> getChecks() { PydanticSkipValidationWithConstraintsCheck.class, PytestAutouseParametrizedFixtureCheck.class, PytestFixtureMultipleYieldCheck.class, + PytestPluginsConftestCheck.class, PyTorchDataLoaderNumWorkersCheck.class, PytzTimeZoneInDatetimeConstructorCheck.class, RaiseOutsideExceptCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/PytestPluginsConftestCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/PytestPluginsConftestCheck.java new file mode 100644 index 000000000..11bbdc87f --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/PytestPluginsConftestCheck.java @@ -0,0 +1,85 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import java.util.List; +import java.util.Optional; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.AnnotatedAssignment; +import org.sonar.plugins.python.api.tree.AssignmentStatement; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.ExpressionList; +import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.python.tree.TreeUtils; + +@Rule(key = "S8999") +public class PytestPluginsConftestCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "\"pytest_plugins\" should be defined in conftest.py files"; + private static final String PYTEST_PLUGINS = "pytest_plugins"; + private static final String CONFTEST_FILE_NAME = "conftest.py"; + + @Override + public CheckScope scope() { + return CheckScope.TESTS; + } + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.ASSIGNMENT_STMT, PytestPluginsConftestCheck::onAssignment); + context.registerSyntaxNodeConsumer(Tree.Kind.ANNOTATED_ASSIGNMENT, PytestPluginsConftestCheck::onAssignment); + } + + private static void onAssignment(SubscriptionContext ctx) { + checkPytestPluginsAssignment(ctx, ctx.syntaxNode()); + } + + private static void checkPytestPluginsAssignment(SubscriptionContext ctx, Tree assignment) { + if (CONFTEST_FILE_NAME.equals(ctx.pythonFile().fileName()) || !isModuleLevel(assignment)) { + return; + } + getPytestPluginsTarget(assignment).ifPresent(target -> ctx.addIssue(target, MESSAGE)); + } + + private static boolean isModuleLevel(Tree assignment) { + return TreeUtils.firstAncestorOfKind(assignment, Tree.Kind.FUNCDEF, Tree.Kind.CLASSDEF) == null; + } + + private static Optional getPytestPluginsTarget(Tree assignment) { + if (assignment instanceof AssignmentStatement assignmentStatement) { + return assignmentStatement.lhsExpressions().stream() + .map(ExpressionList::expressions) + .flatMap(List::stream) + .filter(PytestPluginsConftestCheck::isPytestPluginsName) + .findFirst(); + } + if (assignment instanceof AnnotatedAssignment annotatedAssignment) { + Expression lhs = annotatedAssignment.variable(); + if (isPytestPluginsName(lhs) && annotatedAssignment.assignedValue() != null) { + return Optional.of(lhs); + } + } + return Optional.empty(); + } + + private static boolean isPytestPluginsName(Expression expression) { + return expression.is(Tree.Kind.NAME) && PYTEST_PLUGINS.equals(((Name) expression).name()); + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8999.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8999.html new file mode 100644 index 000000000..3ca69ecfc --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8999.html @@ -0,0 +1,43 @@ +

            This rule raises an issue when the plugin configuration variable is defined in a regular test file (any file other than the designated +configuration file).

            +

            Why is this an issue?

            +

            pytest_plugins in conftest.py loads before test collection, so plugins are available for early hooks such as +pytest_addoption. In test modules, plugins load only when that module is imported during collection, which can change behavior under +parallel CI.

            +

            Pytest deduplicates plugins by name, so declaring the same plugin in multiple test modules does not load it twice. The risk is late registration +and collection-order dependence, not duplicate initialization.

            +

            This rule flags any pytest_plugins assignment outside conftest.py.

            +

            What is the potential impact?

            +

            Misplaced plugin declarations make load order depend on collection sequence, so the same suite can pass locally and fail under parallel or sharded +CI.

            +

            How to fix it

            +

            Move pytest_plugins from test modules to conftest.py in the same directory or a parent directory.

            +

            Code examples

            +

            Noncompliant code example

            +
            +# test_something.py
            +pytest_plugins = ['pytest_cov', 'pytest_timeout']  # Noncompliant
            +
            +def test_feature():
            +    assert True
            +
            +

            Compliant solution

            +
            +# conftest.py
            +pytest_plugins = ['pytest_cov', 'pytest_timeout']
            +
            +# test_something.py
            +def test_feature():
            +    assert True
            +
            +

            Resources

            +

            Documentation

            + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8999.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8999.json new file mode 100644 index 000000000..9695761cc --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8999.json @@ -0,0 +1,13 @@ +{ + "title": "\"pytest_plugins\" should be defined in conftest.py files", + "type": "CODE_SMELL", + "status": "ready", + "remediation": {"func": "Constant/Issue", "constantCost": "5 min"}, + "tags": ["test", "confusing", "pitfall", "pytest"], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-8999", + "sqKey": "S8999", + "scope": "Tests", + "quickfix": "unknown", + "code": {"impacts": {"RELIABILITY": "MEDIUM", "MAINTAINABILITY": "MEDIUM"}, "attribute": "LOGICAL"} +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 4ee5a56d8..26b704b9a 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -378,6 +378,7 @@ "S8993", "S8994", "S8998", + "S8999", "S9001" ] } diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/PytestPluginsConftestCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/PytestPluginsConftestCheckTest.java new file mode 100644 index 000000000..30b55474b --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/PytestPluginsConftestCheckTest.java @@ -0,0 +1,59 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; +import org.sonar.plugins.python.api.PythonCheck; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +import static org.assertj.core.api.Assertions.assertThat; + +class PytestPluginsConftestCheckTest { + + private static final PytestPluginsConftestCheck CHECK = new PytestPluginsConftestCheck(); + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/test_pytestPluginsConftest.py", CHECK); + } + + @ParameterizedTest + @ValueSource(strings = { + "src/test/resources/checks/tests/conftestPlugins/conftest.py", + "src/test/resources/checks/pytestPluginsNonTestModule.py" + }) + void compliant_files(String path) { + PythonCheckVerifier.verifyNoIssue(path, CHECK); + } + + @Test + void init_py_in_test_package() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/package/__init__.py", CHECK); + } + + @Test + void conftest_like_filename_is_not_compliant() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/conftestLikeFilenames/conftest_utils.py", CHECK); + } + + @Test + void scope() { + assertThat(CHECK.scope()).isEqualTo(PythonCheck.CheckScope.TESTS); + } +} diff --git a/python-checks/src/test/resources/checks/pytestPluginsNonTestModule.py b/python-checks/src/test/resources/checks/pytestPluginsNonTestModule.py new file mode 100644 index 000000000..c96144203 --- /dev/null +++ b/python-checks/src/test/resources/checks/pytestPluginsNonTestModule.py @@ -0,0 +1,2 @@ +def helper(): + return 42 diff --git a/python-checks/src/test/resources/checks/tests/conftestLikeFilenames/conftest_utils.py b/python-checks/src/test/resources/checks/tests/conftestLikeFilenames/conftest_utils.py new file mode 100644 index 000000000..5488f730f --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/conftestLikeFilenames/conftest_utils.py @@ -0,0 +1 @@ +pytest_plugins = ["pytest_cov"] # Noncompliant {{"pytest_plugins" should be defined in conftest.py files}} diff --git a/python-checks/src/test/resources/checks/tests/conftestPlugins/conftest.py b/python-checks/src/test/resources/checks/tests/conftestPlugins/conftest.py new file mode 100644 index 000000000..8daba5654 --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/conftestPlugins/conftest.py @@ -0,0 +1 @@ +pytest_plugins = ["pytest_cov", "pytest_timeout"] diff --git a/python-checks/src/test/resources/checks/tests/package/__init__.py b/python-checks/src/test/resources/checks/tests/package/__init__.py new file mode 100644 index 000000000..5488f730f --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/package/__init__.py @@ -0,0 +1 @@ +pytest_plugins = ["pytest_cov"] # Noncompliant {{"pytest_plugins" should be defined in conftest.py files}} diff --git a/python-checks/src/test/resources/checks/tests/test_pytestPluginsConftest.py b/python-checks/src/test/resources/checks/tests/test_pytestPluginsConftest.py new file mode 100644 index 000000000..b02ccfc01 --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/test_pytestPluginsConftest.py @@ -0,0 +1,14 @@ +pytest_plugins = ["pytest_cov", "pytest_timeout"] # Noncompliant {{"pytest_plugins" should be defined in conftest.py files}} +pytest_plugins: list[str] = ["pytest_cov"] # Noncompliant {{"pytest_plugins" should be defined in conftest.py files}} +pytest_plugins: list[str] + +other_plugins = ["pytest_cov"] + +def test_feature(): + assert other_plugins[0] == "pytest_cov" + +def nested(): + pytest_plugins = ["pytest_cov"] + +class TestClass: + pytest_plugins = ["pytest_cov"] From 9ba2b7b209f20ba34cca670e6d082a1913e464bc Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Fri, 17 Jul 2026 15:21:13 +0200 Subject: [PATCH 227/322] SONARPY-4380 Implement rule S8997 - Tests should use the monkeypatch fixture for temporary modifications GitOrigin-RevId: af58fb6b255a330e0e50ad2d4dc183fe93277fc7 --- .../python/checks/OpenSourceCheckList.java | 2 + .../tests/UseMonkeypatchFixtureCheck.java | 219 +++++++++++++++++ .../org/sonar/l10n/py/rules/python/S8997.html | 91 +++++++ .../org/sonar/l10n/py/rules/python/S8997.json | 24 ++ .../py/rules/python/Sonar_way_profile.json | 1 + .../tests/UseMonkeypatchFixtureCheckTest.java | 56 +++++ .../tests/test_useMonkeypatchFixture.py | 222 ++++++++++++++++++ .../test_useMonkeypatchFixture_lifecycle.py | 42 ++++ .../checks/tests/useMonkeypatchFixture.py | 7 + .../tests/useMonkeypatchFixture_test.py | 5 + 10 files changed, 669 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/tests/UseMonkeypatchFixtureCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8997.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8997.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/tests/UseMonkeypatchFixtureCheckTest.java create mode 100644 python-checks/src/test/resources/checks/tests/test_useMonkeypatchFixture.py create mode 100644 python-checks/src/test/resources/checks/tests/test_useMonkeypatchFixture_lifecycle.py create mode 100644 python-checks/src/test/resources/checks/tests/useMonkeypatchFixture.py create mode 100644 python-checks/src/test/resources/checks/tests/useMonkeypatchFixture_test.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index ae4545ed6..884094f80 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -111,6 +111,7 @@ import org.sonar.python.checks.tests.SpecificExceptionAssertionCheck; import org.sonar.python.checks.tests.TestCasesShouldContainTestsCheck; import org.sonar.python.checks.tests.UnconditionalAssertionCheck; +import org.sonar.python.checks.tests.UseMonkeypatchFixtureCheck; import org.sonar.python.checks.tests.XfailNoReasonCheck; public class OpenSourceCheckList { @@ -497,6 +498,7 @@ public Stream> getChecks() { RegexLookaheadCheck.class, RewriteCollectionConstructorAsComprehensionCheck.class, UnconditionalAssertionCheck.class, + UseMonkeypatchFixtureCheck.class, UndefinedNameAllPropertyCheck.class, UnencryptedSageMakerNotebookCheck.class, UnencryptedSqsQueueCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/UseMonkeypatchFixtureCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/UseMonkeypatchFixtureCheck.java new file mode 100644 index 000000000..f06fdd71b --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/UseMonkeypatchFixtureCheck.java @@ -0,0 +1,219 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import java.util.Set; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.symbols.v2.SymbolV2; +import org.sonar.plugins.python.api.symbols.v2.UsageV2; +import org.sonar.plugins.python.api.tree.AssignmentStatement; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.Decorator; +import org.sonar.plugins.python.api.tree.DelStatement; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.ExpressionList; +import org.sonar.plugins.python.api.tree.FunctionDef; +import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.QualifiedExpression; +import org.sonar.plugins.python.api.tree.SubscriptionExpression; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.checks.utils.CheckUtils; +import org.sonar.python.checks.utils.Expressions; +import org.sonar.python.checks.utils.UnittestUtils; +import org.sonar.python.tree.TreeUtils; + +@Rule(key = "S8997") +public class UseMonkeypatchFixtureCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Use the \"monkeypatch\" fixture for temporary modifications instead of manually modifying global state."; + private static final TypeMatcher ENVIRON_MATCHER = TypeMatchers.isType("os.environ"); + private static final TypeMatcher PYTEST_FIXTURE_MATCHER = TypeMatchers.withFQN("pytest.fixture"); + private static final TypeMatcher SYS_PATH_LIST_MUTATION_CALL = + TypeMatchers.isFunctionOwnerSatisfying(TypeMatchers.isOrExtendsType("builtins.list")); + private static final Set PYTEST_LIFECYCLE_METHODS = Set.of( + "setUp", "tearDown", "setUpClass", "tearDownClass", + "setup_method", "teardown_method", "setup_class", "teardown_class", + "setup_module", "teardown_module"); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.ASSIGNMENT_STMT, UseMonkeypatchFixtureCheck::checkAssignment); + context.registerSyntaxNodeConsumer(Tree.Kind.DEL_STMT, UseMonkeypatchFixtureCheck::checkDelete); + context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, UseMonkeypatchFixtureCheck::checkCall); + } + + @Override + public CheckScope scope() { + return CheckScope.ALL; + } + + private static void checkAssignment(SubscriptionContext ctx) { + FunctionDef testFunction = enclosingPytestTestFunction(ctx, ctx.syntaxNode()); + if (testFunction == null) { + return; + } + + AssignmentStatement assignmentStatement = (AssignmentStatement) ctx.syntaxNode(); + for (ExpressionList lhsExpressionList : assignmentStatement.lhsExpressions()) { + for (Expression lhsExpression : lhsExpressionList.expressions()) { + checkManualModification(ctx, Expressions.removeParentheses(lhsExpression), testFunction); + } + } + } + + private static void checkDelete(SubscriptionContext ctx) { + FunctionDef testFunction = enclosingPytestTestFunction(ctx, ctx.syntaxNode()); + if (testFunction == null) { + return; + } + + DelStatement delStatement = (DelStatement) ctx.syntaxNode(); + for (Expression expression : delStatement.expressions()) { + checkManualModification(ctx, Expressions.removeParentheses(expression), testFunction); + } + } + + private static void checkCall(SubscriptionContext ctx) { + FunctionDef testFunction = enclosingPytestTestFunction(ctx, ctx.syntaxNode()); + if (testFunction == null) { + return; + } + + CallExpression callExpression = (CallExpression) ctx.syntaxNode(); + if (!(callExpression.callee() instanceof QualifiedExpression methodCall)) { + return; + } + Expression receiver = Expressions.removeParentheses(methodCall.qualifier()); + if (!isSysPath(receiver, ctx) || !SYS_PATH_LIST_MUTATION_CALL.isTrueFor(callExpression.callee(), ctx)) { + return; + } + ctx.addIssue(callExpression, MESSAGE); + } + + private static void checkManualModification(SubscriptionContext ctx, Expression expression, FunctionDef testFunction) { + if (isOsEnvironSubscription(expression, ctx) + || isSysPathSubscription(expression, ctx) + || isManualModuleLevelAttributeAssignment(expression, testFunction)) { + ctx.addIssue(expression, MESSAGE); + } + } + + private static boolean isOsEnvironSubscription(Expression expression, SubscriptionContext ctx) { + return expression instanceof SubscriptionExpression subscriptionExpression + && ENVIRON_MATCHER.isTrueFor(subscriptionExpression.object(), ctx); + } + + private static boolean isSysPathSubscription(Expression expression, SubscriptionContext ctx) { + return expression instanceof SubscriptionExpression subscriptionExpression + && isSysPath(subscriptionExpression.object(), ctx); + } + + private static boolean isSysPath(Expression expression, SubscriptionContext ctx) { + return TreeUtils.fullyQualifiedNameFromExpression(expression) + .filter("sys.path"::equals) + .isPresent() + || (expression instanceof QualifiedExpression qualifiedExpression + && TypeMatchers.isType("sys").isTrueFor(qualifiedExpression.qualifier(), ctx) + && "path".equals(qualifiedExpression.name().name())); + } + + private static boolean isManualModuleLevelAttributeAssignment(Expression expression, FunctionDef testFunction) { + if (!(expression instanceof QualifiedExpression qualifiedExpression) + || CheckUtils.isSelf(qualifiedExpression.qualifier())) { + return false; + } + Expression base = leftmostExpression(expression); + if (base instanceof CallExpression) { + // Mutating attributes of a call result (mocks, helpers, factories) is not global state. + return false; + } + return !isLocallyBoundInTestFunction(base, testFunction); + } + + private static Expression leftmostExpression(Expression expression) { + Expression current = Expressions.removeParentheses(expression); + while (true) { + if (current instanceof QualifiedExpression qualifiedExpression) { + current = Expressions.removeParentheses(qualifiedExpression.qualifier()); + } else if (current instanceof SubscriptionExpression subscriptionExpression) { + current = Expressions.removeParentheses(subscriptionExpression.object()); + } else { + return current; + } + } + } + + private static boolean isLocallyBoundInTestFunction(Expression expression, FunctionDef testFunction) { + if (!(expression instanceof Name name)) { + return false; + } + SymbolV2 symbol = name.symbolV2(); + if (symbol == null) { + return false; + } + for (UsageV2 usage : symbol.usages()) { + if (!usage.isBindingUsage() || !isContainedIn(usage.tree(), testFunction)) { + continue; + } + return true; + } + return false; + } + + private static boolean isContainedIn(Tree tree, Tree ancestor) { + for (Tree current = tree; current != null; current = current.parent()) { + if (current == ancestor) { + return true; + } + } + return false; + } + + private static FunctionDef enclosingPytestTestFunction(SubscriptionContext ctx, Tree tree) { + FunctionDef functionDef = (FunctionDef) TreeUtils.firstAncestorOfKind(tree, Tree.Kind.FUNCDEF); + if (functionDef == null) { + return null; + } + if (isPytestFixture(functionDef, ctx) || isPytestLifecycleMethod(functionDef)) { + return null; + } + if (!UnittestUtils.isPytestStyleTestFunction(functionDef, ctx.pythonFile().fileName())) { + return null; + } + return functionDef; + } + + private static boolean isPytestFixture(FunctionDef functionDef, SubscriptionContext ctx) { + return functionDef.decorators().stream().anyMatch(decorator -> matchesPytestFixtureDecorator(decorator, ctx)); + } + + private static boolean matchesPytestFixtureDecorator(Decorator decorator, SubscriptionContext ctx) { + Expression expression = decorator.expression(); + if (expression instanceof CallExpression callExpression) { + return PYTEST_FIXTURE_MATCHER.isTrueFor(callExpression.callee(), ctx); + } + return PYTEST_FIXTURE_MATCHER.isTrueFor(expression, ctx); + } + + private static boolean isPytestLifecycleMethod(FunctionDef functionDef) { + return PYTEST_LIFECYCLE_METHODS.contains(functionDef.name().name()); + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8997.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8997.html new file mode 100644 index 000000000..51fea37d9 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8997.html @@ -0,0 +1,91 @@ +

            This rule raises an issue when test functions manually modify global state such as environment variables, object attributes, or module search paths +without using test isolation fixtures or mocking utilities provided by the test framework.

            +

            In Python/pytest, this specifically refers to using the monkeypatch fixture instead of directly modifying sys.path or +other global state.

            +

            Why is this an issue?

            +

            Manual save/restore of environment variables, attributes, or callables is easy to forget and often skipped on exceptions. The +monkeypatch fixture undoes all changes automatically when the test completes.

            +

            What is the potential impact?

            +

            State pollution from missed cleanup propagates across the suite, so failures show up in unrelated tests and erode trust in green CI runs.

            +

            How to fix it

            +

            Use monkeypatch.setenv, monkeypatch.setattr, monkeypatch.setitem, monkeypatch.syspath_prepend, +or monkeypatch.chdir instead of manual save/restore logic.

            +

            Code examples

            +

            Noncompliant code example

            +
            +import os
            +
            +def test_api_key():
            +    old_key = os.environ.get('API_KEY')
            +    os.environ['API_KEY'] = 'test_key'  # Noncompliant
            +
            +    result = get_api_configuration()
            +    assert result['key'] == 'test_key'
            +
            +    # Cleanup easily forgotten or skipped on exception
            +    if old_key:
            +        os.environ['API_KEY'] = old_key
            +    else:
            +        del os.environ['API_KEY']
            +
            +

            Compliant solution

            +
            +def test_api_key(monkeypatch):
            +    monkeypatch.setenv('API_KEY', 'test_key')
            +
            +    result = get_api_configuration()
            +    assert result['key'] == 'test_key'
            +
            +    # Automatic cleanup - no manual code needed
            +
            +

            Noncompliant code example

            +
            +import myapp.config
            +
            +def test_feature_flag():
            +    old_value = myapp.config.ENABLE_FEATURE
            +    myapp.config.ENABLE_FEATURE = True  # Noncompliant
            +
            +    assert myapp.is_feature_enabled()
            +
            +    myapp.config.ENABLE_FEATURE = old_value
            +
            +

            Compliant solution

            +
            +def test_feature_flag(monkeypatch):
            +    monkeypatch.setattr(myapp.config, 'ENABLE_FEATURE', True)
            +
            +    assert myapp.is_feature_enabled()
            +
            +

            Noncompliant code example

            +
            +import myapp.client
            +
            +def test_notify_user():
            +    client = myapp.client.Client()
            +    original_send = client.send
            +    client.send = lambda message: {"sent": True}  # Noncompliant
            +
            +    result = client.notify("Hello")
            +
            +    assert result["sent"]
            +    client.send = original_send
            +
            +

            Compliant solution

            +
            +def test_notify_user(monkeypatch):
            +    client = myapp.client.Client()
            +    monkeypatch.setattr(client, "send", lambda message: {"sent": True})
            +
            +    result = client.notify("Hello")
            +
            +    assert result["sent"]
            +
            +

            Resources

            +

            Documentation

            + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8997.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8997.json new file mode 100644 index 000000000..824203d87 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8997.json @@ -0,0 +1,24 @@ +{ + "title": "Tests should use the \"monkeypatch\" fixture for temporary modifications", + "type": "CODE_SMELL", + "status": "beta", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5 min" + }, + "tags": [ + "pytest", + "testing" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-8997", + "sqKey": "S8997", + "scope": "Tests", + "quickfix": "unknown", + "code": { + "impacts": { + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "COMPLETE" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 26b704b9a..a837b5690 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -377,6 +377,7 @@ "S8992", "S8993", "S8994", + "S8997", "S8998", "S8999", "S9001" diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/UseMonkeypatchFixtureCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/UseMonkeypatchFixtureCheckTest.java new file mode 100644 index 000000000..e1ba61ded --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/UseMonkeypatchFixtureCheckTest.java @@ -0,0 +1,56 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.sonar.plugins.python.api.PythonCheck; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class UseMonkeypatchFixtureCheckTest { + + private static final String RESOURCES = "src/test/resources/checks/tests/"; + + @Test + void test() { + PythonCheckVerifier.verify(RESOURCES + "test_useMonkeypatchFixture.py", new UseMonkeypatchFixtureCheck()); + } + + @ParameterizedTest + @CsvSource({ + "useMonkeypatchFixture.py, false", + "useMonkeypatchFixture_test.py, true", + "test_useMonkeypatchFixture_lifecycle.py, false" + }) + void testFileNames(String fileName, boolean expectIssues) { + var check = new UseMonkeypatchFixtureCheck(); + var path = RESOURCES + fileName; + if (expectIssues) { + PythonCheckVerifier.verify(path, check); + } else { + PythonCheckVerifier.verifyNoIssue(path, check); + } + } + + @Test + void scope() { + assertEquals(PythonCheck.CheckScope.ALL, new UseMonkeypatchFixtureCheck().scope()); + } +} diff --git a/python-checks/src/test/resources/checks/tests/test_useMonkeypatchFixture.py b/python-checks/src/test/resources/checks/tests/test_useMonkeypatchFixture.py new file mode 100644 index 000000000..11531c425 --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/test_useMonkeypatchFixture.py @@ -0,0 +1,222 @@ +import os +import sys + +import myapp.client +import myapp.config +import pytest + + +def test_api_key(): + old_key = os.environ.get('API_KEY') + os.environ['API_KEY'] = 'test_key' # Noncompliant {{Use the "monkeypatch" fixture for temporary modifications instead of manually modifying global state.}} +# ^^^^^^^^^^^^^^^^^^^^^ + result = get_api_configuration() + assert result['key'] == 'test_key' + if old_key: + os.environ['API_KEY'] = old_key # Noncompliant {{Use the "monkeypatch" fixture for temporary modifications instead of manually modifying global state.}} + else: + del os.environ['API_KEY'] # Noncompliant {{Use the "monkeypatch" fixture for temporary modifications instead of manually modifying global state.}} + + +def test_api_key_compliant(monkeypatch): + monkeypatch.setenv('API_KEY', 'test_key') + result = get_api_configuration() + assert result['key'] == 'test_key' + + +def test_feature_flag(): + old_value = myapp.config.ENABLE_FEATURE + myapp.config.ENABLE_FEATURE = True # Noncompliant {{Use the "monkeypatch" fixture for temporary modifications instead of manually modifying global state.}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + assert myapp.is_feature_enabled() + myapp.config.ENABLE_FEATURE = old_value # Noncompliant {{Use the "monkeypatch" fixture for temporary modifications instead of manually modifying global state.}} + + +def test_feature_flag_compliant(monkeypatch): + monkeypatch.setattr(myapp.config, 'ENABLE_FEATURE', True) + assert myapp.is_feature_enabled() + + +def test_notify_user(): + client = myapp.client.Client() + original_send = client.send + client.send = lambda message: {"sent": True} + result = client.notify("Hello") + assert result["sent"] + client.send = original_send + + +def test_notify_user_compliant(monkeypatch): + client = myapp.client.Client() + monkeypatch.setattr(client, "send", lambda message: {"sent": True}) + result = client.notify("Hello") + assert result["sent"] + + +def helper_set_env(): + os.environ['API_KEY'] = 'test_key' + + +def test_calls_helper(): + helper_set_env() + assert True + + +def not_a_test(): + os.environ['API_KEY'] = 'test_key' + + +def test_nested_helper(): + def inner(): + os.environ['API_KEY'] = 'test_key' + + inner() + assert True + + +def test_parenthesized_environ(): + (os.environ)['API_KEY'] = 'test_key' # Noncompliant {{Use the "monkeypatch" fixture for temporary modifications instead of manually modifying global state.}} +# ^^^^^^^^^^^^^^^^^^^^^^^ + + +def test_multiple_delete(): + os.environ['A'] = '1' # Noncompliant {{Use the "monkeypatch" fixture for temporary modifications instead of manually modifying global state.}} + os.environ['B'] = '2' # Noncompliant {{Use the "monkeypatch" fixture for temporary modifications instead of manually modifying global state.}} + del os.environ['A'] # Noncompliant {{Use the "monkeypatch" fixture for temporary modifications instead of manually modifying global state.}} + + +@pytest.fixture +def test_with_fixture_decorator(): + os.environ['FIXTURE_VAR'] = '1' + + +@pytest.fixture() +def test_with_call_fixture_decorator(): + os.environ['FIXTURE_VAR'] = '1' + + +@pytest.fixture +def setup_env(): + os.environ['API_KEY'] = 'test_key' + yield + del os.environ['API_KEY'] + + +@pytest.fixture() +def setup_env_with_call_decorator(): + os.environ['TEMP_VAR'] = 'temp' + yield + del os.environ['TEMP_VAR'] + + +def setup_module(): + os.environ['API_KEY'] = 'test_key' + + +def teardown_module(): + del os.environ['API_KEY'] + + +class TestApp: + def test_instance_attribute(self): + self.value = 1 + assert self.value == 1 + + def setup_method(self): + os.environ['SETUP'] = '1' + + def teardown_method(self): + del os.environ['SETUP'] + +def test_sys_path_insert(): + sys.path.insert(0, '/tmp/test') # Noncompliant {{Use the "monkeypatch" fixture for temporary modifications instead of manually modifying global state.}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +def test_sys_path_subscription(): + sys.path[0] = '/tmp/test' # Noncompliant {{Use the "monkeypatch" fixture for temporary modifications instead of manually modifying global state.}} +# ^^^^^^^^^^^ + + +def test_module_attribute_subscription_chain(): + myapp.config.SETTINGS['key'].value = 'value' # Noncompliant {{Use the "monkeypatch" fixture for temporary modifications instead of manually modifying global state.}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +def test_sys_path_insert_compliant(monkeypatch): + monkeypatch.syspath_prepend('/tmp/test') + + +# --- FP analysis reproducers (should remain compliant) --- + +class PodSpec: + def __init__(self): + self.containers = [type('C', (), {})()] + + +class Pod: + def __init__(self): + self.spec = PodSpec() + self.metadata = type('M', (), {'labels': {}, 'annotations': None, 'name': None, 'namespace': None})() + + +def test_local_nested_subscription_chain(): + expected = Pod() + expected.metadata.labels = {} + expected.metadata.name = 'pod_id' + expected.metadata.namespace = 'test_namespace' + expected.spec.containers[0].args = ['command'] + expected.spec.containers[0].image = 'img' + expected.spec.containers[0].resources = {'limits': {'cpu': '1m', 'memory': '1G'}} + + +def test_local_subscription_then_attribute(): + clf = type('Clf', (), {'inputs': [type('In', (), {})()], 'outputs': [type('Out', (), {'in_blocks': [type('B', (), {})()]})()]})() + clf.inputs[0].shape = (32, 32, 3) + clf.outputs[0].in_blocks[0].shape = (10,) + + +def test_mock_call_return_attribute_assignment(): + mock_post = type('M', (), {'__call__': lambda self: type('R', (), {})()})() + mock_post().ok = False + mock_post().text = 'content' + mock_post().headers = {} + + +def test_call_return_attribute_assignment(): + def get_ti_from_db(task): + return type('TI', (), {'state': None})() + + get_ti_from_db('task_1').state = 'FAILED' + get_ti_from_db('task_2').state = 'SUCCESS' + + +def test_getattr_result_attribute_assignment(): + float_frame = type('F', (), {'index': type('I', (), {'name': None})()})() + getattr(float_frame, 'index').name = 'foo' + + +def test_nested_self_subscription_attribute(): + class TestBuilders: + def __init__(self): + self.builders = {'A': type('B', (), {})()} + + def test_nested_self(self): + self.builders['A'].maybeStartBuild = lambda: None + + +def test_workbook_local_nested_assignment(): + wb = type('WB', (), {'worksheets': [type('WS', (), {'title': None})(), type('WS', (), {})()]})() + wb.worksheets[0].title = 'foo' + wb.worksheets[0]['A1'] = type('Cell', (), {'value': None})() + wb.worksheets[0]['A1'].value = 'foo' + + +def test_local_dataframe_nested_flags(): + df = type('DF', (), {'_mgr': type('Mgr', (), {'blocks': [type('Blk', (), {'values': type('V', (), {'flags': type('F', (), {'writeable': True})()})()})()]})()})() + df._mgr.blocks[0].values.flags.writeable = False + + +def test_module_attr_still_detected(): + myapp.config.ENABLE_FEATURE = True # Noncompliant {{Use the "monkeypatch" fixture for temporary modifications instead of manually modifying global state.}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/python-checks/src/test/resources/checks/tests/test_useMonkeypatchFixture_lifecycle.py b/python-checks/src/test/resources/checks/tests/test_useMonkeypatchFixture_lifecycle.py new file mode 100644 index 000000000..546c21b46 --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/test_useMonkeypatchFixture_lifecycle.py @@ -0,0 +1,42 @@ +import os + + +def setup_module(): + os.environ['MODULE_SETUP'] = '1' + + +def teardown_module(): + del os.environ['MODULE_SETUP'] + + +def setup_class(): + os.environ['CLASS_SETUP'] = '1' + + +def teardown_class(): + del os.environ['CLASS_SETUP'] + + +def setup_method(): + os.environ['METHOD_SETUP'] = '1' + + +def teardown_method(): + del os.environ['METHOD_SETUP'] + + +class TestLifecycle: + def setUp(self): + os.environ['SETUP'] = '1' + + def tearDown(self): + del os.environ['SETUP'] + + def setUpClass(cls): + os.environ['SETUP_CLASS'] = '1' + + def tearDownClass(cls): + del os.environ['SETUP_CLASS'] + + def test_ok(self): + assert True diff --git a/python-checks/src/test/resources/checks/tests/useMonkeypatchFixture.py b/python-checks/src/test/resources/checks/tests/useMonkeypatchFixture.py new file mode 100644 index 000000000..28efd1e18 --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/useMonkeypatchFixture.py @@ -0,0 +1,7 @@ +import os + +import myapp.config + + +def test_api_key(): + os.environ['API_KEY'] = 'test_key' diff --git a/python-checks/src/test/resources/checks/tests/useMonkeypatchFixture_test.py b/python-checks/src/test/resources/checks/tests/useMonkeypatchFixture_test.py new file mode 100644 index 000000000..e86c1bae0 --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/useMonkeypatchFixture_test.py @@ -0,0 +1,5 @@ +import os + + +def test_suffix(): + os.environ['API_KEY'] = 'test_key' # Noncompliant {{Use the "monkeypatch" fixture for temporary modifications instead of manually modifying global state.}} From e1d1a7f062a76433d4299299f4a1dc5e17583e71 Mon Sep 17 00:00:00 2001 From: Victor Date: Fri, 17 Jul 2026 16:02:17 +0200 Subject: [PATCH 228/322] CLP-212: Migrate scanner test fixtures GitOrigin-RevId: 0b488bcf35ffcb50023c2bd1be1e4112d9c3e123 --- docs/python-custom-rules-example/pom.xml | 4 +-- .../CustomPythonRuleRepositoryTest.java | 4 +-- .../python/CustomPythonRulesPluginTest.java | 7 +++-- its/plugin/python-custom-rules-plugin/pom.xml | 4 +-- .../python/CustomPythonRulesPluginTest.java | 7 +++-- pom.xml | 6 ----- python-commons/pom.xml | 6 ----- .../AbstractPythonRuleRepositoryTest.java | 4 +-- .../python/IPynbRuleRepositoryTest.java | 4 +-- .../sonar/plugins/python/IPynbSensorTest.java | 20 +++++++------- .../org/sonar/plugins/python/IPynbTest.java | 4 +-- .../plugins/python/PythonExtensionsTest.java | 6 ++--- .../python/PythonRuleRepositoryTest.java | 4 +-- .../plugins/python/PythonSensorTest.java | 26 +++++++++---------- .../org/sonar/plugins/python/PythonTest.java | 4 +-- .../org/sonar/plugins/python/TestUtils.java | 6 ++--- .../python/bandit/BanditSensorTest.java | 10 +++---- .../python/flake8/Flake8SensorTest.java | 10 +++---- .../plugins/python/mypy/MypySensorTest.java | 10 +++---- .../python/pylint/PylintSensorTest.java | 10 +++---- .../plugins/python/ruff/RuffSensorTest.java | 10 +++---- .../telemetry/SensorTelemetryStorageTest.java | 6 ++--- .../python/xunit/PythonXUnitSensorTest.java | 12 ++++----- python-frontend/pom.xml | 4 --- sonar-python-plugin/pom.xml | 6 ----- 25 files changed, 85 insertions(+), 109 deletions(-) diff --git a/docs/python-custom-rules-example/pom.xml b/docs/python-custom-rules-example/pom.xml index a27e828f2..85ea2a9a5 100644 --- a/docs/python-custom-rules-example/pom.xml +++ b/docs/python-custom-rules-example/pom.xml @@ -29,8 +29,8 @@ sonar-analyzer-commons - org.sonarsource.sonarqube - sonar-plugin-api-impl + org.sonarsource.scanner.engine + sensor-test-fixtures test diff --git a/docs/python-custom-rules-example/src/test/java/org/sonar/samples/python/CustomPythonRuleRepositoryTest.java b/docs/python-custom-rules-example/src/test/java/org/sonar/samples/python/CustomPythonRuleRepositoryTest.java index 13459f868..734c22eeb 100644 --- a/docs/python-custom-rules-example/src/test/java/org/sonar/samples/python/CustomPythonRuleRepositoryTest.java +++ b/docs/python-custom-rules-example/src/test/java/org/sonar/samples/python/CustomPythonRuleRepositoryTest.java @@ -4,11 +4,11 @@ */ package org.sonar.samples.python; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestSonarRuntime; import org.junit.jupiter.api.Test; import org.sonar.api.SonarEdition; import org.sonar.api.SonarQubeSide; import org.sonar.api.SonarRuntime; -import org.sonar.api.internal.SonarRuntimeImpl; import org.sonar.api.server.rule.RulesDefinition; import org.sonar.api.utils.Version; @@ -18,7 +18,7 @@ class CustomPythonRuleRepositoryTest { @Test void test_rule_repository() { - SonarRuntime sonarRuntime = SonarRuntimeImpl.forSonarQube(Version.create(9, 9), SonarQubeSide.SCANNER, SonarEdition.DEVELOPER); + SonarRuntime sonarRuntime = TestSonarRuntime.forSonarQube(Version.create(9, 9), SonarQubeSide.SCANNER, SonarEdition.DEVELOPER); CustomPythonRuleRepository customPythonRuleRepository = new CustomPythonRuleRepository(sonarRuntime); RulesDefinition.Context context = new RulesDefinition.Context(); customPythonRuleRepository.define(context); diff --git a/docs/python-custom-rules-example/src/test/java/org/sonar/samples/python/CustomPythonRulesPluginTest.java b/docs/python-custom-rules-example/src/test/java/org/sonar/samples/python/CustomPythonRulesPluginTest.java index 772ed5b75..9f0c7e6c3 100644 --- a/docs/python-custom-rules-example/src/test/java/org/sonar/samples/python/CustomPythonRulesPluginTest.java +++ b/docs/python-custom-rules-example/src/test/java/org/sonar/samples/python/CustomPythonRulesPluginTest.java @@ -4,13 +4,12 @@ */ package org.sonar.samples.python; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestSonarRuntime; import org.junit.jupiter.api.Test; import org.sonar.api.Plugin; import org.sonar.api.SonarEdition; import org.sonar.api.SonarQubeSide; import org.sonar.api.SonarRuntime; -import org.sonar.api.internal.PluginContextImpl; -import org.sonar.api.internal.SonarRuntimeImpl; import org.sonar.api.utils.Version; import static org.assertj.core.api.Assertions.assertThat; @@ -18,8 +17,8 @@ class CustomPythonRulesPluginTest { @Test void test() { - SonarRuntime sonarRuntime = SonarRuntimeImpl.forSonarQube(Version.create(9, 9), SonarQubeSide.SCANNER, SonarEdition.DEVELOPER); - Plugin.Context context = new PluginContextImpl.Builder().setSonarRuntime(sonarRuntime).build(); + SonarRuntime sonarRuntime = TestSonarRuntime.forSonarQube(Version.create(9, 9), SonarQubeSide.SCANNER, SonarEdition.DEVELOPER); + Plugin.Context context = new Plugin.Context(sonarRuntime); new CustomPythonRulesPlugin().define(context); assertThat(context.getExtensions()).hasSize(1); } diff --git a/its/plugin/python-custom-rules-plugin/pom.xml b/its/plugin/python-custom-rules-plugin/pom.xml index 0e3f3cfe6..c66dca912 100644 --- a/its/plugin/python-custom-rules-plugin/pom.xml +++ b/its/plugin/python-custom-rules-plugin/pom.xml @@ -21,8 +21,8 @@ sonar-plugin-api - org.sonarsource.sonarqube - sonar-plugin-api-impl + org.sonarsource.scanner.engine + sensor-test-fixtures test diff --git a/its/plugin/python-custom-rules-plugin/src/test/java/org/sonar/samples/python/CustomPythonRulesPluginTest.java b/its/plugin/python-custom-rules-plugin/src/test/java/org/sonar/samples/python/CustomPythonRulesPluginTest.java index 2219d27d5..f6372934f 100644 --- a/its/plugin/python-custom-rules-plugin/src/test/java/org/sonar/samples/python/CustomPythonRulesPluginTest.java +++ b/its/plugin/python-custom-rules-plugin/src/test/java/org/sonar/samples/python/CustomPythonRulesPluginTest.java @@ -16,13 +16,12 @@ */ package org.sonar.samples.python; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestSonarRuntime; import org.junit.jupiter.api.Test; import org.sonar.api.Plugin; import org.sonar.api.SonarEdition; import org.sonar.api.SonarQubeSide; import org.sonar.api.SonarRuntime; -import org.sonar.api.internal.PluginContextImpl; -import org.sonar.api.internal.SonarRuntimeImpl; import org.sonar.api.utils.Version; import static org.assertj.core.api.Assertions.assertThat; @@ -30,8 +29,8 @@ class CustomPythonRulesPluginTest { @Test void test() { - SonarRuntime sonarRuntime = SonarRuntimeImpl.forSonarQube(Version.create(7, 9), SonarQubeSide.SCANNER, SonarEdition.DEVELOPER); - Plugin.Context context = new PluginContextImpl.Builder().setSonarRuntime(sonarRuntime).build(); + SonarRuntime sonarRuntime = TestSonarRuntime.forSonarQube(Version.create(7, 9), SonarQubeSide.SCANNER, SonarEdition.DEVELOPER); + Plugin.Context context = new Plugin.Context(sonarRuntime); new CustomPythonRulesPlugin().define(context); assertThat(context.getExtensions()).hasSize(1); } diff --git a/pom.xml b/pom.xml index 28b9ed0e8..aca403b49 100644 --- a/pom.xml +++ b/pom.xml @@ -302,12 +302,6 @@ ${logback.version} test - - org.sonarsource.sonarqube - sonar-plugin-api-impl - ${sonar.version} - test - org.sonarsource.api.plugin sonar-plugin-api-test-fixtures diff --git a/python-commons/pom.xml b/python-commons/pom.xml index 058113518..0e58b29ab 100644 --- a/python-commons/pom.xml +++ b/python-commons/pom.xml @@ -22,12 +22,6 @@ org.sonarsource.sonarlint.core sonarlint-plugin-api - - org.sonarsource.sonarqube - sonar-plugin-api-impl - ${sonar.version} - test - ${project.groupId} python-frontend diff --git a/python-commons/src/test/java/org/sonar/plugins/python/AbstractPythonRuleRepositoryTest.java b/python-commons/src/test/java/org/sonar/plugins/python/AbstractPythonRuleRepositoryTest.java index ae7240460..093c27cc3 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/AbstractPythonRuleRepositoryTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/AbstractPythonRuleRepositoryTest.java @@ -16,6 +16,7 @@ */ package org.sonar.plugins.python; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestSonarRuntime; import java.util.List; import java.util.Set; import org.junit.jupiter.api.Test; @@ -23,7 +24,6 @@ import org.sonar.api.SonarQubeSide; import org.sonar.api.SonarRuntime; import org.sonar.api.batch.rule.CheckFactory; -import org.sonar.api.internal.SonarRuntimeImpl; import org.sonar.api.server.rule.RulesDefinition; import org.sonar.api.utils.Version; import org.sonar.check.Rule; @@ -85,7 +85,7 @@ private static class DummyNoSonarCheck extends PythonChecks { } private RulesDefinition.Repository createDummy(List> checks, Set templateRuleKeys, Set disabledRuleKeys) { - var runtime = SonarRuntimeImpl.forSonarQube(Version.create(9, 3), SonarQubeSide.SERVER, SonarEdition.COMMUNITY); + var runtime = TestSonarRuntime.forSonarQube(Version.create(9, 3), SonarQubeSide.SERVER, SonarEdition.COMMUNITY); var dummyRepo = new DummyRuleRepository(runtime) { @Override protected List> getCheckClasses() { diff --git a/python-commons/src/test/java/org/sonar/plugins/python/IPynbRuleRepositoryTest.java b/python-commons/src/test/java/org/sonar/plugins/python/IPynbRuleRepositoryTest.java index 65f5786d1..8c266b90e 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/IPynbRuleRepositoryTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/IPynbRuleRepositoryTest.java @@ -16,6 +16,7 @@ */ package org.sonar.plugins.python; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestSonarRuntime; import java.io.File; import java.io.IOException; import java.nio.file.Files; @@ -24,7 +25,6 @@ import org.sonar.api.SonarEdition; import org.sonar.api.SonarQubeSide; import org.sonar.api.SonarRuntime; -import org.sonar.api.internal.SonarRuntimeImpl; import org.sonar.api.server.rule.RulesDefinition; import org.sonar.api.utils.Version; @@ -76,7 +76,7 @@ private static RulesDefinition.Repository buildRepository() { } private static RulesDefinition.Repository buildRepository(int majorVersion, int minorVersion) { - SonarRuntime sonarRuntime = SonarRuntimeImpl.forSonarQube(Version.create(majorVersion, minorVersion), SonarQubeSide.SERVER, SonarEdition.DEVELOPER); + SonarRuntime sonarRuntime = TestSonarRuntime.forSonarQube(Version.create(majorVersion, minorVersion), SonarQubeSide.SERVER, SonarEdition.DEVELOPER); IPynbRuleRepository ruleRepository = new IPynbRuleRepository(sonarRuntime); RulesDefinition.Context context = new RulesDefinition.Context(); ruleRepository.define(context); diff --git a/python-commons/src/test/java/org/sonar/plugins/python/IPynbSensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/IPynbSensorTest.java index fc7cf0260..8e77155ef 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/IPynbSensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/IPynbSensorTest.java @@ -16,6 +16,9 @@ */ package org.sonar.plugins.python; +import com.sonarsource.scanner.engine.sensor.test.fixtures.SensorContextTester; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestSonarRuntime; import java.io.File; import java.io.IOException; import java.nio.file.Files; @@ -27,16 +30,8 @@ import org.slf4j.event.Level; import org.sonar.api.SonarRuntime; import org.sonar.api.batch.fs.InputFile; -import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; import org.sonar.api.batch.rule.ActiveRules; import org.sonar.api.batch.rule.CheckFactory; -import org.sonar.scanner.plugin.api.impl.rule.ActiveRulesBuilder; -import org.sonar.scanner.plugin.api.impl.rule.NewActiveRule; -import org.sonar.duplications.internal.pmd.TokensLine; -import org.sonar.scanner.plugin.api.impl.sensor.DefaultSensorDescriptor; -import com.sonarsource.scanner.engine.sensor.test.fixtures.SensorContextTester; -import org.sonar.scanner.plugin.api.impl.config.MapSettings; -import org.sonar.api.internal.SonarRuntimeImpl; import org.sonar.api.issue.NoSonarFilter; import org.sonar.api.measures.CoreMetrics; import org.sonar.api.measures.FileLinesContext; @@ -44,6 +39,7 @@ import org.sonar.api.rule.RuleKey; import org.sonar.api.testfixtures.log.LogTesterJUnit5; import org.sonar.api.utils.Version; +import org.sonar.duplications.internal.pmd.TokensLine; import org.sonar.plugins.python.api.ProjectPythonVersion; import org.sonar.plugins.python.api.PythonVersionUtils; import org.sonar.plugins.python.editions.OpenSourceRepositoryInfoProvider; @@ -54,11 +50,15 @@ import org.sonar.plugins.python.nosonar.NoSonarLineInfoCollector; import org.sonar.plugins.python.telemetry.TelemetryMetricKey; import org.sonar.python.project.config.ProjectConfigurationBuilder; +import org.sonar.scanner.plugin.api.impl.config.MapSettings; +import org.sonar.scanner.plugin.api.impl.rule.ActiveRulesBuilder; +import org.sonar.scanner.plugin.api.impl.rule.NewActiveRule; +import org.sonar.scanner.plugin.api.impl.sensor.DefaultSensorDescriptor; import static java.nio.charset.StandardCharsets.UTF_8; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; @@ -72,7 +72,7 @@ class IPynbSensorTest { private static final Version SONARLINT_DETECTABLE_VERSION = Version.create(9, 9); - static final SonarRuntime SONARLINT_RUNTIME = SonarRuntimeImpl.forSonarLint(SONARLINT_DETECTABLE_VERSION); + static final SonarRuntime SONARLINT_RUNTIME = TestSonarRuntime.forSonarLint(SONARLINT_DETECTABLE_VERSION); private static final String FILE_1 = "file1.ipynb"; private static final String NOTEBOOK_FILE = "notebook.ipynb"; diff --git a/python-commons/src/test/java/org/sonar/plugins/python/IPynbTest.java b/python-commons/src/test/java/org/sonar/plugins/python/IPynbTest.java index 30a36f0e0..fc7117d15 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/IPynbTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/IPynbTest.java @@ -17,8 +17,8 @@ package org.sonar.plugins.python; import org.junit.jupiter.api.Test; -import org.sonar.api.config.internal.ConfigurationBridge; -import org.sonar.api.config.internal.MapSettings; +import org.sonar.scanner.plugin.api.impl.config.ConfigurationBridge; +import org.sonar.scanner.plugin.api.impl.config.MapSettings; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/python-commons/src/test/java/org/sonar/plugins/python/PythonExtensionsTest.java b/python-commons/src/test/java/org/sonar/plugins/python/PythonExtensionsTest.java index 09f5ef2af..c245722db 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/PythonExtensionsTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/PythonExtensionsTest.java @@ -16,6 +16,7 @@ */ package org.sonar.plugins.python; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestSonarRuntime; import java.util.List; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -24,7 +25,6 @@ import org.sonar.api.SonarEdition; import org.sonar.api.SonarQubeSide; import org.sonar.api.SonarRuntime; -import org.sonar.api.internal.SonarRuntimeImpl; import org.sonar.api.testfixtures.log.LogTesterJUnit5; import org.sonar.api.utils.Version; import org.sonar.plugins.python.api.SonarLintCache; @@ -42,10 +42,10 @@ class PythonExtensionsTest { @Test void testGetExtensions() { Version v79 = Version.create(7, 9); - SonarRuntime runtime = SonarRuntimeImpl.forSonarQube(v79, SonarQubeSide.SERVER, SonarEdition.DEVELOPER); + SonarRuntime runtime = TestSonarRuntime.forSonarQube(v79, SonarQubeSide.SERVER, SonarEdition.DEVELOPER); assertThat(extensions(runtime)).hasSize(46); assertThat(extensions(runtime)).contains(AnalysisWarningsWrapper.class); - assertThat(extensions(SonarRuntimeImpl.forSonarLint(v79))) + assertThat(extensions(TestSonarRuntime.forSonarLint(v79))) .hasSize(26) .contains(SonarLintCache.class); } diff --git a/python-commons/src/test/java/org/sonar/plugins/python/PythonRuleRepositoryTest.java b/python-commons/src/test/java/org/sonar/plugins/python/PythonRuleRepositoryTest.java index e95ec0ee9..b9ac4931e 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/PythonRuleRepositoryTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/PythonRuleRepositoryTest.java @@ -16,6 +16,7 @@ */ package org.sonar.plugins.python; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestSonarRuntime; import java.io.File; import java.io.IOException; import java.nio.file.Files; @@ -24,7 +25,6 @@ import org.sonar.api.SonarEdition; import org.sonar.api.SonarQubeSide; import org.sonar.api.SonarRuntime; -import org.sonar.api.internal.SonarRuntimeImpl; import org.sonar.api.rules.RuleType; import org.sonar.api.server.rule.RulesDefinition; import org.sonar.api.utils.Version; @@ -116,7 +116,7 @@ private static RulesDefinition.Repository buildRepository() { } private static RulesDefinition.Repository buildRepository(int majorVersion, int minorVersion) { - SonarRuntime sonarRuntime = SonarRuntimeImpl.forSonarQube(Version.create(majorVersion, minorVersion), SonarQubeSide.SERVER, SonarEdition.DEVELOPER); + SonarRuntime sonarRuntime = TestSonarRuntime.forSonarQube(Version.create(majorVersion, minorVersion), SonarQubeSide.SERVER, SonarEdition.DEVELOPER); PythonRuleRepository ruleRepository = new PythonRuleRepository(sonarRuntime); RulesDefinition.Context context = new RulesDefinition.Context(); ruleRepository.define(context); diff --git a/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java index 04ba851fe..62cb57dfc 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java @@ -16,6 +16,9 @@ */ package org.sonar.plugins.python; +import com.sonarsource.scanner.engine.sensor.test.fixtures.SensorContextTester; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestSonarRuntime; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -45,29 +48,18 @@ import org.slf4j.event.Level; import org.sonar.api.SonarProduct; import org.sonar.api.SonarRuntime; -import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.fs.InputFile.Type; +import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.fs.TextPointer; import org.sonar.api.batch.fs.TextRange; -import org.sonar.scanner.plugin.api.impl.fs.DefaultInputFile; -import org.sonar.scanner.plugin.api.impl.fs.DefaultTextPointer; -import org.sonar.scanner.plugin.api.impl.fs.DefaultTextRange; -import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; import org.sonar.api.batch.rule.ActiveRules; import org.sonar.api.batch.rule.CheckFactory; -import org.sonar.scanner.plugin.api.impl.rule.ActiveRulesBuilder; -import org.sonar.scanner.plugin.api.impl.rule.NewActiveRule; -import org.sonar.duplications.internal.pmd.TokensLine; import org.sonar.api.batch.sensor.error.AnalysisError; -import org.sonar.scanner.plugin.api.impl.sensor.DefaultSensorDescriptor; -import com.sonarsource.scanner.engine.sensor.test.fixtures.SensorContextTester; import org.sonar.api.batch.sensor.issue.Issue; import org.sonar.api.batch.sensor.issue.IssueLocation; import org.sonar.api.batch.sensor.issue.fix.NewQuickFix; import org.sonar.api.batch.sensor.issue.fix.QuickFix; import org.sonar.api.batch.sensor.issue.fix.TextEdit; -import org.sonar.scanner.plugin.api.impl.config.MapSettings; -import org.sonar.api.internal.SonarRuntimeImpl; import org.sonar.api.issue.NoSonarFilter; import org.sonar.api.measures.CoreMetrics; import org.sonar.api.measures.FileLinesContext; @@ -77,6 +69,7 @@ import org.sonar.api.utils.Version; import org.sonar.check.Rule; import org.sonar.check.RuleProperty; +import org.sonar.duplications.internal.pmd.TokensLine; import org.sonar.plugins.python.api.ProjectPythonVersion; import org.sonar.plugins.python.api.PythonCheck; import org.sonar.plugins.python.api.PythonCustomRuleRepository; @@ -108,6 +101,13 @@ import org.sonar.python.project.config.ProjectConfigurationBuilder; import org.sonar.python.tree.TokenImpl; import org.sonar.python.types.TypeShed; +import org.sonar.scanner.plugin.api.impl.config.MapSettings; +import org.sonar.scanner.plugin.api.impl.fs.DefaultInputFile; +import org.sonar.scanner.plugin.api.impl.fs.DefaultTextPointer; +import org.sonar.scanner.plugin.api.impl.fs.DefaultTextRange; +import org.sonar.scanner.plugin.api.impl.rule.ActiveRulesBuilder; +import org.sonar.scanner.plugin.api.impl.rule.NewActiveRule; +import org.sonar.scanner.plugin.api.impl.sensor.DefaultSensorDescriptor; import org.sonarsource.sonarlint.core.analysis.api.ClientInputFile; import org.sonarsource.sonarlint.core.analysis.container.analysis.filesystem.FileMetadata; import org.sonarsource.sonarlint.core.analysis.container.analysis.filesystem.SonarLintInputFile; @@ -156,7 +156,7 @@ class PythonSensorTest { private static final Version SONARLINT_DETECTABLE_VERSION = Version.create(6, 0); - static final SonarRuntime SONARLINT_RUNTIME = SonarRuntimeImpl.forSonarLint(SONARLINT_DETECTABLE_VERSION); + static final SonarRuntime SONARLINT_RUNTIME = TestSonarRuntime.forSonarLint(SONARLINT_DETECTABLE_VERSION); private static final PythonCustomRuleRepository[] CUSTOM_RULES = {new PythonCustomRuleRepository() { @Override diff --git a/python-commons/src/test/java/org/sonar/plugins/python/PythonTest.java b/python-commons/src/test/java/org/sonar/plugins/python/PythonTest.java index 8c0e64b7b..0fab2dbae 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/PythonTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/PythonTest.java @@ -17,8 +17,8 @@ package org.sonar.plugins.python; import org.junit.jupiter.api.Test; -import org.sonar.api.config.internal.ConfigurationBridge; -import org.sonar.api.config.internal.MapSettings; +import org.sonar.scanner.plugin.api.impl.config.ConfigurationBridge; +import org.sonar.scanner.plugin.api.impl.config.MapSettings; import static org.assertj.core.api.Assertions.assertThat; diff --git a/python-commons/src/test/java/org/sonar/plugins/python/TestUtils.java b/python-commons/src/test/java/org/sonar/plugins/python/TestUtils.java index 80b3ffb50..23e6610de 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/TestUtils.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/TestUtils.java @@ -16,6 +16,8 @@ */ package org.sonar.plugins.python; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestSonarRuntime; import java.io.File; import java.io.IOException; import java.nio.charset.Charset; @@ -25,13 +27,11 @@ import org.sonar.api.SonarQubeSide; import org.sonar.api.SonarRuntime; import org.sonar.api.batch.fs.InputFile; -import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; -import org.sonar.api.internal.SonarRuntimeImpl; import org.sonar.api.utils.Version; public final class TestUtils { - static final SonarRuntime SONAR_RUNTIME_79 = SonarRuntimeImpl.forSonarQube(Version.create(7, 9), SonarQubeSide.SCANNER, SonarEdition.DEVELOPER); + static final SonarRuntime SONAR_RUNTIME_79 = TestSonarRuntime.forSonarQube(Version.create(7, 9), SonarQubeSide.SCANNER, SonarEdition.DEVELOPER); private TestUtils() { // Utility class diff --git a/python-commons/src/test/java/org/sonar/plugins/python/bandit/BanditSensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/bandit/BanditSensorTest.java index 09f5e6e7f..1128744c9 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/bandit/BanditSensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/bandit/BanditSensorTest.java @@ -16,6 +16,9 @@ */ package org.sonar.plugins.python.bandit; +import com.sonarsource.scanner.engine.sensor.test.fixtures.SensorContextTester; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestSonarRuntime; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -31,16 +34,13 @@ import org.sonar.api.SonarQubeSide; import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.fs.TextRange; -import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; import org.sonar.api.batch.rule.Severity; -import org.sonar.scanner.plugin.api.impl.sensor.DefaultSensorDescriptor; -import com.sonarsource.scanner.engine.sensor.test.fixtures.SensorContextTester; import org.sonar.api.batch.sensor.issue.ExternalIssue; import org.sonar.api.batch.sensor.issue.IssueLocation; -import org.sonar.api.internal.SonarRuntimeImpl; import org.sonar.api.rules.RuleType; import org.sonar.api.testfixtures.log.LogTesterJUnit5; import org.sonar.api.utils.Version; +import org.sonar.scanner.plugin.api.impl.sensor.DefaultSensorDescriptor; import static java.nio.charset.StandardCharsets.UTF_8; import static org.assertj.core.api.Assertions.assertThat; @@ -212,7 +212,7 @@ private static List executeSensorImporting(int majorVersion, int SensorContextTester context = SensorContextTester.create(baseDir); try (Stream fileStream = Files.list(PROJECT_DIR)) { fileStream.forEach(file -> addFileToContext(context, baseDir, file)); - context.setRuntime(SonarRuntimeImpl.forSonarQube(Version.create(majorVersion, minorVersion), SonarQubeSide.SERVER, SonarEdition.DEVELOPER)); + context.setRuntime(TestSonarRuntime.forSonarQube(Version.create(majorVersion, minorVersion), SonarQubeSide.SERVER, SonarEdition.DEVELOPER)); if (fileName != null) { String path = PROJECT_DIR.resolve(fileName).toAbsolutePath().toString(); context.settings().setProperty("sonar.python.bandit.reportPaths", path); diff --git a/python-commons/src/test/java/org/sonar/plugins/python/flake8/Flake8SensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/flake8/Flake8SensorTest.java index 56675e1bb..536f96bcc 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/flake8/Flake8SensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/flake8/Flake8SensorTest.java @@ -16,6 +16,9 @@ */ package org.sonar.plugins.python.flake8; +import com.sonarsource.scanner.engine.sensor.test.fixtures.SensorContextTester; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestSonarRuntime; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -31,16 +34,13 @@ import org.sonar.api.SonarQubeSide; import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.fs.TextRange; -import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; import org.sonar.api.batch.rule.Severity; -import org.sonar.scanner.plugin.api.impl.sensor.DefaultSensorDescriptor; -import com.sonarsource.scanner.engine.sensor.test.fixtures.SensorContextTester; import org.sonar.api.batch.sensor.issue.ExternalIssue; import org.sonar.api.batch.sensor.issue.IssueLocation; -import org.sonar.api.internal.SonarRuntimeImpl; import org.sonar.api.rules.RuleType; import org.sonar.api.testfixtures.log.LogTesterJUnit5; import org.sonar.api.utils.Version; +import org.sonar.scanner.plugin.api.impl.sensor.DefaultSensorDescriptor; import static java.nio.charset.StandardCharsets.UTF_8; import static org.assertj.core.api.Assertions.assertThat; @@ -201,7 +201,7 @@ private static List executeSensorImporting(int majorVersion, int SensorContextTester context = SensorContextTester.create(baseDir); try (Stream fileStream = Files.list(PROJECT_DIR)) { fileStream.forEach(file -> addFileToContext(context, baseDir, file)); - context.setRuntime(SonarRuntimeImpl.forSonarQube(Version.create(majorVersion, minorVersion), SonarQubeSide.SERVER, SonarEdition.DEVELOPER)); + context.setRuntime(TestSonarRuntime.forSonarQube(Version.create(majorVersion, minorVersion), SonarQubeSide.SERVER, SonarEdition.DEVELOPER)); if (fileName != null) { String path = PROJECT_DIR.resolve(fileName).toAbsolutePath().toString(); context.settings().setProperty("sonar.python.flake8.reportPaths", path); diff --git a/python-commons/src/test/java/org/sonar/plugins/python/mypy/MypySensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/mypy/MypySensorTest.java index 711c2f21d..e9fdf97ea 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/mypy/MypySensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/mypy/MypySensorTest.java @@ -16,6 +16,9 @@ */ package org.sonar.plugins.python.mypy; +import com.sonarsource.scanner.engine.sensor.test.fixtures.SensorContextTester; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestSonarRuntime; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -32,16 +35,13 @@ import org.sonar.api.SonarRuntime; import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.fs.TextRange; -import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; import org.sonar.api.batch.rule.Severity; -import org.sonar.scanner.plugin.api.impl.sensor.DefaultSensorDescriptor; -import com.sonarsource.scanner.engine.sensor.test.fixtures.SensorContextTester; import org.sonar.api.batch.sensor.issue.ExternalIssue; import org.sonar.api.batch.sensor.issue.IssueLocation; -import org.sonar.api.internal.SonarRuntimeImpl; import org.sonar.api.rules.RuleType; import org.sonar.api.testfixtures.log.LogTesterJUnit5; import org.sonar.api.utils.Version; +import org.sonar.scanner.plugin.api.impl.sensor.DefaultSensorDescriptor; import static java.nio.charset.StandardCharsets.UTF_8; import static org.assertj.core.api.Assertions.assertThat; @@ -53,7 +53,7 @@ class MypySensorTest { private static final String UNKNOWN_FILE_REPORT = "mypy_unknown_file_output.txt"; private static final MypySensor mypySensor = new MypySensor(); - private static final SonarRuntime SONAR_RUNTIME = SonarRuntimeImpl.forSonarQube(Version.create(9, 9), SonarQubeSide.SERVER, SonarEdition.DEVELOPER); + private static final SonarRuntime SONAR_RUNTIME = TestSonarRuntime.forSonarQube(Version.create(9, 9), SonarQubeSide.SERVER, SonarEdition.DEVELOPER); @RegisterExtension public LogTesterJUnit5 logTester = new LogTesterJUnit5().setLevel(Level.DEBUG); diff --git a/python-commons/src/test/java/org/sonar/plugins/python/pylint/PylintSensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/pylint/PylintSensorTest.java index 35d636be6..c7d81bfc1 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/pylint/PylintSensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/pylint/PylintSensorTest.java @@ -16,6 +16,9 @@ */ package org.sonar.plugins.python.pylint; +import com.sonarsource.scanner.engine.sensor.test.fixtures.SensorContextTester; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestSonarRuntime; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -31,16 +34,13 @@ import org.sonar.api.SonarQubeSide; import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.fs.TextRange; -import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; import org.sonar.api.batch.rule.Severity; -import org.sonar.scanner.plugin.api.impl.sensor.DefaultSensorDescriptor; -import com.sonarsource.scanner.engine.sensor.test.fixtures.SensorContextTester; import org.sonar.api.batch.sensor.issue.ExternalIssue; import org.sonar.api.batch.sensor.issue.IssueLocation; -import org.sonar.api.internal.SonarRuntimeImpl; import org.sonar.api.rules.RuleType; import org.sonar.api.testfixtures.log.LogTesterJUnit5; import org.sonar.api.utils.Version; +import org.sonar.scanner.plugin.api.impl.sensor.DefaultSensorDescriptor; import static java.nio.charset.StandardCharsets.UTF_8; import static org.assertj.core.api.Assertions.assertThat; @@ -221,7 +221,7 @@ private static List executeSensorImporting(int majorVersion, int SensorContextTester context = SensorContextTester.create(baseDir); try (Stream fileStream = Files.list(PROJECT_DIR)) { fileStream.forEach(file -> addFileToContext(context, baseDir, file)); - context.setRuntime(SonarRuntimeImpl.forSonarQube(Version.create(majorVersion, minorVersion), SonarQubeSide.SERVER, SonarEdition.DEVELOPER)); + context.setRuntime(TestSonarRuntime.forSonarQube(Version.create(majorVersion, minorVersion), SonarQubeSide.SERVER, SonarEdition.DEVELOPER)); if (fileName != null) { String path = PROJECT_DIR.resolve(fileName).toAbsolutePath().toString(); if (useLegacyKey) { diff --git a/python-commons/src/test/java/org/sonar/plugins/python/ruff/RuffSensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/ruff/RuffSensorTest.java index 05d6fdd65..d72add74d 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/ruff/RuffSensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/ruff/RuffSensorTest.java @@ -16,6 +16,9 @@ */ package org.sonar.plugins.python.ruff; +import com.sonarsource.scanner.engine.sensor.test.fixtures.SensorContextTester; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestSonarRuntime; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -31,16 +34,13 @@ import org.sonar.api.SonarQubeSide; import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.fs.TextRange; -import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; import org.sonar.api.batch.rule.Severity; -import org.sonar.scanner.plugin.api.impl.sensor.DefaultSensorDescriptor; -import com.sonarsource.scanner.engine.sensor.test.fixtures.SensorContextTester; import org.sonar.api.batch.sensor.issue.ExternalIssue; import org.sonar.api.batch.sensor.issue.IssueLocation; -import org.sonar.api.internal.SonarRuntimeImpl; import org.sonar.api.rules.RuleType; import org.sonar.api.testfixtures.log.LogTesterJUnit5; import org.sonar.api.utils.Version; +import org.sonar.scanner.plugin.api.impl.sensor.DefaultSensorDescriptor; import static java.nio.charset.StandardCharsets.UTF_8; import static org.assertj.core.api.Assertions.assertThat; @@ -309,7 +309,7 @@ private static List executeSensorImporting(int majorVersion, int SensorContextTester context = SensorContextTester.create(baseDir); try (Stream fileStream = Files.list(PROJECT_DIR)) { fileStream.forEach(file -> addFileToContext(context, baseDir, file)); - context.setRuntime(SonarRuntimeImpl.forSonarQube(Version.create(majorVersion, minorVersion), SonarQubeSide.SERVER, + context.setRuntime(TestSonarRuntime.forSonarQube(Version.create(majorVersion, minorVersion), SonarQubeSide.SERVER, SonarEdition.DEVELOPER)); if (fileName != null) { String path = PROJECT_DIR.resolve(fileName).toAbsolutePath().toString(); diff --git a/python-commons/src/test/java/org/sonar/plugins/python/telemetry/SensorTelemetryStorageTest.java b/python-commons/src/test/java/org/sonar/plugins/python/telemetry/SensorTelemetryStorageTest.java index c01d5c4bc..5aea4596a 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/telemetry/SensorTelemetryStorageTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/telemetry/SensorTelemetryStorageTest.java @@ -16,6 +16,8 @@ */ package org.sonar.plugins.python.telemetry; +import com.sonarsource.scanner.engine.sensor.test.fixtures.SensorContextTester; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestSonarRuntime; import java.io.File; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -24,8 +26,6 @@ import org.sonar.api.SonarEdition; import org.sonar.api.SonarQubeSide; import org.sonar.api.batch.sensor.SensorContext; -import com.sonarsource.scanner.engine.sensor.test.fixtures.SensorContextTester; -import org.sonar.api.internal.SonarRuntimeImpl; import org.sonar.api.testfixtures.log.LogTesterJUnit5; import org.sonar.api.utils.Version; @@ -74,7 +74,7 @@ void no_crash_on_exception() { private SensorContext sensorContext(Version version) { var sensorContext = spy(SensorContextTester.create(new File(""))); - sensorContext.setRuntime(SonarRuntimeImpl.forSonarQube(version, SonarQubeSide.SERVER, SonarEdition.DEVELOPER)); + sensorContext.setRuntime(TestSonarRuntime.forSonarQube(version, SonarQubeSide.SERVER, SonarEdition.DEVELOPER)); return sensorContext; } } diff --git a/python-commons/src/test/java/org/sonar/plugins/python/xunit/PythonXUnitSensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/xunit/PythonXUnitSensorTest.java index af39fe0eb..406abb5b7 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/xunit/PythonXUnitSensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/xunit/PythonXUnitSensorTest.java @@ -16,22 +16,22 @@ */ package org.sonar.plugins.python.xunit; +import com.sonarsource.scanner.engine.sensor.test.fixtures.SensorContextTester; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; import java.io.File; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; import org.slf4j.event.Level; import org.sonar.api.batch.fs.InputComponent; -import org.sonar.scanner.plugin.api.impl.fs.DefaultFileSystem; -import org.sonar.scanner.plugin.api.impl.fs.DefaultInputFile; -import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; -import com.sonarsource.scanner.engine.sensor.test.fixtures.SensorContextTester; -import org.sonar.api.config.internal.ConfigurationBridge; -import org.sonar.api.config.internal.MapSettings; import org.sonar.api.measures.CoreMetrics; import org.sonar.api.measures.Metric; import org.sonar.api.testfixtures.log.LogTesterJUnit5; import org.sonar.plugins.python.warnings.AnalysisWarningsWrapper; +import org.sonar.scanner.plugin.api.impl.config.ConfigurationBridge; +import org.sonar.scanner.plugin.api.impl.config.MapSettings; +import org.sonar.scanner.plugin.api.impl.fs.DefaultFileSystem; +import org.sonar.scanner.plugin.api.impl.fs.DefaultInputFile; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.spy; diff --git a/python-frontend/pom.xml b/python-frontend/pom.xml index 6201646c1..cd35d6d96 100644 --- a/python-frontend/pom.xml +++ b/python-frontend/pom.xml @@ -79,10 +79,6 @@ sonar-analyzer-commons compile - - org.sonarsource.sonarqube - sonar-plugin-api-impl - com.fasterxml.jackson.core jackson-databind diff --git a/sonar-python-plugin/pom.xml b/sonar-python-plugin/pom.xml index fb67b9481..925c3b0b5 100644 --- a/sonar-python-plugin/pom.xml +++ b/sonar-python-plugin/pom.xml @@ -37,12 +37,6 @@ org.sonarsource.sonarlint.core sonarlint-plugin-api - - org.sonarsource.sonarqube - sonar-plugin-api-impl - ${sonar.version} - test - ${project.groupId} python-frontend From 913104b7ce36d2599857439880d1ac18c8efe40b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 17 Jul 2026 16:55:28 +0200 Subject: [PATCH 229/322] Update dependency org.junit.platform:junit-platform-suite-engine to v6.1.2 Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> GitOrigin-RevId: 1772478bda278fdb399b028f9dee080748a28f1a --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index aca403b49..1d0de4a96 100644 --- a/pom.xml +++ b/pom.xml @@ -269,7 +269,7 @@ org.junit.platform junit-platform-suite-engine - 6.1.1 + 6.1.2 test From a569cc2321bf5ca51fc8ccc4698ec7da76e6cbff Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 17 Jul 2026 16:59:46 +0200 Subject: [PATCH 230/322] Update sonarlint-core.version to v11.7.0.86025 Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> GitOrigin-RevId: 3316bfffa8b464359b665986c992592ce16f3943 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1d0de4a96..73a8c9a92 100644 --- a/pom.xml +++ b/pom.xml @@ -108,7 +108,7 @@ its/**,private/its-enterprise/**,python-frontend/typeshed_serializer/**,**/test/resources/** - 11.6.0.85952 + 11.7.0.86025 1.26.0.4194 4.29.3 6.2.7 From b839e24871f63c67a3840b72202da9123c96f7c7 Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Fri, 17 Jul 2026 17:11:38 +0200 Subject: [PATCH 231/322] SONARPY-4383 S9000 Add rule for pytest.raises context manager usage GitOrigin-RevId: ec61d9c3cebb56c3cd6e4fa96cc40baa5ce9e7ff --- .../python/checks/OpenSourceCheckList.java | 2 + .../PytestRaisesContextManagerCheck.java | 358 ++++++++++++++++++ .../org/sonar/l10n/py/rules/python/S9000.html | 112 ++++++ .../org/sonar/l10n/py/rules/python/S9000.json | 25 ++ .../py/rules/python/Sonar_way_profile.json | 1 + .../PytestRaisesContextManagerCheckTest.java | 122 ++++++ .../tests/pytestRaisesContextManager.py | 284 ++++++++++++++ 7 files changed, 904 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/tests/PytestRaisesContextManagerCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9000.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9000.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/tests/PytestRaisesContextManagerCheckTest.java create mode 100644 python-checks/src/test/resources/checks/tests/pytestRaisesContextManager.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 884094f80..e3457e4b7 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -106,6 +106,7 @@ import org.sonar.python.checks.tests.PytestAutouseParametrizedFixtureCheck; import org.sonar.python.checks.tests.PytestFixtureMultipleYieldCheck; import org.sonar.python.checks.tests.PytestPluginsConftestCheck; +import org.sonar.python.checks.tests.PytestRaisesContextManagerCheck; import org.sonar.python.checks.tests.SingleInvocationRuntimeExceptionCheck; import org.sonar.python.checks.tests.SkippedTestNoReasonCheck; import org.sonar.python.checks.tests.SpecificExceptionAssertionCheck; @@ -404,6 +405,7 @@ public Stream> getChecks() { PytestAutouseParametrizedFixtureCheck.class, PytestFixtureMultipleYieldCheck.class, PytestPluginsConftestCheck.class, + PytestRaisesContextManagerCheck.class, PyTorchDataLoaderNumWorkersCheck.class, PytzTimeZoneInDatetimeConstructorCheck.class, RaiseOutsideExceptCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/PytestRaisesContextManagerCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/PytestRaisesContextManagerCheck.java new file mode 100644 index 000000000..f4aed809c --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/PytestRaisesContextManagerCheck.java @@ -0,0 +1,358 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.OptionalInt; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.symbols.v2.SymbolV2; +import org.sonar.plugins.python.api.symbols.v2.UsageV2; +import org.sonar.plugins.python.api.tree.AnnotatedAssignment; +import org.sonar.plugins.python.api.tree.Argument; +import org.sonar.plugins.python.api.tree.AssignmentStatement; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.Decorator; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.ExpressionList; +import org.sonar.plugins.python.api.tree.FunctionDef; +import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.Parameter; +import org.sonar.plugins.python.api.tree.ParameterList; +import org.sonar.plugins.python.api.tree.QualifiedExpression; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.StringLiteral; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.checks.utils.Expressions; +import org.sonar.python.checks.utils.UnittestUtils; +import org.sonar.python.tree.TreeUtils; + +@Rule(key = "S9000") +public class PytestRaisesContextManagerCheck extends PythonSubscriptionCheck { + private static final String MESSAGE = "Wrap the code that should raise with \"with pytest.raises(ExpectedError)\"."; + private static final TypeMatcher PYTEST_PARAMETRIZE_MATCHER = TypeMatchers.withFQN("pytest.mark.parametrize"); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, ctx -> checkCallExpression(ctx, (CallExpression) ctx.syntaxNode())); + } + + @Override + public CheckScope scope() { + return CheckScope.ALL; + } + + private static void checkCallExpression(SubscriptionContext ctx, CallExpression callExpression) { + if (isUsedAsWithContextManager(callExpression) + || isAssignedAndUsedInWith(callExpression) + || isParametrizeInjectedAndUsedInWith(callExpression, ctx) + || escapesEnclosingFunction(callExpression)) { + return; + } + if (UnittestUtils.isPytestRaises(callExpression, ctx)) { + ctx.addIssue(callExpression, MESSAGE); + } + } + + /** + * Accepts {@code pytest.raises(...)} that escapes the current function for later {@code with}-usage + * elsewhere: return, call argument, a local that is returned/passed as argument, a global/module/class + * binding, or a {@code self} attribute assignment. Decorator/{@code parametrize} injection stays handled + * separately so unused injected values can still be reported. + */ + private static boolean escapesEnclosingFunction(CallExpression callExpression) { + if (isReturned(callExpression) + || isPassedAsCallArgument(callExpression) + || isAssignedToSelfAttribute(callExpression) + || isModuleOrClassLevelBinding(callExpression)) { + return true; + } + return assignedName(callExpression) + .map(Name::symbolV2) + .filter(Objects::nonNull) + .filter(PytestRaisesContextManagerCheck::escapesViaName) + .isPresent(); + } + + private static boolean isReturned(CallExpression callExpression) { + return TreeUtils.firstAncestorOfKind(outermostParenthesized(callExpression), Tree.Kind.RETURN_STMT) != null; + } + + private static boolean isPassedAsCallArgument(CallExpression raisesCall) { + if (TreeUtils.firstAncestorOfKind(raisesCall, Tree.Kind.DECORATOR) != null) { + return false; + } + for (Tree current = outermostParenthesized(raisesCall).parent(); current != null; current = current.parent()) { + if (current instanceof RegularArgument) { + return true; + } + if (current.is(Tree.Kind.FUNCDEF, Tree.Kind.FILE_INPUT, Tree.Kind.CLASSDEF, Tree.Kind.LAMBDA)) { + return false; + } + } + return false; + } + + private static boolean isModuleOrClassLevelBinding(CallExpression callExpression) { + Expression rhs = outermostParenthesized(callExpression); + Tree parent = rhs.parent(); + if (!(parent instanceof AssignmentStatement || parent instanceof AnnotatedAssignment)) { + return false; + } + return TreeUtils.firstAncestorOfKind(callExpression, Tree.Kind.FUNCDEF) == null; + } + + private static boolean isAssignedToSelfAttribute(CallExpression callExpression) { + Expression rhs = outermostParenthesized(callExpression); + Tree parent = rhs.parent(); + Expression lhs = null; + if (parent instanceof AssignmentStatement assignment) { + if (assignment.lhsExpressions().size() != 1 || assignment.lhsExpressions().get(0).expressions().size() != 1) { + return false; + } + lhs = Expressions.removeParentheses(assignment.lhsExpressions().get(0).expressions().get(0)); + } else if (parent instanceof AnnotatedAssignment annotatedAssignment + && annotatedAssignment.assignedValue() == rhs) { + lhs = annotatedAssignment.variable(); + } + if (!(lhs instanceof QualifiedExpression qualifiedExpression)) { + return false; + } + Expression qualifier = Expressions.removeParentheses(qualifiedExpression.qualifier()); + return qualifier instanceof Name name && "self".equals(name.name()); + } + + private static boolean escapesViaName(SymbolV2 symbol) { + return symbol.usages().stream().anyMatch(usage -> + usage.kind() == UsageV2.Kind.GLOBAL_DECLARATION + || isReturnedUsage(usage) + || isPassedAsArgumentUsage(usage)); + } + + private static boolean isReturnedUsage(UsageV2 usage) { + return !usage.isBindingUsage() + && TreeUtils.firstAncestorOfKind(usage.tree(), Tree.Kind.RETURN_STMT) != null; + } + + private static boolean isPassedAsArgumentUsage(UsageV2 usage) { + if (usage.isBindingUsage()) { + return false; + } + for (Tree current = usage.tree().parent(); current != null; current = current.parent()) { + if (current instanceof RegularArgument) { + return true; + } + if (current.is(Tree.Kind.FUNCDEF, Tree.Kind.FILE_INPUT, Tree.Kind.CLASSDEF, Tree.Kind.LAMBDA)) { + return false; + } + } + return false; + } + + /** + * Accepts direct and parenthesized context-manager expressions in {@code with} headers. + * {@code ExitStack.enter_context(pytest.raises(...))} is not excluded yet because {@code ExitStack} is often unknown to type inference. + */ + private static boolean isUsedAsWithContextManager(CallExpression callExpression) { + return TreeUtils.firstAncestorOfKind(callExpression, Tree.Kind.WITH_ITEM) != null; + } + + /** + * Accepts {@code ctx = pytest.raises(...)} (including parenthesized RHS) when {@code ctx} is later used in a + * {@code with} statement. Assignment that is never used as a context manager is still reported. + */ + private static boolean isAssignedAndUsedInWith(CallExpression callExpression) { + return assignedName(callExpression) + .map(Name::symbolV2) + .filter(Objects::nonNull) + .filter(PytestRaisesContextManagerCheck::isUsedInWith) + .isPresent(); + } + + /** + * Accepts {@code pytest.raises(...)} nested in {@code @pytest.mark.parametrize} / {@code pytest.param} argvalues + * when the corresponding test parameter is used in a {@code with} statement. Raises values that are never used + * as a context manager (including a different parameter than the one used in {@code with}) are still reported. + */ + private static boolean isParametrizeInjectedAndUsedInWith(CallExpression raisesCall, SubscriptionContext ctx) { + CallExpression parametrizeCall = enclosingParametrizeCall(raisesCall, ctx); + if (parametrizeCall == null) { + return false; + } + FunctionDef functionDef = (FunctionDef) TreeUtils.firstAncestorOfKind(raisesCall, Tree.Kind.FUNCDEF); + if (functionDef == null) { + return false; + } + List argNames = parametrizeArgNames(parametrizeCall); + OptionalInt column = columnIndexInArgvalues(raisesCall, parametrizeCall); + if (column.isEmpty() || column.getAsInt() >= argNames.size()) { + return false; + } + return parameterSymbol(functionDef, argNames.get(column.getAsInt())) + .filter(PytestRaisesContextManagerCheck::isUsedInWith) + .isPresent(); + } + + private static CallExpression enclosingParametrizeCall(CallExpression raisesCall, SubscriptionContext ctx) { + Decorator decorator = (Decorator) TreeUtils.firstAncestorOfKind(raisesCall, Tree.Kind.DECORATOR); + if (decorator == null) { + return null; + } + Expression expression = decorator.expression(); + if (!(expression instanceof CallExpression parametrizeCall)) { + return null; + } + return PYTEST_PARAMETRIZE_MATCHER.isTrueFor(parametrizeCall.callee(), ctx) ? parametrizeCall : null; + } + + private static List parametrizeArgNames(CallExpression parametrizeCall) { + RegularArgument argNamesArgument = TreeUtils.nthArgumentOrKeyword(0, "argnames", parametrizeCall.arguments()); + if (argNamesArgument == null) { + return List.of(); + } + Expression expression = Expressions.removeParentheses(argNamesArgument.expression()); + if (expression instanceof StringLiteral stringLiteral) { + return Arrays.stream(stringLiteral.trimmedQuotesValue().split(",")) + .map(String::trim) + .filter(name -> !name.isEmpty()) + .toList(); + } + return Expressions.expressionsFromListOrTuple(expression).stream() + .map(Expressions::removeParentheses) + .filter(StringLiteral.class::isInstance) + .map(StringLiteral.class::cast) + .map(StringLiteral::trimmedQuotesValue) + .map(String::trim) + .filter(name -> !name.isEmpty()) + .toList(); + } + + private static OptionalInt columnIndexInArgvalues(CallExpression raisesCall, CallExpression parametrizeCall) { + RegularArgument argValuesArgument = TreeUtils.nthArgumentOrKeyword(1, "argvalues", parametrizeCall.arguments()); + if (argValuesArgument == null) { + return OptionalInt.empty(); + } + Expression argValues = Expressions.removeParentheses(argValuesArgument.expression()); + for (Expression row : Expressions.expressionsFromListOrTuple(argValues)) { + OptionalInt column = columnIndexInRow(raisesCall, Expressions.removeParentheses(row)); + if (column.isPresent()) { + return column; + } + } + return OptionalInt.empty(); + } + + private static OptionalInt columnIndexInRow(CallExpression raisesCall, Expression row) { + if (row == raisesCall) { + return OptionalInt.of(0); + } + List elements = Expressions.expressionsFromListOrTuple(row); + if (!elements.isEmpty()) { + return indexOfContainingExpression(raisesCall, elements); + } + return columnIndexInCallPositionalArguments(raisesCall, row); + } + + private static OptionalInt columnIndexInCallPositionalArguments(CallExpression raisesCall, Expression row) { + if (!(row instanceof CallExpression call)) { + return OptionalInt.empty(); + } + List positionalArguments = call.arguments().stream() + .map(PytestRaisesContextManagerCheck::positionalArgumentExpression) + .flatMap(Optional::stream) + .toList(); + return indexOfContainingExpression(raisesCall, positionalArguments); + } + + private static Optional positionalArgumentExpression(Argument argument) { + if (!(argument instanceof RegularArgument regularArgument) || regularArgument.keywordArgument() != null) { + return Optional.empty(); + } + return Optional.of(regularArgument.expression()); + } + + private static OptionalInt indexOfContainingExpression(CallExpression raisesCall, List expressions) { + for (int i = 0; i < expressions.size(); i++) { + if (expressionContains(expressions.get(i), raisesCall)) { + return OptionalInt.of(i); + } + } + return OptionalInt.empty(); + } + + private static boolean expressionContains(Expression expression, CallExpression raisesCall) { + Expression unwrapped = Expressions.removeParentheses(expression); + return unwrapped == raisesCall || TreeUtils.hasDescendant(unwrapped, tree -> tree == raisesCall); + } + + private static Optional parameterSymbol(FunctionDef functionDef, String paramName) { + ParameterList parameters = functionDef.parameters(); + if (parameters == null) { + return Optional.empty(); + } + return parameters.nonTuple().stream() + .map(Parameter::name) + .filter(Objects::nonNull) + .filter(name -> paramName.equals(name.name())) + .map(Name::symbolV2) + .filter(Objects::nonNull) + .findFirst(); + } + + private static Optional assignedName(CallExpression callExpression) { + Expression rhs = outermostParenthesized(callExpression); + Tree parent = rhs.parent(); + if (parent instanceof AssignmentStatement assignment) { + return singleAssignedName(assignment.lhsExpressions()); + } + if (parent instanceof AnnotatedAssignment annotatedAssignment + && annotatedAssignment.assignedValue() == rhs) { + Expression variable = annotatedAssignment.variable(); + return variable instanceof Name name ? Optional.of(name) : Optional.empty(); + } + return Optional.empty(); + } + + private static Expression outermostParenthesized(Expression expression) { + Expression current = expression; + while (current.parent() != null && current.parent().is(Tree.Kind.PARENTHESIZED)) { + current = (Expression) current.parent(); + } + return current; + } + + private static Optional singleAssignedName(List lhsExpressions) { + if (lhsExpressions.size() != 1 || lhsExpressions.get(0).expressions().size() != 1) { + return Optional.empty(); + } + Expression lhs = Expressions.removeParentheses(lhsExpressions.get(0).expressions().get(0)); + return lhs instanceof Name name ? Optional.of(name) : Optional.empty(); + } + + private static boolean isUsedInWith(SymbolV2 symbol) { + return symbol.usages().stream() + .filter(usage -> !usage.isBindingUsage()) + .map(UsageV2::tree) + .anyMatch(tree -> TreeUtils.firstAncestorOfKind(tree, Tree.Kind.WITH_ITEM) != null); + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9000.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9000.html new file mode 100644 index 000000000..177011789 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9000.html @@ -0,0 +1,112 @@ +

            This rule raises an issue when pytest.raises() is called without a with statement, including standalone calls, the +deprecated callable-passing form, and typos that call the function before entering the context manager.

            +

            In Python, this refers to the different usages of pytest.raises() without a with statement, such as:

            +
              +
            • Standalone calls such as pytest.raises(ValueError) that never wrap the code under test
            • +
            • The deprecated form pytest.raises(ExpectedError, func, *args, **kwargs) that passes a callable and its arguments
            • +
            • The typo pytest.raises(ExpectedError, func(*args, **kwargs)) that calls the function immediately and silently skips verification + when no exception is raised
            • +
            +

            Why is this an issue?

            +

            Pytest cannot verify the outcome if the code under test is not wrapped in a with pytest.raises(…​): block.

            +

            Standalone calls

            +

            pytest.raises(ValueError) without with constructs a context manager and discards it. The test passes even when the +following code does not raise:

            +
            +def test_invalid_input():
            +    pytest.raises(ValueError)
            +    process_data('hello')  # No exception — test still passes
            +
            +

            Deprecated callable-passing form

            +

            Pytest still supports passing the callable and its arguments:

            +
            +pytest.raises(ValueError, bootstrap_session, df=-1)  # Deprecated
            +
            +

            This executes bootstrap_session(df=-1) and fails when no exception is raised. It works, but pytest deprecates it. Refactoring this +form into a bare standalone call silently stops verifying exceptions.

            +

            Typo: calling the function immediately

            +

            A common mistake adds parentheses around the call:

            +
            +pytest.raises(NotImplementedError, bootstrap_session(df=10))  # Silent failure
            +
            +

            Here bootstrap_session runs before pytest.raises is entered. When df=10 is valid and no exception is raised, +pytest.raises receives the return value and the test passes without verifying anything.

            +

            Correct usage

            +
            +with pytest.raises(ValueError):
            +    bootstrap_session(df=-1)
            +
            +

            The with block must raise the expected exception, or the test fails.

            +

            What is the potential impact?

            +

            Tests that never enter the pytest.raises context manager can pass when no exception is raised, leaving error-handling regressions +undetected. Deprecated callable-passing syntax and the parenthesis typo are prone to silent breakage during refactors.

            +

            How to fix it

            +

            In Python with pytest, use with pytest.raises(ValueError): around the code that should fail.

            +

            Wrap the code that should raise with with pytest.raises(ExpectedError):. To inspect the exception, use as exc_info or the +match parameter.

            +

            Migrate deprecated callable-passing calls by moving the invocation into the with block.

            +

            Code examples

            +

            Noncompliant code example

            +
            +import pytest
            +
            +def process_data(data):
            +    return data.upper()
            +
            +def test_invalid_input():
            +    pytest.raises(ValueError)  # Noncompliant: context manager never entered
            +    process_data('hello')
            +
            +

            Compliant solution

            +
            +import pytest
            +
            +def process_data(data):
            +    return data.upper()
            +
            +def test_invalid_input():
            +    with pytest.raises(ValueError):
            +        process_data('hello')
            +
            +

            Noncompliant code example

            +
            +import pytest
            +
            +def bootstrap_session(df=10):
            +    if df <= 0:
            +        raise ValueError('df must be positive')
            +    if df > 20:
            +        raise NotImplementedError('df > 20 not supported')
            +
            +def test_invalid_df():
            +    pytest.raises(ValueError, bootstrap_session, df=-1)  # Noncompliant: deprecated form
            +
            +def test_unsupported_df():
            +    pytest.raises(NotImplementedError, bootstrap_session(df=10))  # Noncompliant: function called immediately
            +
            +

            Compliant solution

            +
            +import pytest
            +
            +def bootstrap_session(df=10):
            +    if df <= 0:
            +        raise ValueError('df must be positive')
            +    if df > 20:
            +        raise NotImplementedError('df > 20 not supported')
            +
            +def test_invalid_df():
            +    with pytest.raises(ValueError):
            +        bootstrap_session(df=-1)
            +
            +def test_unsupported_df():
            +    with pytest.raises(NotImplementedError):
            +        bootstrap_session(df=25)
            +
            +

            Resources

            +

            Documentation

            + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9000.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9000.json new file mode 100644 index 000000000..97950b453 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9000.json @@ -0,0 +1,25 @@ +{ + "title": "\"pytest.raises\" should be used as a context manager", + "type": "BUG", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "pytest", + "tests" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-9000", + "sqKey": "S9000", + "scope": "Tests", + "quickfix": "unknown", + "code": { + "impacts": { + "RELIABILITY": "MEDIUM", + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "LOGICAL" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index a837b5690..b7963e4c9 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -380,6 +380,7 @@ "S8997", "S8998", "S8999", + "S9000", "S9001" ] } diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/PytestRaisesContextManagerCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/PytestRaisesContextManagerCheckTest.java new file mode 100644 index 000000000..cd8fdc715 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/PytestRaisesContextManagerCheckTest.java @@ -0,0 +1,122 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import org.junit.jupiter.api.Test; +import org.sonar.plugins.python.api.PythonCheck; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.FunctionDef; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class PytestRaisesContextManagerCheckTest { + + @Test + void scope() { + assertEquals(PythonCheck.CheckScope.ALL, new PytestRaisesContextManagerCheck().scope()); + } + + @Test + void sample() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/pytestRaisesContextManager.py", new PytestRaisesContextManagerCheck()); + } + + /** + * Defensive coverage: {@code FunctionDef.parameters()} is null for some incomplete ASTs + * (e.g. lambda-like / synthetic trees). Real Python samples always produce a ParameterList, + * so this branch cannot be exercised via {@link #sample()}. + */ + @Test + void parameterSymbol_nullParameters() throws Exception { + Map config = new HashMap<>(); + config.put("kind", Tree.Kind.FUNCDEF); + config.put("parameters", null); + config.put("children", List.of()); + config.put("parent", null); + config.put("firstToken", null); + FunctionDef functionDef = proxy(FunctionDef.class, config); + Optional result = (Optional) invokePrivateStatic("parameterSymbol", + new Class[] {FunctionDef.class, String.class}, functionDef, "expectation"); + assertTrue(result.isEmpty()); + } + + /** + * Defensive coverage: early return when the call has no decorator ancestor + * ({@code enclosingParametrizeCall} is null). That path is not reachable through + * {@link #sample()} because the method is only invoked for calls already found under + * a parametrize decorator in normal analysis, but the null-check is still required. + */ + @Test + void isParametrizeInjectedAndUsedInWith_noDecoratorAncestor() throws Exception { + Map config = new HashMap<>(); + config.put("kind", Tree.Kind.CALL_EXPR); + config.put("children", List.of()); + config.put("parent", null); + config.put("firstToken", null); + config.put("arguments", List.of()); + CallExpression raisesCall = proxy(CallExpression.class, config); + boolean result = (boolean) invokePrivateStatic("isParametrizeInjectedAndUsedInWith", + new Class[] {CallExpression.class, org.sonar.plugins.python.api.SubscriptionContext.class}, + raisesCall, null); + assertFalse(result); + } + + private static Object invokePrivateStatic(String methodName, Class[] parameterTypes, Object... arguments) throws Exception { + Method method = PytestRaisesContextManagerCheck.class.getDeclaredMethod(methodName, parameterTypes); + method.setAccessible(true); + return method.invoke(null, arguments); + } + + private static T proxy(Class type, Map values) { + return type.cast(Proxy.newProxyInstance(type.getClassLoader(), new Class[] {type}, (proxy, method, args) -> { + String name = method.getName(); + if (values.containsKey(name)) { + return values.get(name); + } + if ("hashCode".equals(name)) { + return System.identityHashCode(proxy); + } + if ("equals".equals(name)) { + return proxy == args[0]; + } + if ("toString".equals(name)) { + return "proxy(" + type.getSimpleName() + ")"; + } + Class returnType = method.getReturnType(); + if (returnType.equals(boolean.class)) { + return false; + } + if (returnType.equals(int.class)) { + return 0; + } + if (List.class.isAssignableFrom(returnType)) { + return List.of(); + } + return null; + })); + } +} diff --git a/python-checks/src/test/resources/checks/tests/pytestRaisesContextManager.py b/python-checks/src/test/resources/checks/tests/pytestRaisesContextManager.py new file mode 100644 index 000000000..2f16a0177 --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/pytestRaisesContextManager.py @@ -0,0 +1,284 @@ +import contextlib + +import pytest +from pytest import raises as imported_raises + + +def process_data(data): + return data.upper() + + +def bootstrap_session(df=10): + if df <= 0: + raise ValueError('df must be positive') + if df > 20: + raise NotImplementedError('df > 20 not supported') + + +def test_standalone_raises(): + pytest.raises(ValueError) # Noncompliant {{Wrap the code that should raise with "with pytest.raises(ExpectedError)".}} + process_data('hello') + + +def test_deprecated_callable_passing_form(): + pytest.raises(ValueError, bootstrap_session, df=-1) # Noncompliant {{Wrap the code that should raise with "with pytest.raises(ExpectedError)".}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +def test_typo_calling_function_immediately(): + pytest.raises(NotImplementedError, bootstrap_session(df=10)) # Noncompliant {{Wrap the code that should raise with "with pytest.raises(ExpectedError)".}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +def test_compliant_with_block(): + with pytest.raises(ValueError): + process_data(123) + + +def test_compliant_with_block_and_match(): + with pytest.raises(ValueError, match="must be positive"): + bootstrap_session(df=-1) + + +def test_compliant_with_as_clause(): + with pytest.raises(ValueError) as exc_info: + bootstrap_session(df=-1) + assert "df must be positive" in str(exc_info.value) + + +def test_compliant_imported_raises(): + with imported_raises(ValueError): + process_data(123) + + +def test_noncompliant_imported_raises(): + imported_raises(ValueError, bootstrap_session, df=-1) # Noncompliant {{Wrap the code that should raise with "with pytest.raises(ExpectedError)".}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +def test_non_pytest_call(): + process_data('hello') + + +def test_compliant_parenthesized_with_block(): + with (pytest.raises(ValueError)): + process_data(123) + + +def test_compliant_saved_raises_reused_in_with(): + ctx = pytest.raises(ValueError) + with ctx: + process_data(123) + + +def test_compliant_saved_raises_reused_in_with_as(): + raises = pytest.raises(ValueError, match="must be positive") + with raises as exc_info: + bootstrap_session(df=-1) + assert "df must be positive" in str(exc_info.value) + + +def test_compliant_saved_raises_conditional_then_with(): + if True: + ctx = pytest.raises(TypeError, match="Invalid value") + else: + ctx = contextlib.nullcontext() + with ctx: + process_data(123) + + +def test_compliant_saved_parenthesized_raises_reused_in_with(): + ctx = (pytest.raises(ValueError)) + with ctx: + process_data(123) + + +def test_compliant_annotated_assignment_reused_in_with(): + ctx: object = pytest.raises(ValueError) + with ctx: + process_data(123) + + +def test_noncompliant_saved_raises_never_used_in_with(): + ctx = pytest.raises(ValueError) # Noncompliant {{Wrap the code that should raise with "with pytest.raises(ExpectedError)".}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^ + process_data('hello') + + +def test_noncompliant_chained_assignment_even_if_used_in_with(): + # Chained assignment is not tracked as a single saved context manager. + a = b = pytest.raises(ValueError) # Noncompliant {{Wrap the code that should raise with "with pytest.raises(ExpectedError)".}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^ + with a: + process_data(123) + + +def test_noncompliant_tuple_unpacking_assignment(): + ctx, other = pytest.raises(ValueError), None # Noncompliant {{Wrap the code that should raise with "with pytest.raises(ExpectedError)".}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^ + process_data('hello') + + +def test_noncompliant_attribute_assignment(): + holder = type('Holder', (), {})() + holder.ctx = pytest.raises(ValueError) # Noncompliant {{Wrap the code that should raise with "with pytest.raises(ExpectedError)".}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^ + process_data('hello') + + +@pytest.mark.parametrize( + "mode, expected_output, expectation", + [ + pytest.param( + None, + "out", + pytest.raises(ValueError), + id="raises injected via pytest.param", + ), + pytest.param( + None, + "out", + contextlib.nullcontext(), + id="nullcontext", + ), + ], +) +def test_compliant_parametrize_pytest_param_raises_used_in_with(mode, expected_output, expectation): + with expectation: + process_data(123) + + +@pytest.mark.parametrize( + "expectation", + [pytest.raises(ValueError)], +) +def test_compliant_parametrize_direct_raises_used_in_with(expectation): + with expectation: + process_data(123) + + +@pytest.mark.parametrize( + "x, expectation", + [(1, pytest.raises(ValueError))], +) +def test_compliant_parametrize_tuple_raises_used_in_with(x, expectation): + with expectation: + process_data(123) + + +@pytest.mark.parametrize( + ["expectation"], + [pytest.raises(TypeError)], +) +def test_compliant_parametrize_list_argnames_raises_used_in_with(expectation): + with expectation: + process_data(123) + + +@pytest.mark.parametrize( + "expectation", + [pytest.raises(ValueError)], # Noncompliant {{Wrap the code that should raise with "with pytest.raises(ExpectedError)".}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^ +) +def test_noncompliant_parametrize_raises_never_used_in_with(expectation): + process_data('hello') + + +@pytest.mark.parametrize( + "x, expectation, unused", + [ + pytest.param( + 1, + contextlib.nullcontext(), + pytest.raises(ValueError), # Noncompliant {{Wrap the code that should raise with "with pytest.raises(ExpectedError)".}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^ + ), + ], +) +def test_noncompliant_parametrize_raises_not_the_with_param(x, expectation, unused): + with expectation: + process_data(123) + + +@pytest.mark.parametrize( + "expectation", + [{pytest.raises(ValueError): None}], # Noncompliant {{Wrap the code that should raise with "with pytest.raises(ExpectedError)".}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^ +) +def test_noncompliant_parametrize_raises_in_unsupported_row_shape(expectation): + with expectation: + process_data(123) + + +@pytest.mark.parametrize(argvalues=[pytest.raises(ValueError)]) # Noncompliant {{Wrap the code that should raise with "with pytest.raises(ExpectedError)".}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^ +def test_noncompliant_parametrize_missing_argnames(expectation): + with expectation: + process_data(123) + + +@pytest.mark.parametrize(*["expectation", [pytest.raises(TypeError)]]) # Noncompliant {{Wrap the code that should raise with "with pytest.raises(ExpectedError)".}} +# ^^^^^^^^^^^^^^^^^^^^^^^^ +def test_noncompliant_parametrize_starred_args(expectation): + with expectation: + process_data(123) + + +@pytest.mark.parametrize( + "expectation,", + [pytest.raises(ValueError)], +) +def test_compliant_parametrize_argnames_trailing_comma(expectation): + with expectation: + process_data(123) + + +def test_noncompliant_annotated_attribute_assignment(): + holder = type('Holder', (), {})() + holder.ctx: object = pytest.raises(ValueError) # Noncompliant {{Wrap the code that should raise with "with pytest.raises(ExpectedError)".}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^ + process_data('hello') + + +def external_error_raised(expected_exception): + # Escapes via return for callers that use: with external_error_raised(...): + return pytest.raises(expected_exception, match=None) + + +def external_error_raised_parenthesized(expected_exception): + return (pytest.raises(expected_exception, match=None)) + + +def external_error_raised_via_local(expected_exception): + ctx = pytest.raises(expected_exception, match=None) + return ctx + + +_MODULE_RAISES = pytest.raises(ValueError) + + +def assign_raises_to_global(): + global _MODULE_RAISES + _MODULE_RAISES = pytest.raises(TypeError) + + +class RaisesHolder: + def store_raises_on_self(self): + self.ctx = pytest.raises(ValueError) + + def store_raises_on_self_annotated(self): + self.ctx: object = pytest.raises(ValueError) + + +def escapes_via_argument_to_other_call(expected_exception): + # Escapes as a call argument — caller may use it in with. + return process_data(pytest.raises(expected_exception, match=None)) + + +def escapes_via_direct_call_argument(expected_exception): + process_data(pytest.raises(expected_exception, match=None)) + + +def escapes_via_local_passed_as_argument(expected_exception): + ctx = pytest.raises(expected_exception, match=None) + process_data(ctx) From 1442ba729c02b4d22bbfa8d52dbd31a142fcaacb Mon Sep 17 00:00:00 2001 From: Daniel Teuchert <141642369+daniel-teuchert-sonarsource@users.noreply.github.com> Date: Fri, 17 Jul 2026 17:27:02 +0200 Subject: [PATCH 232/322] SONARPY-4399 Honor generic sonar.testFileHeuristic.disabled in Python test file classifier Co-authored-by: Claude Sonnet 4.6 (1M context) GitOrigin-RevId: 8fb4e10900f7f36dc7a0ec6bd31524f600e54dcc --- .../plugins/python/TestFileClassifier.java | 6 ++-- .../plugins/python/PythonSensorTest.java | 19 ----------- .../python/TestFileClassifierTest.java | 34 +++++++++++++++++++ 3 files changed, 37 insertions(+), 22 deletions(-) diff --git a/python-commons/src/main/java/org/sonar/plugins/python/TestFileClassifier.java b/python-commons/src/main/java/org/sonar/plugins/python/TestFileClassifier.java index ac0fd5dd5..80f3f175c 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/TestFileClassifier.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/TestFileClassifier.java @@ -28,6 +28,7 @@ import org.sonar.plugins.python.api.tree.ImportFrom; import org.sonar.plugins.python.api.tree.ImportName; import org.sonar.plugins.python.api.tree.Statement; +import static org.sonarsource.analyzer.commons.appsec.TestFileClassifier.HEURISTIC_DISABLED_KEY; import org.sonar.plugins.python.api.tree.StatementList; /** @@ -51,9 +52,8 @@ private TestFileClassifier() { */ public static boolean isTestSourceConfigured(Configuration config) { return isPropertyConfigured(config, "sonar.tests") - || isPropertyConfigured(config, "sonar.test.inclusions") - || isPropertyConfigured(config, "sonar.test.exclusions") - || config.getBoolean("sonar.python.testFileHeuristic.disabled").orElse(false); + || config.getBoolean("sonar.python.testFileHeuristic.disabled").orElse(false) + || config.getBoolean(HEURISTIC_DISABLED_KEY).orElse(false); } private static boolean isPropertyConfigured(Configuration config, String key) { diff --git a/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java index 62cb57dfc..c952e6c48 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java @@ -653,8 +653,6 @@ void test_auto_reclassify_filename_heuristic_suppresses_main_rules() { @ParameterizedTest @CsvSource({ "sonar.tests, tests", - "sonar.test.inclusions, tests/**", - "sonar.test.exclusions, tests/generated/**", "sonar.python.testFileHeuristic.disabled, true" }) void test_auto_reclassify_bypassed_when_test_source_configured(String property, String value) { @@ -690,23 +688,6 @@ void test_auto_reclassify_not_bypassed_by_blank_sonar_tests() { verify(analysisWarning).addUnique(PythonScanner.UNSET_SONAR_TESTS_WARNING); } - @Test - void test_auto_reclassify_not_bypassed_by_blank_sonar_test_inclusions() { - // blank sonar.test.inclusions is treated as "not configured" — same as not setting it - activeRules = new ActiveRulesBuilder() - .addRule(new NewActiveRule.Builder() - .setRuleKey(RuleKey.of(PythonRuleRepository.REPOSITORY_KEY, "S1226")) - .build()) - .build(); - - context.setSettings(new MapSettings().setProperty("sonar.test.inclusions", "")); - inputFile(FILE_TEST_FILE, Type.MAIN); - sensor().execute(context); - - assertThat(context.allIssues()).isEmpty(); - verify(analysisWarning).addUnique(PythonScanner.UNSET_SONAR_TESTS_WARNING); - } - @Test void test_auto_reclassify_path_directory_heuristic() { // File inside a `tests/` directory classified as MAIN → heuristic fires, S1226 suppressed diff --git a/python-commons/src/test/java/org/sonar/plugins/python/TestFileClassifierTest.java b/python-commons/src/test/java/org/sonar/plugins/python/TestFileClassifierTest.java index 7b223c56b..375fed964 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/TestFileClassifierTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/TestFileClassifierTest.java @@ -16,17 +16,51 @@ */ package org.sonar.plugins.python; +import java.util.Optional; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import org.sonar.api.config.Configuration; import org.sonar.plugins.python.api.tree.FileInput; import org.sonar.python.parser.PythonParser; import org.sonar.python.tree.PythonTreeMaker; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import static org.sonarsource.analyzer.commons.appsec.TestFileClassifier.HEURISTIC_DISABLED_KEY; class TestFileClassifierTest { + // --- isTestSourceConfigured --- + + @Test + void isTestSourceConfigured_returns_false_for_empty_config() { + var config = mock(Configuration.class); + when(config.get(anyString())).thenReturn(Optional.empty()); + when(config.getBoolean(anyString())).thenReturn(Optional.empty()); + assertThat(TestFileClassifier.isTestSourceConfigured(config)).isFalse(); + } + + @Test + void isTestSourceConfigured_returns_true_for_python_specific_key() { + var config = mock(Configuration.class); + when(config.get(anyString())).thenReturn(Optional.empty()); + when(config.getBoolean(anyString())).thenReturn(Optional.empty()); + when(config.getBoolean("sonar.python.testFileHeuristic.disabled")).thenReturn(Optional.of(true)); + assertThat(TestFileClassifier.isTestSourceConfigured(config)).isTrue(); + } + + @Test + void isTestSourceConfigured_returns_true_for_generic_heuristic_disabled_key() { + var config = mock(Configuration.class); + when(config.get(anyString())).thenReturn(Optional.empty()); + when(config.getBoolean(anyString())).thenReturn(Optional.empty()); + when(config.getBoolean(HEURISTIC_DISABLED_KEY)).thenReturn(Optional.of(true)); + assertThat(TestFileClassifier.isTestSourceConfigured(config)).isTrue(); + } + // --- looksLikeTestFileByPath --- @Test From 6b358f103ea5cab0e4ff8a8a06fc2d8c515a10fa Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 17 Jul 2026 17:22:20 +0000 Subject: [PATCH 233/322] Update sonar.orchestrator.version Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Victor Diez GitOrigin-RevId: 1f65d73463191c6b7d227b44aaf722cde6259d06 --- override-dep-licenses.properties | 2 +- pom.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/override-dep-licenses.properties b/override-dep-licenses.properties index a29c0aa36..9b5b7c549 100644 --- a/override-dep-licenses.properties +++ b/override-dep-licenses.properties @@ -4,4 +4,4 @@ com.google.code.gson--gson--2.11.0=apache_v2 commons-io--commons-io--2.17.0=apache_v2 com.github.spotbugs=apache_v2 info.picocli--picocli--4.7.5=apache_v2 -org.codehaus.woodstox--stax2-api--4.2.2=bsd +org.codehaus.woodstox--stax2-api--4.3.0=bsd diff --git a/pom.xml b/pom.xml index 73a8c9a92..8d89cc4ec 100644 --- a/pom.xml +++ b/pom.xml @@ -90,7 +90,7 @@ 3.20.0 1.15.0 3.27.7 - 6.1.1 + 6.1.2 1.5.38 2.0.18 2.2.1 @@ -103,7 +103,7 @@ 26.7.0.124771 13.8.0.4399 13.4.1.4007 - 6.3.0.4464 + 6.3.1.4538 2.27.0.5007 its/**,private/its-enterprise/**,python-frontend/typeshed_serializer/**,**/test/resources/** From 5b1b9e786f71e03a17fd863f397d29e49182f48a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 17 Jul 2026 17:41:58 +0000 Subject: [PATCH 234/322] Update sonar-analyzer-commons.version to v2.28.0.5085 Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> GitOrigin-RevId: 8226f1f245237c022d85c34b7f96642fee2b1ac1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8d89cc4ec..0082a220c 100644 --- a/pom.xml +++ b/pom.xml @@ -104,7 +104,7 @@ 13.8.0.4399 13.4.1.4007 6.3.1.4538 - 2.27.0.5007 + 2.28.0.5085 its/**,private/its-enterprise/**,python-frontend/typeshed_serializer/**,**/test/resources/** From 672235f8fc6bfd1eefeb9f22bd3336670cabe4f1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 17 Jul 2026 20:22:21 +0200 Subject: [PATCH 235/322] Update peter-evans/create-pull-request action to v8.1.1 Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Victor Diez GitOrigin-RevId: 34755a84909e91184e7b4acc972327d0df1ae2aa --- .../src/test/resources/checks/regex/invalidRegexCheck.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python-checks/src/test/resources/checks/regex/invalidRegexCheck.py b/python-checks/src/test/resources/checks/regex/invalidRegexCheck.py index 0812baa5f..11ef566ed 100644 --- a/python-checks/src/test/resources/checks/regex/invalidRegexCheck.py +++ b/python-checks/src/test/resources/checks/regex/invalidRegexCheck.py @@ -29,4 +29,4 @@ def false_positives(): (?P.*?) \] ''', re.X | re.S) - # Noncompliant@-5 + # Fixed in analyzer-commons 2.28 From 3cee1248c491b55f676024003ff45f43b8393fe8 Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Mon, 20 Jul 2026 09:33:33 +0200 Subject: [PATCH 236/322] SONARPY-4379 S8993: ignore dynamic f-strings in getfixturevalue GitOrigin-RevId: b8e68392984117ebbadba7d7954578383ac7d454 --- .../tests/FixtureParamDependenciesCheck.java | 26 ++++++++++++++++++- .../tests/fixtureParamDependencies_test.py | 20 +++++++++++++- 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/FixtureParamDependenciesCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/FixtureParamDependenciesCheck.java index 2f14ff153..6c355ab63 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/FixtureParamDependenciesCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/FixtureParamDependenciesCheck.java @@ -24,10 +24,14 @@ import org.sonar.plugins.python.api.tree.Decorator; import org.sonar.plugins.python.api.tree.Expression; import org.sonar.plugins.python.api.tree.FunctionDef; +import org.sonar.plugins.python.api.tree.Name; import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.StringElement; +import org.sonar.plugins.python.api.tree.StringLiteral; import org.sonar.plugins.python.api.tree.Tree; import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.checks.utils.Expressions; import org.sonar.python.checks.utils.UnittestUtils; import org.sonar.python.semantic.v2.typeshed.TypeShedConstants; import org.sonar.python.tree.TreeUtils; @@ -60,13 +64,33 @@ private static void checkCallExpression(SubscriptionContext ctx) { } Expression fixtureNameExpression = fixtureNameArgument(callExpression); - if (fixtureNameExpression == null || !fixtureNameExpression.is(Tree.Kind.STRING_LITERAL)) { + if (fixtureNameExpression == null || !isStaticFixtureName(fixtureNameExpression)) { return; } ctx.addIssue(fixtureNameExpression, MESSAGE); } + /** + * True only for plain string literals, useless f-strings (no replacement fields), or names that + * resolve to such a constant. Interpolated f-strings and other dynamic expressions are ignored. + */ + private static boolean isStaticFixtureName(Expression expression) { + Expression unwrapped = Expressions.removeParentheses(expression); + if (unwrapped instanceof Name name) { + Expression assignedValue = Expressions.singleAssignedValue(name); + return assignedValue != null && isStaticFixtureName(assignedValue); + } + if (!(unwrapped instanceof StringLiteral stringLiteral)) { + return false; + } + return stringLiteral.stringElements().stream().noneMatch(FixtureParamDependenciesCheck::isDynamicallyInterpolated); + } + + private static boolean isDynamicallyInterpolated(StringElement stringElement) { + return stringElement.isInterpolated() && !stringElement.formattedExpressions().isEmpty(); + } + private static boolean isCollectedTestFunction(SubscriptionContext ctx, FunctionDef functionDef) { if (isPytestFixture(functionDef, ctx)) { return false; diff --git a/python-checks/src/test/resources/checks/tests/fixtureParamDependencies_test.py b/python-checks/src/test/resources/checks/tests/fixtureParamDependencies_test.py index 4a3fc4005..b1e2220f0 100644 --- a/python-checks/src/test/resources/checks/tests/fixtureParamDependencies_test.py +++ b/python-checks/src/test/resources/checks/tests/fixtureParamDependencies_test.py @@ -62,10 +62,28 @@ def test_matrix(request, fixture_name): def test_dynamic_fixture_name(request): name = 'database' - fixture = request.getfixturevalue(name) + fixture = request.getfixturevalue(name) # Noncompliant {{Declare this fixture as a test function parameter instead of using "request.getfixturevalue()" with a string literal.}} +# ^^^^ assert fixture is not None +def test_interpolated_fstring(request): + key = "users" + request.getfixturevalue(f"pub_{key}") + request.getfixturevalue(f"sig_{key}") + + +def test_useless_fstring(request): + request.getfixturevalue(f"database") # Noncompliant {{Declare this fixture as a test function parameter instead of using "request.getfixturevalue()" with a string literal.}} +# ^^^^^^^^^^^ + + +def test_format_and_percent_strings(request): + key = "users" + request.getfixturevalue("pub_{}".format(key)) + request.getfixturevalue("pub_%s" % key) + + def helper_not_a_test(request): request.getfixturevalue('database') From de5b309c3c053dc1dec530d470b9eebdcf40b91d Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Mon, 20 Jul 2026 10:06:59 +0200 Subject: [PATCH 237/322] SONARPY-4383 Improve S9000 issue message GitOrigin-RevId: 178661343c50c4fb8cd699264a965fb44070495b --- .../PytestRaisesContextManagerCheck.java | 2 +- .../tests/pytestRaisesContextManager.py | 28 +++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/PytestRaisesContextManagerCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/PytestRaisesContextManagerCheck.java index f4aed809c..320ab7778 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/PytestRaisesContextManagerCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/PytestRaisesContextManagerCheck.java @@ -49,7 +49,7 @@ @Rule(key = "S9000") public class PytestRaisesContextManagerCheck extends PythonSubscriptionCheck { - private static final String MESSAGE = "Wrap the code that should raise with \"with pytest.raises(ExpectedError)\"."; + private static final String MESSAGE = "Prefer the context manager form: wrap the raising code in \"with pytest.raises(...)\"."; private static final TypeMatcher PYTEST_PARAMETRIZE_MATCHER = TypeMatchers.withFQN("pytest.mark.parametrize"); @Override diff --git a/python-checks/src/test/resources/checks/tests/pytestRaisesContextManager.py b/python-checks/src/test/resources/checks/tests/pytestRaisesContextManager.py index 2f16a0177..76f842ae6 100644 --- a/python-checks/src/test/resources/checks/tests/pytestRaisesContextManager.py +++ b/python-checks/src/test/resources/checks/tests/pytestRaisesContextManager.py @@ -16,17 +16,17 @@ def bootstrap_session(df=10): def test_standalone_raises(): - pytest.raises(ValueError) # Noncompliant {{Wrap the code that should raise with "with pytest.raises(ExpectedError)".}} + pytest.raises(ValueError) # Noncompliant {{Prefer the context manager form: wrap the raising code in "with pytest.raises(...)".}} process_data('hello') def test_deprecated_callable_passing_form(): - pytest.raises(ValueError, bootstrap_session, df=-1) # Noncompliant {{Wrap the code that should raise with "with pytest.raises(ExpectedError)".}} + pytest.raises(ValueError, bootstrap_session, df=-1) # Noncompliant {{Prefer the context manager form: wrap the raising code in "with pytest.raises(...)".}} # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ def test_typo_calling_function_immediately(): - pytest.raises(NotImplementedError, bootstrap_session(df=10)) # Noncompliant {{Wrap the code that should raise with "with pytest.raises(ExpectedError)".}} + pytest.raises(NotImplementedError, bootstrap_session(df=10)) # Noncompliant {{Prefer the context manager form: wrap the raising code in "with pytest.raises(...)".}} # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -52,7 +52,7 @@ def test_compliant_imported_raises(): def test_noncompliant_imported_raises(): - imported_raises(ValueError, bootstrap_session, df=-1) # Noncompliant {{Wrap the code that should raise with "with pytest.raises(ExpectedError)".}} + imported_raises(ValueError, bootstrap_session, df=-1) # Noncompliant {{Prefer the context manager form: wrap the raising code in "with pytest.raises(...)".}} # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -100,28 +100,28 @@ def test_compliant_annotated_assignment_reused_in_with(): def test_noncompliant_saved_raises_never_used_in_with(): - ctx = pytest.raises(ValueError) # Noncompliant {{Wrap the code that should raise with "with pytest.raises(ExpectedError)".}} + ctx = pytest.raises(ValueError) # Noncompliant {{Prefer the context manager form: wrap the raising code in "with pytest.raises(...)".}} # ^^^^^^^^^^^^^^^^^^^^^^^^^ process_data('hello') def test_noncompliant_chained_assignment_even_if_used_in_with(): # Chained assignment is not tracked as a single saved context manager. - a = b = pytest.raises(ValueError) # Noncompliant {{Wrap the code that should raise with "with pytest.raises(ExpectedError)".}} + a = b = pytest.raises(ValueError) # Noncompliant {{Prefer the context manager form: wrap the raising code in "with pytest.raises(...)".}} # ^^^^^^^^^^^^^^^^^^^^^^^^^ with a: process_data(123) def test_noncompliant_tuple_unpacking_assignment(): - ctx, other = pytest.raises(ValueError), None # Noncompliant {{Wrap the code that should raise with "with pytest.raises(ExpectedError)".}} + ctx, other = pytest.raises(ValueError), None # Noncompliant {{Prefer the context manager form: wrap the raising code in "with pytest.raises(...)".}} # ^^^^^^^^^^^^^^^^^^^^^^^^^ process_data('hello') def test_noncompliant_attribute_assignment(): holder = type('Holder', (), {})() - holder.ctx = pytest.raises(ValueError) # Noncompliant {{Wrap the code that should raise with "with pytest.raises(ExpectedError)".}} + holder.ctx = pytest.raises(ValueError) # Noncompliant {{Prefer the context manager form: wrap the raising code in "with pytest.raises(...)".}} # ^^^^^^^^^^^^^^^^^^^^^^^^^ process_data('hello') @@ -177,7 +177,7 @@ def test_compliant_parametrize_list_argnames_raises_used_in_with(expectation): @pytest.mark.parametrize( "expectation", - [pytest.raises(ValueError)], # Noncompliant {{Wrap the code that should raise with "with pytest.raises(ExpectedError)".}} + [pytest.raises(ValueError)], # Noncompliant {{Prefer the context manager form: wrap the raising code in "with pytest.raises(...)".}} # ^^^^^^^^^^^^^^^^^^^^^^^^^ ) def test_noncompliant_parametrize_raises_never_used_in_with(expectation): @@ -190,7 +190,7 @@ def test_noncompliant_parametrize_raises_never_used_in_with(expectation): pytest.param( 1, contextlib.nullcontext(), - pytest.raises(ValueError), # Noncompliant {{Wrap the code that should raise with "with pytest.raises(ExpectedError)".}} + pytest.raises(ValueError), # Noncompliant {{Prefer the context manager form: wrap the raising code in "with pytest.raises(...)".}} # ^^^^^^^^^^^^^^^^^^^^^^^^^ ), ], @@ -202,7 +202,7 @@ def test_noncompliant_parametrize_raises_not_the_with_param(x, expectation, unus @pytest.mark.parametrize( "expectation", - [{pytest.raises(ValueError): None}], # Noncompliant {{Wrap the code that should raise with "with pytest.raises(ExpectedError)".}} + [{pytest.raises(ValueError): None}], # Noncompliant {{Prefer the context manager form: wrap the raising code in "with pytest.raises(...)".}} # ^^^^^^^^^^^^^^^^^^^^^^^^^ ) def test_noncompliant_parametrize_raises_in_unsupported_row_shape(expectation): @@ -210,14 +210,14 @@ def test_noncompliant_parametrize_raises_in_unsupported_row_shape(expectation): process_data(123) -@pytest.mark.parametrize(argvalues=[pytest.raises(ValueError)]) # Noncompliant {{Wrap the code that should raise with "with pytest.raises(ExpectedError)".}} +@pytest.mark.parametrize(argvalues=[pytest.raises(ValueError)]) # Noncompliant {{Prefer the context manager form: wrap the raising code in "with pytest.raises(...)".}} # ^^^^^^^^^^^^^^^^^^^^^^^^^ def test_noncompliant_parametrize_missing_argnames(expectation): with expectation: process_data(123) -@pytest.mark.parametrize(*["expectation", [pytest.raises(TypeError)]]) # Noncompliant {{Wrap the code that should raise with "with pytest.raises(ExpectedError)".}} +@pytest.mark.parametrize(*["expectation", [pytest.raises(TypeError)]]) # Noncompliant {{Prefer the context manager form: wrap the raising code in "with pytest.raises(...)".}} # ^^^^^^^^^^^^^^^^^^^^^^^^ def test_noncompliant_parametrize_starred_args(expectation): with expectation: @@ -235,7 +235,7 @@ def test_compliant_parametrize_argnames_trailing_comma(expectation): def test_noncompliant_annotated_attribute_assignment(): holder = type('Holder', (), {})() - holder.ctx: object = pytest.raises(ValueError) # Noncompliant {{Wrap the code that should raise with "with pytest.raises(ExpectedError)".}} + holder.ctx: object = pytest.raises(ValueError) # Noncompliant {{Prefer the context manager form: wrap the raising code in "with pytest.raises(...)".}} # ^^^^^^^^^^^^^^^^^^^^^^^^^ process_data('hello') From 6f58a897e32fc5ea5b770343e25ddf50bdcded35 Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Mon, 20 Jul 2026 10:07:15 +0200 Subject: [PATCH 238/322] SONARPY-4302 Improve S5958 issue message GitOrigin-RevId: acb639738d64f198e13870765ac9ee91464c997a --- .../tests/SpecificExceptionAssertionCheck.java | 2 +- .../checks/tests/specificExceptionAssertion.py | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/SpecificExceptionAssertionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/SpecificExceptionAssertionCheck.java index b4c103c3c..55dd1d772 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/SpecificExceptionAssertionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/SpecificExceptionAssertionCheck.java @@ -35,7 +35,7 @@ @Rule(key = "S5958") public class SpecificExceptionAssertionCheck extends PythonSubscriptionCheck { - private static final String MESSAGE = "Specify a more specific exception type here."; + private static final String MESSAGE = "This assertion is too broad; use a more specific exception type or check the exception message."; private static final TypeMatcher GENERIC_EXCEPTION_MATCHER = TypeMatchers.any( TypeMatchers.isObjectOfType(EXCEPTION), TypeMatchers.isObjectOfType(BASE_EXCEPTION), diff --git a/python-checks/src/test/resources/checks/tests/specificExceptionAssertion.py b/python-checks/src/test/resources/checks/tests/specificExceptionAssertion.py index aeffe614a..166a8cae1 100644 --- a/python-checks/src/test/resources/checks/tests/specificExceptionAssertion.py +++ b/python-checks/src/test/resources/checks/tests/specificExceptionAssertion.py @@ -28,25 +28,25 @@ def __exit__(self, exc_type, exc, tb): def test_pytest_raises_exception(): - with pytest.raises(Exception): # Noncompliant {{Specify a more specific exception type here.}} + with pytest.raises(Exception): # Noncompliant {{This assertion is too broad; use a more specific exception type or check the exception message.}} # ^^^^^^^^^ explode() def test_pytest_raises_base_exception(): - with pytest.raises(BaseException): # Noncompliant {{Specify a more specific exception type here.}} + with pytest.raises(BaseException): # Noncompliant {{This assertion is too broad; use a more specific exception type or check the exception message.}} # ^^^^^^^^^^^^^ explode() def test_pytest_raises_expected_exception_keyword(): - with pytest.raises(expected_exception=Exception): # Noncompliant {{Specify a more specific exception type here.}} + with pytest.raises(expected_exception=Exception): # Noncompliant {{This assertion is too broad; use a more specific exception type or check the exception message.}} # ^^^^^^^^^ explode() def test_pytest_imported_raises(): - with imported_raises(Exception): # Noncompliant {{Specify a more specific exception type here.}} + with imported_raises(Exception): # Noncompliant {{This assertion is too broad; use a more specific exception type or check the exception message.}} # ^^^^^^^^^ explode() @@ -67,12 +67,12 @@ def test_pytest_raises_generic_exception_with_match(): def test_pytest_direct_raises_exception(): - pytest.raises(Exception, explode) # Noncompliant {{Specify a more specific exception type here.}} + pytest.raises(Exception, explode) # Noncompliant {{This assertion is too broad; use a more specific exception type or check the exception message.}} # ^^^^^^^^^ def test_pytest_direct_imported_raises_exception(): - imported_raises(BaseException, explode) # Noncompliant {{Specify a more specific exception type here.}} + imported_raises(BaseException, explode) # Noncompliant {{This assertion is too broad; use a more specific exception type or check the exception message.}} # ^^^^^^^^^^^^^ @@ -93,12 +93,12 @@ def test_raise_qualifier_named_cls_parameter(cls): class MyTest(unittest.TestCase): def test_unittest_assert_raises_exception(self): - with self.assertRaises(Exception): # Noncompliant {{Specify a more specific exception type here.}} + with self.assertRaises(Exception): # Noncompliant {{This assertion is too broad; use a more specific exception type or check the exception message.}} # ^^^^^^^^^ explode() def test_unittest_assert_raises_base_exception(self): - with self.assertRaises(BaseException): # Noncompliant {{Specify a more specific exception type here.}} + with self.assertRaises(BaseException): # Noncompliant {{This assertion is too broad; use a more specific exception type or check the exception message.}} # ^^^^^^^^^^^^^ explode() @@ -123,7 +123,7 @@ def test_unittest_assert_raises_custom_exception(self): raise_custom_exception() def test_unittest_direct_assert_raises_exception(self): - self.assertRaises(Exception, explode) # Noncompliant {{Specify a more specific exception type here.}} + self.assertRaises(Exception, explode) # Noncompliant {{This assertion is too broad; use a more specific exception type or check the exception message.}} # ^^^^^^^^^ def test_unittest_direct_assert_raises_regex_exception(self): From 0b2b6f7a10aadf9d7718c38260db8993ee274144 Mon Sep 17 00:00:00 2001 From: Mostafa Mohammed Date: Mon, 20 Jul 2026 10:33:54 +0200 Subject: [PATCH 239/322] SONARPY-3944 Correct license headers Co-authored-by: Mallow GitOrigin-RevId: a5c8ac13016bd68949658ea333e358cefcda2ebf --- tools/validate_licenses.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/validate_licenses.py b/tools/validate_licenses.py index 5d53b8630..eb5fd48e6 100644 --- a/tools/validate_licenses.py +++ b/tools/validate_licenses.py @@ -2,11 +2,11 @@ # # SonarQube Python Plugin -# Copyright (C) 2011-2025 SonarSource SA +# Copyright (C) SonarSource Sàrl # mailto:info AT sonarsource DOT com # # This program is free software; you can redistribute it and/or -# modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA. +# modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of From 18aa2e61d7810b67742f3dac9ab530f79dc0c54e Mon Sep 17 00:00:00 2001 From: Mostafa Mohammed Date: Mon, 20 Jul 2026 14:40:50 +0200 Subject: [PATCH 240/322] SONARPY-4311 Extract inline mock creation in TypeMatcher tests GitOrigin-RevId: 47808684c1ddc5df117442ab0ea1be12217eb774 --- .../python/api/types/v2/matchers/TypeMatcherImplTest.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/matchers/TypeMatcherImplTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/matchers/TypeMatcherImplTest.java index 72ee4b31a..f8f3a25f7 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/matchers/TypeMatcherImplTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/types/v2/matchers/TypeMatcherImplTest.java @@ -110,7 +110,8 @@ void prepare() { @Test void testIsFor() { SubscriptionContext ctx = mock(); - when(ctx.typeTable()).thenReturn(mock(TypeTable.class)); + TypeTable typeTable = mock(); + when(ctx.typeTable()).thenReturn(typeTable); assertThat(typeMatcher.evaluateFor(functionExpr, ctx)).isEqualTo(TriBool.TRUE); assertThat(typeMatcher.evaluateFor(unknownExpr, ctx)).isEqualTo(TriBool.UNKNOWN); assertThat(typeMatcher.evaluateFor(objectExpr, ctx)).isEqualTo(TriBool.FALSE); @@ -123,7 +124,8 @@ void testIsFor() { @Test void testIsTrueFor() { SubscriptionContext ctx = mock(SubscriptionContext.class); - when(ctx.typeTable()).thenReturn(mock(TypeTable.class)); + TypeTable typeTable = mock(); + when(ctx.typeTable()).thenReturn(typeTable); assertThat(typeMatcher.isTrueFor(functionExpr, ctx)).isTrue(); assertThat(typeMatcher.isTrueFor(unknownExpr, ctx)).isFalse(); assertThat(typeMatcher.isTrueFor(objectExpr, ctx)).isFalse(); From a5c370180f684d814396a254d7441dcfca377c23 Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Mon, 20 Jul 2026 15:30:45 +0200 Subject: [PATCH 241/322] SONARPY-4312 remove S2187 from sonar-way GitOrigin-RevId: db33c1a691af4010457ac67c714d1795440666c1 --- .../org/sonar/l10n/py/rules/python/Sonar_way_profile.json | 1 - sonarpedia.json | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index b7963e4c9..cb9cf2d4f 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -51,7 +51,6 @@ "S2092", "S2115", "S2159", - "S2187", "S2190", "S2201", "S2208", diff --git a/sonarpedia.json b/sonarpedia.json index 2322795bb..abbea2561 100644 --- a/sonarpedia.json +++ b/sonarpedia.json @@ -3,7 +3,7 @@ "languages": [ "PY" ], - "latest-update": "2026-07-10T06:57:15.476735Z", + "latest-update": "2026-07-20T12:52:40.248870Z", "options": { "no-language-in-filenames": true, "preserve-filenames": true From 8677fd7febc7eb1b42515596444ba40b09acf90e Mon Sep 17 00:00:00 2001 From: Lijun Chen Date: Tue, 21 Jul 2026 11:03:53 +0200 Subject: [PATCH 242/322] SONARPY-4352 Update rule metadata GitOrigin-RevId: cc66dd3bed04c3c8980933322e451294db691df7 --- .../org/sonar/l10n/py/rules/python/S8411.html | 49 ++++++++++--------- .../org/sonar/l10n/py/rules/python/S8411.json | 6 +-- .../org/sonar/l10n/py/rules/python/S8978.html | 33 ++++++++++++- .../org/sonar/l10n/py/rules/python/S8978.json | 2 +- .../org/sonar/l10n/py/rules/python/S8993.html | 28 ++++++++--- .../org/sonar/l10n/py/rules/python/S8994.html | 9 +++- .../org/sonar/l10n/py/rules/python/S8997.html | 39 +++++++++++++-- .../org/sonar/l10n/py/rules/python/S8999.html | 1 + .../org/sonar/l10n/py/rules/python/S8999.json | 20 ++++++-- sonarpedia.json | 2 +- 10 files changed, 145 insertions(+), 44 deletions(-) diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8411.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8411.html index cdc9d753d..e3f4bf3f9 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8411.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8411.html @@ -1,39 +1,44 @@ -

            This is an issue when a FastAPI route decorator declares path parameters (e.g., @app.get("/items/{item_id}")) but the corresponding -function signature does not include those parameters as arguments. It is also an issue when path parameters are declared as positional-only arguments -(using / in the signature).

            +

            This is an issue when a FastAPI route decorator declares path parameters (e.g., @app.get("/items/{item_id}")) but neither the route +handler, called a path operation function in FastAPI, nor its dependencies declare those parameters as arguments. It is also an issue when path +parameters are declared as positional-only arguments (using / in the signature).

            Why is this an issue?

            FastAPI is a modern web framework that uses Python type hints and function signatures to automatically extract, validate, and inject request -parameters into route handler functions. When you define a route with path parameters in the decorator (e.g., -@app.get("/items/{item_id}")), FastAPI expects these parameters to be present in the function signature.

            +parameters into route handlers and dependencies. FastAPI injects path values only into parameters with matching names declared by the path operation +function or by one of its dependencies.

            Path parameters are segments of the URL path that are used to identify specific resources. For example, in the route /items/{item_id}, the item_id is a path parameter that would capture values like 123 from a request to /items/123.

            -

            The framework works by inspecting the function signature at startup and creating a mapping between the route path parameters and the function -arguments. When a request comes in, FastAPI extracts the values from the URL path and injects them into the function call.

            -

            When path parameters are missing from the function signature, several problems occur:

            +

            The framework works by inspecting function signatures at startup and creating a mapping between route path parameters and path operation function +or dependency parameters. When a request comes in, FastAPI extracts the values from the URL path and injects them into matching parameters by +name.

            +

            When path parameters are not declared by the path operation function or its dependencies, several problems can occur:

              -
            • The parameter values cannot be accessed in the function body, making it impossible to use them for business logic
            • -
            • FastAPI cannot perform automatic validation and type conversion on the parameter
            • -
            • The application will raise a runtime error when the route is accessed
            • +
            • The route contract may require a path value that the application code never consumes
            • +
            • A misspelled or mismatched function parameter may be treated and validated as a query parameter instead of receiving the path value
            • +
            • If the mismatched parameter has a default value, the endpoint may silently ignore the path value
            • The mismatch between the route definition and function signature indicates a programming error

            Additionally, if a path parameter is declared as a positional-only argument (using / in the function signature), FastAPI cannot inject it because the framework uses keyword arguments for parameter injection. This is a subtle but important constraint of how FastAPI’s dependency injection system works.

            -

            This type of error is particularly problematic because it may not be caught during development if the specific route is not tested, leading to -runtime failures in production.

            +

            This type of error is problematic because it may not be caught during development if the specific route is not tested, leading to validation errors +or incorrect endpoint behavior in production.

            What is the potential impact?

            -

            When path parameters are missing from the function signature, the application will fail at runtime when the route is accessed. This causes:

            +

            When path parameters are not declared by the path operation function or its dependencies, the endpoint contract no longer matches the code that +handles the request. This can cause:

              -
            • Service disruption: The endpoint becomes completely non-functional, returning HTTP 500 errors to clients
            • -
            • Poor user experience: Users receive error responses instead of the expected data or functionality
            • -
            • Debugging difficulty: The error may not be immediately obvious, especially if the route is not covered by tests
            • -
            • Maintenance burden: Developers must spend time investigating and fixing runtime errors that could have been prevented
            • +
            • Request validation errors: A wrongly named parameter may be interpreted as a required query parameter instead of the intended + path parameter
            • +
            • Incorrect behavior: The endpoint may ignore the value from the URL path and use a default value or unrelated input instead
            • +
            • Poor API contract clarity: The route path suggests that a value is required, but the handler does not consume it
            • +
            • Maintenance burden: Developers must spend time investigating and fixing runtime errors and mismatches that could have been + prevented
            -

            The impact is particularly severe because this is a complete failure of the endpoint - there is no graceful degradation or partial functionality. -Every request to the affected route will fail until the code is corrected and redeployed.

            +

            The impact depends on how the path operation function is written. Some mismatches cause immediate request failures, while others silently produce +stale or misleading API behavior.

            How to fix it in FastAPI

            -

            Include all path parameters from the route decorator in the function signature. The parameter names in the function must exactly match the -parameter names in the route path (enclosed in curly braces). Add type hints to enable FastAPI’s automatic validation and conversion.

            +

            Include all path parameters from the route decorator in the path operation function signature, or in the signature of a FastAPI dependency used by +that route. The parameter names must match the parameter names in the route path (enclosed in curly braces). Add type hints to enable FastAPI’s +automatic validation and conversion.

            Code examples

            Noncompliant code example

            diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8411.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8411.json
            index d37a38007..72a85a67d 100644
            --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8411.json
            +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8411.json
            @@ -1,5 +1,5 @@
             {
            -  "title": "FastAPI path parameters should be included in route function signatures",
            +  "title": "FastAPI path parameters should be declared in route handlers or dependencies",
               "type": "BUG",
               "status": "ready",
               "remediation": {
            @@ -11,14 +11,14 @@
                 "api",
                 "pitfall"
               ],
            -  "defaultSeverity": "Blocker",
            +  "defaultSeverity": "Major",
               "ruleSpecification": "RSPEC-8411",
               "sqKey": "S8411",
               "scope": "Main",
               "quickfix": "unknown",
               "code": {
                 "impacts": {
            -      "RELIABILITY": "BLOCKER"
            +      "RELIABILITY": "HIGH"
                 },
                 "attribute": "COMPLETE"
               }
            diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8978.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8978.html
            index d53cc4131..19222d6d1 100644
            --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8978.html
            +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8978.html
            @@ -1,5 +1,5 @@
            -

            This rule raises an issue when a validation model class has fields typed to accept instances of structured data types (such as dataclasses), but -does not explicitly configure the framework’s revalidation behavior for those instances.

            +

            This rule raises an issue when a validation model class has fields typed to accept instances of dataclasses, but does not explicitly configure the +framework’s revalidation behavior for those instances.

            In Pydantic specifically, this refers to BaseModel classes with fields typed as standard library or Pydantic dataclasses.

            Why is this an issue?

            Validation frameworks do not revalidate pre-existing data structure instances by default. When an already-instantiated object is passed as a field @@ -22,6 +22,8 @@

            What is the potential impact?

          • Security vulnerabilities if validation is used to enforce security constraints

          How to fix it

          +

          There are two ways to address this issue.

          +

          Option 1: Set revalidate_instances explicitly

          Explicitly set revalidate_instances on the BaseModel that holds the dataclass field. This can be done with ConfigDict or as a class keyword argument.

          Choose the value that matches your intent:

          @@ -31,6 +33,11 @@

          How to fix it

        • 'never' — skips revalidation; use this only when dataclass instances are guaranteed to be constructed from trusted, pre-validated data.
        +

        Note that enabling revalidate_instances can have a runtime cost, particularly when a model with many nested Pydantic fields holds a +single dataclass field, since all nested models are also revalidated recursively.

        +

        Option 2: Replace the dataclass with a Pydantic model

        +

        Convert the dataclass to a BaseModel (or a Pydantic dataclass). Pydantic models are validated at construction time, so no +extra revalidation configuration is needed.

        Code examples

        Noncompliant code example

        @@ -63,6 +70,28 @@ 

        Compliant solution

        class Baz(BaseModel, revalidate_instances='never'): # explicitly opt out user: User
        +

        Noncompliant code example

        +
        +import dataclasses
        +from pydantic import BaseModel
        +
        +@dataclasses.dataclass
        +class Address:
        +    street: str
        +
        +class Order(BaseModel):  # Noncompliant
        +    shipping_address: Address
        +
        +

        Compliant solution

        +
        +from pydantic import BaseModel
        +
        +class Address(BaseModel):  # Pydantic model — validated at construction time
        +    street: str
        +
        +class Order(BaseModel):
        +    shipping_address: Address
        +

        Resources

        Documentation

          diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8978.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8978.json index 18a184f00..ab7dba9a4 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8978.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8978.json @@ -14,7 +14,7 @@ "defaultSeverity": "Critical", "ruleSpecification": "RSPEC-8978", "sqKey": "S8978", - "scope": "All", + "scope": "Main", "quickfix": "unknown", "code": { "impacts": { diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8993.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8993.html index 6f7da0785..53edc4b12 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8993.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8993.html @@ -2,10 +2,24 @@ declaring that fixture as a function parameter.

          In Python’s pytest framework, this specifically refers to the request.getfixturevalue() method.

          Why is this an issue?

          -

          request.getfixturevalue('fixture_name') with a string literal hides dependencies from the function signature and static analysis. -Refactoring fixture names leaves no trace until runtime.

          -

          Declare known fixtures as test parameters instead. Dynamic lookup remains appropriate when the name comes from parametrization or inside fixture -chains.

          +

          In testing frameworks, dependency injection is a powerful mechanism for managing test dependencies and setup code. These frameworks are designed to +automatically discover and inject dependencies based on function signatures, creating a clear dependency graph.

          +

          When a test function uses request.getfixturevalue() with a string literal to load a fixture whose name is already known at write time, +it bypasses the framework’s built-in dependency tracking. This creates several problems:

          +
            +
          • Hidden dependencies: Other developers (and the framework itself) cannot easily see what dependencies a test requires by looking + at its signature
          • +
          • No static analysis: Tools cannot detect missing or misspelled dependency names until runtime
          • +
          • Lifecycle management issues: The framework may not properly manage the dependency’s setup and teardown when loaded + dynamically
          • +
          • Reduced maintainability: Refactoring dependencies becomes harder because usage is not explicit
          • +
          +

          This issue applies when the fixture name is fixed as a string literal in the test. When the name comes from parametrization, configuration, or +another runtime source, dynamic lookup is intentional and not reported.

          +

          Dynamic dependency loading with getfixturevalue() remains appropriate inside fixture functions when setup must load another fixture +conditionally. In collected test functions, dependencies with known names should be declared through the framework’s static declaration mechanism.

          +

          By declaring known fixture dependencies as parameters, you make your tests more explicit, easier to understand, and better integrated with the +framework’s dependency management system.

          In pytest specifically, this anti-pattern manifests when a collected test function calls request.getfixturevalue() with a string literal fixture name. When the fixture name is known at write time, declare it as a test parameter so dependencies stay visible to readers and static analysis.

          @@ -26,8 +40,10 @@

          Plugin and meta tests

          What is the potential impact?

          Refactoring fixture names leaves no static trace in test signatures, so broken dependencies surface only when tests execute.

          How to fix it

          -

          Declare known fixtures as test parameters. Keep request.getfixturevalue() inside fixture functions or when the name is resolved at -runtime from parametrization.

          +

          Replace string-literal request.getfixturevalue() calls in test functions with explicit parameter declaration. Convert the call into a +function parameter with the same name as the fixture being requested.

          +

          Keep request.getfixturevalue() inside fixture functions when setup must load another fixture conditionally. When a test must exercise +multiple fixtures from a parametrized name matrix, keep the variable lookup and treat it as an accepted pattern rather than a violation.

          Code examples

          Noncompliant code example

          diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8994.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8994.html
          index 109f9cc45..bbeee893e 100644
          --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8994.html
          +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8994.html
          @@ -1,7 +1,12 @@
           

          This rule raises an issue when a @pytest.fixture function contains more than one yield statement.

          Why is this an issue?

          -

          Pytest yield fixtures allow exactly one yield. A second yield triggers Failed: fixture function has more than one -'yield' at teardown, and cleanup after it never runs.

          +

          Pytest yield fixtures separate setup from teardown with a single yield statement. Code before yield runs before the test, +the yielded value is passed to the test, and code after yield runs during teardown.

          +

          When a fixture contains more than one yield, pytest accepts the fixture during test setup and runs the test, but raises an error +during teardown: Failed: fixture function has more than one 'yield'. Any code after the second yield, including cleanup such +as closing connections, is never executed, which can leave resources open and break test isolation.

          +

          This rule targets @pytest.fixture setup and teardown patterns only. Ordinary generator functions that use multiple yield +values outside fixture definitions are out of scope.

          What is the potential impact?

          Tests can satisfy their assertions yet still fail during teardown, producing confusing pass-then-fail diagnostics in CI until the fixture is corrected.

          diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8997.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8997.html index 51fea37d9..e3ebbf2fd 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8997.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8997.html @@ -3,13 +3,44 @@

          In Python/pytest, this specifically refers to using the monkeypatch fixture instead of directly modifying sys.path or other global state.

          Why is this an issue?

          -

          Manual save/restore of environment variables, attributes, or callables is easy to forget and often skipped on exceptions. The -monkeypatch fixture undoes all changes automatically when the test completes.

          +

          When tests manually modify global state, they risk polluting the test environment for subsequent tests. This happens because the modified state +persists beyond the test that changed it, unless the test explicitly restores the original values.

          +

          Manual cleanup has several problems:

          +
            +
          • Easy to forget: Developers must remember to restore every modification, especially in error cases.
          • +
          • Exception handling: If a test fails or raises an exception, cleanup code may not execute, leaving the environment in a + corrupted state.
          • +
          • Maintenance burden: Every modification requires corresponding cleanup code, making tests longer and harder to read.
          • +
          • Incomplete cleanup: Complex objects or nested modifications are difficult to restore correctly.
          • +
          +

          Test utilities that manage state modifications solve these problems by automatically undoing all modifications when the test completes, regardless +of whether the test passes or fails. They provide a clean, declarative API that makes the intent clear and eliminates the need for manual cleanup +code.

          What is the potential impact?

          State pollution from missed cleanup propagates across the suite, so failures show up in unrelated tests and erode trust in green CI runs.

          How to fix it

          -

          Use monkeypatch.setenv, monkeypatch.setattr, monkeypatch.setitem, monkeypatch.syspath_prepend, -or monkeypatch.chdir instead of manual save/restore logic.

          +

          Declare the monkeypatch fixture as a test parameter and use its API instead of manual save/restore logic:

          +
            +
          • monkeypatch.setenv(name, value) and monkeypatch.delenv(name) for environment variables
          • +
          • monkeypatch.setattr(target, name, value) and monkeypatch.delattr(target, name) for object attributes, module-level + functions, and bound methods
          • +
          • monkeypatch.setitem(mapping, name, value) and monkeypatch.delitem(mapping, name) for dictionary-like objects
          • +
          • monkeypatch.syspath_prepend(path) and monkeypatch.chdir(path) for import path and working-directory changes
          • +
          +

          To replace a function or method, pass the attribute name as a string to monkeypatch.setattr and supply a stub function or +lambda as the replacement:

          +
            +
          • monkeypatch.setattr(myapp.api, "fetch", stub_fetch) — replace a module-level function
          • +
          • monkeypatch.setattr(client, "send", lambda payload: {"status": "ok"}) — replace a method on an object instance
          • +
          +

          Use a named stub function when the replacement is reused or needs more than one statement; use a lambda for simple one-line return +values.

          +

          Each method automatically undoes the modification after the test completes, even when the test fails.

          +

          For straightforward temporary changes to attributes, environment variables, or callables on existing modules and objects, prefer +monkeypatch.

          +

          unittest.mock.patch is a better fit when you need to mock entire modules, assert call arguments with +Mock.assert_called_with, configure complex side effects, or nest several patches with context managers. Review manually before replacing +working patch-based code with monkeypatch.

          Code examples

          Noncompliant code example

          diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8999.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8999.html
          index 3ca69ecfc..b89a52430 100644
          --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8999.html
          +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8999.html
          @@ -41,3 +41,4 @@ 

          Documentation

          href="https://docs.pytest.org/en/stable/how-to/writing_plugins.html#requiring-loading-plugins-in-a-test-module-or-conftest-file">Requiring/Loading plugins in a test module or conftest file
        + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8999.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8999.json index 9695761cc..ed7969e89 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8999.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8999.json @@ -2,12 +2,26 @@ "title": "\"pytest_plugins\" should be defined in conftest.py files", "type": "CODE_SMELL", "status": "ready", - "remediation": {"func": "Constant/Issue", "constantCost": "5 min"}, - "tags": ["test", "confusing", "pitfall", "pytest"], + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5 min" + }, + "tags": [ + "test", + "confusing", + "pitfall", + "pytest" + ], "defaultSeverity": "Major", "ruleSpecification": "RSPEC-8999", "sqKey": "S8999", "scope": "Tests", "quickfix": "unknown", - "code": {"impacts": {"RELIABILITY": "MEDIUM", "MAINTAINABILITY": "MEDIUM"}, "attribute": "LOGICAL"} + "code": { + "impacts": { + "RELIABILITY": "MEDIUM", + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "LOGICAL" + } } diff --git a/sonarpedia.json b/sonarpedia.json index abbea2561..487d99191 100644 --- a/sonarpedia.json +++ b/sonarpedia.json @@ -3,7 +3,7 @@ "languages": [ "PY" ], - "latest-update": "2026-07-20T12:52:40.248870Z", + "latest-update": "2026-07-21T07:45:08.136364953Z", "options": { "no-language-in-filenames": true, "preserve-filenames": true From 7c036a77813781e15a92f74f623e13b499dd7228 Mon Sep 17 00:00:00 2001 From: Mallow Date: Tue, 21 Jul 2026 13:59:23 +0200 Subject: [PATCH 243/322] SONARPY-2729 Fix crash on empty-source notebook cells GitOrigin-RevId: 017d3682ebd8cc611ca69f16ffe1528f3851b7ba --- .../plugins/python/IpynbNotebookParser.java | 12 ++++++-- .../python/IpynbNotebookParserTest.java | 30 +++++++++++++++++++ ...ebook_array_with_empty_string_source.ipynb | 29 ++++++++++++++++++ .../python/notebook_empty_array_source.ipynb | 27 +++++++++++++++++ .../python/notebook_empty_string_source.ipynb | 27 +++++++++++++++++ 5 files changed, 122 insertions(+), 3 deletions(-) create mode 100644 python-frontend/src/test/resources/org/sonar/plugins/python/notebook_array_with_empty_string_source.ipynb create mode 100644 python-frontend/src/test/resources/org/sonar/plugins/python/notebook_empty_array_source.ipynb create mode 100644 python-frontend/src/test/resources/org/sonar/plugins/python/notebook_empty_string_source.ipynb diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/IpynbNotebookParser.java b/python-frontend/src/main/java/org/sonar/plugins/python/IpynbNotebookParser.java index e75f06104..d50eed638 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/IpynbNotebookParser.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/IpynbNotebookParser.java @@ -312,10 +312,16 @@ private static NotebookParsingData parseSourceMultilineString(int startLine, Jso String sourceLine = jParser.getValueAsString(); JsonLocation tokenLocation = jParser.currentTokenLocation(); - var offset = addSourceLinesToCellData(cellData, sourceLine.lines().toList(), tokenLocation, true, true); + List lines = sourceLine.lines().toList(); + var offset = addSourceLinesToCellData(cellData, lines, tokenLocation, true, true); // The last split line is always followed by a newline: either the cell delimiter or the next cell's content. - cellData.appendToSource("\n"); - offset = offset.plusNewline(); + // An empty source ("") has no split line to terminate, so there is nothing to append here - doing so + // regardless would insert a physical blank line with no locationMap entry of its own, drifting every + // following location by one. + if (!lines.isEmpty()) { + cellData.appendToSource("\n"); + offset = offset.plusNewline(); + } if (sourceLine.endsWith("\n")) { var column = tokenLocation.getColumnNr() + offset.length() + offset.extraChars(); diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/IpynbNotebookParserTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/IpynbNotebookParserTest.java index beed8cf18..9b1126c6b 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/IpynbNotebookParserTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/IpynbNotebookParserTest.java @@ -24,6 +24,8 @@ import java.util.Map; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import org.slf4j.event.Level; import org.sonar.api.batch.fs.InputFile; import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; @@ -32,6 +34,7 @@ import org.sonar.python.IPythonLocation; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatCode; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.sonar.plugins.python.NotebookTestUtils.mapToColumnMappingList; @@ -92,6 +95,33 @@ void testParseNotebook() throws IOException { assertThat(result.locationMap()).extractingByKey(27).isEqualTo(new IPythonLocation(90, 72, List.of(), false)); } + @ParameterizedTest + @ValueSource(strings = { + // "source" is a plain empty string ("", not an array). Used to leave the generated blank line + // without a locationMap entry, drifting the cell delimiter's line onto the wrong physical line and + // later crashing with "No IPythonLocation found for line N" once the tree maker enriched it. + "notebook_empty_string_source.ipynb", + // "source" is an empty array ([]). + "notebook_empty_array_source.ipynb", + // "source" is an array containing a single empty string ([""]). + "notebook_array_with_empty_string_source.ipynb" + }) + void testParseNotebookWithEmptySourceCell(String notebookFile) throws IOException { + var inputFile = createInputFile(baseDir, notebookFile, InputFile.Status.CHANGED, InputFile.Type.MAIN); + + var resultOptional = IpynbNotebookParser.parseNotebook(inputFile); + assertThat(resultOptional).isPresent(); + var result = resultOptional.get(); + + int lineCount = result.contents().split("\n", -1).length; + assertThat(result.locationMap().keySet()).containsExactlyInAnyOrderElementsOf( + java.util.stream.IntStream.rangeClosed(1, lineCount).boxed().toList()); + + var ast = org.sonar.python.parser.PythonParser.createIPythonParser().parse(result.contents()); + assertThatCode(() -> new org.sonar.python.tree.IPythonTreeMaker(result.locationMap()).fileInput(ast)) + .doesNotThrowAnyException(); + } + @Test void testParseNotebookWithEscapedChars() throws IOException { var inputFile = createInputFile(baseDir, "notebook_with_escaped_chars.ipynb", InputFile.Status.CHANGED, InputFile.Type.MAIN); diff --git a/python-frontend/src/test/resources/org/sonar/plugins/python/notebook_array_with_empty_string_source.ipynb b/python-frontend/src/test/resources/org/sonar/plugins/python/notebook_array_with_empty_string_source.ipynb new file mode 100644 index 000000000..f00f4b000 --- /dev/null +++ b/python-frontend/src/test/resources/org/sonar/plugins/python/notebook_array_with_empty_string_source.ipynb @@ -0,0 +1,29 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 0, + "metadata": {}, + "outputs": [], + "source": "x = 1" + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": {}, + "outputs": [], + "source": [ + "" + ] + } + ], + "metadata": { + "language_info": { + "name": "python" + }, + "name": "test", + "notebookId": 1 + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/python-frontend/src/test/resources/org/sonar/plugins/python/notebook_empty_array_source.ipynb b/python-frontend/src/test/resources/org/sonar/plugins/python/notebook_empty_array_source.ipynb new file mode 100644 index 000000000..da47bf1d1 --- /dev/null +++ b/python-frontend/src/test/resources/org/sonar/plugins/python/notebook_empty_array_source.ipynb @@ -0,0 +1,27 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 0, + "metadata": {}, + "outputs": [], + "source": "x = 1" + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "language_info": { + "name": "python" + }, + "name": "test", + "notebookId": 1 + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/python-frontend/src/test/resources/org/sonar/plugins/python/notebook_empty_string_source.ipynb b/python-frontend/src/test/resources/org/sonar/plugins/python/notebook_empty_string_source.ipynb new file mode 100644 index 000000000..fe57ce65a --- /dev/null +++ b/python-frontend/src/test/resources/org/sonar/plugins/python/notebook_empty_string_source.ipynb @@ -0,0 +1,27 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 0, + "metadata": {}, + "outputs": [], + "source": "x = 1" + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": {}, + "outputs": [], + "source": "" + } + ], + "metadata": { + "language_info": { + "name": "python" + }, + "name": "test", + "notebookId": 1 + }, + "nbformat": 4, + "nbformat_minor": 0 +} From 258af1a63e75e04a593d0420b5f0a44d586b05c6 Mon Sep 17 00:00:00 2001 From: "hashicorp-vault-sonar-prod[bot]" <111297361+hashicorp-vault-sonar-prod[bot]@users.noreply.github.com> Date: Wed, 22 Jul 2026 08:54:52 +0000 Subject: [PATCH 244/322] SONARPY-4439 Prepare for next development iteration Co-authored-by: lijun-chen-sonarsource <247163086+lijun-chen-sonarsource@users.noreply.github.com> GitOrigin-RevId: 75f93d448bcf619c4185c34d008a6bd63472bdd7 --- docs/pom.xml | 2 +- docs/python-custom-rules-example/pom.xml | 2 +- its/commons/pom.xml | 2 +- its/plugin/it-python-plugin-test/pom.xml | 2 +- its/plugin/pom.xml | 2 +- its/plugin/python-custom-rules-plugin/pom.xml | 2 +- its/pom.xml | 2 +- pom.xml | 2 +- python-checks-testkit/pom.xml | 2 +- python-checks/pom.xml | 2 +- python-commons/pom.xml | 2 +- python-frontend/pom.xml | 2 +- sonar-python-plugin/pom.xml | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/pom.xml b/docs/pom.xml index 1fda1badd..9ef93c252 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.python python - 5.26-SNAPSHOT + 5.27-SNAPSHOT docs diff --git a/docs/python-custom-rules-example/pom.xml b/docs/python-custom-rules-example/pom.xml index 85ea2a9a5..4f4eea066 100644 --- a/docs/python-custom-rules-example/pom.xml +++ b/docs/python-custom-rules-example/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python docs - 5.26-SNAPSHOT + 5.27-SNAPSHOT python-custom-rules-example diff --git a/its/commons/pom.xml b/its/commons/pom.xml index ea99021a3..d7d424715 100644 --- a/its/commons/pom.xml +++ b/its/commons/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python python-its - 5.26-SNAPSHOT + 5.27-SNAPSHOT Python :: ITs :: Commons diff --git a/its/plugin/it-python-plugin-test/pom.xml b/its/plugin/it-python-plugin-test/pom.xml index 311748a75..c049f5070 100644 --- a/its/plugin/it-python-plugin-test/pom.xml +++ b/its/plugin/it-python-plugin-test/pom.xml @@ -7,7 +7,7 @@ it-python-plugin org.sonarsource.python - 5.26-SNAPSHOT + 5.27-SNAPSHOT it-python-plugin-test diff --git a/its/plugin/pom.xml b/its/plugin/pom.xml index e1cd93964..093de1ae6 100644 --- a/its/plugin/pom.xml +++ b/its/plugin/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.python python-its - 5.26-SNAPSHOT + 5.27-SNAPSHOT diff --git a/its/plugin/python-custom-rules-plugin/pom.xml b/its/plugin/python-custom-rules-plugin/pom.xml index c66dca912..eb61f4ab6 100644 --- a/its/plugin/python-custom-rules-plugin/pom.xml +++ b/its/plugin/python-custom-rules-plugin/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python it-python-plugin - 5.26-SNAPSHOT + 5.27-SNAPSHOT python-custom-rules-plugin diff --git a/its/pom.xml b/its/pom.xml index 3dead7015..af1c561ba 100644 --- a/its/pom.xml +++ b/its/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.python python - 5.26-SNAPSHOT + 5.27-SNAPSHOT python-its diff --git a/pom.xml b/pom.xml index 0082a220c..e2488a70a 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ org.sonarsource.python python - 5.26-SNAPSHOT + 5.27-SNAPSHOT pom Python diff --git a/python-checks-testkit/pom.xml b/python-checks-testkit/pom.xml index eff9196d8..01ff78f68 100644 --- a/python-checks-testkit/pom.xml +++ b/python-checks-testkit/pom.xml @@ -6,7 +6,7 @@ python org.sonarsource.python - 5.26-SNAPSHOT + 5.27-SNAPSHOT python-checks-testkit diff --git a/python-checks/pom.xml b/python-checks/pom.xml index 6165dba1b..af70d769b 100644 --- a/python-checks/pom.xml +++ b/python-checks/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.python python - 5.26-SNAPSHOT + 5.27-SNAPSHOT python-checks diff --git a/python-commons/pom.xml b/python-commons/pom.xml index 0e58b29ab..5ad6373b8 100644 --- a/python-commons/pom.xml +++ b/python-commons/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python python - 5.26-SNAPSHOT + 5.27-SNAPSHOT python-commons diff --git a/python-frontend/pom.xml b/python-frontend/pom.xml index cd35d6d96..c0a9c54b7 100644 --- a/python-frontend/pom.xml +++ b/python-frontend/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python python - 5.26-SNAPSHOT + 5.27-SNAPSHOT python-frontend diff --git a/sonar-python-plugin/pom.xml b/sonar-python-plugin/pom.xml index 925c3b0b5..82777ca69 100644 --- a/sonar-python-plugin/pom.xml +++ b/sonar-python-plugin/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python python - 5.26-SNAPSHOT + 5.27-SNAPSHOT sonar-python-plugin From b8c93ba82d7fd41d9b2e7d1e8c5d6a6c717964c1 Mon Sep 17 00:00:00 2001 From: Guillaume Dequenne Date: Wed, 22 Jul 2026 14:25:36 +0200 Subject: [PATCH 245/322] SONARPY-1506 Resolve absolute paths in ruff reports from different base directories GitOrigin-RevId: b676adb68fe6da25a9634ffdcfc83cef19b7ebc3 --- ...port-absolute-path-from-other-machine.json | 34 +++++++ .../python/it/plugin/RuffReportTest.java | 25 +++++ .../sonar/plugins/python/ruff/RuffSensor.java | 95 ++++++++++++++++++- .../plugins/python/ruff/RuffSensorTest.java | 72 +++++++++++++- .../absolute-path-different-base-dir.json | 18 ++++ .../ruff/nested-relative-path-match.json | 18 ++++ .../plugins/python/ruff/other/ruff/file1.py | 2 + 7 files changed, 259 insertions(+), 5 deletions(-) create mode 100644 its/plugin/it-python-plugin-test/projects/ruff_project/ruff-report-absolute-path-from-other-machine.json create mode 100644 python-commons/src/test/resources/org/sonar/plugins/python/ruff/absolute-path-different-base-dir.json create mode 100644 python-commons/src/test/resources/org/sonar/plugins/python/ruff/nested-relative-path-match.json create mode 100644 python-commons/src/test/resources/org/sonar/plugins/python/ruff/other/ruff/file1.py diff --git a/its/plugin/it-python-plugin-test/projects/ruff_project/ruff-report-absolute-path-from-other-machine.json b/its/plugin/it-python-plugin-test/projects/ruff_project/ruff-report-absolute-path-from-other-machine.json new file mode 100644 index 000000000..7a87797c2 --- /dev/null +++ b/its/plugin/it-python-plugin-test/projects/ruff_project/ruff-report-absolute-path-from-other-machine.json @@ -0,0 +1,34 @@ +[ + { + "code": "F821", + "end_location": { + "column": 48, + "row": 7 + }, + "filename": "/home/other-user/some/other/checkout/ruff_project/src/file1.py", + "fix": null, + "location": { + "column": 42, + "row": 7 + }, + "message": "Undefined name `random`", + "noqa_row": 7, + "url": "https://beta.ruff.rs/docs/rules/undefined-name" + }, + { + "code": "E501", + "end_location": { + "column": 109, + "row": 7 + }, + "filename": "/home/other-user/some/other/checkout/ruff_project/src/file1.py", + "fix": null, + "location": { + "column": 89, + "row": 7 + }, + "message": "Line too long (108 > 88 characters)", + "noqa_row": 7, + "url": "https://beta.ruff.rs/docs/rules/line-too-long" + } +] diff --git a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/RuffReportTest.java b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/RuffReportTest.java index fbcbb7439..449c145a4 100644 --- a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/RuffReportTest.java +++ b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/RuffReportTest.java @@ -66,4 +66,29 @@ void import_report() { } + @Test + void import_report_with_absolute_path_from_different_base_dir() { + final String projectKey = "ruff_project_absolute_path"; + ORCHESTRATOR.getServer().provisionProject(projectKey, projectKey); + ORCHESTRATOR.getServer().associateProjectToQualityProfile(projectKey, "py", "no_rule"); + ORCHESTRATOR.executeBuild( + ORCHESTRATOR.createSonarScanner() + .setProjectDir(new File("projects/ruff_project")) + .setProjectKey(projectKey) + .setProjectName(projectKey) + .setProperty("sonar.python.ruff.reportPaths", "ruff-report-absolute-path-from-other-machine.json")); + + List issues = issues(projectKey).stream().sorted(Comparator.comparing(Issues.Issue::getRule)) + .toList(); + assertThat(issues).hasSize(2); + + Issues.Issue firstIssue = issues.get(0); + assertThat(firstIssue.getComponent()).isEqualTo(projectKey + ":src/file1.py"); + assertThat(firstIssue.getRule()).isEqualTo("external_ruff:E501"); + + Issues.Issue secondIssue = issues.get(1); + assertThat(secondIssue.getComponent()).isEqualTo(projectKey + ":src/file1.py"); + assertThat(secondIssue.getRule()).isEqualTo("external_ruff:F821"); + } + } diff --git a/python-commons/src/main/java/org/sonar/plugins/python/ruff/RuffSensor.java b/python-commons/src/main/java/org/sonar/plugins/python/ruff/RuffSensor.java index d4d99e32c..bc7cf73eb 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/ruff/RuffSensor.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/ruff/RuffSensor.java @@ -20,9 +20,14 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.sonar.api.batch.fs.FileSystem; import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.rule.Severity; import org.sonar.api.batch.sensor.SensorContext; @@ -70,18 +75,21 @@ protected void importReport(File reportPath, SensorContext context, Set throws IOException, ParseException { InputStream in = new FileInputStream(reportPath); LOG.info("Importing {}", reportPath); - RuffJsonReportReader.read(in, issue -> saveIssue(context, issue, unresolvedInputFiles)); + // Built lazily and reused across all issues of this report, so the fallback below never re-scans the + // filesystem per issue. + RelativePathIndex relativePathIndex = new RelativePathIndex(context.fileSystem()); + RuffJsonReportReader.read(in, issue -> saveIssue(context, issue, unresolvedInputFiles, relativePathIndex)); } private static void saveIssue(SensorContext context, RuffJsonReportReader.Issue issue, - Set unresolvedInputFiles) { + Set unresolvedInputFiles, RelativePathIndex relativePathIndex) { if (isEmpty(issue.ruleKey) || isEmpty(issue.filePath) || isEmpty(issue.message)) { LOG.debug("Missing information for ruleKey:'{}', filePath:'{}', message:'{}'", issue.ruleKey, issue.filePath, issue.message); return; } - InputFile inputFile = context.fileSystem().inputFile(context.fileSystem().predicates().hasPath(issue.filePath)); + InputFile inputFile = findInputFile(context.fileSystem(), issue.filePath, relativePathIndex); if (inputFile == null) { unresolvedInputFiles.add(issue.filePath); return; @@ -111,6 +119,87 @@ private static void saveIssue(SensorContext context, RuffJsonReportReader.Issue newExternalIssue.ruleId(issue.ruleKey).save(); } + /** + * Ruff only reports absolute file paths, which may have been computed with a different base directory than the + * one used for the current analysis (e.g. report generated in CI, analysis run locally, or vice versa). + * When the direct lookup fails, fall back to matching the report path against the relative path of an indexed + * file, disregarding the base directory, through the {@link RelativePathIndex}. + */ + private static InputFile findInputFile(FileSystem fileSystem, String filePath, RelativePathIndex relativePathIndex) { + InputFile inputFile = fileSystem.inputFile(fileSystem.predicates().hasPath(filePath)); + if (inputFile != null) { + return inputFile; + } + return relativePathIndex.findByRelativePathSuffix(filePath); + } + + /** + * Indexes input files by file name so that the suffix-matching fallback only has to compare the (typically few) + * files sharing the same name, instead of scanning every indexed file for every unresolved issue. Built lazily, + * on first use, and reused for the whole report. + *

        + * Among several candidates sharing the report path's file name, the one whose relative path is the longest + * matching suffix is preferred, since it pins down the project base directory boundary more precisely than a + * shorter, coincidental match (e.g. a root-level {@code __init__.py} trivially suffix-matches every deeper + * {@code __init__.py} report path). Candidates matching an equally long suffix are rejected as ambiguous. + *

        + * This remains a best-effort heuristic: if the file Ruff actually analyzed isn't indexed at all, the issue can + * still be attached to an unrelated file that happens to share its relative path suffix. + */ + private static class RelativePathIndex { + + private final FileSystem fileSystem; + private Map> filesByName; + + private RelativePathIndex(FileSystem fileSystem) { + this.fileSystem = fileSystem; + } + + InputFile findByRelativePathSuffix(String filePath) { + if (filesByName == null) { + filesByName = buildIndex(fileSystem); + } + String normalizedFilePath = filePath.replace('\\', '/'); + List candidates = filesByName.getOrDefault(fileName(normalizedFilePath), List.of()); + + InputFile bestMatch = null; + int bestMatchLength = -1; + boolean ambiguous = false; + for (InputFile candidate : candidates) { + String relativePath = candidate.relativePath(); + if (normalizedFilePath.equals(relativePath) || normalizedFilePath.endsWith("/" + relativePath)) { + if (relativePath.length() > bestMatchLength) { + bestMatch = candidate; + bestMatchLength = relativePath.length(); + ambiguous = false; + } else if (relativePath.length() == bestMatchLength) { + ambiguous = true; + } + } + } + if (ambiguous) { + LOG.debug("Multiple files equally match the path '{}', skipping ambiguous match", filePath); + return null; + } + if (bestMatch != null) { + LOG.debug("Resolved report path '{}' to '{}' by matching the relative path, ignoring the base directory", filePath, bestMatch); + } + return bestMatch; + } + + private static Map> buildIndex(FileSystem fileSystem) { + Map> index = new HashMap<>(); + for (InputFile inputFile : fileSystem.inputFiles(fileSystem.predicates().all())) { + index.computeIfAbsent(fileName(inputFile.relativePath()), k -> new ArrayList<>()).add(inputFile); + } + return index; + } + + private static String fileName(String path) { + return path.substring(path.lastIndexOf('/') + 1); + } + } + /* * The end location column should be after the start location col */ diff --git a/python-commons/src/test/java/org/sonar/plugins/python/ruff/RuffSensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/ruff/RuffSensorTest.java index d72add74d..03080e96a 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/ruff/RuffSensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/ruff/RuffSensorTest.java @@ -19,12 +19,15 @@ import com.sonarsource.scanner.engine.sensor.test.fixtures.SensorContextTester; import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; import com.sonarsource.scanner.engine.sensor.test.fixtures.TestSonarRuntime; +import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.stream.Stream; import javax.annotation.Nullable; import org.junit.jupiter.api.Test; @@ -32,18 +35,25 @@ import org.slf4j.event.Level; import org.sonar.api.SonarEdition; import org.sonar.api.SonarQubeSide; +import org.sonar.api.batch.fs.FilePredicates; +import org.sonar.api.batch.fs.FileSystem; import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.fs.TextRange; import org.sonar.api.batch.rule.Severity; +import org.sonar.api.batch.sensor.SensorContext; import org.sonar.api.batch.sensor.issue.ExternalIssue; import org.sonar.api.batch.sensor.issue.IssueLocation; import org.sonar.api.rules.RuleType; import org.sonar.api.testfixtures.log.LogTesterJUnit5; import org.sonar.api.utils.Version; import org.sonar.scanner.plugin.api.impl.sensor.DefaultSensorDescriptor; +import org.sonarsource.analyzer.commons.internal.json.simple.parser.ParseException; import static java.nio.charset.StandardCharsets.UTF_8; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; class RuffSensorTest { @@ -212,6 +222,64 @@ void report_on_empty_file() throws IOException { assertThat(firstTextRange.end().lineOffset()).isZero(); } + @Test + void issues_with_absolute_path_from_different_base_dir() throws IOException { + List externalIssues = executeSensorImporting(7, 9, "absolute-path-different-base-dir.json"); + assertThat(externalIssues).hasSize(1); + + ExternalIssue first = externalIssues.get(0); + assertThat(first.ruleKey()).hasToString("external_ruff:D100"); + IssueLocation firstPrimaryLoc = first.primaryLocation(); + assertThat(firstPrimaryLoc.inputComponent().key()).isEqualTo(RUFF_FILE); + assertThat(firstPrimaryLoc.message()).isEqualTo("Missing docstring in public module"); + + assertNoErrorWarnLogs(logTester); + } + + @Test + void most_specific_relative_path_is_preferred_when_multiple_suffixes_match() throws IOException { + // The report path ends with both "ruff/file1.py" and the longer, more specific "ruff/other/ruff/file1.py". + // The longer match must win instead of being treated as ambiguous. + List externalIssues = executeSensorImporting(7, 9, "nested-relative-path-match.json"); + assertThat(externalIssues).hasSize(1); + + ExternalIssue first = externalIssues.get(0); + assertThat(first.ruleKey()).hasToString("external_ruff:D100"); + IssueLocation firstPrimaryLoc = first.primaryLocation(); + assertThat(firstPrimaryLoc.inputComponent().key()).isEqualTo("python-project:ruff/other/ruff/file1.py"); + assertThat(firstPrimaryLoc.message()).isEqualTo("Missing docstring in public module"); + + assertNoErrorWarnLogs(logTester); + } + + @Test + void ambiguous_relative_path_match_is_not_resolved() throws IOException, ParseException { + // Two distinct input files sharing the exact same relative path can only occur when the file system indexes + // them without deduplication (e.g. across modules in a multi-module reactor); SensorContextTester's own + // FileSystem dedupes by relative path, so the FileSystem is mocked here to reproduce that scenario directly. + InputFile firstCandidate = mock(InputFile.class); + when(firstCandidate.relativePath()).thenReturn("ruff/file1.py"); + InputFile secondCandidate = mock(InputFile.class); + when(secondCandidate.relativePath()).thenReturn("ruff/file1.py"); + + FilePredicates predicates = mock(FilePredicates.class); + FileSystem fileSystem = mock(FileSystem.class); + when(fileSystem.predicates()).thenReturn(predicates); + when(fileSystem.inputFile(any())).thenReturn(null); + when(fileSystem.inputFiles(any())).thenReturn(List.of(firstCandidate, secondCandidate)); + + SensorContext context = mock(SensorContext.class); + when(context.fileSystem()).thenReturn(fileSystem); + + Set unresolvedInputFiles = new HashSet<>(); + File reportFile = PROJECT_DIR.resolve("absolute-path-different-base-dir.json").toFile(); + ruffSensor.importReport(reportFile, context, unresolvedInputFiles); + + assertThat(unresolvedInputFiles).containsExactly("/builds/ci-runner-42/workspace/project/ruff/file1.py"); + assertThat(logTester.logs(Level.DEBUG)) + .contains("Multiple files equally match the path '/builds/ci-runner-42/workspace/project/ruff/file1.py', skipping ambiguous match"); + } + @Test void unknown_json_file_path() throws IOException { List externalIssues = executeSensorImporting(7, 9, RUFF_REPORT_UNKNOWN_FILES); @@ -307,8 +375,8 @@ private static List executeSensorImporting(int majorVersion, int @Nullable String fileName) throws IOException { Path baseDir = PROJECT_DIR.getParent(); SensorContextTester context = SensorContextTester.create(baseDir); - try (Stream fileStream = Files.list(PROJECT_DIR)) { - fileStream.forEach(file -> addFileToContext(context, baseDir, file)); + try (Stream fileStream = Files.walk(PROJECT_DIR)) { + fileStream.filter(Files::isRegularFile).forEach(file -> addFileToContext(context, baseDir, file)); context.setRuntime(TestSonarRuntime.forSonarQube(Version.create(majorVersion, minorVersion), SonarQubeSide.SERVER, SonarEdition.DEVELOPER)); if (fileName != null) { diff --git a/python-commons/src/test/resources/org/sonar/plugins/python/ruff/absolute-path-different-base-dir.json b/python-commons/src/test/resources/org/sonar/plugins/python/ruff/absolute-path-different-base-dir.json new file mode 100644 index 000000000..57dc06e78 --- /dev/null +++ b/python-commons/src/test/resources/org/sonar/plugins/python/ruff/absolute-path-different-base-dir.json @@ -0,0 +1,18 @@ +[ + { + "code": "D100", + "end_location": { + "column": 1, + "row": 1 + }, + "filename": "/builds/ci-runner-42/workspace/project/ruff/file1.py", + "fix": null, + "location": { + "column": 1, + "row": 1 + }, + "message": "Missing docstring in public module", + "noqa_row": 1, + "url": "https://beta.ruff.rs/docs/rules/undocumented-public-module" + } +] diff --git a/python-commons/src/test/resources/org/sonar/plugins/python/ruff/nested-relative-path-match.json b/python-commons/src/test/resources/org/sonar/plugins/python/ruff/nested-relative-path-match.json new file mode 100644 index 000000000..72c60beb3 --- /dev/null +++ b/python-commons/src/test/resources/org/sonar/plugins/python/ruff/nested-relative-path-match.json @@ -0,0 +1,18 @@ +[ + { + "code": "D100", + "end_location": { + "column": 1, + "row": 1 + }, + "filename": "/builds/ci-runner-42/workspace/project/ruff/other/ruff/file1.py", + "fix": null, + "location": { + "column": 1, + "row": 1 + }, + "message": "Missing docstring in public module", + "noqa_row": 1, + "url": "https://beta.ruff.rs/docs/rules/undocumented-public-module" + } +] diff --git a/python-commons/src/test/resources/org/sonar/plugins/python/ruff/other/ruff/file1.py b/python-commons/src/test/resources/org/sonar/plugins/python/ruff/other/ruff/file1.py new file mode 100644 index 000000000..0b63d1f20 --- /dev/null +++ b/python-commons/src/test/resources/org/sonar/plugins/python/ruff/other/ruff/file1.py @@ -0,0 +1,2 @@ +def duplicate(): + pass From 215bb4096d3ff897181d10ffd77932178ef460d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C3=A9mie=20B=C3=A9nard?= <163140136+NoemieBenard@users.noreply.github.com> Date: Thu, 23 Jul 2026 09:23:00 +0200 Subject: [PATCH 246/322] SONARPY-4412 Implement S9073: Composite assertions should be split GitOrigin-RevId: a9139b366f51782ce7ebadb6776c54e1c387f956 --- .../python/checks/OpenSourceCheckList.java | 2 + .../checks/tests/CompositeAssertionCheck.java | 64 +++++++++++++++ .../org/sonar/l10n/py/rules/python/S9073.html | 80 +++++++++++++++++++ .../org/sonar/l10n/py/rules/python/S9073.json | 24 ++++++ .../py/rules/python/Sonar_way_profile.json | 3 +- .../tests/CompositeAssertionCheckTest.java | 36 +++++++++ .../checks/tests/test_compositeAssertion.py | 41 ++++++++++ 7 files changed, 249 insertions(+), 1 deletion(-) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/tests/CompositeAssertionCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9073.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9073.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/tests/CompositeAssertionCheckTest.java create mode 100644 python-checks/src/test/resources/checks/tests/test_compositeAssertion.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index e3457e4b7..751b633dc 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -95,6 +95,7 @@ import org.sonar.python.checks.tests.AssertOnDissimilarTypesCheck; import org.sonar.python.checks.tests.AssertOnTupleLiteralCheck; import org.sonar.python.checks.tests.AssertionArgumentOrderCheck; +import org.sonar.python.checks.tests.CompositeAssertionCheck; import org.sonar.python.checks.tests.DedicatedAssertionCheck; import org.sonar.python.checks.tests.DedicatedExceptionAssertionCheck; import org.sonar.python.checks.tests.EmptyParametrizeValuesCheck; @@ -185,6 +186,7 @@ public Stream> getChecks() { CommentedCodeCheck.class, CommentRegularExpressionCheck.class, ComparisonToNoneCheck.class, + CompositeAssertionCheck.class, CompressionModulesFromNamespaceCheck.class, ConfusingTypeCheckingCheck.class, ConfusingWalrusCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/CompositeAssertionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/CompositeAssertionCheck.java new file mode 100644 index 000000000..2a71a1387 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/CompositeAssertionCheck.java @@ -0,0 +1,64 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.AssertStatement; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.tree.UnaryExpression; +import org.sonar.python.checks.utils.Expressions; +import org.sonar.python.checks.utils.UnittestUtils; + +@Rule(key = "S9073") +public class CompositeAssertionCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Split this composite assertion into separate assertions."; + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.ASSERT_STMT, ctx -> checkAssert(ctx, (AssertStatement) ctx.syntaxNode())); + } + + @Override + public CheckScope scope() { + return CheckScope.ALL; + } + + private static void checkAssert(SubscriptionContext ctx, AssertStatement assertStatement) { + if (!UnittestUtils.isPytestFileName(ctx.pythonFile().fileName()) + && !UnittestUtils.isSupportedTestFunction(ctx, assertStatement)) { + return; + } + + Expression condition = Expressions.removeParentheses(assertStatement.condition()); + + if (condition.is(Tree.Kind.AND)) { + ctx.addIssue(assertStatement, MESSAGE); + return; + } + + if (condition.is(Tree.Kind.NOT)) { + Expression inner = Expressions.removeParentheses(((UnaryExpression) condition).expression()); + if (inner.is(Tree.Kind.OR)) { + ctx.addIssue(assertStatement, MESSAGE); + } + } + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9073.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9073.html new file mode 100644 index 000000000..af2d01275 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9073.html @@ -0,0 +1,80 @@ +

        This rule raises an issue when a test assertion combines multiple independent conditions with and, or when it asserts the negation of +an or expression (assert not (a or b)).

        +

        It does not raise an issue on plain assert a or b, because splitting that form would change the meaning from "at least one condition +holds" to "all conditions hold".

        +

        Why is this an issue?

        +

        Composite assertions hide which condition failed. When several checks are joined in a single assert, a failure reports the whole +expression as false instead of pointing at the specific condition that broke.

        +

        Assertions joined with and

        +

        assert a and b verifies two independent facts in one statement. If the assertion fails, the message does not clearly identify whether +a, b, or both were false:

        +
        +def test_user(user):
        +    assert user.is_active and user.is_verified  # Which condition failed?
        +
        +

        Splitting into separate asserts makes each failure actionable:

        +
        +def test_user(user):
        +    assert user.is_active
        +    assert user.is_verified
        +
        +

        Negated or expressions

        +

        assert not (a or b) is equivalent to asserting that both a and b are false (De Morgan’s law). It has the +same opacity problem as an and chain:

        +
        +def test_axis_hidden(axis):
        +    assert not (axis.visible or axis.label_visible)  # Which flag is still true?
        +
        +

        Split it into independent negated asserts:

        +
        +def test_axis_hidden(axis):
        +    assert not axis.visible
        +    assert not axis.label_visible
        +
        +

        Why plain or is excluded

        +

        assert a or b means at least one condition must hold. Replacing it with two separate asserts would require both to hold and would +change the test’s intent. This rule therefore does not flag that form.

        +

        What is the potential impact?

        +

        When a composite assertion fails, developers spend extra time deciphering which condition broke. Opaque failure messages slow down debugging and +make flaky or partial regressions harder to diagnose. Splitting assertions keeps each check independent and produces clearer failure reports.

        +

        How to fix it

        +

        Split composite assertions into separate assert statements, one per independent condition. For assert not (a or b), use +De Morgan’s law and write assert not a and assert not b.

        +

        This applies to:

        +
          +
        • assert a and b (and longer and chains) that combine independent conditions
        • +
        • assert not (a or b) (De Morgan-equivalent negation of an or expression)
        • +
        +

        Plain assert a or b is not flagged, because splitting it would change the meaning of the test.

        +

        Code examples

        +

        Noncompliant code example

        +
        +def test_user(user):
        +    assert user.is_active and user.is_verified  # Noncompliant
        +
        +

        Compliant solution

        +
        +def test_user(user):
        +    assert user.is_active
        +    assert user.is_verified
        +
        +

        Noncompliant code example

        +
        +def test_axis_hidden(axis):
        +    assert not (axis.visible or axis.label_visible)  # Noncompliant
        +
        +

        Compliant solution

        +
        +def test_axis_hidden(axis):
        +    assert not axis.visible
        +    assert not axis.label_visible
        +
        +

        Resources

        +

        Documentation

        + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9073.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9073.json new file mode 100644 index 000000000..f7968764d --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9073.json @@ -0,0 +1,24 @@ +{ + "title": "Composite assertions should be split", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "pytest", + "tests" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-9073", + "sqKey": "S9073", + "scope": "Main", + "code": { + "impacts": { + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "CLEAR" + }, + "quickfix": "unknown" +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index cb9cf2d4f..55c2bb556 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -380,6 +380,7 @@ "S8998", "S8999", "S9000", - "S9001" + "S9001", + "S9073" ] } diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/CompositeAssertionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/CompositeAssertionCheckTest.java new file mode 100644 index 000000000..d8eae5115 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/CompositeAssertionCheckTest.java @@ -0,0 +1,36 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import org.junit.jupiter.api.Test; +import org.sonar.plugins.python.api.PythonCheck; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +import static org.assertj.core.api.Assertions.assertThat; + +class CompositeAssertionCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/test_compositeAssertion.py", new CompositeAssertionCheck()); + } + + @Test + void test_scope() { + assertThat(new CompositeAssertionCheck().scope()).isEqualTo(PythonCheck.CheckScope.ALL); + } +} diff --git a/python-checks/src/test/resources/checks/tests/test_compositeAssertion.py b/python-checks/src/test/resources/checks/tests/test_compositeAssertion.py new file mode 100644 index 000000000..556fa5bb8 --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/test_compositeAssertion.py @@ -0,0 +1,41 @@ +import unittest + + +def test_and_noncompliant(user): + assert user.is_active and user.is_verified # Noncompliant {{Split this composite assertion into separate assertions.}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + assert user.a and user.b and user.c # Noncompliant + assert (user.is_active and user.is_verified) # Noncompliant + +def test_not_or_noncompliant(axis): + assert not (axis.visible or axis.label_visible) # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + assert not (axis.a or axis.b or axis.c) # Noncompliant + + +def test_compliant(user, axis, a, b): + assert user.is_active + assert user.is_verified + assert not axis.visible + assert not axis.label_visible + assert a or b # plain or is compliant + assert not a # negated single value is compliant + assert not (a and b) # negated and is compliant + assert a and b or b # outer is or, compliant + + +def helper_function(a, b): + assert a and b # Noncompliant + + +class TestCompositeAssertion(unittest.TestCase): + def test_and_noncompliant(self): + assert self.a and self.b # Noncompliant + + def test_not_or_noncompliant(self): + assert not (self.x or self.y) # Noncompliant + + def test_compliant(self): + assert self.a + assert self.b + assert self.a or self.b From 5319ac4479147bc18ee299f97af316f5f422ab22 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 23 Jul 2026 09:23:10 +0200 Subject: [PATCH 247/322] Update dependency pipx:tox to v4.57.0 Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> GitOrigin-RevId: 19009921c38b5e5a5bfd699fdd1878f2c9df2424 --- mise.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mise.toml b/mise.toml index 9f8d94066..4370bc57c 100644 --- a/mise.toml +++ b/mise.toml @@ -3,4 +3,4 @@ java = "21.0" maven = "3.9" python = "3.9" uv = "latest" # required for pipx backend -"pipx:tox" = { version = "4.56.1", uvx = "true" } +"pipx:tox" = { version = "4.57.0", uvx = "true" } From 3255f366664fcbde8c5090a3761692e41fecb681 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 23 Jul 2026 19:54:09 +0200 Subject: [PATCH 248/322] Update dependency com.sonarsource.rule-api:rule-api to v2.27.0.6068 Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> GitOrigin-RevId: 5334fabd224f9fa7f31eefb34eb54300a17f4cf8 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e2488a70a..71889da30 100644 --- a/pom.xml +++ b/pom.xml @@ -114,7 +114,7 @@ 6.2.7 2.14.0 2.22.1 - 2.26.0.6023 + 2.27.0.6068 11 From acec2b89b51315831bca716a0ac99736cd7ed240 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 24 Jul 2026 10:23:58 +0200 Subject: [PATCH 249/322] Update SonarSource/sonar-scanner-engine monorepo to v13.5.0.4089 Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> GitOrigin-RevId: 60c7d855afc61d0b94dec73889f5dc77bb40c58e --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 71889da30..cc227c547 100644 --- a/pom.xml +++ b/pom.xml @@ -102,7 +102,7 @@ Python Enterprise 26.7.0.124771 13.8.0.4399 - 13.4.1.4007 + 13.5.0.4089 6.3.1.4538 2.28.0.5085 From 25752d0434f14d5a5a39925acb88ce7788c7652d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 24 Jul 2026 11:27:16 +0200 Subject: [PATCH 250/322] Update SonarSource/sonar-analyzer-commons monorepo to v2.29.0.5138 Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Victor Diez GitOrigin-RevId: d87bce945550bce3b12d70e414d272c151bc3e0f --- pom.xml | 2 +- .../xml-apis.xml-apis-LICENSE.txt | 202 ------------------ 2 files changed, 1 insertion(+), 203 deletions(-) delete mode 100644 sonar-python-plugin/src/main/resources/licenses/THIRD_PARTY_LICENSES/xml-apis.xml-apis-LICENSE.txt diff --git a/pom.xml b/pom.xml index cc227c547..ac56c7bfc 100644 --- a/pom.xml +++ b/pom.xml @@ -104,7 +104,7 @@ 13.8.0.4399 13.5.0.4089 6.3.1.4538 - 2.28.0.5085 + 2.29.0.5138 its/**,private/its-enterprise/**,python-frontend/typeshed_serializer/**,**/test/resources/** diff --git a/sonar-python-plugin/src/main/resources/licenses/THIRD_PARTY_LICENSES/xml-apis.xml-apis-LICENSE.txt b/sonar-python-plugin/src/main/resources/licenses/THIRD_PARTY_LICENSES/xml-apis.xml-apis-LICENSE.txt deleted file mode 100644 index d64569567..000000000 --- a/sonar-python-plugin/src/main/resources/licenses/THIRD_PARTY_LICENSES/xml-apis.xml-apis-LICENSE.txt +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. From 2bd382f5711623d8bcfe8a01e96b3b82a7180c9b Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Tue, 28 Jul 2026 08:09:22 +0200 Subject: [PATCH 251/322] SONARPY-4413 Implement S9074: Pytest marks and usefixtures should not be applied uselessly GitOrigin-RevId: 74902a9e8974a7e82efbd7278720f4cd590a8d4f --- .../python/checks/OpenSourceCheckList.java | 2 + .../checks/tests/UselessPytestMarksCheck.java | 126 +++++++++++++ .../org/sonar/l10n/py/rules/python/S9074.html | 99 ++++++++++ .../org/sonar/l10n/py/rules/python/S9074.json | 24 +++ .../py/rules/python/Sonar_way_profile.json | 3 +- .../tests/UselessPytestMarksCheckTest.java | 36 ++++ .../checks/tests/uselessPytestMarks.py | 169 ++++++++++++++++++ .../custom_protobuf/pytest.mark.protobuf | 7 +- .../checksums/custom.checksum | 4 +- .../resources/custom/pytest/mark/__init__.pyi | 1 + 10 files changed, 467 insertions(+), 4 deletions(-) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/tests/UselessPytestMarksCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9074.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9074.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/tests/UselessPytestMarksCheckTest.java create mode 100644 python-checks/src/test/resources/checks/tests/uselessPytestMarks.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 751b633dc..9394cc18b 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -114,6 +114,7 @@ import org.sonar.python.checks.tests.TestCasesShouldContainTestsCheck; import org.sonar.python.checks.tests.UnconditionalAssertionCheck; import org.sonar.python.checks.tests.UseMonkeypatchFixtureCheck; +import org.sonar.python.checks.tests.UselessPytestMarksCheck; import org.sonar.python.checks.tests.XfailNoReasonCheck; public class OpenSourceCheckList { @@ -503,6 +504,7 @@ public Stream> getChecks() { RewriteCollectionConstructorAsComprehensionCheck.class, UnconditionalAssertionCheck.class, UseMonkeypatchFixtureCheck.class, + UselessPytestMarksCheck.class, UndefinedNameAllPropertyCheck.class, UnencryptedSageMakerNotebookCheck.class, UnencryptedSqsQueueCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/UselessPytestMarksCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/UselessPytestMarksCheck.java new file mode 100644 index 000000000..9e312c33b --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/UselessPytestMarksCheck.java @@ -0,0 +1,126 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import java.util.List; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.ArgList; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.ClassDef; +import org.sonar.plugins.python.api.tree.Decorator; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.FunctionDef; +import org.sonar.plugins.python.api.tree.QualifiedExpression; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; + +@Rule(key = "S9074") +public class UselessPytestMarksCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE_MARK_ON_FIXTURE = "Remove this mark; it has no effect on fixtures."; + private static final String MESSAGE_EMPTY_USEFIXTURES = "Provide fixture names or remove this empty usefixtures decorator."; + + private static final TypeMatcher PYTEST_FIXTURE_MATCHER = TypeMatchers.withFQN("pytest.fixture"); + private static final TypeMatcher PYTEST_MARK_MATCHER = TypeMatchers.isType("pytest.mark"); + private static final TypeMatcher PYTEST_USEFIXTURES_MATCHER = TypeMatchers.isType("pytest.mark.usefixtures"); + private static final TypeMatcher KNOWN_PYTEST_MARK_MATCHER = TypeMatchers.any( + TypeMatchers.isType("pytest.mark.skip"), + TypeMatchers.isType("pytest.mark.xfail"), + TypeMatchers.isType("pytest.mark.parametrize"), + PYTEST_USEFIXTURES_MATCHER + ); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.FUNCDEF, ctx -> checkFunction(ctx, (FunctionDef) ctx.syntaxNode())); + context.registerSyntaxNodeConsumer(Tree.Kind.CLASSDEF, ctx -> checkClass(ctx, (ClassDef) ctx.syntaxNode())); + } + + @Override + public CheckScope scope() { + return CheckScope.ALL; + } + + private static void checkFunction(SubscriptionContext ctx, FunctionDef functionDef) { + boolean isFixture = hasPytestFixtureDecorator(functionDef.decorators(), ctx); + for (Decorator decorator : functionDef.decorators()) { + checkDecorator(ctx, decorator, isFixture); + } + } + + private static void checkClass(SubscriptionContext ctx, ClassDef classDef) { + for (Decorator decorator : classDef.decorators()) { + checkDecorator(ctx, decorator, false); + } + } + + private static void checkDecorator(SubscriptionContext ctx, Decorator decorator, boolean isFixture) { + Expression markExpression = decoratorFunctionExpression(decorator); + if (!isPytestMark(markExpression, ctx)) { + return; + } + if (isFixture) { + ctx.addIssue(decorator, MESSAGE_MARK_ON_FIXTURE); + return; + } + if (isEmptyUsefixtures(decorator, markExpression, ctx)) { + ctx.addIssue(decorator, MESSAGE_EMPTY_USEFIXTURES); + } + } + + private static boolean hasPytestFixtureDecorator(List decorators, SubscriptionContext ctx) { + return decorators.stream() + .anyMatch(decorator -> PYTEST_FIXTURE_MATCHER.isTrueFor(decoratorFunctionExpression(decorator), ctx)); + } + + private static boolean isPytestMark(Expression expression, SubscriptionContext ctx) { + if (KNOWN_PYTEST_MARK_MATCHER.isTrueFor(expression, ctx)) { + return true; + } + if (expression instanceof QualifiedExpression qualifiedExpression) { + return PYTEST_MARK_MATCHER.isTrueFor(qualifiedExpression.qualifier(), ctx); + } + return false; + } + + private static boolean isEmptyUsefixtures(Decorator decorator, Expression markExpression, SubscriptionContext ctx) { + if (!PYTEST_USEFIXTURES_MATCHER.isTrueFor(markExpression, ctx)) { + return false; + } + return hasEmptyCallArguments(decorator); + } + + private static boolean hasEmptyCallArguments(Decorator decorator) { + Expression expression = decorator.expression(); + if (!(expression instanceof CallExpression callExpression)) { + return false; + } + ArgList argumentList = callExpression.argumentList(); + return argumentList == null || argumentList.arguments().isEmpty(); + } + + private static Expression decoratorFunctionExpression(Decorator decorator) { + Expression expression = decorator.expression(); + if (expression instanceof CallExpression callExpression) { + return callExpression.callee(); + } + return expression; + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9074.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9074.html new file mode 100644 index 000000000..d70228b57 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9074.html @@ -0,0 +1,99 @@ +

        This rule raises an issue when a pytest mark is applied where it has no effect: any @pytest.mark.* on a @pytest.fixture, +or @pytest.mark.usefixtures() with no fixture names.

        +

        Why is this an issue?

        +

        Pytest applies marks to tests, classes, and modules. Marks on fixtures are ignored, and an empty @pytest.mark.usefixtures() does +nothing.

        +

        Marks on fixtures

        +

        Decorating a fixture with @pytest.mark.asyncio, @pytest.mark.usefixtures(…​), or any other @pytest.mark.* +does not change how the fixture runs or which tests use it:

        +
        +@pytest.mark.asyncio  # Ignored: fixtures are not tests
        +@pytest.fixture
        +async def db():
        +    return await connect()
        +
        +@pytest.mark.usefixtures("db")  # Ignored on fixtures
        +@pytest.fixture
        +def client(db):
        +    return Client(db)
        +
        +@pytest.mark.slow  # Ignored on fixtures
        +@pytest.fixture
        +def cache():
        +    return {}
        +
        +

        Maintainers may assume the mark selects the fixture, runs it asynchronously, or injects other fixtures. None of that happens.

        +

        To depend on another fixture, declare it as a parameter. For async fixtures, use an async fixture function; pytest-asyncio does not require +@pytest.mark.asyncio on the fixture itself.

        +

        Empty usefixtures

        +

        @pytest.mark.usefixtures() with no names is a no-op:

        +
        +@pytest.mark.usefixtures()  # No fixtures requested
        +def test_ping():
        +    assert ping() == "pong"
        +
        +

        Either pass the fixture names that should be activated, or remove the decorator.

        +

        What is the potential impact?

        +

        Useless marks look intentional but change nothing. Teams may believe fixtures are skipped, marked slow, run under asyncio, or wired via +usefixtures, while the suite behaves differently than expected.

        +

        How to fix it

        +

        Remove marks from fixtures. Request other fixtures as parameters instead of @pytest.mark.usefixtures on the fixture. For empty +@pytest.mark.usefixtures(), either supply fixture names or delete the decorator.

        +

        Code examples

        +

        Noncompliant code example

        +
        +import pytest
        +
        +@pytest.mark.asyncio  # Noncompliant
        +@pytest.fixture
        +async def db():
        +    return await connect()
        +
        +@pytest.mark.usefixtures("db")  # Noncompliant
        +@pytest.fixture
        +def client(db):
        +    return Client(db)
        +
        +@pytest.mark.slow  # Noncompliant
        +@pytest.fixture
        +def cache():
        +    return {}
        +
        +

        Compliant solution

        +
        +import pytest
        +
        +@pytest.fixture
        +async def db():
        +    return await connect()
        +
        +@pytest.fixture
        +def client(db):
        +    return Client(db)
        +
        +@pytest.fixture
        +def cache():
        +    return {}
        +
        +

        Noncompliant code example

        +
        +import pytest
        +
        +@pytest.mark.usefixtures()  # Noncompliant
        +def test_ping():
        +    assert ping() == "pong"
        +
        +

        Compliant solution

        +
        +def test_ping():
        +    assert ping() == "pong"
        +
        +

        Resources

        +

        Documentation

        + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9074.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9074.json new file mode 100644 index 000000000..f12403cff --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9074.json @@ -0,0 +1,24 @@ +{ + "title": "Pytest marks and usefixtures should not be applied uselessly", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "pytest", + "tests" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-9074", + "sqKey": "S9074", + "scope": "Tests", + "code": { + "impacts": { + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "CLEAR" + }, + "quickfix": "unknown" +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 55c2bb556..dba7e8d9b 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -381,6 +381,7 @@ "S8999", "S9000", "S9001", - "S9073" + "S9073", + "S9074" ] } diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/UselessPytestMarksCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/UselessPytestMarksCheckTest.java new file mode 100644 index 000000000..b5a97d3b9 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/UselessPytestMarksCheckTest.java @@ -0,0 +1,36 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import org.junit.jupiter.api.Test; +import org.sonar.plugins.python.api.PythonCheck; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +import static org.assertj.core.api.Assertions.assertThat; + +class UselessPytestMarksCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/uselessPytestMarks.py", new UselessPytestMarksCheck()); + } + + @Test + void test_scope() { + assertThat(new UselessPytestMarksCheck().scope()).isEqualTo(PythonCheck.CheckScope.ALL); + } +} diff --git a/python-checks/src/test/resources/checks/tests/uselessPytestMarks.py b/python-checks/src/test/resources/checks/tests/uselessPytestMarks.py new file mode 100644 index 000000000..67c02b9a4 --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/uselessPytestMarks.py @@ -0,0 +1,169 @@ +import pytest +from pytest import fixture, mark +from pytest.mark import usefixtures, skip + + +@pytest.mark.asyncio # Noncompliant {{Remove this mark; it has no effect on fixtures.}} +#^[sc=1;ec=20] +@pytest.fixture +async def db_async_mark(): + return await connect() + + +@pytest.mark.usefixtures("db") # Noncompliant {{Remove this mark; it has no effect on fixtures.}} +#^[sc=1;ec=30] +@pytest.fixture +def client_usefixtures_on_fixture(db): + return Client(db) + + +@pytest.mark.slow # Noncompliant {{Remove this mark; it has no effect on fixtures.}} +#^[sc=1;ec=17] +@pytest.fixture +def cache_custom_mark(): + return {} + + +@pytest.mark.parametrize("x", [1, 2]) # Noncompliant {{Remove this mark; it has no effect on fixtures.}} +#^[sc=1;ec=37] +@pytest.fixture +def parametrized_fixture(x): + return x + + +@pytest.mark.skip # Noncompliant {{Remove this mark; it has no effect on fixtures.}} +#^[sc=1;ec=17] +@pytest.fixture +def skipped_fixture(): + return 1 + + +@pytest.fixture +@pytest.mark.asyncio # Noncompliant {{Remove this mark; it has no effect on fixtures.}} +#^[sc=1;ec=20] +async def mark_below_fixture(): + return 1 + + +@pytest.mark.slow # Noncompliant {{Remove this mark; it has no effect on fixtures.}} +#^[sc=1;ec=17] +@pytest.mark.usefixtures("db") # Noncompliant {{Remove this mark; it has no effect on fixtures.}} +#^[sc=1;ec=30] +@pytest.fixture +def multiple_marks_on_fixture(): + return 1 + + +@mark.slow # Noncompliant {{Remove this mark; it has no effect on fixtures.}} +#^[sc=1;ec=10] +@fixture +def imported_mark_on_fixture(): + return 1 + + +@pytest.fixture +@skip # Noncompliant {{Remove this mark; it has no effect on fixtures.}} +#^[sc=1;ec=5] +def imported_skip_on_fixture(): + return 1 + + +@pytest.mark.usefixtures() # Noncompliant {{Remove this mark; it has no effect on fixtures.}} +#^[sc=1;ec=26] +@pytest.fixture +def empty_usefixtures_on_fixture(): + return 1 + + +@pytest.mark.usefixtures # Noncompliant {{Remove this mark; it has no effect on fixtures.}} +#^[sc=1;ec=24] +@pytest.fixture +def bare_usefixtures_on_fixture(): + return 1 + + +@pytest.mark.usefixtures() # Noncompliant {{Provide fixture names or remove this empty usefixtures decorator.}} +#^[sc=1;ec=26] +def test_empty_usefixtures(): + assert ping() == "pong" + + +@pytest.mark.usefixtures() # Noncompliant {{Provide fixture names or remove this empty usefixtures decorator.}} +#^[sc=1;ec=26] +class TestEmptyUsefixtures: + def test_something(self): + assert True + + +@mark.usefixtures() # Noncompliant {{Provide fixture names or remove this empty usefixtures decorator.}} +#^[sc=1;ec=19] +def test_empty_usefixtures_via_mark_import(): + assert True + + +@usefixtures() # Noncompliant {{Provide fixture names or remove this empty usefixtures decorator.}} +#^[sc=1;ec=14] +def test_empty_usefixtures_direct_import(): + assert True + + +# Compliant: clean fixtures +@pytest.fixture +async def db(): + return await connect() + + +@pytest.fixture +def client(db): + return Client(db) + + +@fixture +def cache(): + return {} + + +# Compliant: marks on tests / classes (not fixtures) +@pytest.mark.asyncio +async def test_async(): + assert True + + +@pytest.mark.slow +def test_slow(): + assert True + + +@pytest.mark.usefixtures("db") +def test_with_usefixtures(): + assert True + + +@pytest.mark.usefixtures +def test_bare_usefixtures(): + assert True + + +@pytest.mark.usefixtures("db", "cache") +class TestWithUsefixtures: + def test_something(self): + assert True + + +@mark.parametrize("x", [1]) +def test_parametrized(x): + assert x == 1 + + +@pytest.mark.skip(reason="not ready") +def test_skipped(): + assert False + + +def not_a_test(): + pass + + +@pytest.mark.slow +def helper_not_fixture(): + return 1 diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pytest.mark.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pytest.mark.protobuf index 16f85aa51..4d89c23c2 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pytest.mark.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pytest.mark.protobuf @@ -17,7 +17,12 @@ reason builtins.str" builtins.str * kwargs -Any +Any + usefixturespytest.mark.usefixtures"K +CallableType[builtins.function]& +builtins.function"builtins.function** +fixtures + builtins.str" builtins.str parametrizepytest.mark.parametrize"K CallableType[builtins.function]& builtins.function"builtins.function* diff --git a/python-frontend/typeshed_serializer/checksums/custom.checksum b/python-frontend/typeshed_serializer/checksums/custom.checksum index ad9d85cfb..d13c254c4 100644 --- a/python-frontend/typeshed_serializer/checksums/custom.checksum +++ b/python-frontend/typeshed_serializer/checksums/custom.checksum @@ -1,2 +1,2 @@ -45cfef0a508f7778c60fc3c189df3d9d8c8526a9e1d6eb80cb81ba796e19d2bf -b0f89d4c2c7ca304bcd19013ee1c301c4a7add5d73d8466573d58fae95a54a1e \ No newline at end of file +7ebc27fcf16a9f711a51a18709a2ac817fbac7f2c47682d17464bddbd918143f +596ad14409143c11f980473ada5fde4acee790435af79463cd7f006e941f1510 \ No newline at end of file diff --git a/python-frontend/typeshed_serializer/resources/custom/pytest/mark/__init__.pyi b/python-frontend/typeshed_serializer/resources/custom/pytest/mark/__init__.pyi index def9801e1..e693fbc34 100644 --- a/python-frontend/typeshed_serializer/resources/custom/pytest/mark/__init__.pyi +++ b/python-frontend/typeshed_serializer/resources/custom/pytest/mark/__init__.pyi @@ -4,6 +4,7 @@ _T = TypeVar("_T") def xfail(*args: Any, reason: str = ..., **kwargs: Any) -> Callable[[_T], _T]: ... def skip(*args: Any, reason: str = ..., **kwargs: Any) -> Callable[[_T], _T]: ... +def usefixtures(*fixtures: str) -> Callable[[_T], _T]: ... def parametrize( argnames: Union[str, Sequence[str]], argvalues: object, From 4f10a9409057ffb45adc488c683fe2e465e1fb1f Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Tue, 28 Jul 2026 12:00:43 +0200 Subject: [PATCH 252/322] SONARPY-4415 Implement S9076: Replace deprecated pytest.yield_fixture with pytest.fixture GitOrigin-RevId: 9ef442c5660d78fca5f51314fb412e78edacc372 --- .../python/checks/OpenSourceCheckList.java | 2 + .../tests/DeprecatedYieldFixtureCheck.java | 53 ++++++++++ .../org/sonar/l10n/py/rules/python/S9076.html | 50 +++++++++ .../org/sonar/l10n/py/rules/python/S9076.json | 24 +++++ .../py/rules/python/Sonar_way_profile.json | 3 +- .../DeprecatedYieldFixtureCheckTest.java | 36 +++++++ .../checks/tests/deprecatedYieldFixture.py | 100 ++++++++++++++++++ .../types/custom_protobuf/pytest.protobuf | 12 +++ .../checksums/custom.checksum | 4 +- .../resources/custom/pytest/__init__.pyi | 2 + 10 files changed, 283 insertions(+), 3 deletions(-) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/tests/DeprecatedYieldFixtureCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9076.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9076.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/tests/DeprecatedYieldFixtureCheckTest.java create mode 100644 python-checks/src/test/resources/checks/tests/deprecatedYieldFixture.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 9394cc18b..e26d7aad1 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -98,6 +98,7 @@ import org.sonar.python.checks.tests.CompositeAssertionCheck; import org.sonar.python.checks.tests.DedicatedAssertionCheck; import org.sonar.python.checks.tests.DedicatedExceptionAssertionCheck; +import org.sonar.python.checks.tests.DeprecatedYieldFixtureCheck; import org.sonar.python.checks.tests.EmptyParametrizeValuesCheck; import org.sonar.python.checks.tests.FixtureParamDependenciesCheck; import org.sonar.python.checks.tests.GroupSimilarTestsParameterizedCheck; @@ -209,6 +210,7 @@ public Stream> getChecks() { EmptyParametrizeValuesCheck.class, DefaultFactoryArgumentCheck.class, DeprecatedNumpyTypesCheck.class, + DeprecatedYieldFixtureCheck.class, DictKeysMembershipTestCheck.class, DictionaryDuplicateKeyCheck.class, DictionaryStaticKeyCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/DeprecatedYieldFixtureCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/DeprecatedYieldFixtureCheck.java new file mode 100644 index 000000000..b05fa79a9 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/DeprecatedYieldFixtureCheck.java @@ -0,0 +1,53 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.Decorator; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; + +@Rule(key = "S9076") +public class DeprecatedYieldFixtureCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Replace deprecated pytest.yield_fixture with pytest.fixture."; + + private static final TypeMatcher YIELD_FIXTURE_MATCHER = TypeMatchers.isType("pytest.yield_fixture"); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.DECORATOR, ctx -> checkDecorator(ctx, (Decorator) ctx.syntaxNode())); + } + + @Override + public CheckScope scope() { + return CheckScope.ALL; + } + + private static void checkDecorator(SubscriptionContext ctx, Decorator decorator) { + Expression expression = decorator.expression(); + Expression matchedExpression = expression.is(Tree.Kind.CALL_EXPR) ? ((CallExpression) expression).callee() : expression; + if (YIELD_FIXTURE_MATCHER.isTrueFor(matchedExpression, ctx)) { + ctx.addIssue(expression, MESSAGE); + } + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9076.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9076.html new file mode 100644 index 000000000..118700104 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9076.html @@ -0,0 +1,50 @@ +

        This rule raises an issue when a pytest fixture uses the deprecated @pytest.yield_fixture decorator.

        +

        Why is this an issue?

        +

        Before pytest 3.0, fixtures that needed teardown used @pytest.yield_fixture. Since then, @pytest.fixture supports +yield for setup and teardown. pytest.yield_fixture remains only as a deprecated alias:

        +
        +@pytest.yield_fixture  # Deprecated
        +def resource():
        +    value = acquire()
        +    yield value
        +    release(value)
        +
        +

        Replace it with @pytest.fixture; the yield body stays the same.

        +

        What is the potential impact?

        +

        Deprecated @pytest.yield_fixture triggers deprecation warnings and will break on newer pytest versions. Migrating to +@pytest.fixture keeps fixture code compatible and consistent with current pytest APIs.

        +

        How to fix it

        +

        Replace @pytest.yield_fixture with @pytest.fixture. Keep the same yield body for setup and teardown.

        +

        Code examples

        +

        Noncompliant code example

        +
        +import pytest
        +
        +@pytest.yield_fixture  # Noncompliant
        +def old_style():
        +    value = 1
        +    yield value
        +
        +

        Compliant solution

        +
        +import pytest
        +
        +@pytest.fixture
        +def old_style():
        +    value = 1
        +    yield value
        +
        +

        Resources

        +

        Documentation

        + +

        Related rules

        +
          +
        • {rule:python:S9116} - Pytest fixture options should be passed as keyword arguments
        • +
        • {rule:python:S9117} - Pytest fixtures should not declare the default scope="function"
        • +
        + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9076.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9076.json new file mode 100644 index 000000000..22aa5154a --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9076.json @@ -0,0 +1,24 @@ +{ + "title": "Deprecated pytest.yield_fixture should be replaced with pytest.fixture", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "pytest", + "tests" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-9076", + "sqKey": "S9076", + "scope": "Tests", + "quickfix": "unknown", + "code": { + "impacts": { + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "CONVENTIONAL" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index dba7e8d9b..117f3ee89 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -382,6 +382,7 @@ "S9000", "S9001", "S9073", - "S9074" + "S9074", + "S9076" ] } diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/DeprecatedYieldFixtureCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/DeprecatedYieldFixtureCheckTest.java new file mode 100644 index 000000000..9c3066512 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/DeprecatedYieldFixtureCheckTest.java @@ -0,0 +1,36 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import org.junit.jupiter.api.Test; +import org.sonar.plugins.python.api.PythonCheck; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +import static org.assertj.core.api.Assertions.assertThat; + +class DeprecatedYieldFixtureCheckTest { + + @Test + void scope() { + assertThat(new DeprecatedYieldFixtureCheck().scope()).isEqualTo(PythonCheck.CheckScope.ALL); + } + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/deprecatedYieldFixture.py", new DeprecatedYieldFixtureCheck()); + } +} diff --git a/python-checks/src/test/resources/checks/tests/deprecatedYieldFixture.py b/python-checks/src/test/resources/checks/tests/deprecatedYieldFixture.py new file mode 100644 index 000000000..e3d0d13a2 --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/deprecatedYieldFixture.py @@ -0,0 +1,100 @@ +import pytest + + +@pytest.yield_fixture # Noncompliant {{Replace deprecated pytest.yield_fixture with pytest.fixture.}} +#^^^^^^^^^^^^^^^^^^^^ +def bare_yield_fixture(): + value = acquire() + yield value + release(value) + + +@pytest.yield_fixture() # Noncompliant {{Replace deprecated pytest.yield_fixture with pytest.fixture.}} +#^^^^^^^^^^^^^^^^^^^^^^ +def called_yield_fixture(): + value = acquire() + yield value + release(value) + + +@pytest.yield_fixture(scope="module") # Noncompliant {{Replace deprecated pytest.yield_fixture with pytest.fixture.}} +#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +def yield_fixture_with_kwargs(): + value = acquire() + yield value + release(value) + + +from pytest import yield_fixture + + +@yield_fixture # Noncompliant {{Replace deprecated pytest.yield_fixture with pytest.fixture.}} +#^^^^^^^^^^^^^ +def imported_yield_fixture(): + value = acquire() + yield value + release(value) + + +from pytest import yield_fixture as legacy_fixture + + +@legacy_fixture # Noncompliant {{Replace deprecated pytest.yield_fixture with pytest.fixture.}} +#^^^^^^^^^^^^^^ +def aliased_imported_yield_fixture(): + value = acquire() + yield value + release(value) + + +import pytest as pt + + +@pt.yield_fixture # Noncompliant {{Replace deprecated pytest.yield_fixture with pytest.fixture.}} +#^^^^^^^^^^^^^^^^ +def aliased_module_yield_fixture(): + value = acquire() + yield value + release(value) + + +@pytest.fixture +def compliant_fixture(): + value = acquire() + yield value + release(value) + + +@pytest.fixture() +def compliant_called_fixture(): + value = acquire() + yield value + release(value) + + +@pytest.fixture(scope="module") +def compliant_fixture_with_kwargs(): + value = acquire() + yield value + release(value) + + +class NotPytest: + @staticmethod + def yield_fixture(*args, **kwargs): + pass + + +@NotPytest.yield_fixture +def decoy_class_attribute(): + pass + + +@bob.bob +def decoy_qualified_expression_null_symbol(): + pass + + +@"my string" +def decoy_decorator_without_symbol(): + pass diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pytest.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pytest.protobuf index 1c59e26ca..2976f3e2b 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pytest.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pytest.protobuf @@ -14,6 +14,18 @@ args" builtins.object"builtins.object*. kwargs" +builtins.object"builtins.object + yield_fixturepytest.yield_fixture" +Any*, +args" +builtins.object"builtins.object*. +kwargs" +builtins.object"builtins.objectz +fail pytest.fail" +Any*, +args" +builtins.object"builtins.object*. +kwargs" builtins.object"builtins.object~ raises pytest.raises" Any*, diff --git a/python-frontend/typeshed_serializer/checksums/custom.checksum b/python-frontend/typeshed_serializer/checksums/custom.checksum index d13c254c4..bc989159f 100644 --- a/python-frontend/typeshed_serializer/checksums/custom.checksum +++ b/python-frontend/typeshed_serializer/checksums/custom.checksum @@ -1,2 +1,2 @@ -7ebc27fcf16a9f711a51a18709a2ac817fbac7f2c47682d17464bddbd918143f -596ad14409143c11f980473ada5fde4acee790435af79463cd7f006e941f1510 \ No newline at end of file +ba3b3091c40a7d033b1bf791cbaac8347b753c6a4ef98b638e3cab19203ea749 +d0347d84e17de38e249de18f0239864d654aecbd5f842743a985764b4046027d \ No newline at end of file diff --git a/python-frontend/typeshed_serializer/resources/custom/pytest/__init__.pyi b/python-frontend/typeshed_serializer/resources/custom/pytest/__init__.pyi index 1909347e1..34378565d 100644 --- a/python-frontend/typeshed_serializer/resources/custom/pytest/__init__.pyi +++ b/python-frontend/typeshed_serializer/resources/custom/pytest/__init__.pyi @@ -5,6 +5,8 @@ class ApproxScalar(CustomStubBase): ... def approx(expected: object = ..., *args: object, **kwargs: object) -> ApproxScalar: ... def fixture(*args: object, **kwargs: object): ... +def yield_fixture(*args: object, **kwargs: object): ... +def fail(*args: object, **kwargs: object): ... def raises(*args: object, **kwargs: object): ... import pytest.mark as mark From dbba186e37caced7efcc2a089bbd4f64ca7659cd Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Tue, 28 Jul 2026 14:20:03 +0200 Subject: [PATCH 253/322] SONARPY-4414 : Implement rule S9075 - Add specific warning assertion rule GitOrigin-RevId: 63f64ee7c3a6e34308852371881271de5d2c400d --- .../python/checks/OpenSourceCheckList.java | 2 + .../tests/SpecificWarningAssertionCheck.java | 97 +++++++++++++ .../python/checks/utils/UnittestUtils.java | 20 +++ .../org/sonar/l10n/py/rules/python/S9075.html | 76 ++++++++++ .../org/sonar/l10n/py/rules/python/S9075.json | 24 ++++ .../py/rules/python/Sonar_way_profile.json | 1 + .../SpecificWarningAssertionCheckTest.java | 36 +++++ .../checks/utils/UnittestUtilsTest.java | 27 ++++ .../checks/tests/specificWarningAssertion.py | 136 ++++++++++++++++++ .../types/custom_protobuf/pytest.protobuf | 6 + .../checksums/custom.checksum | 4 +- .../resources/custom/pytest/__init__.pyi | 1 + 12 files changed, 428 insertions(+), 2 deletions(-) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/tests/SpecificWarningAssertionCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9075.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9075.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/tests/SpecificWarningAssertionCheckTest.java create mode 100644 python-checks/src/test/resources/checks/tests/specificWarningAssertion.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index e26d7aad1..112cef56c 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -112,6 +112,7 @@ import org.sonar.python.checks.tests.SingleInvocationRuntimeExceptionCheck; import org.sonar.python.checks.tests.SkippedTestNoReasonCheck; import org.sonar.python.checks.tests.SpecificExceptionAssertionCheck; +import org.sonar.python.checks.tests.SpecificWarningAssertionCheck; import org.sonar.python.checks.tests.TestCasesShouldContainTestsCheck; import org.sonar.python.checks.tests.UnconditionalAssertionCheck; import org.sonar.python.checks.tests.UseMonkeypatchFixtureCheck; @@ -453,6 +454,7 @@ public Stream> getChecks() { SpecialMethodParamListCheck.class, SpecialMethodReturnTypeCheck.class, SpecificExceptionAssertionCheck.class, + SpecificWarningAssertionCheck.class, TestCasesShouldContainTestsCheck.class, SQLQueriesCheck.class, StartsWithEndsWithTupleCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/SpecificWarningAssertionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/SpecificWarningAssertionCheck.java new file mode 100644 index 000000000..d839a1076 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/SpecificWarningAssertionCheck.java @@ -0,0 +1,97 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import java.util.List; +import javax.annotation.Nullable; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.checks.utils.Expressions; +import org.sonar.python.checks.utils.UnittestUtils; + +@Rule(key = "S9075") +public class SpecificWarningAssertionCheck extends PythonSubscriptionCheck { + private static final String MESSAGE = "This assertion is too broad; use a more specific warning type or check the warning message."; + + private static final TypeMatcher BROAD_WARNING_MATCHER = TypeMatchers.any( + TypeMatchers.isType("Warning"), + TypeMatchers.isObjectOfType("Warning") + ); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, ctx -> checkCallExpression(ctx, (CallExpression) ctx.syntaxNode())); + } + + @Override + public CheckScope scope() { + return CheckScope.ALL; + } + + private static void checkCallExpression(SubscriptionContext ctx, CallExpression callExpression) { + Expression issueLocation = underspecifiedWarningArgument(callExpression, ctx); + if (issueLocation != null) { + ctx.addIssue(issueLocation, MESSAGE); + } + } + + @Nullable + private static Expression underspecifiedWarningArgument(CallExpression callExpression, SubscriptionContext ctx) { + if (!UnittestUtils.isPytestWarns(callExpression, ctx)) { + return null; + } + RegularArgument warningArgument = UnittestUtils.pytestExpectedWarningArgument(callExpression); + if (warningArgument == null) { + return callExpression; + } + if (hasEffectiveMatchArgument(callExpression)) { + return null; + } + return broadWarningLocation(warningArgument.expression(), ctx); + } + + @Nullable + private static Expression broadWarningLocation(Expression expression, SubscriptionContext ctx) { + Expression unwrapped = Expressions.removeParentheses(expression); + List elements = Expressions.expressionsFromListOrTuple(unwrapped); + if (!elements.isEmpty()) { + for (Expression element : elements) { + Expression location = broadWarningLocation(element, ctx); + if (location != null) { + return location; + } + } + return null; + } + if (BROAD_WARNING_MATCHER.isTrueFor(unwrapped, ctx)) { + return unwrapped; + } + return null; + } + + private static boolean hasEffectiveMatchArgument(CallExpression callExpression) { + RegularArgument matchArgument = UnittestUtils.pytestMatchArgument(callExpression); + return matchArgument != null && !Expressions.isFalsy(matchArgument.expression()); + } +} diff --git a/python-checks/src/main/java/org/sonar/python/checks/utils/UnittestUtils.java b/python-checks/src/main/java/org/sonar/python/checks/utils/UnittestUtils.java index 799302c7e..8d534f620 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/utils/UnittestUtils.java +++ b/python-checks/src/main/java/org/sonar/python/checks/utils/UnittestUtils.java @@ -46,9 +46,11 @@ public class UnittestUtils { public static final String PYTEST_FIXTURE_DECORATOR_FQN = "pytest.fixture"; private static final String UNITTEST_TEST_CASE_FQN_PREFIX = "unittest.case.TestCase."; private static final String PYTEST_EXPECTED_EXCEPTION = "expected_exception"; + private static final String PYTEST_EXPECTED_WARNING = "expected_warning"; private static final String PYTEST_MATCH = "match"; private static final String UNITTEST_EXCEPTION = "exception"; private static final TypeMatcher PYTEST_RAISES_MATCHER = TypeMatchers.withFQN("pytest.raises"); + private static final TypeMatcher PYTEST_WARNS_MATCHER = TypeMatchers.withFQN("pytest.warns"); public static final String ASSERT_RAISES_REGEXP = "assertRaisesRegexp"; public static final String ASSERT_RAISES_REGEX = "assertRaisesRegex"; private static final TypeMatcher UNITTEST_ASSERT_RAISES_MATCHER = TypeMatchers.any( @@ -179,15 +181,33 @@ public static boolean isPytestRaises(CallExpression callExpression, Subscription return PYTEST_RAISES_MATCHER.isTrueFor(callExpression.callee(), ctx); } + public static boolean isPytestWarns(CallExpression callExpression, SubscriptionContext ctx) { + return PYTEST_WARNS_MATCHER.isTrueFor(callExpression.callee(), ctx); + } + public static boolean hasPytestRaisesMatchArgument(CallExpression callExpression) { return TreeUtils.argumentByKeyword(PYTEST_MATCH, callExpression.arguments()) != null; } + public static boolean hasPytestWarnsMatchArgument(CallExpression callExpression) { + return TreeUtils.argumentByKeyword(PYTEST_MATCH, callExpression.arguments()) != null; + } + @Nullable public static RegularArgument pytestExpectedExceptionArgument(CallExpression callExpression) { return TreeUtils.nthArgumentOrKeyword(0, PYTEST_EXPECTED_EXCEPTION, callExpression.arguments()); } + @Nullable + public static RegularArgument pytestExpectedWarningArgument(CallExpression callExpression) { + return TreeUtils.nthArgumentOrKeyword(0, PYTEST_EXPECTED_WARNING, callExpression.arguments()); + } + + @Nullable + public static RegularArgument pytestMatchArgument(CallExpression callExpression) { + return TreeUtils.argumentByKeyword(PYTEST_MATCH, callExpression.arguments()); + } + public static boolean isUnittestAssertRaises(CallExpression callExpression, SubscriptionContext ctx) { return UNITTEST_ASSERT_RAISES_MATCHER.isTrueFor(callExpression.callee(), ctx); } diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9075.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9075.html new file mode 100644 index 000000000..b21cd0e0c --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9075.html @@ -0,0 +1,76 @@ +

        This is an issue when test code verifies that a warning was emitted without specifying its type, or when it uses the overly broad base +Warning type without checking the message.

        +

        In Python with pytest, this refers to underspecified pytest.warns() usage, such as:

        +
          +
        • Calls without an expected warning type, for example pytest.warns()
        • +
        • The base type Warning without a match parameter
        • +
        +

        More specific warning types such as UserWarning or DeprecationWarning are not covered by this rule when used without +match=.

        +

        Why is this an issue?

        +

        When testing that code emits a warning, it is not sufficient to verify only that some warning was raised. Tests should also validate the +warning type or message to differentiate expected warnings from unexpected ones.

        +

        Consider a function that should emit a DeprecationWarning when given a legacy argument. If your test only checks that a warning +occurred, it cannot distinguish between:

        +
          +
        • The expected DeprecationWarning indicating proper deprecation signaling
        • +
        • An unexpected UserWarning from a different code path
        • +
        • An unexpected ResourceWarning from a resource leak
        • +
        +

        All three scenarios would make the test pass, even though two represent unintended behavior.

        +

        In pytest, the following patterns lead to insufficiently specific warning testing:

        +
          +
        • Using pytest.warns() without an expected warning type
        • +
        • Using pytest.warns(Warning) without match=
        • +
        +

        The base Warning class is the root of the warning hierarchy and catches every warning subtype. More specific types such as +UserWarning or DeprecationWarning are accepted without match=.

        +

        These patterns create fragile tests that may pass for the wrong reasons, allowing regressions to slip through undetected.

        +

        What is the potential impact?

        +

        Tests that underspecify expected warnings can pass when an unrelated warning is emitted, leaving regressions undetected. Narrowing the expected +type and message keeps warning tests as a reliable safety net.

        +

        How to fix it

        +

        Pass a specific warning type to pytest.warns. When using the base Warning type, add match= with a pattern +for the message.

        +

        Code examples

        +

        Noncompliant code example

        +
        +import warnings
        +import pytest
        +
        +def test_warns_without_type():
        +    with pytest.warns():  # Noncompliant: no expected warning type
        +        warnings.warn("x", UserWarning)
        +
        +def test_warns_broad_type():
        +    with pytest.warns(Warning):  # Noncompliant: base Warning without match=
        +        warnings.warn("deprecated", DeprecationWarning)
        +
        +

        Compliant solution

        +
        +import warnings
        +import pytest
        +
        +def test_warns_without_type():
        +    with pytest.warns(UserWarning):
        +        warnings.warn("x", UserWarning)
        +
        +def test_warns_broad_type():
        +    # Base Warning is allowed when match= narrows the expected message
        +    with pytest.warns(Warning, match="deprecated"):
        +        warnings.warn("deprecated", DeprecationWarning)
        +
        +

        Resources

        +

        Documentation

        + +

        Related rules

        +
          +
        • {rule:python:S5958} - Tests should check which exception is thrown
        • +
        + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9075.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9075.json new file mode 100644 index 000000000..c283feaca --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9075.json @@ -0,0 +1,24 @@ +{ + "title": "Tests should check which warning is expected", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "pytest", + "tests" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-9075", + "sqKey": "S9075", + "scope": "Tests", + "quickfix": "unknown", + "code": { + "impacts": { + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "TESTED" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 117f3ee89..080c23729 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -383,6 +383,7 @@ "S9001", "S9073", "S9074", + "S9075", "S9076" ] } diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/SpecificWarningAssertionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/SpecificWarningAssertionCheckTest.java new file mode 100644 index 000000000..06cfd9043 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/SpecificWarningAssertionCheckTest.java @@ -0,0 +1,36 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import org.junit.jupiter.api.Test; +import org.sonar.plugins.python.api.PythonCheck; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class SpecificWarningAssertionCheckTest { + + @Test + void scope() { + assertEquals(PythonCheck.CheckScope.ALL, new SpecificWarningAssertionCheck().scope()); + } + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/specificWarningAssertion.py", new SpecificWarningAssertionCheck()); + } +} diff --git a/python-checks/src/test/java/org/sonar/python/checks/utils/UnittestUtilsTest.java b/python-checks/src/test/java/org/sonar/python/checks/utils/UnittestUtilsTest.java index 0f9e1941b..5e8a1896c 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/utils/UnittestUtilsTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/utils/UnittestUtilsTest.java @@ -26,6 +26,7 @@ import org.sonar.plugins.python.api.tree.ClassDef; import org.sonar.plugins.python.api.tree.FileInput; import org.sonar.plugins.python.api.tree.FunctionDef; +import org.sonar.plugins.python.api.tree.RegularArgument; import org.sonar.plugins.python.api.tree.Tree; import org.sonar.python.SubscriptionVisitor; import org.sonar.python.TestPythonVisitorRunner; @@ -264,6 +265,32 @@ void test_pytest_raises_helpers() { assertThat(exceptionArguments).containsExactly("Exception", "ValueError"); } + @Test + void test_pytest_warns_helpers() { + List isPytestWarns = new ArrayList<>(); + List hasMatchArgument = new ArrayList<>(); + List warningArguments = new ArrayList<>(); + List matchArguments = new ArrayList<>(); + + analyzeCallExpressions(""" + import pytest + from pytest import warns + pytest.warns(Warning, match="bad") + warns(UserWarning) + """, (ctx, callExpression) -> { + isPytestWarns.add(UnittestUtils.isPytestWarns(callExpression, ctx)); + hasMatchArgument.add(UnittestUtils.hasPytestWarnsMatchArgument(callExpression)); + warningArguments.add(UnittestUtils.pytestExpectedWarningArgument(callExpression).expression().firstToken().value()); + RegularArgument matchArgument = UnittestUtils.pytestMatchArgument(callExpression); + matchArguments.add(matchArgument == null ? null : matchArgument.expression().firstToken().value()); + }); + + assertThat(isPytestWarns).containsExactly(true, true); + assertThat(hasMatchArgument).containsExactly(true, false); + assertThat(warningArguments).containsExactly("Warning", "UserWarning"); + assertThat(matchArguments).containsExactly("\"bad\"", null); + } + @Test void test_unittest_assert_raises_helpers() { List isAssertRaises = new ArrayList<>(); diff --git a/python-checks/src/test/resources/checks/tests/specificWarningAssertion.py b/python-checks/src/test/resources/checks/tests/specificWarningAssertion.py new file mode 100644 index 000000000..dec47ffed --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/specificWarningAssertion.py @@ -0,0 +1,136 @@ +import warnings + +import pytest +from pytest import warns as imported_warns + + +def emit_user_warning(): + warnings.warn("x", UserWarning) + + +def emit_deprecation_warning(): + warnings.warn("deprecated", DeprecationWarning) + + +class DummyContextManager: + def __enter__(self): + return self + + def __exit__(self, exc_type, exc, tb): + return False + + +dummy_context_manager = DummyContextManager() + + +def test_warns_without_type(): + with pytest.warns(): # Noncompliant {{This assertion is too broad; use a more specific warning type or check the warning message.}} +# ^^^^^^^^^^^^^^ + emit_user_warning() + + +def test_warns_broad_warning(): + with pytest.warns(Warning): # Noncompliant {{This assertion is too broad; use a more specific warning type or check the warning message.}} +# ^^^^^^^ + emit_deprecation_warning() + + +def test_warns_expected_warning_keyword(): + with pytest.warns(expected_warning=Warning): # Noncompliant {{This assertion is too broad; use a more specific warning type or check the warning message.}} +# ^^^^^^^ + emit_deprecation_warning() + + +def test_imported_warns_broad(): + with imported_warns(Warning): # Noncompliant {{This assertion is too broad; use a more specific warning type or check the warning message.}} +# ^^^^^^^ + emit_deprecation_warning() + + +def test_warns_empty_match(): + with pytest.warns(Warning, match=""): # Noncompliant {{This assertion is too broad; use a more specific warning type or check the warning message.}} +# ^^^^^^^ + emit_deprecation_warning() + + +def test_warns_none_match(): + with pytest.warns(Warning, match=None): # Noncompliant {{This assertion is too broad; use a more specific warning type or check the warning message.}} +# ^^^^^^^ + emit_deprecation_warning() + + +def test_direct_warns_without_type(): + pytest.warns() # Noncompliant {{This assertion is too broad; use a more specific warning type or check the warning message.}} +# ^^^^^^^^^^^^^^ + + +def test_direct_warns_broad(): + pytest.warns(Warning, emit_deprecation_warning) # Noncompliant {{This assertion is too broad; use a more specific warning type or check the warning message.}} +# ^^^^^^^ + + +def test_warns_tuple_containing_warning(): + with pytest.warns((Warning, UserWarning)): # Noncompliant {{This assertion is too broad; use a more specific warning type or check the warning message.}} +# ^^^^^^^ + emit_user_warning() + + +def test_warns_list_containing_warning(): + with pytest.warns([Warning, DeprecationWarning]): # Noncompliant {{This assertion is too broad; use a more specific warning type or check the warning message.}} +# ^^^^^^^ + emit_deprecation_warning() + + +def test_warns_nested_tuple_containing_warning(): + with pytest.warns(((Warning,), UserWarning)): # Noncompliant {{This assertion is too broad; use a more specific warning type or check the warning message.}} +# ^^^^^^^ + emit_user_warning() + + +def test_warns_user_warning_without_match(): + with pytest.warns(UserWarning): + emit_user_warning() + + +def test_warns_deprecation_warning_without_match(): + with pytest.warns(DeprecationWarning): + emit_deprecation_warning() + + +def test_warns_specific_type(): + with pytest.warns(ResourceWarning): + warnings.warn("resource", ResourceWarning) + + +def test_warns_tuple_without_warning(): + with pytest.warns((UserWarning, DeprecationWarning)): + emit_user_warning() + + +def test_warns_tuple_with_warning_and_match(): + with pytest.warns((Warning, UserWarning), match="x"): + emit_user_warning() + + +def test_warns_broad_with_match(): + with pytest.warns(Warning, match="deprecated"): + emit_deprecation_warning() + + +def test_warns_user_warning_with_match(): + with pytest.warns(UserWarning, match="x"): + emit_user_warning() + + +def test_imported_warns_specific(): + with imported_warns(ResourceWarning): + warnings.warn("resource", ResourceWarning) + + +def test_with_non_call_context_manager(): + with dummy_context_manager: + emit_user_warning() + + +def test_unrelated_call(): + warnings.warn("x", UserWarning) diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pytest.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pytest.protobuf index 2976f3e2b..ccfecf04a 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pytest.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/pytest.protobuf @@ -32,6 +32,12 @@ args" builtins.object"builtins.object*. kwargs" +builtins.object"builtins.object| +warns pytest.warns" +Any*, +args" +builtins.object"builtins.object*. +kwargs" builtins.object"builtins.object*g __path__pytest.__path__J builtins.list[builtins.str] diff --git a/python-frontend/typeshed_serializer/checksums/custom.checksum b/python-frontend/typeshed_serializer/checksums/custom.checksum index bc989159f..36a307a12 100644 --- a/python-frontend/typeshed_serializer/checksums/custom.checksum +++ b/python-frontend/typeshed_serializer/checksums/custom.checksum @@ -1,2 +1,2 @@ -ba3b3091c40a7d033b1bf791cbaac8347b753c6a4ef98b638e3cab19203ea749 -d0347d84e17de38e249de18f0239864d654aecbd5f842743a985764b4046027d \ No newline at end of file +5bad68d78470e89ef27a382998f42c49ad8c4b7cee20c9f643f50e1934cf28ae +19f5ef8341087132db6c9a30db685d9735b530af55f7978919dd7c4aa4d6113a \ No newline at end of file diff --git a/python-frontend/typeshed_serializer/resources/custom/pytest/__init__.pyi b/python-frontend/typeshed_serializer/resources/custom/pytest/__init__.pyi index 34378565d..b80588189 100644 --- a/python-frontend/typeshed_serializer/resources/custom/pytest/__init__.pyi +++ b/python-frontend/typeshed_serializer/resources/custom/pytest/__init__.pyi @@ -8,5 +8,6 @@ def fixture(*args: object, **kwargs: object): ... def yield_fixture(*args: object, **kwargs: object): ... def fail(*args: object, **kwargs: object): ... def raises(*args: object, **kwargs: object): ... +def warns(*args: object, **kwargs: object): ... import pytest.mark as mark From 6d50d0330dec3bd38bf56629ac9a1575efa35e07 Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Tue, 28 Jul 2026 15:42:09 +0200 Subject: [PATCH 254/322] SONARPY-4417 Implement S9078: Parametrize decorators should not contain duplicate test cases Co-authored-by: github-actions[bot] GitOrigin-RevId: 4f4df394abe306baef3d438dd63feab8815e2382 --- .../python/checks/OpenSourceCheckList.java | 2 + .../tests/DuplicateParametrizeCasesCheck.java | 78 +++++++ .../SpecificExceptionAssertionCheck.java | 2 +- .../python/checks/utils/UnittestUtils.java | 23 +- .../org/sonar/l10n/py/rules/python/S9078.html | 74 +++++++ .../org/sonar/l10n/py/rules/python/S9078.json | 24 +++ .../py/rules/python/Sonar_way_profile.json | 3 +- .../DuplicateParametrizeCasesCheckTest.java | 36 ++++ .../checks/utils/UnittestUtilsTest.java | 4 +- .../checks/tests/duplicateParametrizeCases.py | 196 ++++++++++++++++++ 10 files changed, 430 insertions(+), 12 deletions(-) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/tests/DuplicateParametrizeCasesCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9078.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9078.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/tests/DuplicateParametrizeCasesCheckTest.java create mode 100644 python-checks/src/test/resources/checks/tests/duplicateParametrizeCases.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 112cef56c..3b6442563 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -99,6 +99,7 @@ import org.sonar.python.checks.tests.DedicatedAssertionCheck; import org.sonar.python.checks.tests.DedicatedExceptionAssertionCheck; import org.sonar.python.checks.tests.DeprecatedYieldFixtureCheck; +import org.sonar.python.checks.tests.DuplicateParametrizeCasesCheck; import org.sonar.python.checks.tests.EmptyParametrizeValuesCheck; import org.sonar.python.checks.tests.FixtureParamDependenciesCheck; import org.sonar.python.checks.tests.GroupSimilarTestsParameterizedCheck; @@ -208,6 +209,7 @@ public Stream> getChecks() { DebugModeCheck.class, DedicatedAssertionCheck.class, DedicatedExceptionAssertionCheck.class, + DuplicateParametrizeCasesCheck.class, EmptyParametrizeValuesCheck.class, DefaultFactoryArgumentCheck.class, DeprecatedNumpyTypesCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/DuplicateParametrizeCasesCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/DuplicateParametrizeCasesCheck.java new file mode 100644 index 000000000..5836dcb8a --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/DuplicateParametrizeCasesCheck.java @@ -0,0 +1,78 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import java.util.ArrayList; +import java.util.List; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.Decorator; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.python.checks.utils.CheckUtils; +import org.sonar.python.checks.utils.Expressions; +import org.sonar.python.checks.utils.UnittestUtils; + +@Rule(key = "S9078") +public class DuplicateParametrizeCasesCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Remove this duplicate test case."; + private static final String SECONDARY_MESSAGE = "Original."; + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.DECORATOR, DuplicateParametrizeCasesCheck::checkDecorator); + } + + @Override + public CheckScope scope() { + return CheckScope.ALL; + } + + private static void checkDecorator(SubscriptionContext ctx) { + Decorator decorator = (Decorator) ctx.syntaxNode(); + Expression valuesExpression = UnittestUtils.parametrizeArgvaluesExpression(decorator, ctx); + if (valuesExpression == null || !valuesExpression.is(Tree.Kind.LIST_LITERAL, Tree.Kind.TUPLE)) { + return; + } + + raiseOnDuplicates(Expressions.expressionsFromListOrTuple(valuesExpression), ctx); + } + + private static void raiseOnDuplicates(List cases, SubscriptionContext ctx) { + List distinctCases = new ArrayList<>(); + for (Expression testCase : cases) { + Expression original = findEquivalent(distinctCases, testCase); + if (original != null) { + ctx.addIssue(testCase, MESSAGE).secondary(original, SECONDARY_MESSAGE); + } else { + distinctCases.add(testCase); + } + } + } + + private static Expression findEquivalent(List distinctCases, Expression testCase) { + Expression normalizedCase = Expressions.removeParentheses(testCase); + for (Expression distinctCase : distinctCases) { + if (CheckUtils.areEquivalent(Expressions.removeParentheses(distinctCase), normalizedCase)) { + return distinctCase; + } + } + return null; + } +} diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/SpecificExceptionAssertionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/SpecificExceptionAssertionCheck.java index 55dd1d772..a93ff9cbf 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/SpecificExceptionAssertionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/SpecificExceptionAssertionCheck.java @@ -80,7 +80,7 @@ private static void checkCallExpression(SubscriptionContext ctx, CallExpression private static Expression genericExceptionArgument(CallExpression callExpression, SubscriptionContext ctx) { RegularArgument exceptionArgument = null; if (UnittestUtils.isPytestRaises(callExpression, ctx)) { - if (UnittestUtils.hasPytestRaisesMatchArgument(callExpression)) { + if (UnittestUtils.pytestMatchArgument(callExpression) != null) { return null; } exceptionArgument = UnittestUtils.pytestExpectedExceptionArgument(callExpression); diff --git a/python-checks/src/main/java/org/sonar/python/checks/utils/UnittestUtils.java b/python-checks/src/main/java/org/sonar/python/checks/utils/UnittestUtils.java index 8d534f620..2f231f7fe 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/utils/UnittestUtils.java +++ b/python-checks/src/main/java/org/sonar/python/checks/utils/UnittestUtils.java @@ -71,6 +71,7 @@ public class UnittestUtils { TypeMatchers.isType(UNITTEST_TEST_CASE_FQN_PREFIX + "assertIs"), TypeMatchers.isType(UNITTEST_TEST_CASE_FQN_PREFIX + "assertIsNot")); public static final TypeMatcher PYTEST_APPROX_MATCHER = TypeMatchers.isType("pytest.approx"); + private static final TypeMatcher PYTEST_PARAMETRIZE_MATCHER = TypeMatchers.isType("pytest.mark.parametrize"); public static final TypeMatcher ASSERTPY_IS_EQUAL_TO_MATCHER = TypeMatchers.isType("assertpy.AssertionBuilder.is_equal_to"); public static final TypeMatcher ASSERTPY_EQUALITY_ASSERTION_MATCHER = TypeMatchers.any( TypeMatchers.isType("assertpy.AssertionBuilder.is_equal_to"), @@ -185,14 +186,6 @@ public static boolean isPytestWarns(CallExpression callExpression, SubscriptionC return PYTEST_WARNS_MATCHER.isTrueFor(callExpression.callee(), ctx); } - public static boolean hasPytestRaisesMatchArgument(CallExpression callExpression) { - return TreeUtils.argumentByKeyword(PYTEST_MATCH, callExpression.arguments()) != null; - } - - public static boolean hasPytestWarnsMatchArgument(CallExpression callExpression) { - return TreeUtils.argumentByKeyword(PYTEST_MATCH, callExpression.arguments()) != null; - } - @Nullable public static RegularArgument pytestExpectedExceptionArgument(CallExpression callExpression) { return TreeUtils.nthArgumentOrKeyword(0, PYTEST_EXPECTED_EXCEPTION, callExpression.arguments()); @@ -208,6 +201,20 @@ public static RegularArgument pytestMatchArgument(CallExpression callExpression) return TreeUtils.argumentByKeyword(PYTEST_MATCH, callExpression.arguments()); } + /** + * Extracts the {@code argvalues} expression of a {@code @pytest.mark.parametrize(...)} decorator, + * or {@code null} if the decorator is not a parametrize call or has no {@code argvalues}. + */ + @Nullable + public static Expression parametrizeArgvaluesExpression(Decorator decorator, SubscriptionContext ctx) { + Expression expression = decorator.expression(); + if (!(expression instanceof CallExpression callExpression) || !PYTEST_PARAMETRIZE_MATCHER.isTrueFor(callExpression.callee(), ctx)) { + return null; + } + RegularArgument valuesArgument = TreeUtils.nthArgumentOrKeyword(1, "argvalues", callExpression.arguments()); + return valuesArgument == null ? null : Expressions.removeParentheses(valuesArgument.expression()); + } + public static boolean isUnittestAssertRaises(CallExpression callExpression, SubscriptionContext ctx) { return UNITTEST_ASSERT_RAISES_MATCHER.isTrueFor(callExpression.callee(), ctx); } diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9078.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9078.html new file mode 100644 index 000000000..9244fc15f --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9078.html @@ -0,0 +1,74 @@ +

        This rule raises an issue when the argvalues collection of a @pytest.mark.parametrize decorator contains duplicate test +cases.

        +

        In Python with pytest, this occurs when @pytest.mark.parametrize is given an argvalues sequence that repeats the same +case more than once (for example duplicate literals, names, or calls).

        +

        Why is this an issue?

        +

        @pytest.mark.parametrize runs the decorated test once for each entry in its values collection. Duplicate cases therefore execute the +same scenario more than once.

        +

        That wastes CI time and usually signals a copy-paste mistake: an intended distinct case was never updated, so coverage looks broader than it +is.

        +

        Duplicates are detected by comparing the parametrize entries as expressions (literals, names, calls, and other AST forms), not only literal values. +Accidental duplicates should be removed. Rarely, repeated identical entries are intentional when each run exercises mutable shared state; keep those +only when that is deliberate.

        +

        This rule complements {rule:python:S8998}, which flags empty parametrize value lists.

        +

        What is the potential impact?

        +

        Duplicate cases inflate suite runtime and can hide unfinished copy-paste edits. Teams may believe a scenario is covered in several ways when the +same inputs are simply repeated.

        +

        How to fix it

        +

        When the duplicate is accidental, remove the repeated entries from the @pytest.mark.parametrize values list so each case appears only +once. If the repeated entry was meant to be a different scenario, replace it with the intended distinct inputs.

        +

        Do not remove duplicates that are intentional for stateful behavior (for example repeated invocations that observe mutable global state). In those +cases, keep the repeated cases or make the shared-state dependency explicit another way.

        +

        Code examples

        +

        Noncompliant code example

        +
        +import pytest
        +
        +@pytest.mark.parametrize("n", [1, 2, 2, 3])  # Noncompliant
        +def test_double(n):
        +    assert double(n) == n * 2
        +
        +

        Compliant solution

        +
        +import pytest
        +
        +@pytest.mark.parametrize("n", [1, 2, 3])
        +def test_double(n):
        +    assert double(n) == n * 2
        +
        +

        Noncompliant code example

        +
        +import pytest
        +
        +@pytest.mark.parametrize("operand,expected", [
        +    (1, 2),
        +    (2, 4),
        +    (1, 2),  # Noncompliant
        +    (3, 6),
        +])
        +def test_double(operand, expected):
        +    assert double(operand) == expected
        +
        +

        Compliant solution

        +
        +import pytest
        +
        +@pytest.mark.parametrize("operand,expected", [
        +    (1, 2),
        +    (2, 4),
        +    (3, 6),
        +])
        +def test_double(operand, expected):
        +    assert double(operand) == expected
        +
        +

        Resources

        +

        Documentation

        + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9078.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9078.json new file mode 100644 index 000000000..b46be08c8 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9078.json @@ -0,0 +1,24 @@ +{ + "title": "Parametrize decorators should not contain duplicate test cases", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "pytest", + "tests" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-9078", + "sqKey": "S9078", + "scope": "Tests", + "quickfix": "unknown", + "code": { + "impacts": { + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "EFFICIENT" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 080c23729..6b1b6208c 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -384,6 +384,7 @@ "S9073", "S9074", "S9075", - "S9076" + "S9076", + "S9078" ] } diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/DuplicateParametrizeCasesCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/DuplicateParametrizeCasesCheckTest.java new file mode 100644 index 000000000..d96017d0c --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/DuplicateParametrizeCasesCheckTest.java @@ -0,0 +1,36 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import org.junit.jupiter.api.Test; +import org.sonar.plugins.python.api.PythonCheck; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +import static org.assertj.core.api.Assertions.assertThat; + +class DuplicateParametrizeCasesCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/duplicateParametrizeCases.py", new DuplicateParametrizeCasesCheck()); + } + + @Test + void test_scope() { + assertThat(new DuplicateParametrizeCasesCheck().scope()).isEqualTo(PythonCheck.CheckScope.ALL); + } +} diff --git a/python-checks/src/test/java/org/sonar/python/checks/utils/UnittestUtilsTest.java b/python-checks/src/test/java/org/sonar/python/checks/utils/UnittestUtilsTest.java index 5e8a1896c..20ce16f5e 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/utils/UnittestUtilsTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/utils/UnittestUtilsTest.java @@ -256,7 +256,7 @@ void test_pytest_raises_helpers() { raises(ValueError) """, (ctx, callExpression) -> { isPytestRaises.add(UnittestUtils.isPytestRaises(callExpression, ctx)); - hasMatchArgument.add(UnittestUtils.hasPytestRaisesMatchArgument(callExpression)); + hasMatchArgument.add(UnittestUtils.pytestMatchArgument(callExpression) != null); exceptionArguments.add(UnittestUtils.pytestExpectedExceptionArgument(callExpression).expression().firstToken().value()); }); @@ -279,7 +279,7 @@ void test_pytest_warns_helpers() { warns(UserWarning) """, (ctx, callExpression) -> { isPytestWarns.add(UnittestUtils.isPytestWarns(callExpression, ctx)); - hasMatchArgument.add(UnittestUtils.hasPytestWarnsMatchArgument(callExpression)); + hasMatchArgument.add(UnittestUtils.pytestMatchArgument(callExpression) != null); warningArguments.add(UnittestUtils.pytestExpectedWarningArgument(callExpression).expression().firstToken().value()); RegularArgument matchArgument = UnittestUtils.pytestMatchArgument(callExpression); matchArguments.add(matchArgument == null ? null : matchArgument.expression().firstToken().value()); diff --git a/python-checks/src/test/resources/checks/tests/duplicateParametrizeCases.py b/python-checks/src/test/resources/checks/tests/duplicateParametrizeCases.py new file mode 100644 index 000000000..b752e326d --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/duplicateParametrizeCases.py @@ -0,0 +1,196 @@ +import pytest + + +# Duplicate int literals +@pytest.mark.parametrize("n", [ + 1, + 2, + 2, # Noncompliant {{Remove this duplicate test case.}} +# ^ +# ^@-2< {{Original.}} + 3, +]) +def test_duplicate_ints(n): + return n * 2 + + +# Duplicate string literals +@pytest.mark.parametrize("value", [ + "a", + "b", + "a", # Noncompliant {{Remove this duplicate test case.}} +# ^^^ +]) +def test_duplicate_strings(value): + assert value in ("a", "b") + + +# Duplicate tuple literals +@pytest.mark.parametrize("point", [ + (1, 2), + (3, 4), + (1, 2), # Noncompliant {{Remove this duplicate test case.}} +# ^^^^^^ +]) +def test_duplicate_tuples(point): + operand, expected = point + assert operand < expected + + +# Duplicate names +@pytest.mark.parametrize("case", [ + FIRST, + SECOND, + FIRST, # Noncompliant {{Remove this duplicate test case.}} +# ^^^^^ +]) +def test_duplicate_names(case): + registry.append(case) + + +# Duplicate call expressions +@pytest.mark.parametrize("case", [ + make_case(1), + make_case(2), + make_case(1), # Noncompliant +]) +def test_duplicate_calls(case): + consume(case) + + +# Three identical cases: both the second and third are flagged against the first +@pytest.mark.parametrize("n", [ + 7, + 7, # Noncompliant + 7, # Noncompliant +]) +def test_triple_duplicate(n): + counter.increment(n) + + +# Two independent duplicate groups produce two separate issues +@pytest.mark.parametrize("case", [ + A, + B, + A, # Noncompliant + B, # Noncompliant +]) +def test_two_duplicate_groups(case): + tracker.record(case) + + +# Duplicate detected when argvalues is passed as a keyword argument +@pytest.mark.parametrize("n", argvalues=[ + 8, + 8, # Noncompliant +]) +def test_duplicate_via_keyword_argument(n): + pipeline.run(n) + + +# Duplicate detected when argvalues is a tuple literal rather than a list +@pytest.mark.parametrize("n", ( + 9, + 9, # Noncompliant +)) +def test_duplicate_in_tuple_argvalues(n): + logger.debug(n) + + +# Parenthesized list is still a list literal once parentheses are stripped +@pytest.mark.parametrize("n", ([ + 10, + 10, # Noncompliant +])) +def test_duplicate_in_parenthesized_list(n): + yield n + + +# Parentheses around a case must not hide equivalence with a bare literal +@pytest.mark.parametrize("n", [ + 1, + (1), # Noncompliant {{Remove this duplicate test case.}} +# ^^^ +# ^@-2< {{Original.}} +]) +def test_parenthesized_case_duplicate(n): + assert n == 1 + + +# Nested parentheses around a case +@pytest.mark.parametrize("n", [ + ((2)), + 2, # Noncompliant {{Remove this duplicate test case.}} +# ^ +]) +def test_nested_parenthesized_case_duplicate(n): + assert n == 2 + + +# Compliant: all cases are distinct +@pytest.mark.parametrize("n", [1, 2, 3]) +def test_distinct_ints(n): + history.append(n) + + +# Compliant: distinct tuples +@pytest.mark.parametrize("operand,expected", [ + (1, 2), + (2, 4), + (3, 6), +]) +def test_distinct_tuples(operand, expected): + assert operand * 2 == expected + + +# Compliant: single-element list can never contain a duplicate +@pytest.mark.parametrize("n", [1]) +def test_single_case(n): + ... + + +# Compliant: values that only look similar are not equivalent expressions +@pytest.mark.parametrize("value", [1, 1.0, True]) +def test_distinct_literal_kinds(value): + kinds.add(type(value)) + + +# Compliant: non-literal argvalues (a variable) is not inspected, even if it holds duplicates +cases_with_duplicates = [1, 2, 2, 3] + + +@pytest.mark.parametrize("n", cases_with_duplicates) +def test_non_literal_argvalues_skipped(n): + seen.add(n) + + +# Compliant: argvalues produced by a call is not inspected +def build_cases(): + return [1, 2, 2, 3] + + +@pytest.mark.parametrize("n", build_cases()) +def test_call_argvalues_skipped(n): + processed.add(n) + + +# Compliant: no argvalues provided at all +@pytest.mark.parametrize("n") +def test_parametrize_without_values(n): + assert n is not None + + +# Compliant: decorator that is not a call expression +def plain_decorator(func): + return func + + +@plain_decorator +def test_non_call_decorator(): + return True + + +# Compliant: unrelated pytest.mark call +@pytest.mark.skip() +def test_unrelated_call_decorator(): + pass From 322e2dcb2a1bcab654614fffa394a8db43b9ef16 Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Tue, 28 Jul 2026 15:56:10 +0200 Subject: [PATCH 255/322] SONARPY-4434 Add S9116: Pytest fixture options should be passed as keyword arguments GitOrigin-RevId: 6282221ce406e55bd91e4b6f972245f0891ffaaa --- .../python/checks/OpenSourceCheckList.java | 2 + .../PytestFixturePositionalArgsCheck.java | 74 +++++++++++++++ .../org/sonar/l10n/py/rules/python/S9116.html | 53 +++++++++++ .../org/sonar/l10n/py/rules/python/S9116.json | 24 +++++ .../py/rules/python/Sonar_way_profile.json | 3 +- .../PytestFixturePositionalArgsCheckTest.java | 37 ++++++++ .../tests/pytestFixturePositionalArgs.py | 90 +++++++++++++++++++ 7 files changed, 282 insertions(+), 1 deletion(-) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/tests/PytestFixturePositionalArgsCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9116.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9116.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/tests/PytestFixturePositionalArgsCheckTest.java create mode 100644 python-checks/src/test/resources/checks/tests/pytestFixturePositionalArgs.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 3b6442563..ce32173f9 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -108,6 +108,7 @@ import org.sonar.python.checks.tests.NotDiscoverableTestMethodCheck; import org.sonar.python.checks.tests.PytestAutouseParametrizedFixtureCheck; import org.sonar.python.checks.tests.PytestFixtureMultipleYieldCheck; +import org.sonar.python.checks.tests.PytestFixturePositionalArgsCheck; import org.sonar.python.checks.tests.PytestPluginsConftestCheck; import org.sonar.python.checks.tests.PytestRaisesContextManagerCheck; import org.sonar.python.checks.tests.SingleInvocationRuntimeExceptionCheck; @@ -412,6 +413,7 @@ public Stream> getChecks() { PydanticSkipValidationWithConstraintsCheck.class, PytestAutouseParametrizedFixtureCheck.class, PytestFixtureMultipleYieldCheck.class, + PytestFixturePositionalArgsCheck.class, PytestPluginsConftestCheck.class, PytestRaisesContextManagerCheck.class, PyTorchDataLoaderNumWorkersCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/PytestFixturePositionalArgsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/PytestFixturePositionalArgsCheck.java new file mode 100644 index 000000000..076c3fe44 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/PytestFixturePositionalArgsCheck.java @@ -0,0 +1,74 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.Argument; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.Decorator; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.tree.UnpackingExpression; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; + +@Rule(key = "S9116") +public class PytestFixturePositionalArgsCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Pass fixture options as keyword arguments."; + + private static final TypeMatcher PYTEST_FIXTURE_MATCHER = TypeMatchers.withFQN("pytest.fixture"); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.DECORATOR, PytestFixturePositionalArgsCheck::checkDecorator); + } + + private static void checkDecorator(SubscriptionContext ctx) { + Decorator decorator = (Decorator) ctx.syntaxNode(); + if (!(decorator.expression() instanceof CallExpression callExpression)) { + return; + } + if (!PYTEST_FIXTURE_MATCHER.isTrueFor(callExpression.callee(), ctx)) { + return; + } + + for (Argument argument : callExpression.arguments()) { + if (isPositionalArgument(argument)) { + ctx.addIssue(argument, MESSAGE); + return; + } + } + } + + private static boolean isPositionalArgument(Argument argument) { + if (argument instanceof RegularArgument regularArgument) { + return regularArgument.keywordArgument() == null; + } + if (argument instanceof UnpackingExpression unpackingExpression) { + return "*".equals(unpackingExpression.starToken().value()); + } + return false; + } + + @Override + public CheckScope scope() { + return CheckScope.ALL; + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9116.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9116.html new file mode 100644 index 000000000..5b33b4727 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9116.html @@ -0,0 +1,53 @@ +

        This rule raises an issue when @pytest.fixture options are passed as positional arguments.

        +

        In Python, this refers to @pytest.fixture(…​) with options passed as positional arguments, such as +@pytest.fixture("module").

        +

        Why is this an issue?

        +

        Passing options like scope as positional arguments to @pytest.fixture is ambiguous and has been removed in pytest 6.0 and later. Use +keyword arguments:

        +
        +@pytest.fixture("module")  # Removed; use keyword arguments
        +def shared_state():
        +    return {}
        +
        +

        Prefer:

        +
        +@pytest.fixture(scope="module")
        +def shared_state():
        +    return {}
        +
        +

        What is the potential impact?

        +

        Positional arguments to @pytest.fixture are rejected by modern pytest, so fixtures written this way fail to load or raise errors at +collection time.

        +

        How to fix it

        +

        Pass fixture options with keywords (for example scope="module").

        +

        Code examples

        +

        Noncompliant code example

        +
        +import pytest
        +
        +@pytest.fixture("module")  # Noncompliant
        +def scoped():
        +    return []
        +
        +

        Compliant solution

        +
        +import pytest
        +
        +@pytest.fixture(scope="module")
        +def scoped():
        +    return []
        +
        +

        Resources

        +

        Documentation

        + +

        Related rules

        +
          +
        • {rule:python:S9076} - Deprecated pytest.yield_fixture should be replaced with pytest.fixture
        • +
        • {rule:python:S9117} - Pytest fixtures should not declare the default scope="function"
        • +
        + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9116.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9116.json new file mode 100644 index 000000000..94abd0940 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9116.json @@ -0,0 +1,24 @@ +{ + "title": "Pytest fixture options should be passed as keyword arguments", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "pytest", + "tests" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-9116", + "sqKey": "S9116", + "scope": "Tests", + "quickfix": "unknown", + "code": { + "impacts": { + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "CONVENTIONAL" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 6b1b6208c..5a52813e7 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -385,6 +385,7 @@ "S9074", "S9075", "S9076", - "S9078" + "S9078", + "S9116" ] } diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/PytestFixturePositionalArgsCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/PytestFixturePositionalArgsCheckTest.java new file mode 100644 index 000000000..a91b5d0ec --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/PytestFixturePositionalArgsCheckTest.java @@ -0,0 +1,37 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import org.junit.jupiter.api.Test; +import org.sonar.plugins.python.api.PythonCheck; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +import static org.assertj.core.api.Assertions.assertThat; + +class PytestFixturePositionalArgsCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/pytestFixturePositionalArgs.py", new PytestFixturePositionalArgsCheck()); + } + + @Test + void test_scope() { + assertThat(new PytestFixturePositionalArgsCheck().scope()).isEqualTo(PythonCheck.CheckScope.ALL); + } + +} diff --git a/python-checks/src/test/resources/checks/tests/pytestFixturePositionalArgs.py b/python-checks/src/test/resources/checks/tests/pytestFixturePositionalArgs.py new file mode 100644 index 000000000..020434f16 --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/pytestFixturePositionalArgs.py @@ -0,0 +1,90 @@ +import pytest +from pytest import fixture + + +@pytest.fixture("module") # Noncompliant {{Pass fixture options as keyword arguments.}} +# ^^^^^^^^ +def noncompliant_positional_scope(): + return [] + + +@pytest.fixture(True) # Noncompliant +# ^^^^ +def noncompliant_positional_autouse(): + return [] + + +@pytest.fixture("module", True) # Noncompliant +# ^^^^^^^^ +def noncompliant_multiple_positionals(): + return [] + + +@pytest.fixture("module", autouse=True) # Noncompliant +# ^^^^^^^^ +def noncompliant_mixed_positional_and_keyword(): + return [] + + +OPTS = ("module",) +@pytest.fixture(*OPTS) # Noncompliant +# ^^^^^ +def noncompliant_unpacked_positional(): + return [] + + +@fixture("session") # Noncompliant +# ^^^^^^^^^ +def noncompliant_imported_fixture(): + return [] + + +class TestSomething: + @pytest.fixture("class") # Noncompliant + # ^^^^^^^ + def noncompliant_class_fixture(self): + return [] + + +@pytest.fixture(scope="module") +def compliant_keyword_scope(): + return [] + + +@pytest.fixture(autouse=True) +def compliant_keyword_autouse(): + return [] + + +@pytest.fixture(scope="module", autouse=True) +def compliant_multiple_keywords(): + return [] + + +@pytest.fixture() +def compliant_empty_call(): + return [] + + +@pytest.fixture +def compliant_no_parentheses(): + return [] + + +@pytest.fixture(**{"scope": "module"}) +def compliant_unpacked_keywords(): + return [] + + +@fixture(scope="function") +def compliant_imported_fixture(): + return [] + + +def not_a_fixture(*args): + pass + + +@not_a_fixture("module") +def decorated_with_unrelated_call(): + pass From 35385b6a8b461cfe0045b5ce1f856c6f17f56188 Mon Sep 17 00:00:00 2001 From: Lijun Chen Date: Wed, 29 Jul 2026 10:18:11 +0200 Subject: [PATCH 256/322] SONARPY-4451 S8410 Fix FPs by handling a few additional `typing.Annotated` forms Handle equivalent `Annotated` forms already accepted by the current FastAPI exemption: qualified names, aliased names, and parenthesized annotations. This only makes the existing exemption less brittle. I intentionally don't make it even more exhaustive (e.g., by covering more alias/import indirection), because IMO the exempted mixed old/new FastAPI syntax is not very meaningful anyway. But I don't intend to challenge the exemption, since the goal is more to reduce rule noise. GitOrigin-RevId: 530d5fc4dc6a229fcb86c2db5f84e1ef57dc4bff --- .../FastAPIDependencyAnnotatedCheck.java | 38 ++++++++++++------- .../checks/fastAPIDependencyAnnotated.py | 25 ++++++++++-- 2 files changed, 46 insertions(+), 17 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/FastAPIDependencyAnnotatedCheck.java b/python-checks/src/main/java/org/sonar/python/checks/FastAPIDependencyAnnotatedCheck.java index 01a1d7d28..ed267eb4d 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/FastAPIDependencyAnnotatedCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/FastAPIDependencyAnnotatedCheck.java @@ -26,7 +26,6 @@ import org.sonar.plugins.python.api.tree.Decorator; import org.sonar.plugins.python.api.tree.Expression; import org.sonar.plugins.python.api.tree.FunctionDef; -import org.sonar.plugins.python.api.tree.Name; import org.sonar.plugins.python.api.tree.Parameter; import org.sonar.plugins.python.api.tree.ParameterList; import org.sonar.plugins.python.api.tree.SubscriptionExpression; @@ -34,6 +33,7 @@ import org.sonar.plugins.python.api.tree.TypeAnnotation; import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.checks.utils.Expressions; import org.sonar.python.tree.TreeUtils; @Rule(key = "S8410") @@ -67,6 +67,10 @@ public class FastAPIDependencyAnnotatedCheck extends PythonSubscriptionCheck { ); private static final TypeMatcher TYPING_ANNOTATED_MATCHER = TypeMatchers.isType("typing.Annotated"); + private static final Set ANNOTATED_FULLY_QUALIFIED_NAMES = Set.of( + "typing.Annotated", + "typing_extensions.Annotated" + ); @Override public void initialize(Context context) { @@ -115,19 +119,25 @@ private static boolean isUsingAnnotatedWithDependency(@Nullable TypeAnnotation t if (typeAnnotation == null) { return false; } - Expression annotationExpr = typeAnnotation.expression(); - if (annotationExpr instanceof SubscriptionExpression subscriptionExpr) { - Expression object = subscriptionExpr.object(); - if (object instanceof Name name && TYPING_ANNOTATED_MATCHER.isTrueFor(name, ctx)) { - return subscriptionExpr.subscripts().expressions().stream() - .anyMatch(expr -> { - if (expr instanceof CallExpression callExpr) { - return FASTAPI_DEPENDENCY_FUNCTIONS_MATCHER.isTrueFor(callExpr.callee(), ctx); - } - return false; - }); - } + Expression annotationExpr = Expressions.removeParentheses(typeAnnotation.expression()); + if (!(annotationExpr instanceof SubscriptionExpression subscriptionExpr) || !isAnnotatedObject(subscriptionExpr.object(), ctx)) { + return false; + } + return subscriptionExpr.subscripts().expressions().stream() + .anyMatch(expr -> { + if (expr instanceof CallExpression callExpr) { + return FASTAPI_DEPENDENCY_FUNCTIONS_MATCHER.isTrueFor(callExpr.callee(), ctx); + } + return false; + }); + } + + private static boolean isAnnotatedObject(Expression expression, SubscriptionContext ctx) { + if (TYPING_ANNOTATED_MATCHER.isTrueFor(expression, ctx)) { + return true; } - return false; + return TreeUtils.fullyQualifiedNameFromExpression(expression) + .filter(ANNOTATED_FULLY_QUALIFIED_NAMES::contains) + .isPresent(); } } diff --git a/python-checks/src/test/resources/checks/fastAPIDependencyAnnotated.py b/python-checks/src/test/resources/checks/fastAPIDependencyAnnotated.py index 7656223d0..63db2e612 100644 --- a/python-checks/src/test/resources/checks/fastAPIDependencyAnnotated.py +++ b/python-checks/src/test/resources/checks/fastAPIDependencyAnnotated.py @@ -231,13 +231,32 @@ def edge_case_subscription_not_annotated(): def read_items(items: List[int] = Query()): # Noncompliant return {"items": items} -def false_positive_subscription_with_qualified_name(): +def compliant_typing_annotated_dependency(): import typing @app.get("/items/") - def read_items(db: typing.Annotated[str, Depends(get_db)] = Depends(get_db)): # Noncompliant + def read_items(db: typing.Annotated[str, Depends(get_db)] = Depends(get_db)): return {"db": db} -def false_negative_annotated_with_dependency_detected(): +def compliant_aliased_typing_annotated_dependency(): + import typing as t + @app.get("/items/") + def read_items(db: t.Annotated[str, Depends(get_db)] = Depends(get_db)): + return {"db": db} + +def compliant_aliased_typing_extensions_annotated_dependency(): + from typing_extensions import Annotated as Ann + @app.get("/items/") + def read_items(db: Ann[str, Depends(get_db)] = Depends(get_db)): + return {"db": db} + +def compliant_parenthesized_annotated_dependency(): + @app.get("/items/") + def read_items(db: (Annotated[str, Depends(get_db)]) = Depends(get_db)): + return {"db": db} + +def compliant_duplicate_old_and_new_syntax(): + # Even though FastAPI `Depends` is used as default parameter value, + # since also `Annotated` is used for FastAPI, we don't raise. @app.get("/items/") def read_items(db: Annotated[str, Depends(get_db)] = Depends(get_db)): # Compliant return {"db": db} From 4a6a564f87a8d6dd330b526fca2c90afe814974a Mon Sep 17 00:00:00 2001 From: Lijun Chen Date: Wed, 29 Jul 2026 11:29:00 +0200 Subject: [PATCH 257/322] SONARPY-4451 S8410 Add file-local suppression heuristic Add a file-local suppression heuristic for the FastAPI dependency Annotated check to reduce noise in legacy-style files. Collected old-syntax candidates are now suppressed only when the file contains enough local evidence: at least 3 relevant FastAPI parameters, with at least 75% using the old style. Smaller samples still report. Keep the internal test-only mode that disables suppression so the baseline tests remains usable. Also, this keeps this rule logic clearly separated in two layers: raw analysis layer and issue suppression policy layer. I considered making the suppression logic consider the whole project, but decided to start with this easier route first. See [SONARPY-4451 S8410 ADR Keep rule suppression heuristic file-local](https://docs.google.com/document/d/1nB8HphU3Xb4bGi-709nr6fTvcOqD64sUndqVRAmZ-7k/edit?usp=sharing) for more details. If we see good metrics improvements from this experiment, we could consider taking this further. GitOrigin-RevId: ed7989318437cd1032ae6c3420f76aed849d08ff --- .../FastAPIDependencyAnnotatedCheck.java | 76 +++++++++++++++++-- .../FastAPIDependencyAnnotatedCheckTest.java | 34 ++++++++- ...atedFileLocalHeuristicAnnotatedDominant.py | 17 +++++ ...edFileLocalHeuristicMixedTooSmallSample.py | 16 ++++ ...tatedFileLocalHeuristicOldStyleDominant.py | 18 +++++ ...notatedFileLocalHeuristicTooSmallSample.py | 15 ++++ 6 files changed, 166 insertions(+), 10 deletions(-) create mode 100644 python-checks/src/test/resources/checks/fastAPIDependencyAnnotatedFileLocalHeuristicAnnotatedDominant.py create mode 100644 python-checks/src/test/resources/checks/fastAPIDependencyAnnotatedFileLocalHeuristicMixedTooSmallSample.py create mode 100644 python-checks/src/test/resources/checks/fastAPIDependencyAnnotatedFileLocalHeuristicOldStyleDominant.py create mode 100644 python-checks/src/test/resources/checks/fastAPIDependencyAnnotatedFileLocalHeuristicTooSmallSample.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/FastAPIDependencyAnnotatedCheck.java b/python-checks/src/main/java/org/sonar/python/checks/FastAPIDependencyAnnotatedCheck.java index ed267eb4d..12acb5df0 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/FastAPIDependencyAnnotatedCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/FastAPIDependencyAnnotatedCheck.java @@ -16,6 +16,8 @@ */ package org.sonar.python.checks; +import java.util.ArrayList; +import java.util.List; import java.util.Set; import java.util.stream.Stream; import javax.annotation.Nullable; @@ -39,6 +41,11 @@ @Rule(key = "S8410") public class FastAPIDependencyAnnotatedCheck extends PythonSubscriptionCheck { + enum IssueReportingMode { + FILE_LOCAL_HEURISTIC, + DISABLE_FILE_LOCAL_SUPPRESSION + } + private static final String MESSAGE = "Use \"Annotated\" type hints for FastAPI dependency injection"; private static final Set ROUTES = Set.of( @@ -72,12 +79,41 @@ public class FastAPIDependencyAnnotatedCheck extends PythonSubscriptionCheck { "typing_extensions.Annotated" ); + private final IssueReportingMode issueReportingMode; + private final List pendingIssues = new ArrayList<>(); + private SubscriptionContext fileContext; + private int annotatedStyleCount; + private int oldStyleCount; + + public FastAPIDependencyAnnotatedCheck() { + this(IssueReportingMode.FILE_LOCAL_HEURISTIC); + } + + FastAPIDependencyAnnotatedCheck(IssueReportingMode issueReportingMode) { + this.issueReportingMode = issueReportingMode; + } + @Override public void initialize(Context context) { - context.registerSyntaxNodeConsumer(Tree.Kind.FUNCDEF, FastAPIDependencyAnnotatedCheck::checkFunctionDef); + context.registerSyntaxNodeConsumer(Tree.Kind.FILE_INPUT, this::resetFileState); + context.registerSyntaxNodeConsumer(Tree.Kind.FUNCDEF, this::checkFunctionDef); + } + + @Override + public void leaveFile() { + if (fileContext != null && shouldReportCollectedIssues()) { + pendingIssues.forEach(param -> fileContext.addIssue(param, MESSAGE)); + } + } + + private void resetFileState(SubscriptionContext ctx) { + pendingIssues.clear(); + fileContext = ctx; + annotatedStyleCount = 0; + oldStyleCount = 0; } - private static void checkFunctionDef(SubscriptionContext ctx) { + private void checkFunctionDef(SubscriptionContext ctx) { FunctionDef functionDef = (FunctionDef) ctx.syntaxNode(); if (!hasFastAPIRouteDecorator(functionDef, ctx)) { @@ -89,9 +125,7 @@ private static void checkFunctionDef(SubscriptionContext ctx) { return; } - parameterList.nonTuple().stream() - .filter(param -> isParameterUsingOldDependencySyntax(param, ctx)) - .forEach(param -> ctx.addIssue(param, MESSAGE)); + parameterList.nonTuple().forEach(param -> collectParameterStyle(param, ctx)); } private static boolean hasFastAPIRouteDecorator(FunctionDef functionDef, SubscriptionContext ctx) { @@ -101,7 +135,36 @@ private static boolean hasFastAPIRouteDecorator(FunctionDef functionDef, Subscri .anyMatch(callExpr -> FASTAPI_ROUTE_METHODS_MATCHER.isTrueFor(callExpr.callee(), ctx)); } - private static boolean isParameterUsingOldDependencySyntax(Parameter param, SubscriptionContext ctx) { + private void collectParameterStyle(Parameter param, SubscriptionContext ctx) { + TypeAnnotation typeAnnotation = param.typeAnnotation(); + if (isUsingAnnotatedWithDependency(typeAnnotation, ctx)) { + annotatedStyleCount++; + return; + } + + if (isParameterUsingOldDependencySyntax(param, typeAnnotation, ctx)) { + oldStyleCount++; + pendingIssues.add(param); + } + } + + private boolean shouldReportCollectedIssues() { + final int minStyleSampleSize = 3; + final double oldStyleDominanceRatioThreshold = 0.75; + return switch (issueReportingMode) { + case FILE_LOCAL_HEURISTIC -> { + int totalStyleCount = oldStyleCount + annotatedStyleCount; + if (totalStyleCount < minStyleSampleSize) { + yield true; + } + double oldStyleRatio = (double) oldStyleCount / totalStyleCount; + yield oldStyleRatio < oldStyleDominanceRatioThreshold; + } + case DISABLE_FILE_LOCAL_SUPPRESSION -> true; + }; + } + + private static boolean isParameterUsingOldDependencySyntax(Parameter param, @Nullable TypeAnnotation typeAnnotation, SubscriptionContext ctx) { Expression defaultValue = param.defaultValue(); if (!(defaultValue instanceof CallExpression callExpr)) { return false; @@ -111,7 +174,6 @@ private static boolean isParameterUsingOldDependencySyntax(Parameter param, Subs return false; } - TypeAnnotation typeAnnotation = param.typeAnnotation(); return !isUsingAnnotatedWithDependency(typeAnnotation, ctx); } diff --git a/python-checks/src/test/java/org/sonar/python/checks/FastAPIDependencyAnnotatedCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/FastAPIDependencyAnnotatedCheckTest.java index 418c67b87..e80e707d7 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/FastAPIDependencyAnnotatedCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/FastAPIDependencyAnnotatedCheckTest.java @@ -21,10 +21,38 @@ class FastAPIDependencyAnnotatedCheckTest { - private static final FastAPIDependencyAnnotatedCheck check = new FastAPIDependencyAnnotatedCheck(); + @Test + void raw_candidates() { + PythonCheckVerifier.verify( + "src/test/resources/checks/fastAPIDependencyAnnotated.py", + new FastAPIDependencyAnnotatedCheck(FastAPIDependencyAnnotatedCheck.IssueReportingMode.DISABLE_FILE_LOCAL_SUPPRESSION)); + } + + @Test + void suppresses_issues_in_old_style_dominant_files() { + PythonCheckVerifier.verifyNoIssue( + "src/test/resources/checks/fastAPIDependencyAnnotatedFileLocalHeuristicOldStyleDominant.py", + new FastAPIDependencyAnnotatedCheck()); + } + + @Test + void reports_issues_in_annotated_dominant_files() { + PythonCheckVerifier.verify( + "src/test/resources/checks/fastAPIDependencyAnnotatedFileLocalHeuristicAnnotatedDominant.py", + new FastAPIDependencyAnnotatedCheck()); + } + + @Test + void reports_issues_when_old_style_sample_is_too_small_for_suppression() { + PythonCheckVerifier.verify( + "src/test/resources/checks/fastAPIDependencyAnnotatedFileLocalHeuristicTooSmallSample.py", + new FastAPIDependencyAnnotatedCheck()); + } @Test - void test() { - PythonCheckVerifier.verify("src/test/resources/checks/fastAPIDependencyAnnotated.py", check); + void reports_issues_when_mixed_sample_is_too_small_for_suppression() { + PythonCheckVerifier.verify( + "src/test/resources/checks/fastAPIDependencyAnnotatedFileLocalHeuristicMixedTooSmallSample.py", + new FastAPIDependencyAnnotatedCheck()); } } diff --git a/python-checks/src/test/resources/checks/fastAPIDependencyAnnotatedFileLocalHeuristicAnnotatedDominant.py b/python-checks/src/test/resources/checks/fastAPIDependencyAnnotatedFileLocalHeuristicAnnotatedDominant.py new file mode 100644 index 000000000..dc6e39046 --- /dev/null +++ b/python-checks/src/test/resources/checks/fastAPIDependencyAnnotatedFileLocalHeuristicAnnotatedDominant.py @@ -0,0 +1,17 @@ +from typing import Annotated +from fastapi import Depends, FastAPI, Query + +app = FastAPI() + + +def get_db(): + return "database_connection" + + +@app.get("/items/") +def read_items( + db: Annotated[str, Depends(get_db)], + search: Annotated[str | None, Query(max_length=50)] = None, + limit: int = Query(10), # Noncompliant {{Use "Annotated" type hints for FastAPI dependency injection}} +): + return {"db": db, "search": search, "limit": limit} diff --git a/python-checks/src/test/resources/checks/fastAPIDependencyAnnotatedFileLocalHeuristicMixedTooSmallSample.py b/python-checks/src/test/resources/checks/fastAPIDependencyAnnotatedFileLocalHeuristicMixedTooSmallSample.py new file mode 100644 index 000000000..1a1c9cb7a --- /dev/null +++ b/python-checks/src/test/resources/checks/fastAPIDependencyAnnotatedFileLocalHeuristicMixedTooSmallSample.py @@ -0,0 +1,16 @@ +from typing import Annotated +from fastapi import Depends, FastAPI, Query + +app = FastAPI() + + +def get_db(): + return "database_connection" + + +@app.get("/items/") +def read_items( + db: Annotated[str, Depends(get_db)], + limit: int = Query(10), # Noncompliant {{Use "Annotated" type hints for FastAPI dependency injection}} +): + return {"db": db, "limit": limit} diff --git a/python-checks/src/test/resources/checks/fastAPIDependencyAnnotatedFileLocalHeuristicOldStyleDominant.py b/python-checks/src/test/resources/checks/fastAPIDependencyAnnotatedFileLocalHeuristicOldStyleDominant.py new file mode 100644 index 000000000..adaf75fa4 --- /dev/null +++ b/python-checks/src/test/resources/checks/fastAPIDependencyAnnotatedFileLocalHeuristicOldStyleDominant.py @@ -0,0 +1,18 @@ +from typing import Annotated +from fastapi import Depends, FastAPI, Query + +app = FastAPI() + + +def get_db(): + return "database_connection" + + +@app.get("/items/") +def read_items( + db = Depends(get_db), + limit: int = Query(10), + page: int = Query(1), + search: Annotated[str | None, Query(max_length=50)] = None, +): + return {"db": db, "search": search, "limit": limit, "page": page} diff --git a/python-checks/src/test/resources/checks/fastAPIDependencyAnnotatedFileLocalHeuristicTooSmallSample.py b/python-checks/src/test/resources/checks/fastAPIDependencyAnnotatedFileLocalHeuristicTooSmallSample.py new file mode 100644 index 000000000..2522c5ee7 --- /dev/null +++ b/python-checks/src/test/resources/checks/fastAPIDependencyAnnotatedFileLocalHeuristicTooSmallSample.py @@ -0,0 +1,15 @@ +from fastapi import Depends, FastAPI + +app = FastAPI() + + +def get_db(): + return "database_connection" + + +@app.get("/items/") +def read_items( + db = Depends(get_db), # Noncompliant {{Use "Annotated" type hints for FastAPI dependency injection}} + session = Depends(get_db), # Noncompliant +): + return {"db": db, "session": session} From 3ae80d8176f9b40811766b6863b16bf48b579349 Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Wed, 29 Jul 2026 12:05:40 +0200 Subject: [PATCH 258/322] SONARPY-4416 Implement S9077: Intentional test failures should use pytest.fail with a message Co-authored-by: github-actions[bot] GitOrigin-RevId: 33eb3d70e7bcb6983ff7b599f0d113224c4c8891 --- .../python/checks/OpenSourceCheckList.java | 2 + .../IntentionalTestFailureMessageCheck.java | 163 ++++++++++++++++++ .../org/sonar/l10n/py/rules/python/S9077.html | 54 ++++++ .../org/sonar/l10n/py/rules/python/S9077.json | 24 +++ .../py/rules/python/Sonar_way_profile.json | 1 + ...ntentionalTestFailureMessageCheckTest.java | 65 +++++++ .../tests/intentionalTestFailureMessage.py | 127 ++++++++++++++ ...intentionalTestFailureMessageFromImport.py | 7 + ...tionalTestFailureMessageMultipleImports.py | 15 ++ .../intentionalTestFailureMessageNoPytest.py | 30 ++++ ...ntionalTestFailureMessageRelativeImport.py | 5 + 11 files changed, 493 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/tests/IntentionalTestFailureMessageCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9077.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9077.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/tests/IntentionalTestFailureMessageCheckTest.java create mode 100644 python-checks/src/test/resources/checks/tests/intentionalTestFailureMessage.py create mode 100644 python-checks/src/test/resources/checks/tests/intentionalTestFailureMessageFromImport.py create mode 100644 python-checks/src/test/resources/checks/tests/intentionalTestFailureMessageMultipleImports.py create mode 100644 python-checks/src/test/resources/checks/tests/intentionalTestFailureMessageNoPytest.py create mode 100644 python-checks/src/test/resources/checks/tests/intentionalTestFailureMessageRelativeImport.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index ce32173f9..da0eeb230 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -105,6 +105,7 @@ import org.sonar.python.checks.tests.GroupSimilarTestsParameterizedCheck; import org.sonar.python.checks.tests.IdenticalAssertionArgumentsCheck; import org.sonar.python.checks.tests.ImplicitlySkippedTestCheck; +import org.sonar.python.checks.tests.IntentionalTestFailureMessageCheck; import org.sonar.python.checks.tests.NotDiscoverableTestMethodCheck; import org.sonar.python.checks.tests.PytestAutouseParametrizedFixtureCheck; import org.sonar.python.checks.tests.PytestFixtureMultipleYieldCheck; @@ -483,6 +484,7 @@ public Stream> getChecks() { SynchronousOsCallsInAsyncCheck.class, TempFileCreationCheck.class, ImplicitlySkippedTestCheck.class, + IntentionalTestFailureMessageCheck.class, TaskGroupNurseryUsedOnlyOnceCheck.class, TemplateStringStructuralPatternMatchingCheck.class, TestClientContentParameterCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/IntentionalTestFailureMessageCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/IntentionalTestFailureMessageCheck.java new file mode 100644 index 000000000..83faaac7f --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/IntentionalTestFailureMessageCheck.java @@ -0,0 +1,163 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import java.util.List; +import javax.annotation.Nullable; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.AliasedName; +import org.sonar.plugins.python.api.tree.AssertStatement; +import org.sonar.plugins.python.api.tree.BaseTreeVisitor; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.DottedName; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.FileInput; +import org.sonar.plugins.python.api.tree.ImportFrom; +import org.sonar.plugins.python.api.tree.ImportName; +import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.NumericLiteral; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.StringLiteral; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.checks.utils.Expressions; +import org.sonar.python.tree.TreeUtils; + +@Rule(key = "S9077") +public class IntentionalTestFailureMessageCheck extends PythonSubscriptionCheck { + + private static final String ASSERT_MESSAGE = "Replace this assertion with pytest.fail(...) and provide a message."; + private static final String FAIL_MESSAGE = "Add a message explaining why this test fails."; + + private static final TypeMatcher PYTEST_FAIL_MATCHER = TypeMatchers.isType("pytest.fail"); + + private boolean pytestImported; + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.FILE_INPUT, ctx -> pytestImported = importsPytest((FileInput) ctx.syntaxNode())); + context.registerSyntaxNodeConsumer(Tree.Kind.ASSERT_STMT, ctx -> checkAssertStatement(ctx, (AssertStatement) ctx.syntaxNode())); + context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, ctx -> checkCallExpression(ctx, (CallExpression) ctx.syntaxNode())); + } + + @Override + public CheckScope scope() { + return CheckScope.ALL; + } + + private void checkAssertStatement(SubscriptionContext ctx, AssertStatement assertStatement) { + // Without a pytest import we cannot know whether the runner is pytest or unittest; + // skip assert False / assert 0 to avoid FPs when pytest.fail is unavailable. + if (!pytestImported) { + return; + } + Expression condition = Expressions.removeParentheses(assertStatement.condition()); + if (isFalseOrZeroLiteral(condition)) { + ctx.addIssue(assertStatement, ASSERT_MESSAGE); + } + } + + private static boolean isFalseOrZeroLiteral(Expression expression) { + if (expression.is(Tree.Kind.NAME)) { + return "False".equals(((Name) expression).name()); + } + if (expression.is(Tree.Kind.NUMERIC_LITERAL)) { + try { + return ((NumericLiteral) expression).valueAsLong() == 0; + } catch (NumberFormatException nfe) { + return false; + } + } + return false; + } + + private static void checkCallExpression(SubscriptionContext ctx, CallExpression callExpression) { + if (!PYTEST_FAIL_MATCHER.isTrueFor(callExpression.callee(), ctx)) { + return; + } + + RegularArgument messageArgument = messageArgument(callExpression); + if (hasNoMessage(messageArgument)) { + ctx.addIssue(callExpression, FAIL_MESSAGE); + } + } + + /** + * Resolves the failure message argument. Prefer {@code reason=} or a positional argument, + * and also accept the legacy {@code msg=} keyword used by older pytest versions. + */ + @Nullable + private static RegularArgument messageArgument(CallExpression callExpression) { + RegularArgument reasonOrPositional = TreeUtils.nthArgumentOrKeyword(0, "reason", callExpression.arguments()); + if (reasonOrPositional != null) { + return reasonOrPositional; + } + return TreeUtils.argumentByKeyword("msg", callExpression.arguments()); + } + + private static boolean hasNoMessage(@Nullable RegularArgument reasonArgument) { + if (reasonArgument == null) { + return true; + } + Expression reasonExpression = reasonArgument.expression(); + return reasonExpression.is(Tree.Kind.STRING_LITERAL) && ((StringLiteral) reasonExpression).trimmedQuotesValue().trim().isEmpty(); + } + + private static boolean importsPytest(FileInput fileInput) { + PytestImportVisitor visitor = new PytestImportVisitor(); + fileInput.accept(visitor); + return visitor.found; + } + + private static final class PytestImportVisitor extends BaseTreeVisitor { + private boolean found; + + @Override + public void visitImportName(ImportName importName) { + if (found) { + return; + } + for (AliasedName module : importName.modules()) { + if (isPytestModule(module.dottedName())) { + found = true; + return; + } + } + } + + @Override + public void visitImportFrom(ImportFrom importFrom) { + if (found) { + return; + } + if (isPytestModule(importFrom.module())) { + found = true; + } + } + + private static boolean isPytestModule(@Nullable DottedName dottedName) { + if (dottedName == null) { + return false; + } + List names = dottedName.names(); + return !names.isEmpty() && "pytest".equals(names.get(0).name()); + } + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9077.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9077.html new file mode 100644 index 000000000..f3b45a9d2 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9077.html @@ -0,0 +1,54 @@ +

        This rule raises an issue when a test intentionally aborts with assert False, assert 0, or a pytest.fail() +call that has no failure message.

        +

        In Python with pytest, this covers:

        +
          +
        • assert False or assert 0 used as an intentional abort
        • +
        • pytest.fail() called without a non-empty message (including empty string and empty reason)
        • +
        +

        Why is this an issue?

        +

        Tests sometimes need to fail on purpose: a feature is not ready, a dependency is blocked, or a branch of the test should never succeed.

        +

        assert False and assert 0 look like accidental logic bugs rather than deliberate aborts. Readers cannot tell whether the +author meant to stop the test or left a broken condition behind.

        +

        pytest.fail() without a message fails the test but leaves no explanation in the report, so maintainers cannot triage the failure +without digging through history or comments.

        +

        pytest.fail("…​") states the intent and records why the test stopped.

        +

        What is the potential impact?

        +

        Intentional failures without a clear signal or message are harder to triage. Teams may waste time treating deliberate aborts as real assertion +bugs, or overlook why a test is blocked.

        +

        How to fix it

        +

        Replace assert False / assert 0 with pytest.fail("…​"), and always pass a concise message (or +reason=) that explains why the test fails.

        +

        Code examples

        +

        Noncompliant code example

        +
        +import pytest
        +
        +def test_not_ready():
        +    assert False  # Noncompliant
        +
        +def test_blocked():
        +    pytest.fail()  # Noncompliant
        +
        +

        Compliant solution

        +
        +import pytest
        +
        +def test_not_ready():
        +    pytest.fail("feature not implemented yet")
        +
        +def test_blocked():
        +    pytest.fail("blocked on issue 42")
        +
        +

        Resources

        +

        Documentation

        + +

        Related rules

        +
          +
        • {rule:python:S5914} - Assertions should not fail or succeed unconditionally
        • +
        + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9077.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9077.json new file mode 100644 index 000000000..fe55e21f8 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9077.json @@ -0,0 +1,24 @@ +{ + "title": "Intentional test failures should use pytest.fail with a message", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "pytest", + "tests" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-9077", + "sqKey": "S9077", + "scope": "Tests", + "quickfix": "unknown", + "code": { + "impacts": { + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "CLEAR" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 5a52813e7..1bd99fe45 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -385,6 +385,7 @@ "S9074", "S9075", "S9076", + "S9077", "S9078", "S9116" ] diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/IntentionalTestFailureMessageCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/IntentionalTestFailureMessageCheckTest.java new file mode 100644 index 000000000..070410942 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/IntentionalTestFailureMessageCheckTest.java @@ -0,0 +1,65 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import org.junit.jupiter.api.Test; +import org.sonar.plugins.python.api.PythonCheck; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +import static org.assertj.core.api.Assertions.assertThat; + +class IntentionalTestFailureMessageCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/intentionalTestFailureMessage.py", new IntentionalTestFailureMessageCheck()); + } + + @Test + void test_no_pytest_import() { + PythonCheckVerifier.verifyNoIssue( + "src/test/resources/checks/tests/intentionalTestFailureMessageNoPytest.py", + new IntentionalTestFailureMessageCheck()); + } + + @Test + void test_from_pytest_import() { + PythonCheckVerifier.verify( + "src/test/resources/checks/tests/intentionalTestFailureMessageFromImport.py", + new IntentionalTestFailureMessageCheck()); + } + + @Test + void test_multiple_pytest_imports() { + PythonCheckVerifier.verify( + "src/test/resources/checks/tests/intentionalTestFailureMessageMultipleImports.py", + new IntentionalTestFailureMessageCheck()); + } + + @Test + void test_relative_import_does_not_enable_assert() { + PythonCheckVerifier.verifyNoIssue( + "src/test/resources/checks/tests/intentionalTestFailureMessageRelativeImport.py", + new IntentionalTestFailureMessageCheck()); + } + + @Test + void test_scope() { + assertThat(new IntentionalTestFailureMessageCheck().scope()).isEqualTo(PythonCheck.CheckScope.ALL); + } + +} diff --git a/python-checks/src/test/resources/checks/tests/intentionalTestFailureMessage.py b/python-checks/src/test/resources/checks/tests/intentionalTestFailureMessage.py new file mode 100644 index 000000000..fbcb56b56 --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/intentionalTestFailureMessage.py @@ -0,0 +1,127 @@ +import pytest +from pytest import fail as imported_fail + + +def test_assert_false(): + assert False # Noncompliant {{Replace this assertion with pytest.fail(...) and provide a message.}} +# ^^^^^^^^^^^^ + + +def test_assert_zero(): + assert 0 # Noncompliant {{Replace this assertion with pytest.fail(...) and provide a message.}} +# ^^^^^^^^ + + +def test_assert_false_with_message(): + assert False, "not ready yet" # Noncompliant {{Replace this assertion with pytest.fail(...) and provide a message.}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +def test_assert_zero_parenthesized(): + assert (0) # Noncompliant {{Replace this assertion with pytest.fail(...) and provide a message.}} +# ^^^^^^^^^^ + + +def test_assert_equality_ok(): + assert x == 1 + + +def test_assert_name_ok(): + assert some_name + + +def test_assert_true_ok(): + assert True + + +def test_assert_one_ok(): + assert 1 + + +def test_assert_non_integral_float_ok(): + # valueAsLong throws NumberFormatException for non-integral floats + assert 0.5 + + +def test_assert_zero_float(): + assert 0.0 # Noncompliant {{Replace this assertion with pytest.fail(...) and provide a message.}} +# ^^^^^^^^^^ + + +def test_pytest_fail_no_args(): + pytest.fail() # Noncompliant {{Add a message explaining why this test fails.}} +# ^^^^^^^^^^^^^ + + +def test_pytest_fail_empty_message(): + pytest.fail("") # Noncompliant {{Add a message explaining why this test fails.}} +# ^^^^^^^^^^^^^^^ + + +def test_pytest_fail_empty_reason_keyword(): + pytest.fail(reason="") # Noncompliant {{Add a message explaining why this test fails.}} +# ^^^^^^^^^^^^^^^^^^^^^^ + + +def test_pytest_fail_whitespace_message(): + pytest.fail(" ") # Noncompliant {{Add a message explaining why this test fails.}} +# ^^^^^^^^^^^^^^^^^^ + + +def test_pytest_fail_whitespace_reason_keyword(): + pytest.fail(reason=" ") # Noncompliant {{Add a message explaining why this test fails.}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^ + + +def test_pytest_fail_with_message_ok(): + pytest.fail("feature not implemented yet") + + +def test_pytest_fail_with_reason_keyword_ok(): + pytest.fail(reason="blocked on issue 42") + + +def test_pytest_fail_with_legacy_msg_keyword_ok(): + pytest.fail(msg="Sample check failed") + + +def test_pytest_fail_with_legacy_msg_keyword_and_pytrace_ok(): + pytest.fail(msg="Sample check failed", pytrace=False) + + +def test_pytest_fail_with_non_string_legacy_msg_ok(message): + pytest.fail(msg=message) + + +def test_pytest_fail_empty_legacy_msg_keyword(): + pytest.fail(msg="") # Noncompliant {{Add a message explaining why this test fails.}} +# ^^^^^^^^^^^^^^^^^^^ + + +def test_pytest_fail_whitespace_legacy_msg_keyword(): + pytest.fail(msg=" ") # Noncompliant {{Add a message explaining why this test fails.}} +# ^^^^^^^^^^^^^^^^^^^^^^ + + +def test_pytest_fail_with_non_string_reason_ok(message): + pytest.fail(reason=message) + + +def test_pytest_fail_with_non_string_message_ok(message): + pytest.fail(message) + + +def test_imported_fail_no_args(): + imported_fail() # Noncompliant {{Add a message explaining why this test fails.}} +# ^^^^^^^^^^^^^^^ + + +def test_local_fail_ok(): + def fail(): + pass + fail() + + +class SomeTest: + def test_unittest_fail_ok(self): + self.fail() diff --git a/python-checks/src/test/resources/checks/tests/intentionalTestFailureMessageFromImport.py b/python-checks/src/test/resources/checks/tests/intentionalTestFailureMessageFromImport.py new file mode 100644 index 000000000..119a7d11f --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/intentionalTestFailureMessageFromImport.py @@ -0,0 +1,7 @@ +from pytest import fail as imported_fail + + +def test_assert_false_with_from_import(): + assert False # Noncompliant {{Replace this assertion with pytest.fail(...) and provide a message.}} +# ^^^^^^^^^^^^ + imported_fail("ready") diff --git a/python-checks/src/test/resources/checks/tests/intentionalTestFailureMessageMultipleImports.py b/python-checks/src/test/resources/checks/tests/intentionalTestFailureMessageMultipleImports.py new file mode 100644 index 000000000..5ca75e00d --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/intentionalTestFailureMessageMultipleImports.py @@ -0,0 +1,15 @@ +import pytest +from pytest import fail +from pytest.mark import parametrize + + +def test_assert_false_with_multiple_pytest_imports(): + assert False # Noncompliant {{Replace this assertion with pytest.fail(...) and provide a message.}} +# ^^^^^^^^^^^^ + fail("ok") + + +@parametrize("n", [1]) +def test_parametrize_import_enables_assert(n): + assert False # Noncompliant {{Replace this assertion with pytest.fail(...) and provide a message.}} +# ^^^^^^^^^^^^ diff --git a/python-checks/src/test/resources/checks/tests/intentionalTestFailureMessageNoPytest.py b/python-checks/src/test/resources/checks/tests/intentionalTestFailureMessageNoPytest.py new file mode 100644 index 000000000..0776e1ed2 --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/intentionalTestFailureMessageNoPytest.py @@ -0,0 +1,30 @@ +# No pytest import: assert False / assert 0 must not be flagged +# (cannot know whether the runner is pytest or unittest). + + +def test_assert_false_without_pytest(): + assert False + + +def test_assert_zero_without_pytest(): + assert 0 + + +def test_assert_false_with_message_without_pytest(): + assert False, "not ready yet" + + +class TestWithoutPytest: + def test_assert_false(self): + assert False + + def test_assert_zero(self): + assert 0 + + +def fail(): + pass + + +def test_local_fail_without_pytest(): + fail() diff --git a/python-checks/src/test/resources/checks/tests/intentionalTestFailureMessageRelativeImport.py b/python-checks/src/test/resources/checks/tests/intentionalTestFailureMessageRelativeImport.py new file mode 100644 index 000000000..31c5406c3 --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/intentionalTestFailureMessageRelativeImport.py @@ -0,0 +1,5 @@ +from . import local_helper + + +def test_relative_import_does_not_enable_assert(): + assert False From f9b2ee75f2892918bb49c46b05e2933309cc1e63 Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Wed, 29 Jul 2026 14:26:53 +0200 Subject: [PATCH 259/322] SONARPY-4414 Fix S9075 false positives for match-only pytest.warns GitOrigin-RevId: 76bf6021c572f215ba6c913425c46046272415da --- .../tests/SpecificWarningAssertionCheck.java | 6 ++--- .../org/sonar/l10n/py/rules/python/S9075.html | 21 ++++++++++++----- .../checks/tests/specificWarningAssertion.py | 23 +++++++++++++++++++ 3 files changed, 41 insertions(+), 9 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/SpecificWarningAssertionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/SpecificWarningAssertionCheck.java index d839a1076..febc66b50 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/SpecificWarningAssertionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/SpecificWarningAssertionCheck.java @@ -61,13 +61,13 @@ private static Expression underspecifiedWarningArgument(CallExpression callExpre if (!UnittestUtils.isPytestWarns(callExpression, ctx)) { return null; } + if (hasEffectiveMatchArgument(callExpression)) { + return null; + } RegularArgument warningArgument = UnittestUtils.pytestExpectedWarningArgument(callExpression); if (warningArgument == null) { return callExpression; } - if (hasEffectiveMatchArgument(callExpression)) { - return null; - } return broadWarningLocation(warningArgument.expression(), ctx); } diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9075.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9075.html index b21cd0e0c..42b8d5075 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9075.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9075.html @@ -1,12 +1,14 @@ -

        This is an issue when test code verifies that a warning was emitted without specifying its type, or when it uses the overly broad base -Warning type without checking the message.

        +

        This is an issue when test code verifies that a warning was emitted without specifying its type and without checking its message, or when it uses +the overly broad base Warning type without checking the message.

        In Python with pytest, this refers to underspecified pytest.warns() usage, such as:

          -
        • Calls without an expected warning type, for example pytest.warns()
        • +
        • Calls without an expected warning type and without match=, for example pytest.warns()
        • The base type Warning without a match parameter

        More specific warning types such as UserWarning or DeprecationWarning are not covered by this rule when used without match=.

        +

        Omitting the warning type while providing an effective match= is not an issue, because pytest.warns defaults to +Warning and the message pattern narrows the expectation.

        Why is this an issue?

        When testing that code emits a warning, it is not sufficient to verify only that some warning was raised. Tests should also validate the warning type or message to differentiate expected warnings from unexpected ones.

        @@ -20,18 +22,20 @@

        Why is this an issue?

        All three scenarios would make the test pass, even though two represent unintended behavior.

        In pytest, the following patterns lead to insufficiently specific warning testing:

          -
        • Using pytest.warns() without an expected warning type
        • +
        • Using pytest.warns() without an expected warning type and without match=
        • Using pytest.warns(Warning) without match=

        The base Warning class is the root of the warning hierarchy and catches every warning subtype. More specific types such as UserWarning or DeprecationWarning are accepted without match=.

        +

        Omitting the warning type while providing match= is accepted: pytest.warns defaults to Warning, and the +message pattern already narrows the expectation.

        These patterns create fragile tests that may pass for the wrong reasons, allowing regressions to slip through undetected.

        What is the potential impact?

        Tests that underspecify expected warnings can pass when an unrelated warning is emitted, leaving regressions undetected. Narrowing the expected type and message keeps warning tests as a reliable safety net.

        How to fix it

        -

        Pass a specific warning type to pytest.warns. When using the base Warning type, add match= with a pattern -for the message.

        +

        Pass a specific warning type to pytest.warns. When using the base Warning type (explicitly or via the default), add +match= with a pattern for the message.

        Code examples

        Noncompliant code example

        @@ -59,6 +63,11 @@ 

        Compliant solution

        # Base Warning is allowed when match= narrows the expected message with pytest.warns(Warning, match="deprecated"): warnings.warn("deprecated", DeprecationWarning) + +def test_warns_match_only(): + # Omitting the type is allowed when match= is provided + with pytest.warns(match="deprecated"): + warnings.warn("deprecated", DeprecationWarning)

        Resources

        Documentation

        diff --git a/python-checks/src/test/resources/checks/tests/specificWarningAssertion.py b/python-checks/src/test/resources/checks/tests/specificWarningAssertion.py index dec47ffed..a45e00957 100644 --- a/python-checks/src/test/resources/checks/tests/specificWarningAssertion.py +++ b/python-checks/src/test/resources/checks/tests/specificWarningAssertion.py @@ -117,6 +117,29 @@ def test_warns_broad_with_match(): emit_deprecation_warning() +def test_warns_match_only(): + with pytest.warns(match="x"): + emit_user_warning() + + +def test_warns_match_only_variable(): + warning_message = "Can't encode more than one header value for the same key." + with pytest.warns(match=warning_message): + emit_user_warning() + + +def test_warns_match_only_empty(): + with pytest.warns(match=""): # Noncompliant {{This assertion is too broad; use a more specific warning type or check the warning message.}} +# ^^^^^^^^^^^^^^^^^^^^^^ + emit_user_warning() + + +def test_warns_match_only_none(): + with pytest.warns(match=None): # Noncompliant {{This assertion is too broad; use a more specific warning type or check the warning message.}} +# ^^^^^^^^^^^^^^^^^^^^^^^^ + emit_user_warning() + + def test_warns_user_warning_with_match(): with pytest.warns(UserWarning, match="x"): emit_user_warning() From 4182aa067f5d2d6ce94cf923ea6a64e5c98e5221 Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Wed, 29 Jul 2026 14:47:48 +0200 Subject: [PATCH 260/322] SONARPY-4305 Reduce S5778 noise on common safe calls Co-authored-by: github-actions[bot] GitOrigin-RevId: 9ae7c67827bc2930f858aa884386487b0a02c799 --- ...SingleInvocationRuntimeExceptionCheck.java | 119 ++++++++++++------ .../tests/singleInvocationRuntimeException.py | 75 ++++++++++- 2 files changed, 153 insertions(+), 41 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheck.java index 171befae5..d36161ccd 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheck.java @@ -19,14 +19,12 @@ import java.util.ArrayList; import java.util.Comparator; import java.util.List; -import java.util.Objects; import java.util.Optional; import org.sonar.check.Rule; import org.sonar.plugins.python.api.IssueLocation; import org.sonar.plugins.python.api.PythonCheck; import org.sonar.plugins.python.api.PythonSubscriptionCheck; import org.sonar.plugins.python.api.SubscriptionContext; -import org.sonar.plugins.python.api.symbols.Symbol; import org.sonar.plugins.python.api.tree.Argument; import org.sonar.plugins.python.api.tree.BaseTreeVisitor; import org.sonar.plugins.python.api.tree.CallExpression; @@ -38,23 +36,76 @@ import org.sonar.plugins.python.api.tree.Tree; import org.sonar.plugins.python.api.tree.WithItem; import org.sonar.plugins.python.api.tree.WithStatement; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; import org.sonar.python.checks.utils.UnittestUtils; @Rule(key = "S5778") public class SingleInvocationRuntimeExceptionCheck extends PythonSubscriptionCheck { private static final String MESSAGE = "Refactor this exception test to have only one invocation possibly throwing an exception."; private static final String SECONDARY_MESSAGE = "Invocation possibly throwing an exception."; - private static final String PYTEST_RAISES = "pytest.raises"; - private static final List SAFE_BUILTINS = List.of( - "list", - "set", - "dict", - "tuple", - "frozenset", - "str", - "bytes", - "bytearray", - "object"); + + private static final TypeMatcher PYTEST_RAISES_MATCHER = TypeMatchers.isType("pytest.raises"); + + /** + * Calls that are almost never the exception under test when nested inside {@code pytest.raises} / + * {@code assertRaises}. Treating them as safe avoids noisy FPs on common setup helpers. + */ + private static final TypeMatcher ALWAYS_SAFE_CALL_MATCHER = TypeMatchers.any( + TypeMatchers.isType("builtins.str"), + TypeMatchers.isType("builtins.bytes"), + TypeMatchers.isType("builtins.bytearray"), + TypeMatchers.isType("builtins.repr"), + TypeMatchers.isType("builtins.ascii"), + TypeMatchers.isType("builtins.format"), + TypeMatchers.isType("builtins.bool"), + TypeMatchers.isType("builtins.int"), + TypeMatchers.isType("builtins.float"), + TypeMatchers.isType("builtins.complex"), + TypeMatchers.isType("builtins.memoryview"), + TypeMatchers.isType("builtins.list"), + TypeMatchers.isType("builtins.tuple"), + TypeMatchers.isType("builtins.dict"), + TypeMatchers.isType("builtins.print"), + TypeMatchers.isType("builtins.len"), + TypeMatchers.isType("builtins.abs"), + TypeMatchers.isType("builtins.round"), + TypeMatchers.isType("builtins.id"), + TypeMatchers.isType("builtins.hash"), + TypeMatchers.isType("builtins.hex"), + TypeMatchers.isType("builtins.oct"), + TypeMatchers.isType("builtins.bin"), + TypeMatchers.isType("builtins.ord"), + TypeMatchers.isType("builtins.chr"), + TypeMatchers.isType("builtins.range"), + TypeMatchers.isType("builtins.enumerate"), + TypeMatchers.isType("builtins.zip"), + TypeMatchers.isType("builtins.reversed"), + TypeMatchers.isType("builtins.sorted"), + TypeMatchers.isType("builtins.slice"), + TypeMatchers.isType("builtins.callable"), + TypeMatchers.isType("pathlib.Path"), + TypeMatchers.isType("pathlib.PurePath"), + TypeMatchers.isType("pathlib.PosixPath"), + TypeMatchers.isType("pathlib.WindowsPath"), + TypeMatchers.isType("pathlib.PurePosixPath"), + TypeMatchers.isType("pathlib.PureWindowsPath"), + TypeMatchers.isType("uuid.UUID"), + TypeMatchers.isType("uuid.uuid1"), + TypeMatchers.isType("uuid.uuid3"), + TypeMatchers.isType("uuid.uuid4"), + TypeMatchers.isType("uuid.uuid5"), + TypeMatchers.isType("uuid.uuid6"), + TypeMatchers.isType("uuid.uuid7"), + TypeMatchers.isType("uuid.uuid8")); + + /** + * Constructors that are safe only without arguments (with args they commonly raise TypeError). + */ + private static final TypeMatcher EMPTY_ARGS_SAFE_CALL_MATCHER = TypeMatchers.any( + TypeMatchers.isType("builtins.set"), + TypeMatchers.isType("builtins.frozenset"), + TypeMatchers.isType("builtins.object")); @Override public void initialize(Context context) { @@ -72,35 +123,31 @@ private static void checkWithStatement(SubscriptionContext ctx, WithStatement wi .map(WithItem::test) .filter(CallExpression.class::isInstance) .map(CallExpression.class::cast) - .anyMatch(callExpression -> isPytestRaise(callExpression) || isUnittestRaise(callExpression)); + .anyMatch(callExpression -> isPytestRaise(callExpression, ctx) || isUnittestRaise(callExpression)); if (!isRaiseAssertion) { return; } - var invocations = unsafeInvocations(withStatement.statements()); + var invocations = unsafeInvocations(withStatement.statements(), ctx); if (invocations.size() > 1) { reportIfMultipleInvocations(ctx.addIssue(withStatement.withKeyword(), withStatement.colon(), MESSAGE), invocations); } } private static void checkDirectRaiseCall(SubscriptionContext ctx, CallExpression callExpression) { - if (!isPytestRaise(callExpression) && !isUnittestRaise(callExpression)) { + if (!isPytestRaise(callExpression, ctx) && !isUnittestRaise(callExpression)) { return; } findLambdaArgument(callExpression.arguments()) - .map(lambdaExpression -> unsafeInvocations(lambdaExpression.expression())) + .map(lambdaExpression -> unsafeInvocations(lambdaExpression.expression(), ctx)) .filter(invocations -> invocations.size() > 1) .ifPresent(invocations -> reportIfMultipleInvocations(ctx.addIssue(callExpression, MESSAGE), invocations)); } - private static boolean isPytestRaise(CallExpression callExpression) { - return Optional.ofNullable(callExpression.calleeSymbol()) - .map(Symbol::fullyQualifiedName) - .filter(Objects::nonNull) - .map(fqn -> fqn.contains(PYTEST_RAISES)) - .orElse(false); + private static boolean isPytestRaise(CallExpression callExpression, SubscriptionContext ctx) { + return PYTEST_RAISES_MATCHER.isTrueFor(callExpression.callee(), ctx); } private static boolean isUnittestRaise(CallExpression callExpression) { @@ -138,8 +185,8 @@ private static IssueLocation invocationLocation(CallExpression invocation, Strin return IssueLocation.preciseLocation(invocation, message); } - private static List unsafeInvocations(Tree tree) { - var visitor = new InvocationCollector(); + private static List unsafeInvocations(Tree tree, SubscriptionContext ctx) { + var visitor = new InvocationCollector(ctx); tree.accept(visitor); return visitor.invocations.stream() .sorted(Comparator @@ -151,11 +198,16 @@ private static List unsafeInvocations(Tree tree) { } private static class InvocationCollector extends BaseTreeVisitor { + private final SubscriptionContext ctx; private final List invocations = new ArrayList<>(); + private InvocationCollector(SubscriptionContext ctx) { + this.ctx = ctx; + } + @Override public void visitCallExpression(CallExpression callExpression) { - if (!isSafeBuiltin(callExpression)) { + if (!isSafeCall(callExpression)) { invocations.add(callExpression); } super.visitCallExpression(callExpression); @@ -171,17 +223,12 @@ public void visitFunctionDef(FunctionDef functionDef) { // Nested function bodies are not executed when merely defined. } - private static boolean isSafeBuiltin(CallExpression callExpression) { - if (!(callExpression.callee() instanceof Name calleeName)) { - return false; + private boolean isSafeCall(CallExpression callExpression) { + if (ALWAYS_SAFE_CALL_MATCHER.isTrueFor(callExpression.callee(), ctx)) { + return true; } - - String callee = calleeName.name(); - if (!SAFE_BUILTINS.contains(callee)) { - return false; - } - - return callExpression.arguments().isEmpty(); + return EMPTY_ARGS_SAFE_CALL_MATCHER.isTrueFor(callExpression.callee(), ctx) + && callExpression.arguments().isEmpty(); } } } diff --git a/python-checks/src/test/resources/checks/tests/singleInvocationRuntimeException.py b/python-checks/src/test/resources/checks/tests/singleInvocationRuntimeException.py index 3215a00cc..82dee77e1 100644 --- a/python-checks/src/test/resources/checks/tests/singleInvocationRuntimeException.py +++ b/python-checks/src/test/resources/checks/tests/singleInvocationRuntimeException.py @@ -1,4 +1,7 @@ import unittest +import uuid +from pathlib import Path +from uuid import UUID, uuid4 import pytest @@ -107,6 +110,51 @@ def test_pytest_with_unsafe_collection_arguments(): # ^^^^^^@-1< {{Invocation possibly throwing an exception.}} +def test_pytest_with_dict_named_args(): + with pytest.raises(ValueError): + do_work(dict(x=1)) + + +def test_pytest_with_str_argument(): + with pytest.raises(ValueError): + do_work(str(1)) + + +def test_pytest_with_print(): + with pytest.raises(ValueError): + print(do_work()) + + +def test_pytest_with_path(): + with pytest.raises(ValueError): + do_work(Path("missing")) + + +def test_pytest_with_uuid4(): + with pytest.raises(ValueError): + do_work(uuid4()) + + +def test_pytest_with_uuid_module(): + with pytest.raises(ValueError): + do_work(uuid.uuid4()) + + +def test_pytest_with_uuid_constructor(): + with pytest.raises(ValueError): + do_work(UUID(int=0)) + + +def test_pytest_with_len_and_repr(): + with pytest.raises(ValueError): + do_work(len(repr(1))) + + +def test_pytest_with_list_and_tuple_args(): + with pytest.raises(ValueError): + do_work(list((1,))) + + def test_pytest_direct_lambda(): pytest.raises(ValueError, lambda: get_item().process()) # Noncompliant {{Refactor this exception test to have only one invocation possibly throwing an exception.}} # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -127,11 +175,16 @@ def test_pytest_direct_lambda_single_invocation(): pytest.raises(ValueError, lambda: do_work()) -def test_pytest_direct_lambda_with_unsafe_builtin_argument(): - pytest.raises(ValueError, lambda: do_work(dict(5))) # Noncompliant {{Refactor this exception test to have only one invocation possibly throwing an exception.}} -# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -# ^^^^^^^^^^^^^^^^@-1< {{Invocation possibly throwing an exception.}} -# ^^^^^^^@-2< {{Invocation possibly throwing an exception.}} +def test_pytest_direct_lambda_with_dict_positional_argument(): + pytest.raises(ValueError, lambda: do_work(dict(5))) + + +def test_pytest_direct_lambda_with_dict_named_args(): + pytest.raises(ValueError, lambda: do_work(dict(x=1))) + + +def test_pytest_direct_lambda_with_uuid(): + pytest.raises(ValueError, lambda: do_work(uuid4())) def test_non_raise_with_statement(): @@ -163,6 +216,18 @@ def test_unittest_with_safe_builtin(self): with self.assertRaises(ValueError): do_work(dict()) + def test_unittest_with_dict_named_args(self): + with self.assertRaises(ValueError): + do_work(dict(x=1)) + + def test_unittest_with_path_and_str(self): + with self.assertRaises(ValueError): + do_work(str(Path("x"))) + + def test_unittest_with_uuid(self): + with self.assertRaises(ValueError): + do_work(uuid.uuid4()) + def test_unittest_lambda(self): self.assertRaises(ValueError, lambda: get_item().process()) # Noncompliant {{Refactor this exception test to have only one invocation possibly throwing an exception.}} # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ From 5cb369e5f35a69e65f4f85f9f4337b350bedf9ce Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Wed, 29 Jul 2026 15:23:15 +0200 Subject: [PATCH 261/322] SONARPY-4422 Implement rule S9083 Enforce pytest decorator parentheses style GitOrigin-RevId: e2091403568f82c23502514821a337479b9a9b6e --- .../python/checks/OpenSourceCheckList.java | 2 + .../PytestDecoratorParenthesesCheck.java | 110 +++++++++++ .../org/sonar/l10n/py/rules/python/S9083.html | 70 +++++++ .../org/sonar/l10n/py/rules/python/S9083.json | 24 +++ .../py/rules/python/Sonar_way_profile.json | 1 + .../PytestDecoratorParenthesesCheckTest.java | 178 ++++++++++++++++++ .../tests/pytestDecoratorParentheses.py | 174 +++++++++++++++++ .../pytestDecoratorParenthesesRequired.py | 108 +++++++++++ 8 files changed, 667 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/tests/PytestDecoratorParenthesesCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9083.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9083.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/tests/PytestDecoratorParenthesesCheckTest.java create mode 100644 python-checks/src/test/resources/checks/tests/pytestDecoratorParentheses.py create mode 100644 python-checks/src/test/resources/checks/tests/pytestDecoratorParenthesesRequired.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index da0eeb230..2c0fc6dad 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -108,6 +108,7 @@ import org.sonar.python.checks.tests.IntentionalTestFailureMessageCheck; import org.sonar.python.checks.tests.NotDiscoverableTestMethodCheck; import org.sonar.python.checks.tests.PytestAutouseParametrizedFixtureCheck; +import org.sonar.python.checks.tests.PytestDecoratorParenthesesCheck; import org.sonar.python.checks.tests.PytestFixtureMultipleYieldCheck; import org.sonar.python.checks.tests.PytestFixturePositionalArgsCheck; import org.sonar.python.checks.tests.PytestPluginsConftestCheck; @@ -413,6 +414,7 @@ public Stream> getChecks() { PydanticMultipleInheritanceConfigCheck.class, PydanticSkipValidationWithConstraintsCheck.class, PytestAutouseParametrizedFixtureCheck.class, + PytestDecoratorParenthesesCheck.class, PytestFixtureMultipleYieldCheck.class, PytestFixturePositionalArgsCheck.class, PytestPluginsConftestCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/PytestDecoratorParenthesesCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/PytestDecoratorParenthesesCheck.java new file mode 100644 index 000000000..87c31ecc4 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/PytestDecoratorParenthesesCheck.java @@ -0,0 +1,110 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import org.sonar.check.Rule; +import org.sonar.check.RuleProperty; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.quickfix.PythonQuickFix; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.Decorator; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.QualifiedExpression; +import org.sonar.plugins.python.api.tree.Token; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.quickfix.TextEditUtils; + +@Rule(key = "S9083") +public class PytestDecoratorParenthesesCheck extends PythonSubscriptionCheck { + + private static final boolean DEFAULT_REQUIRE_PARENTHESES = false; + + private static final String REMOVE_MESSAGE = "Remove empty parentheses from this decorator."; + private static final String ADD_MESSAGE = "Add empty parentheses to this decorator."; + private static final String REMOVE_QUICK_FIX_MESSAGE = "Remove the empty parentheses"; + private static final String ADD_QUICK_FIX_MESSAGE = "Add empty parentheses"; + + private static final TypeMatcher PYTEST_FIXTURE_MATCHER = TypeMatchers.withFQN("pytest.fixture"); + private static final TypeMatcher PYTEST_MARK_MATCHER = TypeMatchers.isType("pytest.mark"); + private static final TypeMatcher KNOWN_PYTEST_MARK_MATCHER = TypeMatchers.any( + TypeMatchers.isType("pytest.mark.skip"), + TypeMatchers.isType("pytest.mark.xfail"), + TypeMatchers.isType("pytest.mark.parametrize"), + TypeMatchers.isType("pytest.mark.usefixtures")); + + @RuleProperty( + key = "requireParentheses", + description = "Whether argument-free pytest fixture and mark decorators should use empty parentheses.", + defaultValue = "" + DEFAULT_REQUIRE_PARENTHESES) + public boolean requireParentheses = DEFAULT_REQUIRE_PARENTHESES; + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.DECORATOR, this::checkDecorator); + } + + @Override + public CheckScope scope() { + return CheckScope.ALL; + } + + private void checkDecorator(SubscriptionContext ctx) { + Expression expression = ((Decorator) ctx.syntaxNode()).expression(); + if (expression instanceof CallExpression callExpression) { + if (!requireParentheses && callExpression.arguments().isEmpty() && isPytestFixtureOrMark(callExpression.callee(), ctx)) { + raiseOnEmptyParentheses(ctx, callExpression); + } + } else if (requireParentheses && isPytestFixtureOrMark(expression, ctx)) { + raiseOnMissingParentheses(ctx, expression); + } + } + + private static void raiseOnEmptyParentheses(SubscriptionContext ctx, CallExpression callExpression) { + Token rightPar = callExpression.rightPar(); + var issue = ctx.addIssue(callExpression.leftPar(), rightPar, REMOVE_MESSAGE); + // A comment between the parentheses would be dropped along with them, so no fix is offered in that case. + if (rightPar.trivia().isEmpty()) { + Token calleeEnd = callExpression.callee().lastToken(); + issue.addQuickFix(PythonQuickFix.newQuickFix(REMOVE_QUICK_FIX_MESSAGE) + .addTextEdit(TextEditUtils.removeRange(calleeEnd.pythonLine(), endColumn(calleeEnd), rightPar.pythonLine(), endColumn(rightPar))) + .build()); + } + } + + private static void raiseOnMissingParentheses(SubscriptionContext ctx, Expression expression) { + ctx.addIssue(expression, ADD_MESSAGE) + .addQuickFix(PythonQuickFix.newQuickFix(ADD_QUICK_FIX_MESSAGE) + .addTextEdit(TextEditUtils.insertAfter(expression.lastToken(), "()")) + .build()); + } + + private static boolean isPytestFixtureOrMark(Expression expression, SubscriptionContext ctx) { + if (PYTEST_FIXTURE_MATCHER.isTrueFor(expression, ctx) || KNOWN_PYTEST_MARK_MATCHER.isTrueFor(expression, ctx)) { + return true; + } + // Custom marks have no stub, so they are recognized through the `pytest.mark` qualifier they are accessed on. + return expression instanceof QualifiedExpression qualifiedExpression + && PYTEST_MARK_MATCHER.isTrueFor(qualifiedExpression.qualifier(), ctx); + } + + private static int endColumn(Token token) { + return token.pythonColumn() + token.value().length(); + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9083.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9083.html new file mode 100644 index 000000000..96e090c17 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9083.html @@ -0,0 +1,70 @@ +

        This rule raises an issue when an argument-free @pytest.fixture or @pytest.mark.* decorator uses parentheses +inconsistently with the configured style.

        +

        By default, empty parentheses are not allowed, matching the official pytest documentation. Analysis may be configured to require empty parentheses +instead.

        +

        Why is this an issue?

        +

        For argument-free @pytest.fixture and @pytest.mark.* decorators, parentheses are optional:

        +
        +@pytest.fixture
        +def sample():
        +    return 1
        +
        +@pytest.fixture()
        +def other():
        +    return 2
        +
        +

        Both forms are valid, but mixing them makes tests harder to scan and review. Prefer one style consistently. The default style omits empty +parentheses, which matches pytest’s own documentation.

        +

        Decorators that take arguments still need parentheses:

        +
        +@pytest.fixture(scope='module')
        +def db():
        +    ...
        +
        +@pytest.mark.parametrize('value', [1, 2])
        +def test_values(value):
        +    ...
        +
        +

        What is the potential impact?

        +

        Inconsistent parentheses on fixtures and marks add noise during reviews without changing behavior. Aligning on one style keeps test suites easier +to read and maintain.

        +

        How to fix it

        +

        Omit empty parentheses on argument-free @pytest.fixture and @pytest.mark.* decorators (the default style). If analysis is +configured to require parentheses, add empty () instead.

        +

        Do not change decorators that already pass arguments.

        +

        Code examples

        +

        Noncompliant code example

        +
        +import pytest
        +
        +@pytest.fixture()  # Noncompliant
        +def sample():
        +    return 1
        +
        +@pytest.mark.slow()  # Noncompliant
        +def test_sample(sample):
        +    assert sample == 1
        +
        +

        Compliant solution

        +
        +import pytest
        +
        +@pytest.fixture
        +def sample():
        +    return 1
        +
        +@pytest.mark.slow
        +def test_sample(sample):
        +    assert sample == 1
        +
        +

        Resources

        +

        Documentation

        + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9083.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9083.json new file mode 100644 index 000000000..ce21aa983 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9083.json @@ -0,0 +1,24 @@ +{ + "title": "Pytest fixture and mark decorators should use consistent parentheses style", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "1min" + }, + "tags": [ + "pytest", + "tests" + ], + "defaultSeverity": "Minor", + "ruleSpecification": "RSPEC-9083", + "sqKey": "S9083", + "scope": "Tests", + "quickfix": "targeted", + "code": { + "impacts": { + "MAINTAINABILITY": "LOW" + }, + "attribute": "CONVENTIONAL" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 1bd99fe45..ee060ce91 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -387,6 +387,7 @@ "S9076", "S9077", "S9078", + "S9083", "S9116" ] } diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/PytestDecoratorParenthesesCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/PytestDecoratorParenthesesCheckTest.java new file mode 100644 index 000000000..6e01aaa8d --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/PytestDecoratorParenthesesCheckTest.java @@ -0,0 +1,178 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import java.util.stream.Stream; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.sonar.plugins.python.api.PythonCheck; +import org.sonar.python.checks.quickfix.PythonQuickFixVerifier; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +import static org.assertj.core.api.Assertions.assertThat; + +class PytestDecoratorParenthesesCheckTest { + + private static final String FILE_NAME = "test_pytest_decorator_parentheses.py"; + private static final PytestDecoratorParenthesesCheck CHECK = new PytestDecoratorParenthesesCheck(); + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/pytestDecoratorParentheses.py", CHECK); + } + + @Test + void test_require_parentheses() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/pytestDecoratorParenthesesRequired.py", checkRequiringParentheses()); + } + + @Test + void test_scope() { + assertThat(CHECK.scope()).isEqualTo(PythonCheck.CheckScope.ALL); + } + + @Test + void quick_fix_removes_empty_parentheses() { + String before = """ + import pytest + + @pytest.fixture() + def sample(): + return 1 + """; + String after = """ + import pytest + + @pytest.fixture + def sample(): + return 1 + """; + PythonQuickFixVerifier.verifySemantic(CHECK, FILE_NAME, before, after); + PythonQuickFixVerifier.verifySemanticQuickFixMessages(CHECK, FILE_NAME, before, "Remove the empty parentheses"); + } + + @ParameterizedTest + @MethodSource("removalQuickFixCases") + void quick_fix_removes_empty_parentheses_of(String before, String after) { + PythonQuickFixVerifier.verifySemantic(CHECK, FILE_NAME, before, after); + } + + static Stream removalQuickFixCases() { + return Stream.of( + Arguments.of(""" + import pytest + + @pytest.mark.slow() + def test_sample(): + assert True + """, """ + import pytest + + @pytest.mark.slow + def test_sample(): + assert True + """), + Arguments.of(""" + import pytest + + @pytest.fixture () + def sample(): + return 1 + """, """ + import pytest + + @pytest.fixture + def sample(): + return 1 + """), + Arguments.of(""" + import pytest + + @pytest.fixture( + ) + def sample(): + return 1 + """, """ + import pytest + + @pytest.fixture + def sample(): + return 1 + """)); + } + + @Test + void no_quick_fix_when_a_comment_sits_inside_the_parentheses() { + String before = """ + import pytest + + @pytest.fixture( + # TODO decide on a scope + ) + def sample(): + return 1 + """; + PythonQuickFixVerifier.verifySemanticNoQuickFixes(CHECK, FILE_NAME, before); + } + + @Test + void quick_fix_adds_empty_parentheses() { + String before = """ + import pytest + + @pytest.fixture + def sample(): + return 1 + """; + String after = """ + import pytest + + @pytest.fixture() + def sample(): + return 1 + """; + PythonQuickFixVerifier.verifySemantic(checkRequiringParentheses(), FILE_NAME, before, after); + PythonQuickFixVerifier.verifySemanticQuickFixMessages(checkRequiringParentheses(), FILE_NAME, before, "Add empty parentheses"); + } + + @Test + void quick_fix_adds_empty_parentheses_to_mark() { + String before = """ + import pytest + + @pytest.mark.slow + def test_sample(): + assert True + """; + String after = """ + import pytest + + @pytest.mark.slow() + def test_sample(): + assert True + """; + PythonQuickFixVerifier.verifySemantic(checkRequiringParentheses(), FILE_NAME, before, after); + } + + private static PytestDecoratorParenthesesCheck checkRequiringParentheses() { + PytestDecoratorParenthesesCheck check = new PytestDecoratorParenthesesCheck(); + check.requireParentheses = true; + return check; + } +} diff --git a/python-checks/src/test/resources/checks/tests/pytestDecoratorParentheses.py b/python-checks/src/test/resources/checks/tests/pytestDecoratorParentheses.py new file mode 100644 index 000000000..28ba51592 --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/pytestDecoratorParentheses.py @@ -0,0 +1,174 @@ +import functools + +import pytest +from pytest import fixture, mark +from pytest.mark import skip + + +@pytest.fixture() # Noncompliant {{Remove empty parentheses from this decorator.}} +# ^^ +def empty_parens_fixture(): + return 1 + + +@pytest.mark.slow() # Noncompliant {{Remove empty parentheses from this decorator.}} +# ^^ +def test_empty_parens_custom_mark(): + assert True + + +@pytest.mark.skip() # Noncompliant {{Remove empty parentheses from this decorator.}} +# ^^ +def test_empty_parens_known_mark(): + assert True + + +@pytest.mark.usefixtures() # Noncompliant {{Remove empty parentheses from this decorator.}} +# ^^ +def test_empty_parens_usefixtures(): + assert True + + +@fixture() # Noncompliant {{Remove empty parentheses from this decorator.}} +# ^^ +def empty_parens_imported_fixture(): + return 1 + + +@mark.slow() # Noncompliant {{Remove empty parentheses from this decorator.}} +# ^^ +def test_empty_parens_imported_mark(): + assert True + + +@skip() # Noncompliant {{Remove empty parentheses from this decorator.}} +# ^^ +def test_empty_parens_imported_skip(): + assert True + + +@pytest.fixture () # Noncompliant {{Remove empty parentheses from this decorator.}} +# ^^ +def empty_parens_with_space_fixture(): + return 1 + + +@pytest.mark.slow() # Noncompliant {{Remove empty parentheses from this decorator.}} +# ^^ +class TestEmptyParensOnClass: + @pytest.fixture() # Noncompliant {{Remove empty parentheses from this decorator.}} +# ^^ + def resource(self): + return 1 + + +@pytest.mark.slow() # Noncompliant {{Remove empty parentheses from this decorator.}} +# ^^ +@pytest.mark.usefixtures("db") +@pytest.fixture() # Noncompliant {{Remove empty parentheses from this decorator.}} +# ^^ +def several_decorators(): + return 1 + + +# Compliant: no parentheses at all, which is the default expected style +@pytest.fixture +def bare_fixture(): + return 1 + + +@pytest.mark.slow +def test_bare_custom_mark(): + assert True + + +@pytest.mark.skip +def test_bare_known_mark(): + assert True + + +@pytest.mark.usefixtures +def test_bare_usefixtures(): + assert True + + +@fixture +def bare_imported_fixture(): + return 1 + + +@mark.slow +def test_bare_imported_mark(): + assert True + + +@pytest.mark.slow +class TestBareMarkOnClass: + @pytest.fixture + def resource(self): + return 1 + + +# Compliant: decorators with arguments keep their parentheses +@pytest.fixture(scope="module") +def scoped_fixture(): + return 1 + + +@pytest.fixture(name="renamed", autouse=True) +def named_fixture(): + return 1 + + +@pytest.mark.parametrize("value", [1, 2]) +def test_parametrized(value): + assert value + + +@pytest.mark.skip(reason="not ready") +def test_skipped(): + assert False + + +@pytest.mark.usefixtures("db") +def test_with_usefixtures(): + assert True + + +@pytest.mark.slow(1) +def test_mark_with_argument(): + assert True + + +def make_options(): + return {"scope": "session"} + + +@pytest.fixture(**make_options()) +def unpacked_options_fixture(): + return 1 + + +# Compliant: not pytest decorators +@functools.cache() +def cached(): + return 1 + + +@functools.cache +def also_cached(): + return 1 + + +def my_decorator(func): + return func + + +@my_decorator +def decorated(): + return 1 + + +@my_decorator() +def decorated_with_parens(): + return 1 diff --git a/python-checks/src/test/resources/checks/tests/pytestDecoratorParenthesesRequired.py b/python-checks/src/test/resources/checks/tests/pytestDecoratorParenthesesRequired.py new file mode 100644 index 000000000..a6fb89bb7 --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/pytestDecoratorParenthesesRequired.py @@ -0,0 +1,108 @@ +import functools + +import pytest +from pytest import fixture, mark +from pytest.mark import skip + + +@pytest.fixture # Noncompliant {{Add empty parentheses to this decorator.}} +#^^^^^^^^^^^^^^ +def bare_fixture(): + return 1 + + +@pytest.mark.slow # Noncompliant {{Add empty parentheses to this decorator.}} +#^^^^^^^^^^^^^^^^ +def test_bare_custom_mark(): + assert True + + +@pytest.mark.skip # Noncompliant {{Add empty parentheses to this decorator.}} +#^^^^^^^^^^^^^^^^ +def test_bare_known_mark(): + assert True + + +@pytest.mark.usefixtures # Noncompliant {{Add empty parentheses to this decorator.}} +#^^^^^^^^^^^^^^^^^^^^^^^ +def test_bare_usefixtures(): + assert True + + +@fixture # Noncompliant {{Add empty parentheses to this decorator.}} +#^^^^^^^ +def bare_imported_fixture(): + return 1 + + +@mark.slow # Noncompliant {{Add empty parentheses to this decorator.}} +#^^^^^^^^^ +def test_bare_imported_mark(): + assert True + + +@skip # Noncompliant {{Add empty parentheses to this decorator.}} +#^^^^ +def test_bare_imported_skip(): + assert True + + +@pytest.mark.slow # Noncompliant {{Add empty parentheses to this decorator.}} +#^^^^^^^^^^^^^^^^ +class TestBareMarkOnClass: + @pytest.fixture # Noncompliant {{Add empty parentheses to this decorator.}} +# ^^^^^^^^^^^^^^ + def resource(self): + return 1 + + +# Compliant: parentheses are present, which is the configured expected style +@pytest.fixture() +def empty_parens_fixture(): + return 1 + + +@pytest.mark.slow() +def test_empty_parens_custom_mark(): + assert True + + +@fixture() +def empty_parens_imported_fixture(): + return 1 + + +@mark.slow() +def test_empty_parens_imported_mark(): + assert True + + +# Compliant: decorators with arguments already have parentheses +@pytest.fixture(scope="module") +def scoped_fixture(): + return 1 + + +@pytest.mark.parametrize("value", [1, 2]) +def test_parametrized(value): + assert value + + +@pytest.mark.usefixtures("db") +def test_with_usefixtures(): + assert True + + +# Compliant: not pytest decorators +@functools.cache +def cached(): + return 1 + + +def my_decorator(func): + return func + + +@my_decorator +def decorated(): + return 1 From 639efa41fb5811e61bb76460523964219f420de6 Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Wed, 29 Jul 2026 15:57:01 +0200 Subject: [PATCH 262/322] SONARPY-4424 Implement rule S9084 Prefer importing pytest as a module GitOrigin-RevId: 3167208d4b54a8bf8dd83ecd9296bc37dd719738 --- .../python/checks/OpenSourceCheckList.java | 2 + .../checks/tests/PytestModuleImportCheck.java | 70 +++++++++++++++ .../org/sonar/l10n/py/rules/python/S9084.html | 88 +++++++++++++++++++ .../org/sonar/l10n/py/rules/python/S9084.json | 24 +++++ .../py/rules/python/Sonar_way_profile.json | 1 + .../tests/PytestModuleImportCheckTest.java | 36 ++++++++ .../checks/tests/pytestModuleImport.py | 37 ++++++++ 7 files changed, 258 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/tests/PytestModuleImportCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9084.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9084.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/tests/PytestModuleImportCheckTest.java create mode 100644 python-checks/src/test/resources/checks/tests/pytestModuleImport.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 2c0fc6dad..2cba6242a 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -111,6 +111,7 @@ import org.sonar.python.checks.tests.PytestDecoratorParenthesesCheck; import org.sonar.python.checks.tests.PytestFixtureMultipleYieldCheck; import org.sonar.python.checks.tests.PytestFixturePositionalArgsCheck; +import org.sonar.python.checks.tests.PytestModuleImportCheck; import org.sonar.python.checks.tests.PytestPluginsConftestCheck; import org.sonar.python.checks.tests.PytestRaisesContextManagerCheck; import org.sonar.python.checks.tests.SingleInvocationRuntimeExceptionCheck; @@ -417,6 +418,7 @@ public Stream> getChecks() { PytestDecoratorParenthesesCheck.class, PytestFixtureMultipleYieldCheck.class, PytestFixturePositionalArgsCheck.class, + PytestModuleImportCheck.class, PytestPluginsConftestCheck.class, PytestRaisesContextManagerCheck.class, PyTorchDataLoaderNumWorkersCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/PytestModuleImportCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/PytestModuleImportCheck.java new file mode 100644 index 000000000..271146fac --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/PytestModuleImportCheck.java @@ -0,0 +1,70 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import java.util.List; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.AliasedName; +import org.sonar.plugins.python.api.tree.DottedName; +import org.sonar.plugins.python.api.tree.ImportFrom; +import org.sonar.plugins.python.api.tree.ImportName; +import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.Tree; + +@Rule(key = "S9084") +public class PytestModuleImportCheck extends PythonSubscriptionCheck { + + private static final String PYTEST = "pytest"; + private static final String MESSAGE_FROM_IMPORT = "Import \"pytest\" as a module."; + private static final String MESSAGE_ALIASED_IMPORT = "Do not alias the \"pytest\" module."; + + @Override + public CheckScope scope() { + return CheckScope.ALL; + } + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.IMPORT_FROM, PytestModuleImportCheck::checkImportFrom); + context.registerSyntaxNodeConsumer(Tree.Kind.IMPORT_NAME, PytestModuleImportCheck::checkImportName); + } + + private static void checkImportFrom(SubscriptionContext ctx) { + ImportFrom importFrom = (ImportFrom) ctx.syntaxNode(); + DottedName module = importFrom.module(); + if (module != null && importFrom.dottedPrefixForModule().isEmpty() && isPytestModule(module)) { + ctx.addIssue(importFrom, MESSAGE_FROM_IMPORT); + } + } + + private static void checkImportName(SubscriptionContext ctx) { + ImportName importName = (ImportName) ctx.syntaxNode(); + for (AliasedName module : importName.modules()) { + Name alias = module.alias(); + if (alias != null && !PYTEST.equals(alias.name()) && isPytestModule(module.dottedName())) { + ctx.addIssue(module, MESSAGE_ALIASED_IMPORT); + } + } + } + + private static boolean isPytestModule(DottedName dottedName) { + List names = dottedName.names(); + return !names.isEmpty() && PYTEST.equals(names.get(0).name()); + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9084.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9084.html new file mode 100644 index 000000000..b394d99fe --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9084.html @@ -0,0 +1,88 @@ +

        This rule raises an issue when pytest is imported with from pytest import …​ or under an alias such as import +pytest as …​, instead of a plain import pytest.

        +

        In Python, this refers to imports such as:

        +
          +
        • from pytest import mark, raises (and other from pytest import …​ forms, including subpackages)
        • +
        • import pytest as pt (and other aliases that rename pytest)
        • +
        +

        Why is this an issue?

        +

        Pytest is conventionally imported as a module: import pytest. Members are then accessed as pytest.raises, +pytest.mark, pytest.fixture, and so on.

        +

        from pytest import …​

        +

        Importing selected names from pytest scatters short unbound names through the test file:

        +
        +from pytest import mark, raises
        +
        +@mark.skip
        +def test_invalid_input():
        +    with raises(ValueError):
        +        process_data('hello')
        +
        +

        Readers must check the import list to know that mark and raises come from pytest. Mixing import pytest in +some files with from pytest import …​ in others makes the suite harder to skim and to search.

        +

        Aliased imports

        +

        Renaming the module hides the standard name:

        +
        +import pytest as pt
        +
        +def test_invalid_input():
        +    with pt.raises(ValueError):
        +        process_data('hello')
        +
        +

        import pytest keeps every call site consistent across the project.

        +

        Preferred form

        +
        +import pytest
        +
        +@pytest.mark.skip
        +def test_invalid_input():
        +    with pytest.raises(ValueError):
        +        process_data('hello')
        +
        +

        What is the potential impact?

        +

        Inconsistent pytest imports force maintainers to resolve where helpers come from and slow down reviews. A single import pytest style +keeps test APIs recognizable and easier to search across the suite.

        +

        How to fix it

        +

        Replace from pytest import …​ and aliased imports with import pytest, then qualify members as pytest…​..

        +

        Code examples

        +

        Noncompliant code example

        +
        +from pytest import mark, raises  # Noncompliant
        +
        +@mark.skip
        +def test_invalid_input():
        +    with raises(ValueError):
        +        process_data('hello')
        +
        +

        Compliant solution

        +
        +import pytest
        +
        +@pytest.mark.skip
        +def test_invalid_input():
        +    with pytest.raises(ValueError):
        +        process_data('hello')
        +
        +

        Noncompliant code example

        +
        +import pytest as pt  # Noncompliant
        +
        +def test_invalid_input():
        +    with pt.raises(ValueError):
        +        process_data('hello')
        +
        +

        Compliant solution

        +
        +import pytest
        +
        +def test_invalid_input():
        +    with pytest.raises(ValueError):
        +        process_data('hello')
        +
        +

        Resources

        +

        Documentation

        + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9084.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9084.json new file mode 100644 index 000000000..85c8735cb --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9084.json @@ -0,0 +1,24 @@ +{ + "title": "pytest should be imported as a module", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "pytest", + "tests" + ], + "defaultSeverity": "Minor", + "ruleSpecification": "RSPEC-9084", + "sqKey": "S9084", + "scope": "Tests", + "quickfix": "unknown", + "code": { + "impacts": { + "MAINTAINABILITY": "LOW" + }, + "attribute": "CONVENTIONAL" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index ee060ce91..8a14b7b72 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -388,6 +388,7 @@ "S9077", "S9078", "S9083", + "S9084", "S9116" ] } diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/PytestModuleImportCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/PytestModuleImportCheckTest.java new file mode 100644 index 000000000..48dd13e60 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/PytestModuleImportCheckTest.java @@ -0,0 +1,36 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import org.junit.jupiter.api.Test; +import org.sonar.plugins.python.api.PythonCheck; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +import static org.assertj.core.api.Assertions.assertThat; + +class PytestModuleImportCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/pytestModuleImport.py", new PytestModuleImportCheck()); + } + + @Test + void test_scope() { + assertThat(new PytestModuleImportCheck().scope()).isEqualTo(PythonCheck.CheckScope.ALL); + } +} diff --git a/python-checks/src/test/resources/checks/tests/pytestModuleImport.py b/python-checks/src/test/resources/checks/tests/pytestModuleImport.py new file mode 100644 index 000000000..27a76a341 --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/pytestModuleImport.py @@ -0,0 +1,37 @@ +from pytest import mark, raises # Noncompliant {{Import "pytest" as a module.}} +#^[sc=1;ec=31] +from pytest import approx as approximately # Noncompliant +#^[sc=1;ec=42] +from pytest import * # Noncompliant +#^[sc=1;ec=20] +from pytest.foo import bar # Noncompliant +#^[sc=1;ec=26] +import pytest as pt # Noncompliant {{Do not alias the "pytest" module.}} +# ^^^^^^^^^^^^ +import os, pytest as pt2 # Noncompliant +# ^^^^^^^^^^^^^ +import pytest.foo as pf # Noncompliant +# ^^^^^^^^^^^^^^^^ + +import pytest +import pytest.foo +import os, pytest +import pytest as pytest # explicit re-export, no renaming + +import pytest_asyncio as pytest_async +from pytest_mock import MockerFixture +from _pytest.monkeypatch import MonkeyPatch +from pytest_django.asserts import assertNumQueries +from mypytest import something +from unittest import mock + + +def local_imports(): + from pytest import fixture # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^^^^^^^ + import pytest as inner # Noncompliant +# ^^^^^^^^^^^^^^^ + import pytest + from . import pytest + from .pytest import helper + from ..pytest.utils import helper2 From 2c3590318c644163418f82b57341a21ac1b5cb99 Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Thu, 30 Jul 2026 11:55:34 +0200 Subject: [PATCH 263/322] SONARPY-4425 Update RSPEC before 5.27 release GitOrigin-RevId: 4a54c49ad283d374577989a2b280d03744008e12 --- .../org/sonar/l10n/py/rules/python/S1110.json | 23 ++++---- .../org/sonar/l10n/py/rules/python/S8410.html | 52 +++++++++++-------- .../org/sonar/l10n/py/rules/python/S9073.json | 3 +- sonarpedia.json | 2 +- 4 files changed, 44 insertions(+), 36 deletions(-) diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1110.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1110.json index 3fabb622d..63a37f01a 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1110.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S1110.json @@ -1,24 +1,23 @@ { - "title": "Unnecessary parentheses should be removed", + "title": "Redundant pairs of parentheses should be removed", "type": "CODE_SMELL", + "code": { + "impacts": { + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "CLEAR" + }, "status": "ready", "remediation": { "func": "Constant\/Issue", - "constantCost": "2 min" + "constantCost": "1min" }, "tags": [ - "redundant", - "readability" + "confusing" ], - "defaultSeverity": "Minor", + "defaultSeverity": "Major", "ruleSpecification": "RSPEC-1110", "sqKey": "S1110", "scope": "All", - "quickfix": "covered", - "code": { - "impacts": { - "MAINTAINABILITY": "LOW" - }, - "attribute": "CLEAR" - } + "quickfix": "covered" } diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8410.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8410.html index df74de4a6..e698a6f35 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8410.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8410.html @@ -3,20 +3,19 @@

        Why is this an issue?

        FastAPI originally allowed declaring dependencies by using them as default parameter values. While this approach still works, it has several drawbacks that make code harder to maintain and understand.

        -

        When dependencies are declared as default values, the actual type of the parameter becomes ambiguous. For example, db = -Depends(get_db) doesn’t clearly indicate what type db will be at runtime. This makes the code harder to read and reduces the -effectiveness of IDE autocompletion and type checking tools.

        -

        The modern Annotated syntax separates the type information from the dependency declaration, making both aspects explicit. This -approach provides better clarity about what the parameter actually is, while still specifying how it should be injected.

        +

        Using FastAPI functions such as Depends(), Query(), Path(), and Body() as parameter default +values mixes two different concerns: the parameter’s actual Python default value and FastAPI’s request handling metadata.

        +

        The modern Annotated syntax keeps the type and any real Python default value in their usual places, while still making the +FastAPI-specific behavior explicit.

        Using Annotated consistently across your codebase also aligns with FastAPI’s current recommendations and ensures your code follows modern Python typing conventions introduced in Python 3.9.

        The old syntax mixes concerns by using the default value mechanism for dependency injection, which is semantically confusing since the "default" isn’t really a default value in the traditional sense.

        What is the potential impact?

        -

        Using the deprecated syntax makes code less maintainable in several ways:

        +

        Using this old syntax makes code less maintainable in several ways:

          -
        • Type checkers and IDEs cannot accurately infer the actual runtime type of parameters, reducing the effectiveness of static analysis and - autocompletion
        • +
        • The function’s default value no longer represents the real Python default value of the parameter
        • +
        • If the function is called outside FastAPI, omitted arguments can produce FastAPI metadata objects instead of business values
        • Developers reading the code must mentally separate the dependency injection mechanism from the actual parameter type
        • Mixing old and new syntax across a codebase creates inconsistency that increases cognitive load
        • Future FastAPI versions may deprecate or remove support for the old syntax, requiring migration work
        • @@ -24,34 +23,45 @@

          What is the potential impact?

          How to fix it in FastAPI

          Replace dependency declarations in default values with Annotated type hints. Import Annotated from the typing module (Python 3.9+) or typing_extensions (Python 3.8 and earlier). The first argument to Annotated is -the actual type of the parameter, and the second argument is the dependency injection specification.

          +the actual type of the parameter, and the second argument is the dependency injection specification. If the parameter has a real default value, keep +it as the normal Python default after the annotation.

          Code examples

          Noncompliant code example

          +from dataclasses import dataclass
           from fastapi import Depends, FastAPI
           
           app = FastAPI()
           
          -def get_db():
          -    return "database_connection"
          +@dataclass
          +class User:
          +    username: str
          +
          +def get_current_user() -> User:
          +    return User(username="alice")
           
           @app.get("/items/")
          -def read_items(db = Depends(get_db)):  # Noncompliant
          -    return {"db": db}
          +def read_items(user = Depends(get_current_user)):  # Noncompliant
          +    return {"user": user.username}
           

          Compliant solution

          +from dataclasses import dataclass
           from typing import Annotated
           from fastapi import Depends, FastAPI
           
           app = FastAPI()
           
          -def get_db():
          -    return "database_connection"
          +@dataclass
          +class User:
          +    username: str
          +
          +def get_current_user() -> User:
          +    return User(username="alice")
           
           @app.get("/items/")
          -def read_items(db: Annotated[str, Depends(get_db)]):
          -    return {"db": db}
          +def read_items(user: Annotated[User, Depends(get_current_user)]):
          +    return {"user": user.username}
           

          The same pattern applies to query parameters, path parameters, and request body parameters. Use Annotated to combine the type with the parameter specification.

          @@ -63,7 +73,7 @@

          Noncompliant code example

          @app.get("/search/") def search_items( - q: str = Query(None, max_length=50) # Noncompliant + q: str = Query("latest", max_length=50) # Noncompliant ): return {"query": q}
        @@ -76,7 +86,7 @@

        Compliant solution

        @app.get("/search/") def search_items( - q: Annotated[str | None, Query(max_length=50)] = None + q: Annotated[str, Query(max_length=50)] = "latest" ): return {"query": q}
        @@ -114,8 +124,8 @@

        Documentation

        diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9073.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9073.json index f7968764d..39c697626 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9073.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9073.json @@ -7,8 +7,7 @@ "constantCost": "5min" }, "tags": [ - "pytest", - "tests" + "pytest" ], "defaultSeverity": "Major", "ruleSpecification": "RSPEC-9073", diff --git a/sonarpedia.json b/sonarpedia.json index 487d99191..a5d2016c3 100644 --- a/sonarpedia.json +++ b/sonarpedia.json @@ -3,7 +3,7 @@ "languages": [ "PY" ], - "latest-update": "2026-07-21T07:45:08.136364953Z", + "latest-update": "2026-07-30T09:33:13.877146Z", "options": { "no-language-in-filenames": true, "preserve-filenames": true From 9a9c287409ce46c3066c59a7ef13fe4df78adfdb Mon Sep 17 00:00:00 2001 From: "hashicorp-vault-sonar-prod[bot]" <111297361+hashicorp-vault-sonar-prod[bot]@users.noreply.github.com> Date: Thu, 30 Jul 2026 15:34:19 +0200 Subject: [PATCH 264/322] SONARPY-4466 Prepare for next development iteration Co-authored-by: rombirli <56340680+rombirli@users.noreply.github.com> GitOrigin-RevId: 94388d39f57e9d711533a5dfc57a33c33f9bd757 --- docs/pom.xml | 2 +- docs/python-custom-rules-example/pom.xml | 2 +- its/commons/pom.xml | 2 +- its/plugin/it-python-plugin-test/pom.xml | 2 +- its/plugin/pom.xml | 2 +- its/plugin/python-custom-rules-plugin/pom.xml | 2 +- its/pom.xml | 2 +- pom.xml | 2 +- python-checks-testkit/pom.xml | 2 +- python-checks/pom.xml | 2 +- python-commons/pom.xml | 2 +- python-frontend/pom.xml | 2 +- sonar-python-plugin/pom.xml | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/pom.xml b/docs/pom.xml index 9ef93c252..006ad5f1d 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.python python - 5.27-SNAPSHOT + 5.28-SNAPSHOT docs diff --git a/docs/python-custom-rules-example/pom.xml b/docs/python-custom-rules-example/pom.xml index 4f4eea066..85615adc4 100644 --- a/docs/python-custom-rules-example/pom.xml +++ b/docs/python-custom-rules-example/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python docs - 5.27-SNAPSHOT + 5.28-SNAPSHOT python-custom-rules-example diff --git a/its/commons/pom.xml b/its/commons/pom.xml index d7d424715..35b74f1b0 100644 --- a/its/commons/pom.xml +++ b/its/commons/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python python-its - 5.27-SNAPSHOT + 5.28-SNAPSHOT Python :: ITs :: Commons diff --git a/its/plugin/it-python-plugin-test/pom.xml b/its/plugin/it-python-plugin-test/pom.xml index c049f5070..6ad0f28a7 100644 --- a/its/plugin/it-python-plugin-test/pom.xml +++ b/its/plugin/it-python-plugin-test/pom.xml @@ -7,7 +7,7 @@ it-python-plugin org.sonarsource.python - 5.27-SNAPSHOT + 5.28-SNAPSHOT it-python-plugin-test diff --git a/its/plugin/pom.xml b/its/plugin/pom.xml index 093de1ae6..8b96993ae 100644 --- a/its/plugin/pom.xml +++ b/its/plugin/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.python python-its - 5.27-SNAPSHOT + 5.28-SNAPSHOT diff --git a/its/plugin/python-custom-rules-plugin/pom.xml b/its/plugin/python-custom-rules-plugin/pom.xml index eb61f4ab6..a73879834 100644 --- a/its/plugin/python-custom-rules-plugin/pom.xml +++ b/its/plugin/python-custom-rules-plugin/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python it-python-plugin - 5.27-SNAPSHOT + 5.28-SNAPSHOT python-custom-rules-plugin diff --git a/its/pom.xml b/its/pom.xml index af1c561ba..f46759ac4 100644 --- a/its/pom.xml +++ b/its/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.python python - 5.27-SNAPSHOT + 5.28-SNAPSHOT python-its diff --git a/pom.xml b/pom.xml index ac56c7bfc..b42fa3ecc 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ org.sonarsource.python python - 5.27-SNAPSHOT + 5.28-SNAPSHOT pom Python diff --git a/python-checks-testkit/pom.xml b/python-checks-testkit/pom.xml index 01ff78f68..82081d563 100644 --- a/python-checks-testkit/pom.xml +++ b/python-checks-testkit/pom.xml @@ -6,7 +6,7 @@ python org.sonarsource.python - 5.27-SNAPSHOT + 5.28-SNAPSHOT python-checks-testkit diff --git a/python-checks/pom.xml b/python-checks/pom.xml index af70d769b..043fe7b76 100644 --- a/python-checks/pom.xml +++ b/python-checks/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.python python - 5.27-SNAPSHOT + 5.28-SNAPSHOT python-checks diff --git a/python-commons/pom.xml b/python-commons/pom.xml index 5ad6373b8..d0447948e 100644 --- a/python-commons/pom.xml +++ b/python-commons/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python python - 5.27-SNAPSHOT + 5.28-SNAPSHOT python-commons diff --git a/python-frontend/pom.xml b/python-frontend/pom.xml index c0a9c54b7..104294470 100644 --- a/python-frontend/pom.xml +++ b/python-frontend/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python python - 5.27-SNAPSHOT + 5.28-SNAPSHOT python-frontend diff --git a/sonar-python-plugin/pom.xml b/sonar-python-plugin/pom.xml index 82777ca69..edff9d29f 100644 --- a/sonar-python-plugin/pom.xml +++ b/sonar-python-plugin/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python python - 5.27-SNAPSHOT + 5.28-SNAPSHOT sonar-python-plugin From 743392354bfd64dca275439d3b04382ac95de825 Mon Sep 17 00:00:00 2001 From: Andrea Guarino Date: Thu, 30 Jul 2026 15:55:01 +0200 Subject: [PATCH 265/322] SONARPY-4440 Make 'copyFromPrevious' method synchronized to avoid cache corruption GitOrigin-RevId: 3014b462acdbda8d54eefe7efa9a2e514c1f0344 --- .../java/org/sonar/python/caching/PythonWriteCacheImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python-frontend/src/main/java/org/sonar/python/caching/PythonWriteCacheImpl.java b/python-frontend/src/main/java/org/sonar/python/caching/PythonWriteCacheImpl.java index 2ead1f4e5..5db63e683 100644 --- a/python-frontend/src/main/java/org/sonar/python/caching/PythonWriteCacheImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/caching/PythonWriteCacheImpl.java @@ -33,7 +33,7 @@ public synchronized void write(String key, byte[] data) { } @Override - public void copyFromPrevious(String key) { + public synchronized void copyFromPrevious(String key) { this.writeCache.copyFromPrevious(key); } } From 86f5e3335499cb3b674db84e56adb10714d1ee79 Mon Sep 17 00:00:00 2001 From: Mallow Date: Mon, 3 Aug 2026 13:59:45 +0200 Subject: [PATCH 266/322] SONARPY-4458 Fix bytes literal typing in typeV2 GitOrigin-RevId: ec97a2e5034cee81aea498bc2bbdd16fc0c25d4b --- .../TestClientContentParameterCheck.java | 6 ++-- .../v2/types/TrivialTypeInferenceVisitor.java | 10 +++++-- .../sonar/python/tree/StringLiteralImpl.java | 10 +++++++ .../semantic/v2/TypeInferenceV2Test.java | 29 +++++++++++++++++++ .../sonar/python/types/v2/TypesTestUtils.java | 1 + 5 files changed, 51 insertions(+), 5 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/TestClientContentParameterCheck.java b/python-checks/src/main/java/org/sonar/python/checks/TestClientContentParameterCheck.java index 7ba4954b7..623af28b4 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/TestClientContentParameterCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/TestClientContentParameterCheck.java @@ -43,7 +43,9 @@ public class TestClientContentParameterCheck extends PythonSubscriptionCheck { .map(name -> STARLETTE_TEST_CLIENT_FQN + "." + name) .map(TypeMatchers::isType)); - private static final TypeMatcher IS_STRING = TypeMatchers.isObjectOfType("str"); + private static final TypeMatcher IS_STRING_OR_BYTES = TypeMatchers.any( + TypeMatchers.isObjectOfType("str"), + TypeMatchers.isObjectOfType("bytes")); @Override public CheckScope scope() { @@ -83,6 +85,6 @@ private static boolean isTestClientHttpMethodCall(CallExpression call, Subscript } private static boolean isBytesOrStrLiteral(Expression expr, SubscriptionContext ctx) { - return IS_STRING.isTrueFor(expr, ctx); + return IS_STRING_OR_BYTES.isTrueFor(expr, ctx); } } diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/TrivialTypeInferenceVisitor.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/TrivialTypeInferenceVisitor.java index 5830fefd8..42ca9a648 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/TrivialTypeInferenceVisitor.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/types/TrivialTypeInferenceVisitor.java @@ -199,12 +199,16 @@ public void visitStringLiteral(StringLiteral stringLiteral) { super.visitStringLiteral(stringLiteral); var builtins = this.projectLevelTypeTable.getBuiltinsModule(); // TODO: SONARPY-1867 multiple object types to represent str instance? - if (((StringLiteralImpl) stringLiteral).isTemplate()) { + StringLiteralImpl stringLiteralImpl = (StringLiteralImpl) stringLiteral; + if (stringLiteralImpl.isTemplate()) { // TODO: SONARPY-3427 once provided by typeshed the resolved type should be string.templatelib.Template - ((StringLiteralImpl) stringLiteral).typeV2(ObjectType.fromType(PythonType.UNKNOWN)); + stringLiteralImpl.typeV2(ObjectType.fromType(PythonType.UNKNOWN)); + } else if (stringLiteralImpl.isBytes()) { + PythonType bytesType = builtins.resolveMember("bytes").orElse(PythonType.UNKNOWN); + stringLiteralImpl.typeV2(ObjectType.fromType(bytesType)); } else { PythonType strType = builtins.resolveMember("str").orElse(PythonType.UNKNOWN); - ((StringLiteralImpl) stringLiteral).typeV2(ObjectType.fromType(strType)); + stringLiteralImpl.typeV2(ObjectType.fromType(strType)); } } diff --git a/python-frontend/src/main/java/org/sonar/python/tree/StringLiteralImpl.java b/python-frontend/src/main/java/org/sonar/python/tree/StringLiteralImpl.java index 5cfce22dd..271f3121b 100644 --- a/python-frontend/src/main/java/org/sonar/python/tree/StringLiteralImpl.java +++ b/python-frontend/src/main/java/org/sonar/python/tree/StringLiteralImpl.java @@ -90,4 +90,14 @@ public void typeV2(PythonType type) { public boolean isTemplate() { return !stringElements.isEmpty() && stringElements.stream().anyMatch(StringElement::isTemplate); } + + /** + * @return {@code true} if this literal is a bytes literal (e.g. {@code b'...'}), as opposed to a + * str literal. Implicitly-concatenated adjacent literals (e.g. {@code b'a' b'b'}) can only mix + * bytes with bytes or str with str, so it is enough to check that every element carries a bytes + * prefix. + */ + public boolean isBytes() { + return !stringElements.isEmpty() && stringElements.stream().allMatch(e -> BYTES_PREFIXES.contains(e.prefix())); + } } diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/TypeInferenceV2Test.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/TypeInferenceV2Test.java index 1de4ab15f..a1c5f55d3 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/TypeInferenceV2Test.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/TypeInferenceV2Test.java @@ -98,6 +98,7 @@ import static org.sonar.python.PythonTestUtils.parseWithoutSymbols; import static org.sonar.python.PythonTestUtils.pythonFile; import static org.sonar.python.types.v2.TypesTestUtils.BOOL_TYPE; +import static org.sonar.python.types.v2.TypesTestUtils.BYTES_TYPE; import static org.sonar.python.types.v2.TypesTestUtils.DICT_TYPE; import static org.sonar.python.types.v2.TypesTestUtils.EXCEPTION_TYPE; import static org.sonar.python.types.v2.TypesTestUtils.FLOAT_TYPE; @@ -3634,6 +3635,34 @@ def foo(x): assertThat(cType).isSameAs(PythonType.UNKNOWN); } + @Test + void assignmentBytesLiteral() { + // A bytes literal (b"...") used to be typed as `str`: visitStringLiteral didn't check the + // literal's prefix before resolving it against the builtin `str` type. + var fileInput = inferTypes(""" + def foo(): + a = b"" + b = b"abc" + c = "" + a + b + c + """); + + var statements = TreeUtils.firstChild(fileInput, FunctionDef.class::isInstance) + .map(FunctionDef.class::cast) + .map(FunctionDef::body) + .map(StatementList::statements) + .orElseGet(List::of); + + var aType = ((ExpressionStatement) statements.get(statements.size() - 3)).expressions().get(0).typeV2(); + var bType = ((ExpressionStatement) statements.get(statements.size() - 2)).expressions().get(0).typeV2(); + var cType = ((ExpressionStatement) statements.get(statements.size() - 1)).expressions().get(0).typeV2(); + assertThat(aType.unwrappedType()).isSameAs(BYTES_TYPE); + assertThat(bType.unwrappedType()).isSameAs(BYTES_TYPE); + assertThat(cType.unwrappedType()).isSameAs(STR_TYPE); + } + @Test void assignmentMinusTest() { var fileInput = inferTypes(""" diff --git a/python-frontend/src/test/java/org/sonar/python/types/v2/TypesTestUtils.java b/python-frontend/src/test/java/org/sonar/python/types/v2/TypesTestUtils.java index 6e1275174..468833e2e 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/v2/TypesTestUtils.java +++ b/python-frontend/src/test/java/org/sonar/python/types/v2/TypesTestUtils.java @@ -41,6 +41,7 @@ public class TypesTestUtils { public static final PythonType COMPLEX_TYPE = BUILTINS.resolveMember("complex").get(); public static final PythonType BOOL_TYPE = BUILTINS.resolveMember("bool").get(); public static final PythonType STR_TYPE = BUILTINS.resolveMember("str").get(); + public static final PythonType BYTES_TYPE = BUILTINS.resolveMember("bytes").get(); public static final PythonType LIST_TYPE = BUILTINS.resolveMember("list").get(); public static final PythonType TUPLE_TYPE = BUILTINS.resolveMember("tuple").get(); public static final PythonType SET_TYPE = BUILTINS.resolveMember("set").get(); From 1ea16846c783dd3a80d2ecd1ff1353713d990fd6 Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Tue, 4 Aug 2026 10:12:10 +0200 Subject: [PATCH 267/322] SONARPY-4419 Implement rule S9080 Prefer yield teardown over addfinalizer GitOrigin-RevId: a85791a84e2437a89e15ddf7470e2a760cb25542 --- .../python/checks/OpenSourceCheckList.java | 2 + .../PytestFixtureYieldTeardownCheck.java | 133 ++++++++++++ .../org/sonar/l10n/py/rules/python/S9080.html | 68 ++++++ .../org/sonar/l10n/py/rules/python/S9080.json | 24 +++ .../py/rules/python/Sonar_way_profile.json | 1 + .../PytestFixtureYieldTeardownCheckTest.java | 36 ++++ .../tests/pytestFixtureYieldTeardown.py | 200 ++++++++++++++++++ .../v2/typeshed/TypeShedConstants.java | 1 + .../custom_protobuf/_pytest.fixtures.protobuf | 10 +- .../checksums/custom.checksum | 4 +- .../resources/custom/_pytest/fixtures.pyi | 1 + 11 files changed, 476 insertions(+), 4 deletions(-) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/tests/PytestFixtureYieldTeardownCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9080.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9080.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/tests/PytestFixtureYieldTeardownCheckTest.java create mode 100644 python-checks/src/test/resources/checks/tests/pytestFixtureYieldTeardown.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 2cba6242a..f128a1d88 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -111,6 +111,7 @@ import org.sonar.python.checks.tests.PytestDecoratorParenthesesCheck; import org.sonar.python.checks.tests.PytestFixtureMultipleYieldCheck; import org.sonar.python.checks.tests.PytestFixturePositionalArgsCheck; +import org.sonar.python.checks.tests.PytestFixtureYieldTeardownCheck; import org.sonar.python.checks.tests.PytestModuleImportCheck; import org.sonar.python.checks.tests.PytestPluginsConftestCheck; import org.sonar.python.checks.tests.PytestRaisesContextManagerCheck; @@ -418,6 +419,7 @@ public Stream> getChecks() { PytestDecoratorParenthesesCheck.class, PytestFixtureMultipleYieldCheck.class, PytestFixturePositionalArgsCheck.class, + PytestFixtureYieldTeardownCheck.class, PytestModuleImportCheck.class, PytestPluginsConftestCheck.class, PytestRaisesContextManagerCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/PytestFixtureYieldTeardownCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/PytestFixtureYieldTeardownCheck.java new file mode 100644 index 000000000..b29ebec1f --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/PytestFixtureYieldTeardownCheck.java @@ -0,0 +1,133 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import java.util.ArrayList; +import java.util.List; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.BaseTreeVisitor; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.Decorator; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.FunctionDef; +import org.sonar.plugins.python.api.tree.LambdaExpression; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.tree.YieldExpression; +import org.sonar.plugins.python.api.tree.YieldStatement; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.checks.utils.UnittestUtils; +import org.sonar.python.semantic.v2.typeshed.TypeShedConstants; + +@Rule(key = "S9080") +public class PytestFixtureYieldTeardownCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Replace this \"request.addfinalizer()\" call with a yield-based teardown."; + private static final TypeMatcher PYTEST_FIXTURE_MATCHER = TypeMatchers.withFQN(UnittestUtils.PYTEST_FIXTURE_DECORATOR_FQN); + private static final TypeMatcher ADD_FINALIZER_MATCHER = TypeMatchers.isType(TypeShedConstants.PYTEST_FIXTURE_REQUEST_ADD_FINALIZER_FQN); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.FUNCDEF, PytestFixtureYieldTeardownCheck::checkFunctionDef); + } + + @Override + public CheckScope scope() { + return CheckScope.ALL; + } + + private static void checkFunctionDef(SubscriptionContext ctx) { + FunctionDef functionDef = (FunctionDef) ctx.syntaxNode(); + if (!isPytestFixture(functionDef, ctx)) { + return; + } + + var visitor = new FinalizerVisitor(ctx); + functionDef.body().accept(visitor); + if (visitor.hasYieldWithValue) { + return; + } + visitor.finalizerCallees.forEach(callee -> ctx.addIssue(callee, MESSAGE)); + } + + private static boolean isPytestFixture(FunctionDef functionDef, SubscriptionContext ctx) { + return functionDef.decorators().stream() + .anyMatch(decorator -> PYTEST_FIXTURE_MATCHER.isTrueFor(decoratorFunctionExpression(decorator), ctx)); + } + + private static Expression decoratorFunctionExpression(Decorator decorator) { + Expression expression = decorator.expression(); + if (expression instanceof CallExpression callExpression) { + return callExpression.callee(); + } + return expression; + } + + /** + * Collects the {@code request.addfinalizer} calls registered by the fixture itself. Nested functions and lambdas are not + * visited: registering a finalizer there is the factory-as-fixture pattern, which cannot be expressed with a yield. + */ + private static class FinalizerVisitor extends BaseTreeVisitor { + + private final SubscriptionContext ctx; + private final List finalizerCallees = new ArrayList<>(); + private boolean hasYieldWithValue = false; + + FinalizerVisitor(SubscriptionContext ctx) { + this.ctx = ctx; + } + + @Override + public void visitCallExpression(CallExpression callExpression) { + Expression callee = callExpression.callee(); + if (ADD_FINALIZER_MATCHER.isTrueFor(callee, ctx)) { + finalizerCallees.add(callee); + } + super.visitCallExpression(callExpression); + } + + @Override + public void visitYieldStatement(YieldStatement yieldStatement) { + if (yieldsValue(yieldStatement.yieldExpression())) { + hasYieldWithValue = true; + } + } + + @Override + public void visitYieldExpression(YieldExpression yieldExpression) { + if (yieldsValue(yieldExpression)) { + hasYieldWithValue = true; + } + } + + private static boolean yieldsValue(YieldExpression yieldExpression) { + return !yieldExpression.expressions().isEmpty(); + } + + @Override + public void visitFunctionDef(FunctionDef functionDef) { + // nested functions belong to the factory-as-fixture pattern + } + + @Override + public void visitLambda(LambdaExpression lambdaExpression) { + // see visitFunctionDef + } + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9080.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9080.html new file mode 100644 index 000000000..ec8a38e8e --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9080.html @@ -0,0 +1,68 @@ +

        This rule raises an issue when a @pytest.fixture uses request.addfinalizer(…​) for teardown instead of a yield +fixture.

        +

        In Python, this refers to fixtures that call request.addfinalizer(…​) and return a resource instead of yielding it and running +teardown after the yield.

        +

        Why is this an issue?

        +

        Pytest fixtures can clean up either with a sequential yield (setup before yield, teardown after) or with callback-based +request.addfinalizer(…​). The sequential style is clearer for ordinary fixtures: setup, provide the value, then tear down in one linear +flow.

        +

        Registering teardown with request.addfinalizer while returning the resource scatters setup and cleanup:

        +
        +@pytest.fixture
        +def with_finalizer(request):
        +    resource = open_resource()
        +    request.addfinalizer(resource.close)
        +    return resource
        +
        +

        Prefer yielding the resource and running cleanup after the test:

        +
        +@pytest.fixture
        +def with_finalizer():
        +    resource = open_resource()
        +    yield resource
        +    resource.close()
        +
        +

        request.addfinalizer remains appropriate for the factory-as-fixture pattern, where teardown must be registered inside a nested factory +that creates resources on demand.

        +

        What is the potential impact?

        +

        addfinalizer-based teardown is harder to follow than a linear yield fixture, which slows reviews and increases the chance of +mismatched setup and cleanup.

        +

        How to fix it

        +

        Replace request.addfinalizer teardown with a yield fixture: yield the resource, then run cleanup after the test.

        +

        Code examples

        +

        Noncompliant code example

        +
        +import pytest
        +
        +@pytest.fixture
        +def with_finalizer(request):
        +    resource = open_resource()
        +    request.addfinalizer(resource.close)  # Noncompliant
        +    return resource
        +
        +

        Compliant solution

        +
        +import pytest
        +
        +@pytest.fixture
        +def with_finalizer():
        +    resource = open_resource()
        +    yield resource
        +    resource.close()
        +
        +

        Resources

        +

        Documentation

        + +

        Related rules

        +
          +
        • {rule:python:S8994} - Fixtures should not contain more than one yield
        • +
        • {rule:python:S9100} - Pytest fixtures without teardown should use return instead of yield
        • +
        + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9080.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9080.json new file mode 100644 index 000000000..26bf2850f --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9080.json @@ -0,0 +1,24 @@ +{ + "title": "Pytest fixtures should use yield for teardown", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "pytest", + "tests" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-9080", + "sqKey": "S9080", + "scope": "Tests", + "code": { + "impacts": { + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "CONVENTIONAL" + }, + "quickfix": "unknown" +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 8a14b7b72..0b7eb6c89 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -387,6 +387,7 @@ "S9076", "S9077", "S9078", + "S9080", "S9083", "S9084", "S9116" diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/PytestFixtureYieldTeardownCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/PytestFixtureYieldTeardownCheckTest.java new file mode 100644 index 000000000..053755fdf --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/PytestFixtureYieldTeardownCheckTest.java @@ -0,0 +1,36 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import org.junit.jupiter.api.Test; +import org.sonar.plugins.python.api.PythonCheck; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +import static org.assertj.core.api.Assertions.assertThat; + +class PytestFixtureYieldTeardownCheckTest { + + @Test + void scope() { + assertThat(new PytestFixtureYieldTeardownCheck().scope()).isEqualTo(PythonCheck.CheckScope.ALL); + } + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/pytestFixtureYieldTeardown.py", new PytestFixtureYieldTeardownCheck()); + } +} diff --git a/python-checks/src/test/resources/checks/tests/pytestFixtureYieldTeardown.py b/python-checks/src/test/resources/checks/tests/pytestFixtureYieldTeardown.py new file mode 100644 index 000000000..d92a4991e --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/pytestFixtureYieldTeardown.py @@ -0,0 +1,200 @@ +import pytest + + +@pytest.fixture +def with_finalizer(request): + resource = open_resource() + request.addfinalizer(resource.close) # Noncompliant {{Replace this "request.addfinalizer()" call with a yield-based teardown.}} +# ^^^^^^^^^^^^^^^^^^^^ + return resource + + +@pytest.fixture(scope="module") +def with_finalizer_and_scope(request): + resource = open_resource() + request.addfinalizer(resource.close) # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^ + return resource + + +@pytest.fixture +def finalizer_without_return(request): + setup() + request.addfinalizer(teardown) # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^ + + +@pytest.fixture +def several_finalizers(request): + # Multi-resource staged addfinalizer is a legitimate pytest pattern for partial-failure + # safety (cleanup already registered if a later connect raises). Still reported to stay + # aligned with Ruff PT021; suppress intentionally when that tradeoff is deliberate. + first = open_resource() + second = open_resource() + request.addfinalizer(first.close) # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^ + request.addfinalizer(second.close) # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^ + return first, second + + +@pytest.fixture +def finalizer_in_nested_block(request, flag): + resource = open_resource() + if flag: + request.addfinalizer(resource.close) # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^ + return resource + + +@pytest.fixture +def finalizer_with_lambda(request): + resource = open_resource() + request.addfinalizer(lambda: resource.close()) # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^ + return resource + + +@pytest.fixture +def bare_yield_with_finalizer(request): + resource = open_resource() + request.addfinalizer(resource.close) # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^ + yield + + +@pytest.fixture +def yield_teardown(): + resource = open_resource() + yield resource + resource.close() + + +@pytest.fixture +def yield_and_finalizer(request): + resource = open_resource() + request.addfinalizer(resource.close) + yield resource + + +@pytest.fixture +def factory_as_fixture(request): + created = [] + + def make_resource(name): + resource = open_resource(name) + request.addfinalizer(resource.close) + created.append(resource) + return resource + + return make_resource + + +@pytest.fixture +def factory_as_lambda(request): + return lambda name: request.addfinalizer(open_resource(name).close) + + +@pytest.fixture +def no_teardown_at_all(): + return open_resource() + + +def test_something(request): + resource = open_resource() + request.addfinalizer(resource.close) + assert resource is not None + + +def helper_registering_finalizer(request): + request.addfinalizer(cleanup) + + +@pytest.fixture +def finalizer_on_other_object(monkeypatch): + monkeypatch.addfinalizer(cleanup) + return monkeypatch + + +@pytest.fixture +def other_request_method(request): + return request.getfixturevalue("with_finalizer") + + +class TestResources: + + @pytest.fixture + def fixture_in_class(self, request): + resource = open_resource() + request.addfinalizer(resource.close) # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^ + return resource + + @pytest.fixture + def yielding_fixture_in_class(self): + resource = open_resource() + yield resource + resource.close() + + +from pytest import fixture as aliased_fixture + + +@aliased_fixture +def fixture_with_aliased_decorator(request): + resource = open_resource() + request.addfinalizer(resource.close) # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^ + return resource + + +def not_a_fixture_but_named_request(request): + request.addfinalizer(cleanup) + + +@some_other_decorator +def decorated_but_not_fixture(request): + request.addfinalizer(cleanup) + + +# Accepted FNs below — documented limitations, not expected to raise. + +@pytest.fixture +def finalizer_in_local_helper(request): + # FN: nested function skipped to avoid flagging factory-as-fixture; eager helpers are missed too. + def register(res): + request.addfinalizer(res.close) + resource = open_resource() + register(resource) + return resource + + +def _register_cleanup(request, resource): + request.addfinalizer(resource.close) + + +@pytest.fixture +def finalizer_via_shared_helper(request): + # FN: addfinalizer call lives outside the fixture body. + resource = open_resource() + _register_cleanup(request, resource) + return resource + + +@pytest.fixture +def finalizer_via_request_node(request): + # FN: request.node.addfinalizer is a rare non-idiomatic spelling of the same API. + resource = open_resource() + request.node.addfinalizer(resource.close) + return resource + + +import pytest_asyncio + + +@pytest_asyncio.fixture +async def finalizer_in_async_fixture(request): + # FN: only pytest.fixture is recognized, not pytest_asyncio.fixture. + resource = await open_resource() + request.addfinalizer(resource.close) + return resource diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/TypeShedConstants.java b/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/TypeShedConstants.java index 7608a7eba..087703ff0 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/TypeShedConstants.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/v2/typeshed/TypeShedConstants.java @@ -25,6 +25,7 @@ public class TypeShedConstants { public static final String BUILTINS_DICT_FQN = BUILTINS_PREFIX + "dict"; public static final String PYTEST_FIXTURE_REQUEST_FQN = "_pytest.fixtures.FixtureRequest"; public static final String PYTEST_FIXTURE_REQUEST_GET_FIXTURE_VALUE_FQN = PYTEST_FIXTURE_REQUEST_FQN + ".getfixturevalue"; + public static final String PYTEST_FIXTURE_REQUEST_ADD_FINALIZER_FQN = PYTEST_FIXTURE_REQUEST_FQN + ".addfinalizer"; private TypeShedConstants() { } diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/_pytest.fixtures.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/_pytest.fixtures.protobuf index 126f31b6e..179dfd9c1 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/_pytest.fixtures.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/_pytest.fixtures.protobuf @@ -1,12 +1,18 @@ -_pytest.fixtures +_pytest.fixtures FixtureRequest_pytest.fixtures.FixtureRequest"*SonarPythonAnalyzerFakeStub.CustomStubBase* getfixturevalue/_pytest.fixtures.FixtureRequest.getfixturevalue"" builtins.object"builtins.object*L selfB _pytest.fixtures.FixtureRequest"_pytest.fixtures.FixtureRequest*) argname - builtins.str" builtins.str* + builtins.str" builtins.str* + addfinalizer,_pytest.fixtures.FixtureRequest.addfinalizer" +None*L +selfB +_pytest.fixtures.FixtureRequest"_pytest.fixtures.FixtureRequest*1 + finalizer" +builtins.object"builtins.object* __annotations__ _pytest.fixtures.__annotations__W builtins.dict[builtins.str,Any] builtins.str" builtins.str diff --git a/python-frontend/typeshed_serializer/checksums/custom.checksum b/python-frontend/typeshed_serializer/checksums/custom.checksum index 36a307a12..4136b8806 100644 --- a/python-frontend/typeshed_serializer/checksums/custom.checksum +++ b/python-frontend/typeshed_serializer/checksums/custom.checksum @@ -1,2 +1,2 @@ -5bad68d78470e89ef27a382998f42c49ad8c4b7cee20c9f643f50e1934cf28ae -19f5ef8341087132db6c9a30db685d9735b530af55f7978919dd7c4aa4d6113a \ No newline at end of file +bc0d06bd07460627ce055d86cfb2925426c046d7f11ca5b1360926859fcbe907 +b5be931e3d9b0f7553af70e8c3750e988fd285ce3bb83fd036839eb8170c4b5a \ No newline at end of file diff --git a/python-frontend/typeshed_serializer/resources/custom/_pytest/fixtures.pyi b/python-frontend/typeshed_serializer/resources/custom/_pytest/fixtures.pyi index 9ee628976..f3d859808 100644 --- a/python-frontend/typeshed_serializer/resources/custom/_pytest/fixtures.pyi +++ b/python-frontend/typeshed_serializer/resources/custom/_pytest/fixtures.pyi @@ -2,3 +2,4 @@ from SonarPythonAnalyzerFakeStub import CustomStubBase class FixtureRequest(CustomStubBase): def getfixturevalue(self, argname: str) -> object: ... + def addfinalizer(self, finalizer: object) -> None: ... From 2af8487f0f5564990939fdc655046f487dc464a6 Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Tue, 4 Aug 2026 14:06:18 +0200 Subject: [PATCH 268/322] SONARPY-4435: Implement rule S9117 Pytest fixtures should not declare default scope GitOrigin-RevId: 49fc2393a645e474d1187a9cdca521c2a12b7fdb --- .../python/checks/OpenSourceCheckList.java | 2 + .../tests/PytestDefaultFixtureScopeCheck.java | 145 +++++++++++++ .../org/sonar/l10n/py/rules/python/S9117.html | 37 ++++ .../org/sonar/l10n/py/rules/python/S9117.json | 24 +++ .../py/rules/python/Sonar_way_profile.json | 3 +- .../PytestDefaultFixtureScopeCheckTest.java | 197 ++++++++++++++++++ .../checks/tests/pytestDefaultFixtureScope.py | 99 +++++++++ 7 files changed, 506 insertions(+), 1 deletion(-) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/tests/PytestDefaultFixtureScopeCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9117.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9117.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/tests/PytestDefaultFixtureScopeCheckTest.java create mode 100644 python-checks/src/test/resources/checks/tests/pytestDefaultFixtureScope.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index f128a1d88..740b9d49a 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -109,6 +109,7 @@ import org.sonar.python.checks.tests.NotDiscoverableTestMethodCheck; import org.sonar.python.checks.tests.PytestAutouseParametrizedFixtureCheck; import org.sonar.python.checks.tests.PytestDecoratorParenthesesCheck; +import org.sonar.python.checks.tests.PytestDefaultFixtureScopeCheck; import org.sonar.python.checks.tests.PytestFixtureMultipleYieldCheck; import org.sonar.python.checks.tests.PytestFixturePositionalArgsCheck; import org.sonar.python.checks.tests.PytestFixtureYieldTeardownCheck; @@ -417,6 +418,7 @@ public Stream> getChecks() { PydanticSkipValidationWithConstraintsCheck.class, PytestAutouseParametrizedFixtureCheck.class, PytestDecoratorParenthesesCheck.class, + PytestDefaultFixtureScopeCheck.class, PytestFixtureMultipleYieldCheck.class, PytestFixturePositionalArgsCheck.class, PytestFixtureYieldTeardownCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/PytestDefaultFixtureScopeCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/PytestDefaultFixtureScopeCheck.java new file mode 100644 index 000000000..c71b5753c --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/PytestDefaultFixtureScopeCheck.java @@ -0,0 +1,145 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import java.util.List; +import java.util.Optional; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.quickfix.PythonQuickFix; +import org.sonar.plugins.python.api.tree.Argument; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.Decorator; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.StringLiteral; +import org.sonar.plugins.python.api.tree.Token; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.quickfix.TextEditUtils; +import org.sonar.python.tree.TreeUtils; + +@Rule(key = "S9117") +public class PytestDefaultFixtureScopeCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Remove this redundant scope=\"function\" argument."; + private static final String QUICK_FIX_MESSAGE = "Remove scope=\"function\""; + private static final String SCOPE_ARGUMENT = "scope"; + private static final String FUNCTION_SCOPE = "function"; + + private static final TypeMatcher PYTEST_FIXTURE_MATCHER = TypeMatchers.isType("pytest.fixture"); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.DECORATOR, PytestDefaultFixtureScopeCheck::checkDecorator); + } + + private static void checkDecorator(SubscriptionContext ctx) { + Decorator decorator = (Decorator) ctx.syntaxNode(); + if (!(decorator.expression() instanceof CallExpression callExpression)) { + return; + } + if (!PYTEST_FIXTURE_MATCHER.isTrueFor(callExpression.callee(), ctx)) { + return; + } + + RegularArgument scopeArgument = TreeUtils.argumentByKeyword(SCOPE_ARGUMENT, callExpression.arguments()); + if (scopeArgument == null || !isFunctionScope(scopeArgument.expression())) { + return; + } + + var issue = ctx.addIssue(scopeArgument, MESSAGE); + createQuickFix(callExpression, scopeArgument).ifPresent(issue::addQuickFix); + } + + private static boolean isFunctionScope(Expression expression) { + return expression instanceof StringLiteral stringLiteral + && FUNCTION_SCOPE.equals(stringLiteral.trimmedQuotesValue()); + } + + private static Optional createQuickFix(CallExpression callExpression, RegularArgument scopeArgument) { + List arguments = callExpression.arguments(); + int argIndex = arguments.indexOf(scopeArgument); + if (argIndex == -1 || callExpression.argumentList() == null) { + return Optional.empty(); + } + + if (arguments.size() == 1) { + Token calleeEnd = callExpression.callee().lastToken(); + Token rightPar = callExpression.rightPar(); + return Optional.of(PythonQuickFix.newQuickFix(QUICK_FIX_MESSAGE) + .addTextEdit(TextEditUtils.removeRange( + calleeEnd.pythonLine(), + endColumn(calleeEnd), + rightPar.pythonLine(), + endColumn(rightPar))) + .build()); + } + + List children = callExpression.argumentList().children(); + int childIndex = children.indexOf(scopeArgument); + if (childIndex < 0) { + return Optional.empty(); + } + + if (argIndex == 0) { + // First argument: remove through the following comma. Prefer token-based removal when the + // next argument is on the same line, or when scope shares its line with '(' (so we do not + // delete the decorator). When scope is alone on its line, drop that whole line to keep the + // next argument's indentation. + Argument nextArg = arguments.get(1); + Token scopeToken = scopeArgument.firstToken(); + Token nextToken = nextArg.firstToken(); + if (scopeToken.line() == nextToken.line() || callExpression.leftPar().line() == scopeToken.line()) { + return Optional.of(PythonQuickFix.newQuickFix(QUICK_FIX_MESSAGE) + .addTextEdit(TextEditUtils.removeUntil(scopeArgument, nextArg)) + .build()); + } + return Optional.of(PythonQuickFix.newQuickFix(QUICK_FIX_MESSAGE) + .addTextEdit(TextEditUtils.removeRange( + scopeToken.pythonLine(), + 0, + nextToken.pythonLine(), + 0)) + .build()); + } + + // Not first: remove the preceding comma and this argument (keep any following comma / next-arg indent) + Tree removeFrom = children.get(childIndex - 1); + if (argIndex == arguments.size() - 1) { + return Optional.of(PythonQuickFix.newQuickFix(QUICK_FIX_MESSAGE) + .addTextEdit(TextEditUtils.removeUntil(removeFrom, callExpression.rightPar())) + .build()); + } + + Tree removeTo = children.get(childIndex + 1); + return Optional.of(PythonQuickFix.newQuickFix(QUICK_FIX_MESSAGE) + .addTextEdit(TextEditUtils.removeUntil(removeFrom, removeTo)) + .build()); + } + + private static int endColumn(Token token) { + return token.pythonColumn() + token.value().length(); + } + + @Override + public CheckScope scope() { + return CheckScope.ALL; + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9117.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9117.html new file mode 100644 index 000000000..baeeded85 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9117.html @@ -0,0 +1,37 @@ +

        This rule raises an issue when @pytest.fixture explicitly sets scope="function", which is already the default.

        +

        In Python, this refers to @pytest.fixture(scope="function"), which restates the default scope.

        +

        Why is this an issue?

        +

        The default fixture scope is "function". Writing scope="function" explicitly does not change behavior and adds clutter. +Drop the argument and use @pytest.fixture alone unless you need a non-default value such as "class", "module", +"package", or "session":

        +
        +import pytest
        +
        +@pytest.fixture(scope="function")  # Noncompliant
        +def default_scope():
        +    return {}
        +
        +
        +import pytest
        +
        +@pytest.fixture
        +def default_scope():
        +    return {}
        +
        +

        What is the potential impact?

        +

        Redundant scope="function" distracts readers without changing fixture lifetime, which slows review of real scoping choices.

        +

        Resources

        +

        Documentation

        + +

        Related rules

        +
          +
        • {rule:python:S9076} - Deprecated pytest.yield_fixture should be replaced with pytest.fixture
        • +
        • {rule:python:S9116} - Pytest fixture options should be passed as keyword arguments
        • +
        + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9117.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9117.json new file mode 100644 index 000000000..cdd984aa2 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9117.json @@ -0,0 +1,24 @@ +{ + "title": "Pytest fixtures should not declare the default scope\u003d\"function\"", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "2min" + }, + "tags": [ + "pytest", + "tests" + ], + "defaultSeverity": "Minor", + "ruleSpecification": "RSPEC-9117", + "sqKey": "S9117", + "scope": "Tests", + "quickfix": "targeted", + "code": { + "impacts": { + "MAINTAINABILITY": "LOW" + }, + "attribute": "CONVENTIONAL" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 0b7eb6c89..bcff46ffc 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -390,6 +390,7 @@ "S9080", "S9083", "S9084", - "S9116" + "S9116", + "S9117" ] } diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/PytestDefaultFixtureScopeCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/PytestDefaultFixtureScopeCheckTest.java new file mode 100644 index 000000000..16b9c0217 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/PytestDefaultFixtureScopeCheckTest.java @@ -0,0 +1,197 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import java.util.stream.Stream; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.sonar.plugins.python.api.PythonCheck; +import org.sonar.python.checks.quickfix.PythonQuickFixVerifier; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +import static org.assertj.core.api.Assertions.assertThat; + +class PytestDefaultFixtureScopeCheckTest { + + private static final String FILE_NAME = "test_pytest_default_fixture_scope.py"; + private static final PytestDefaultFixtureScopeCheck CHECK = new PytestDefaultFixtureScopeCheck(); + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/pytestDefaultFixtureScope.py", CHECK); + } + + @Test + void test_scope() { + assertThat(CHECK.scope()).isEqualTo(PythonCheck.CheckScope.ALL); + } + + @Test + void quick_fix_message() { + String before = """ + import pytest + + @pytest.fixture(scope="function") + def sample(): + return 1 + """; + PythonQuickFixVerifier.verifySemanticQuickFixMessages(CHECK, FILE_NAME, before, "Remove scope=\"function\""); + } + + @ParameterizedTest + @MethodSource("quickFixCases") + void quick_fix(String before, String after) { + PythonQuickFixVerifier.verifySemantic(CHECK, FILE_NAME, before, after); + } + + static Stream quickFixCases() { + return Stream.of( + Arguments.of(""" + import pytest + + @pytest.fixture(scope="function") + def sample(): + return 1 + """, """ + import pytest + + @pytest.fixture + def sample(): + return 1 + """), + Arguments.of(""" + import pytest + + @pytest.fixture(scope="function", autouse=True) + def sample(): + return 1 + """, """ + import pytest + + @pytest.fixture(autouse=True) + def sample(): + return 1 + """), + Arguments.of(""" + import pytest + + @pytest.fixture(autouse=True, scope="function") + def sample(): + return 1 + """, """ + import pytest + + @pytest.fixture(autouse=True) + def sample(): + return 1 + """), + Arguments.of(""" + import pytest + + @pytest.fixture(name="renamed", scope="function", autouse=True) + def sample(): + return 1 + """, """ + import pytest + + @pytest.fixture(name="renamed", autouse=True) + def sample(): + return 1 + """), + Arguments.of(""" + import pytest + + @pytest.fixture(autouse=True, scope="function",) + def sample(): + return 1 + """, """ + import pytest + + @pytest.fixture(autouse=True) + def sample(): + return 1 + """), + Arguments.of(""" + import pytest + + @pytest.fixture( + name="renamed", + scope="function", + autouse=True) + def sample(): + return 1 + """, """ + import pytest + + @pytest.fixture( + name="renamed", + autouse=True) + def sample(): + return 1 + """), + Arguments.of(""" + import pytest + + @pytest.fixture( + scope="function", + autouse=True) + def sample(): + return 1 + """, """ + import pytest + + @pytest.fixture( + autouse=True) + def sample(): + return 1 + """), + Arguments.of(""" + import pytest + + @pytest.fixture( + name="renamed", + scope="function") + def sample(): + return 1 + """, """ + import pytest + + @pytest.fixture( + name="renamed") + def sample(): + return 1 + """), + Arguments.of(""" + import pytest + + @pytest.fixture(scope="function", + autouse=True) + def sample(): + return 1 + """, """ + import pytest + + @pytest.fixture(autouse=True) + def sample(): + return 1 + """) + ); + } + +} diff --git a/python-checks/src/test/resources/checks/tests/pytestDefaultFixtureScope.py b/python-checks/src/test/resources/checks/tests/pytestDefaultFixtureScope.py new file mode 100644 index 000000000..0b4d57019 --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/pytestDefaultFixtureScope.py @@ -0,0 +1,99 @@ +import pytest +from pytest import fixture + + +@pytest.fixture(scope="function") # Noncompliant {{Remove this redundant scope="function" argument.}} +# ^^^^^^^^^^^^^^^^ +def noncompliant_default_scope(): + return {} + + +@pytest.fixture(scope='function') # Noncompliant +# ^^^^^^^^^^^^^^^^ +def noncompliant_single_quotes(): + return {} + + +@pytest.fixture(scope="function", autouse=True) # Noncompliant +# ^^^^^^^^^^^^^^^^ +def noncompliant_with_other_args(): + return {} + + +@pytest.fixture(autouse=True, scope="function") # Noncompliant +# ^^^^^^^^^^^^^^^^ +def noncompliant_scope_last(): + return {} + + +@fixture(scope="function") # Noncompliant +# ^^^^^^^^^^^^^^^^ +def noncompliant_imported_fixture(): + return {} + + +class TestSomething: + @pytest.fixture(scope="function") # Noncompliant + # ^^^^^^^^^^^^^^^^ + def noncompliant_class_fixture(self): + return {} + + +@pytest.fixture( + scope="function", # Noncompliant +# ^^^^^^^^^^^^^^^^ +) +def noncompliant_multiline(): + return {} + + +@pytest.fixture +def compliant_no_args(): + return {} + + +@pytest.fixture() +def compliant_empty_parens(): + return {} + + +@pytest.fixture(scope="module") +def compliant_module_scope(): + return {} + + +@pytest.fixture(scope="class") +def compliant_class_scope(): + return {} + + +@pytest.fixture(scope="session") +def compliant_session_scope(): + return {} + + +@pytest.fixture(scope="package") +def compliant_package_scope(): + return {} + + +@pytest.fixture(autouse=True) +def compliant_autouse_only(): + return {} + + +@pytest.fixture(name="renamed") +def compliant_other_options(): + return {} + + +SCOPE = "function" + + +@pytest.fixture(scope=SCOPE) +def compliant_scope_from_variable(): + return {} + + +def not_a_fixture(scope="function"): + return scope From 3e0ef7cd4d7ae0d7878e28d797a9626250fd2529 Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Tue, 4 Aug 2026 15:24:17 +0200 Subject: [PATCH 269/322] SONARPY-4460 Raise S3415 only when assertion conventions mix GitOrigin-RevId: fd701064d1bf9d1395805495e2eb0773e3f44e75 --- .../checks/utils/PythonCheckVerifier.java | 7 + .../tests/AssertionArgumentOrderCheck.java | 216 ++++++++-------- .../AssertionArgumentOrderCheckTest.java | 231 ++++++++++++------ .../tests/test_assertionArgumentOrder.py | 56 +++-- .../test_assertionArgumentOrderAssertpy.py | 23 ++ ...test_assertionArgumentOrderExpectedLeft.py | 38 +-- .../test_assertionArgumentOrderPytest.py | 34 +++ .../plugins/python/IssuesRepository.java | 41 +++- .../plugins/python/IssuesRepositoryTest.java | 167 +++++++++++++ .../plugins/python/MockSonarLintIssue.java | 18 +- .../sonar/plugins/python/api/PythonCheck.java | 16 ++ .../org/sonar/python/PythonCheckTest.java | 21 ++ 12 files changed, 630 insertions(+), 238 deletions(-) create mode 100644 python-checks/src/test/resources/checks/tests/test_assertionArgumentOrderAssertpy.py create mode 100644 python-checks/src/test/resources/checks/tests/test_assertionArgumentOrderPytest.py create mode 100644 python-commons/src/test/java/org/sonar/plugins/python/IssuesRepositoryTest.java diff --git a/python-checks-testkit/src/main/java/org/sonar/python/checks/utils/PythonCheckVerifier.java b/python-checks-testkit/src/main/java/org/sonar/python/checks/utils/PythonCheckVerifier.java index 4fa4ca5b6..ee1ba29e6 100644 --- a/python-checks-testkit/src/main/java/org/sonar/python/checks/utils/PythonCheckVerifier.java +++ b/python-checks-testkit/src/main/java/org/sonar/python/checks/utils/PythonCheckVerifier.java @@ -148,6 +148,13 @@ private static MultiFileVerifier.Issue addPreciseIssue(Path path, MultiFileVerif issueBuilder.addSecondary(path, secondary.startLine(), secondary.startLineOffset() + 1, secondary.endLine(), secondary.endLineOffset(), secondary.message()); } + // Commons verifier has no named-flow API; flatten flow locations as secondaries for sample assertions. + for (PythonCheck.IssueFlow flow : preciseIssue.flows()) { + for (IssueLocation flowLocation : flow.locations()) { + issueBuilder.addSecondary(path, flowLocation.startLine(), flowLocation.startLineOffset() + 1, + flowLocation.endLine(), flowLocation.endLineOffset(), flowLocation.message()); + } + } return issueBuilder; } diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/AssertionArgumentOrderCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/AssertionArgumentOrderCheck.java index 8528d85bf..5d7983970 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/AssertionArgumentOrderCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/AssertionArgumentOrderCheck.java @@ -16,20 +16,25 @@ */ package org.sonar.python.checks.tests; +import java.util.ArrayList; +import java.util.List; import java.util.Optional; import javax.annotation.Nullable; import org.sonar.check.Rule; -import org.sonar.check.RuleProperty; +import org.sonar.plugins.python.api.IssueLocation; +import org.sonar.plugins.python.api.PythonCheck; import org.sonar.plugins.python.api.PythonSubscriptionCheck; import org.sonar.plugins.python.api.SubscriptionContext; import org.sonar.plugins.python.api.TokenLocation; import org.sonar.plugins.python.api.quickfix.PythonQuickFix; +import org.sonar.plugins.python.api.quickfix.PythonTextEdit; import org.sonar.plugins.python.api.tree.AssertStatement; import org.sonar.plugins.python.api.tree.BinaryExpression; import org.sonar.plugins.python.api.tree.CallExpression; import org.sonar.plugins.python.api.tree.Expression; import org.sonar.plugins.python.api.tree.Name; import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.Tree; import org.sonar.python.checks.utils.CheckUtils; import org.sonar.python.checks.utils.Expressions; import org.sonar.python.checks.utils.UnittestUtils; @@ -43,50 +48,72 @@ @Rule(key = "S3415") public class AssertionArgumentOrderCheck extends PythonSubscriptionCheck { - private static final boolean DEFAULT_EXPECTED_ON_RIGHT = true; - private static final String UNITTEST_MESSAGE = "Swap these 2 arguments so they are in the correct order: actual value, expected value."; - private static final String PYTEST_EXPECTED_ON_RIGHT_MESSAGE = "Swap these 2 sides so they are in the correct order: actual value, expected value."; - private static final String PYTEST_EXPECTED_ON_LEFT_MESSAGE = "Swap these 2 sides so they are in the correct order: expected value, actual value."; - private static final String ASSERTPY_MESSAGE = "Pass the actual value to \"assert_that\" and the expected value to \"is_equal_to\"."; - private static final String EXPECTED_SECONDARY_MESSAGE = "Expected value."; - private static final String ACTUAL_SECONDARY_MESSAGE = "Actual value."; - private static final String UNITTEST_QUICK_FIX_MESSAGE = "Swap the actual and expected arguments"; - private static final String PYTEST_QUICK_FIX_MESSAGE = "Swap the actual and expected operands"; - private static final String ASSERTPY_QUICK_FIX_MESSAGE = "Swap the actual and expected values"; + private static final String MESSAGE = "Unify assertion argument order in this file; both \"actual first\" and \"expected first\" conventions are used."; + private static final String ACTUAL_FIRST_FLOW = "Actual value first"; + private static final String EXPECTED_FIRST_FLOW = "Expected value first"; + private static final String ACTUAL_FIRST_LOCATION_MESSAGE = "Actual value first."; + private static final String EXPECTED_FIRST_LOCATION_MESSAGE = "Expected value first."; + private static final String PUT_EXPECTED_SECOND_QF = "Put all expected values second"; + private static final String PUT_ACTUAL_SECOND_QF = "Put all actual values second"; private static final String PYTEST_APPROX_EXPECTED_ARGUMENT_NAME = "expected"; - @RuleProperty( - key = "expectedOnRight", - description = "Whether the expected value should be on the right-hand side of pytest equality assertions.", - defaultValue = "" + DEFAULT_EXPECTED_ON_RIGHT) - public boolean expectedOnRight = DEFAULT_EXPECTED_ON_RIGHT; + private enum Convention { + ACTUAL_FIRST, + EXPECTED_FIRST + } + + private final List assertions = new ArrayList<>(); + private SubscriptionContext subscriptionContext; + + private record OrderableAssertion( + Tree primaryLocation, + Convention convention, + List swapEdits) { + } @Override public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.FILE_INPUT, ctx -> { + assertions.clear(); + subscriptionContext = ctx; + }); UnittestUtils.registerAssertionSyntaxNodeConsumers(context, new AssertionFrameworkHandlers( - AssertionArgumentOrderCheck::checkUnittestAssertion, - AssertionArgumentOrderCheck::checkAssertpyAssertion, + this::checkUnittestAssertion, + this::checkAssertpyAssertion, this::checkPytestAssertion)); } + @Override + public void leaveFile() { + if (subscriptionContext == null) { + return; + } + + List actualFirst = assertions.stream().filter(a -> a.convention() == Convention.ACTUAL_FIRST).toList(); + List expectedFirst = assertions.stream().filter(a -> a.convention() == Convention.EXPECTED_FIRST).toList(); + if (actualFirst.isEmpty() || expectedFirst.isEmpty()) { + return; + } + + OrderableAssertion primary = assertions.get(0); + PythonCheck.PreciseIssue issue = subscriptionContext.addIssue(primary.primaryLocation(), MESSAGE); + issue.addFlow(ACTUAL_FIRST_FLOW, toFlowLocations(actualFirst, ACTUAL_FIRST_LOCATION_MESSAGE)); + issue.addFlow(EXPECTED_FIRST_FLOW, toFlowLocations(expectedFirst, EXPECTED_FIRST_LOCATION_MESSAGE)); + createUnifyQuickFix(PUT_EXPECTED_SECOND_QF, expectedFirst).ifPresent(issue::addQuickFix); + createUnifyQuickFix(PUT_ACTUAL_SECOND_QF, actualFirst).ifPresent(issue::addQuickFix); + } + @Override public CheckScope scope() { return CheckScope.TESTS; } - private static void checkUnittestAssertion(SubscriptionContext ctx, CallExpression callExpression) { + private void checkUnittestAssertion(SubscriptionContext ctx, CallExpression callExpression) { AssertionArguments arguments = UnittestUtils.unittestAssertionArguments(callExpression, ctx); if (arguments == null) { return; } - - if (areInvertedForActualExpected(arguments.actual(), arguments.expected(), ctx)) { - var issue = ctx.addIssue(callExpression, UNITTEST_MESSAGE); - Expression actualValue = arguments.expected(); - Expression expectedValue = arguments.actual(); - addActualExpectedSecondaryLocations(issue, actualValue, expectedValue); - createSwapQuickFix(arguments.actual(), arguments.expected(), UNITTEST_QUICK_FIX_MESSAGE, ctx).ifPresent(issue::addQuickFix); - } + classifyAndCollect(callExpression, arguments.actual(), arguments.expected(), ctx); } private void checkPytestAssertion(SubscriptionContext ctx, AssertStatement assertStatement) { @@ -99,68 +126,88 @@ private void checkPytestAssertion(SubscriptionContext ctx, AssertStatement asser return; } - if (areInvertedForConfiguredPytestOrder(binaryExpression.leftOperand(), binaryExpression.rightOperand(), ctx)) { - var issue = ctx.addIssue(condition, pytestMessage()); - addActualExpectedSecondaryLocations(issue, pytestActualExpression(binaryExpression, ctx), pytestExpectedExpression(binaryExpression, ctx)); - createPytestQuickFix(binaryExpression, ctx).ifPresent(issue::addQuickFix); + Expression left = binaryExpression.leftOperand(); + Expression right = binaryExpression.rightOperand(); + boolean leftExpected = isExpectedValue(left, ctx); + boolean rightExpected = isExpectedValue(right, ctx); + if (leftExpected == rightExpected) { + return; } + + Convention convention = leftExpected ? Convention.EXPECTED_FIRST : Convention.ACTUAL_FIRST; + List swapEdits = createPytestSwapEdits(binaryExpression, convention, ctx); + assertions.add(new OrderableAssertion(condition, convention, swapEdits)); } - private static void checkAssertpyAssertion(SubscriptionContext ctx, CallExpression callExpression) { + private void checkAssertpyAssertion(SubscriptionContext ctx, CallExpression callExpression) { AssertionArguments arguments = UnittestUtils.assertpyAssertionArguments(callExpression, ctx, ASSERTPY_IS_EQUAL_TO_MATCHER); if (arguments == null) { return; } + classifyAndCollect(callExpression, arguments.actual(), arguments.expected(), ctx); + } - if (areInvertedForActualExpected(arguments.actual(), arguments.expected(), ctx)) { - var issue = ctx.addIssue(callExpression, ASSERTPY_MESSAGE); - Expression actualValue = arguments.expected(); - Expression expectedValue = arguments.actual(); - addActualExpectedSecondaryLocations(issue, actualValue, expectedValue); - createSwapQuickFix(arguments.actual(), arguments.expected(), ASSERTPY_QUICK_FIX_MESSAGE, ctx).ifPresent(issue::addQuickFix); + private void classifyAndCollect(Tree primaryLocation, Expression firstPosition, Expression secondPosition, SubscriptionContext ctx) { + boolean firstExpected = isExpectedValue(firstPosition, ctx); + boolean secondExpected = isExpectedValue(secondPosition, ctx); + if (firstExpected == secondExpected) { + return; } + Convention convention = firstExpected ? Convention.EXPECTED_FIRST : Convention.ACTUAL_FIRST; + assertions.add(new OrderableAssertion(primaryLocation, convention, createSwapEdits(firstPosition, secondPosition, ctx))); } - private static void addActualExpectedSecondaryLocations(org.sonar.plugins.python.api.PythonCheck.PreciseIssue issue, Expression actualExpression, Expression expectedExpression) { - issue.secondary(expectedExpression, EXPECTED_SECONDARY_MESSAGE); - issue.secondary(actualExpression, ACTUAL_SECONDARY_MESSAGE); + private static List toFlowLocations(List group, String message) { + return group.stream() + .map(assertion -> IssueLocation.preciseLocation(assertion.primaryLocation(), message)) + .toList(); } - private Optional createPytestQuickFix(BinaryExpression binaryExpression, SubscriptionContext ctx) { - Expression actualOperand = expectedOnRight ? binaryExpression.leftOperand() : binaryExpression.rightOperand(); - Expression expectedOperand = expectedOnRight ? binaryExpression.rightOperand() : binaryExpression.leftOperand(); - CallExpression approxCall = asPytestApproxCall(expectedOperand, ctx); - if (approxCall == null) { - return createSwapQuickFix(binaryExpression.leftOperand(), binaryExpression.rightOperand(), PYTEST_QUICK_FIX_MESSAGE, ctx); - } - - RegularArgument approxExpectedArg = TreeUtils.nthArgumentOrKeyword(0, PYTEST_APPROX_EXPECTED_ARGUMENT_NAME, approxCall.arguments()); - if (approxExpectedArg == null) { + private static Optional createUnifyQuickFix(String description, List toSwap) { + // Only offer a unify fix when every assertion in the group can be edited; otherwise applying a + // partial fix would leave the file still mixing conventions. + if (toSwap.stream().anyMatch(assertion -> assertion.swapEdits().isEmpty())) { return Optional.empty(); } - - String replacementForOperand = expressionText(approxExpectedArg.expression(), ctx); - String replacementForApproxExpectedArg = expressionText(actualOperand, ctx); - if (replacementForOperand == null || replacementForApproxExpectedArg == null) { - return Optional.empty(); - } - - return Optional.of(PythonQuickFix.newQuickFix(PYTEST_QUICK_FIX_MESSAGE) - .addTextEdit(TextEditUtils.replace(actualOperand, replacementForOperand)) - .addTextEdit(TextEditUtils.replace(approxExpectedArg.expression(), replacementForApproxExpectedArg)) - .build()); + List edits = toSwap.stream().flatMap(assertion -> assertion.swapEdits().stream()).toList(); + return Optional.of(PythonQuickFix.newQuickFix(description).addTextEdit(edits).build()); } - private static Optional createSwapQuickFix(Expression leftExpression, Expression rightExpression, String message, SubscriptionContext ctx) { + private static List createSwapEdits(Expression leftExpression, Expression rightExpression, SubscriptionContext ctx) { String leftText = expressionText(leftExpression, ctx); String rightText = expressionText(rightExpression, ctx); if (leftText == null || rightText == null) { - return Optional.empty(); + return List.of(); } - return Optional.of(PythonQuickFix.newQuickFix(message) - .addTextEdit(TextEditUtils.replace(leftExpression, rightText)) - .addTextEdit(TextEditUtils.replace(rightExpression, leftText)) - .build()); + return List.of( + TextEditUtils.replace(leftExpression, rightText), + TextEditUtils.replace(rightExpression, leftText)); + } + + private static List createPytestSwapEdits(BinaryExpression binaryExpression, Convention convention, SubscriptionContext ctx) { + Expression left = binaryExpression.leftOperand(); + Expression right = binaryExpression.rightOperand(); + Expression expectedOperand = convention == Convention.EXPECTED_FIRST ? left : right; + Expression actualOperand = convention == Convention.EXPECTED_FIRST ? right : left; + + // expected == approx(actual) (or mirrored): unwrap by swapping the constant with the approx argument + CallExpression approxWrappingActual = asPytestApproxCall(actualOperand, ctx); + if (approxWrappingActual != null) { + RegularArgument approxExpectedArg = TreeUtils.nthArgumentOrKeyword(0, PYTEST_APPROX_EXPECTED_ARGUMENT_NAME, approxWrappingActual.arguments()); + if (approxExpectedArg == null) { + return List.of(); + } + String replacementForExpectedOperand = expressionText(approxExpectedArg.expression(), ctx); + String replacementForApproxArg = expressionText(expectedOperand, ctx); + if (replacementForExpectedOperand == null || replacementForApproxArg == null) { + return List.of(); + } + return List.of( + TextEditUtils.replace(expectedOperand, replacementForExpectedOperand), + TextEditUtils.replace(approxExpectedArg.expression(), replacementForApproxArg)); + } + + return createSwapEdits(left, right, ctx); } @Nullable @@ -235,30 +282,6 @@ private static boolean isLineBreak(char current) { return current == '\r' || current == '\n'; } - private static boolean areInvertedForActualExpected(Expression actualPosition, Expression expectedPosition, SubscriptionContext ctx) { - return isExpectedValue(actualPosition, ctx) && !isExpectedValue(expectedPosition, ctx); - } - - private boolean areInvertedForConfiguredPytestOrder(Expression leftOperand, Expression rightOperand, SubscriptionContext ctx) { - return expectedOnRight - ? areInvertedForActualExpected(leftOperand, rightOperand, ctx) - : areInvertedForActualExpected(rightOperand, leftOperand, ctx); - } - - private String pytestMessage() { - return expectedOnRight ? PYTEST_EXPECTED_ON_RIGHT_MESSAGE : PYTEST_EXPECTED_ON_LEFT_MESSAGE; - } - - private Expression pytestActualExpression(BinaryExpression binaryExpression, SubscriptionContext ctx) { - Expression actualExpression = expectedOnRight ? binaryExpression.rightOperand() : binaryExpression.leftOperand(); - return unwrapPytestApproxArgument(actualExpression, ctx); - } - - private Expression pytestExpectedExpression(BinaryExpression binaryExpression, SubscriptionContext ctx) { - Expression expectedExpression = expectedOnRight ? binaryExpression.leftOperand() : binaryExpression.rightOperand(); - return unwrapPytestApproxArgument(expectedExpression, ctx); - } - private static boolean isExpectedValue(Expression expression, SubscriptionContext ctx) { Expression unwrapped = Expressions.removeParentheses(expression); if (CheckUtils.isConstant(unwrapped)) { @@ -280,13 +303,4 @@ private static boolean isPytestApproxExpectedValue(Expression expression, Subscr RegularArgument expectedArg = TreeUtils.nthArgumentOrKeyword(0, PYTEST_APPROX_EXPECTED_ARGUMENT_NAME, callExpression.arguments()); return expectedArg != null && isExpectedValue(expectedArg.expression(), ctx); } - - private static Expression unwrapPytestApproxArgument(Expression expression, SubscriptionContext ctx) { - CallExpression approxCall = asPytestApproxCall(expression, ctx); - if (approxCall == null) { - return expression; - } - RegularArgument expectedArg = TreeUtils.nthArgumentOrKeyword(0, PYTEST_APPROX_EXPECTED_ARGUMENT_NAME, approxCall.arguments()); - return expectedArg != null ? expectedArg.expression() : expression; - } } diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/AssertionArgumentOrderCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/AssertionArgumentOrderCheckTest.java index badcc030f..9882b1e4b 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/tests/AssertionArgumentOrderCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/AssertionArgumentOrderCheckTest.java @@ -23,6 +23,7 @@ import org.sonar.python.checks.utils.PythonCheckVerifier; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatCode; class AssertionArgumentOrderCheckTest { private static final AssertionArgumentOrderCheck CHECK = new AssertionArgumentOrderCheck(); @@ -33,8 +34,18 @@ void test() { } @Test - void test_expected_on_left() { - PythonCheckVerifier.verify("src/test/resources/checks/tests/test_assertionArgumentOrderExpectedLeft.py", checkWithExpectedOnRight()); + void test_pytest() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/test_assertionArgumentOrderPytest.py", CHECK); + } + + @Test + void test_assertpy_consistent_expected_first() { + PythonCheckVerifier.verifyNoIssue("src/test/resources/checks/tests/test_assertionArgumentOrderAssertpy.py", CHECK); + } + + @Test + void test_consistent_actual_first() { + PythonCheckVerifier.verifyNoIssue("src/test/resources/checks/tests/test_assertionArgumentOrderExpectedLeft.py", CHECK); } @Test @@ -43,7 +54,7 @@ void test_scope() { } @Test - void unittest_quick_fix() { + void unify_quick_fixes_unittest() { String before = """ import unittest @@ -53,8 +64,9 @@ def value(): class MyTest(unittest.TestCase): def test_order(self): self.assertEqual(first=42, second=value()) + self.assertEqual(value(), 42) """; - String after = """ + String putExpectedSecond = """ import unittest def value(): @@ -63,78 +75,59 @@ def value(): class MyTest(unittest.TestCase): def test_order(self): self.assertEqual(first=value(), second=42) + self.assertEqual(value(), 42) """; - PythonQuickFixVerifier.verifySemantic(CHECK, "unittest_case.py", before, after); - PythonQuickFixVerifier.verifySemanticQuickFixMessages(CHECK, "unittest_case.py", before, "Swap the actual and expected arguments"); - } - - @Test - void pytest_quick_fix() { - String before = """ - def value(): - return 41 + 1 + String putActualSecond = """ + import unittest - def test_order(): - assert 42 == value() - """; - String after = """ def value(): return 41 + 1 - def test_order(): - assert value() == 42 + class MyTest(unittest.TestCase): + def test_order(self): + self.assertEqual(first=42, second=value()) + self.assertEqual(42, value()) """; - PythonQuickFixVerifier.verifySemantic(CHECK, "test_pytest_case.py", before, after); - PythonQuickFixVerifier.verifySemanticQuickFixMessages(CHECK, "test_pytest_case.py", before, "Swap the actual and expected operands"); + PythonQuickFixVerifier.verifySemantic(CHECK, "unittest_case.py", before, putExpectedSecond, putActualSecond); + PythonQuickFixVerifier.verifySemanticQuickFixMessages(CHECK, "unittest_case.py", before, + "Put all expected values second", + "Put all actual values second"); } @Test - void pytest_approx_quick_fix() { + void unify_quick_fixes_pytest() { String before = """ - import pytest - - def value(): - return 3.14 - - def test_order(): - assert 42 == pytest.approx(value(), abs=0.1) - """; - String after = """ - import pytest - def value(): - return 3.14 + return 41 + 1 def test_order(): - assert value() == pytest.approx(42, abs=0.1) + assert 42 == value() + assert value() == 42 """; - PythonQuickFixVerifier.verifySemantic(CHECK, "test_pytest_approx_case.py", before, after); - PythonQuickFixVerifier.verifySemanticQuickFixMessages(CHECK, "test_pytest_approx_case.py", before, "Swap the actual and expected operands"); - } - - @Test - void pytest_quick_fix_expected_on_left() { - String before = """ + String putExpectedSecond = """ def value(): return 41 + 1 def test_order(): assert value() == 42 + assert value() == 42 """; - String after = """ + String putActualSecond = """ def value(): return 41 + 1 def test_order(): assert 42 == value() + assert 42 == value() """; - PythonQuickFixVerifier.verifySemantic(checkWithExpectedOnRight(), "test_pytest_expected_left_case.py", before, after); - PythonQuickFixVerifier.verifySemanticQuickFixMessages(checkWithExpectedOnRight(), "test_pytest_expected_left_case.py", before, - "Swap the actual and expected operands"); + PythonQuickFixVerifier.verifySemantic(CHECK, "test_pytest_case.py", before, putExpectedSecond, putActualSecond); + PythonQuickFixVerifier.verifySemanticQuickFixMessages(CHECK, "test_pytest_case.py", before, + "Put all expected values second", + "Put all actual values second"); } @Test - void pytest_approx_quick_fix_expected_on_left() { + void unify_quick_fixes_pytest_approx() { String before = """ import pytest @@ -142,24 +135,37 @@ def value(): return 3.14 def test_order(): - assert pytest.approx(value(), abs=0.1) == 42 + assert 42 == pytest.approx(value(), abs=0.1) + assert value() == pytest.approx(42, abs=0.1) """; - String after = """ + String putExpectedSecond = """ import pytest def value(): return 3.14 def test_order(): + assert value() == pytest.approx(42, abs=0.1) + assert value() == pytest.approx(42, abs=0.1) + """; + String putActualSecond = """ + import pytest + + def value(): + return 3.14 + + def test_order(): + assert 42 == pytest.approx(value(), abs=0.1) assert pytest.approx(42, abs=0.1) == value() """; - PythonQuickFixVerifier.verifySemantic(checkWithExpectedOnRight(), "test_pytest_approx_expected_left_case.py", before, after); - PythonQuickFixVerifier.verifySemanticQuickFixMessages(checkWithExpectedOnRight(), "test_pytest_approx_expected_left_case.py", before, - "Swap the actual and expected operands"); + PythonQuickFixVerifier.verifySemantic(CHECK, "test_pytest_approx_case.py", before, putExpectedSecond, putActualSecond); + PythonQuickFixVerifier.verifySemanticQuickFixMessages(CHECK, "test_pytest_approx_case.py", before, + "Put all expected values second", + "Put all actual values second"); } @Test - void assertpy_quick_fix() { + void unify_quick_fixes_assertpy() { String before = """ from assertpy import assert_that @@ -168,8 +174,9 @@ def value(): def test_order(): assert_that(42).described_as("count").is_equal_to(value()) + assert_that(value()).described_as("count").is_equal_to(42) """; - String after = """ + String putExpectedSecond = """ from assertpy import assert_that def value(): @@ -177,13 +184,26 @@ def value(): def test_order(): assert_that(value()).described_as("count").is_equal_to(42) + assert_that(value()).described_as("count").is_equal_to(42) + """; + String putActualSecond = """ + from assertpy import assert_that + + def value(): + return 41 + 1 + + def test_order(): + assert_that(42).described_as("count").is_equal_to(value()) + assert_that(42).described_as("count").is_equal_to(value()) """; - PythonQuickFixVerifier.verifySemantic(CHECK, "test_assertpy_case.py", before, after); - PythonQuickFixVerifier.verifySemanticQuickFixMessages(CHECK, "test_assertpy_case.py", before, "Swap the actual and expected values"); + PythonQuickFixVerifier.verifySemantic(CHECK, "test_assertpy_case.py", before, putExpectedSecond, putActualSecond); + PythonQuickFixVerifier.verifySemanticQuickFixMessages(CHECK, "test_assertpy_case.py", before, + "Put all expected values second", + "Put all actual values second"); } @Test - void quick_fix_for_multiline_operand() { + void unify_quick_fix_for_multiline_operand() { String before = """ def value(): return 41 + 1 @@ -192,8 +212,9 @@ def test_order(): assert 42 == ( value() ) + assert value() == 42 """; - String after = """ + String putExpectedSecond = """ def value(): return 41 + 1 @@ -201,32 +222,52 @@ def test_order(): assert ( value() ) == 42 + assert value() == 42 + """; + String putActualSecond = """ + def value(): + return 41 + 1 + + def test_order(): + assert 42 == ( + value() + ) + assert 42 == value() """; - PythonQuickFixVerifier.verifySemantic(CHECK, "test_pytest_multiline_case.py", before, after); - PythonQuickFixVerifier.verifySemanticQuickFixMessages(CHECK, "test_pytest_multiline_case.py", before, "Swap the actual and expected operands"); + PythonQuickFixVerifier.verifySemantic(CHECK, "test_pytest_multiline_case.py", before, putExpectedSecond, putActualSecond); } @Test - void pytest_quick_fix_with_windows_line_endings() { + void unify_quick_fix_with_windows_line_endings() { String before = """ def value(): return 41 + 1 def test_order(): assert 42 == value() + assert value() == 42 """.replace("\n", "\r\n"); - String after = """ + String putExpectedSecond = """ def value(): return 41 + 1 def test_order(): assert value() == 42 + assert value() == 42 """.replace("\n", "\r\n"); - PythonQuickFixVerifier.verifySemantic(CHECK, "test_pytest_windows_case.py", before, after); + String putActualSecond = """ + def value(): + return 41 + 1 + + def test_order(): + assert 42 == value() + assert 42 == value() + """.replace("\n", "\r\n"); + PythonQuickFixVerifier.verifySemantic(CHECK, "test_pytest_windows_case.py", before, putExpectedSecond, putActualSecond); } @Test - void pytest_approx_quick_fix_with_expected_keyword() { + void unify_quick_fix_pytest_approx_with_expected_keyword() { String before = """ import pytest @@ -235,8 +276,9 @@ def value(): def test_order(): assert 42 == pytest.approx(expected=value(), abs=0.1) + assert value() == pytest.approx(expected=42, abs=0.1) """; - String after = """ + String putExpectedSecond = """ import pytest def value(): @@ -244,9 +286,55 @@ def value(): def test_order(): assert value() == pytest.approx(expected=42, abs=0.1) + assert value() == pytest.approx(expected=42, abs=0.1) + """; + String putActualSecond = """ + import pytest + + def value(): + return 3.14 + + def test_order(): + assert 42 == pytest.approx(expected=value(), abs=0.1) + assert pytest.approx(expected=42, abs=0.1) == value() """; - PythonQuickFixVerifier.verifySemantic(CHECK, "test_pytest_keyword_approx_case.py", before, after); - PythonQuickFixVerifier.verifySemanticQuickFixMessages(CHECK, "test_pytest_keyword_approx_case.py", before, "Swap the actual and expected operands"); + PythonQuickFixVerifier.verifySemantic(CHECK, "test_pytest_keyword_approx_case.py", before, putExpectedSecond, putActualSecond); + } + + @Test + void unify_quick_fix_suppressed_when_any_assertion_cannot_be_edited() { + String before = """ + import pytest + + def value(): + return 41 + 1 + + def test_order(): + assert 42 == value() + assert 42 == pytest.approx(other=value()) + assert value() == 42 + """; + String putActualSecond = """ + import pytest + + def value(): + return 41 + 1 + + def test_order(): + assert 42 == value() + assert 42 == pytest.approx(other=value()) + assert 42 == value() + """; + // expected-first group includes an approx call without a swappable expected arg, so that unify QF is suppressed + PythonQuickFixVerifier.verifySemantic(CHECK, "test_pytest_partial_qf_case.py", before, putActualSecond); + PythonQuickFixVerifier.verifySemanticQuickFixMessages(CHECK, "test_pytest_partial_qf_case.py", before, + "Put all actual values second"); + } + + @Test + void leave_file_is_noop_before_initialize() { + AssertionArgumentOrderCheck check = new AssertionArgumentOrderCheck(); + assertThatCode(check::leaveFile).doesNotThrowAnyException(); } @Test @@ -257,6 +345,9 @@ void convert_position_to_index_handles_crlf_and_invalid_positions() throws Excep String code = "a = 1\r\nb = 2\r\n"; assertThat(method.invoke(null, code, 2, 0)).isEqualTo(7); assertThat(method.invoke(null, code, 2, 5)).isEqualTo(12); + assertThat(method.invoke(null, code, 99, 0)).isEqualTo(-1); + assertThat(method.invoke(null, code, 1, -1)).isEqualTo(-1); + assertThat(method.invoke(null, code, 1, 50)).isEqualTo(-1); assertThat(method.invoke(null, code, 4, 0)).isEqualTo(-1); assertThat(method.invoke(null, code, 2, -1)).isEqualTo(-1); assertThat(method.invoke(null, code, 2, 6)).isEqualTo(-1); @@ -272,10 +363,4 @@ void next_index_handles_all_line_break_variants() throws Exception { assertThat(method.invoke(null, "\r", 0)).isEqualTo(1); assertThat(method.invoke(null, "\r\n", 0)).isEqualTo(2); } - - private static AssertionArgumentOrderCheck checkWithExpectedOnRight() { - AssertionArgumentOrderCheck check = new AssertionArgumentOrderCheck(); - check.expectedOnRight = false; - return check; - } } diff --git a/python-checks/src/test/resources/checks/tests/test_assertionArgumentOrder.py b/python-checks/src/test/resources/checks/tests/test_assertionArgumentOrder.py index c65d4f360..102fac92a 100644 --- a/python-checks/src/test/resources/checks/tests/test_assertionArgumentOrder.py +++ b/python-checks/src/test/resources/checks/tests/test_assertionArgumentOrder.py @@ -17,18 +17,23 @@ def value(): class TestUnittestAssertions(unittest.TestCase): def test_swapped_equality_arguments(self): self.assertEqual(42, value()) -# Noncompliant@-1 {{Swap these 2 arguments so they are in the correct order: actual value, expected value.}} +# Noncompliant@-1 {{Unify assertion argument order in this file; both "actual first" and "expected first" conventions are used.}} # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@-1 -# ^^@-2< {{Expected value.}} -# ^^^^^^^@-3< {{Actual value.}} - self.assertEqual(first=EXPECTED_COUNT, second=value()) # Noncompliant - self.assertIs(None, value()) # Noncompliant - self.assertAlmostEqual(EXPECTED_PI, value()) # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@-2< {{Expected value first.}} + self.assertEqual(first=EXPECTED_COUNT, second=value()) +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Expected value first.}} + self.assertIs(None, value()) +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Expected value first.}} + self.assertAlmostEqual(EXPECTED_PI, value()) +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Expected value first.}} self.assertEqual(value(), 42) +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Actual value first.}} self.assertEqual(value(), value()) self.assertIs(value(), None) +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Actual value first.}} self.assertAlmostEqual(value(), EXPECTED_PI) +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Actual value first.}} self.assertEqual(value()) self.assertEqual(second=EXPECTED_COUNT) self.assertTrue(value()) @@ -69,41 +74,44 @@ def test_not_a_unittest_test_case(self): def test_pytest_assertions(): assert 42 == value() -# Noncompliant@-1 {{Swap these 2 sides so they are in the correct order: actual value, expected value.}} -# ^^^^^^^^^^^^^@-1 -# ^^@-2< {{Expected value.}} -# ^^^^^^^@-3< {{Actual value.}} - assert EXPECTED_COUNT == value() # Noncompliant - assert pytest.approx(EXPECTED_PI) == value() # Noncompliant +# ^^^^^^^^^^^^^< {{Expected value first.}} + assert EXPECTED_COUNT == value() +# ^^^^^^^^^^^^^^^^^^^^^^^^^< {{Expected value first.}} + assert pytest.approx(EXPECTED_PI) == value() +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Expected value first.}} assert value() == 42 +# ^^^^^^^^^^^^^< {{Actual value first.}} assert value() == EXPECTED_COUNT +# ^^^^^^^^^^^^^^^^^^^^^^^^^< {{Actual value first.}} assert value() == pytest.approx(EXPECTED_PI) +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Actual value first.}} assert value() == value() assert 42 == EXPECTED_COUNT assert value() assert 42 != value() assert 42 == pytest.approx(value()) -# Noncompliant@-1 -# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^@-1 -# ^^@-2< {{Expected value.}} -# ^^^^^^^@-3< {{Actual value.}} - assert 42 == pytest.approx(other=value()) # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Expected value first.}} + assert 42 == pytest.approx(other=value()) +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Expected value first.}} def test_assertpy_assertions(): assert_that(42).is_equal_to(value()) -# Noncompliant@-1 {{Pass the actual value to "assert_that" and the expected value to "is_equal_to".}} -# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@-1 -# ^^@-2< {{Expected value.}} -# ^^^^^^^@-3< {{Actual value.}} - assert_that(EXPECTED_COUNT).is_equal_to(value()) # Noncompliant - assert_that(42).described_as("count").is_equal_to(value()) # Noncompliant - assert_that(EXPECTED_COUNT).described_as("count").snapshot("baseline").is_equal_to(value()) # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Expected value first.}} + assert_that(EXPECTED_COUNT).is_equal_to(value()) +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Expected value first.}} + assert_that(42).described_as("count").is_equal_to(value()) +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Expected value first.}} + assert_that(EXPECTED_COUNT).described_as("count").snapshot("baseline").is_equal_to(value()) +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Expected value first.}} assert_that(value()).is_equal_to(42) +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Actual value first.}} assert_that(value()).is_equal_to(EXPECTED_COUNT) +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Actual value first.}} assert_that(value()).described_as("count").snapshot("baseline").is_equal_to(42) +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Actual value first.}} assert_that(value()).is_equal_to(value()) assert_that(42).is_equal_to(EXPECTED_COUNT) assert_that(value()).is_equal_to() diff --git a/python-checks/src/test/resources/checks/tests/test_assertionArgumentOrderAssertpy.py b/python-checks/src/test/resources/checks/tests/test_assertionArgumentOrderAssertpy.py new file mode 100644 index 000000000..a2e45df23 --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/test_assertionArgumentOrderAssertpy.py @@ -0,0 +1,23 @@ +from assertpy import assert_that + +EXPECTED_COUNT = 42 + + +def value(): + return 41 + 1 + + +# Consistent expected-first convention → no issue +def test_assertpy_assertions_expected_first(): + assert_that(42).is_equal_to(value()) + assert_that(EXPECTED_COUNT).is_equal_to(value()) + assert_that(42).described_as("count").is_equal_to(value()) + assert_that(EXPECTED_COUNT).described_as("count").snapshot("baseline").is_equal_to(value()) + assert_that(42).is_equal_to(EXPECTED_COUNT) + assert_that(value()).is_equal_to(value()) + assert_that(value()).is_equal_to() + assert_that().is_equal_to(value()) + assert_that(value()).is_not_equal_to(42) + builder.is_equal_to(42) + factory().is_equal_to(42) + other_call(value()).is_equal_to(42) diff --git a/python-checks/src/test/resources/checks/tests/test_assertionArgumentOrderExpectedLeft.py b/python-checks/src/test/resources/checks/tests/test_assertionArgumentOrderExpectedLeft.py index 81eb332d4..509f18f60 100644 --- a/python-checks/src/test/resources/checks/tests/test_assertionArgumentOrderExpectedLeft.py +++ b/python-checks/src/test/resources/checks/tests/test_assertionArgumentOrderExpectedLeft.py @@ -1,7 +1,4 @@ -import unittest - import pytest -from assertpy import assert_that EXPECTED_COUNT = 42 EXPECTED_PI = 3.14 @@ -11,35 +8,10 @@ def value(): return 41 + 1 -class TestUnittestAssertions(unittest.TestCase): - def test_unittest_assertions_are_unchanged(self): - self.assertEqual(42, value()) -# Noncompliant@-1 {{Swap these 2 arguments so they are in the correct order: actual value, expected value.}} -# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@-1 -# ^^@-2< {{Expected value.}} -# ^^^^^^^@-3< {{Actual value.}} - self.assertEqual(value(), 42) - - -def test_pytest_assertions_expected_on_left(): +# Consistent actual-first convention → no issue +def test_pytest_assertions_actual_first(): assert value() == 42 -# Noncompliant@-1 {{Swap these 2 sides so they are in the correct order: expected value, actual value.}} -# ^^^^^^^^^^^^^@-1 -# ^^@-2< {{Expected value.}} -# ^^^^^^^@-3< {{Actual value.}} - assert value() == EXPECTED_COUNT # Noncompliant - assert value() == pytest.approx(EXPECTED_PI) # Noncompliant - - assert 42 == value() - assert EXPECTED_COUNT == value() - assert pytest.approx(EXPECTED_PI) == value() + assert value() == EXPECTED_COUNT + assert value() == pytest.approx(EXPECTED_PI) assert 42 == EXPECTED_COUNT - - -def test_assertpy_assertions_are_unchanged(): - assert_that(42).is_equal_to(value()) -# Noncompliant@-1 {{Pass the actual value to "assert_that" and the expected value to "is_equal_to".}} -# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@-1 -# ^^@-2< {{Expected value.}} -# ^^^^^^^@-3< {{Actual value.}} - assert_that(value()).is_equal_to(42) + assert value() == value() diff --git a/python-checks/src/test/resources/checks/tests/test_assertionArgumentOrderPytest.py b/python-checks/src/test/resources/checks/tests/test_assertionArgumentOrderPytest.py new file mode 100644 index 000000000..7ec07dc40 --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/test_assertionArgumentOrderPytest.py @@ -0,0 +1,34 @@ +import pytest + +EXPECTED_COUNT = 42 +EXPECTED_PI = 3.14 + + +def value(): + return 41 + 1 + + +def test_pytest_assertions(): + assert 42 == value() +# Noncompliant@-1 {{Unify assertion argument order in this file; both "actual first" and "expected first" conventions are used.}} +# ^^^^^^^^^^^^^@-1 +# ^^^^^^^^^^^^^@-2< {{Expected value first.}} + assert EXPECTED_COUNT == value() +# ^^^^^^^^^^^^^^^^^^^^^^^^^< {{Expected value first.}} + assert pytest.approx(EXPECTED_PI) == value() +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Expected value first.}} + + assert value() == 42 +# ^^^^^^^^^^^^^< {{Actual value first.}} + assert value() == EXPECTED_COUNT +# ^^^^^^^^^^^^^^^^^^^^^^^^^< {{Actual value first.}} + assert value() == pytest.approx(EXPECTED_PI) +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Actual value first.}} + assert value() == value() + assert 42 == EXPECTED_COUNT + assert value() + assert 42 != value() + assert 42 == pytest.approx(value()) +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Expected value first.}} + assert 42 == pytest.approx(other=value()) +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^< {{Expected value first.}} diff --git a/python-commons/src/main/java/org/sonar/plugins/python/IssuesRepository.java b/python-commons/src/main/java/org/sonar/plugins/python/IssuesRepository.java index b6ec706b0..f455fc989 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/IssuesRepository.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/IssuesRepository.java @@ -18,6 +18,7 @@ import java.io.File; import java.util.ArrayDeque; +import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.concurrent.locks.Lock; @@ -70,6 +71,31 @@ private void save(PythonInputFile inputFile, PythonCheck.PreciseIssue preciseIss var primaryLocation = newLocation(inputFile, newIssue, preciseIssue.primaryLocation()); newIssue.at(primaryLocation); + addDataFlows(inputFile, newIssue, preciseIssue); + addSecondaryLocations(inputFile, newIssue, preciseIssue, primaryLocation); + + handleQuickFixes(inputFile.wrappedFile(), ruleKey, newIssue, preciseIssue); + + save(newIssue); + } + + private void addDataFlows(PythonInputFile inputFile, NewIssue newIssue, PythonCheck.PreciseIssue preciseIssue) { + for (var flow : preciseIssue.flows()) { + List flowLocations = new ArrayList<>(); + for (var location : flow.locations()) { + NewIssueLocation newLocation = resolveLocation(inputFile, newIssue, location); + if (newLocation != null) { + flowLocations.add(newLocation); + } + } + if (!flowLocations.isEmpty()) { + newIssue.addFlow(flowLocations, NewIssue.FlowType.DATA, flow.description()); + } + } + } + + private void addSecondaryLocations(PythonInputFile inputFile, NewIssue newIssue, PythonCheck.PreciseIssue preciseIssue, + NewIssueLocation primaryLocation) { var secondaryLocationsFlow = new ArrayDeque(); for (var secondaryLocation : preciseIssue.secondaryLocations()) { String fileId = secondaryLocation.fileId(); @@ -88,10 +114,19 @@ private void save(PythonInputFile inputFile, PythonCheck.PreciseIssue preciseIss secondaryLocationsFlow.addFirst(primaryLocation); newIssue.addFlow(secondaryLocationsFlow); } + } - handleQuickFixes(inputFile.wrappedFile(), ruleKey, newIssue, preciseIssue); - - save(newIssue); + @CheckForNull + private NewIssueLocation resolveLocation(PythonInputFile defaultInputFile, NewIssue newIssue, IssueLocation location) { + String fileId = location.fileId(); + if (fileId == null) { + return newLocation(defaultInputFile, newIssue, location); + } + InputFile issueLocationFile = component(fileId, context); + if (issueLocationFile == null) { + return null; + } + return newLocation(new PythonInputFileImpl(issueLocationFile), newIssue, location); } private void save(NewIssue newIssue) { diff --git a/python-commons/src/test/java/org/sonar/plugins/python/IssuesRepositoryTest.java b/python-commons/src/test/java/org/sonar/plugins/python/IssuesRepositoryTest.java new file mode 100644 index 000000000..b4594ecbc --- /dev/null +++ b/python-commons/src/test/java/org/sonar/plugins/python/IssuesRepositoryTest.java @@ -0,0 +1,167 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.plugins.python; + +import com.sonarsource.scanner.engine.sensor.test.fixtures.SensorContextTester; +import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.util.List; +import java.util.concurrent.locks.ReentrantLock; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import org.sonar.api.batch.fs.InputFile; +import org.sonar.api.batch.sensor.issue.Issue; +import org.sonar.api.batch.sensor.issue.NewIssue; +import org.sonar.api.rule.RuleKey; +import org.sonar.plugins.python.api.IssueLocation; +import org.sonar.plugins.python.api.LocationInFile; +import org.sonar.plugins.python.api.PythonCheck; +import org.sonar.plugins.python.api.PythonVisitorCheck; +import org.sonar.plugins.python.indexer.PythonIndexer; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; + +class IssuesRepositoryTest { + + @TempDir + File baseDir; + + private SensorContextTester context; + private PythonInputFile inputFile; + + @BeforeEach + void setUp() throws Exception { + File source = new File(baseDir, "sample.py"); + Files.writeString(source.toPath(), "x = 1\ny = 2\n"); + context = SensorContextTester.create(baseDir); + inputFile = new PythonInputFileImpl(TestInputFileBuilder.create("moduleKey", "sample.py") + .setModuleBaseDir(baseDir.toPath()) + .setCharset(StandardCharsets.UTF_8) + .setLanguage(Python.KEY) + .setType(InputFile.Type.MAIN) + .initMetadata(TestUtils.fileContent(source, StandardCharsets.UTF_8)) + .build()); + context.fileSystem().add(inputFile.wrappedFile()); + } + + @Test + void reports_typed_data_flows_with_description() { + context = spy(context); + MockSonarLintIssue mockIssue = new MockSonarLintIssue(context); + when(context.newIssue()).thenReturn(mockIssue); + + PythonChecks checks = mock(PythonChecks.class); + when(checks.ruleKey(any())).thenReturn(RuleKey.of("python", "S9999")); + PythonIndexer indexer = mock(PythonIndexer.class); + + PythonCheck check = new PythonVisitorCheck() { + }; + PythonCheck.PreciseIssue preciseIssue = new PythonCheck.PreciseIssue(check, + IssueLocation.preciseLocation(new LocationInFile(null, 1, 0, 1, 1), "primary")); + preciseIssue.addFlow("Actual value first", + List.of(IssueLocation.preciseLocation(new LocationInFile(null, 1, 0, 1, 1), "Actual value first."))); + preciseIssue.addFlow("Expected value first", + List.of(IssueLocation.preciseLocation(new LocationInFile(null, 2, 0, 2, 1), "Expected value first."))); + + IssuesRepository repository = new IssuesRepository(context, checks, indexer, true, new ReentrantLock()); + repository.save(inputFile, List.of(preciseIssue)); + + assertThat(mockIssue.getSaved()).isTrue(); + assertThat(mockIssue.flows()).hasSize(2); + Issue.Flow firstFlow = mockIssue.flows().get(0); + assertThat(firstFlow.type()).isEqualTo(NewIssue.FlowType.DATA); + assertThat(firstFlow.description()).isEqualTo("Actual value first"); + assertThat(firstFlow.locations()).hasSize(1); + assertThat(firstFlow.locations().get(0).message()).isEqualTo("Actual value first."); + + Issue.Flow secondFlow = mockIssue.flows().get(1); + assertThat(secondFlow.type()).isEqualTo(NewIssue.FlowType.DATA); + assertThat(secondFlow.description()).isEqualTo("Expected value first"); + } + + @Test + void reports_flow_locations_from_other_files() throws Exception { + File otherSource = new File(baseDir, "other.py"); + Files.writeString(otherSource.toPath(), "z = 3\n"); + PythonInputFile otherFile = new PythonInputFileImpl(TestInputFileBuilder.create("moduleKey", "other.py") + .setModuleBaseDir(baseDir.toPath()) + .setCharset(StandardCharsets.UTF_8) + .setLanguage(Python.KEY) + .setType(InputFile.Type.MAIN) + .initMetadata(TestUtils.fileContent(otherSource, StandardCharsets.UTF_8)) + .build()); + context.fileSystem().add(otherFile.wrappedFile()); + + context = spy(context); + MockSonarLintIssue mockIssue = new MockSonarLintIssue(context); + when(context.newIssue()).thenReturn(mockIssue); + + PythonChecks checks = mock(PythonChecks.class); + when(checks.ruleKey(any())).thenReturn(RuleKey.of("python", "S9999")); + PythonIndexer indexer = mock(PythonIndexer.class); + + PythonCheck check = new PythonVisitorCheck() { + }; + PythonCheck.PreciseIssue preciseIssue = new PythonCheck.PreciseIssue(check, + IssueLocation.preciseLocation(new LocationInFile(null, 1, 0, 1, 1), "primary")); + preciseIssue.addFlow("Cross-file flow", + List.of(IssueLocation.preciseLocation( + new LocationInFile(otherSource.getAbsolutePath(), 1, 0, 1, 1), + "On other file"))); + + IssuesRepository repository = new IssuesRepository(context, checks, indexer, true, new ReentrantLock()); + repository.save(inputFile, List.of(preciseIssue)); + + assertThat(mockIssue.getSaved()).isTrue(); + assertThat(mockIssue.flows()).hasSize(1); + assertThat(mockIssue.flows().get(0).description()).isEqualTo("Cross-file flow"); + assertThat(mockIssue.flows().get(0).locations()).hasSize(1); + } + + @Test + void skips_flow_locations_when_file_cannot_be_resolved() { + context = spy(context); + MockSonarLintIssue mockIssue = new MockSonarLintIssue(context); + when(context.newIssue()).thenReturn(mockIssue); + + PythonChecks checks = mock(PythonChecks.class); + when(checks.ruleKey(any())).thenReturn(RuleKey.of("python", "S9999")); + PythonIndexer indexer = mock(PythonIndexer.class); + + PythonCheck check = new PythonVisitorCheck() { + }; + PythonCheck.PreciseIssue preciseIssue = new PythonCheck.PreciseIssue(check, + IssueLocation.preciseLocation(new LocationInFile(null, 1, 0, 1, 1), "primary")); + preciseIssue.addFlow("Unresolved flow", + List.of(IssueLocation.preciseLocation( + new LocationInFile("/does/not/exist.py", 1, 0, 1, 1), + "Missing file"))); + + IssuesRepository repository = new IssuesRepository(context, checks, indexer, true, new ReentrantLock()); + repository.save(inputFile, List.of(preciseIssue)); + + assertThat(mockIssue.getSaved()).isTrue(); + assertThat(mockIssue.flows()).isEmpty(); + } +} diff --git a/python-commons/src/test/java/org/sonar/plugins/python/MockSonarLintIssue.java b/python-commons/src/test/java/org/sonar/plugins/python/MockSonarLintIssue.java index ef1e9d2a4..32b700120 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/MockSonarLintIssue.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/MockSonarLintIssue.java @@ -16,6 +16,7 @@ */ package org.sonar.plugins.python; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Optional; @@ -42,6 +43,7 @@ class MockSonarLintIssue implements NewIssue, Issue { private List codeVariants = null; private List internalTags = List.of(); private boolean saved; + private final List flows = new ArrayList<>(); MockSonarLintIssue(SensorContextTester context) { this.context = context; @@ -98,12 +100,17 @@ public NewIssue setQuickFixAvailable(boolean b) { @Override public NewIssue addFlow(Iterable flowLocations) { - throw new IllegalStateException("Not supposed to be tested"); + return addFlow(flowLocations, FlowType.UNDEFINED, null); } @Override - public NewIssue addFlow(Iterable iterable, FlowType flowType, @Nullable String s) { - return null; + public NewIssue addFlow(Iterable iterable, FlowType flowType, @Nullable String description) { + List locations = new ArrayList<>(); + for (NewIssueLocation newIssueLocation : iterable) { + locations.add((IssueLocation) newIssueLocation); + } + flows.add(new RecordedFlow(locations, flowType, description)); + return this; } @Override @@ -167,7 +174,7 @@ public IssueLocation primaryLocation() { @Override public List flows() { - throw new IllegalStateException("Not supposed to be tested"); + return flows; } @Override @@ -211,4 +218,7 @@ public NewIssue setCodeVariants(@Nullable Iterable iterable) { public boolean getSaved() { return saved; } + + private record RecordedFlow(List locations, FlowType type, @Nullable String description) implements Flow { + } } diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonCheck.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonCheck.java index 4f2b6c962..1abbee1dc 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonCheck.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonCheck.java @@ -26,12 +26,19 @@ public interface PythonCheck extends PythonFileConsumer { + /** + * A named flow of issue locations (reported as a DATA flow so the description is shown in the UI). + */ + record IssueFlow(String description, List locations) { + } + class PreciseIssue { private final PythonCheck check; private final IssueLocation primaryLocation; private Integer cost; private final List secondaryLocations; + private final List flows = new ArrayList<>(); private final List quickFixes = new ArrayList<>(); public PreciseIssue(PythonCheck check, IssueLocation primaryLocation) { @@ -78,6 +85,15 @@ public List secondaryLocations() { return secondaryLocations; } + public PreciseIssue addFlow(String description, List locations) { + flows.add(new IssueFlow(description, List.copyOf(locations))); + return this; + } + + public List flows() { + return List.copyOf(flows); + } + /** * This only makes sense in SonarLint context. Should not be used in custom rules. */ diff --git a/python-frontend/src/test/java/org/sonar/python/PythonCheckTest.java b/python-frontend/src/test/java/org/sonar/python/PythonCheckTest.java index 67b787b06..0f60a9338 100644 --- a/python-frontend/src/test/java/org/sonar/python/PythonCheckTest.java +++ b/python-frontend/src/test/java/org/sonar/python/PythonCheckTest.java @@ -99,6 +99,27 @@ public void visitFunctionDef(FunctionDef pyFunctionDefTree) { assertThat(firstIssue.cost()).isEqualTo(42); } + @Test + void test_flows() { + PythonVisitorCheck check = new PythonVisitorCheck() { + @Override + public void visitFunctionDef(FunctionDef pyFunctionDefTree) { + PreciseIssue issue = addIssue(pyFunctionDefTree.name(), MESSAGE); + issue.addFlow("Actual value first", List.of(IssueLocation.preciseLocation(pyFunctionDefTree.name(), "Actual value first."))); + issue.addFlow("Expected value first", List.of(IssueLocation.preciseLocation(pyFunctionDefTree.defKeyword(), "Expected value first."))); + super.visitFunctionDef(pyFunctionDefTree); + } + }; + + List issues = scanFileForIssues(check); + PreciseIssue firstIssue = issues.get(0); + assertThat(firstIssue.flows()).hasSize(2); + assertThat(firstIssue.flows().get(0).description()).isEqualTo("Actual value first"); + assertThat(firstIssue.flows().get(0).locations()).hasSize(1); + assertThat(firstIssue.flows().get(0).locations().get(0).message()).isEqualTo("Actual value first."); + assertThat(firstIssue.flows().get(1).description()).isEqualTo("Expected value first"); + } + @Test void test_secondary_location() { PythonVisitorCheck check = new PythonVisitorCheck() { From b6583d907597a5ece23d77e9f1053e5713a4b152 Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Wed, 5 Aug 2026 16:45:58 +0200 Subject: [PATCH 270/322] SONARPY-4420 Implement rule S9081 Prefer return_value over constant lambda patches GitOrigin-RevId: dbd5a9e873a053f2cad110d3a4205b93cacb2607 --- .../python/checks/OpenSourceCheckList.java | 2 + .../MockPatchLambdaReturnValueCheck.java | 211 ++++++++++++++ .../org/sonar/l10n/py/rules/python/S9081.html | 78 +++++ .../org/sonar/l10n/py/rules/python/S9081.json | 24 ++ .../py/rules/python/Sonar_way_profile.json | 1 + .../MockPatchLambdaReturnValueCheckTest.java | 155 ++++++++++ .../tests/mockPatchLambdaReturnValue.py | 266 ++++++++++++++++++ 7 files changed, 737 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/tests/MockPatchLambdaReturnValueCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9081.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9081.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/tests/MockPatchLambdaReturnValueCheckTest.java create mode 100644 python-checks/src/test/resources/checks/tests/mockPatchLambdaReturnValue.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 740b9d49a..a1485c7af 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -106,6 +106,7 @@ import org.sonar.python.checks.tests.IdenticalAssertionArgumentsCheck; import org.sonar.python.checks.tests.ImplicitlySkippedTestCheck; import org.sonar.python.checks.tests.IntentionalTestFailureMessageCheck; +import org.sonar.python.checks.tests.MockPatchLambdaReturnValueCheck; import org.sonar.python.checks.tests.NotDiscoverableTestMethodCheck; import org.sonar.python.checks.tests.PytestAutouseParametrizedFixtureCheck; import org.sonar.python.checks.tests.PytestDecoratorParenthesesCheck; @@ -356,6 +357,7 @@ public Stream> getChecks() { MethodShouldBeStaticCheck.class, MissingDocstringCheck.class, MissingNewlineAtEndOfFileCheck.class, + MockPatchLambdaReturnValueCheck.class, ModifiedParameterValueCheck.class, ModuleNameCheck.class, MultipleInheritanceMROConflictCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/MockPatchLambdaReturnValueCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/MockPatchLambdaReturnValueCheck.java new file mode 100644 index 000000000..bb5ca3338 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/MockPatchLambdaReturnValueCheck.java @@ -0,0 +1,211 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import java.util.List; +import java.util.Set; +import java.util.function.Predicate; +import java.util.stream.Stream; +import javax.annotation.CheckForNull; +import javax.annotation.Nullable; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.quickfix.PythonQuickFix; +import org.sonar.plugins.python.api.symbols.v2.SymbolV2; +import org.sonar.plugins.python.api.symbols.v2.UsageV2; +import org.sonar.plugins.python.api.tree.Argument; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.LambdaExpression; +import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.ParameterList; +import org.sonar.plugins.python.api.tree.QualifiedExpression; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.checks.utils.Expressions; +import org.sonar.python.quickfix.TextEditUtils; +import org.sonar.python.tree.TreeUtils; + +@Rule(key = "S9081") +public class MockPatchLambdaReturnValueCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Replace this lambda with a \"return_value\" argument."; + private static final String QUICK_FIX_MESSAGE = "Replace this lambda with a \"return_value\" argument"; + + private static final String NEW_KEYWORD = "new"; + private static final String PATCH_METHOD = "patch"; + private static final String OBJECT_METHOD = "object"; + + /** + * The {@code mocker} fixtures come from pytest-mock, which has no typeshed stubs, hence the name based detection. + */ + private static final Set MOCKER_FIXTURE_NAMES = Set.of( + "mocker", "class_mocker", "module_mocker", "package_mocker", "session_mocker"); + + private static final TypeMatcher PATCHER_MATCHER = TypeMatchers.isObjectSatisfying( + TypeMatchers.any( + TypeMatchers.isType("unittest.mock._patcher"), + TypeMatchers.isType("mock.mock._patcher"))); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, MockPatchLambdaReturnValueCheck::checkCall); + } + + @Override + public CheckScope scope() { + return CheckScope.ALL; + } + + private static void checkCall(SubscriptionContext ctx) { + CallExpression callExpression = (CallExpression) ctx.syntaxNode(); + List arguments = callExpression.arguments(); + if (Expressions.containsSpreadOperator(arguments)) { + return; + } + + int newPosition = newArgumentPosition(callExpression.callee(), ctx); + if (newPosition < 0) { + return; + } + + RegularArgument newArgument = TreeUtils.nthArgumentOrKeyword(newPosition, NEW_KEYWORD, arguments); + if (newArgument == null || !(Expressions.removeParentheses(newArgument.expression()) instanceof LambdaExpression lambda) + || usesItsParameters(lambda)) { + return; + } + // Decorators evaluate return_value= at definition time; skip lambdas whose body calls something, + // since that may intentionally re-evaluate on each invocation. Non-decorator patches keep the issue. + if (TreeUtils.firstAncestorOfKind(callExpression, Tree.Kind.DECORATOR) != null + && containsCallExpression(lambda.expression())) { + return; + } + + var issue = ctx.addIssue(lambda, MESSAGE); + String replacement = returnValueReplacement(callExpression, lambda, newArgument, arguments); + if (replacement != null) { + issue.addQuickFix(PythonQuickFix.newQuickFix(QUICK_FIX_MESSAGE) + .addTextEdit(TextEditUtils.replace(newArgument, replacement)) + .build()); + } + } + + @CheckForNull + private static String returnValueReplacement(CallExpression callExpression, LambdaExpression lambda, RegularArgument newArgument, + List arguments) { + if (TreeUtils.firstAncestorOfKind(callExpression, Tree.Kind.DECORATOR) != null) { + // Without "new", the patching call injects a mock into the decorated function, which then needs an extra parameter. + return null; + } + // return_value= evaluates the expression once at patch construction; a call in the lambda body would be re-run per + // invocation, so rewriting would change behavior for both decorator and with-block forms. + if (containsCallExpression(lambda.expression())) { + return null; + } + if (newArgument.keywordArgument() == null && hasPositionalArgumentAfter(newArgument, arguments)) { + // Turning the positional argument into a keyword one would leave positional arguments after a keyword argument. + return null; + } + String returnedValue = TreeUtils.treeToString(lambda.expression(), false); + if (returnedValue == null) { + return null; + } + return "return_value=" + returnedValue; + } + + private static boolean hasPositionalArgumentAfter(RegularArgument newArgument, List arguments) { + // Unpacked arguments have already been excluded, hence every argument is a regular one. + return arguments.stream() + .dropWhile(argument -> argument != newArgument) + .skip(1) + .map(RegularArgument.class::cast) + .anyMatch(argument -> argument.keywordArgument() == null); + } + + /** + * @return the position of the {@code new} parameter for the patching call, or {@code -1} when the callee is not a patching call. + */ + private static int newArgumentPosition(Expression callee, SubscriptionContext ctx) { + if (PATCHER_MATCHER.isTrueFor(callee, ctx)) { + return 1; + } + if (!(callee instanceof QualifiedExpression qualifiedExpression)) { + return -1; + } + Expression qualifier = Expressions.removeParentheses(qualifiedExpression.qualifier()); + String memberName = qualifiedExpression.name().name(); + if (OBJECT_METHOD.equals(memberName) && (PATCHER_MATCHER.isTrueFor(qualifier, ctx) || isMockerPatch(qualifier))) { + return 2; + } + if (PATCH_METHOD.equals(memberName) && isMockerFixture(qualifier)) { + return 1; + } + return -1; + } + + private static boolean isMockerPatch(Expression expression) { + return expression instanceof QualifiedExpression qualifiedExpression + && PATCH_METHOD.equals(qualifiedExpression.name().name()) + && isMockerFixture(Expressions.removeParentheses(qualifiedExpression.qualifier())); + } + + private static boolean isMockerFixture(Expression expression) { + Expression expr = Expressions.removeParentheses(expression); + if (expr instanceof Name name) { + return MOCKER_FIXTURE_NAMES.contains(name.name()) && isFunctionParameter(name.symbolV2()); + } + // Class-based suites often store the fixture on self in setup_method; match by attribute name only. + return expr instanceof QualifiedExpression qualifiedExpression + && Expressions.removeParentheses(qualifiedExpression.qualifier()) instanceof Name qualifier + && "self".equals(qualifier.name()) + && MOCKER_FIXTURE_NAMES.contains(qualifiedExpression.name().name()); + } + + private static boolean isFunctionParameter(@Nullable SymbolV2 symbol) { + return Stream.ofNullable(symbol) + .flatMap(s -> s.usages().stream()) + .anyMatch(usage -> usage.kind() == UsageV2.Kind.PARAMETER); + } + + private static boolean usesItsParameters(LambdaExpression lambda) { + ParameterList parameterList = lambda.parameters(); + if (parameterList == null) { + return false; + } + Predicate isParameterUsage = tree -> tree instanceof Name name && isDeclaredIn(name.symbolV2(), parameterList); + Expression body = lambda.expression(); + return isParameterUsage.test(body) || TreeUtils.hasDescendant(body, isParameterUsage); + } + + private static boolean containsCallExpression(Expression expression) { + return expression instanceof CallExpression + || TreeUtils.hasDescendant(expression, CallExpression.class::isInstance); + } + + /** + * Names bound by an enclosing scope are also parameters, hence the check that the declaration belongs to the given parameter list. + */ + private static boolean isDeclaredIn(@Nullable SymbolV2 symbol, ParameterList parameterList) { + return Stream.ofNullable(symbol) + .flatMap(s -> s.usages().stream()) + .filter(usage -> usage.kind() == UsageV2.Kind.PARAMETER) + .anyMatch(usage -> TreeUtils.firstAncestor(usage.tree(), parameterList::equals) != null); + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9081.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9081.html new file mode 100644 index 000000000..bda3ef460 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9081.html @@ -0,0 +1,78 @@ +

        This rule raises an issue when unittest.mock.patch (or a pytest-mock mocker.patch call) is given a lambda +whose body only returns a value and does not use its parameters.

        +

        In Python, this refers to calls such as:

        +
          +
        • unittest.mock.patch("target", lambda: value) or patch("target", lambda *args: value) when the lambda body does not use + its parameters
        • +
        • Equivalent mocker.patch(...) / session_mocker.patch(...) calls from pytest-mock
        • +
        +

        Why is this an issue?

        +

        When writing tests, patch and mocker.patch often stub a dependency so the code under test receives a fixed value.

        +

        Passing a lambda that only returns a constant is less clear than return_value=. The lambda adds an unnecessary callable, +and the mock no longer supports the usual assertions such as assert_called_once_with. return_value= also stays valid if the +patched function’s signature changes.

        +

        Patching with a lambda that only returns a value

        +
        +with patch("app.api.fetch", lambda: {"ok": True}):
        +    assert call_api()["ok"]
        +
        +

        The lambda never uses its arguments; it only supplies a return value.

        +

        Prefer return_value

        +
        +with patch("app.api.fetch", return_value={"ok": True}):
        +    assert call_api()["ok"]
        +
        +

        return_value= states the intent directly and keeps the mock usable for call assertions.

        +

        This rule does not raise when the lambda uses its parameters, because that expresses custom behavior rather than a constant stub.

        +

        What is the potential impact?

        +

        Lambda-only stubs obscure intent and block standard mock assertions. Tests become harder to maintain when signatures change or when call arguments +need verification.

        +

        How to fix it

        +

        Replace the lambda with return_value= set to the same constant. Keep a lambda (or side_effect) only when the stub must +use call arguments or run custom logic.

        +

        Code examples

        +

        Noncompliant code example

        +
        +from unittest.mock import patch
        +
        +def call_api():
        +    from app.api import fetch
        +    return fetch()
        +
        +def test_call_api_ok():
        +    with patch("app.api.fetch", lambda: {"ok": True}):  # Noncompliant
        +        assert call_api()["ok"]
        +
        +

        Compliant solution

        +
        +from unittest.mock import patch
        +
        +def call_api():
        +    from app.api import fetch
        +    return fetch()
        +
        +def test_call_api_ok():
        +    with patch("app.api.fetch", return_value={"ok": True}):
        +        assert call_api()["ok"]
        +
        +

        Noncompliant code example

        +
        +def test_compute(mocker):
        +    mocker.patch("module.target", lambda x, y: 7)  # Noncompliant
        +    assert compute(1, 2) == 7
        +
        +

        Compliant solution

        +
        +def test_compute(mocker):
        +    mock_target = mocker.patch("module.target", return_value=7)
        +    assert compute(1, 2) == 7
        +    mock_target.assert_called_once_with(1, 2)
        +
        +

        Resources

        +

        Documentation

        + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9081.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9081.json new file mode 100644 index 000000000..7a16c1c00 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9081.json @@ -0,0 +1,24 @@ +{ + "title": "Mocks should use return_value instead of patching with a lambda that only returns a value", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "pytest", + "tests" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-9081", + "sqKey": "S9081", + "scope": "Tests", + "quickfix": "covered", + "code": { + "impacts": { + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "CLEAR" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index bcff46ffc..5a1b831b8 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -388,6 +388,7 @@ "S9077", "S9078", "S9080", + "S9081", "S9083", "S9084", "S9116", diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/MockPatchLambdaReturnValueCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/MockPatchLambdaReturnValueCheckTest.java new file mode 100644 index 000000000..8e0c27cbc --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/MockPatchLambdaReturnValueCheckTest.java @@ -0,0 +1,155 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import org.junit.jupiter.api.Test; +import org.sonar.plugins.python.api.PythonCheck; +import org.sonar.python.checks.quickfix.PythonQuickFixVerifier; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +import static org.assertj.core.api.Assertions.assertThat; + +class MockPatchLambdaReturnValueCheckTest { + + @Test + void scope() { + assertThat(new MockPatchLambdaReturnValueCheck().scope()).isEqualTo(PythonCheck.CheckScope.ALL); + } + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/mockPatchLambdaReturnValue.py", new MockPatchLambdaReturnValueCheck()); + } + + @Test + void quickFixOnPositionalLambda() { + PythonQuickFixVerifier.verify(new MockPatchLambdaReturnValueCheck(), + """ + from unittest.mock import patch + patch("app.api.fetch", lambda: {"ok": True}) + """, + """ + from unittest.mock import patch + patch("app.api.fetch", return_value={"ok": True}) + """); + } + + @Test + void quickFixOnKeywordLambda() { + PythonQuickFixVerifier.verify(new MockPatchLambdaReturnValueCheck(), + """ + from unittest.mock import patch + patch("app.api.fetch", new=lambda *args: 42) + """, + """ + from unittest.mock import patch + patch("app.api.fetch", return_value=42) + """); + } + + @Test + void quickFixOnPatchObject() { + PythonQuickFixVerifier.verify(new MockPatchLambdaReturnValueCheck(), + """ + from unittest.mock import patch + patch.object(Target, "attribute", lambda x, y: 7) + """, + """ + from unittest.mock import patch + patch.object(Target, "attribute", return_value=7) + """); + } + + @Test + void quickFixOnMockerPatch() { + PythonQuickFixVerifier.verify(new MockPatchLambdaReturnValueCheck(), + """ + def test_something(mocker): + mocker.patch("module.target", (lambda: 7)) + """, + """ + def test_something(mocker): + mocker.patch("module.target", return_value=7) + """); + } + + @Test + void quickFixMessage() { + PythonQuickFixVerifier.verifyQuickFixMessages(new MockPatchLambdaReturnValueCheck(), + """ + from unittest.mock import patch + patch("app.api.fetch", lambda: 42) + """, + "Replace this lambda with a \"return_value\" argument"); + } + + @Test + void noQuickFixWhenPositionalArgumentsFollow() { + PythonQuickFixVerifier.verifyNoQuickFixes(new MockPatchLambdaReturnValueCheck(), + """ + from unittest.mock import patch + patch("app.api.fetch", lambda: 42, True) + """); + } + + @Test + void quickFixWithKeywordArgumentAfterLambda() { + PythonQuickFixVerifier.verify(new MockPatchLambdaReturnValueCheck(), + """ + from unittest.mock import patch + patch("app.api.fetch", lambda: 42, autospec=True) + """, + """ + from unittest.mock import patch + patch("app.api.fetch", return_value=42, autospec=True) + """); + } + + @Test + void noQuickFixOnDecorator() { + PythonQuickFixVerifier.verifyNoQuickFixes(new MockPatchLambdaReturnValueCheck(), + """ + from unittest.mock import patch + @patch("app.api.fetch", lambda: 42) + def test_something(): + ... + """); + } + + @Test + void noQuickFixWhenLambdaBodyContainsCall() { + PythonQuickFixVerifier.verifyNoQuickFixes(new MockPatchLambdaReturnValueCheck(), + """ + from unittest.mock import patch + def helper(): + ... + with patch("app.api.fetch", lambda: helper()): + ... + """); + } + + @Test + void noQuickFixOnMultilineLambdaBody() { + PythonQuickFixVerifier.verifyNoQuickFixes(new MockPatchLambdaReturnValueCheck(), + """ + from unittest.mock import patch + patch("app.api.fetch", lambda: { + "ok": True, + }) + """); + } +} diff --git a/python-checks/src/test/resources/checks/tests/mockPatchLambdaReturnValue.py b/python-checks/src/test/resources/checks/tests/mockPatchLambdaReturnValue.py new file mode 100644 index 000000000..7f876efc7 --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/mockPatchLambdaReturnValue.py @@ -0,0 +1,266 @@ +import mock +import unittest.mock +from unittest.mock import patch + + +class Target: + attribute = None + + +def helper(*args, **kwargs): + ... + + +def test_patch_positional_lambda(): + with patch("app.api.fetch", lambda: {"ok": True}): # Noncompliant {{Replace this lambda with a "return_value" argument.}} +# ^^^^^^^^^^^^^^^^^^^^ + helper() + + +def test_patch_keyword_lambda(): + with patch("app.api.fetch", new=lambda: 42): # Noncompliant +# ^^^^^^^^^^ + helper() + + +def test_patch_lambda_with_unused_star_args(): + patch("app.api.fetch", lambda *args: 42) # Noncompliant +# ^^^^^^^^^^^^^^^^ + + +def test_patch_lambda_with_unused_kwargs(): + patch("app.api.fetch", lambda **kwargs: 42) # Noncompliant +# ^^^^^^^^^^^^^^^^^^^ + + +def test_patch_lambda_with_unused_parameters(): + patch("app.api.fetch", lambda x, y: 7) # Noncompliant +# ^^^^^^^^^^^^^^ + + +def test_patch_lambda_with_unused_default_parameter(): + patch("app.api.fetch", lambda x=1: 7) # Noncompliant +# ^^^^^^^^^^^^^ + + +def test_patch_lambda_in_parentheses(): + patch("app.api.fetch", (lambda: 42)) # Noncompliant +# ^^^^^^^^^^ + + +def test_patch_object_positional_lambda(): + patch.object(Target, "attribute", lambda: 42) # Noncompliant +# ^^^^^^^^^^ + + +def test_patch_object_keyword_lambda(): + patch.object(Target, "attribute", new=lambda: 42) # Noncompliant +# ^^^^^^^^^^ + + +def test_fully_qualified_patch(): + unittest.mock.patch("app.api.fetch", lambda: 42) # Noncompliant +# ^^^^^^^^^^ + + +def test_third_party_mock_patch(): + mock.patch("app.api.fetch", lambda: 42) # Noncompliant +# ^^^^^^^^^^ + + +@patch("app.api.fetch", lambda: 42) # Noncompliant +# ^^^^^^^^^^ +def test_patch_as_decorator(mocked): + helper() + + +@patch("app.api.fetch", lambda *args: (helper(), None)) +def test_compliant_decorator_lambda_with_call(mocked): + # return_value= would evaluate the call at decoration time, not on each patch invocation + helper() + + +@patch.object(Target, "attribute", lambda: helper()) +def test_compliant_decorator_object_lambda_with_call(mocked): + helper() + + +def test_patch_lambda_with_call_not_decorator(): + # Non-decorator patches keep the issue even when the body has a call (no quick fix offered) + with patch("app.api.fetch", lambda *args: (helper(), None)): # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + helper() + + +def test_self_mocker_patch(): + class TestX: + def setup_method(self, method, mocker): + self.mocker = mocker + + def test_x(self): + self.mocker.patch("module.target", lambda: 7) # Noncompliant +# ^^^^^^^^^ + + +def test_self_mocker_patch_object(): + class TestX: + def setup_method(self, method, mocker): + self.mocker = mocker + + def test_x(self): + self.mocker.patch.object(Target, "attribute", lambda: 7) # Noncompliant +# ^^^^^^^^^ + + +def test_mocker_patch(mocker): + mocker.patch("module.target", lambda: 7) # Noncompliant +# ^^^^^^^^^ + + +def test_mocker_patch_object(mocker): + mocker.patch.object(Target, "attribute", lambda: 7) # Noncompliant +# ^^^^^^^^^ + + +def test_session_mocker_patch(session_mocker): + session_mocker.patch("module.target", lambda: 7) # Noncompliant +# ^^^^^^^^^ + + +def test_module_mocker_patch(module_mocker): + module_mocker.patch("module.target", lambda: 7) # Noncompliant +# ^^^^^^^^^ + + +def test_class_mocker_patch(class_mocker): + class_mocker.patch("module.target", lambda: 7) # Noncompliant +# ^^^^^^^^^ + + +def test_package_mocker_patch(package_mocker): + package_mocker.patch("module.target", lambda: 7) # Noncompliant +# ^^^^^^^^^ + + +def test_lambda_returning_outer_name(mocker): + sentinel = object() + mocker.patch("module.target", lambda: sentinel) # Noncompliant +# ^^^^^^^^^^^^^^^^ + + +def test_lambda_body_ignoring_its_parameter(mocker): + mocker.patch("module.target", lambda value: helper()) # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^^^ + + +def test_lambda_returning_enclosing_parameter(mocker, expected): + mocker.patch("module.target", lambda value: expected) # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^^^ + + +def test_patch_lambda_with_unused_keyword_only_parameter(): + patch("app.api.fetch", lambda *, value: 7) # Noncompliant +# ^^^^^^^^^^^^^^^^^^ + + +def test_multiline_lambda_body(): + patch("app.api.fetch", lambda: { # Noncompliant +# ^[el=+3;ec=5] + "ok": True, + }) + + +def test_compliant_return_value(): + with patch("app.api.fetch", return_value={"ok": True}): + helper() + + +def test_compliant_lambda_using_parameters(): + patch("app.api.fetch", lambda x, y: x + y) + + +def test_compliant_lambda_using_star_args(): + patch("app.api.fetch", lambda *args: args[0]) + + +def test_compliant_lambda_using_kwargs(): + patch("app.api.fetch", lambda **kwargs: kwargs["value"]) + + +def test_compliant_lambda_using_parameter_in_nested_call(mocker): + mocker.patch("module.target", lambda value: helper(value)) + + +def test_compliant_identity_lambda(): + patch("app.api.fetch", lambda value: value) + + +def test_compliant_lambda_using_keyword_only_parameter(): + patch("app.api.fetch", lambda *, value: value) + + +def test_compliant_side_effect_lambda(): + patch("app.api.fetch", side_effect=lambda: 42) + + +def test_compliant_patch_with_named_function(): + patch("app.api.fetch", helper) + + +def test_compliant_patch_dict(): + patch.dict("app.api.settings", {"a": 1}) + + +def test_compliant_patch_multiple(): + patch.multiple("app.api", fetch=lambda: 42) + + +def test_compliant_patch_with_unpacked_arguments(arguments): + patch("app.api.fetch", *arguments) + + +def test_compliant_mocker_patch_return_value(mocker): + mocker.patch("module.target", return_value=7) + + +def test_compliant_unrelated_receiver(unknown_object): + unknown_object.patch("module.target", lambda: 7) + + +def test_compliant_patch_on_call_result(): + helper().patch("module.target", lambda: 7) + + +def test_compliant_object_on_unrelated_receiver(unknown_object): + unknown_object.object(Target, "attribute", lambda: 7) + + +def test_compliant_object_on_unrelated_patch_owner(): + helper.patch.object(Target, "attribute", lambda: 7) + + +def test_compliant_object_on_unrelated_member(): + helper.other.object(Target, "attribute", lambda: 7) + + +def test_compliant_locally_assigned_mocker(): + mocker = helper + mocker.patch("module.target", lambda: 7) + + +def test_compliant_mocker_aliased_to_local(mocker): + # Accepted FN: local aliases of the mocker fixture are not tracked + m = mocker + m.patch("module.target", lambda: 7) + + +def local_patch(target, new): + ... + + +def test_compliant_locally_defined_patch(): + local_patch("app.api.fetch", lambda: 42) + + +def test_compliant_lambda_as_first_argument(): + helper(lambda: 42) From 88d859b9863352bcd88bcf697cd161b7785f9514 Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Thu, 6 Aug 2026 13:50:59 +0200 Subject: [PATCH 271/322] SONARPY-4473 Added config-uv to build workflow Co-authored-by: rombirli GitOrigin-RevId: 691fab52ac136e7d414671d2433bc4866fccee47 --- pyproject.toml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 pyproject.toml diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 000000000..c64150120 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,4 @@ +[[tool.uv.index]] +name = "repox" +url = "https://repox.jfrog.io/artifactory/api/pypi/sonarsource-pypi/simple" +default = true From 72b897ed7513a3d579073f8440343edd673c35b2 Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Thu, 6 Aug 2026 14:52:17 +0200 Subject: [PATCH 272/322] SONARPY-4472: Create rule S9134: Pydantic field validators should return the validated value GitOrigin-RevId: 02a365e107717b13210b5e3844ebaec0bbb1b20f --- .../python/checks/OpenSourceCheckList.java | 1 + .../PydanticFieldValidatorReturnCheck.java | 212 +++++++++++++++ .../org/sonar/l10n/py/rules/python/S9134.html | 73 +++++ .../org/sonar/l10n/py/rules/python/S9134.json | 26 ++ .../py/rules/python/Sonar_way_profile.json | 3 +- ...PydanticFieldValidatorReturnCheckTest.java | 29 ++ .../checks/pydanticFieldValidatorReturn.py | 254 ++++++++++++++++++ 7 files changed, 597 insertions(+), 1 deletion(-) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/PydanticFieldValidatorReturnCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9134.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9134.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/PydanticFieldValidatorReturnCheckTest.java create mode 100644 python-checks/src/test/resources/checks/pydanticFieldValidatorReturn.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index a1485c7af..8c36c7cb7 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -414,6 +414,7 @@ public Stream> getChecks() { PydanticCoreSerializationFallbackCheck.class, PydanticDataclassRevalidationCheck.class, PydanticDoubleUnderscorePrivateAttributeCheck.class, + PydanticFieldValidatorReturnCheck.class, PydanticJsonSchemaInputTypeWithAfterModeCheck.class, PydanticOptionalFieldDefaultCheck.class, PydanticMultipleInheritanceConfigCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/PydanticFieldValidatorReturnCheck.java b/python-checks/src/main/java/org/sonar/python/checks/PydanticFieldValidatorReturnCheck.java new file mode 100644 index 000000000..19f9773d3 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/PydanticFieldValidatorReturnCheck.java @@ -0,0 +1,212 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import java.util.List; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.cfg.CfgBranchingBlock; +import org.sonar.plugins.python.api.cfg.ControlFlowGraph; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.ClassDef; +import org.sonar.plugins.python.api.tree.Decorator; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.ForStatement; +import org.sonar.plugins.python.api.tree.FunctionDef; +import org.sonar.plugins.python.api.tree.IfStatement; +import org.sonar.plugins.python.api.tree.ReturnStatement; +import org.sonar.plugins.python.api.tree.Statement; +import org.sonar.plugins.python.api.tree.StatementList; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.tree.Tree.Kind; +import org.sonar.plugins.python.api.tree.WhileStatement; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.checks.utils.CheckUtils; +import org.sonar.python.checks.utils.Expressions; + +/** + * Detects Pydantic {@code @field_validator} methods that have a code path without an explicit return value. + * When a field validator does not return a value, Pydantic silently stores {@code None} as the field value, + * violating the field's type contract without raising any error. + */ +@Rule(key = "S9134") +public class PydanticFieldValidatorReturnCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Add a return statement to this Pydantic field validator."; + + /** + * Matches {@code pydantic.functional_validators.field_validator} (direct submodule import): + * {@code from pydantic.functional_validators import field_validator} + * Matches {@code field_validator} re-exported through the {@code pydantic} package root: + * {@code from pydantic import field_validator} + * Uses FQN matching because the pydantic v1 stub does not declare this re-export, + * so the type resolves to {@code UnresolvedImportType[pydantic.field_validator]}. + */ + + private static final TypeMatcher FIELD_VALIDATOR_MATCHER = TypeMatchers.any(TypeMatchers.isType("pydantic.functional_validators.field_validator"), + TypeMatchers.withFQN("pydantic.field_validator")); + + private static final TypeMatcher IS_PYDANTIC_MODEL = TypeMatchers.isOrExtendsType("pydantic.BaseModel"); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Kind.FUNCDEF, PydanticFieldValidatorReturnCheck::checkFunctionDef); + } + + private static void checkFunctionDef(SubscriptionContext ctx) { + FunctionDef functionDef = (FunctionDef) ctx.syntaxNode(); + + if (!hasFieldValidatorDecorator(functionDef, ctx)) { + return; + } + + if (!isInsidePydanticModel(functionDef, ctx)) { + return; + } + + // Skip stub bodies: functions consisting solely of pass or ellipsis statements + if (functionDef.body().statements().stream().allMatch(CheckUtils::isEmptyStatement)) { + return; + } + + var collector = ReturnCheckUtils.ReturnStmtCollector.collect(functionDef); + + // Generators are not field validators in the conventional sense + if (collector.containsYield()) { + return; + } + + // Use the CFG to detect missing return values on any code path reaching the function exit. + ControlFlowGraph cfg = ctx.cfg(functionDef); + if (cfg == null || hasExceptOrFinally(cfg)) { + // CFG unavailable or contains try/except/finally: fall back to simple presence check. + // try/except/finally can produce end-predecessor blocks with empty elements() lists, + // making the CFG traversal unsafe. + if (collector.getReturnStmts().isEmpty() && !collector.raisesExceptions()) { + ctx.addIssue(functionDef.name(), MESSAGE); + } + return; + } + + List endStatements = cfg.end().predecessors().stream() + .map(block -> parentStatement(block.elements().get(block.elements().size() - 1))) + .filter(s -> !s.is(Kind.RAISE_STMT, Kind.ASSERT_STMT, Kind.WITH_STMT) && !isLoopWithReturn(s) && !isIfTruthy(s)) + .toList(); + + // If every path reaching the exit ends with a raise/assert, no issue needed. + if (endStatements.isEmpty()) { + return; + } + + // Check whether any path ends without an explicit return + boolean hasPathWithoutReturnValue = endStatements.stream() + .anyMatch(s -> !isReturnWithValue(s)); + + if (hasPathWithoutReturnValue) { + ctx.addIssue(functionDef.name(), MESSAGE); + } + } + + private static boolean hasFieldValidatorDecorator(FunctionDef functionDef, SubscriptionContext ctx) { + return functionDef.decorators().stream() + .anyMatch(d -> FIELD_VALIDATOR_MATCHER.isTrueFor(getDecoratorFunctionExpression(d), ctx)); + } + + private static Expression getDecoratorFunctionExpression(Decorator decorator) { + Expression expr = decorator.expression(); + if (expr instanceof CallExpression callExpr) { + return callExpr.callee(); + } + return expr; + } + + private static boolean isInsidePydanticModel(FunctionDef functionDef, SubscriptionContext ctx) { + Tree parent = functionDef.parent(); + if (parent != null) { + parent = parent.parent(); + } + if (!(parent instanceof ClassDef classDef)) { + return false; + } + return IS_PYDANTIC_MODEL.isTrueFor(classDef.name(), ctx); + } + + private static boolean isReturnWithValue(Statement statement) { + return statement.is(Kind.RETURN_STMT) && !((ReturnStatement) statement).expressions().isEmpty(); + } + + private static boolean hasExceptOrFinally(ControlFlowGraph cfg) { + return cfg.blocks().stream().anyMatch(block -> + block instanceof CfgBranchingBlock cfgBranchingBlock + && cfgBranchingBlock.branchingTree().is(Kind.EXCEPT_CLAUSE, Kind.FINALLY_CLAUSE)); + } + + /** + * Returns true if the statement is a {@code for} or {@code while} loop whose body contains at + * least one {@code return} statement (not in a nested function). Such loops cause the CFG to + * surface the loop statement itself as an implicit exit predecessor (the "loop exhausted" path), + * which is not a missing-return case when a return exists inside the loop body. + */ + private static boolean isLoopWithReturn(Statement statement) { + StatementList body = null; + if (statement.is(Kind.FOR_STMT)) { + body = ((ForStatement) statement).body(); + } else if (statement.is(Kind.WHILE_STMT)) { + body = ((WhileStatement) statement).body(); + } + if (body == null) { + return false; + } + return bodyContainsReturn(body); + } + + /** + * Returns true if the given tree contains a {@code return} statement that is not + * nested inside a nested function definition or lambda. + */ + private static boolean bodyContainsReturn(Tree tree) { + if (tree.is(Kind.RETURN_STMT)) { + return true; + } + if (tree.is(Kind.FUNCDEF, Kind.LAMBDA)) { + return false; + } + return tree.children().stream().anyMatch(PydanticFieldValidatorReturnCheck::bodyContainsReturn); + } + + /** + * Returns true if the statement is an {@code if True:} (or equivalent always-truthy condition) + * with no else branch. Such conditions cause the CFG to surface the {@code IF_STMT} itself as + * an implicit exit predecessor when the body always returns, which is not a missing-return case. + */ + private static boolean isIfTruthy(Statement statement) { + if (!statement.is(Kind.IF_STMT)) { + return false; + } + IfStatement ifStatement = (IfStatement) statement; + return ifStatement.elseBranch() == null && Expressions.isTruthy(ifStatement.condition()); + } + + private static Statement parentStatement(Tree tree) { + while (!(tree instanceof Statement)) { + tree = tree.parent(); + } + return (Statement) tree; + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9134.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9134.html new file mode 100644 index 000000000..7eac6592c --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9134.html @@ -0,0 +1,73 @@ +

        This rule raises an issue when a data validation method that is expected to transform or validate field values has a code path that does not +explicitly return a value.

        +

        In Python, this specifically applies to Pydantic’s field_validator decorator methods.

        +

        Why is this an issue?

        +

        In data validation frameworks, validation methods are functions or methods (marked by framework-specific decorators or annotations) that validate +and optionally transform field values during object construction. These frameworks use the validator’s return value as the final field value.

        +

        When a validation method does not explicitly return a value, the language runtime implicitly returns a null/None value. The framework then stores +this null/None as the field value, regardless of the field’s type annotation or declaration. This happens silently - no error is raised, no warning is +emitted, and the object appears to construct successfully.

        +

        This creates a silent data corruption bug. A field declared as string, integer, or any other non-nullable type will contain null/None at runtime, +violating its type contract without any indication to the caller.

        +

        The issue commonly occurs in two scenarios:

        +
          +
        • Forgotten return statement: The developer modifies the value in place but forgets to return it.
        • +
        • Conditional validation: The validator raises an exception for invalid values but forgets to return the value on the valid code + path.
        • +
        +

        Because the bug is silent at construction time, it only surfaces later when code that relies on the correct type encounters the unexpected +null/None value.

        +

        What is the potential impact?

        +

        Data Corruption

        +

        Fields that should never be null silently become null, breaking the data model’s integrity. Downstream code that trusts the type declaration will +fail or produce incorrect results.

        +

        For example, a name field declared as a non-nullable string type might become null, causing string operations to raise type-related +errors or conditional checks to behave incorrectly.

        +

        Schema Violations

        +

        When serializing the model using standard serialization methods, fields will be serialized as null instead of their expected types. +This breaks API contracts, database constraints, and data interchange formats.

        +

        External systems receiving this data may reject it or, worse, accept it and propagate the corruption.

        +

        Difficult Debugging

        +

        Because no exception is raised during model construction, the bug manifests far from its source. You might see failures in:

        +
          +
        • Database operations when inserting NULL into non-nullable columns
        • +
        • API responses that violate OpenAPI schemas
        • +
        • Business logic that expects valid data types
        • +
        +

        Tracing these failures back to the missing return statement in a validator can be time-consuming.

        +

        In Python with Pydantic, this specifically occurs when using model_dump() or model_dump_json() serialization methods.

        +

        How to fix it

        +

        Always explicitly return the validated value from a field_validator method. If you modify the value, return the modified version. If +you only validate without transformation, return the original value.

        +

        Code examples

        +

        Noncompliant code example

        +
        +from pydantic import BaseModel, field_validator
        +
        +class UserModel(BaseModel):
        +    name: str
        +
        +    @field_validator("name")
        +    @classmethod
        +    def clean_name(cls, v):
        +        v = v.lower().strip()  # Noncompliant
        +
        +

        Compliant solution

        +
        +from pydantic import BaseModel, field_validator
        +
        +class UserModel(BaseModel):
        +    name: str
        +
        +    @field_validator("name")
        +    @classmethod
        +    def clean_name(cls, v):
        +        return v.lower().strip()
        +
        +

        Resources

        +

        Documentation

        + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9134.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9134.json new file mode 100644 index 000000000..cfd9fd638 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9134.json @@ -0,0 +1,26 @@ +{ + "title": "Pydantic field validators should return the validated value", + "type": "BUG", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "pydantic", + "pitfall", + "type-system" + ], + "defaultSeverity": "Critical", + "ruleSpecification": "RSPEC-9134", + "sqKey": "S9134", + "scope": "All", + "quickfix": "unknown", + "code": { + "impacts": { + "RELIABILITY": "HIGH", + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "LOGICAL" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 5a1b831b8..0965a8c19 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -392,6 +392,7 @@ "S9083", "S9084", "S9116", - "S9117" + "S9117", + "S9134" ] } diff --git a/python-checks/src/test/java/org/sonar/python/checks/PydanticFieldValidatorReturnCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/PydanticFieldValidatorReturnCheckTest.java new file mode 100644 index 000000000..415ae4031 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/PydanticFieldValidatorReturnCheckTest.java @@ -0,0 +1,29 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks; + +import org.junit.jupiter.api.Test; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +class PydanticFieldValidatorReturnCheckTest { + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/pydanticFieldValidatorReturn.py", new PydanticFieldValidatorReturnCheck()); + } + +} diff --git a/python-checks/src/test/resources/checks/pydanticFieldValidatorReturn.py b/python-checks/src/test/resources/checks/pydanticFieldValidatorReturn.py new file mode 100644 index 000000000..a82196433 --- /dev/null +++ b/python-checks/src/test/resources/checks/pydanticFieldValidatorReturn.py @@ -0,0 +1,254 @@ +from pydantic import BaseModel, field_validator +from pydantic.functional_validators import field_validator as fv_direct + + +class UserModel(BaseModel): + name: str + + @field_validator("name") + @classmethod + def clean_name(cls, v): # Noncompliant {{Add a return statement to this Pydantic field validator.}} + # ^^^^^^^^^^ + v = v.lower().strip() + + +class UserModel2(BaseModel): + name: str + + @field_validator("name") + @classmethod + def validate_name(cls, v): # Noncompliant {{Add a return statement to this Pydantic field validator.}} + if len(v) < 2: + raise ValueError("Name too short") + # Missing return v on the valid path + + +class EmptyReturn(BaseModel): + a: str + b: str + + @field_validator("a", "b") + @classmethod + def validate_fields(cls, v): # Noncompliant {{Add a return statement to this Pydantic field validator.}} + return + + +class MultiFieldModel(BaseModel): + a: str + b: str + + @field_validator("a", "b") + @classmethod + def validate_fields(cls, v): # Noncompliant {{Add a return statement to this Pydantic field validator.}} + v = v.strip() + + +class AliasedImportNoncompliant(BaseModel): + name: str + + @fv_direct("name") + @classmethod + def transform_name(cls, v): # Noncompliant {{Add a return statement to this Pydantic field validator.}} + v = v.upper() + +# for loop: no return at all — must still be flagged +class NoncompliantForLoopNoReturn(BaseModel): + name: str + + @field_validator("name") + @classmethod + def validate_name(cls, v): # Noncompliant {{Add a return statement to this Pydantic field validator.}} + for char in v: + print(char) + +# for loop: no return at all — must still be flagged +class NoncompliantWhileLoopNoReturn(BaseModel): + name: str + + @field_validator("name") + @classmethod + def validate_name(cls, v): # Noncompliant {{Add a return statement to this Pydantic field validator.}} + while v: + print(char) + +class CompliantModel(BaseModel): + name: str + + @field_validator("name") + @classmethod + def clean_name(cls, v): + return v.lower().strip() + + +class CompliantConditional(BaseModel): + name: str + + @field_validator("name") + @classmethod + def validate_name(cls, v): + if len(v) < 2: + raise ValueError("Name too short") + return v + + +class CompliantConditionalBothBranches(BaseModel): + name: str + + @field_validator("name") + @classmethod + def validate_name(cls, v): + if v.startswith("Dr."): + return v + else: + return v.title() + + +class CompliantAlwaysRaises(BaseModel): + name: str + + @field_validator("name") + @classmethod + def validate_name(cls, v): + raise NotImplementedError("Not supported") + + +class CompliantAliasImport(BaseModel): + name: str + + @fv_direct("name") + @classmethod + def clean_name(cls, v): + return v.lower() + + +class CompliantPassBody(BaseModel): + name: str + + @field_validator("name") + @classmethod + def validate_name(cls, v): + pass + + +class CompliantEllipsisBody(BaseModel): + name: str + + @field_validator("name") + @classmethod + def validate_name(cls, v): + ... + + + + +# Non-BaseModel class should not be flagged even with pydantic decorator +class PlainClass: + name: str + + @fv_direct("name") + @classmethod + def clean_name(cls, v): + v = v.lower() + + +class CompliantYield(BaseModel): + name: str + + @field_validator("name") + @classmethod + def validate_name(cls, v): + yield v + + +# with-statement: the WITH_STMT is an end-predecessor in CFG — must not produce a false positive +class CompliantWithStatement(BaseModel): + name: str + + @field_validator("name") + @classmethod + def validate_name(cls, v): + with open("/dev/null") as f: + return f.read() or v + + +# while loop with return inside: the WHILE_STMT is an end-predecessor in CFG — must not produce a false positive +class CompliantWhileLoop(BaseModel): + name: str + + @field_validator("name") + @classmethod + def validate_name(cls, v): + while something: + return v.strip() + +class CompliantIfTrue(BaseModel): + name: str + + @field_validator("name") + @classmethod + def validate_name(cls, v): + if True: + return v.strip() + + +# try/except: CFG falls back to simple check; no return AND raises → not flagged (always raises on both paths) +class CompliantTryExceptAlwaysRaises(BaseModel): + name: str + + @field_validator("name") + @classmethod + def validate_name(cls, v): + try: + int(v) + except ValueError: + raise ValueError("Not a number") + raise ValueError("Should not be a number") + + +# try/except: CFG falls back; has an explicit return → not flagged +class CompliantTryExceptWithReturn(BaseModel): + name: str + + @field_validator("name") + @classmethod + def validate_name(cls, v): + try: + return v.strip() + except Exception: + raise ValueError("Unexpected error") + + + +def not_in_model(): + name: str + + @field_validator("name") + @classmethod + def validate_name(cls, v): + v.strip() + +# A locally-defined field_validator function (not pydantic) should not be flagged +def my_field_validator(*fields, **kwargs): + pass + +class NotPydanticFieldValidator(BaseModel): + name: str + + @my_field_validator("name") + @classmethod + def clean_name(cls, v): + v = v.lower() + + +# for loop: return inside loop — must not produce a false positive +class CompliantForLoopReturn(BaseModel): + name: str + + @field_validator("name") + @classmethod + def validate_name(cls, v): + for char in v: + return char + + + From 740ddbca56632fc2b36362b59999de569ec5dbe7 Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Thu, 6 Aug 2026 14:57:41 +0200 Subject: [PATCH 273/322] SONARPY-4461 Broaden S5778 safe-call exclusions for numpy/scipy helpers GitOrigin-RevId: 0f4a1ff6e67cdc45e4043b5a92245db9816a1068 --- ...SingleInvocationRuntimeExceptionCheck.java | 8 +- .../tests/singleInvocationRuntimeException.py | 141 ++++++++++++++++++ .../api/types/v2/matchers/TypeMatchers.java | 21 +++ .../matchers/HasFQNSatisfyingPredicate.java | 44 ++++++ .../HasFQNSatisfyingPredicateTest.java | 73 +++++++++ 5 files changed, 286 insertions(+), 1 deletion(-) create mode 100644 python-frontend/src/main/java/org/sonar/python/types/v2/matchers/HasFQNSatisfyingPredicate.java create mode 100644 python-frontend/src/test/java/org/sonar/python/types/v2/matchers/HasFQNSatisfyingPredicateTest.java diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheck.java index d36161ccd..6c29d638f 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheck.java @@ -97,7 +97,13 @@ public class SingleInvocationRuntimeExceptionCheck extends PythonSubscriptionChe TypeMatchers.isType("uuid.uuid5"), TypeMatchers.isType("uuid.uuid6"), TypeMatchers.isType("uuid.uuid7"), - TypeMatchers.isType("uuid.uuid8")); + TypeMatchers.isType("uuid.uuid8"), + TypeMatchers.isType("copy.copy"), + TypeMatchers.isType("copy.deepcopy"), + // NumPy/SciPy lack stubs → UnresolvedImportType; withFQNPrefix covers factories/helpers + // (zeros, random, copy, legendre, …) used as nested setup in exception assertions. + TypeMatchers.withFQNPrefix("numpy."), + TypeMatchers.withFQNPrefix("scipy.")); /** * Constructors that are safe only without arguments (with args they commonly raise TypeError). diff --git a/python-checks/src/test/resources/checks/tests/singleInvocationRuntimeException.py b/python-checks/src/test/resources/checks/tests/singleInvocationRuntimeException.py index 82dee77e1..a79274aaf 100644 --- a/python-checks/src/test/resources/checks/tests/singleInvocationRuntimeException.py +++ b/python-checks/src/test/resources/checks/tests/singleInvocationRuntimeException.py @@ -1,9 +1,14 @@ +import copy import unittest import uuid from pathlib import Path from uuid import UUID, uuid4 +import numpy as np import pytest +from numpy import eye, identity, ones, zeros +from numpy.polynomial.legendre import legval +from scipy.special import legendre def get_item(): @@ -145,6 +150,135 @@ def test_pytest_with_uuid_constructor(): do_work(UUID(int=0)) +def test_pytest_with_numpy_zeros(): + with pytest.raises(ValueError): + do_work(np.zeros(3)) + + +def test_pytest_with_numpy_ones(): + with pytest.raises(ValueError): + do_work(ones((2, 2))) + + +def test_pytest_with_numpy_identity(): + with pytest.raises(ValueError): + do_work(identity(3)) + + +def test_pytest_with_numpy_eye(): + with pytest.raises(ValueError): + do_work(eye(3)) + + +def test_pytest_with_numpy_empty(): + with pytest.raises(ValueError): + do_work(np.empty(2)) + + +def test_pytest_with_numpy_full(): + with pytest.raises(ValueError): + do_work(np.full(2, 0)) + + +def test_pytest_with_numpy_zeros_like(): + with pytest.raises(ValueError): + do_work(np.zeros_like([1, 2])) + + +def test_pytest_with_numpy_ones_like(): + with pytest.raises(ValueError): + do_work(np.ones_like([1, 2])) + + +def test_pytest_with_numpy_empty_like(): + with pytest.raises(ValueError): + do_work(np.empty_like([1, 2])) + + +def test_pytest_with_numpy_full_like(): + with pytest.raises(ValueError): + do_work(np.full_like([1, 2], 0)) + + +def test_pytest_with_numpy_array(): + with pytest.raises(ValueError): + do_work(np.array([1, 2])) + + +def test_pytest_with_numpy_asarray(): + with pytest.raises(ValueError): + do_work(np.asarray([1, 2])) + + +def test_pytest_with_numpy_arange(): + with pytest.raises(ValueError): + do_work(np.arange(3)) + + +def test_pytest_with_numpy_linspace(): + with pytest.raises(ValueError): + do_work(np.linspace(0, 1, 5)) + + +def test_pytest_with_numpy_random_randn(): + with pytest.raises(ValueError): + do_work(np.random.randn(2, 2)) + + +def test_pytest_with_numpy_random_random(): + with pytest.raises(ValueError): + do_work(np.random.random((2, 2))) + + +def test_pytest_with_numpy_random_rand(): + with pytest.raises(ValueError): + do_work(np.random.rand(2, 2)) + + +def test_pytest_with_numpy_random_randint(): + with pytest.raises(ValueError): + do_work(np.random.randint(0, 10, size=3)) + + +def test_pytest_with_numpy_random_default_rng(): + with pytest.raises(ValueError): + do_work(np.random.default_rng(0)) + + +def test_pytest_with_numpy_random_state(): + with pytest.raises(ValueError): + do_work(np.random.RandomState(0)) + + +def test_pytest_with_numpy_copy(): + with pytest.raises(ValueError): + do_work(np.copy([1, 2])) + + +def test_pytest_with_numpy_legendre(): + with pytest.raises(ValueError): + do_work(legval(0.5, [1, 0, 1])) + + +def test_pytest_with_scipy_legendre(): + with pytest.raises(ValueError): + do_work(legendre(3)) + + +def test_pytest_with_copy_copy(): + with pytest.raises(ValueError): + do_work(copy.copy([1, 2])) + + +def test_pytest_with_copy_deepcopy(): + with pytest.raises(ValueError): + do_work(copy.deepcopy([1, 2])) + + +def test_pytest_direct_lambda_with_numpy_zeros(): + pytest.raises(ValueError, lambda: do_work(zeros(3))) + + def test_pytest_with_len_and_repr(): with pytest.raises(ValueError): do_work(len(repr(1))) @@ -228,6 +362,13 @@ def test_unittest_with_uuid(self): with self.assertRaises(ValueError): do_work(uuid.uuid4()) + def test_unittest_with_numpy_zeros(self): + with self.assertRaises(ValueError): + do_work(np.zeros(3)) + + def test_unittest_lambda_with_numpy_ones(self): + self.assertRaises(ValueError, lambda: do_work(ones(3))) + def test_unittest_lambda(self): self.assertRaises(ValueError, lambda: get_item().process()) # Noncompliant {{Refactor this exception test to have only one invocation possibly throwing an exception.}} # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/matchers/TypeMatchers.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/matchers/TypeMatchers.java index 77b2705e9..30d191583 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/matchers/TypeMatchers.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/types/v2/matchers/TypeMatchers.java @@ -19,11 +19,14 @@ import com.google.common.annotations.VisibleForTesting; import java.util.Arrays; import java.util.List; +import java.util.function.Function; import java.util.stream.Stream; +import org.sonar.plugins.python.api.TriBool; import org.sonar.plugins.python.api.types.v2.TypeSource; import org.sonar.python.types.v2.matchers.AllTypePredicate; import org.sonar.python.types.v2.matchers.AnyTypePredicate; import org.sonar.python.types.v2.matchers.HasFQNPredicate; +import org.sonar.python.types.v2.matchers.HasFQNSatisfyingPredicate; import org.sonar.python.types.v2.matchers.HasMemberPredicate; import org.sonar.python.types.v2.matchers.HasMemberSatisfyingPredicate; import org.sonar.python.types.v2.matchers.IsFunctionOwnerSatisfyingPredicate; @@ -82,6 +85,24 @@ public static TypeMatcher withFQN(String fqn) { return new TypeMatcherImpl(new HasFQNPredicate(fqn)); } + /** + * Matches types whose FQN satisfies {@code fqnPredicate}. Prefer {@link #isType(String)} when + * stubs exist; FQN-based matching is a fallback for unresolved third-party imports. + */ + public static TypeMatcher withFQNSatisfying(Function fqnPredicate) { + return new TypeMatcherImpl(new HasFQNSatisfyingPredicate(fqnPredicate)); + } + + /** + * Matches types whose FQN starts with {@code fqnPrefix}. Prefer a trailing {@code '.'} + * (e.g. {@code "numpy."}) so sibling modules like {@code numpyish} are not matched. + * Prefer {@link #isType(String)} when stubs exist; FQN-based matching is a fallback for + * unresolved third-party imports. + */ + public static TypeMatcher withFQNPrefix(String fqnPrefix) { + return withFQNSatisfying(typeFqn -> typeFqn.startsWith(fqnPrefix) ? TriBool.TRUE : TriBool.FALSE); + } + public static TypeMatcher isObjectSatisfying(TypeMatcher matcher) { TypePredicate predicate = getTypePredicate(matcher); return new TypeMatcherImpl(new IsObjectSatisfyingPredicate(predicate)); diff --git a/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/HasFQNSatisfyingPredicate.java b/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/HasFQNSatisfyingPredicate.java new file mode 100644 index 000000000..98496c5ba --- /dev/null +++ b/python-frontend/src/main/java/org/sonar/python/types/v2/matchers/HasFQNSatisfyingPredicate.java @@ -0,0 +1,44 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.types.v2.matchers; + +import java.util.Optional; +import java.util.function.Function; +import org.sonar.plugins.python.api.TriBool; +import org.sonar.plugins.python.api.types.v2.FullyQualifiedNameHelper; +import org.sonar.plugins.python.api.types.v2.PythonType; + +/** + * Matches types whose FQN satisfies the given predicate. + * Prefer convenience factories such as {@code TypeMatchers.withFQNPrefix} when applicable. + */ +public class HasFQNSatisfyingPredicate implements TypePredicate { + + private final Function fqnPredicate; + + public HasFQNSatisfyingPredicate(Function fqnPredicate) { + this.fqnPredicate = fqnPredicate; + } + + @Override + public TriBool check(PythonType type, TypePredicateContext ctx) { + return Optional.of(type) + .flatMap(FullyQualifiedNameHelper::getFullyQualifiedName) + .map(fqnPredicate) + .orElse(TriBool.UNKNOWN); + } +} diff --git a/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/HasFQNSatisfyingPredicateTest.java b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/HasFQNSatisfyingPredicateTest.java new file mode 100644 index 000000000..df46e0eca --- /dev/null +++ b/python-frontend/src/test/java/org/sonar/python/types/v2/matchers/HasFQNSatisfyingPredicateTest.java @@ -0,0 +1,73 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.types.v2.matchers; + +import org.junit.jupiter.api.Test; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.TriBool; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.types.v2.FunctionType; +import org.sonar.plugins.python.api.types.v2.UnknownType; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.semantic.v2.typetable.TypeTable; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +class HasFQNSatisfyingPredicateTest { + + @Test + void testCheck() { + FunctionType numpyZeros = mock(FunctionType.class); + FunctionType numpyRandom = mock(FunctionType.class); + FunctionType other = mock(FunctionType.class); + FunctionType nullFqn = mock(FunctionType.class); + UnknownType.UnresolvedImportType unresolvedNumpy = mock(UnknownType.UnresolvedImportType.class); + UnknownType.UnresolvedImportType unresolvedOther = mock(UnknownType.UnresolvedImportType.class); + UnknownType.UnknownTypeImpl unknownType = mock(UnknownType.UnknownTypeImpl.class); + + when(numpyZeros.fullyQualifiedName()).thenReturn("numpy.zeros"); + when(numpyRandom.fullyQualifiedName()).thenReturn("numpy.random.randn"); + when(other.fullyQualifiedName()).thenReturn("pandas.Series"); + when(nullFqn.fullyQualifiedName()).thenReturn(null); + when(unresolvedNumpy.importPath()).thenReturn("numpy.polynomial.legendre.legval"); + when(unresolvedOther.importPath()).thenReturn("numpyish.zeros"); + + Expression numpyZerosExpr = mock(Expression.class); + when(numpyZerosExpr.typeV2()).thenReturn(numpyZeros); + + HasFQNSatisfyingPredicate predicate = new HasFQNSatisfyingPredicate( + typeFqn -> typeFqn.startsWith("numpy.") ? TriBool.TRUE : TriBool.FALSE); + TypePredicateContext predicateContext = TypePredicateContext.of(mock(TypeTable.class)); + SubscriptionContext subscriptionContext = mock(SubscriptionContext.class); + + assertThat(predicate.check(numpyZeros, predicateContext)).isEqualTo(TriBool.TRUE); + assertThat(predicate.check(numpyRandom, predicateContext)).isEqualTo(TriBool.TRUE); + assertThat(predicate.check(unresolvedNumpy, predicateContext)).isEqualTo(TriBool.TRUE); + assertThat(predicate.check(other, predicateContext)).isEqualTo(TriBool.FALSE); + assertThat(predicate.check(unresolvedOther, predicateContext)).isEqualTo(TriBool.FALSE); + assertThat(predicate.check(nullFqn, predicateContext)).isEqualTo(TriBool.UNKNOWN); + assertThat(predicate.check(unknownType, predicateContext)).isEqualTo(TriBool.UNKNOWN); + + assertThat(TypeMatchers.withFQNPrefix("numpy.").evaluateFor(numpyZerosExpr, subscriptionContext)) + .isEqualTo(TriBool.TRUE); + assertThat(TypeMatchers.withFQNSatisfying(typeFqn -> typeFqn.contains("zeros") ? TriBool.TRUE : TriBool.FALSE) + .evaluateFor(numpyZerosExpr, subscriptionContext)) + .isEqualTo(TriBool.TRUE); + } +} From 683b3e06b8c862b08846af643b17ed41ede62686 Mon Sep 17 00:00:00 2001 From: zglicz Date: Thu, 6 Aug 2026 17:08:45 +0200 Subject: [PATCH 274/322] SONARPY-4332 Parse Python version ranges GitOrigin-RevId: 95edb0bd538da205124f67f66b1fdecd8d7d81d3 --- .../plugins/python/PythonExtensions.java | 2 +- .../sonar/plugins/python/PythonSensor.java | 2 +- .../sonar/plugins/python/IPynbSensorTest.java | 16 ++ .../plugins/python/PythonSensorTest.java | 14 ++ .../api/PythonVersionSpecifierParser.java | 184 ++++++++++++++++++ .../python/api/PythonVersionUtils.java | 30 ++- .../python/api/PythonVersionUtilsTest.java | 66 ++++++- 7 files changed, 310 insertions(+), 4 deletions(-) create mode 100644 python-frontend/src/main/java/org/sonar/plugins/python/api/PythonVersionSpecifierParser.java diff --git a/python-commons/src/main/java/org/sonar/plugins/python/PythonExtensions.java b/python-commons/src/main/java/org/sonar/plugins/python/PythonExtensions.java index 307e6f7dd..a9f4efa22 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/PythonExtensions.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/PythonExtensions.java @@ -241,7 +241,7 @@ private static PropertyDefinition buildPythonVersion() { return PropertyDefinition.builder(PYTHON_VERSION_KEY) .index(12) .name("Python versions") - .description("Comma-separated list of Python versions this project is compatible with.") + .description("Comma-separated list of Python versions or version specifiers this project is compatible with.") .multiValues(true) .category(PYTHON_CATEGORY) .subCategory(GENERAL) diff --git a/python-commons/src/main/java/org/sonar/plugins/python/PythonSensor.java b/python-commons/src/main/java/org/sonar/plugins/python/PythonSensor.java index 1c63c6892..d4af5276a 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/PythonSensor.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/PythonSensor.java @@ -87,7 +87,7 @@ public final class PythonSensor implements Sensor { private static final Logger LOG = LoggerFactory.getLogger(PythonSensor.class); static final String UNSET_VERSION_WARNING = """ Your code is analyzed as compatible with all Python 3 versions by default. \ - You can get a more precise analysis by setting the exact Python version in your configuration via the parameter "sonar.python.version"\ + You can get a more precise analysis by setting the Python version or version range in your configuration via the parameter "sonar.python.version"\ """; private final SensorTelemetryStorage sensorTelemetryStorage; diff --git a/python-commons/src/test/java/org/sonar/plugins/python/IPynbSensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/IPynbSensorTest.java index 8e77155ef..bc683d4fc 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/IPynbSensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/IPynbSensorTest.java @@ -183,6 +183,22 @@ void test_python_version_parameter() { assertThat(ProjectPythonVersion.currentVersions()).containsExactly(PythonVersionUtils.MAX_SUPPORTED_VERSION); } + @Test + void test_python_version_range_parameter() { + context.setRuntime(SONARLINT_RUNTIME); + + PythonInputFile inputFile = inputFile(FILE_1); + activeRules = new ActiveRulesBuilder().build(); + context.setSettings(new MapSettings().setProperty("sonar.python.version", ">=3.10,<3.12")); + PythonIndexer pythonIndexer = pythonIndexer(List.of(inputFile)); + + sensor(pythonIndexer).execute(context); + + assertThat(ProjectPythonVersion.currentVersions()).containsExactly( + PythonVersionUtils.Version.V_310, + PythonVersionUtils.Version.V_311); + } + private IPynbSensor notebookSensor() { FileLinesContextFactory fileLinesContextFactory = mock(FileLinesContextFactory.class); FileLinesContext fileLinesContext = mock(FileLinesContext.class); diff --git a/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java index c952e6c48..ad3f707da 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java @@ -963,6 +963,20 @@ void test_python_version_parameter_no_warning() { verify(analysisWarning, times(0)).addUnique(PythonSensor.UNSET_VERSION_WARNING); } + @Test + void test_python_version_range_parameter() { + context.fileSystem().add(inputFile(FILE_1).wrappedFile()); + activeRules = new ActiveRulesBuilder().build(); + + context.setSettings(new MapSettings().setProperty("sonar.python.version", ">=3.10,<3.12")); + sensor().execute(context); + + assertThat(ProjectPythonVersion.currentVersions()).containsExactly( + PythonVersionUtils.Version.V_310, + PythonVersionUtils.Version.V_311); + assertThat(logTester.logs(Level.WARN)).doesNotContain(PythonSensor.UNSET_VERSION_WARNING); + } + void setup_typing_concise_rule(String pythonVersion) { context.fileSystem().add(inputFile("python-version/typing.py").wrappedFile()); diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonVersionSpecifierParser.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonVersionSpecifierParser.java new file mode 100644 index 000000000..9c0b60731 --- /dev/null +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonVersionSpecifierParser.java @@ -0,0 +1,184 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.plugins.python.api; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.EnumSet; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.sonar.plugins.python.api.PythonVersionUtils.Version; + +final class PythonVersionSpecifierParser { + + private static final Pattern VERSION_SPECIFIER_PATTERN = Pattern.compile( + "^(<=|>=|==|!=|~=|<|>|\\^)\\s*(\\d+)(?:\\.(\\d+))?(?:\\.(\\d+))?(\\.\\*)?$"); + + private PythonVersionSpecifierParser() { + } + + static boolean containsVersionSpecifier(String[] versions) { + return Arrays.stream(versions) + .map(String::trim) + .filter(value -> !value.isEmpty()) + .map(value -> value.charAt(0)) + .anyMatch(character -> "<>=!~^".indexOf(character) >= 0); + } + + static Optional> parse(String[] values) { + List specifiers = new ArrayList<>(); + for (String value : values) { + Optional specifier = VersionSpecifier.parse(value.trim()); + if (specifier.isEmpty()) { + return Optional.empty(); + } + specifiers.add(specifier.get()); + } + + Set matchingVersions = EnumSet.noneOf(Version.class); + for (Version version : Version.values()) { + if (matchesAll(specifiers, VersionLine.from(version))) { + matchingVersions.add(version); + } + } + return Optional.of(matchingVersions); + } + + private static boolean matchesAll(List specifiers, VersionLine version) { + return specifiers.stream().allMatch(specifier -> specifier.matches(version)); + } + + private enum SpecifierOperator { + LESS_THAN, + LESS_THAN_OR_EQUAL, + GREATER_THAN, + GREATER_THAN_OR_EQUAL, + EQUAL, + NOT_EQUAL, + COMPATIBLE, + CARET; + + private static Optional fromString(String value) { + return Optional.ofNullable(switch (value) { + case "<" -> LESS_THAN; + case "<=" -> LESS_THAN_OR_EQUAL; + case ">" -> GREATER_THAN; + case ">=" -> GREATER_THAN_OR_EQUAL; + case "==" -> EQUAL; + case "!=" -> NOT_EQUAL; + case "~=" -> COMPATIBLE; + case "^" -> CARET; + default -> null; + }); + } + } + + private record VersionSpecifier( + SpecifierOperator operator, + VersionLine version, + int precision, + boolean wildcard, + Optional upperBound) { + + private static Optional parse(String value) { + Matcher matcher = VERSION_SPECIFIER_PATTERN.matcher(value); + if (!matcher.matches()) { + return Optional.empty(); + } + Optional parsedOperator = SpecifierOperator.fromString(matcher.group(1)); + if (parsedOperator.isEmpty()) { + return Optional.empty(); + } + SpecifierOperator operator = parsedOperator.get(); + try { + int major = Integer.parseInt(matcher.group(2)); + int minor = matcher.group(3) == null ? 0 : Integer.parseInt(matcher.group(3)); + int precision; + if (matcher.group(4) != null) { + precision = 3; + } else if (matcher.group(3) != null) { + precision = 2; + } else { + precision = 1; + } + boolean wildcard = matcher.group(5) != null; + boolean wildcardWithUnsupportedOperator = wildcard + && operator != SpecifierOperator.EQUAL + && operator != SpecifierOperator.NOT_EQUAL; + boolean compatibleReleaseWithoutMinor = operator == SpecifierOperator.COMPATIBLE + && precision < 2; + if (wildcardWithUnsupportedOperator || compatibleReleaseWithoutMinor) { + return Optional.empty(); + } + VersionLine version = new VersionLine(major, minor); + Optional upperBound = upperBound(operator, major, minor, precision); + return Optional.of(new VersionSpecifier(operator, version, precision, wildcard, upperBound)); + } catch (NumberFormatException e) { + return Optional.empty(); + } + } + + private static Optional upperBound(SpecifierOperator operator, int major, int minor, int precision) { + if (operator == SpecifierOperator.COMPATIBLE) { + // Precision 1 is rejected during parsing, so only minor and patch precision remain. + return Optional.of(precision == 2 + ? new VersionLine(major + 1, 0) + : new VersionLine(major, minor + 1)); + } + if (operator == SpecifierOperator.CARET) { + return Optional.of(new VersionLine(major + 1, 0)); + } + return Optional.empty(); + } + + private boolean matches(VersionLine candidate) { + int comparison = candidate.compareTo(version); + return switch (operator) { + case LESS_THAN -> comparison < 0; + case LESS_THAN_OR_EQUAL -> comparison <= 0; + case GREATER_THAN -> comparison > 0; + case GREATER_THAN_OR_EQUAL -> comparison >= 0; + case EQUAL -> matchesEquality(candidate); + case NOT_EQUAL -> !matchesEquality(candidate); + case COMPATIBLE, CARET -> comparison >= 0 && candidate.compareTo(upperBound.orElseThrow()) < 0; + }; + } + + private boolean matchesEquality(VersionLine candidate) { + if (wildcard && precision == 1) { + return candidate.major() == version.major(); + } + return candidate.major() == version.major() && candidate.minor() == version.minor(); + } + } + + private record VersionLine(int major, int minor) implements Comparable { + + private static VersionLine from(Version version) { + return new VersionLine(version.major(), version.minor()); + } + + @Override + public int compareTo(VersionLine other) { + int majorComparison = Integer.compare(major, other.major); + return majorComparison == 0 ? Integer.compare(minor, other.minor) : majorComparison; + } + } +} diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonVersionUtils.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonVersionUtils.java index ecff21c02..4ddb92788 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonVersionUtils.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonVersionUtils.java @@ -16,8 +16,10 @@ */ package org.sonar.plugins.python.api; +import java.util.Arrays; import java.util.EnumSet; import java.util.Map; +import java.util.Optional; import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -113,6 +115,28 @@ public static Set fromStringArray(String[] versions) { if (versions.length == 0) { return allVersions(); } + if (PythonVersionSpecifierParser.containsVersionSpecifier(versions)) { + return fromVersionSpecifiers(versions); + } + return fromExactVersions(versions); + } + + private static Set fromVersionSpecifiers(String[] versions) { + String propertyValue = String.join(",", Arrays.stream(versions).map(String::trim).toArray(String[]::new)); + Optional> parsedVersions = PythonVersionSpecifierParser.parse(versions); + if (parsedVersions.isEmpty()) { + logErrorMessage(propertyValue); + return allVersions(); + } + Set matchingVersions = parsedVersions.get(); + if (matchingVersions.isEmpty()) { + logWarningNoMatchingRange(propertyValue); + return allVersions(); + } + return matchingVersions; + } + + private static Set fromExactVersions(String[] versions) { Set pythonVersions = EnumSet.noneOf(Version.class); for (String versionValue : versions) { versionValue = versionValue.trim(); @@ -178,7 +202,7 @@ public static boolean areSourcePythonVersionsGreaterOrEqualThan(Set sou private static void logErrorMessage(String propertyValue) { LOG.warn( - "Error while parsing value of parameter '{}' ({}). Versions must be specified as MAJOR_VERSION.MINOR_VERSION (e.g. \"3.7, 3.8\")", + "Error while parsing value of parameter '{}' ({}). Use comma-separated Python versions (e.g. \"3.10,3.11\") or numeric version specifiers (e.g. \">=3.10,<3.13\").", PYTHON_VERSION_KEY, propertyValue); } @@ -190,4 +214,8 @@ private static void logWarningGuessVersion(String propertyValue, Version guessed private static void logWarningPython2(String propertyValue) { LOG.warn("No explicit support for version {}. Support for Python versions prior to 3 is deprecated.", propertyValue); } + + private static void logWarningNoMatchingRange(String propertyValue) { + LOG.warn("No supported Python version matches version range {}. Analysis will target all supported Python versions.", propertyValue); + } } diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/PythonVersionUtilsTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/PythonVersionUtilsTest.java index ca88d3143..ded0e5411 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/PythonVersionUtilsTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/PythonVersionUtilsTest.java @@ -20,6 +20,8 @@ import java.util.Set; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import org.slf4j.event.Level; import org.sonar.api.testfixtures.log.LogTesterJUnit5; @@ -72,11 +74,73 @@ void bugfix_versions() { assertThat(PythonVersionUtils.fromString("3.12.1")).containsExactlyInAnyOrder(V_312); } + @Test + void comparison_specifiers() { + assertThat(PythonVersionUtils.fromString(">=3.10")).containsExactly(V_310, V_311, V_312, V_313, V_314); + assertThat(PythonVersionUtils.fromString(">3.10")).containsExactly(V_311, V_312, V_313, V_314); + assertThat(PythonVersionUtils.fromString(">=3,<=3.10")).containsExactly(V_38, V_39, V_310); + assertThat(PythonVersionUtils.fromString(">=3,<3.10")).containsExactly(V_38, V_39); + assertThat(PythonVersionUtils.fromString(">=3.10.1,<3.12.4")).containsExactly(V_310, V_311); + assertThat(PythonVersionUtils.fromString("<3.12")).containsExactly(V_38, V_39, V_310, V_311); + assertThat(PythonVersionUtils.fromString(">=2.7,<3.12")).containsExactly(V_38, V_39, V_310, V_311); + assertThat(PythonVersionUtils.fromString(" >= 3.9 , < 3.12 ")).containsExactly(V_39, V_310, V_311); + } + + @Test + void equality_and_exclusion_specifiers() { + assertThat(PythonVersionUtils.fromString("==3.11")).containsExactly(V_311); + assertThat(PythonVersionUtils.fromString("==3.*")).hasSameElementsAs(allVersions); + assertThat(PythonVersionUtils.fromString("==3.11.*")).containsExactly(V_311); + assertThat(PythonVersionUtils.fromString("==3.11.4")).containsExactly(V_311); + assertThat(PythonVersionUtils.fromString("!=3.11")).containsExactly(V_38, V_39, V_310, V_312, V_313, V_314); + assertThat(PythonVersionUtils.fromString(">=3,!=3.11")).containsExactly(V_38, V_39, V_310, V_312, V_313, V_314); + assertThat(PythonVersionUtils.fromString(">=3,!=3.11.*")).containsExactly(V_38, V_39, V_310, V_312, V_313, V_314); + } + + @Test + void compatible_and_poetry_specifiers() { + assertThat(PythonVersionUtils.fromString("~=3.10")).containsExactly(V_310, V_311, V_312, V_313, V_314); + assertThat(PythonVersionUtils.fromString("~=3.10.1")).containsExactly(V_310); + assertThat(PythonVersionUtils.fromString("^3.10")).containsExactly(V_310, V_311, V_312, V_313, V_314); + assertThat(PythonVersionUtils.fromString("^3.10.1")).containsExactly(V_310, V_311, V_312, V_313, V_314); + } + + @Test + void ranges_without_supported_versions_fall_back_to_all_versions() { + assertThat(PythonVersionUtils.fromString(">=3.15")).hasSameElementsAs(allVersions); + assertThat(logTester.logs(Level.WARN)) + .contains("No supported Python version matches version range >=3.15. Analysis will target all supported Python versions."); + + assertThat(PythonVersionUtils.fromString(">=3,<3.8")).hasSameElementsAs(allVersions); + assertThat(logTester.logs(Level.WARN)) + .contains("No supported Python version matches version range >=3,<3.8. Analysis will target all supported Python versions."); + } + + @Test + void contradictory_or_unsupported_ranges_fall_back_to_all_versions() { + assertThat(PythonVersionUtils.fromString(">=3.12,<3.11")).hasSameElementsAs(allVersions); + assertThat(logTester.logs(Level.WARN)) + .contains("No supported Python version matches version range >=3.12,<3.11. Analysis will target all supported Python versions."); + + assertThat(PythonVersionUtils.fromString("<3")).hasSameElementsAs(allVersions); + assertThat(logTester.logs(Level.WARN)) + .contains("No supported Python version matches version range <3. Analysis will target all supported Python versions."); + } + + @ParameterizedTest + @ValueSource(strings = {"3.10,>=3.11", "~=3", "~3.10", "===3.10", ">=3.10rc1", "^3.10 || ^3.11", ">=3.10.*", "==foo"}) + void unsupported_range_syntax(String value) { + assertThat(PythonVersionUtils.fromString(value)).hasSameElementsAs(allVersions); + assertThat(logTester.logs(Level.WARN)) + .contains("Error while parsing value of parameter 'sonar.python.version' (" + value + + "). Use comma-separated Python versions (e.g. \"3.10,3.11\") or numeric version specifiers (e.g. \">=3.10,<3.13\")."); + } + @Test void error_while_parsing_version() { assertThat(PythonVersionUtils.fromString("foo")).hasSameElementsAs(allVersions); assertThat(logTester.logs(Level.WARN)) - .contains("Error while parsing value of parameter 'sonar.python.version' (foo). Versions must be specified as MAJOR_VERSION.MINOR_VERSION (e.g. \"3.7, 3.8\")"); + .contains("Error while parsing value of parameter 'sonar.python.version' (foo). Use comma-separated Python versions (e.g. \"3.10,3.11\") or numeric version specifiers (e.g. \">=3.10,<3.13\")."); } @Test From 0c1190456fbd03d5fbb9be7d00166a7e60c28777 Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Fri, 7 Aug 2026 10:06:22 +0200 Subject: [PATCH 275/322] SONARPY-4452 Update RSPEC before 5.28 release GitOrigin-RevId: 84ebe120327da9bf5ab343a3e99469161e9b74b2 --- .../org/sonar/l10n/py/rules/python/S3415.html | 79 +++++++++---------- .../org/sonar/l10n/py/rules/python/S3415.json | 4 +- .../org/sonar/l10n/py/rules/python/S5778.html | 40 +++++----- .../org/sonar/l10n/py/rules/python/S5958.html | 6 +- .../org/sonar/l10n/py/rules/python/S8997.html | 24 ------ .../org/sonar/l10n/py/rules/python/S9134.html | 11 +-- .../org/sonar/l10n/py/rules/python/S9134.json | 2 +- sonarpedia.json | 2 +- 8 files changed, 70 insertions(+), 98 deletions(-) diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S3415.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S3415.html index 02562eafd..4d91d49e7 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S3415.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S3415.html @@ -1,32 +1,36 @@ -

        This rule raises an issue when the expected and actual values in an assertion appear to be inverted with respect to the testing framework’s -convention.

        +

        This rule raises an issue when a test file mixes both assertion argument-order conventions: some assertions put the actual value first, and others +put the expected value first.

        Why is this an issue?

        -

        Assertions are statements that check whether certain conditions are true. They validate that the actual results of a code snippet match the -expected outcomes. By using assertions, developers can ensure that their code behaves as intended and identify potential bugs or issues early in the -development process.

        -

        Python testing frameworks follow a convention for where expected and actual values should appear in assertions:

        +

        Assertions check that the code under test produces the expected results. When you write an equality assertion, one operand is the value from the +code under test (the actual value) and the other is what you expect (the expected value).

        +

        Python testing frameworks commonly recommend putting the expected value second (the actual value first):

          -
        • In unittest, methods like assertEqual() and assertIs() compare two values passed as arguments. The - documentation commonly shows the value from the code under test first and the expected value second, for example self.assertEqual(s.split(), - ['hello', 'world']). For consistency with that convention, place the actual value first and the expected value second.
        • -
        • In pytest, assertions should place the actual value on the left side and the expected value on the right side. The right-hand side - should be a literal or an identifier that represents the expected value, optionally wrapped in a helper such as pytest.approx(), rather - than a computation.
        • -
        • In assertpy, fluent assertions should place the actual value in assert_that(…​) and the expected value in the - assertion method, such as .is_equal_to(…​).
        • +
        • In unittest, methods like assertEqual() and assertIs() take the actual value first and the expected value + second, for example self.assertEqual(s.split(), ['hello', 'world']).
        • +
        • In pytest, equality assertions place the actual value on the left and the expected value on the right, for example assert + result == 42. Helpers such as pytest.approx() wrap the expected value on the right-hand side.
        • +
        • In assertpy, fluent assertions place the actual value in assert_that(…​) and the expected value in the assertion + method, such as .is_equal_to(…​).
        -

        In all of these assertion styles, the value produced by the code under test comes first and the expected value comes second. Keeping each value in -the position expected by the assertion style makes the intent easier to understand and helps readers interpret failures more quickly.

        -

        Additionally, following each framework’s assertion conventions makes tests more consistent with the surrounding code and easier to read.

        +

        This rule does not enforce that framework default. It does not raise when a file consistently uses a different order, including when every +assertion puts the expected value first. It raises only when the same file mixes both orders: readers must then re-interpret each assertion, and +failure messages become harder to scan.

        +

        The rule reports at most one issue per file. The primary location is the first assertion whose order can be determined. Two data flows group every +order-determinable assertion in the file: one for actual-first usages and one for expected-first usages.

        +

        A true positive is a file that mixes both orders among assertions whose operands can be classified. Using an order other than the framework’s +documented default is fine as long as the file is consistent. Mid-migration inconsistency is still a true positive; finish unifying or temporarily +suppress the issue until the file is consistent. A false positive would mean the analyzer misclassified an operand (for example, treating a +non-constant expression as expected, or the reverse), so the reported "mix" is not real.

        What is the potential impact?

        -

        Having the expected value and the actual value in the wrong order will not alter the outcome of tests (they will still succeed or fail -appropriately). However, the error messages will contain misleading information, making debugging more difficult.

        -

        For example, if you write self.assertEqual(0, runner.exit_code) where runner.exit_code is -1, the failure is -reported as 0 != -1. The message does not explicitly identify one value as expected and the other as actual, but following a consistent -convention still makes assertions easier to read and understand.

        -

        How to fix it in unittest

        -

        Swap the order of the assertion arguments so that the actual value (from the code under test) is passed as the first argument and the expected -value is passed as the second argument.

        +

        Mixing conventions does not change whether tests pass or fail. It does make failures harder to read and slows down reviews, because each assertion +must be interpreted individually instead of following one file-wide pattern.

        +

        For example, if one test writes self.assertEqual(runner.exit_code, 0) and another in the same file writes self.assertEqual(0, +runner.exit_code), both may be correct in isolation, but the file no longer has a single readable convention.

        +

        How to fix it

        +

        Unify the file so every order-determinable assertion follows the same convention. Prefer picking one convention for the whole file and swapping the +operands of the assertions that use the other convention.

        +

        Quick fixes can rewrite every mismatched assertion in the file in either direction: put all expected values second (actual first), or put all +actual values second (expected first).

        Code examples

        Noncompliant code example

        @@ -35,7 +39,8 @@ 

        Noncompliant code example

        class TestRunner(unittest.TestCase): def test_exit_code(self): runner = Runner() - self.assertEqual(0, runner.exit_code, "Unexpected exit code") # Noncompliant + self.assertEqual(0, runner.exit_code) # Noncompliant; file mixes both orders + self.assertEqual(runner.name, "ok")

        Compliant solution

        @@ -44,13 +49,9 @@ 

        Compliant solution

        class TestRunner(unittest.TestCase): def test_exit_code(self): runner = Runner() - self.assertEqual(runner.exit_code, 0, "Unexpected exit code") + self.assertEqual(runner.exit_code, 0) + self.assertEqual(runner.name, "ok")
        -

        How to fix it in pytest

        -

        In pytest, place the actual value on the left side of the assertion and the expected value on the right side. The right-hand side should be limited -to a literal or an identifier representing the expected value, including when using helpers such as pytest.approx(), rather than an -expression that computes the value.

        -

        Code examples

        Noncompliant code example

         import pytest
        @@ -59,8 +60,8 @@ 

        Noncompliant code example

        def test_calculation(): result = perform_calculation() - assert 3.14 == result # Noncompliant - assert pytest.approx(EXPECTED_PI) == result # Noncompliant + assert 3.14 == result # Noncompliant; file mixes both orders + assert result == pytest.approx(EXPECTED_PI)

        Compliant solution

        @@ -73,10 +74,6 @@ 

        Compliant solution

        assert result == 3.14 assert result == pytest.approx(EXPECTED_PI)
        -

        How to fix it in assertpy

        -

        In assertpy, place the actual value from the code under test in assert_that(…​) and pass the expected value to the -assertion method.

        -

        Code examples

        Noncompliant code example

         from assertpy import assert_that
        @@ -85,7 +82,8 @@ 

        Noncompliant code example

        def test_exit_code(): runner = Runner() - assert_that(EXPECTED_EXIT_CODE).is_equal_to(runner.exit_code) # Noncompliant + assert_that(EXPECTED_EXIT_CODE).is_equal_to(runner.exit_code) # Noncompliant; file mixes both orders + assert_that(runner.name).is_equal_to("ok")

        Compliant solution

        @@ -96,11 +94,12 @@ 

        Compliant solution

        def test_exit_code(): runner = Runner() assert_that(runner.exit_code).is_equal_to(EXPECTED_EXIT_CODE) + assert_that(runner.name).is_equal_to("ok")

        Resources

        Documentation

        diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S3415.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S3415.json index 98da952cc..708852e87 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S3415.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S3415.json @@ -1,5 +1,5 @@ { - "title": "Assertion arguments should be passed in the correct order", + "title": "Assertion argument order should be consistent within a file", "type": "CODE_SMELL", "code": { "impacts": { @@ -20,5 +20,5 @@ "ruleSpecification": "RSPEC-3415", "sqKey": "S3415", "scope": "Tests", - "quickfix": "unknown" + "quickfix": "partial" } diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5778.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5778.html index dd23db20e..e5ffa8f31 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5778.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5778.html @@ -1,14 +1,14 @@ -

        When testing code that should raise an exception, having multiple method calls in the tested code makes it unclear which call is expected to raise +

        This rule raises an issue when a test for an expected exception contains multiple method calls, making it unclear which call is expected to raise the exception.

        Why is this an issue?

        When writing tests for exception handling, clarity is essential. If you chain multiple method calls within the code being tested for an exception, it becomes ambiguous which specific call is expected to raise that exception.

        -

        For example, consider this code:

        +

        For example, both parse_payment(payload) and normalize() could raise a ValueError:

        -pytest.raises(IndexError, lambda: get_item().process())
        +with pytest.raises(ValueError):
        +    parse_payment(payload).normalize()
         
        -

        Here, both get_item() and process() could potentially raise an IndexError. The test does not make it -explicit which method is expected to raise the exception. This ambiguity makes the test harder to read and maintain.

        +

        The test does not make it explicit which method is expected to raise the exception. This ambiguity makes the test harder to read and maintain.

        By isolating the method call you want to test, you make your test explicit and unambiguous. This improves readability and maintainability, and makes your test suite a better specification of expected behavior.

        What is the potential impact?

        @@ -27,19 +27,18 @@

        Noncompliant code example

         import pytest
         
        -def test_process():
        -    # Which method raises the exception: get_item() or process()?
        -    with pytest.raises(IndexError):  # Noncompliant
        -        get_item().process()
        +def test_normalize_rejects_negative_amount():
        +    with pytest.raises(ValueError):  # Noncompliant
        +        parse_payment(payload).normalize()
         

        Compliant solution

         import pytest
         
        -def test_process():
        -    item = get_item()
        -    with pytest.raises(IndexError):
        -        item.process()
        +def test_normalize_rejects_negative_amount():
        +    payment = parse_payment(payload)
        +    with pytest.raises(ValueError):
        +        payment.normalize()
         

        How to fix it in unittest

        When using unittest’s assertRaises() method, extract intermediate method calls before the assertion. This makes it clear which @@ -49,19 +48,18 @@

        Noncompliant code example

         import unittest
         
        -class TestMyCode(unittest.TestCase):
        -    def test_process(self):
        -        # Which method raises the exception: get_item() or process()?
        -        self.assertRaises(IndexError, lambda: get_item().process())  # Noncompliant
        +class TestPayment(unittest.TestCase):
        +    def test_normalize_rejects_negative_amount(self):
        +        self.assertRaises(ValueError, lambda: parse_payment(payload).normalize())  # Noncompliant
         

        Compliant solution

         import unittest
         
        -class TestMyCode(unittest.TestCase):
        -    def test_process(self):
        -        item = get_item()
        -        self.assertRaises(IndexError, item.process)
        +class TestPayment(unittest.TestCase):
        +    def test_normalize_rejects_negative_amount(self):
        +        payment = parse_payment(payload)
        +        self.assertRaises(ValueError, payment.normalize)
         

        Resources

        Documentation

        diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5958.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5958.html index 844c55b95..f09a4ab79 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5958.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S5958.html @@ -64,12 +64,16 @@

        Compliant solution

        if 'api_key' not in data: raise InvalidConfigError('api_key', 'Missing required field') -def test_missing_config(): +def test_missing_config_type(): with pytest.raises(InvalidConfigError) as exc_info: load_config({}) assert exc_info.value.field == 'api_key' assert 'Missing required field' in str(exc_info.value) + +def test_missing_config_match(): + with pytest.raises(Exception, match="Missing required field"): + load_config({})

        How to fix it in unittest

        With unittest, use assertRaises() with a specific exception type, or assertRaisesRegex() when you want to verify the diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8997.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8997.html index e3ebbf2fd..51b7a8993 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8997.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S8997.html @@ -88,30 +88,6 @@

        Compliant solution

        assert myapp.is_feature_enabled()
      -

      Noncompliant code example

      -
      -import myapp.client
      -
      -def test_notify_user():
      -    client = myapp.client.Client()
      -    original_send = client.send
      -    client.send = lambda message: {"sent": True}  # Noncompliant
      -
      -    result = client.notify("Hello")
      -
      -    assert result["sent"]
      -    client.send = original_send
      -
      -

      Compliant solution

      -
      -def test_notify_user(monkeypatch):
      -    client = myapp.client.Client()
      -    monkeypatch.setattr(client, "send", lambda message: {"sent": True})
      -
      -    result = client.notify("Hello")
      -
      -    assert result["sent"]
      -

      Resources

      Documentation

        diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9134.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9134.html index 7eac6592c..c953b3c69 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9134.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9134.html @@ -24,16 +24,12 @@

        Data Corruption

        For example, a name field declared as a non-nullable string type might become null, causing string operations to raise type-related errors or conditional checks to behave incorrectly.

        Schema Violations

        -

        When serializing the model using standard serialization methods, fields will be serialized as null instead of their expected types. +

        When serializing the model using standard serialization methods, fields will be serialized as None instead of their expected types. This breaks API contracts, database constraints, and data interchange formats.

        External systems receiving this data may reject it or, worse, accept it and propagate the corruption.

        Difficult Debugging

        -

        Because no exception is raised during model construction, the bug manifests far from its source. You might see failures in:

        -
          -
        • Database operations when inserting NULL into non-nullable columns
        • -
        • API responses that violate OpenAPI schemas
        • -
        • Business logic that expects valid data types
        • -
        +

        Because no exception is raised during model construction, the bug manifests far from its source. You might see failures in business logic that +expects valid data types.

        Tracing these failures back to the missing return statement in a validator can be time-consuming.

        In Python with Pydantic, this specifically occurs when using model_dump() or model_dump_json() serialization methods.

        How to fix it

        @@ -68,6 +64,5 @@

        Resources

        Documentation

        diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9134.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9134.json index cfd9fd638..0aee500d1 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9134.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9134.json @@ -1,5 +1,5 @@ { - "title": "Pydantic field validators should return the validated value", + "title": "Pydantic field validators should explicitly return the validated value", "type": "BUG", "status": "ready", "remediation": { diff --git a/sonarpedia.json b/sonarpedia.json index a5d2016c3..c2576db55 100644 --- a/sonarpedia.json +++ b/sonarpedia.json @@ -3,7 +3,7 @@ "languages": [ "PY" ], - "latest-update": "2026-07-30T09:33:13.877146Z", + "latest-update": "2026-08-07T06:02:02.110618Z", "options": { "no-language-in-filenames": true, "preserve-filenames": true From b03677ba7e6b233a86c16a8eb361f52cb5e2e449 Mon Sep 17 00:00:00 2001 From: "hashicorp-vault-sonar-prod[bot]" <111297361+hashicorp-vault-sonar-prod[bot]@users.noreply.github.com> Date: Fri, 7 Aug 2026 12:19:18 +0200 Subject: [PATCH 276/322] SONARPY-4484 Prepare for next development iteration Co-authored-by: joke1196 <6317721+joke1196@users.noreply.github.com> GitOrigin-RevId: 863405ef654e93455d68d3fbc72cca8008aba52d --- docs/pom.xml | 2 +- docs/python-custom-rules-example/pom.xml | 2 +- its/commons/pom.xml | 2 +- its/plugin/it-python-plugin-test/pom.xml | 2 +- its/plugin/pom.xml | 2 +- its/plugin/python-custom-rules-plugin/pom.xml | 2 +- its/pom.xml | 2 +- pom.xml | 2 +- python-checks-testkit/pom.xml | 2 +- python-checks/pom.xml | 2 +- python-commons/pom.xml | 2 +- python-frontend/pom.xml | 2 +- sonar-python-plugin/pom.xml | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/pom.xml b/docs/pom.xml index 006ad5f1d..69e5b63e3 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.python python - 5.28-SNAPSHOT + 5.29-SNAPSHOT docs diff --git a/docs/python-custom-rules-example/pom.xml b/docs/python-custom-rules-example/pom.xml index 85615adc4..4a2f1ac0b 100644 --- a/docs/python-custom-rules-example/pom.xml +++ b/docs/python-custom-rules-example/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python docs - 5.28-SNAPSHOT + 5.29-SNAPSHOT python-custom-rules-example diff --git a/its/commons/pom.xml b/its/commons/pom.xml index 35b74f1b0..9fb0999e7 100644 --- a/its/commons/pom.xml +++ b/its/commons/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python python-its - 5.28-SNAPSHOT + 5.29-SNAPSHOT Python :: ITs :: Commons diff --git a/its/plugin/it-python-plugin-test/pom.xml b/its/plugin/it-python-plugin-test/pom.xml index 6ad0f28a7..f49252c2c 100644 --- a/its/plugin/it-python-plugin-test/pom.xml +++ b/its/plugin/it-python-plugin-test/pom.xml @@ -7,7 +7,7 @@ it-python-plugin org.sonarsource.python - 5.28-SNAPSHOT + 5.29-SNAPSHOT it-python-plugin-test diff --git a/its/plugin/pom.xml b/its/plugin/pom.xml index 8b96993ae..ec09b4db8 100644 --- a/its/plugin/pom.xml +++ b/its/plugin/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.python python-its - 5.28-SNAPSHOT + 5.29-SNAPSHOT diff --git a/its/plugin/python-custom-rules-plugin/pom.xml b/its/plugin/python-custom-rules-plugin/pom.xml index a73879834..35b946339 100644 --- a/its/plugin/python-custom-rules-plugin/pom.xml +++ b/its/plugin/python-custom-rules-plugin/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python it-python-plugin - 5.28-SNAPSHOT + 5.29-SNAPSHOT python-custom-rules-plugin diff --git a/its/pom.xml b/its/pom.xml index f46759ac4..4eaa56aab 100644 --- a/its/pom.xml +++ b/its/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.python python - 5.28-SNAPSHOT + 5.29-SNAPSHOT python-its diff --git a/pom.xml b/pom.xml index b42fa3ecc..e6505dd7f 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ org.sonarsource.python python - 5.28-SNAPSHOT + 5.29-SNAPSHOT pom Python diff --git a/python-checks-testkit/pom.xml b/python-checks-testkit/pom.xml index 82081d563..76e240f1e 100644 --- a/python-checks-testkit/pom.xml +++ b/python-checks-testkit/pom.xml @@ -6,7 +6,7 @@ python org.sonarsource.python - 5.28-SNAPSHOT + 5.29-SNAPSHOT python-checks-testkit diff --git a/python-checks/pom.xml b/python-checks/pom.xml index 043fe7b76..a838b401b 100644 --- a/python-checks/pom.xml +++ b/python-checks/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.python python - 5.28-SNAPSHOT + 5.29-SNAPSHOT python-checks diff --git a/python-commons/pom.xml b/python-commons/pom.xml index d0447948e..4b807f834 100644 --- a/python-commons/pom.xml +++ b/python-commons/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python python - 5.28-SNAPSHOT + 5.29-SNAPSHOT python-commons diff --git a/python-frontend/pom.xml b/python-frontend/pom.xml index 104294470..0058df28f 100644 --- a/python-frontend/pom.xml +++ b/python-frontend/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python python - 5.28-SNAPSHOT + 5.29-SNAPSHOT python-frontend diff --git a/sonar-python-plugin/pom.xml b/sonar-python-plugin/pom.xml index edff9d29f..554541fe4 100644 --- a/sonar-python-plugin/pom.xml +++ b/sonar-python-plugin/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python python - 5.28-SNAPSHOT + 5.29-SNAPSHOT sonar-python-plugin From 4f949f18fa14f57405727e3457077b5c03a79d99 Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Fri, 7 Aug 2026 13:55:16 +0200 Subject: [PATCH 277/322] SONARPY-4479 Whitelisting import to protect user privacy GitOrigin-RevId: b307730166ef22d2d6a5c34a7de76122b15b8fff --- .../collectors/ImportsTelemetryCollector.java | 91 +++++++++++++++++-- .../plugins/python/PythonSensorTest.java | 6 +- .../ImportsTelemetryCollectorTest.java | 10 +- 3 files changed, 87 insertions(+), 20 deletions(-) diff --git a/python-commons/src/main/java/org/sonar/plugins/python/telemetry/collectors/ImportsTelemetryCollector.java b/python-commons/src/main/java/org/sonar/plugins/python/telemetry/collectors/ImportsTelemetryCollector.java index dd008a34b..2f14d6c21 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/telemetry/collectors/ImportsTelemetryCollector.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/telemetry/collectors/ImportsTelemetryCollector.java @@ -34,14 +34,90 @@ */ public class ImportsTelemetryCollector { - private static final int NAME_LENGTH_LIMIT = 100; + private static final Set PYTHON_STDLIB_MODULES = Set.of( + "os", "json", "datetime", "typing", "logging", "sys", "re", "time", "pathlib", + "collections", "dataclasses", "uuid", "enum", "urllib", "functools", "io", + "argparse", "base64", "contextlib", "asyncio", "subprocess", "hashlib", + "tempfile", "threading", "importlib", "math", "abc", "shutil", "traceback", + "random", "copy", "types", "csv", "concurrent", "decimal", "itertools", "inspect", + "socket", "http", "secrets", "warnings", "string", "zipfile", "ast", "zoneinfo", + "glob", "xml", "html", "contextvars", "signal", "hmac", "email", "operator", "ssl", + "unicodedata", "gzip", "multiprocessing", "calendar", "textwrap", "pickle", + "platform", "struct", "queue", "ipaddress", "statistics", "pprint", "difflib", + "mimetypes", "gc", "binascii", "sqlite3", "smtplib", "fnmatch", "atexit", + "configparser", "shlex", "getpass", "stat", "builtins", "zlib", "pkgutil", + "tarfile", "ctypes", "codecs", "errno", "timeit", "locale", "tkinter", + "tracemalloc", "socketserver", "getopt", "optparse", "filecmp", "ftplib", + "imaplib", "xmlrpc", "wsgiref", "colorsys", "pdb", "tomllib", "pydoc", "ntpath", + "sysconfig", "faulthandler", "site", "msvcrt", "curses", "cprofile", "-future-", + "unittest"); + + private static final Set PYTHON_PYPI_MODULES = Set.of( + "pytest", "requests", "pydantic", "boto3", "fastapi", "pandas", "numpy", "yaml", + "dotenv", "httpx", "sqlalchemy", "starlette", "pydantic-settings", "dateutil", + "google", "jwt", "uvicorn", "azure", "cryptography", "opentelemetry", "pytz", + "redis", "urllib3", "flask", "pil", "pyspark", "openpyxl", "psycopg2", "jinja2", + "aiohttp", "typing-extensions", "openai", "tenacity", "structlog", "matplotlib", + "sentry-sdk", "setuptools", "alembic", "sklearn", "scipy", "moto", "django", + "aws-lambda-powertools", "bs4", "click", "pymongo", "jsonschema", "loguru", + "langchain-core", "psutil", "celery", "tqdm", "cachetools", "werkzeug", + "prometheus-client", "rest-framework", "pyarrow", "pydantic-core", "freezegun", + "lxml", "airflow", "rich", "snowflake", "torch", "docx", "pytest-asyncio", + "psycopg", "jose", "pythonjsonlogger", "typer", "bson", "pyodbc", "paramiko", + "plotly", "mcp", "apscheduler", "pendulum", "pypdf", "langgraph", "databricks", + "polars", "msal", "faker", "langchain-openai", "googleapiclient", "orjson", + "cv2", "ddtrace", "playwright", "fitz", "anthropic", "asyncpg", "reportlab", + "confluent-kafka", "streamlit", "docker", "langchain-community", "deepdiff", + "xgboost", "unidecode", "datadog", "motor", "pika", "github", "kombu", "stripe", + "pypdf2", "hypothesis", "colorama", "firebase-admin", "qrcode", + "prometheus-fastapi-instrumentator", "ldclient", "pycountry", "pydantic-ai", + "flask-wtf", "pandera", "markupsafe", "croniter", "aiobotocore", + "langchain-text-splitters", "magic", "aiokafka", "geopandas", "oracledb", "nltk", + "onnxruntime", "psycopg-pool", "rest-framework-simplejwt", "aws-xray-sdk", + "oauthlib", "pyotp", "tensorflow", "statsmodels", "holidays", "s3fs", "pdf2image", + "sqlglot", "attr", "omegaconf", "pytesseract", "decouple", "gevent", + "requests-aws4auth", "aws-lambda-typing", "fakeredis", "retry", "twilio", + "langchain-aws", "pgvector", "chardet", "dns", "tomli", "mypy-boto3-dynamodb", + "spacy", "requests-oauthlib", "hvac", "fpdf", "functions-framework", "aio-pika", + "aiocache", "dj-database-url", "schedule", "ujson", "invoke", "keyring", + "pypdfium2", "langchain-anthropic", "gnupg", "langsmith", "watchdog", + "simple-salesforce", "simple-history", "asgi-correlation-id", "async-lru", + "redshift-connector", "datadog-api-client", "uvloop", "markdownify", "langdetect", + "faiss", "websocket", "pg8000", "pynamodb", "geoalchemy2", "tldextract", + "coverage", "atlassian", "ulid", "flask-caching", "minio", "feedparser", + "levenshtein", "mypy-boto3-secretsmanager", "jmespath", "channels", "dateparser", + "pygments", "optuna", "dlt", "langchain-mcp-adapters", "debugpy", "numba", + "msgpack", "pydantic-extra-types", "oauth2client", "attrs", "pysftp", "xarray", + "chromadb", "flask-limiter", "argon2", "wtforms", "json-repair", "opencensus", + "mongoengine", "mypy-boto3-ssm", "nh3", "slack-bolt", "llama-index", "prefect", + "tornado", "vcr", "pdfkit", "aiosqlite", "docxtpl", "slack", "graphviz", + "mongomock", "ray", "deepeval", "pyathena", "aws-msk-iam-sasl-signer", + "importlib-metadata", "gcsfs", "assertpy", "docutils", "markitdown", "pip", + "inflection", "timezonefinder", "office365", "voluptuous", "pulumi", "tzlocal", + "rq", "valkey", "deltalake", "avro", "datadog-lambda", "prettytable", + "webdriver-manager", "django-redis", "strenum", "allure", "colorlog", "opik", + "nacl", "pikepdf", "cfnresponse", "flask-session", "rasterio", "sympy", "pydub", + "pydicom", "ipywidgets", "textual", "uuid-extensions", "keras", "beanie", + "mypy-boto3-sns", "flask-jwt-extended", "hamcrest", "python-http-client", + "httpcore", "pillow-heif", "pyparsing", "unleashclient", "altair", + "starlette-context", "fire", "posthog", "xlwings", "aws-requests-auth", + "botocore", "awsglue", "mshell-python-core", "regex", "urllib2"); + + private static final Set WHITELIST; + + static { + WHITELIST = new HashSet<>(PYTHON_STDLIB_MODULES); + WHITELIST.addAll(PYTHON_PYPI_MODULES); + } private final Set importedModules = ConcurrentHashMap.newKeySet(); public void collect(FileInput rootTree) { var visitor = new CollectorVisitor(); rootTree.accept(visitor); - importedModules.addAll(visitor.getCollected()); + Set collected = visitor.getCollected(); + collected.retainAll(WHITELIST); + importedModules.addAll(collected); } public ImportsTelemetry getTelemetry() { @@ -57,7 +133,7 @@ public void visitImportName(ImportName importName) { for (AliasedName aliasedName : importName.modules()) { List names = aliasedName.dottedName().names(); if (!names.isEmpty()) { - addIfShortEnough(names.get(0).name()); + addNormalized(names.get(0).name()); } } super.visitImportName(importName); @@ -78,17 +154,14 @@ public void visitImportFrom(ImportFrom importFrom) { // Collect the top-level module name — works for both regular and wildcard imports List names = importFrom.module().names(); if (!names.isEmpty()) { - addIfShortEnough(names.get(0).name()); + addNormalized(names.get(0).name()); } super.visitImportFrom(importFrom); } - private void addIfShortEnough(String rawName) { + private void addNormalized(String rawName) { // Reuse Dependency normalization (lowercase + [._-]+ -> -) - String normalized = new Dependency(rawName).name(); - if (normalized.length() < NAME_LENGTH_LIMIT) { - collected.add(normalized); - } + collected.add(new Dependency(rawName).name()); } Set getCollected() { diff --git a/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java index ad3f707da..4b163a73f 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java @@ -1974,14 +1974,14 @@ void detects_databricks_negative() { @Test void send_telemetry_imports_comma_separated_list() { activeRules = new ActiveRulesBuilder().build(); - // main.py contains "from mod import add" -> top-level module "mod" + // main.py contains "from mod import add" -> top-level module "mod" -> not in the whitelist // uses_typeshed.py contains "import math" and "from fastapi ..." -> top-level modules "math", "fastapi" - // Result is sorted and comma-separated: "fastapi,math,mod" + // Result is sorted and comma-separated: "fastapi,math" inputFile("main.py"); inputFile("uses_typeshed.py"); var contextSpy = spy(context); sensor().execute(contextSpy); - verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_IMPORTS.key(), "fastapi,math,mod"); + verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_IMPORTS.key(), "fastapi,math"); verify(contextSpy, times(1)).addTelemetryProperty(TelemetryMetricKey.PYTHON_IMPORTS_FORMAT_VERSION.key(), "1"); } diff --git a/python-commons/src/test/java/org/sonar/plugins/python/telemetry/collectors/ImportsTelemetryCollectorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/telemetry/collectors/ImportsTelemetryCollectorTest.java index 87f8df481..3adee067b 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/telemetry/collectors/ImportsTelemetryCollectorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/telemetry/collectors/ImportsTelemetryCollectorTest.java @@ -104,18 +104,12 @@ void namesAreNormalized() { } @Test - void nameLongerThan100CharsIsFiltered() { - String longName = "a".repeat(100); + void nameNotInWhiteList() { + String longName = "a"; var telemetry = collectFrom("import " + longName); assertThat(telemetry.importedModules()).isEmpty(); } - @Test - void nameShorterThan100CharsIsKept() { - String shortName = "a".repeat(99); - var telemetry = collectFrom("import " + shortName); - assertThat(telemetry.importedModules()).containsExactly(shortName); - } @Test void mixOfImportTypes() { From 0c228d3d803b0be4d819e67300040e1c4c492783 Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Mon, 10 Aug 2026 08:34:09 +0200 Subject: [PATCH 278/322] SONARPY-4429 Add S9106 pytest parameters should not declare defaults GitOrigin-RevId: bd9c023415d9fe01d4d93fa92142f2634ef68527 --- .../python/checks/OpenSourceCheckList.java | 2 + .../PytestParameterDefaultValueCheck.java | 277 ++++++++++++++++++ .../python/checks/utils/UnittestUtils.java | 24 ++ .../org/sonar/l10n/py/rules/python/S9106.html | 54 ++++ .../org/sonar/l10n/py/rules/python/S9106.json | 24 ++ .../py/rules/python/Sonar_way_profile.json | 1 + .../PytestParameterDefaultValueCheckTest.java | 158 ++++++++++ .../checks/utils/UnittestUtilsTest.java | 46 +++ .../conftest_pytestParameterDefaultValue.py | 37 +++ ...ytestParameterDefaultValueNonPytestFile.py | 8 + .../tests/test_pytestParameterDefaultValue.py | 254 ++++++++++++++++ 11 files changed, 885 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/tests/PytestParameterDefaultValueCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9106.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9106.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/tests/PytestParameterDefaultValueCheckTest.java create mode 100644 python-checks/src/test/resources/checks/tests/conftest_pytestParameterDefaultValue.py create mode 100644 python-checks/src/test/resources/checks/tests/pytestParameterDefaultValueNonPytestFile.py create mode 100644 python-checks/src/test/resources/checks/tests/test_pytestParameterDefaultValue.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 8c36c7cb7..1a8eb4b0d 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -115,6 +115,7 @@ import org.sonar.python.checks.tests.PytestFixturePositionalArgsCheck; import org.sonar.python.checks.tests.PytestFixtureYieldTeardownCheck; import org.sonar.python.checks.tests.PytestModuleImportCheck; +import org.sonar.python.checks.tests.PytestParameterDefaultValueCheck; import org.sonar.python.checks.tests.PytestPluginsConftestCheck; import org.sonar.python.checks.tests.PytestRaisesContextManagerCheck; import org.sonar.python.checks.tests.SingleInvocationRuntimeExceptionCheck; @@ -426,6 +427,7 @@ public Stream> getChecks() { PytestFixturePositionalArgsCheck.class, PytestFixtureYieldTeardownCheck.class, PytestModuleImportCheck.class, + PytestParameterDefaultValueCheck.class, PytestPluginsConftestCheck.class, PytestRaisesContextManagerCheck.class, PyTorchDataLoaderNumWorkersCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/PytestParameterDefaultValueCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/PytestParameterDefaultValueCheck.java new file mode 100644 index 000000000..3daa2f127 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/PytestParameterDefaultValueCheck.java @@ -0,0 +1,277 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.quickfix.PythonQuickFix; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.ClassDef; +import org.sonar.plugins.python.api.tree.Decorator; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.FileInput; +import org.sonar.plugins.python.api.tree.FunctionDef; +import org.sonar.plugins.python.api.tree.Parameter; +import org.sonar.plugins.python.api.tree.ParameterList; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.Statement; +import org.sonar.plugins.python.api.tree.StringLiteral; +import org.sonar.plugins.python.api.tree.Token; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.checks.utils.CheckUtils; +import org.sonar.python.checks.utils.Expressions; +import org.sonar.python.checks.utils.UnittestUtils; +import org.sonar.python.quickfix.TextEditUtils; +import org.sonar.python.tree.TreeUtils; + +@Rule(key = "S9106") +public class PytestParameterDefaultValueCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Remove this default value so pytest can inject the parameter."; + private static final String QUICK_FIX_MESSAGE = "Remove default value"; + private static final String FIXTURE_NAME_ARGUMENT = "name"; + private static final String PARAMETRIZE_ARGNAMES = "argnames"; + private static final TypeMatcher PYTEST_FIXTURE_MATCHER = TypeMatchers.withFQN(UnittestUtils.PYTEST_FIXTURE_DECORATOR_FQN); + private static final TypeMatcher PYTEST_PARAMETRIZE_MATCHER = TypeMatchers.isType("pytest.mark.parametrize"); + + /** + * Core pytest builtin fixture names. A default on a parameter with one of these names always + * blocks injection of that builtin fixture. + */ + private static final Set BUILTIN_FIXTURES = Set.of( + "request", + "tmp_path", + "tmpdir", + "tmp_path_factory", + "tmpdir_factory", + "monkeypatch", + "capsys", + "capfd", + "capfdbinary", + "capsysbinary", + "caplog", + "cache", + "doctest_namespace", + "pytestconfig", + "record_property", + "record_testsuite_property", + "recwarn", + "testdir", + "pytester"); + + private final Set moduleFixtures = new HashSet<>(); + private final Map> classFixtures = new HashMap<>(); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.FILE_INPUT, this::collectFixtures); + context.registerSyntaxNodeConsumer(Tree.Kind.FUNCDEF, this::checkFunctionDef); + } + + private void collectFixtures(SubscriptionContext ctx) { + moduleFixtures.clear(); + classFixtures.clear(); + moduleFixtures.addAll(BUILTIN_FIXTURES); + + FileInput fileInput = (FileInput) ctx.syntaxNode(); + if (fileInput.statements() == null) { + return; + } + for (Statement statement : fileInput.statements().statements()) { + collectFixtureFromStatement(statement, ctx); + } + } + + private void collectFixtureFromStatement(Statement statement, SubscriptionContext ctx) { + if (statement instanceof FunctionDef functionDef) { + addModuleFixture(functionDef, ctx); + } else if (statement instanceof ClassDef classDef) { + collectClassFixtures(classDef, ctx); + } + } + + private void addModuleFixture(FunctionDef functionDef, SubscriptionContext ctx) { + String name = fixtureName(functionDef, ctx); + if (name != null) { + moduleFixtures.add(name); + } + } + + private void collectClassFixtures(ClassDef classDef, SubscriptionContext ctx) { + Set fixtures = new HashSet<>(); + for (Statement bodyStatement : classDef.body().statements()) { + if (bodyStatement instanceof FunctionDef methodDef) { + String name = fixtureName(methodDef, ctx); + if (name != null) { + fixtures.add(name); + } + } + } + if (!fixtures.isEmpty()) { + classFixtures.put(classDef, fixtures); + } + } + + private void checkFunctionDef(SubscriptionContext ctx) { + FunctionDef functionDef = (FunctionDef) ctx.syntaxNode(); + if (!isPytestTestOrFixture(functionDef, ctx)) { + return; + } + + ParameterList parameterList = functionDef.parameters(); + if (parameterList == null) { + return; + } + + Set injectedNames = injectedParameterNames(functionDef, ctx); + for (Parameter parameter : parameterList.nonTuple()) { + reportDefaultIfInjected(ctx, parameter, injectedNames); + } + } + + /** + * Names pytest will inject for this function: known fixtures in scope, plus statically known + * {@code @pytest.mark.parametrize} argnames. + */ + private Set injectedParameterNames(FunctionDef functionDef, SubscriptionContext ctx) { + Set injected = new HashSet<>(moduleFixtures); + ClassDef enclosingClass = CheckUtils.getParentClassDef(functionDef); + if (enclosingClass != null) { + Set fixtures = classFixtures.get(enclosingClass); + if (fixtures != null) { + injected.addAll(fixtures); + } + } + injected.addAll(parametrizeArgNames(functionDef, ctx)); + return injected; + } + + private static Set parametrizeArgNames(FunctionDef functionDef, SubscriptionContext ctx) { + return functionDef.decorators().stream() + .flatMap(decorator -> parametrizeArgNames(decorator, ctx)) + .collect(Collectors.toSet()); + } + + private static Stream parametrizeArgNames(Decorator decorator, SubscriptionContext ctx) { + Expression expression = decorator.expression(); + if (!(expression instanceof CallExpression callExpression) + || !PYTEST_PARAMETRIZE_MATCHER.isTrueFor(callExpression.callee(), ctx)) { + return Stream.empty(); + } + RegularArgument argNamesArgument = TreeUtils.nthArgumentOrKeyword(0, PARAMETRIZE_ARGNAMES, callExpression.arguments()); + if (argNamesArgument == null) { + return Stream.empty(); + } + Expression argNames = Expressions.removeParentheses(argNamesArgument.expression()); + if (argNames instanceof StringLiteral stringLiteral) { + return Arrays.stream(stringLiteral.trimmedQuotesValue().split(",")) + .map(String::trim) + .filter(name -> !name.isEmpty()); + } + return Expressions.expressionsFromListOrTuple(argNames).stream() + .map(Expressions::removeParentheses) + .flatMap(TreeUtils.toStreamInstanceOfMapper(StringLiteral.class)) + .map(StringLiteral::trimmedQuotesValue) + .map(String::trim) + .filter(name -> !name.isEmpty()); + } + + private static void reportDefaultIfInjected(SubscriptionContext ctx, Parameter parameter, Set injectedNames) { + if (parameter.starToken() != null || parameter.name() == null) { + return; + } + Expression defaultValue = parameter.defaultValue(); + if (defaultValue == null) { + return; + } + String parameterName = parameter.name().name(); + if (!injectedNames.contains(parameterName)) { + return; + } + + var issue = ctx.addIssue(defaultValue, MESSAGE); + Token previousToken = parameter.typeAnnotation() != null + ? parameter.typeAnnotation().lastToken() + : parameter.name().lastToken(); + issue.addQuickFix(PythonQuickFix.newQuickFix(QUICK_FIX_MESSAGE) + .addTextEdit(TextEditUtils.removeRange( + previousToken.pythonLine(), + endColumn(previousToken), + defaultValue.lastToken().pythonLine(), + endColumn(defaultValue.lastToken()))) + .build()); + } + + private static boolean isPytestTestOrFixture(FunctionDef functionDef, SubscriptionContext ctx) { + return isPytestFixture(functionDef, ctx) + || UnittestUtils.isCollectedPytestTestFunction(functionDef, ctx.pythonFile().fileName()); + } + + private static boolean isPytestFixture(FunctionDef functionDef, SubscriptionContext ctx) { + return functionDef.decorators().stream() + .anyMatch(decorator -> PYTEST_FIXTURE_MATCHER.isTrueFor(decoratorFunctionExpression(decorator), ctx)); + } + + /** + * Returns the pytest fixture name for this function, honoring {@code @pytest.fixture(name=...)}, + * or {@code null} if the function is not a fixture. + */ + private static String fixtureName(FunctionDef functionDef, SubscriptionContext ctx) { + for (Decorator decorator : functionDef.decorators()) { + Expression expression = decorator.expression(); + Expression callee = decoratorFunctionExpression(decorator); + if (!PYTEST_FIXTURE_MATCHER.isTrueFor(callee, ctx)) { + continue; + } + if (expression instanceof CallExpression callExpression) { + RegularArgument nameArgument = TreeUtils.argumentByKeyword(FIXTURE_NAME_ARGUMENT, callExpression.arguments()); + if (nameArgument != null && nameArgument.expression() instanceof StringLiteral stringLiteral) { + return stringLiteral.trimmedQuotesValue(); + } + } + return functionDef.name().name(); + } + return null; + } + + private static Expression decoratorFunctionExpression(Decorator decorator) { + Expression expression = decorator.expression(); + if (expression instanceof CallExpression callExpression) { + return callExpression.callee(); + } + return expression; + } + + private static int endColumn(Token token) { + return token.pythonColumn() + token.value().length(); + } + + @Override + public CheckScope scope() { + return CheckScope.ALL; + } +} diff --git a/python-checks/src/main/java/org/sonar/python/checks/utils/UnittestUtils.java b/python-checks/src/main/java/org/sonar/python/checks/utils/UnittestUtils.java index 2f231f7fe..ad0673c2c 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/utils/UnittestUtils.java +++ b/python-checks/src/main/java/org/sonar/python/checks/utils/UnittestUtils.java @@ -139,6 +139,18 @@ public static boolean isTestClassName(String name) { return name.startsWith("Test"); } + /** + * Broader than {@link #isTestClassName}: also accepts celery-style {@code test_*}, + * unittest-style {@code *Test}/{@code *Tests}/{@code *TestCase} names. + */ + public static boolean isLikelyTestClassName(String name) { + return isTestClassName(name) + || name.startsWith("test") + || name.endsWith("Test") + || name.endsWith("Tests") + || name.endsWith("TestCase"); + } + public static boolean isPytestFileName(String fileName) { return fileName.startsWith("test_") || fileName.endsWith("_test.py"); } @@ -178,6 +190,18 @@ public static boolean isPytestStyleTestFunction(FunctionDef functionDef, String return parentClass == null || isTestClassName(parentClass.name().name()); } + /** + * Like {@link #isPytestStyleTestFunction} but accepts a broader set of test class names + * (see {@link #isLikelyTestClassName}). Nested helpers inside non-test classes are excluded. + */ + public static boolean isCollectedPytestTestFunction(FunctionDef functionDef, String fileName) { + if (!isPytestFileName(fileName) || !isTestMethodName(functionDef.name().name())) { + return false; + } + ClassDef parentClass = directlyEnclosingClass(functionDef); + return parentClass == null || isLikelyTestClassName(parentClass.name().name()); + } + public static boolean isPytestRaises(CallExpression callExpression, SubscriptionContext ctx) { return PYTEST_RAISES_MATCHER.isTrueFor(callExpression.callee(), ctx); } diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9106.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9106.html new file mode 100644 index 000000000..06d394619 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9106.html @@ -0,0 +1,54 @@ +

        This rule raises an issue when a pytest test or fixture parameter declares a default value.

        +

        Why is this an issue?

        +

        A default on a pytest test or fixture parameter is always used. Pytest does not inject a fixture of the same name when a default is present:

        +
        +@pytest.fixture
        +def value():
        +    return 42
        +
        +def test_positive(value=1):  # Always gets 1; fixture is ignored
        +    assert value > 0
        +
        +

        That hides missing fixtures and makes the test run with a hard-coded value instead of the intended fixture. Remove the default so pytest can inject +the parameter, or stop treating the name as a fixture dependency.

        +

        What is the potential impact?

        +

        Defaults on test or fixture parameters silently block fixture injection, so tests can pass with hard-coded values while the real fixture is never +applied.

        +

        How to fix it

        +

        Remove default values from pytest test and fixture parameters so fixtures can be injected by name.

        +

        Code examples

        +

        Noncompliant code example

        +
        +import pytest
        +
        +@pytest.fixture
        +def value():
        +    return 42
        +
        +def test_with_default(value=1):  # Noncompliant
        +    assert value > 0
        +
        +

        Compliant solution

        +
        +import pytest
        +
        +@pytest.fixture
        +def value():
        +    return 42
        +
        +def test_with_default(value):
        +    assert value > 0
        +
        +

        Resources

        +

        Documentation

        + +

        Related rules

        +
          +
        • {rule:python:S9079} - Unused fixtures should be activated with pytest.mark.usefixtures
        • +
        + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9106.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9106.json new file mode 100644 index 000000000..009827531 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9106.json @@ -0,0 +1,24 @@ +{ + "title": "Pytest test and fixture parameters should not declare default values", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "pytest", + "tests" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-9106", + "sqKey": "S9106", + "scope": "Tests", + "code": { + "impacts": { + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "LOGICAL" + }, + "quickfix": "unknown" +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 0965a8c19..4c0008b5c 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -391,6 +391,7 @@ "S9081", "S9083", "S9084", + "S9106", "S9116", "S9117", "S9134" diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/PytestParameterDefaultValueCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/PytestParameterDefaultValueCheckTest.java new file mode 100644 index 000000000..c239aed03 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/PytestParameterDefaultValueCheckTest.java @@ -0,0 +1,158 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import java.util.stream.Stream; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.sonar.plugins.python.api.PythonCheck; +import org.sonar.python.checks.quickfix.PythonQuickFixVerifier; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +import static org.assertj.core.api.Assertions.assertThat; + +class PytestParameterDefaultValueCheckTest { + + private static final String FILE_NAME = "test_pytest_parameter_default_value.py"; + private static final PytestParameterDefaultValueCheck CHECK = new PytestParameterDefaultValueCheck(); + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/test_pytestParameterDefaultValue.py", CHECK); + } + + @Test + void test_fixtures_in_conftest() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/conftest_pytestParameterDefaultValue.py", CHECK); + } + + @Test + void test_no_issue_in_non_pytest_file() { + PythonCheckVerifier.verifyNoIssue("src/test/resources/checks/tests/pytestParameterDefaultValueNonPytestFile.py", CHECK); + } + + @Test + void test_scope() { + assertThat(CHECK.scope()).isEqualTo(PythonCheck.CheckScope.ALL); + } + + @Test + void quick_fix_message() { + String before = """ + import pytest + + @pytest.fixture + def value(): + return 42 + + def test_with_default(value=1): + assert value > 0 + """; + PythonQuickFixVerifier.verifySemanticQuickFixMessages(CHECK, FILE_NAME, before, "Remove default value"); + } + + @ParameterizedTest + @MethodSource("quickFixCases") + void quick_fix(String before, String after) { + PythonQuickFixVerifier.verifySemantic(CHECK, FILE_NAME, before, after); + } + + static Stream quickFixCases() { + return Stream.of( + Arguments.of(""" + import pytest + + @pytest.fixture + def value(): + return 42 + + def test_with_default(value=1): + assert value > 0 + """, """ + import pytest + + @pytest.fixture + def value(): + return 42 + + def test_with_default(value): + assert value > 0 + """), + Arguments.of(""" + import pytest + + @pytest.fixture + def value(): + return 42 + + def test_typed_default(value: int = 1): + assert value > 0 + """, """ + import pytest + + @pytest.fixture + def value(): + return 42 + + def test_typed_default(value: int): + assert value > 0 + """), + Arguments.of(""" + import pytest + + @pytest.fixture + def dep(): + return 0 + + @pytest.fixture + def fixture_with_default(dep=1): + return dep + """, """ + import pytest + + @pytest.fixture + def dep(): + return 0 + + @pytest.fixture + def fixture_with_default(dep): + return dep + """), + Arguments.of(""" + import pytest + + @pytest.fixture + def value(): + return 42 + + def test_none_default(value=None): + assert value is None + """, """ + import pytest + + @pytest.fixture + def value(): + return 42 + + def test_none_default(value): + assert value is None + """) + ); + } +} diff --git a/python-checks/src/test/java/org/sonar/python/checks/utils/UnittestUtilsTest.java b/python-checks/src/test/java/org/sonar/python/checks/utils/UnittestUtilsTest.java index 20ce16f5e..4268a6e4f 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/utils/UnittestUtilsTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/utils/UnittestUtilsTest.java @@ -196,6 +196,52 @@ def helper(): assertThat(UnittestUtils.isPytestStyleTestFunction(functions.get(0), "module.py")).isFalse(); } + @Test + void test_collected_pytest_test_function() { + FileInput fileInput = parse("test_module.py", """ + def test_module_level(): + pass + + class ComparisonTest: + def test_in_comparison_test(self): + pass + + class DigestAuthTests: + def test_in_tests_suffix(self): + pass + + class RemoteFuncsTestCase: + def test_in_testcase(self): + pass + + class test_celery_style: + def test_in_celery_class(self): + pass + + class Helper: + def test_helper(self): + pass + + def wrapper(self): + def test_nested(): + pass + return test_nested + """); + + var functionsByName = allDescendants(fileInput, t -> t.is(Tree.Kind.FUNCDEF)).stream() + .map(FunctionDef.class::cast) + .collect(java.util.stream.Collectors.toMap(f -> f.name().name(), f -> f, (a, b) -> a)); + + assertThat(UnittestUtils.isCollectedPytestTestFunction(functionsByName.get("test_module_level"), "test_module.py")).isTrue(); + assertThat(UnittestUtils.isCollectedPytestTestFunction(functionsByName.get("test_in_comparison_test"), "test_module.py")).isTrue(); + assertThat(UnittestUtils.isCollectedPytestTestFunction(functionsByName.get("test_in_tests_suffix"), "test_module.py")).isTrue(); + assertThat(UnittestUtils.isCollectedPytestTestFunction(functionsByName.get("test_in_testcase"), "test_module.py")).isTrue(); + assertThat(UnittestUtils.isCollectedPytestTestFunction(functionsByName.get("test_in_celery_class"), "test_module.py")).isTrue(); + assertThat(UnittestUtils.isCollectedPytestTestFunction(functionsByName.get("test_helper"), "test_module.py")).isFalse(); + assertThat(UnittestUtils.isCollectedPytestTestFunction(functionsByName.get("test_nested"), "test_module.py")).isTrue(); + assertThat(UnittestUtils.isCollectedPytestTestFunction(functionsByName.get("test_module_level"), "module.py")).isFalse(); + } + @Test void test_pytest_lifecycle_methods() { FileInput fileInput = parse("test_module.py", """ diff --git a/python-checks/src/test/resources/checks/tests/conftest_pytestParameterDefaultValue.py b/python-checks/src/test/resources/checks/tests/conftest_pytestParameterDefaultValue.py new file mode 100644 index 000000000..6c6f2222b --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/conftest_pytestParameterDefaultValue.py @@ -0,0 +1,37 @@ +import pytest +from pytest import fixture + + +@pytest.fixture +def dep(): + return 0 + + +# Fixtures are flagged even in conftest.py (not a test_*.py / *_test.py file name) +@pytest.fixture +def fixture_with_default(dep=1): # Noncompliant {{Remove this default value so pytest can inject the parameter.}} +# ^ + return dep + + +@fixture +def imported_fixture_with_default(dep=1): # Noncompliant +# ^ + return dep + + +@pytest.fixture +def fixture_ok(dep): + return dep + + +# Compliant: optional param with no matching fixture +@pytest.fixture +def fixture_optional_loader(loader=None): + return loader + + +# Module-level test_* in conftest is not a pytest-collected test file pattern for our util, +# so this should not be flagged (conftest.py is not test_*.py / *_test.py) +def test_not_collected_in_conftest(value=1): + assert value > 0 diff --git a/python-checks/src/test/resources/checks/tests/pytestParameterDefaultValueNonPytestFile.py b/python-checks/src/test/resources/checks/tests/pytestParameterDefaultValueNonPytestFile.py new file mode 100644 index 000000000..881ababb3 --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/pytestParameterDefaultValueNonPytestFile.py @@ -0,0 +1,8 @@ +# Non-pytest-named production module: test_* helpers with defaults must not be flagged +def test_connection(timeout=30): + return timeout + + +class Client: + def test_endpoint(self, retries=3): + return retries diff --git a/python-checks/src/test/resources/checks/tests/test_pytestParameterDefaultValue.py b/python-checks/src/test/resources/checks/tests/test_pytestParameterDefaultValue.py new file mode 100644 index 000000000..605f05fc1 --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/test_pytestParameterDefaultValue.py @@ -0,0 +1,254 @@ +import pytest +from pytest import fixture + + +# Compliant: default with no matching fixture — hard-coded optional arg, not blocked injection +def test_hardcoded_default(threshold=1): + assert threshold > 0 + + +def test_multiple_hardcoded(a=1, b=2): + pass + + +def test_typed_hardcoded(threshold: int = 1): + assert threshold > 0 + + +def test_none_hardcoded(threshold=None): + assert threshold is None + + +@pytest.fixture +def value(): + return 42 + + +def test_with_default(value=1): # Noncompliant {{Remove this default value so pytest can inject the parameter.}} +# ^ + assert value > 0 + + +def test_multiple_defaults(value=1, other=2): # Noncompliant +# ^ + pass + + +def test_typed_default(value: int = 1): # Noncompliant +# ^ + assert value > 0 + + +def test_keyword_only(*, value=1): # Noncompliant +# ^ + assert value > 0 + + +def test_positional_only(value=1, /): # Noncompliant +# ^ + assert value > 0 + + +def test_none_default(value=None): # Noncompliant +# ^^^^ + assert value is None + + +def test_mutable_default(value=[]): # Noncompliant +# ^^ + return value + + +async def test_async_with_default(value=1): # Noncompliant +# ^ + assert value > 0 + + +def test_mixed(fixture_ok, value=1): # Noncompliant +# ^ + assert value > 0 + + +# Builtin fixtures are always known — default blocks injection +def test_request_default(request=None): # Noncompliant +# ^^^^ + pass + + +def test_monkeypatch_default(monkeypatch=None): # Noncompliant +# ^^^^ + pass + + +def test_tmp_path_default(tmp_path=None): # Noncompliant +# ^^^^ + pass + + +class TestClass: + @pytest.fixture + def class_value(self): + return 1 + + def test_method_with_default(self, class_value=1): # Noncompliant +# ^ + assert class_value > 0 + + def test_method_module_fixture(self, value=1): # Noncompliant +# ^ + assert value > 0 + + @pytest.fixture + def class_fixture_with_default(self, value=1): # Noncompliant +# ^ + return value + + +@pytest.fixture +def fixture_with_default(value=1): # Noncompliant +# ^ + return value + + +@pytest.fixture() +def fixture_call_with_default(value=1): # Noncompliant +# ^ + return value + + +@fixture +def imported_fixture_with_default(value=1): # Noncompliant +# ^ + return value + + +@pytest.fixture +async def async_fixture_with_default(value=1): # Noncompliant +# ^ + return value + + +@pytest.fixture(name="renamed") +def _internal_name(): + return 1 + + +def test_renamed_fixture(renamed=0): # Noncompliant +# ^ + assert renamed >= 0 + + +# Compliant: no defaults +def test_without_default(value): + assert value > 0 + + +def test_multiple_params(a, b, c): + pass + + +def test_variadic(*args, **kwargs): + pass + + +@pytest.fixture +def fixture_without_default(value): + return value + + +@fixture() +def imported_fixture_ok(value): + return value + + +class TestCompliant: + def test_method(self, value): + assert value > 0 + + @pytest.fixture + def class_fixture(self, value): + return value + + +# Compliant: not a test or fixture +def helper_with_default(value=1): + return value + + +def not_a_test(value=1): + return value + + +# Compliant: test*-named method in a non-Test class is not collected by pytest +class DataBuilder: + def test_data(self, size=10): + return size + + +# Compliant: nested helper named test_* inside a non-test class +class TestS3Hook: + def test_provide_bucket_name(self): + class FakeS3Hook: + def test_function(self, bucket_name=None): + return bucket_name + + +# Compliant: unittest-style helpers with hardcoded defaults and no matching fixture +class ComparisonTest: + def test_valid(self, position=None): + pass + + +class DigestAuthTests: + def test_hash(self, algorithm='md5'): + pass + + +class test_DynamoDBBackend: + def test_backend_by_url(self, url='dynamodb://'): + pass + + +class RemoteFuncsTestCase: + def test_pub_ret(self, load=None): + pass + + +# Compliant: class fixture is not available outside its class +class TestOther: + def test_no_class_fixture(self, class_value=1): + assert class_value > 0 + + +@pytest.mark.parametrize("value", [1, 2]) +def test_parametrized_without_default(value): + assert value > 0 + + +# Parametrize injects the arg — default is unused / incorrect +@pytest.mark.parametrize("arg", [1, 2]) +def test_parametrized_with_hardcoded(arg=0): # Noncompliant +# ^ + assert arg >= 0 + + +@pytest.mark.parametrize("value", [1, 2]) +def test_parametrized_with_default(value=0): # Noncompliant +# ^ + assert value >= 0 + + +@pytest.mark.parametrize(("left", "right"), [(1, 2), (3, 4)]) +def test_parametrized_tuple_names(left=0, right=1): # Noncompliant 2 + pass + + +@pytest.mark.parametrize("a,b", [(1, 2)]) +def test_parametrized_csv_names(a=0, b=1): # Noncompliant 2 + pass + + +# Compliant: default on a non-parametrized, non-fixture parameter alongside parametrize +@pytest.mark.parametrize("case", [1, 2]) +def test_parametrized_with_unrelated_default(case, threshold=10): + assert case < threshold From 0aa7ce146fbfacb00f17ca4055c76ba30fc04a65 Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Mon, 10 Aug 2026 08:47:53 +0200 Subject: [PATCH 279/322] SONARPY-4480 Implement rule S9137 - Mocks should be created with autospec GitOrigin-RevId: 38faf2c59b33c3545a0d292b38c817457d8b10eb --- .../python/checks/OpenSourceCheckList.java | 2 + .../MockPatchLambdaReturnValueCheck.java | 65 +---- .../tests/MocksShouldUseAutospecCheck.java | 142 +++++++++++ .../python/checks/utils/MockPatchUtils.java | 94 +++++++ .../org/sonar/l10n/py/rules/python/S9137.html | 100 ++++++++ .../org/sonar/l10n/py/rules/python/S9137.json | 25 ++ .../py/rules/python/Sonar_way_profile.json | 3 +- .../MocksShouldUseAutospecCheckTest.java | 36 +++ .../checks/tests/mocksShouldUseAutospec.py | 241 ++++++++++++++++++ 9 files changed, 644 insertions(+), 64 deletions(-) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/tests/MocksShouldUseAutospecCheck.java create mode 100644 python-checks/src/main/java/org/sonar/python/checks/utils/MockPatchUtils.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9137.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9137.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/tests/MocksShouldUseAutospecCheckTest.java create mode 100644 python-checks/src/test/resources/checks/tests/mocksShouldUseAutospec.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 1a8eb4b0d..aee2701dd 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -107,6 +107,7 @@ import org.sonar.python.checks.tests.ImplicitlySkippedTestCheck; import org.sonar.python.checks.tests.IntentionalTestFailureMessageCheck; import org.sonar.python.checks.tests.MockPatchLambdaReturnValueCheck; +import org.sonar.python.checks.tests.MocksShouldUseAutospecCheck; import org.sonar.python.checks.tests.NotDiscoverableTestMethodCheck; import org.sonar.python.checks.tests.PytestAutouseParametrizedFixtureCheck; import org.sonar.python.checks.tests.PytestDecoratorParenthesesCheck; @@ -359,6 +360,7 @@ public Stream> getChecks() { MissingDocstringCheck.class, MissingNewlineAtEndOfFileCheck.class, MockPatchLambdaReturnValueCheck.class, + MocksShouldUseAutospecCheck.class, ModifiedParameterValueCheck.class, ModuleNameCheck.class, MultipleInheritanceMROConflictCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/MockPatchLambdaReturnValueCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/MockPatchLambdaReturnValueCheck.java index bb5ca3338..40490de10 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/MockPatchLambdaReturnValueCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/MockPatchLambdaReturnValueCheck.java @@ -17,7 +17,6 @@ package org.sonar.python.checks.tests; import java.util.List; -import java.util.Set; import java.util.function.Predicate; import java.util.stream.Stream; import javax.annotation.CheckForNull; @@ -34,12 +33,10 @@ import org.sonar.plugins.python.api.tree.LambdaExpression; import org.sonar.plugins.python.api.tree.Name; import org.sonar.plugins.python.api.tree.ParameterList; -import org.sonar.plugins.python.api.tree.QualifiedExpression; import org.sonar.plugins.python.api.tree.RegularArgument; import org.sonar.plugins.python.api.tree.Tree; -import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; -import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; import org.sonar.python.checks.utils.Expressions; +import org.sonar.python.checks.utils.MockPatchUtils; import org.sonar.python.quickfix.TextEditUtils; import org.sonar.python.tree.TreeUtils; @@ -50,19 +47,6 @@ public class MockPatchLambdaReturnValueCheck extends PythonSubscriptionCheck { private static final String QUICK_FIX_MESSAGE = "Replace this lambda with a \"return_value\" argument"; private static final String NEW_KEYWORD = "new"; - private static final String PATCH_METHOD = "patch"; - private static final String OBJECT_METHOD = "object"; - - /** - * The {@code mocker} fixtures come from pytest-mock, which has no typeshed stubs, hence the name based detection. - */ - private static final Set MOCKER_FIXTURE_NAMES = Set.of( - "mocker", "class_mocker", "module_mocker", "package_mocker", "session_mocker"); - - private static final TypeMatcher PATCHER_MATCHER = TypeMatchers.isObjectSatisfying( - TypeMatchers.any( - TypeMatchers.isType("unittest.mock._patcher"), - TypeMatchers.isType("mock.mock._patcher"))); @Override public void initialize(Context context) { @@ -81,7 +65,7 @@ private static void checkCall(SubscriptionContext ctx) { return; } - int newPosition = newArgumentPosition(callExpression.callee(), ctx); + int newPosition = MockPatchUtils.newArgumentPosition(callExpression.callee(), ctx); if (newPosition < 0) { return; } @@ -139,51 +123,6 @@ private static boolean hasPositionalArgumentAfter(RegularArgument newArgument, L .anyMatch(argument -> argument.keywordArgument() == null); } - /** - * @return the position of the {@code new} parameter for the patching call, or {@code -1} when the callee is not a patching call. - */ - private static int newArgumentPosition(Expression callee, SubscriptionContext ctx) { - if (PATCHER_MATCHER.isTrueFor(callee, ctx)) { - return 1; - } - if (!(callee instanceof QualifiedExpression qualifiedExpression)) { - return -1; - } - Expression qualifier = Expressions.removeParentheses(qualifiedExpression.qualifier()); - String memberName = qualifiedExpression.name().name(); - if (OBJECT_METHOD.equals(memberName) && (PATCHER_MATCHER.isTrueFor(qualifier, ctx) || isMockerPatch(qualifier))) { - return 2; - } - if (PATCH_METHOD.equals(memberName) && isMockerFixture(qualifier)) { - return 1; - } - return -1; - } - - private static boolean isMockerPatch(Expression expression) { - return expression instanceof QualifiedExpression qualifiedExpression - && PATCH_METHOD.equals(qualifiedExpression.name().name()) - && isMockerFixture(Expressions.removeParentheses(qualifiedExpression.qualifier())); - } - - private static boolean isMockerFixture(Expression expression) { - Expression expr = Expressions.removeParentheses(expression); - if (expr instanceof Name name) { - return MOCKER_FIXTURE_NAMES.contains(name.name()) && isFunctionParameter(name.symbolV2()); - } - // Class-based suites often store the fixture on self in setup_method; match by attribute name only. - return expr instanceof QualifiedExpression qualifiedExpression - && Expressions.removeParentheses(qualifiedExpression.qualifier()) instanceof Name qualifier - && "self".equals(qualifier.name()) - && MOCKER_FIXTURE_NAMES.contains(qualifiedExpression.name().name()); - } - - private static boolean isFunctionParameter(@Nullable SymbolV2 symbol) { - return Stream.ofNullable(symbol) - .flatMap(s -> s.usages().stream()) - .anyMatch(usage -> usage.kind() == UsageV2.Kind.PARAMETER); - } - private static boolean usesItsParameters(LambdaExpression lambda) { ParameterList parameterList = lambda.parameters(); if (parameterList == null) { diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/MocksShouldUseAutospecCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/MocksShouldUseAutospecCheck.java new file mode 100644 index 000000000..e15842cc1 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/MocksShouldUseAutospecCheck.java @@ -0,0 +1,142 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import java.util.List; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.Argument; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.QualifiedExpression; +import org.sonar.plugins.python.api.tree.RegularArgument; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.checks.utils.Expressions; +import org.sonar.python.checks.utils.MockPatchUtils; +import org.sonar.python.tree.TreeUtils; + +@Rule(key = "S9137") +public class MocksShouldUseAutospecCheck extends PythonSubscriptionCheck { + + private static final String MOCK_MESSAGE_FORMAT = + "Replace this \"%s()\" with \"create_autospec()\", or pass \"spec=\" / \"spec_set=\"."; + private static final String PATCH_MESSAGE = + "Add \"autospec=True\" to this patch call, or pass an explicit \"spec=\" / \"spec_set=\"."; + private static final String AUTOSPEC_FALSE_MESSAGE = + "Replace \"autospec=False\" with \"autospec=True\", or pass an explicit \"spec=\" / \"spec_set=\"."; + + private static final String SPEC = "spec"; + private static final String SPEC_SET = "spec_set"; + private static final String AUTOSPEC = "autospec"; + private static final String NEW = "new"; + private static final String NEW_CALLABLE = "new_callable"; + + private static final TypeMatcher MOCK_CLASS_MATCHER = TypeMatchers.any( + TypeMatchers.isType("unittest.mock.Mock"), + TypeMatchers.isType("unittest.mock.MagicMock"), + TypeMatchers.isType("mock.mock.Mock"), + TypeMatchers.isType("mock.mock.MagicMock")); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, MocksShouldUseAutospecCheck::checkCall); + } + + @Override + public CheckScope scope() { + return CheckScope.ALL; + } + + private static void checkCall(SubscriptionContext ctx) { + CallExpression callExpression = (CallExpression) ctx.syntaxNode(); + List arguments = callExpression.arguments(); + if (Expressions.containsSpreadOperator(arguments)) { + return; + } + + Expression callee = Expressions.removeParentheses(callExpression.callee()); + if (MOCK_CLASS_MATCHER.isTrueFor(callee, ctx)) { + if (!hasMockSpec(arguments)) { + ctx.addIssue(callee, mockMessage(callee)); + } + return; + } + + int newPosition = MockPatchUtils.newArgumentPosition(callee, ctx); + if (newPosition < 0) { + return; + } + if (hasReplacement(arguments, newPosition) || hasPatchSpecOrAutospec(arguments, newPosition)) { + return; + } + ctx.addIssue(callee, patchMessage(arguments, newPosition)); + } + + private static String mockMessage(Expression callee) { + return String.format(MOCK_MESSAGE_FORMAT, mockConstructorName(callee)); + } + + private static String mockConstructorName(Expression callee) { + if (callee instanceof Name name) { + return name.name(); + } + if (callee instanceof QualifiedExpression qualifiedExpression) { + return qualifiedExpression.name().name(); + } + return "Mock"; + } + + private static String patchMessage(List arguments, int newPosition) { + int autospecPosition = newPosition + 4; + RegularArgument autospecArgument = TreeUtils.nthArgumentOrKeyword(autospecPosition, AUTOSPEC, arguments); + if (autospecArgument != null && Expressions.isFalsy(autospecArgument.expression())) { + return AUTOSPEC_FALSE_MESSAGE; + } + return PATCH_MESSAGE; + } + + private static boolean hasReplacement(List arguments, int newPosition) { + return TreeUtils.nthArgumentOrKeyword(newPosition, NEW, arguments) != null + || TreeUtils.argumentByKeyword(NEW_CALLABLE, arguments) != null; + } + + private static boolean hasMockSpec(List arguments) { + // Mock(spec, wraps, name, spec_set, ...) + return TreeUtils.nthArgumentOrKeyword(0, SPEC, arguments) != null + || TreeUtils.nthArgumentOrKeyword(3, SPEC_SET, arguments) != null; + } + + private static boolean hasPatchSpecOrAutospec(List arguments, int newPosition) { + // patch(target, new, spec, create, spec_set, autospec, new_callable) + // patch.object(target, attribute, new, spec, create, spec_set, autospec, new_callable) + int specPosition = newPosition + 1; + int specSetPosition = newPosition + 3; + int autospecPosition = newPosition + 4; + return TreeUtils.nthArgumentOrKeyword(specPosition, SPEC, arguments) != null + || TreeUtils.nthArgumentOrKeyword(specSetPosition, SPEC_SET, arguments) != null + || hasTruthyAutospec(arguments, autospecPosition); + } + + private static boolean hasTruthyAutospec(List arguments, int autospecPosition) { + RegularArgument autospecArgument = TreeUtils.nthArgumentOrKeyword(autospecPosition, AUTOSPEC, arguments); + return autospecArgument != null && !Expressions.isFalsy(autospecArgument.expression()); + } +} diff --git a/python-checks/src/main/java/org/sonar/python/checks/utils/MockPatchUtils.java b/python-checks/src/main/java/org/sonar/python/checks/utils/MockPatchUtils.java new file mode 100644 index 000000000..e2e96b0b9 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/utils/MockPatchUtils.java @@ -0,0 +1,94 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.utils; + +import java.util.Set; +import java.util.stream.Stream; +import javax.annotation.Nullable; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.symbols.v2.SymbolV2; +import org.sonar.plugins.python.api.symbols.v2.UsageV2; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.QualifiedExpression; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; + +public final class MockPatchUtils { + + private static final String PATCH_METHOD = "patch"; + private static final String OBJECT_METHOD = "object"; + + /** + * The {@code mocker} fixtures come from pytest-mock, which has no typeshed stubs, hence the name based detection. + */ + private static final Set MOCKER_FIXTURE_NAMES = Set.of( + "mocker", "class_mocker", "module_mocker", "package_mocker", "session_mocker"); + + private static final TypeMatcher PATCHER_MATCHER = TypeMatchers.isObjectSatisfying( + TypeMatchers.any( + TypeMatchers.isType("unittest.mock._patcher"), + TypeMatchers.isType("mock.mock._patcher"))); + + private MockPatchUtils() { + } + + /** + * @return the position of the {@code new} parameter for the patching call, or {@code -1} when the callee is not a patching call. + */ + public static int newArgumentPosition(Expression callee, SubscriptionContext ctx) { + if (PATCHER_MATCHER.isTrueFor(callee, ctx)) { + return 1; + } + if (!(callee instanceof QualifiedExpression qualifiedExpression)) { + return -1; + } + Expression qualifier = Expressions.removeParentheses(qualifiedExpression.qualifier()); + String memberName = qualifiedExpression.name().name(); + if (OBJECT_METHOD.equals(memberName) && (PATCHER_MATCHER.isTrueFor(qualifier, ctx) || isMockerPatch(qualifier))) { + return 2; + } + if (PATCH_METHOD.equals(memberName) && isMockerFixture(qualifier)) { + return 1; + } + return -1; + } + + private static boolean isMockerPatch(Expression expression) { + return expression instanceof QualifiedExpression qualifiedExpression + && PATCH_METHOD.equals(qualifiedExpression.name().name()) + && isMockerFixture(Expressions.removeParentheses(qualifiedExpression.qualifier())); + } + + private static boolean isMockerFixture(Expression expression) { + Expression expr = Expressions.removeParentheses(expression); + if (expr instanceof Name name) { + return MOCKER_FIXTURE_NAMES.contains(name.name()) && isFunctionParameter(name.symbolV2()); + } + // Class-based suites often store the fixture on self in setup_method; match by attribute name only. + return expr instanceof QualifiedExpression qualifiedExpression + && Expressions.removeParentheses(qualifiedExpression.qualifier()) instanceof Name qualifier + && "self".equals(qualifier.name()) + && MOCKER_FIXTURE_NAMES.contains(qualifiedExpression.name().name()); + } + + private static boolean isFunctionParameter(@Nullable SymbolV2 symbol) { + return Stream.ofNullable(symbol) + .flatMap(s -> s.usages().stream()) + .anyMatch(usage -> usage.kind() == UsageV2.Kind.PARAMETER); + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9137.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9137.html new file mode 100644 index 000000000..b66d1bb81 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9137.html @@ -0,0 +1,100 @@ +

        This rule raises an issue when a unittest.mock.Mock or MagicMock is created without an autospec (or equivalent +spec / spec_set), including patch / pytest-mock calls that omit autospec=True.

        +

        In Python, this includes:

        +
          +
        • Mock() / MagicMock() without spec / spec_set
        • +
        • patch("target") / patch.object(...) without autospec=True (or an explicit spec)
        • +
        • Equivalent mocker.patch(...) calls from pytest-mock
        • +
        +

        Why is this an issue?

        +

        By default, unittest.mock.Mock accepts any attribute name and any call signature. That hides mistakes: typos on methods under test, +wrong argument lists, and misspelled assertion helpers all succeed until something else fails later.

        +

        Autospeccing means building the mock from a real object or class so that it mirrors that API. Missing attributes raise AttributeError, +and calls are checked against the real signature. That turns silent mock mistakes into loud test failures.

        +

        Mock without autospec

        +
        +from unittest.mock import Mock
        +
        +client = Mock()
        +client.fetsh("id")  # typo is accepted; returns another Mock
        +
        +

        Mock with autospec

        +
        +from unittest.mock import create_autospec
        +
        +client = create_autospec(ApiClient)
        +client.fetch("id")  # AttributeError if fetch does not exist on ApiClient
        +
        +

        Exceptions

        +

        This rule does not raise when spec, spec_set, autospec, or create_autospec is already used.

        +

        A bare Mock can be acceptable when there is no useful real collaborator to copy — for example a throwaway callable stub, or a test +double invented only for this test with no production type. In those cases, review manually before changing the code; prefer autospec whenever a real +class or function exists.

        +

        What is the potential impact?

        +

        Without autospec, tests can pass while still exercising incorrect interactions with dependencies. API renames and signature changes may go +unnoticed, and assertion typos on the mock can pass for the same reason.

        +

        How to fix it

        +

        Create the mock from the real collaborator so it mirrors that API:

        +
          +
        • Use create_autospec(SomeClass) or create_autospec(some_function) when you hold the mock in a variable.
        • +
        • Use patch("module.target", autospec=True) (or mocker.patch(…​, autospec=True)) when replacing an import path for the + duration of the test.
        • +
        • Use spec= / spec_set= on Mock / MagicMock when you need a limited mirror of an instance + without full autospec behaviour; prefer autospec / create_autospec when you want signature checking as well.
        • +
        +

        Enabling autospec may cause existing tests to fail if they called methods that do not exist on the real API or used the wrong signature. That +failure is intended: update the test (or the call under test) to match the real collaborator. Production behaviour should stay the same; only the test +double becomes stricter.

        +

        Use a plain Mock only when there is no useful real API to copy. If the bare mock is intentional for that reason, treat the issue as an +accepted trade-off after review rather than a false positive of the analysis.

        +

        Code examples

        +

        Noncompliant code example

        +
        +from unittest.mock import Mock
        +
        +def test_checkout():
        +    payments = Mock()  # Noncompliant
        +    checkout(payments, order)
        +    payments.charge.assert_called_once_with(order.total)
        +
        +

        Compliant solution

        +
        +from unittest.mock import create_autospec
        +
        +def test_checkout():
        +    payments = create_autospec(PaymentGateway)
        +    checkout(payments, order)
        +    payments.charge.assert_called_once_with(order.total)
        +
        +

        Noncompliant code example

        +
        +from unittest.mock import patch
        +
        +def test_notify():
        +    with patch("app.notify.send") as send:  # Noncompliant
        +        notify_user("u1")
        +        send.assert_called_once_with("u1")
        +
        +

        Compliant solution

        +
        +from unittest.mock import patch
        +
        +def test_notify():
        +    with patch("app.notify.send", autospec=True) as send:
        +        notify_user("u1")
        +        send.assert_called_once_with("u1")
        +
        +

        Resources

        +

        Documentation

        + +

        Related rules

        +
          +
        • {rule:python:S9136} - Mock assertion method names should be spelled correctly
        • +
        + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9137.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9137.json new file mode 100644 index 000000000..c99458662 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9137.json @@ -0,0 +1,25 @@ +{ + "title": "Mocks should be created with autospec", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "10min" + }, + "tags": [ + "tests", + "pitfall" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-9137", + "sqKey": "S9137", + "scope": "Tests", + "quickfix": "unknown", + "code": { + "impacts": { + "RELIABILITY": "MEDIUM", + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "COMPLETE" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 4c0008b5c..b797b7446 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -394,6 +394,7 @@ "S9106", "S9116", "S9117", - "S9134" + "S9134", + "S9137" ] } diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/MocksShouldUseAutospecCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/MocksShouldUseAutospecCheckTest.java new file mode 100644 index 000000000..6deab2dad --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/MocksShouldUseAutospecCheckTest.java @@ -0,0 +1,36 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import org.junit.jupiter.api.Test; +import org.sonar.plugins.python.api.PythonCheck; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +import static org.assertj.core.api.Assertions.assertThat; + +class MocksShouldUseAutospecCheckTest { + + @Test + void scope() { + assertThat(new MocksShouldUseAutospecCheck().scope()).isEqualTo(PythonCheck.CheckScope.ALL); + } + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/mocksShouldUseAutospec.py", new MocksShouldUseAutospecCheck()); + } +} diff --git a/python-checks/src/test/resources/checks/tests/mocksShouldUseAutospec.py b/python-checks/src/test/resources/checks/tests/mocksShouldUseAutospec.py new file mode 100644 index 000000000..47043b185 --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/mocksShouldUseAutospec.py @@ -0,0 +1,241 @@ +import mock +import unittest.mock +from unittest.mock import MagicMock, Mock, create_autospec, patch + + +class PaymentGateway: + def charge(self, amount): + ... + + +class ApiClient: + def fetch(self, id): + ... + + +def checkout(payments, order): + ... + + +def notify_user(user_id): + ... + + +def test_bare_mock(): + payments = Mock() # Noncompliant {{Replace this "Mock()" with "create_autospec()", or pass "spec=" / "spec_set=".}} +# ^^^^ + checkout(payments, None) + + +def test_bare_magic_mock(): + client = MagicMock() # Noncompliant {{Replace this "MagicMock()" with "create_autospec()", or pass "spec=" / "spec_set=".}} +# ^^^^^^^^^ + client.fetch("id") + + +def test_mock_with_return_value_only(): + Mock(return_value=42) # Noncompliant {{Replace this "Mock()" with "create_autospec()", or pass "spec=" / "spec_set=".}} +# ^^^^ + + +def test_mock_with_side_effect_only(): + Mock(side_effect=ValueError) # Noncompliant {{Replace this "Mock()" with "create_autospec()", or pass "spec=" / "spec_set=".}} +# ^^^^ + + +def test_mock_with_name_only(): + Mock(name="payments") # Noncompliant {{Replace this "Mock()" with "create_autospec()", or pass "spec=" / "spec_set=".}} +# ^^^^ + + +def test_mock_with_wraps_only(): + Mock(wraps=PaymentGateway()) # Noncompliant {{Replace this "Mock()" with "create_autospec()", or pass "spec=" / "spec_set=".}} +# ^^^^ + + +def test_fully_qualified_mock(): + unittest.mock.Mock() # Noncompliant {{Replace this "Mock()" with "create_autospec()", or pass "spec=" / "spec_set=".}} +# ^^^^^^^^^^^^^^^^^^ + + +def test_fully_qualified_magic_mock(): + unittest.mock.MagicMock() # Noncompliant {{Replace this "MagicMock()" with "create_autospec()", or pass "spec=" / "spec_set=".}} +# ^^^^^^^^^^^^^^^^^^^^^^^ + + +def test_third_party_mock(): + mock.Mock() # Noncompliant {{Replace this "Mock()" with "create_autospec()", or pass "spec=" / "spec_set=".}} +# ^^^^^^^^^ + + +def test_third_party_magic_mock(): + mock.MagicMock() # Noncompliant {{Replace this "MagicMock()" with "create_autospec()", or pass "spec=" / "spec_set=".}} +# ^^^^^^^^^^^^^^ + + +def test_patch_without_autospec(): + with patch("app.notify.send") as send: # Noncompliant {{Add "autospec=True" to this patch call, or pass an explicit "spec=" / "spec_set=".}} +# ^^^^^ + notify_user("u1") + send.assert_called_once_with("u1") + + +def test_patch_as_decorator(): + @patch("app.notify.send") # Noncompliant {{Add "autospec=True" to this patch call, or pass an explicit "spec=" / "spec_set=".}} +# ^^^^^ + def inner(send): + notify_user("u1") + + inner() + + +def test_patch_object_without_autospec(): + with patch.object(PaymentGateway, "charge") as charge: # Noncompliant {{Add "autospec=True" to this patch call, or pass an explicit "spec=" / "spec_set=".}} +# ^^^^^^^^^^^^ + charge(10) + + +def test_fully_qualified_patch(): + with unittest.mock.patch("app.notify.send"): # Noncompliant {{Add "autospec=True" to this patch call, or pass an explicit "spec=" / "spec_set=".}} +# ^^^^^^^^^^^^^^^^^^^ + notify_user("u1") + + +def test_third_party_patch(): + with mock.patch("app.notify.send"): # Noncompliant {{Add "autospec=True" to this patch call, or pass an explicit "spec=" / "spec_set=".}} +# ^^^^^^^^^^ + notify_user("u1") + + +def test_mocker_patch(mocker): + mocker.patch("app.notify.send") # Noncompliant {{Add "autospec=True" to this patch call, or pass an explicit "spec=" / "spec_set=".}} +# ^^^^^^^^^^^^ + + +def test_mocker_patch_object(mocker): + mocker.patch.object(PaymentGateway, "charge") # Noncompliant {{Add "autospec=True" to this patch call, or pass an explicit "spec=" / "spec_set=".}} +# ^^^^^^^^^^^^^^^^^^^ + + +def test_class_mocker_patch(class_mocker): + class_mocker.patch("app.notify.send") # Noncompliant {{Add "autospec=True" to this patch call, or pass an explicit "spec=" / "spec_set=".}} +# ^^^^^^^^^^^^^^^^^^ + + +def test_self_mocker_patch(): + class Suite: + def setup_method(self, mocker): + self.mocker = mocker + + def test_it(self): + self.mocker.patch("app.notify.send") # Noncompliant {{Add "autospec=True" to this patch call, or pass an explicit "spec=" / "spec_set=".}} +# ^^^^^^^^^^^^^^^^^ + + +def test_patch_with_autospec_false(): + with patch("app.notify.send", autospec=False): # Noncompliant {{Replace "autospec=False" with "autospec=True", or pass an explicit "spec=" / "spec_set=".}} +# ^^^^^ + notify_user("u1") + + +def test_compliant_create_autospec(): + payments = create_autospec(PaymentGateway) + checkout(payments, None) + + +def test_compliant_create_autospec_fully_qualified(): + client = unittest.mock.create_autospec(ApiClient) + client.fetch("id") + + +def test_compliant_mock_with_spec(): + payments = Mock(spec=PaymentGateway) + checkout(payments, None) + + +def test_compliant_mock_with_positional_spec(): + payments = Mock(PaymentGateway) + checkout(payments, None) + + +def test_compliant_mock_with_spec_set(): + payments = Mock(spec_set=PaymentGateway) + checkout(payments, None) + + +def test_compliant_magic_mock_with_spec(): + client = MagicMock(spec=ApiClient) + client.fetch("id") + + +def test_compliant_magic_mock_with_spec_set(): + client = MagicMock(spec_set=ApiClient) + client.fetch("id") + + +def test_compliant_patch_autospec_true(): + with patch("app.notify.send", autospec=True) as send: + notify_user("u1") + send.assert_called_once_with("u1") + + +def test_compliant_patch_autospec_class(): + with patch("app.notify.send", autospec=PaymentGateway): + notify_user("u1") + + +def test_compliant_patch_with_spec(): + with patch("app.notify.send", spec=PaymentGateway): + notify_user("u1") + + +def test_compliant_patch_with_spec_set(): + with patch("app.notify.send", spec_set=PaymentGateway): + notify_user("u1") + + +def test_compliant_patch_object_autospec(): + with patch.object(PaymentGateway, "charge", autospec=True): + ... + + +def test_compliant_patch_with_new(): + real = lambda user_id: None + with patch("app.notify.send", new=real): + notify_user("u1") + + +def test_compliant_patch_with_new_callable(): + with patch("app.notify.send", new_callable=lambda: lambda user_id: None): + notify_user("u1") + + +def test_compliant_mocker_patch_autospec(mocker): + mocker.patch("app.notify.send", autospec=True) + + +def test_compliant_mocker_patch_object_autospec(mocker): + mocker.patch.object(PaymentGateway, "charge", autospec=True) + + +def test_compliant_decorator_autospec(): + @patch("app.notify.send", autospec=True) + def inner(send): + notify_user("u1") + + inner() + + +def test_ignored_when_unpacked_kwargs(): + kwargs = {"autospec": True} + Mock(**kwargs) + patch("app.notify.send", **kwargs) + + +def test_async_mock_not_covered(): + # RSpec only mentions Mock / MagicMock + unittest.mock.AsyncMock() + + +def test_property_mock_not_covered(): + unittest.mock.PropertyMock() From 985063bff94820f56f78a514e66ecbde519c8549 Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Mon, 10 Aug 2026 14:14:40 +0200 Subject: [PATCH 280/322] SONARPY-4481 Implement rule S9100 - Pytest fixtures without teardown should use return instead of yield GitOrigin-RevId: 381c2ab0d4c7c5e85be85d8b55e5058aeca84b7b --- .../python/checks/OpenSourceCheckList.java | 2 + .../tests/PytestUselessYieldFixtureCheck.java | 117 ++++++++++++ .../org/sonar/l10n/py/rules/python/S9100.html | 51 +++++ .../org/sonar/l10n/py/rules/python/S9100.json | 24 +++ .../py/rules/python/Sonar_way_profile.json | 1 + .../PytestUselessYieldFixtureCheckTest.java | 36 ++++ .../checks/tests/pytestUselessYieldFixture.py | 180 ++++++++++++++++++ 7 files changed, 411 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/tests/PytestUselessYieldFixtureCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9100.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9100.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/tests/PytestUselessYieldFixtureCheckTest.java create mode 100644 python-checks/src/test/resources/checks/tests/pytestUselessYieldFixture.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index aee2701dd..bb330252e 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -119,6 +119,7 @@ import org.sonar.python.checks.tests.PytestParameterDefaultValueCheck; import org.sonar.python.checks.tests.PytestPluginsConftestCheck; import org.sonar.python.checks.tests.PytestRaisesContextManagerCheck; +import org.sonar.python.checks.tests.PytestUselessYieldFixtureCheck; import org.sonar.python.checks.tests.SingleInvocationRuntimeExceptionCheck; import org.sonar.python.checks.tests.SkippedTestNoReasonCheck; import org.sonar.python.checks.tests.SpecificExceptionAssertionCheck; @@ -432,6 +433,7 @@ public Stream> getChecks() { PytestParameterDefaultValueCheck.class, PytestPluginsConftestCheck.class, PytestRaisesContextManagerCheck.class, + PytestUselessYieldFixtureCheck.class, PyTorchDataLoaderNumWorkersCheck.class, PytzTimeZoneInDatetimeConstructorCheck.class, RaiseOutsideExceptCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/PytestUselessYieldFixtureCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/PytestUselessYieldFixtureCheck.java new file mode 100644 index 000000000..d19abf9e1 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/PytestUselessYieldFixtureCheck.java @@ -0,0 +1,117 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import java.util.List; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.BaseTreeVisitor; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.Decorator; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.FunctionDef; +import org.sonar.plugins.python.api.tree.LambdaExpression; +import org.sonar.plugins.python.api.tree.Statement; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.tree.YieldExpression; +import org.sonar.plugins.python.api.tree.YieldStatement; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.checks.utils.CheckUtils; +import org.sonar.python.checks.utils.UnittestUtils; + +@Rule(key = "S9100") +public class PytestUselessYieldFixtureCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE_USE_RETURN = "No teardown in this fixture. Use \"return\" instead of \"yield\"."; + private static final String MESSAGE_REMOVE_YIELD = "Remove this useless \"yield\"."; + private static final TypeMatcher PYTEST_FIXTURE_MATCHER = TypeMatchers.withFQN(UnittestUtils.PYTEST_FIXTURE_DECORATOR_FQN); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.FUNCDEF, PytestUselessYieldFixtureCheck::checkFunctionDef); + } + + @Override + public CheckScope scope() { + return CheckScope.ALL; + } + + private static void checkFunctionDef(SubscriptionContext ctx) { + FunctionDef functionDef = (FunctionDef) ctx.syntaxNode(); + if (!isPytestFixture(functionDef, ctx) || CheckUtils.isAbstract(functionDef)) { + return; + } + + List statements = functionDef.body().statements(); + if (statements.isEmpty()) { + return; + } + + Statement last = statements.get(statements.size() - 1); + if (!(last instanceof YieldStatement yieldStatement)) { + return; + } + // "yield from" delegates teardown to another generator (Ruff PT022 ignores it). + if (yieldStatement.yieldExpression().fromKeyword() != null) { + return; + } + + // Multiple yields are covered by S8994; telling the user to "return" / remove the last + // yield would be wrong advice when an earlier yield already made this a generator fixture. + // Same guard as Ruff PT022 (exactly one yield in the fixture body). + YieldCounter yieldCounter = new YieldCounter(); + functionDef.body().accept(yieldCounter); + if (yieldCounter.count == 1) { + boolean bareYield = yieldStatement.yieldExpression().expressions().isEmpty(); + ctx.addIssue(yieldStatement, bareYield ? MESSAGE_REMOVE_YIELD : MESSAGE_USE_RETURN); + } + } + + private static boolean isPytestFixture(FunctionDef functionDef, SubscriptionContext ctx) { + return functionDef.decorators().stream() + .anyMatch(decorator -> PYTEST_FIXTURE_MATCHER.isTrueFor(decoratorFunctionExpression(decorator), ctx)); + } + + private static Expression decoratorFunctionExpression(Decorator decorator) { + Expression expression = decorator.expression(); + if (expression instanceof CallExpression callExpression) { + return callExpression.callee(); + } + return expression; + } + + private static final class YieldCounter extends BaseTreeVisitor { + private int count; + + @Override + public void visitFunctionDef(FunctionDef functionDef) { + // Skip nested functions + } + + @Override + public void visitLambda(LambdaExpression lambdaExpression) { + // Skip lambdas + } + + @Override + public void visitYieldExpression(YieldExpression yieldExpression) { + count++; + } + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9100.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9100.html new file mode 100644 index 000000000..c50846472 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9100.html @@ -0,0 +1,51 @@ +

        This rule raises an issue when a @pytest.fixture yields a value with no teardown code after the yield.

        +

        Why is this an issue?

        +

        A fixture should use yield only when there is teardown after the test. Yielding with nothing afterward is equivalent to +return, but reads as if cleanup were intended:

        +
        +@pytest.fixture
        +def useless_yield():
        +    data = load()
        +    yield data
        +
        +

        Use return when no teardown is needed:

        +
        +@pytest.fixture
        +def useless_yield():
        +    return load()
        +
        +

        What is the potential impact?

        +

        A useless yield suggests teardown that does not exist, which misleads readers about fixture lifecycle and resource ownership.

        +

        How to fix it

        +

        When a fixture has no teardown, replace yield with return.

        +

        Code examples

        +

        Noncompliant code example

        +
        +import pytest
        +
        +@pytest.fixture
        +def useless_yield():
        +    data = load()
        +    yield data  # Noncompliant
        +
        +

        Compliant solution

        +
        +import pytest
        +
        +@pytest.fixture
        +def useless_yield():
        +    return load()
        +
        +

        Resources

        +

        Documentation

        + +

        Related rules

        +
          +
        • {rule:python:S8994} - Fixtures should not contain more than one yield
        • +
        • {rule:python:S9080} - Pytest fixtures should use yield for teardown
        • +
        + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9100.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9100.json new file mode 100644 index 000000000..d44836258 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9100.json @@ -0,0 +1,24 @@ +{ + "title": "Pytest fixtures without teardown should use return instead of yield", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "pytest", + "tests" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-9100", + "sqKey": "S9100", + "scope": "Tests", + "code": { + "impacts": { + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "CLEAR" + }, + "quickfix": "unknown" +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index b797b7446..1eb0d986a 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -391,6 +391,7 @@ "S9081", "S9083", "S9084", + "S9100", "S9106", "S9116", "S9117", diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/PytestUselessYieldFixtureCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/PytestUselessYieldFixtureCheckTest.java new file mode 100644 index 000000000..892b20a02 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/PytestUselessYieldFixtureCheckTest.java @@ -0,0 +1,36 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import org.junit.jupiter.api.Test; +import org.sonar.plugins.python.api.PythonCheck; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +import static org.assertj.core.api.Assertions.assertThat; + +class PytestUselessYieldFixtureCheckTest { + + @Test + void scope() { + assertThat(new PytestUselessYieldFixtureCheck().scope()).isEqualTo(PythonCheck.CheckScope.ALL); + } + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/pytestUselessYieldFixture.py", new PytestUselessYieldFixtureCheck()); + } +} diff --git a/python-checks/src/test/resources/checks/tests/pytestUselessYieldFixture.py b/python-checks/src/test/resources/checks/tests/pytestUselessYieldFixture.py new file mode 100644 index 000000000..54a546039 --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/pytestUselessYieldFixture.py @@ -0,0 +1,180 @@ +import pytest + + +@pytest.fixture +def useless_yield(): + data = load() + yield data # Noncompliant {{No teardown in this fixture. Use "return" instead of "yield".}} +# ^^^^^^^^^^ + + +@pytest.fixture() +def useless_yield_with_call(): + resource = acquire() + yield resource # Noncompliant {{No teardown in this fixture. Use "return" instead of "yield".}} +# ^^^^^^^^^^^^^^ + + +@pytest.fixture +def bare_yield_only(): + yield # Noncompliant {{Remove this useless "yield".}} +# ^^^^^ + + +@pytest.fixture(autouse=True) +def clear_db(): + clear_db_logs() + clear_db_runs() + clear_db_dags() + yield # Noncompliant {{Remove this useless "yield".}} +# ^^^^^ + + +@pytest.fixture +def only_yield_value(): + yield 42 # Noncompliant {{No teardown in this fixture. Use "return" instead of "yield".}} +# ^^^^^^^^ + + +from pytest import fixture + + +@fixture +def imported_fixture(): + yield load() # Noncompliant {{No teardown in this fixture. Use "return" instead of "yield".}} +# ^^^^^^^^^^^^ + + +from pytest import fixture as pytest_fixture + + +@pytest_fixture +def aliased_fixture(): + value = setup() + yield value # Noncompliant {{No teardown in this fixture. Use "return" instead of "yield".}} +# ^^^^^^^^^^^ + + +@pytest.fixture(scope="module") +def scoped_useless_yield(): + yield create() # Noncompliant {{No teardown in this fixture. Use "return" instead of "yield".}} +# ^^^^^^^^^^^^^^ + + +@pytest.fixture +def with_teardown(): + resource = acquire() + yield resource + resource.release() + + +@pytest.fixture +def with_pass_after_yield(): + yield 1 + pass + + +@pytest.fixture +def bare_yield_with_teardown(): + setup() + yield + teardown() + + +@pytest.fixture +def return_fixture(): + return load() + + +@pytest.fixture +def return_after_setup(): + data = load() + return data + + +def not_a_fixture(): + yield 1 + + +@pytest.fixture +def nested_generator_ok(): + def inner(): + yield 1 + + return inner() + + +@pytest.fixture +def nested_yield_then_yield(): + def inner(): + yield 1 + + yield inner() # Noncompliant {{No teardown in this fixture. Use "return" instead of "yield".}} +# ^^^^^^^^^^^^^ + + +@pytest.fixture +def multiple_yields_last_is_yield(): + # Covered by S8994; do not suggest return/remove on the last yield alone. + yield 1 + yield 2 + + +@pytest.fixture +def yield_in_if_not_last(): + if cond: + yield 1 + else: + yield 2 + + +@pytest.fixture +async def async_useless_yield(): + yield await load() # Noncompliant {{No teardown in this fixture. Use "return" instead of "yield".}} +# ^^^^^^^^^^^^^^^^^^ + + +import unittest +from abc import ABC, abstractmethod + + +class MyTest(unittest.TestCase): + + @pytest.fixture + def class_fixture(self): + yield "setup" # Noncompliant {{No teardown in this fixture. Use "return" instead of "yield".}} +# ^^^^^^^^^^^^^ + + @pytest.fixture + def class_fixture_with_teardown(self): + yield "setup" + self.cleanup() + + +class AbstractFixtures(ABC): + + @pytest.fixture + @abstractmethod + def abstract_fixture(self): + yield 1 + + +def _restore_logging(): + handlers = [] + try: + yield + finally: + pass + + +@pytest.fixture +def restore_logging_via_yield_from(): + yield from _restore_logging() + + +@pytest.fixture +def useless_yield_from_without_teardown(): + def values(): + yield 1 + + yield from values() From 478a7be2e016ad7c30b41b3a8cb8594ab0ea50db Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Mon, 10 Aug 2026 14:18:12 +0200 Subject: [PATCH 281/322] SONARPY-4497 Improve S9000 precision for pytest.raises context manager GitOrigin-RevId: 5d14c75afd132d1c3d8d313352089a16a86c25a1 --- .../PytestRaisesContextManagerCheck.java | 310 ++---------------- .../PytestRaisesContextManagerCheckTest.java | 86 ----- .../tests/pytestRaisesContextManager.py | 105 +++--- 3 files changed, 66 insertions(+), 435 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/PytestRaisesContextManagerCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/PytestRaisesContextManagerCheck.java index 320ab7778..5054145f8 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/PytestRaisesContextManagerCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/PytestRaisesContextManagerCheck.java @@ -16,41 +16,21 @@ */ package org.sonar.python.checks.tests; -import java.util.Arrays; import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.OptionalInt; import org.sonar.check.Rule; import org.sonar.plugins.python.api.PythonSubscriptionCheck; import org.sonar.plugins.python.api.SubscriptionContext; -import org.sonar.plugins.python.api.symbols.v2.SymbolV2; -import org.sonar.plugins.python.api.symbols.v2.UsageV2; -import org.sonar.plugins.python.api.tree.AnnotatedAssignment; import org.sonar.plugins.python.api.tree.Argument; -import org.sonar.plugins.python.api.tree.AssignmentStatement; import org.sonar.plugins.python.api.tree.CallExpression; -import org.sonar.plugins.python.api.tree.Decorator; import org.sonar.plugins.python.api.tree.Expression; -import org.sonar.plugins.python.api.tree.ExpressionList; -import org.sonar.plugins.python.api.tree.FunctionDef; -import org.sonar.plugins.python.api.tree.Name; -import org.sonar.plugins.python.api.tree.Parameter; -import org.sonar.plugins.python.api.tree.ParameterList; -import org.sonar.plugins.python.api.tree.QualifiedExpression; +import org.sonar.plugins.python.api.tree.ExpressionStatement; import org.sonar.plugins.python.api.tree.RegularArgument; -import org.sonar.plugins.python.api.tree.StringLiteral; import org.sonar.plugins.python.api.tree.Tree; -import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; -import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; -import org.sonar.python.checks.utils.Expressions; import org.sonar.python.checks.utils.UnittestUtils; -import org.sonar.python.tree.TreeUtils; @Rule(key = "S9000") public class PytestRaisesContextManagerCheck extends PythonSubscriptionCheck { private static final String MESSAGE = "Prefer the context manager form: wrap the raising code in \"with pytest.raises(...)\"."; - private static final TypeMatcher PYTEST_PARAMETRIZE_MATCHER = TypeMatchers.withFQN("pytest.mark.parametrize"); @Override public void initialize(Context context) { @@ -63,274 +43,45 @@ public CheckScope scope() { } private static void checkCallExpression(SubscriptionContext ctx, CallExpression callExpression) { - if (isUsedAsWithContextManager(callExpression) - || isAssignedAndUsedInWith(callExpression) - || isParametrizeInjectedAndUsedInWith(callExpression, ctx) - || escapesEnclosingFunction(callExpression)) { + if (!UnittestUtils.isPytestRaises(callExpression, ctx)) { return; } - if (UnittestUtils.isPytestRaises(callExpression, ctx)) { + // Only raise when sure: discarded expression-statement calls, or the deprecated callable form. + // Assigned / nested / parametrize / returned values are left alone (prefer FN over FP). + if (isDeprecatedCallableForm(callExpression) || isStandaloneExpressionStatement(callExpression)) { ctx.addIssue(callExpression, MESSAGE); } } /** - * Accepts {@code pytest.raises(...)} that escapes the current function for later {@code with}-usage - * elsewhere: return, call argument, a local that is returned/passed as argument, a global/module/class - * binding, or a {@code self} attribute assignment. Decorator/{@code parametrize} injection stays handled - * separately so unused injected values can still be reported. + * Deprecated {@code pytest.raises(exc, callable, *args, **kwargs)} form always executes immediately + * and must be migrated to a {@code with} block — safe to report in any syntactic position. */ - private static boolean escapesEnclosingFunction(CallExpression callExpression) { - if (isReturned(callExpression) - || isPassedAsCallArgument(callExpression) - || isAssignedToSelfAttribute(callExpression) - || isModuleOrClassLevelBinding(callExpression)) { - return true; - } - return assignedName(callExpression) - .map(Name::symbolV2) - .filter(Objects::nonNull) - .filter(PytestRaisesContextManagerCheck::escapesViaName) - .isPresent(); - } - - private static boolean isReturned(CallExpression callExpression) { - return TreeUtils.firstAncestorOfKind(outermostParenthesized(callExpression), Tree.Kind.RETURN_STMT) != null; + private static boolean isDeprecatedCallableForm(CallExpression callExpression) { + return secondPositionalArgument(callExpression.arguments()) != null; } - private static boolean isPassedAsCallArgument(CallExpression raisesCall) { - if (TreeUtils.firstAncestorOfKind(raisesCall, Tree.Kind.DECORATOR) != null) { - return false; - } - for (Tree current = outermostParenthesized(raisesCall).parent(); current != null; current = current.parent()) { - if (current instanceof RegularArgument) { - return true; + private static RegularArgument secondPositionalArgument(List arguments) { + int positionalIndex = 0; + for (Argument argument : arguments) { + if (!(argument instanceof RegularArgument regularArgument) || regularArgument.keywordArgument() != null) { + continue; } - if (current.is(Tree.Kind.FUNCDEF, Tree.Kind.FILE_INPUT, Tree.Kind.CLASSDEF, Tree.Kind.LAMBDA)) { - return false; + if (positionalIndex == 1) { + return regularArgument; } + positionalIndex++; } - return false; - } - - private static boolean isModuleOrClassLevelBinding(CallExpression callExpression) { - Expression rhs = outermostParenthesized(callExpression); - Tree parent = rhs.parent(); - if (!(parent instanceof AssignmentStatement || parent instanceof AnnotatedAssignment)) { - return false; - } - return TreeUtils.firstAncestorOfKind(callExpression, Tree.Kind.FUNCDEF) == null; - } - - private static boolean isAssignedToSelfAttribute(CallExpression callExpression) { - Expression rhs = outermostParenthesized(callExpression); - Tree parent = rhs.parent(); - Expression lhs = null; - if (parent instanceof AssignmentStatement assignment) { - if (assignment.lhsExpressions().size() != 1 || assignment.lhsExpressions().get(0).expressions().size() != 1) { - return false; - } - lhs = Expressions.removeParentheses(assignment.lhsExpressions().get(0).expressions().get(0)); - } else if (parent instanceof AnnotatedAssignment annotatedAssignment - && annotatedAssignment.assignedValue() == rhs) { - lhs = annotatedAssignment.variable(); - } - if (!(lhs instanceof QualifiedExpression qualifiedExpression)) { - return false; - } - Expression qualifier = Expressions.removeParentheses(qualifiedExpression.qualifier()); - return qualifier instanceof Name name && "self".equals(name.name()); - } - - private static boolean escapesViaName(SymbolV2 symbol) { - return symbol.usages().stream().anyMatch(usage -> - usage.kind() == UsageV2.Kind.GLOBAL_DECLARATION - || isReturnedUsage(usage) - || isPassedAsArgumentUsage(usage)); - } - - private static boolean isReturnedUsage(UsageV2 usage) { - return !usage.isBindingUsage() - && TreeUtils.firstAncestorOfKind(usage.tree(), Tree.Kind.RETURN_STMT) != null; - } - - private static boolean isPassedAsArgumentUsage(UsageV2 usage) { - if (usage.isBindingUsage()) { - return false; - } - for (Tree current = usage.tree().parent(); current != null; current = current.parent()) { - if (current instanceof RegularArgument) { - return true; - } - if (current.is(Tree.Kind.FUNCDEF, Tree.Kind.FILE_INPUT, Tree.Kind.CLASSDEF, Tree.Kind.LAMBDA)) { - return false; - } - } - return false; - } - - /** - * Accepts direct and parenthesized context-manager expressions in {@code with} headers. - * {@code ExitStack.enter_context(pytest.raises(...))} is not excluded yet because {@code ExitStack} is often unknown to type inference. - */ - private static boolean isUsedAsWithContextManager(CallExpression callExpression) { - return TreeUtils.firstAncestorOfKind(callExpression, Tree.Kind.WITH_ITEM) != null; - } - - /** - * Accepts {@code ctx = pytest.raises(...)} (including parenthesized RHS) when {@code ctx} is later used in a - * {@code with} statement. Assignment that is never used as a context manager is still reported. - */ - private static boolean isAssignedAndUsedInWith(CallExpression callExpression) { - return assignedName(callExpression) - .map(Name::symbolV2) - .filter(Objects::nonNull) - .filter(PytestRaisesContextManagerCheck::isUsedInWith) - .isPresent(); + return null; } /** - * Accepts {@code pytest.raises(...)} nested in {@code @pytest.mark.parametrize} / {@code pytest.param} argvalues - * when the corresponding test parameter is used in a {@code with} statement. Raises values that are never used - * as a context manager (including a different parameter than the one used in {@code with}) are still reported. + * {@code pytest.raises(...)} used as a bare expression statement discards the context manager — + * safe to report. Nested uses (assignment RHS, call args, {@code with} items, etc.) are not. */ - private static boolean isParametrizeInjectedAndUsedInWith(CallExpression raisesCall, SubscriptionContext ctx) { - CallExpression parametrizeCall = enclosingParametrizeCall(raisesCall, ctx); - if (parametrizeCall == null) { - return false; - } - FunctionDef functionDef = (FunctionDef) TreeUtils.firstAncestorOfKind(raisesCall, Tree.Kind.FUNCDEF); - if (functionDef == null) { - return false; - } - List argNames = parametrizeArgNames(parametrizeCall); - OptionalInt column = columnIndexInArgvalues(raisesCall, parametrizeCall); - if (column.isEmpty() || column.getAsInt() >= argNames.size()) { - return false; - } - return parameterSymbol(functionDef, argNames.get(column.getAsInt())) - .filter(PytestRaisesContextManagerCheck::isUsedInWith) - .isPresent(); - } - - private static CallExpression enclosingParametrizeCall(CallExpression raisesCall, SubscriptionContext ctx) { - Decorator decorator = (Decorator) TreeUtils.firstAncestorOfKind(raisesCall, Tree.Kind.DECORATOR); - if (decorator == null) { - return null; - } - Expression expression = decorator.expression(); - if (!(expression instanceof CallExpression parametrizeCall)) { - return null; - } - return PYTEST_PARAMETRIZE_MATCHER.isTrueFor(parametrizeCall.callee(), ctx) ? parametrizeCall : null; - } - - private static List parametrizeArgNames(CallExpression parametrizeCall) { - RegularArgument argNamesArgument = TreeUtils.nthArgumentOrKeyword(0, "argnames", parametrizeCall.arguments()); - if (argNamesArgument == null) { - return List.of(); - } - Expression expression = Expressions.removeParentheses(argNamesArgument.expression()); - if (expression instanceof StringLiteral stringLiteral) { - return Arrays.stream(stringLiteral.trimmedQuotesValue().split(",")) - .map(String::trim) - .filter(name -> !name.isEmpty()) - .toList(); - } - return Expressions.expressionsFromListOrTuple(expression).stream() - .map(Expressions::removeParentheses) - .filter(StringLiteral.class::isInstance) - .map(StringLiteral.class::cast) - .map(StringLiteral::trimmedQuotesValue) - .map(String::trim) - .filter(name -> !name.isEmpty()) - .toList(); - } - - private static OptionalInt columnIndexInArgvalues(CallExpression raisesCall, CallExpression parametrizeCall) { - RegularArgument argValuesArgument = TreeUtils.nthArgumentOrKeyword(1, "argvalues", parametrizeCall.arguments()); - if (argValuesArgument == null) { - return OptionalInt.empty(); - } - Expression argValues = Expressions.removeParentheses(argValuesArgument.expression()); - for (Expression row : Expressions.expressionsFromListOrTuple(argValues)) { - OptionalInt column = columnIndexInRow(raisesCall, Expressions.removeParentheses(row)); - if (column.isPresent()) { - return column; - } - } - return OptionalInt.empty(); - } - - private static OptionalInt columnIndexInRow(CallExpression raisesCall, Expression row) { - if (row == raisesCall) { - return OptionalInt.of(0); - } - List elements = Expressions.expressionsFromListOrTuple(row); - if (!elements.isEmpty()) { - return indexOfContainingExpression(raisesCall, elements); - } - return columnIndexInCallPositionalArguments(raisesCall, row); - } - - private static OptionalInt columnIndexInCallPositionalArguments(CallExpression raisesCall, Expression row) { - if (!(row instanceof CallExpression call)) { - return OptionalInt.empty(); - } - List positionalArguments = call.arguments().stream() - .map(PytestRaisesContextManagerCheck::positionalArgumentExpression) - .flatMap(Optional::stream) - .toList(); - return indexOfContainingExpression(raisesCall, positionalArguments); - } - - private static Optional positionalArgumentExpression(Argument argument) { - if (!(argument instanceof RegularArgument regularArgument) || regularArgument.keywordArgument() != null) { - return Optional.empty(); - } - return Optional.of(regularArgument.expression()); - } - - private static OptionalInt indexOfContainingExpression(CallExpression raisesCall, List expressions) { - for (int i = 0; i < expressions.size(); i++) { - if (expressionContains(expressions.get(i), raisesCall)) { - return OptionalInt.of(i); - } - } - return OptionalInt.empty(); - } - - private static boolean expressionContains(Expression expression, CallExpression raisesCall) { - Expression unwrapped = Expressions.removeParentheses(expression); - return unwrapped == raisesCall || TreeUtils.hasDescendant(unwrapped, tree -> tree == raisesCall); - } - - private static Optional parameterSymbol(FunctionDef functionDef, String paramName) { - ParameterList parameters = functionDef.parameters(); - if (parameters == null) { - return Optional.empty(); - } - return parameters.nonTuple().stream() - .map(Parameter::name) - .filter(Objects::nonNull) - .filter(name -> paramName.equals(name.name())) - .map(Name::symbolV2) - .filter(Objects::nonNull) - .findFirst(); - } - - private static Optional assignedName(CallExpression callExpression) { - Expression rhs = outermostParenthesized(callExpression); - Tree parent = rhs.parent(); - if (parent instanceof AssignmentStatement assignment) { - return singleAssignedName(assignment.lhsExpressions()); - } - if (parent instanceof AnnotatedAssignment annotatedAssignment - && annotatedAssignment.assignedValue() == rhs) { - Expression variable = annotatedAssignment.variable(); - return variable instanceof Name name ? Optional.of(name) : Optional.empty(); - } - return Optional.empty(); + private static boolean isStandaloneExpressionStatement(CallExpression callExpression) { + Expression expression = outermostParenthesized(callExpression); + return expression.parent() instanceof ExpressionStatement; } private static Expression outermostParenthesized(Expression expression) { @@ -340,19 +91,4 @@ private static Expression outermostParenthesized(Expression expression) { } return current; } - - private static Optional singleAssignedName(List lhsExpressions) { - if (lhsExpressions.size() != 1 || lhsExpressions.get(0).expressions().size() != 1) { - return Optional.empty(); - } - Expression lhs = Expressions.removeParentheses(lhsExpressions.get(0).expressions().get(0)); - return lhs instanceof Name name ? Optional.of(name) : Optional.empty(); - } - - private static boolean isUsedInWith(SymbolV2 symbol) { - return symbol.usages().stream() - .filter(usage -> !usage.isBindingUsage()) - .map(UsageV2::tree) - .anyMatch(tree -> TreeUtils.firstAncestorOfKind(tree, Tree.Kind.WITH_ITEM) != null); - } } diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/PytestRaisesContextManagerCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/PytestRaisesContextManagerCheckTest.java index cd8fdc715..f9621820a 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/tests/PytestRaisesContextManagerCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/PytestRaisesContextManagerCheckTest.java @@ -16,22 +16,11 @@ */ package org.sonar.python.checks.tests; -import java.lang.reflect.Method; -import java.lang.reflect.Proxy; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; import org.junit.jupiter.api.Test; import org.sonar.plugins.python.api.PythonCheck; -import org.sonar.plugins.python.api.tree.CallExpression; -import org.sonar.plugins.python.api.tree.FunctionDef; -import org.sonar.plugins.python.api.tree.Tree; import org.sonar.python.checks.utils.PythonCheckVerifier; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; class PytestRaisesContextManagerCheckTest { @@ -44,79 +33,4 @@ void scope() { void sample() { PythonCheckVerifier.verify("src/test/resources/checks/tests/pytestRaisesContextManager.py", new PytestRaisesContextManagerCheck()); } - - /** - * Defensive coverage: {@code FunctionDef.parameters()} is null for some incomplete ASTs - * (e.g. lambda-like / synthetic trees). Real Python samples always produce a ParameterList, - * so this branch cannot be exercised via {@link #sample()}. - */ - @Test - void parameterSymbol_nullParameters() throws Exception { - Map config = new HashMap<>(); - config.put("kind", Tree.Kind.FUNCDEF); - config.put("parameters", null); - config.put("children", List.of()); - config.put("parent", null); - config.put("firstToken", null); - FunctionDef functionDef = proxy(FunctionDef.class, config); - Optional result = (Optional) invokePrivateStatic("parameterSymbol", - new Class[] {FunctionDef.class, String.class}, functionDef, "expectation"); - assertTrue(result.isEmpty()); - } - - /** - * Defensive coverage: early return when the call has no decorator ancestor - * ({@code enclosingParametrizeCall} is null). That path is not reachable through - * {@link #sample()} because the method is only invoked for calls already found under - * a parametrize decorator in normal analysis, but the null-check is still required. - */ - @Test - void isParametrizeInjectedAndUsedInWith_noDecoratorAncestor() throws Exception { - Map config = new HashMap<>(); - config.put("kind", Tree.Kind.CALL_EXPR); - config.put("children", List.of()); - config.put("parent", null); - config.put("firstToken", null); - config.put("arguments", List.of()); - CallExpression raisesCall = proxy(CallExpression.class, config); - boolean result = (boolean) invokePrivateStatic("isParametrizeInjectedAndUsedInWith", - new Class[] {CallExpression.class, org.sonar.plugins.python.api.SubscriptionContext.class}, - raisesCall, null); - assertFalse(result); - } - - private static Object invokePrivateStatic(String methodName, Class[] parameterTypes, Object... arguments) throws Exception { - Method method = PytestRaisesContextManagerCheck.class.getDeclaredMethod(methodName, parameterTypes); - method.setAccessible(true); - return method.invoke(null, arguments); - } - - private static T proxy(Class type, Map values) { - return type.cast(Proxy.newProxyInstance(type.getClassLoader(), new Class[] {type}, (proxy, method, args) -> { - String name = method.getName(); - if (values.containsKey(name)) { - return values.get(name); - } - if ("hashCode".equals(name)) { - return System.identityHashCode(proxy); - } - if ("equals".equals(name)) { - return proxy == args[0]; - } - if ("toString".equals(name)) { - return "proxy(" + type.getSimpleName() + ")"; - } - Class returnType = method.getReturnType(); - if (returnType.equals(boolean.class)) { - return false; - } - if (returnType.equals(int.class)) { - return 0; - } - if (List.class.isAssignableFrom(returnType)) { - return List.of(); - } - return null; - })); - } } diff --git a/python-checks/src/test/resources/checks/tests/pytestRaisesContextManager.py b/python-checks/src/test/resources/checks/tests/pytestRaisesContextManager.py index 76f842ae6..20fb897d7 100644 --- a/python-checks/src/test/resources/checks/tests/pytestRaisesContextManager.py +++ b/python-checks/src/test/resources/checks/tests/pytestRaisesContextManager.py @@ -17,9 +17,16 @@ def bootstrap_session(df=10): def test_standalone_raises(): pytest.raises(ValueError) # Noncompliant {{Prefer the context manager form: wrap the raising code in "with pytest.raises(...)".}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^ process_data('hello') +def test_standalone_raises_with_match(): + pytest.raises(ValueError, match="must be positive") # Noncompliant {{Prefer the context manager form: wrap the raising code in "with pytest.raises(...)".}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + bootstrap_session(df=-1) + + def test_deprecated_callable_passing_form(): pytest.raises(ValueError, bootstrap_session, df=-1) # Noncompliant {{Prefer the context manager form: wrap the raising code in "with pytest.raises(...)".}} # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -30,6 +37,13 @@ def test_typo_calling_function_immediately(): # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +def test_deprecated_callable_even_when_assigned(): + # Deprecated callable form is always reported, even if assigned. + ctx = pytest.raises(ValueError, bootstrap_session, df=-1) # Noncompliant {{Prefer the context manager form: wrap the raising code in "with pytest.raises(...)".}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + process_data('hello') + + def test_compliant_with_block(): with pytest.raises(ValueError): process_data(123) @@ -51,7 +65,7 @@ def test_compliant_imported_raises(): process_data(123) -def test_noncompliant_imported_raises(): +def test_noncompliant_imported_raises_deprecated(): imported_raises(ValueError, bootstrap_session, df=-1) # Noncompliant {{Prefer the context manager form: wrap the raising code in "with pytest.raises(...)".}} # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -65,6 +79,12 @@ def test_compliant_parenthesized_with_block(): process_data(123) +def test_noncompliant_standalone_parenthesized_raises(): + (pytest.raises(ValueError)) # Noncompliant {{Prefer the context manager form: wrap the raising code in "with pytest.raises(...)".}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^ + process_data('hello') + + def test_compliant_saved_raises_reused_in_with(): ctx = pytest.raises(ValueError) with ctx: @@ -87,6 +107,14 @@ def test_compliant_saved_raises_conditional_then_with(): process_data(123) +def test_compliant_ternary_assignment_used_in_with(descr, fields, expected): + # Production FP: assigned via ternary, later used as context manager. + context = contextlib.nullcontext() if isinstance(expected, dict) else pytest.raises(expected) + with context: + result = process_data(fields) + assert result == expected, descr + + def test_compliant_saved_parenthesized_raises_reused_in_with(): ctx = (pytest.raises(ValueError)) with ctx: @@ -99,30 +127,26 @@ def test_compliant_annotated_assignment_reused_in_with(): process_data(123) -def test_noncompliant_saved_raises_never_used_in_with(): - ctx = pytest.raises(ValueError) # Noncompliant {{Prefer the context manager form: wrap the raising code in "with pytest.raises(...)".}} -# ^^^^^^^^^^^^^^^^^^^^^^^^^ +def test_compliant_saved_raises_never_used_in_with(): + # Uncertain: value may escape analysis; prefer FN over FP. + ctx = pytest.raises(ValueError) process_data('hello') -def test_noncompliant_chained_assignment_even_if_used_in_with(): - # Chained assignment is not tracked as a single saved context manager. - a = b = pytest.raises(ValueError) # Noncompliant {{Prefer the context manager form: wrap the raising code in "with pytest.raises(...)".}} -# ^^^^^^^^^^^^^^^^^^^^^^^^^ +def test_compliant_chained_assignment_used_in_with(): + a = b = pytest.raises(ValueError) with a: process_data(123) -def test_noncompliant_tuple_unpacking_assignment(): - ctx, other = pytest.raises(ValueError), None # Noncompliant {{Prefer the context manager form: wrap the raising code in "with pytest.raises(...)".}} -# ^^^^^^^^^^^^^^^^^^^^^^^^^ +def test_compliant_tuple_unpacking_assignment(): + ctx, other = pytest.raises(ValueError), None process_data('hello') -def test_noncompliant_attribute_assignment(): +def test_compliant_attribute_assignment(): holder = type('Holder', (), {})() - holder.ctx = pytest.raises(ValueError) # Noncompliant {{Prefer the context manager form: wrap the raising code in "with pytest.raises(...)".}} -# ^^^^^^^^^^^^^^^^^^^^^^^^^ + holder.ctx = pytest.raises(ValueError) process_data('hello') @@ -177,10 +201,10 @@ def test_compliant_parametrize_list_argnames_raises_used_in_with(expectation): @pytest.mark.parametrize( "expectation", - [pytest.raises(ValueError)], # Noncompliant {{Prefer the context manager form: wrap the raising code in "with pytest.raises(...)".}} -# ^^^^^^^^^^^^^^^^^^^^^^^^^ + [pytest.raises(ValueError)], ) -def test_noncompliant_parametrize_raises_never_used_in_with(expectation): +def test_compliant_parametrize_raises_never_used_in_with(expectation): + # Uncertain injection usage; prefer FN over FP. process_data('hello') @@ -190,58 +214,16 @@ def test_noncompliant_parametrize_raises_never_used_in_with(expectation): pytest.param( 1, contextlib.nullcontext(), - pytest.raises(ValueError), # Noncompliant {{Prefer the context manager form: wrap the raising code in "with pytest.raises(...)".}} -# ^^^^^^^^^^^^^^^^^^^^^^^^^ + pytest.raises(ValueError), ), ], ) -def test_noncompliant_parametrize_raises_not_the_with_param(x, expectation, unused): - with expectation: - process_data(123) - - -@pytest.mark.parametrize( - "expectation", - [{pytest.raises(ValueError): None}], # Noncompliant {{Prefer the context manager form: wrap the raising code in "with pytest.raises(...)".}} -# ^^^^^^^^^^^^^^^^^^^^^^^^^ -) -def test_noncompliant_parametrize_raises_in_unsupported_row_shape(expectation): - with expectation: - process_data(123) - - -@pytest.mark.parametrize(argvalues=[pytest.raises(ValueError)]) # Noncompliant {{Prefer the context manager form: wrap the raising code in "with pytest.raises(...)".}} -# ^^^^^^^^^^^^^^^^^^^^^^^^^ -def test_noncompliant_parametrize_missing_argnames(expectation): +def test_compliant_parametrize_raises_not_the_with_param(x, expectation, unused): with expectation: process_data(123) -@pytest.mark.parametrize(*["expectation", [pytest.raises(TypeError)]]) # Noncompliant {{Prefer the context manager form: wrap the raising code in "with pytest.raises(...)".}} -# ^^^^^^^^^^^^^^^^^^^^^^^^ -def test_noncompliant_parametrize_starred_args(expectation): - with expectation: - process_data(123) - - -@pytest.mark.parametrize( - "expectation,", - [pytest.raises(ValueError)], -) -def test_compliant_parametrize_argnames_trailing_comma(expectation): - with expectation: - process_data(123) - - -def test_noncompliant_annotated_attribute_assignment(): - holder = type('Holder', (), {})() - holder.ctx: object = pytest.raises(ValueError) # Noncompliant {{Prefer the context manager form: wrap the raising code in "with pytest.raises(...)".}} -# ^^^^^^^^^^^^^^^^^^^^^^^^^ - process_data('hello') - - def external_error_raised(expected_exception): - # Escapes via return for callers that use: with external_error_raised(...): return pytest.raises(expected_exception, match=None) @@ -271,7 +253,6 @@ def store_raises_on_self_annotated(self): def escapes_via_argument_to_other_call(expected_exception): - # Escapes as a call argument — caller may use it in with. return process_data(pytest.raises(expected_exception, match=None)) From c15c0f63a86cab41069cf443442e93b75461733f Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Mon, 10 Aug 2026 14:20:46 +0200 Subject: [PATCH 282/322] SONARPY-4487 Implement rule S9002 - Function-scoped tests should use "tmp_path" instead of "tmp_path_factory" GitOrigin-RevId: c9f3f041d00fa42f13e0ba5a2459917810cad11b --- .../python/checks/OpenSourceCheckList.java | 2 + .../UseTmpPathInsteadOfFactoryCheck.java | 80 +++++++++++++++++ .../org/sonar/l10n/py/rules/python/S9002.html | 36 ++++++++ .../org/sonar/l10n/py/rules/python/S9002.json | 25 ++++++ .../py/rules/python/Sonar_way_profile.json | 1 + .../UseTmpPathInsteadOfFactoryCheckTest.java | 55 ++++++++++++ .../tests/test_useTmpPathInsteadOfFactory.py | 86 +++++++++++++++++++ .../tests/useTmpPathInsteadOfFactory.py | 6 ++ .../tests/useTmpPathInsteadOfFactory_test.py | 4 + 9 files changed, 295 insertions(+) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/tests/UseTmpPathInsteadOfFactoryCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9002.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9002.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/tests/UseTmpPathInsteadOfFactoryCheckTest.java create mode 100644 python-checks/src/test/resources/checks/tests/test_useTmpPathInsteadOfFactory.py create mode 100644 python-checks/src/test/resources/checks/tests/useTmpPathInsteadOfFactory.py create mode 100644 python-checks/src/test/resources/checks/tests/useTmpPathInsteadOfFactory_test.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index bb330252e..19f4c5229 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -127,6 +127,7 @@ import org.sonar.python.checks.tests.TestCasesShouldContainTestsCheck; import org.sonar.python.checks.tests.UnconditionalAssertionCheck; import org.sonar.python.checks.tests.UseMonkeypatchFixtureCheck; +import org.sonar.python.checks.tests.UseTmpPathInsteadOfFactoryCheck; import org.sonar.python.checks.tests.UselessPytestMarksCheck; import org.sonar.python.checks.tests.XfailNoReasonCheck; @@ -531,6 +532,7 @@ public Stream> getChecks() { RewriteCollectionConstructorAsComprehensionCheck.class, UnconditionalAssertionCheck.class, UseMonkeypatchFixtureCheck.class, + UseTmpPathInsteadOfFactoryCheck.class, UselessPytestMarksCheck.class, UndefinedNameAllPropertyCheck.class, UnencryptedSageMakerNotebookCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/UseTmpPathInsteadOfFactoryCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/UseTmpPathInsteadOfFactoryCheck.java new file mode 100644 index 000000000..ae4690b3c --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/UseTmpPathInsteadOfFactoryCheck.java @@ -0,0 +1,80 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.Decorator; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.FunctionDef; +import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.Parameter; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.checks.utils.UnittestUtils; +import org.sonar.python.tree.TreeUtils; + +@Rule(key = "S9002") +public class UseTmpPathInsteadOfFactoryCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Use \"tmp_path\" instead of \"tmp_path_factory\" in function-scoped tests."; + private static final String TMP_PATH_FACTORY = "tmp_path_factory"; + private static final TypeMatcher PYTEST_FIXTURE_MATCHER = TypeMatchers.withFQN(UnittestUtils.PYTEST_FIXTURE_DECORATOR_FQN); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.FUNCDEF, UseTmpPathInsteadOfFactoryCheck::checkFunction); + } + + private static void checkFunction(SubscriptionContext ctx) { + FunctionDef functionDef = (FunctionDef) ctx.syntaxNode(); + if (!UnittestUtils.isPytestStyleTestFunction(functionDef, ctx.pythonFile().fileName())) { + return; + } + if (isPytestFixture(functionDef, ctx)) { + return; + } + + for (Parameter parameter : TreeUtils.nonTupleParameters(functionDef)) { + Name name = parameter.name(); + if (name != null && TMP_PATH_FACTORY.equals(name.name())) { + ctx.addIssue(name, MESSAGE); + } + } + } + + private static boolean isPytestFixture(FunctionDef functionDef, SubscriptionContext ctx) { + return functionDef.decorators().stream() + .anyMatch(decorator -> PYTEST_FIXTURE_MATCHER.isTrueFor(decoratorExpression(decorator), ctx)); + } + + private static Expression decoratorExpression(Decorator decorator) { + Expression expression = decorator.expression(); + if (expression instanceof CallExpression callExpression) { + return callExpression.callee(); + } + return expression; + } + + @Override + public CheckScope scope() { + return CheckScope.ALL; + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9002.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9002.html new file mode 100644 index 000000000..4571ca839 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9002.html @@ -0,0 +1,36 @@ +

        This rule raises an issue when a function-scoped test uses the tmp_path_factory fixture instead of the tmp_path +fixture.

        +

        Why is this an issue?

        +

        tmp_path provides an isolated directory for one test. tmp_path_factory is for session, module, or class-scoped fixtures +that share directories across tests.

        +

        Using the factory in a function-scoped test adds an unnecessary mktemp() call and obscures intent.

        +

        What is the potential impact?

        +

        Choosing the session-scoped factory in function-scoped tests raises the cost of onboarding developers to the fixture graph.

        +

        How to fix it

        +

        Replace tmp_path_factory with tmp_path in function-scoped tests.

        +

        Code examples

        +

        Noncompliant code example

        +
        +def test_file_operation(tmp_path_factory):  # Noncompliant
        +    # Unnecessary factory for function scope
        +    temp_dir = tmp_path_factory.mktemp('data')
        +    test_file = temp_dir / 'test.txt'
        +    test_file.write_text('content')
        +    assert test_file.read_text() == 'content'
        +
        +

        Compliant solution

        +
        +def test_file_operation(tmp_path):
        +    # Direct tmp_path for function scope
        +    test_file = tmp_path / 'test.txt'
        +    test_file.write_text('content')
        +    assert test_file.read_text() == 'content'
        +
        +

        Resources

        +

        Documentation

        + + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9002.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9002.json new file mode 100644 index 000000000..6e57664a5 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9002.json @@ -0,0 +1,25 @@ +{ + "title": "Function-scoped tests should use \"tmp_path\" instead of \"tmp_path_factory\"", + "type": "CODE_SMELL", + "status": "beta", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5 min" + }, + "tags": [ + "pytest", + "tests", + "confusing" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-9002", + "sqKey": "S9002", + "scope": "Tests", + "quickfix": "unknown", + "code": { + "impacts": { + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "CLEAR" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 1eb0d986a..86b579952 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -381,6 +381,7 @@ "S8999", "S9000", "S9001", + "S9002", "S9073", "S9074", "S9075", diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/UseTmpPathInsteadOfFactoryCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/UseTmpPathInsteadOfFactoryCheckTest.java new file mode 100644 index 000000000..f99626eaf --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/UseTmpPathInsteadOfFactoryCheckTest.java @@ -0,0 +1,55 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.sonar.plugins.python.api.PythonCheck; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class UseTmpPathInsteadOfFactoryCheckTest { + + private static final String RESOURCES = "src/test/resources/checks/tests/"; + + @Test + void test() { + PythonCheckVerifier.verify(RESOURCES + "test_useTmpPathInsteadOfFactory.py", new UseTmpPathInsteadOfFactoryCheck()); + } + + @ParameterizedTest + @CsvSource({ + "useTmpPathInsteadOfFactory.py, false", + "useTmpPathInsteadOfFactory_test.py, true" + }) + void testFileNames(String fileName, boolean expectIssues) { + var check = new UseTmpPathInsteadOfFactoryCheck(); + var path = RESOURCES + fileName; + if (expectIssues) { + PythonCheckVerifier.verify(path, check); + } else { + PythonCheckVerifier.verifyNoIssue(path, check); + } + } + + @Test + void scope() { + assertEquals(PythonCheck.CheckScope.ALL, new UseTmpPathInsteadOfFactoryCheck().scope()); + } +} diff --git a/python-checks/src/test/resources/checks/tests/test_useTmpPathInsteadOfFactory.py b/python-checks/src/test/resources/checks/tests/test_useTmpPathInsteadOfFactory.py new file mode 100644 index 000000000..de860514f --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/test_useTmpPathInsteadOfFactory.py @@ -0,0 +1,86 @@ +import pytest + + +def test_file_operation(tmp_path_factory): # Noncompliant {{Use "tmp_path" instead of "tmp_path_factory" in function-scoped tests.}} +# ^^^^^^^^^^^^^^^^ + temp_dir = tmp_path_factory.mktemp('data') + test_file = temp_dir / 'test.txt' + test_file.write_text('content') + assert test_file.read_text() == 'content' + + +def test_with_other_fixtures(tmp_path_factory, monkeypatch): # Noncompliant +# ^^^^^^^^^^^^^^^^ + temp_dir = tmp_path_factory.mktemp('data') + assert temp_dir.exists() + + +async def test_async(tmp_path_factory): # Noncompliant +# ^^^^^^^^^^^^^^^^ + temp_dir = tmp_path_factory.mktemp('data') + assert temp_dir.exists() + + +@pytest.mark.parametrize("value", [1, 2]) +def test_parametrized(tmp_path_factory, value): # Noncompliant +# ^^^^^^^^^^^^^^^^ + assert (tmp_path_factory.mktemp('data') / str(value)).parent.exists() + + +class TestSomething: + def test_method(self, tmp_path_factory): # Noncompliant +# ^^^^^^^^^^^^^^^^ + temp_dir = tmp_path_factory.mktemp('data') + assert temp_dir.exists() + + +def test_file_operation_compliant(tmp_path): + test_file = tmp_path / 'test.txt' + test_file.write_text('content') + assert test_file.read_text() == 'content' + + +def test_no_tmp_path(): + assert True + + +@pytest.fixture +def function_scoped_fixture(tmp_path_factory): + return tmp_path_factory.mktemp('data') + + +@pytest.fixture(scope="session") +def session_data(tmp_path_factory): + return tmp_path_factory.mktemp('session') + + +@pytest.fixture(scope="module") +def module_data(tmp_path_factory): + return tmp_path_factory.mktemp('module') + + +@pytest.fixture(scope="class") +def class_data(tmp_path_factory): + return tmp_path_factory.mktemp('class') + + +@pytest.fixture(scope="package") +def package_data(tmp_path_factory): + return tmp_path_factory.mktemp('package') + + +def helper_not_a_test(tmp_path_factory): + return tmp_path_factory.mktemp('helper') + + +def setup_module(tmp_path_factory): + return tmp_path_factory.mktemp('setup') + + +class TestHelpers: + def helper_method(self, tmp_path_factory): + return tmp_path_factory.mktemp('helper') + + @pytest.fixture + def test_looking_fixture(self, tmp_path_factory): + return tmp_path_factory.mktemp('fixture') diff --git a/python-checks/src/test/resources/checks/tests/useTmpPathInsteadOfFactory.py b/python-checks/src/test/resources/checks/tests/useTmpPathInsteadOfFactory.py new file mode 100644 index 000000000..e523f38ae --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/useTmpPathInsteadOfFactory.py @@ -0,0 +1,6 @@ +# Not a pytest-collected file name — no issues expected. + + +def test_file_operation(tmp_path_factory): + temp_dir = tmp_path_factory.mktemp('data') + assert temp_dir.exists() diff --git a/python-checks/src/test/resources/checks/tests/useTmpPathInsteadOfFactory_test.py b/python-checks/src/test/resources/checks/tests/useTmpPathInsteadOfFactory_test.py new file mode 100644 index 000000000..a0374cd1b --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/useTmpPathInsteadOfFactory_test.py @@ -0,0 +1,4 @@ +def test_file_operation(tmp_path_factory): # Noncompliant {{Use "tmp_path" instead of "tmp_path_factory" in function-scoped tests.}} +# ^^^^^^^^^^^^^^^^ + temp_dir = tmp_path_factory.mktemp('data') + assert temp_dir.exists() From 26f310d12258104b476d6a442eeebb461aa815c3 Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Mon, 10 Aug 2026 14:52:45 +0200 Subject: [PATCH 283/322] SONARPY-4499 Fixing cache key of projectLevelSymbolTable GitOrigin-RevId: 2f59f8e1179944b5753f3acdb30fd1831f10755c --- .../indexer/SonarQubePythonIndexer.java | 6 ++-- .../indexer/SonarQubePythonIndexerTest.java | 31 +++++++++++++++++++ 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/python-commons/src/main/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexer.java b/python-commons/src/main/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexer.java index 3df2847de..3215f7bf7 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexer.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexer.java @@ -172,7 +172,7 @@ private boolean tryToUseCache(Map> importsByModule, PythonIn } Set descriptors = caching.readProjectLevelSymbolTableEntry(inputFile.wrappedFile().key()); if (descriptors != null && imports != null) { - saveRetrievedDescriptors(inputFile.wrappedFile().key(), descriptors, caching); + saveRetrievedDescriptors(inputFile.wrappedFile().key(), currFQN, descriptors, caching); return true; } @@ -190,8 +190,8 @@ private boolean fileIsUnchanged(PythonInputFile inputFile) { return MessageDigest.isEqual(fileHash, fileInputHash); } - private void saveRetrievedDescriptors(String fileKey, Set descriptors, Caching caching) { - projectLevelSymbolTable().insertEntry(fileKey, descriptors); + private void saveRetrievedDescriptors(String fileKey, String moduleFQN, Set descriptors, Caching caching) { + projectLevelSymbolTable().insertEntry(moduleFQN, descriptors); caching.copyFromPrevious(fileKey); } diff --git a/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexerTest.java b/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexerTest.java index 553165a67..191a47a3a 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexerTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexerTest.java @@ -43,6 +43,7 @@ import org.sonar.python.caching.CacheContextImpl; import org.sonar.python.caching.PythonReadCacheImpl; import org.sonar.python.caching.PythonWriteCacheImpl; +import org.sonar.python.index.Descriptor; import org.sonar.python.index.VariableDescriptor; import org.sonar.python.project.config.ProjectConfigurationBuilder; import org.sonar.python.types.TypeShed; @@ -757,4 +758,34 @@ void test_package_roots_from_both_pyproject_and_setup_py() throws IOException { assertThat(indexer.packageName(moduleFile)).isEqualTo("mypackage"); assertThat(indexer.packageName(utilsFile)).isEqualTo("otherpackage"); } + + @Test + void test_cached_descriptors_accessible_by_module_fqn() { + // Both files unchanged — triggers the optimized cache path + file1 = createInputFile(baseDir, "main.py", InputFile.Status.SAME, InputFile.Type.MAIN); + file2 = createInputFile(baseDir, "mod.py", InputFile.Status.SAME, InputFile.Type.MAIN); + + List inputFiles = new ArrayList<>(Arrays.asList(file1, file2)); + + VariableDescriptor modDescriptor = new VariableDescriptor("add", "mod.add", null); + byte[] serializedMain = toProtobufModuleDescriptor(Set.of(new VariableDescriptor("x", "main.x", null))).toByteArray(); + byte[] serializedMod = toProtobufModuleDescriptor(Set.of(modDescriptor)).toByteArray(); + + readCache.put(importsMapCacheKey("moduleKey:main.py"), importsAsByteArray(List.of("mod"))); + readCache.put(importsMapCacheKey("moduleKey:mod.py"), importsAsByteArray(Collections.emptyList())); + readCache.put(projectSymbolTableCacheKey("moduleKey:main.py"), serializedMain); + readCache.put(projectSymbolTableCacheKey("moduleKey:mod.py"), serializedMod); + readCache.put(fileContentHashCacheKey("moduleKey:main.py"), file1.wrappedFile().md5Hash().getBytes(StandardCharsets.UTF_8)); + readCache.put(fileContentHashCacheKey("moduleKey:mod.py"), file2.wrappedFile().md5Hash().getBytes(StandardCharsets.UTF_8)); + + pythonIndexer = new SonarQubePythonIndexer(inputFiles, cacheContext, context, new ProjectConfigurationBuilder()); + pythonIndexer.buildOnce(context); + + // Confirm the optimized cache path was taken for mod.py + assertThat(pythonIndexer.canBePartiallyScannedWithoutParsing(file2)).isTrue(); + + Set descriptors = pythonIndexer.projectLevelSymbolTable().getDescriptorsFromModule("mod"); + assertThat(descriptors).isNotNull(); + assertThat(descriptors).extracting(Descriptor::name).containsExactly("add"); + } } From f6d387814919da046371f9a7ef7e55dbf86f6c2c Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Tue, 11 Aug 2026 11:40:33 +0200 Subject: [PATCH 284/322] SONARPY-4488 Implement rule S9088 - Only one method invocation is expected when testing warnings GitOrigin-RevId: 8325701cc3ca291cc0bf88972f98d832676043fb --- .../python/checks/OpenSourceCheckList.java | 2 + ...SingleInvocationRuntimeExceptionCheck.java | 148 +------- .../tests/SingleInvocationWarningCheck.java | 63 ++++ .../checks/utils/SingleInvocationUtils.java | 170 +++++++++ .../org/sonar/l10n/py/rules/python/S9088.html | 92 +++++ .../org/sonar/l10n/py/rules/python/S9088.json | 24 ++ .../py/rules/python/Sonar_way_profile.json | 1 + .../SingleInvocationWarningCheckTest.java | 36 ++ .../checks/tests/singleInvocationWarning.py | 335 ++++++++++++++++++ 9 files changed, 734 insertions(+), 137 deletions(-) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/tests/SingleInvocationWarningCheck.java create mode 100644 python-checks/src/main/java/org/sonar/python/checks/utils/SingleInvocationUtils.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9088.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9088.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/tests/SingleInvocationWarningCheckTest.java create mode 100644 python-checks/src/test/resources/checks/tests/singleInvocationWarning.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 19f4c5229..156e2bbfb 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -121,6 +121,7 @@ import org.sonar.python.checks.tests.PytestRaisesContextManagerCheck; import org.sonar.python.checks.tests.PytestUselessYieldFixtureCheck; import org.sonar.python.checks.tests.SingleInvocationRuntimeExceptionCheck; +import org.sonar.python.checks.tests.SingleInvocationWarningCheck; import org.sonar.python.checks.tests.SkippedTestNoReasonCheck; import org.sonar.python.checks.tests.SpecificExceptionAssertionCheck; import org.sonar.python.checks.tests.SpecificWarningAssertionCheck; @@ -469,6 +470,7 @@ public Stream> getChecks() { SingleCharCharacterClassCheck.class, SingleDispatchMixupCheck.class, SingleInvocationRuntimeExceptionCheck.class, + SingleInvocationWarningCheck.class, SkippedTestNoReasonCheck.class, SkLearnEstimatorDontInitializeEstimatedValuesCheck.class, SleepZeroInAsyncCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheck.java index 6c29d638f..f7322d99c 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/SingleInvocationRuntimeExceptionCheck.java @@ -16,19 +16,13 @@ */ package org.sonar.python.checks.tests; -import java.util.ArrayList; -import java.util.Comparator; import java.util.List; import java.util.Optional; import org.sonar.check.Rule; -import org.sonar.plugins.python.api.IssueLocation; -import org.sonar.plugins.python.api.PythonCheck; import org.sonar.plugins.python.api.PythonSubscriptionCheck; import org.sonar.plugins.python.api.SubscriptionContext; import org.sonar.plugins.python.api.tree.Argument; -import org.sonar.plugins.python.api.tree.BaseTreeVisitor; import org.sonar.plugins.python.api.tree.CallExpression; -import org.sonar.plugins.python.api.tree.FunctionDef; import org.sonar.plugins.python.api.tree.LambdaExpression; import org.sonar.plugins.python.api.tree.Name; import org.sonar.plugins.python.api.tree.QualifiedExpression; @@ -38,6 +32,7 @@ import org.sonar.plugins.python.api.tree.WithStatement; import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.checks.utils.SingleInvocationUtils; import org.sonar.python.checks.utils.UnittestUtils; @Rule(key = "S5778") @@ -47,72 +42,6 @@ public class SingleInvocationRuntimeExceptionCheck extends PythonSubscriptionChe private static final TypeMatcher PYTEST_RAISES_MATCHER = TypeMatchers.isType("pytest.raises"); - /** - * Calls that are almost never the exception under test when nested inside {@code pytest.raises} / - * {@code assertRaises}. Treating them as safe avoids noisy FPs on common setup helpers. - */ - private static final TypeMatcher ALWAYS_SAFE_CALL_MATCHER = TypeMatchers.any( - TypeMatchers.isType("builtins.str"), - TypeMatchers.isType("builtins.bytes"), - TypeMatchers.isType("builtins.bytearray"), - TypeMatchers.isType("builtins.repr"), - TypeMatchers.isType("builtins.ascii"), - TypeMatchers.isType("builtins.format"), - TypeMatchers.isType("builtins.bool"), - TypeMatchers.isType("builtins.int"), - TypeMatchers.isType("builtins.float"), - TypeMatchers.isType("builtins.complex"), - TypeMatchers.isType("builtins.memoryview"), - TypeMatchers.isType("builtins.list"), - TypeMatchers.isType("builtins.tuple"), - TypeMatchers.isType("builtins.dict"), - TypeMatchers.isType("builtins.print"), - TypeMatchers.isType("builtins.len"), - TypeMatchers.isType("builtins.abs"), - TypeMatchers.isType("builtins.round"), - TypeMatchers.isType("builtins.id"), - TypeMatchers.isType("builtins.hash"), - TypeMatchers.isType("builtins.hex"), - TypeMatchers.isType("builtins.oct"), - TypeMatchers.isType("builtins.bin"), - TypeMatchers.isType("builtins.ord"), - TypeMatchers.isType("builtins.chr"), - TypeMatchers.isType("builtins.range"), - TypeMatchers.isType("builtins.enumerate"), - TypeMatchers.isType("builtins.zip"), - TypeMatchers.isType("builtins.reversed"), - TypeMatchers.isType("builtins.sorted"), - TypeMatchers.isType("builtins.slice"), - TypeMatchers.isType("builtins.callable"), - TypeMatchers.isType("pathlib.Path"), - TypeMatchers.isType("pathlib.PurePath"), - TypeMatchers.isType("pathlib.PosixPath"), - TypeMatchers.isType("pathlib.WindowsPath"), - TypeMatchers.isType("pathlib.PurePosixPath"), - TypeMatchers.isType("pathlib.PureWindowsPath"), - TypeMatchers.isType("uuid.UUID"), - TypeMatchers.isType("uuid.uuid1"), - TypeMatchers.isType("uuid.uuid3"), - TypeMatchers.isType("uuid.uuid4"), - TypeMatchers.isType("uuid.uuid5"), - TypeMatchers.isType("uuid.uuid6"), - TypeMatchers.isType("uuid.uuid7"), - TypeMatchers.isType("uuid.uuid8"), - TypeMatchers.isType("copy.copy"), - TypeMatchers.isType("copy.deepcopy"), - // NumPy/SciPy lack stubs → UnresolvedImportType; withFQNPrefix covers factories/helpers - // (zeros, random, copy, legendre, …) used as nested setup in exception assertions. - TypeMatchers.withFQNPrefix("numpy."), - TypeMatchers.withFQNPrefix("scipy.")); - - /** - * Constructors that are safe only without arguments (with args they commonly raise TypeError). - */ - private static final TypeMatcher EMPTY_ARGS_SAFE_CALL_MATCHER = TypeMatchers.any( - TypeMatchers.isType("builtins.set"), - TypeMatchers.isType("builtins.frozenset"), - TypeMatchers.isType("builtins.object")); - @Override public void initialize(Context context) { context.registerSyntaxNodeConsumer(Tree.Kind.WITH_STMT, ctx -> checkWithStatement(ctx, (WithStatement) ctx.syntaxNode())); @@ -135,9 +64,12 @@ private static void checkWithStatement(SubscriptionContext ctx, WithStatement wi return; } - var invocations = unsafeInvocations(withStatement.statements(), ctx); + var invocations = SingleInvocationUtils.unsafeInvocations(withStatement.statements(), ctx); if (invocations.size() > 1) { - reportIfMultipleInvocations(ctx.addIssue(withStatement.withKeyword(), withStatement.colon(), MESSAGE), invocations); + SingleInvocationUtils.reportIfMultipleInvocations( + ctx.addIssue(withStatement.withKeyword(), withStatement.colon(), MESSAGE), + invocations, + SECONDARY_MESSAGE); } } @@ -147,9 +79,12 @@ private static void checkDirectRaiseCall(SubscriptionContext ctx, CallExpression } findLambdaArgument(callExpression.arguments()) - .map(lambdaExpression -> unsafeInvocations(lambdaExpression.expression(), ctx)) + .map(lambdaExpression -> SingleInvocationUtils.unsafeInvocations(lambdaExpression.expression(), ctx)) .filter(invocations -> invocations.size() > 1) - .ifPresent(invocations -> reportIfMultipleInvocations(ctx.addIssue(callExpression, MESSAGE), invocations)); + .ifPresent(invocations -> SingleInvocationUtils.reportIfMultipleInvocations( + ctx.addIssue(callExpression, MESSAGE), + invocations, + SECONDARY_MESSAGE)); } private static boolean isPytestRaise(CallExpression callExpression, SubscriptionContext ctx) { @@ -176,65 +111,4 @@ private static Optional findLambdaArgument(List argu .map(LambdaExpression.class::cast) .findFirst(); } - - private static void reportIfMultipleInvocations(PythonCheck.PreciseIssue issue, List invocations) { - invocations.forEach(invocation -> issue.secondary(invocationLocation(invocation, SECONDARY_MESSAGE))); - } - - private static IssueLocation invocationLocation(CallExpression invocation, String message) { - if (invocation.callee() instanceof QualifiedExpression qualifiedExpression) { - return IssueLocation.preciseLocation(qualifiedExpression.name().firstToken(), invocation.rightPar(), message); - } - if (invocation.callee() instanceof Name calleeName) { - return IssueLocation.preciseLocation(calleeName.firstToken(), invocation.rightPar(), message); - } - return IssueLocation.preciseLocation(invocation, message); - } - - private static List unsafeInvocations(Tree tree, SubscriptionContext ctx) { - var visitor = new InvocationCollector(ctx); - tree.accept(visitor); - return visitor.invocations.stream() - .sorted(Comparator - .comparingInt((CallExpression invocation) -> invocation.firstToken().line()) - .thenComparingInt(invocation -> invocation.firstToken().column()) - .thenComparingInt(invocation -> invocation.lastToken().line()) - .thenComparingInt(invocation -> invocation.lastToken().column())) - .toList(); - } - - private static class InvocationCollector extends BaseTreeVisitor { - private final SubscriptionContext ctx; - private final List invocations = new ArrayList<>(); - - private InvocationCollector(SubscriptionContext ctx) { - this.ctx = ctx; - } - - @Override - public void visitCallExpression(CallExpression callExpression) { - if (!isSafeCall(callExpression)) { - invocations.add(callExpression); - } - super.visitCallExpression(callExpression); - } - - @Override - public void visitLambda(LambdaExpression lambdaExpression) { - // Nested lambdas define deferred execution and should not contribute calls here. - } - - @Override - public void visitFunctionDef(FunctionDef functionDef) { - // Nested function bodies are not executed when merely defined. - } - - private boolean isSafeCall(CallExpression callExpression) { - if (ALWAYS_SAFE_CALL_MATCHER.isTrueFor(callExpression.callee(), ctx)) { - return true; - } - return EMPTY_ARGS_SAFE_CALL_MATCHER.isTrueFor(callExpression.callee(), ctx) - && callExpression.arguments().isEmpty(); - } - } } diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/SingleInvocationWarningCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/SingleInvocationWarningCheck.java new file mode 100644 index 000000000..14e1c43a8 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/SingleInvocationWarningCheck.java @@ -0,0 +1,63 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.tree.WithItem; +import org.sonar.plugins.python.api.tree.WithStatement; +import org.sonar.python.checks.utils.SingleInvocationUtils; +import org.sonar.python.checks.utils.UnittestUtils; + +@Rule(key = "S9088") +public class SingleInvocationWarningCheck extends PythonSubscriptionCheck { + private static final String MESSAGE = "Refactor this warning test to have only one invocation possibly emitting a warning."; + private static final String SECONDARY_MESSAGE = "Invocation possibly emitting a warning."; + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.WITH_STMT, ctx -> checkWithStatement(ctx, (WithStatement) ctx.syntaxNode())); + } + + @Override + public CheckScope scope() { + return CheckScope.ALL; + } + + private static void checkWithStatement(SubscriptionContext ctx, WithStatement withStatement) { + boolean isWarnsAssertion = withStatement.withItems().stream() + .map(WithItem::test) + .filter(CallExpression.class::isInstance) + .map(CallExpression.class::cast) + .anyMatch(callExpression -> UnittestUtils.isPytestWarns(callExpression, ctx)); + + if (!isWarnsAssertion) { + return; + } + + var invocations = SingleInvocationUtils.unsafeInvocations(withStatement.statements(), ctx); + if (invocations.size() > 1) { + SingleInvocationUtils.reportIfMultipleInvocations( + ctx.addIssue(withStatement.withKeyword(), withStatement.colon(), MESSAGE), + invocations, + SECONDARY_MESSAGE); + } + } +} diff --git a/python-checks/src/main/java/org/sonar/python/checks/utils/SingleInvocationUtils.java b/python-checks/src/main/java/org/sonar/python/checks/utils/SingleInvocationUtils.java new file mode 100644 index 000000000..4876d9fc9 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/utils/SingleInvocationUtils.java @@ -0,0 +1,170 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.utils; + +import java.util.ArrayList; +import java.util.List; +import org.sonar.plugins.python.api.IssueLocation; +import org.sonar.plugins.python.api.PythonCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.tree.BaseTreeVisitor; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.FunctionDef; +import org.sonar.plugins.python.api.tree.LambdaExpression; +import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.QualifiedExpression; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.tree.TreeUtils; + +/** + * Shared helpers for single-invocation assertion checks (e.g. S5778, S9088): + * collecting possibly-raising/warning calls inside {@code with} / lambda bodies + * and reporting secondary locations on each unsafe invocation. + */ +public final class SingleInvocationUtils { + + /** + * Calls that are almost never the exception/warning under test when nested inside + * {@code pytest.raises} / {@code assertRaises} / {@code pytest.warns}. + * Treating them as safe avoids noisy FPs on common setup helpers. + */ + private static final TypeMatcher ALWAYS_SAFE_CALL_MATCHER = TypeMatchers.any( + TypeMatchers.isType("builtins.str"), + TypeMatchers.isType("builtins.bytes"), + TypeMatchers.isType("builtins.bytearray"), + TypeMatchers.isType("builtins.repr"), + TypeMatchers.isType("builtins.ascii"), + TypeMatchers.isType("builtins.format"), + TypeMatchers.isType("builtins.bool"), + TypeMatchers.isType("builtins.int"), + TypeMatchers.isType("builtins.float"), + TypeMatchers.isType("builtins.complex"), + TypeMatchers.isType("builtins.memoryview"), + TypeMatchers.isType("builtins.list"), + TypeMatchers.isType("builtins.tuple"), + TypeMatchers.isType("builtins.dict"), + TypeMatchers.isType("builtins.print"), + TypeMatchers.isType("builtins.len"), + TypeMatchers.isType("builtins.abs"), + TypeMatchers.isType("builtins.round"), + TypeMatchers.isType("builtins.id"), + TypeMatchers.isType("builtins.hash"), + TypeMatchers.isType("builtins.hex"), + TypeMatchers.isType("builtins.oct"), + TypeMatchers.isType("builtins.bin"), + TypeMatchers.isType("builtins.ord"), + TypeMatchers.isType("builtins.chr"), + TypeMatchers.isType("builtins.range"), + TypeMatchers.isType("builtins.enumerate"), + TypeMatchers.isType("builtins.zip"), + TypeMatchers.isType("builtins.reversed"), + TypeMatchers.isType("builtins.sorted"), + TypeMatchers.isType("builtins.slice"), + TypeMatchers.isType("builtins.callable"), + TypeMatchers.isType("pathlib.Path"), + TypeMatchers.isType("pathlib.PurePath"), + TypeMatchers.isType("pathlib.PosixPath"), + TypeMatchers.isType("pathlib.WindowsPath"), + TypeMatchers.isType("pathlib.PurePosixPath"), + TypeMatchers.isType("pathlib.PureWindowsPath"), + TypeMatchers.isType("uuid.UUID"), + TypeMatchers.isType("uuid.uuid1"), + TypeMatchers.isType("uuid.uuid3"), + TypeMatchers.isType("uuid.uuid4"), + TypeMatchers.isType("uuid.uuid5"), + TypeMatchers.isType("uuid.uuid6"), + TypeMatchers.isType("uuid.uuid7"), + TypeMatchers.isType("uuid.uuid8"), + TypeMatchers.isType("copy.copy"), + TypeMatchers.isType("copy.deepcopy"), + // NumPy/SciPy lack stubs → UnresolvedImportType; withFQNPrefix covers factories/helpers + // (zeros, random, copy, legendre, …) used as nested setup in exception/warning assertions. + TypeMatchers.withFQNPrefix("numpy."), + TypeMatchers.withFQNPrefix("scipy.")); + + /** + * Constructors that are safe only without arguments (with args they commonly raise TypeError + * or can behave unexpectedly). + */ + private static final TypeMatcher EMPTY_ARGS_SAFE_CALL_MATCHER = TypeMatchers.any( + TypeMatchers.isType("builtins.set"), + TypeMatchers.isType("builtins.frozenset"), + TypeMatchers.isType("builtins.object")); + + private SingleInvocationUtils() { + } + + public static List unsafeInvocations(Tree tree, SubscriptionContext ctx) { + var visitor = new InvocationCollector(ctx); + tree.accept(visitor); + return visitor.invocations.stream() + .sorted(TreeUtils.getTreeByPositionComparator()) + .toList(); + } + + public static void reportIfMultipleInvocations(PythonCheck.PreciseIssue issue, List invocations, + String secondaryMessage) { + invocations.forEach(invocation -> issue.secondary(invocationLocation(invocation, secondaryMessage))); + } + + private static IssueLocation invocationLocation(CallExpression invocation, String message) { + if (invocation.callee() instanceof QualifiedExpression qualifiedExpression) { + return IssueLocation.preciseLocation(qualifiedExpression.name().firstToken(), invocation.rightPar(), message); + } + if (invocation.callee() instanceof Name calleeName) { + return IssueLocation.preciseLocation(calleeName.firstToken(), invocation.rightPar(), message); + } + return IssueLocation.preciseLocation(invocation, message); + } + + private static class InvocationCollector extends BaseTreeVisitor { + private final SubscriptionContext ctx; + private final List invocations = new ArrayList<>(); + + private InvocationCollector(SubscriptionContext ctx) { + this.ctx = ctx; + } + + @Override + public void visitCallExpression(CallExpression callExpression) { + if (!isSafeCall(callExpression)) { + invocations.add(callExpression); + } + super.visitCallExpression(callExpression); + } + + @Override + public void visitLambda(LambdaExpression lambdaExpression) { + // Nested lambdas define deferred execution and should not contribute calls here. + } + + @Override + public void visitFunctionDef(FunctionDef functionDef) { + // Nested function bodies are not executed when merely defined. + } + + private boolean isSafeCall(CallExpression callExpression) { + if (ALWAYS_SAFE_CALL_MATCHER.isTrueFor(callExpression.callee(), ctx)) { + return true; + } + return EMPTY_ARGS_SAFE_CALL_MATCHER.isTrueFor(callExpression.callee(), ctx) + && callExpression.arguments().isEmpty(); + } + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9088.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9088.html new file mode 100644 index 000000000..9c97d7326 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9088.html @@ -0,0 +1,92 @@ +

        When testing code that should emit a warning, having multiple method calls in the tested code makes it unclear which call is expected to emit the +warning.

        +

        In Python with pytest, this refers to with pytest.warns(…​): bodies that contain more than one statement, or a single statement with +multiple method invocations that could emit the expected warning.

        +

        Why is this an issue?

        +

        When writing tests for warnings, clarity is essential. If you put several method calls inside a pytest.warns block, or chain multiple +invocations in the tested expression, it becomes ambiguous which specific call is expected to emit the warning.

        +

        For example, consider this code:

        +
        +with pytest.warns(UserWarning):
        +    get_item().process()
        +
        +

        Here, both get_item() and process() could potentially emit a UserWarning. The test does not make it explicit +which method is expected to warn. The same ambiguity appears when setup and the code under test share the with block:

        +
        +with pytest.warns(UserWarning):
        +    setup()
        +    do_work()
        +
        +

        By isolating the method call you want to test, you make the test explicit and unambiguous. This improves readability and maintainability, and makes +your test suite a better specification of expected behavior.

        +

        What is the potential impact?

        +

        Writing tests with multiple method calls when testing for warnings reduces test quality:

        +
          +
        • Incorrect test coverage: You may think you are testing one method’s warning behavior when you are actually testing + another’s.
        • +
        • Maintenance burden: Other developers (or future you) will struggle to understand what the test is verifying.
        • +
        • Reduced confidence: Passing tests do not guarantee that the specific behavior you intended to test is working correctly.
        • +
        +

        How to fix it

        +

        When using pytest’s pytest.warns() context manager, extract intermediate method calls into separate variables before the assertion, +and move setup outside the with block. This ensures only the final method call that you want to test is inside the warning-testing +block.

        +

        Code examples

        +

        Noncompliant code example

        +
        +import pytest
        +
        +def test_process():
        +    # Which method emits the warning: get_item() or process()?
        +    with pytest.warns(UserWarning):  # Noncompliant
        +        get_item().process()
        +
        +

        Compliant solution

        +
        +import pytest
        +
        +def test_process():
        +    item = get_item()
        +    with pytest.warns(UserWarning):
        +        item.process()
        +
        +

        Noncompliant code example

        +
        +import warnings
        +import pytest
        +
        +def setup():
        +    pass
        +
        +def test_multiple_statements():
        +    with pytest.warns(UserWarning):  # Noncompliant
        +        setup()
        +        warnings.warn("x", UserWarning)
        +
        +

        Compliant solution

        +
        +import warnings
        +import pytest
        +
        +def setup():
        +    pass
        +
        +def test_multiple_statements():
        +    setup()
        +    with pytest.warns(UserWarning):
        +        warnings.warn("x", UserWarning)
        +
        +

        Resources

        +

        Documentation

        + +

        Related rules

        +
          +
        • {rule:python:S5778} - Only one method invocation is expected when testing runtime exceptions
        • +
        • {rule:python:S5914} - Assertions should not fail or succeed unconditionally
        • +
        + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9088.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9088.json new file mode 100644 index 000000000..a5f9d6a42 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9088.json @@ -0,0 +1,24 @@ +{ + "title": "Only one method invocation is expected when testing warnings", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "pytest", + "tests" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-9088", + "sqKey": "S9088", + "scope": "Tests", + "quickfix": "unknown", + "code": { + "impacts": { + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "CLEAR" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 86b579952..a717c709e 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -392,6 +392,7 @@ "S9081", "S9083", "S9084", + "S9088", "S9100", "S9106", "S9116", diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/SingleInvocationWarningCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/SingleInvocationWarningCheckTest.java new file mode 100644 index 000000000..514fd984b --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/SingleInvocationWarningCheckTest.java @@ -0,0 +1,36 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import org.junit.jupiter.api.Test; +import org.sonar.plugins.python.api.PythonCheck; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class SingleInvocationWarningCheckTest { + + @Test + void scope() { + assertEquals(PythonCheck.CheckScope.ALL, new SingleInvocationWarningCheck().scope()); + } + + @Test + void test() { + PythonCheckVerifier.verify("src/test/resources/checks/tests/singleInvocationWarning.py", new SingleInvocationWarningCheck()); + } +} diff --git a/python-checks/src/test/resources/checks/tests/singleInvocationWarning.py b/python-checks/src/test/resources/checks/tests/singleInvocationWarning.py new file mode 100644 index 000000000..6e6bfbb66 --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/singleInvocationWarning.py @@ -0,0 +1,335 @@ +import copy +import uuid +import warnings +from pathlib import Path +from uuid import UUID, uuid4 + +import numpy as np +import pytest +from numpy import eye, identity, ones, zeros +from numpy.polynomial.legendre import legval +from scipy.special import legendre + + +def get_item(): + return Item() + + +def setup(): + pass + + +def do_work(value=None): + warnings.warn("x", UserWarning) + + +class Item: + def process(self): + warnings.warn("x", UserWarning) + + +class DummyContextManager: + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + return False + + +def test_pytest_with_call_chain(): + with pytest.warns(UserWarning): # Noncompliant {{Refactor this warning test to have only one invocation possibly emitting a warning.}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + get_item().process() +# ^^^^^^^^^^< {{Invocation possibly emitting a warning.}} +# ^^^^^^^^^@-1< {{Invocation possibly emitting a warning.}} + + +def test_pytest_with_nested_calls(): + with pytest.warns(UserWarning): # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + do_work(get_item()) +# ^^^^^^^^^^^^^^^^^^^< {{Invocation possibly emitting a warning.}} +# ^^^^^^^^^^@-1< {{Invocation possibly emitting a warning.}} + + +def test_pytest_with_multiple_statements(): + with pytest.warns(UserWarning): # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + setup() +# ^^^^^^^< {{Invocation possibly emitting a warning.}} + warnings.warn("x", UserWarning) +# ^^^^^^^^^^^^^^^^^^^^^^< {{Invocation possibly emitting a warning.}} + + +def test_pytest_with_single_invocation(): + item = get_item() + with pytest.warns(UserWarning): + item.process() + + +def test_pytest_setup_outside(): + setup() + with pytest.warns(UserWarning): + warnings.warn("x", UserWarning) + + +def test_pytest_with_safe_builtins(): + with pytest.warns(UserWarning): + do_work(str()) + + +def test_pytest_with_safe_list(): + with pytest.warns(UserWarning): + do_work(list()) + + +def test_pytest_with_safe_set(): + with pytest.warns(UserWarning): + do_work(set()) + + +def test_pytest_with_safe_dict(): + with pytest.warns(UserWarning): + do_work(dict()) + + +def test_pytest_with_safe_tuple(): + with pytest.warns(UserWarning): + do_work(tuple()) + + +def test_pytest_with_safe_frozenset(): + with pytest.warns(UserWarning): + do_work(frozenset()) + + +def test_pytest_with_safe_bytes(): + with pytest.warns(UserWarning): + do_work(bytes()) + + +def test_pytest_with_safe_bytearray(): + with pytest.warns(UserWarning): + do_work(bytearray()) + + +def test_pytest_with_safe_object(): + with pytest.warns(UserWarning): + do_work(object()) + + +def test_pytest_with_unsafe_builtin_arguments(): + with pytest.warns(UserWarning): # Noncompliant {{Refactor this warning test to have only one invocation possibly emitting a warning.}} +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + do_work(object(1)) +# ^^^^^^^^^^^^^^^^^^< {{Invocation possibly emitting a warning.}} +# ^^^^^^^^^@-1< {{Invocation possibly emitting a warning.}} + + +def test_pytest_with_unsafe_collection_arguments(): + with pytest.warns(UserWarning): # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + do_work(set(5)) +# ^^^^^^^^^^^^^^^< {{Invocation possibly emitting a warning.}} +# ^^^^^^@-1< {{Invocation possibly emitting a warning.}} + + +def test_pytest_with_dict_named_args(): + with pytest.warns(UserWarning): + do_work(dict(x=1)) + + +def test_pytest_with_str_argument(): + with pytest.warns(UserWarning): + do_work(str(1)) + + +def test_pytest_with_print(): + with pytest.warns(UserWarning): + print(do_work()) + + +def test_pytest_with_path(): + with pytest.warns(UserWarning): + do_work(Path("missing")) + + +def test_pytest_with_uuid4(): + with pytest.warns(UserWarning): + do_work(uuid4()) + + +def test_pytest_with_uuid_module(): + with pytest.warns(UserWarning): + do_work(uuid.uuid4()) + + +def test_pytest_with_uuid_constructor(): + with pytest.warns(UserWarning): + do_work(UUID(int=0)) + + +def test_pytest_with_numpy_zeros(): + with pytest.warns(UserWarning): + do_work(np.zeros(3)) + + +def test_pytest_with_numpy_ones(): + with pytest.warns(UserWarning): + do_work(ones((2, 2))) + + +def test_pytest_with_numpy_identity(): + with pytest.warns(UserWarning): + do_work(identity(3)) + + +def test_pytest_with_numpy_eye(): + with pytest.warns(UserWarning): + do_work(eye(3)) + + +def test_pytest_with_numpy_empty(): + with pytest.warns(UserWarning): + do_work(np.empty(2)) + + +def test_pytest_with_numpy_full(): + with pytest.warns(UserWarning): + do_work(np.full(2, 0)) + + +def test_pytest_with_numpy_zeros_like(): + with pytest.warns(UserWarning): + do_work(np.zeros_like([1, 2])) + + +def test_pytest_with_numpy_ones_like(): + with pytest.warns(UserWarning): + do_work(np.ones_like([1, 2])) + + +def test_pytest_with_numpy_empty_like(): + with pytest.warns(UserWarning): + do_work(np.empty_like([1, 2])) + + +def test_pytest_with_numpy_full_like(): + with pytest.warns(UserWarning): + do_work(np.full_like([1, 2], 0)) + + +def test_pytest_with_numpy_array(): + with pytest.warns(UserWarning): + do_work(np.array([1, 2])) + + +def test_pytest_with_numpy_asarray(): + with pytest.warns(UserWarning): + do_work(np.asarray([1, 2])) + + +def test_pytest_with_numpy_arange(): + with pytest.warns(UserWarning): + do_work(np.arange(3)) + + +def test_pytest_with_numpy_linspace(): + with pytest.warns(UserWarning): + do_work(np.linspace(0, 1, 5)) + + +def test_pytest_with_numpy_random_randn(): + with pytest.warns(UserWarning): + do_work(np.random.randn(2, 2)) + + +def test_pytest_with_numpy_random_random(): + with pytest.warns(UserWarning): + do_work(np.random.random((2, 2))) + + +def test_pytest_with_numpy_random_rand(): + with pytest.warns(UserWarning): + do_work(np.random.rand(2, 2)) + + +def test_pytest_with_numpy_random_randint(): + with pytest.warns(UserWarning): + do_work(np.random.randint(0, 10, size=3)) + + +def test_pytest_with_numpy_random_default_rng(): + with pytest.warns(UserWarning): + do_work(np.random.default_rng(0)) + + +def test_pytest_with_numpy_random_state(): + with pytest.warns(UserWarning): + do_work(np.random.RandomState(0)) + + +def test_pytest_with_numpy_copy(): + with pytest.warns(UserWarning): + do_work(np.copy([1, 2])) + + +def test_pytest_with_numpy_legendre(): + with pytest.warns(UserWarning): + do_work(legval(0.5, [1, 0, 1])) + + +def test_pytest_with_scipy_legendre(): + with pytest.warns(UserWarning): + do_work(legendre(3)) + + +def test_pytest_with_copy_copy(): + with pytest.warns(UserWarning): + do_work(copy.copy([1, 2])) + + +def test_pytest_with_copy_deepcopy(): + with pytest.warns(UserWarning): + do_work(copy.deepcopy([1, 2])) + + +def test_pytest_with_len_and_repr(): + with pytest.warns(UserWarning): + do_work(len(repr(1))) + + +def test_pytest_with_list_and_tuple_args(): + with pytest.warns(UserWarning): + do_work(list((1,))) + + +def test_non_warns_with_statement(): + with DummyContextManager(): + get_item().process() + + +def test_pytest_raises_is_out_of_scope(): + with pytest.raises(ValueError): + get_item().process() + + +def test_pytest_with_nested_lambda_definition(): + with pytest.warns(UserWarning): + do_work(lambda value: get_item().process()) + + +def test_pytest_with_nested_helper_definition(): + with pytest.warns(UserWarning): + def helper(): + return get_item().process() + do_work() + + +def test_pytest_warns_from_import(): + from pytest import warns + with warns(UserWarning): # Noncompliant +# ^^^^^^^^^^^^^^^^^^^^^^^^ + get_item().process() +# ^^^^^^^^^^< {{Invocation possibly emitting a warning.}} +# ^^^^^^^^^@-1< {{Invocation possibly emitting a warning.}} From 7bef3d3d5a86e7e387251dab41612242d3840cdb Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Wed, 12 Aug 2026 14:19:22 +0200 Subject: [PATCH 285/322] SONARPY-4480 Reduce S9137 noise for unused patches and field stubs GitOrigin-RevId: 1a930c8c81bd334d1f78d2e119399878ee1e9211 --- .../tests/MocksShouldUseAutospecCheck.java | 206 +++++++++++++- .../py/rules/python/Sonar_way_profile.json | 3 +- .../checks/tests/mocksShouldUseAutospec.py | 255 +++++++++++++++--- 3 files changed, 424 insertions(+), 40 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/MocksShouldUseAutospecCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/MocksShouldUseAutospecCheck.java index e15842cc1..87639b1dd 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/tests/MocksShouldUseAutospecCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/MocksShouldUseAutospecCheck.java @@ -16,17 +16,30 @@ */ package org.sonar.python.checks.tests; +import java.util.ArrayList; import java.util.List; +import java.util.Objects; +import java.util.Set; +import javax.annotation.CheckForNull; import org.sonar.check.Rule; import org.sonar.plugins.python.api.PythonSubscriptionCheck; import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.symbols.v2.SymbolV2; +import org.sonar.plugins.python.api.tree.AnnotatedAssignment; import org.sonar.plugins.python.api.tree.Argument; +import org.sonar.plugins.python.api.tree.AssignmentStatement; import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.ClassDef; +import org.sonar.plugins.python.api.tree.Decorator; import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.ExpressionList; +import org.sonar.plugins.python.api.tree.FunctionDef; import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.Parameter; import org.sonar.plugins.python.api.tree.QualifiedExpression; import org.sonar.plugins.python.api.tree.RegularArgument; import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.tree.WithItem; import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; import org.sonar.python.checks.utils.Expressions; @@ -48,6 +61,25 @@ public class MocksShouldUseAutospecCheck extends PythonSubscriptionCheck { private static final String AUTOSPEC = "autospec"; private static final String NEW = "new"; private static final String NEW_CALLABLE = "new_callable"; + private static final String SELF = "self"; + private static final String CLS = "cls"; + + /** + * unittest.mock helpers / assertions — invoking these does not mean the test exercises a collaborator API + * that would benefit from autospeccing. + */ + private static final Set MOCK_HELPER_METHODS = Set.of( + "assert_called", + "assert_called_once", + "assert_called_with", + "assert_called_once_with", + "assert_any_call", + "assert_has_calls", + "assert_not_called", + "assert_never_called", + "reset_mock", + "attach_mock", + "configure_mock"); private static final TypeMatcher MOCK_CLASS_MATCHER = TypeMatchers.any( TypeMatchers.isType("unittest.mock.Mock"), @@ -74,7 +106,7 @@ private static void checkCall(SubscriptionContext ctx) { Expression callee = Expressions.removeParentheses(callExpression.callee()); if (MOCK_CLASS_MATCHER.isTrueFor(callee, ctx)) { - if (!hasMockSpec(arguments)) { + if (!hasMockSpec(arguments) && mockBenefitsFromAutospec(callExpression, ctx)) { ctx.addIssue(callee, mockMessage(callee)); } return; @@ -87,6 +119,9 @@ private static void checkCall(SubscriptionContext ctx) { if (hasReplacement(arguments, newPosition) || hasPatchSpecOrAutospec(arguments, newPosition)) { return; } + if (!patchMockIsUsedInTest(callExpression, ctx)) { + return; + } ctx.addIssue(callee, patchMessage(arguments, newPosition)); } @@ -139,4 +174,173 @@ private static boolean hasTruthyAutospec(List arguments, int autospecP RegularArgument autospecArgument = TreeUtils.nthArgumentOrKeyword(autospecPosition, AUTOSPEC, arguments); return autospecArgument != null && !Expressions.isFalsy(autospecArgument.expression()); } + + /** + * Raise only when the mock is used as a collaborator in the test (passed into a non-mock call, or a + * non-helper method is invoked on it). Field-only stubs cannot be autospecced reliably. + */ + private static boolean mockBenefitsFromAutospec(CallExpression mockConstruction, SubscriptionContext ctx) { + List boundNames = simpleNameBindings(mockConstruction); + if (boundNames.isEmpty()) { + // Attribute assignment (`obj.field = Mock()`) or a discarded call: no collaborator API to mirror. + return isArgumentToNonMockCall(mockConstruction, ctx); + } + for (Name boundName : boundNames) { + SymbolV2 symbol = boundName.symbolV2(); + if (symbol != null && symbol.usages().stream() + .filter(usage -> !usage.isBindingUsage()) + .anyMatch(usage -> isCollaboratorUsage(usage.tree(), ctx))) { + return true; + } + } + return false; + } + + /** + * Simple name bindings only. Attribute / subscription LHS is field stubbing. + * Supports plain, chained (`a = m = Mock()`), and annotated (`name: T = Mock()`) assignments. + */ + private static List simpleNameBindings(CallExpression mockConstruction) { + AssignmentStatement assignment = (AssignmentStatement) TreeUtils.firstAncestorOfKind(mockConstruction, Tree.Kind.ASSIGNMENT_STMT); + if (assignment != null && Expressions.removeParentheses(assignment.assignedValue()) == mockConstruction) { + List names = new ArrayList<>(); + for (ExpressionList target : assignment.lhsExpressions()) { + List exprs = target.expressions(); + // Skip tuple unpacking (`a, b = Mock()`): only single-name targets are true bindings. + if (exprs.size() != 1 || !(exprs.get(0) instanceof Name name)) { + return List.of(); + } + names.add(name); + } + return names; + } + AnnotatedAssignment annotated = (AnnotatedAssignment) TreeUtils.firstAncestorOfKind(mockConstruction, Tree.Kind.ANNOTATED_ASSIGNMENT); + if (annotated != null) { + Expression assignedValue = annotated.assignedValue(); + if (assignedValue != null + && Expressions.removeParentheses(assignedValue) == mockConstruction + && annotated.variable() instanceof Name name) { + return List.of(name); + } + } + return List.of(); + } + + private static boolean isCollaboratorUsage(Tree usageTree, SubscriptionContext ctx) { + Name name = (Name) usageTree; + return isArgumentToNonMockCall(rootQualifierOrSelf(name), ctx) || isNonHelperMethodCallOnMock(name); + } + + private static Expression rootQualifierOrSelf(Name name) { + Tree cursor = name; + while (cursor.parent() instanceof QualifiedExpression qualifiedExpression + && qualifiedExpression.qualifier() == cursor) { + cursor = qualifiedExpression; + } + return (Expression) cursor; + } + + private static boolean isArgumentToNonMockCall(Expression expression, SubscriptionContext ctx) { + if (!(expression.parent() instanceof RegularArgument)) { + return false; + } + CallExpression enclosingCall = (CallExpression) TreeUtils.firstAncestorOfKind(expression.parent(), Tree.Kind.CALL_EXPR); + return !MOCK_CLASS_MATCHER.isTrueFor(Expressions.removeParentheses(enclosingCall.callee()), ctx); + } + + private static boolean isNonHelperMethodCallOnMock(Name name) { + if (name.parent() instanceof CallExpression directCall && directCall.callee() == name) { + return true; + } + Tree cursor = name; + while (cursor.parent() instanceof QualifiedExpression qualifiedExpression + && qualifiedExpression.qualifier() == cursor) { + cursor = qualifiedExpression; + } + if (!(cursor instanceof QualifiedExpression qualifiedExpression)) { + return false; + } + if (!(cursor.parent() instanceof CallExpression callExpression) || callExpression.callee() != cursor) { + return false; + } + return !MOCK_HELPER_METHODS.contains(qualifiedExpression.name().name()); + } + + /** + * Isolation-only patches (unused mock) do not benefit from autospec. + */ + private static boolean patchMockIsUsedInTest(CallExpression patchCall, SubscriptionContext ctx) { + Decorator decorator = (Decorator) TreeUtils.firstAncestorOfKind(patchCall, Tree.Kind.DECORATOR); + if (decorator != null) { + if (decorator.parent() instanceof ClassDef) { + // Class-level @patch injects mocks into every method — keep raising. + return true; + } + FunctionDef functionDef = Objects.requireNonNull( + (FunctionDef) TreeUtils.firstAncestorOfKind(decorator, Tree.Kind.FUNCDEF)); + SymbolV2 mockSymbol = mockSymbolFromDecorator(functionDef, decorator, ctx); + return mockSymbol != null && hasNonBindingUsage(mockSymbol); + } + + WithItem withItem = (WithItem) TreeUtils.firstAncestorOfKind(patchCall, Tree.Kind.WITH_ITEM); + if (withItem != null && isPatchWithItem(withItem, patchCall)) { + if (!(withItem.expression() instanceof Name name)) { + return false; + } + SymbolV2 symbol = name.symbolV2(); + return symbol != null && hasNonBindingUsage(symbol); + } + + return Expressions.getAssignedName(patchCall) + .map(Name::symbolV2) + .filter(MocksShouldUseAutospecCheck::hasNonBindingUsage) + .isPresent(); + } + + private static boolean isPatchWithItem(WithItem withItem, CallExpression patchCall) { + return Expressions.removeParentheses(withItem.test()) == patchCall; + } + + private static boolean hasNonBindingUsage(SymbolV2 symbol) { + return symbol.usages().stream().anyMatch(usage -> !usage.isBindingUsage()); + } + + @CheckForNull + private static SymbolV2 mockSymbolFromDecorator(FunctionDef functionDef, Decorator decorator, SubscriptionContext ctx) { + List patchDecorators = new ArrayList<>(); + for (Decorator candidate : functionDef.decorators()) { + if (isPatchDecorator(candidate, ctx)) { + patchDecorators.add(candidate); + } + } + int indexFromTop = patchDecorators.indexOf(decorator); + // Bottom decorator maps to the first injected mock parameter. + int indexFromBottom = patchDecorators.size() - 1 - indexFromTop; + List mockParameters = mockParameters(functionDef); + if (indexFromBottom >= mockParameters.size()) { + return null; + } + Name parameterName = mockParameters.get(indexFromBottom).name(); + return parameterName != null ? parameterName.symbolV2() : null; + } + + private static boolean isPatchDecorator(Decorator decorator, SubscriptionContext ctx) { + Expression expression = Expressions.removeParentheses(decorator.expression()); + return expression instanceof CallExpression callExpression + && MockPatchUtils.newArgumentPosition(callExpression.callee(), ctx) >= 0; + } + + private static List mockParameters(FunctionDef functionDef) { + if (functionDef.parameters() == null) { + return List.of(); + } + List result = new ArrayList<>(); + for (Parameter parameter : functionDef.parameters().nonTuple()) { + Name parameterName = parameter.name(); + if (parameterName != null && !SELF.equals(parameterName.name()) && !CLS.equals(parameterName.name())) { + result.add(parameter); + } + } + return result; + } } diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index a717c709e..182f7da36 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -397,7 +397,6 @@ "S9106", "S9116", "S9117", - "S9134", - "S9137" + "S9134" ] } diff --git a/python-checks/src/test/resources/checks/tests/mocksShouldUseAutospec.py b/python-checks/src/test/resources/checks/tests/mocksShouldUseAutospec.py index 47043b185..f93d6ef24 100644 --- a/python-checks/src/test/resources/checks/tests/mocksShouldUseAutospec.py +++ b/python-checks/src/test/resources/checks/tests/mocksShouldUseAutospec.py @@ -34,43 +34,48 @@ def test_bare_magic_mock(): def test_mock_with_return_value_only(): - Mock(return_value=42) # Noncompliant {{Replace this "Mock()" with "create_autospec()", or pass "spec=" / "spec_set=".}} -# ^^^^ + # Discarded constructor — no collaborator interaction in the test. + Mock(return_value=42) def test_mock_with_side_effect_only(): - Mock(side_effect=ValueError) # Noncompliant {{Replace this "Mock()" with "create_autospec()", or pass "spec=" / "spec_set=".}} -# ^^^^ + Mock(side_effect=ValueError) def test_mock_with_name_only(): - Mock(name="payments") # Noncompliant {{Replace this "Mock()" with "create_autospec()", or pass "spec=" / "spec_set=".}} -# ^^^^ + Mock(name="payments") def test_mock_with_wraps_only(): - Mock(wraps=PaymentGateway()) # Noncompliant {{Replace this "Mock()" with "create_autospec()", or pass "spec=" / "spec_set=".}} -# ^^^^ + Mock(wraps=PaymentGateway()) def test_fully_qualified_mock(): - unittest.mock.Mock() # Noncompliant {{Replace this "Mock()" with "create_autospec()", or pass "spec=" / "spec_set=".}} -# ^^^^^^^^^^^^^^^^^^ + unittest.mock.Mock() def test_fully_qualified_magic_mock(): - unittest.mock.MagicMock() # Noncompliant {{Replace this "MagicMock()" with "create_autospec()", or pass "spec=" / "spec_set=".}} -# ^^^^^^^^^^^^^^^^^^^^^^^ + unittest.mock.MagicMock() + + +def test_fully_qualified_mock_collaborator(): + payments = unittest.mock.Mock() # Noncompliant {{Replace this "Mock()" with "create_autospec()", or pass "spec=" / "spec_set=".}} +# ^^^^^^^^^^^^^^^^^^ + checkout(payments, None) def test_third_party_mock(): - mock.Mock() # Noncompliant {{Replace this "Mock()" with "create_autospec()", or pass "spec=" / "spec_set=".}} -# ^^^^^^^^^ + mock.Mock() def test_third_party_magic_mock(): - mock.MagicMock() # Noncompliant {{Replace this "MagicMock()" with "create_autospec()", or pass "spec=" / "spec_set=".}} -# ^^^^^^^^^^^^^^ + mock.MagicMock() + + +def test_third_party_mock_collaborator(): + payments = mock.Mock() # Noncompliant {{Replace this "Mock()" with "create_autospec()", or pass "spec=" / "spec_set=".}} +# ^^^^^^^^^ + checkout(payments, None) def test_patch_without_autospec(): @@ -80,11 +85,21 @@ def test_patch_without_autospec(): send.assert_called_once_with("u1") -def test_patch_as_decorator(): +def test_patch_as_decorator_unused_mock(): + # Isolation-only patch: mock parameter is never used. + @patch("app.notify.send") + def inner(send): + notify_user("u1") + + inner() + + +def test_patch_as_decorator_used_mock(): @patch("app.notify.send") # Noncompliant {{Add "autospec=True" to this patch call, or pass an explicit "spec=" / "spec_set=".}} # ^^^^^ def inner(send): notify_user("u1") + send.assert_called_once_with("u1") inner() @@ -95,47 +110,77 @@ def test_patch_object_without_autospec(): charge(10) -def test_fully_qualified_patch(): - with unittest.mock.patch("app.notify.send"): # Noncompliant {{Add "autospec=True" to this patch call, or pass an explicit "spec=" / "spec_set=".}} -# ^^^^^^^^^^^^^^^^^^^ +def test_fully_qualified_patch_unused(): + # No mock bound in the test — isolation only. + with unittest.mock.patch("app.notify.send"): notify_user("u1") -def test_third_party_patch(): - with mock.patch("app.notify.send"): # Noncompliant {{Add "autospec=True" to this patch call, or pass an explicit "spec=" / "spec_set=".}} -# ^^^^^^^^^^ +def test_third_party_patch_unused(): + with mock.patch("app.notify.send"): notify_user("u1") -def test_mocker_patch(mocker): - mocker.patch("app.notify.send") # Noncompliant {{Add "autospec=True" to this patch call, or pass an explicit "spec=" / "spec_set=".}} -# ^^^^^^^^^^^^ +def test_mocker_patch_unused(mocker): + mocker.patch("app.notify.send") -def test_mocker_patch_object(mocker): - mocker.patch.object(PaymentGateway, "charge") # Noncompliant {{Add "autospec=True" to this patch call, or pass an explicit "spec=" / "spec_set=".}} -# ^^^^^^^^^^^^^^^^^^^ +def test_mocker_patch_object_unused(mocker): + mocker.patch.object(PaymentGateway, "charge") -def test_class_mocker_patch(class_mocker): - class_mocker.patch("app.notify.send") # Noncompliant {{Add "autospec=True" to this patch call, or pass an explicit "spec=" / "spec_set=".}} -# ^^^^^^^^^^^^^^^^^^ +def test_class_mocker_patch_unused(class_mocker): + class_mocker.patch("app.notify.send") -def test_self_mocker_patch(): +def test_self_mocker_patch_unused(): class Suite: def setup_method(self, mocker): self.mocker = mocker def test_it(self): - self.mocker.patch("app.notify.send") # Noncompliant {{Add "autospec=True" to this patch call, or pass an explicit "spec=" / "spec_set=".}} -# ^^^^^^^^^^^^^^^^^ + self.mocker.patch("app.notify.send") + + +def test_mocker_patch_used(mocker): + send = mocker.patch("app.notify.send") # Noncompliant {{Add "autospec=True" to this patch call, or pass an explicit "spec=" / "spec_set=".}} +# ^^^^^^^^^^^^ + notify_user("u1") + send.assert_called_once_with("u1") + + +def test_patch_with_autospec_false_unused(): + # Isolation-only; autospec=False is irrelevant when the mock is unused. + with patch("app.notify.send", autospec=False): + notify_user("u1") -def test_patch_with_autospec_false(): - with patch("app.notify.send", autospec=False): # Noncompliant {{Replace "autospec=False" with "autospec=True", or pass an explicit "spec=" / "spec_set=".}} +def test_patch_with_autospec_false_used(): + with patch("app.notify.send", autospec=False) as send: # Noncompliant {{Replace "autospec=False" with "autospec=True", or pass an explicit "spec=" / "spec_set=".}} # ^^^^^ notify_user("u1") + send.assert_called_once_with("u1") + + +def test_field_stub_mock_not_raised(): + # Autospec cannot mirror instance fields populated in __init__. + message = Mock() + message.headers = {"id": "1"} + message.body = b"" + + +def test_field_stub_magic_mock_not_raised(): + response = MagicMock() + response.status_code = 200 + response.raw = MagicMock() + + +def test_nested_mock_assigned_to_attribute(): + cur = Mock() + connect = MagicMock() + connect.return_value.cursor = cur + cur.return_value.execute = Mock() + cur.return_value.execute.assert_called() def test_compliant_create_autospec(): @@ -239,3 +284,139 @@ def test_async_mock_not_covered(): def test_property_mock_not_covered(): unittest.mock.PropertyMock() + + +def test_annotated_assignment_collaborator(): + payments: object = Mock() # Noncompliant {{Replace this "Mock()" with "create_autospec()", or pass "spec=" / "spec_set=".}} +# ^^^^ + checkout(payments, None) + + +def test_chained_assignment_collaborator(): + payments = gateway = Mock() # Noncompliant {{Replace this "Mock()" with "create_autospec()", or pass "spec=" / "spec_set=".}} +# ^^^^ + checkout(payments, None) + + +def test_inline_mock_argument(): + checkout(Mock(), None) # Noncompliant {{Replace this "Mock()" with "create_autospec()", or pass "spec=" / "spec_set=".}} +# ^^^^ + + +def test_mock_called_directly(): + factory = Mock() # Noncompliant {{Replace this "Mock()" with "create_autospec()", or pass "spec=" / "spec_set=".}} +# ^^^^ + factory() + + +def test_fully_qualified_decorator_used(): + @unittest.mock.patch("app.notify.send") # Noncompliant {{Add "autospec=True" to this patch call, or pass an explicit "spec=" / "spec_set=".}} +# ^^^^^^^^^^^^^^^^^^^ + def inner(send): + notify_user("u1") + send.assert_called_once_with("u1") + + inner() + + +def test_patch_object_decorator_used(): + @patch.object(PaymentGateway, "charge") # Noncompliant {{Add "autospec=True" to this patch call, or pass an explicit "spec=" / "spec_set=".}} +# ^^^^^^^^^^^^ + def inner(charge): + charge(10) + + inner() + + +@patch("app.notify.send") # Noncompliant {{Add "autospec=True" to this patch call, or pass an explicit "spec=" / "spec_set=".}} +#^^^^^ +class ClassLevelPatchSuite: + def test_it(self, send): + notify_user("u1") + send.assert_called_once_with("u1") + + +def test_decorator_without_mock_parameter(): + # More patch decorators than injectable parameters — treat as unused. + @patch("app.notify.send") + def inner(): + notify_user("u1") + + inner() + + +def test_tuple_unpacking_mock_not_raised(): + # Unpacking yields child mocks, not the constructed mock itself. + payments, order = Mock() + checkout(payments, order) + + +def test_attribute_lhs_mock_not_raised_as_binding(): + gateway = PaymentGateway() + gateway.charge = Mock() + gateway.charge(10) + + +def test_patch_decorator_with_non_call_neighbor(): + # Non-call decorators must not break patch index → parameter mapping. + @staticmethod + @patch("app.notify.send") # Noncompliant {{Add "autospec=True" to this patch call, or pass an explicit "spec=" / "spec_set=".}} +# ^^^^^ + def inner(send): + notify_user("u1") + send.assert_called_once_with("u1") + + inner() + + +def test_parenthesized_mock_assignment(): + payments = (Mock()) # Noncompliant {{Replace this "Mock()" with "create_autospec()", or pass "spec=" / "spec_set=".}} +# ^^^^ + checkout(payments, None) + + +def test_classmethod_patch_skips_cls_parameter(): + class Suite: + @classmethod + @patch("app.notify.send") # Noncompliant {{Add "autospec=True" to this patch call, or pass an explicit "spec=" / "spec_set=".}} +# ^^^^^ + def inner(cls, send): + notify_user("u1") + send.assert_called_once_with("u1") + + Suite.inner() + + +def test_instance_method_patch_skips_self_parameter(): + class Suite: + @patch("app.notify.send") # Noncompliant {{Add "autospec=True" to this patch call, or pass an explicit "spec=" / "spec_set=".}} +# ^^^^^ + def inner(self, send): + notify_user("u1") + send.assert_called_once_with("u1") + + Suite().inner() + + +def test_with_patch_non_name_alias_ignored(): + # Alias is not a simple name — cannot track usages; treat as unused. + class Box: + pass + + box = Box() + with patch("app.notify.send") as box.send: + notify_user("u1") + + +def test_nested_mock_inside_mock_constructor(): + # Inner Mock is an argument to another Mock — not a collaborator use. + Mock(Mock()) + + +def test_patch_call_nested_inside_with_patch(): + # Inner patch is not the with-item test; isolation-only unless assigned/used. + with patch("app.notify.send") as send: # Noncompliant {{Add "autospec=True" to this patch call, or pass an explicit "spec=" / "spec_set=".}} +# ^^^^^ + notify_user("u1") + send.assert_called_once_with("u1") + patch("app.notify.other") From a694ee21be7b2a6b059920d1ee805b13caa09156 Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Wed, 12 Aug 2026 15:57:01 +0200 Subject: [PATCH 286/322] SONARPY-4514 Implement rule S9136 - Mock assertion method names should be spelled correctly GitOrigin-RevId: 7410ba9aede5d9487421af21064f994589470adb --- python-checks/pom.xml | 4 + .../python/checks/OpenSourceCheckList.java | 2 + .../tests/MisspelledMockAssertionCheck.java | 163 ++++++++++++++++++ .../org/sonar/l10n/py/rules/python/S9136.html | 89 ++++++++++ .../org/sonar/l10n/py/rules/python/S9136.json | 25 +++ .../py/rules/python/Sonar_way_profile.json | 3 +- .../MisspelledMockAssertionCheckTest.java | 53 ++++++ .../checks/tests/misspelledMockAssertion.py | 109 ++++++++++++ 8 files changed, 447 insertions(+), 1 deletion(-) create mode 100644 python-checks/src/main/java/org/sonar/python/checks/tests/MisspelledMockAssertionCheck.java create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9136.html create mode 100644 python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9136.json create mode 100644 python-checks/src/test/java/org/sonar/python/checks/tests/MisspelledMockAssertionCheckTest.java create mode 100644 python-checks/src/test/resources/checks/tests/misspelledMockAssertion.py diff --git a/python-checks/pom.xml b/python-checks/pom.xml index a838b401b..4fee84bc6 100644 --- a/python-checks/pom.xml +++ b/python-checks/pom.xml @@ -26,6 +26,10 @@ commons-io commons-io + + org.apache.commons + commons-text + com.google.code.gson gson diff --git a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java index 156e2bbfb..91dce4aa6 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java +++ b/python-checks/src/main/java/org/sonar/python/checks/OpenSourceCheckList.java @@ -106,6 +106,7 @@ import org.sonar.python.checks.tests.IdenticalAssertionArgumentsCheck; import org.sonar.python.checks.tests.ImplicitlySkippedTestCheck; import org.sonar.python.checks.tests.IntentionalTestFailureMessageCheck; +import org.sonar.python.checks.tests.MisspelledMockAssertionCheck; import org.sonar.python.checks.tests.MockPatchLambdaReturnValueCheck; import org.sonar.python.checks.tests.MocksShouldUseAutospecCheck; import org.sonar.python.checks.tests.NotDiscoverableTestMethodCheck; @@ -362,6 +363,7 @@ public Stream> getChecks() { MethodShouldBeStaticCheck.class, MissingDocstringCheck.class, MissingNewlineAtEndOfFileCheck.class, + MisspelledMockAssertionCheck.class, MockPatchLambdaReturnValueCheck.class, MocksShouldUseAutospecCheck.class, ModifiedParameterValueCheck.class, diff --git a/python-checks/src/main/java/org/sonar/python/checks/tests/MisspelledMockAssertionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/tests/MisspelledMockAssertionCheck.java new file mode 100644 index 000000000..b063f9938 --- /dev/null +++ b/python-checks/src/main/java/org/sonar/python/checks/tests/MisspelledMockAssertionCheck.java @@ -0,0 +1,163 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import java.util.Set; +import javax.annotation.CheckForNull; +import org.apache.commons.text.similarity.LevenshteinDistance; +import org.sonar.check.Rule; +import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.quickfix.PythonQuickFix; +import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.QualifiedExpression; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; +import org.sonar.python.checks.utils.Expressions; +import org.sonar.python.quickfix.TextEditUtils; + +@Rule(key = "S9136") +public class MisspelledMockAssertionCheck extends PythonSubscriptionCheck { + + private static final String MESSAGE = "Correct this misspelled mock assertion; did you mean \"%s\"?"; + private static final String QUICK_FIX_MESSAGE = "Replace with \"%s\""; + + /** + * Only raise when the accessed name is a near-miss of a real mock assertion API. + * Distance 2 still requires a unique best match, which keeps the rule conservative. + */ + private static final int MAX_EDIT_DISTANCE = 2; + private static final LevenshteinDistance LEVENSHTEIN = new LevenshteinDistance(MAX_EDIT_DISTANCE); + + private static final Set KNOWN_ASSERTION_METHODS = Set.of( + "assert_called", + "assert_called_once", + "assert_called_with", + "assert_called_once_with", + "assert_any_call", + "assert_has_calls", + "assert_not_called", + "assert_awaited", + "assert_awaited_once", + "assert_awaited_with", + "assert_awaited_once_with", + "assert_any_await", + "assert_has_awaits", + "assert_not_awaited"); + + private static final TypeMatcher MOCK_INSTANCE = TypeMatchers.any( + TypeMatchers.isObjectInstanceOf("unittest.mock.NonCallableMock"), + TypeMatchers.isObjectInstanceOf("mock.mock.NonCallableMock")); + + private static final TypeMatcher ASYNC_MOCK_INSTANCE = TypeMatchers.any( + TypeMatchers.isObjectInstanceOf("unittest.mock.AsyncMock"), + TypeMatchers.isObjectInstanceOf("mock.mock.AsyncMock")); + + @Override + public void initialize(Context context) { + context.registerSyntaxNodeConsumer(Tree.Kind.CALL_EXPR, MisspelledMockAssertionCheck::checkCall); + } + + @Override + public CheckScope scope() { + return CheckScope.ALL; + } + + private static void checkCall(SubscriptionContext ctx) { + CallExpression callExpression = (CallExpression) ctx.syntaxNode(); + Expression callee = Expressions.removeParentheses(callExpression.callee()); + if (!(callee instanceof QualifiedExpression qualifiedExpression)) { + return; + } + + Name memberName = qualifiedExpression.name(); + String name = memberName.name(); + if (KNOWN_ASSERTION_METHODS.contains(name) || !name.startsWith("assert")) { + return; + } + + Expression qualifier = Expressions.removeParentheses(qualifiedExpression.qualifier()); + if (!isMockOrChildMock(qualifier, ctx)) { + return; + } + // Exact declared members are not typos (e.g. a real assert_* helper on the mock type). + if (TypeMatchers.hasMember(name).isTrueFor(qualifier, ctx)) { + return; + } + + String suggestion = findUniqueCloseMatch(name, isAsyncMockOrChildMock(qualifier, ctx)); + if (suggestion == null) { + return; + } + + var issue = ctx.addIssue(memberName, String.format(MESSAGE, suggestion)); + issue.addQuickFix(PythonQuickFix.newQuickFix(String.format(QUICK_FIX_MESSAGE, suggestion)) + .addTextEdit(TextEditUtils.replace(memberName, suggestion)) + .build()); + } + + private static boolean isMockOrChildMock(Expression expression, SubscriptionContext ctx) { + return matchesAlongQualifierChain(expression, ctx, MOCK_INSTANCE); + } + + private static boolean isAsyncMockOrChildMock(Expression expression, SubscriptionContext ctx) { + return matchesAlongQualifierChain(expression, ctx, ASYNC_MOCK_INSTANCE); + } + + private static boolean matchesAlongQualifierChain(Expression expression, SubscriptionContext ctx, TypeMatcher matcher) { + Expression current = Expressions.removeParentheses(expression); + while (true) { + if (matcher.isTrueFor(current, ctx)) { + return true; + } + if (!(current instanceof QualifiedExpression qualifiedExpression)) { + return false; + } + current = Expressions.removeParentheses(qualifiedExpression.qualifier()); + } + } + + @CheckForNull + private static String findUniqueCloseMatch(String name, boolean asyncMock) { + String bestMatch = null; + int bestDistance = MAX_EDIT_DISTANCE + 1; + boolean tied = false; + for (String known : KNOWN_ASSERTION_METHODS) { + if (isAwaitAssertion(known) && !asyncMock) { + continue; + } + int distance = LEVENSHTEIN.apply(name, known); + if (distance > 0) { + if (distance < bestDistance) { + bestDistance = distance; + bestMatch = known; + tied = false; + } else if (distance == bestDistance) { + tied = true; + } + } + } + return tied ? null : bestMatch; + } + + private static boolean isAwaitAssertion(String methodName) { + return methodName.contains("await"); + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9136.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9136.html new file mode 100644 index 000000000..5e5d225d5 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9136.html @@ -0,0 +1,89 @@ +

        This rule raises an issue when a unittest.mock.Mock (or a mock created by patch / pytest-mock) is used with an assertion +attribute whose name closely resembles a real mock assertion method — for example a typo such as assert_called_wit instead of +assert_called_with. This rule only applies to method names that closely match a known assertion API.

        +

        Typical cases include typos on methods such as assert_called, assert_called_with, assert_called_once_with, +assert_any_call, assert_has_calls, and assert_not_called, on Mock, MagicMock, or +mocks returned by unittest.mock.patch / pytest-mock.

        +

        Why is this an issue?

        +

        unittest.mock.Mock creates child attributes on demand. Any unknown name becomes another Mock, including misspelled +assertion methods.

        +

        Calling mock.assert_called_wit(…​) therefore does not fail: it builds a new mock and returns it. The test keeps passing even though +the intended assertion never ran.

        +

        Misspelled assertion

        +
        +mock = Mock()
        +service(mock)
        +mock.assert_called_wit(1, 2)  # typo: creates a child mock, does not assert
        +
        +

        The call looks like an assertion, but it is only attribute access on a Mock.

        +

        Correct assertion name

        +
        +mock = Mock()
        +service(mock)
        +mock.assert_called_with(1, 2)
        +
        +

        Using a real assertion method fails the test when the mock was not called as expected.

        +

        This rule reports only when the attribute name is a near miss of a documented Mock assertion method (a small spelling difference), so +clearly unrelated assert_* names are not flagged. Review manually only if the code intentionally reads a nested mock attribute whose name +merely resembles an assertion helper (this is rare and usually a smell of its own).

        +

        What is the potential impact?

        +

        Broken tests can pass silently. Regressions that the assertion was meant to catch go unnoticed, which weakens confidence in the suite and can let +faulty behavior reach production.

        +

        How to fix it

        +

        Rename the attribute to the correct Mock assertion method so the test performs the check you intended. Do not change production code: +only the test assertion spelling should change, and the asserted call arguments should stay the same.

        +

        Optionally harden the mock with autospec (see {rule:python:S9137}) so future unknown attribute names raise instead of creating child mocks. That is +a separate improvement; the required fix for this issue is correcting the assertion name.

        +

        A won’t-fix / accepted trade-off is not appropriate for a misspelled assertion: the test is not verifying what it claims. Mark as a false positive +only if analysis mistook a non-assertion attribute access for a mock assertion API.

        +

        Code examples

        +

        Noncompliant code example

        +
        +from unittest.mock import Mock
        +
        +def test_process_calls_save():
        +    saver = Mock()
        +    process(saver, "item")
        +    saver.save.assert_called_wit("item")  # Noncompliant
        +
        +

        Compliant solution

        +
        +from unittest.mock import Mock
        +
        +def test_process_calls_save():
        +    saver = Mock()
        +    process(saver, "item")
        +    saver.save.assert_called_with("item")
        +
        +

        Noncompliant code example

        +
        +from unittest.mock import patch
        +
        +def test_notify():
        +    with patch("app.notify.send") as send:
        +        notify_user("u1")
        +        send.assert_called_once_wit("u1")  # Noncompliant
        +
        +

        Compliant solution

        +
        +from unittest.mock import patch
        +
        +def test_notify():
        +    with patch("app.notify.send") as send:
        +        notify_user("u1")
        +        send.assert_called_once_with("u1")
        +
        +

        Resources

        +

        Documentation

        + +

        Related rules

        +
          +
        • {rule:python:S9137} - Mocks should be created with autospec
        • +
        + diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9136.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9136.json new file mode 100644 index 000000000..d5904b2b0 --- /dev/null +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S9136.json @@ -0,0 +1,25 @@ +{ + "title": "Mock assertion method names should be spelled correctly", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "tests", + "pitfall" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-9136", + "sqKey": "S9136", + "scope": "Tests", + "quickfix": "covered", + "code": { + "impacts": { + "RELIABILITY": "HIGH", + "MAINTAINABILITY": "MEDIUM" + }, + "attribute": "LOGICAL" + } +} diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json index 182f7da36..29ac9e343 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/Sonar_way_profile.json @@ -397,6 +397,7 @@ "S9106", "S9116", "S9117", - "S9134" + "S9134", + "S9136" ] } diff --git a/python-checks/src/test/java/org/sonar/python/checks/tests/MisspelledMockAssertionCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/tests/MisspelledMockAssertionCheckTest.java new file mode 100644 index 000000000..16d084f73 --- /dev/null +++ b/python-checks/src/test/java/org/sonar/python/checks/tests/MisspelledMockAssertionCheckTest.java @@ -0,0 +1,53 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.checks.tests; + +import org.junit.jupiter.api.Test; +import org.sonar.plugins.python.api.PythonCheck; +import org.sonar.python.checks.quickfix.PythonQuickFixVerifier; +import org.sonar.python.checks.utils.PythonCheckVerifier; + +import static org.assertj.core.api.Assertions.assertThat; + +class MisspelledMockAssertionCheckTest { + + private static final MisspelledMockAssertionCheck CHECK = new MisspelledMockAssertionCheck(); + private static final String FILE_NAME = "src/test/resources/checks/tests/misspelledMockAssertion.py"; + + @Test + void scope() { + assertThat(CHECK.scope()).isEqualTo(PythonCheck.CheckScope.ALL); + } + + @Test + void test() { + PythonCheckVerifier.verify(FILE_NAME, CHECK); + } + + @Test + void quick_fix() { + PythonQuickFixVerifier.verifySemantic(CHECK, FILE_NAME, """ + from unittest.mock import Mock + m = Mock() + m.assert_called_wit(1) + """, """ + from unittest.mock import Mock + m = Mock() + m.assert_called_with(1) + """); + } +} diff --git a/python-checks/src/test/resources/checks/tests/misspelledMockAssertion.py b/python-checks/src/test/resources/checks/tests/misspelledMockAssertion.py new file mode 100644 index 000000000..6056a96f0 --- /dev/null +++ b/python-checks/src/test/resources/checks/tests/misspelledMockAssertion.py @@ -0,0 +1,109 @@ +from unittest.mock import AsyncMock, MagicMock, Mock, patch + + +def process(saver, item): + saver.save(item) + + +def notify_user(user_id): + pass + + +def test_assert_called_with_typo(): + saver = Mock() + process(saver, "item") + saver.save.assert_called_wit("item") # Noncompliant {{Correct this misspelled mock assertion; did you mean "assert_called_with"?}} +# ^^^^^^^^^^^^^^^^^ + + +def test_assert_called_once_with_typo(): + mock = Mock() + mock(1) + mock.assert_caled_once_with(1) # Noncompliant {{Correct this misspelled mock assertion; did you mean "assert_called_once_with"?}} +# ^^^^^^^^^^^^^^^^^^^^^^ + + +def test_assert_called_typo_on_magic_mock(): + mock = MagicMock() + mock() + mock.assert_calld() # Noncompliant {{Correct this misspelled mock assertion; did you mean "assert_called"?}} +# ^^^^^^^^^^^^ + + +def test_assert_not_called_typo(): + mock = Mock() + mock.assert_not_calld() # Noncompliant {{Correct this misspelled mock assertion; did you mean "assert_not_called"?}} +# ^^^^^^^^^^^^^^^^ + + +def test_assert_any_call_typo(): + mock = Mock() + mock(1) + mock.assert_any_cal(1) # Noncompliant {{Correct this misspelled mock assertion; did you mean "assert_any_call"?}} +# ^^^^^^^^^^^^^^ + + +def test_assert_has_calls_typo(): + mock = Mock() + mock.assert_has_call([]) # Noncompliant {{Correct this misspelled mock assertion; did you mean "assert_has_calls"?}} +# ^^^^^^^^^^^^^^^ + + +def test_async_mock_await_typo(): + mock = AsyncMock() + mock.assert_awaited_wit() # Noncompliant {{Correct this misspelled mock assertion; did you mean "assert_awaited_with"?}} +# ^^^^^^^^^^^^^^^^^^ + + +def test_patch_context_manager_typo(): + with patch("os.path.exists") as exists: + exists.assert_called_once_wit() # FN - patch return type is unknown + + +def test_correct_assertions_are_ok(): + mock = Mock() + mock(1, 2) + mock.assert_called() + mock.assert_called_once() + mock.assert_called_with(1, 2) + mock.assert_called_once_with(1, 2) + mock.assert_any_call(1, 2) + mock.assert_has_calls([]) + mock.assert_not_called() + + +def test_async_correct_assertions_are_ok(): + mock = AsyncMock() + mock.assert_awaited() + mock.assert_awaited_once() + mock.assert_awaited_with() + mock.assert_awaited_once_with() + mock.assert_any_await() + mock.assert_has_awaits([]) + mock.assert_not_awaited() + + +def test_unrelated_attributes_are_ok(): + mock = Mock() + mock.return_value = 1 + mock.side_effect = None + mock.reset_mock() + mock.configure_mock(foo=1) + # Far from any assertion name: not raised (safe). + mock.completely_different_name() + # Looks a bit like assert but too distant from known methods. + mock.assert_something_totally_custom() + + +def test_non_mock_objects_are_ok(): + class Helper: + def assert_called_wit(self, *_args): + pass + + Helper().assert_called_wit(1) + + +def test_exact_custom_member_matching_known_name_is_ok(): + # Exact known assertion names must never be flagged. + mock = Mock() + mock.assert_called_with(1) From 7df08f64b5a908c969ebddf29898617e4dead901 Mon Sep 17 00:00:00 2001 From: Brian Walsh Date: Thu, 13 Aug 2026 08:57:23 -0500 Subject: [PATCH 287/322] BUILD-12227: Migrate sonar-python-enterprise Orchestrator downloads to the JFrog Edge node GitOrigin-RevId: 72372197d108e5fe98ab5ca0f3c63b60f875c584 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e6505dd7f..d165e5e95 100644 --- a/pom.xml +++ b/pom.xml @@ -103,7 +103,7 @@ 26.7.0.124771 13.8.0.4399 13.5.0.4089 - 6.3.1.4538 + 6.4.0.4580 2.29.0.5138 its/**,private/its-enterprise/**,python-frontend/typeshed_serializer/**,**/test/resources/** From 3196f46e20a5b61f1ce9df97eddd450065f5252b Mon Sep 17 00:00:00 2001 From: "hashicorp-vault-sonar-prod[bot]" <111297361+hashicorp-vault-sonar-prod[bot]@users.noreply.github.com> Date: Thu, 13 Aug 2026 16:07:30 +0200 Subject: [PATCH 288/322] SONARPY-4528 Prepare for next development iteration Co-authored-by: rombirli <56340680+rombirli@users.noreply.github.com> GitOrigin-RevId: 1cbc95a0eaed4b3cd883d2960d1eec73a2fc7a16 --- docs/pom.xml | 2 +- docs/python-custom-rules-example/pom.xml | 2 +- its/commons/pom.xml | 2 +- its/plugin/it-python-plugin-test/pom.xml | 2 +- its/plugin/pom.xml | 2 +- its/plugin/python-custom-rules-plugin/pom.xml | 2 +- its/pom.xml | 2 +- pom.xml | 2 +- python-checks-testkit/pom.xml | 2 +- python-checks/pom.xml | 2 +- python-commons/pom.xml | 2 +- python-frontend/pom.xml | 2 +- sonar-python-plugin/pom.xml | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/pom.xml b/docs/pom.xml index 69e5b63e3..2a3d972ff 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.python python - 5.29-SNAPSHOT + 5.30-SNAPSHOT docs diff --git a/docs/python-custom-rules-example/pom.xml b/docs/python-custom-rules-example/pom.xml index 4a2f1ac0b..6727f6f37 100644 --- a/docs/python-custom-rules-example/pom.xml +++ b/docs/python-custom-rules-example/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python docs - 5.29-SNAPSHOT + 5.30-SNAPSHOT python-custom-rules-example diff --git a/its/commons/pom.xml b/its/commons/pom.xml index 9fb0999e7..41a6cff00 100644 --- a/its/commons/pom.xml +++ b/its/commons/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python python-its - 5.29-SNAPSHOT + 5.30-SNAPSHOT Python :: ITs :: Commons diff --git a/its/plugin/it-python-plugin-test/pom.xml b/its/plugin/it-python-plugin-test/pom.xml index f49252c2c..885888d19 100644 --- a/its/plugin/it-python-plugin-test/pom.xml +++ b/its/plugin/it-python-plugin-test/pom.xml @@ -7,7 +7,7 @@ it-python-plugin org.sonarsource.python - 5.29-SNAPSHOT + 5.30-SNAPSHOT it-python-plugin-test diff --git a/its/plugin/pom.xml b/its/plugin/pom.xml index ec09b4db8..09e4e911d 100644 --- a/its/plugin/pom.xml +++ b/its/plugin/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.python python-its - 5.29-SNAPSHOT + 5.30-SNAPSHOT diff --git a/its/plugin/python-custom-rules-plugin/pom.xml b/its/plugin/python-custom-rules-plugin/pom.xml index 35b946339..67807cf45 100644 --- a/its/plugin/python-custom-rules-plugin/pom.xml +++ b/its/plugin/python-custom-rules-plugin/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python it-python-plugin - 5.29-SNAPSHOT + 5.30-SNAPSHOT python-custom-rules-plugin diff --git a/its/pom.xml b/its/pom.xml index 4eaa56aab..76173df1d 100644 --- a/its/pom.xml +++ b/its/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.python python - 5.29-SNAPSHOT + 5.30-SNAPSHOT python-its diff --git a/pom.xml b/pom.xml index d165e5e95..4862c0664 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ org.sonarsource.python python - 5.29-SNAPSHOT + 5.30-SNAPSHOT pom Python diff --git a/python-checks-testkit/pom.xml b/python-checks-testkit/pom.xml index 76e240f1e..1ea9069f9 100644 --- a/python-checks-testkit/pom.xml +++ b/python-checks-testkit/pom.xml @@ -6,7 +6,7 @@ python org.sonarsource.python - 5.29-SNAPSHOT + 5.30-SNAPSHOT python-checks-testkit diff --git a/python-checks/pom.xml b/python-checks/pom.xml index 4fee84bc6..4ab337440 100644 --- a/python-checks/pom.xml +++ b/python-checks/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.python python - 5.29-SNAPSHOT + 5.30-SNAPSHOT python-checks diff --git a/python-commons/pom.xml b/python-commons/pom.xml index 4b807f834..50f33151c 100644 --- a/python-commons/pom.xml +++ b/python-commons/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python python - 5.29-SNAPSHOT + 5.30-SNAPSHOT python-commons diff --git a/python-frontend/pom.xml b/python-frontend/pom.xml index 0058df28f..338717481 100644 --- a/python-frontend/pom.xml +++ b/python-frontend/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python python - 5.29-SNAPSHOT + 5.30-SNAPSHOT python-frontend diff --git a/sonar-python-plugin/pom.xml b/sonar-python-plugin/pom.xml index 554541fe4..dc44fa276 100644 --- a/sonar-python-plugin/pom.xml +++ b/sonar-python-plugin/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python python - 5.29-SNAPSHOT + 5.30-SNAPSHOT sonar-python-plugin From 5220798bc0ce122366ac90e8cb374d6bf2a3057b Mon Sep 17 00:00:00 2001 From: Karim El Ouerghemmi <64004037+karim-ouerghemmi-sonarsource@users.noreply.github.com> Date: Mon, 17 Aug 2026 10:00:48 +0200 Subject: [PATCH 289/322] SONARPY-4526 Reset SonarPython state between analyses GitOrigin-RevId: ab68baa8a9a9efa93e676e82c6cab9e769d09036 --- .../org/sonar/plugins/python/IPynbSensor.java | 8 ------ .../sonar/plugins/python/PythonScanner.java | 8 ++++++ .../sonar/plugins/python/PythonSensor.java | 7 ------ .../sonar/plugins/python/IPynbSensorTest.java | 13 ++++++++++ .../plugins/python/PythonSensorTest.java | 25 +++++++++++++++++++ .../sensor/python-version/type_alias.py | 3 +++ .../java/org/sonar/python/types/TypeShed.java | 25 ++++++++++++------- .../org/sonar/python/types/TypeShedTest.java | 14 ++++++++--- 8 files changed, 75 insertions(+), 28 deletions(-) create mode 100644 python-commons/src/test/resources/org/sonar/plugins/python/sensor/python-version/type_alias.py diff --git a/python-commons/src/main/java/org/sonar/plugins/python/IPynbSensor.java b/python-commons/src/main/java/org/sonar/plugins/python/IPynbSensor.java index d57f8e748..2cfe7c720 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/IPynbSensor.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/IPynbSensor.java @@ -31,8 +31,6 @@ import org.sonar.api.batch.sensor.SensorDescriptor; import org.sonar.api.issue.NoSonarFilter; import org.sonar.api.measures.FileLinesContextFactory; -import org.sonar.plugins.python.api.ProjectPythonVersion; -import org.sonar.plugins.python.api.PythonVersionUtils; import org.sonar.plugins.python.api.caching.CacheContext; import org.sonar.plugins.python.architecture.DummyArchitectureCallback; import org.sonar.plugins.python.editions.OpenSourceRepositoryInfoProvider; @@ -48,8 +46,6 @@ import org.sonar.python.parser.PythonParser; import org.sonar.python.project.config.ProjectConfigurationBuilder; -import static org.sonar.plugins.python.api.PythonVersionUtils.PYTHON_VERSION_KEY; - public final class IPynbSensor implements Sensor { private final PythonChecks checks; @@ -114,10 +110,6 @@ public void describe(SensorDescriptor descriptor) { public void execute(SensorContext context) { Instant sensorStartTime = Instant.now(); List pythonFiles = getInputFiles(context); - var pythonVersions = context.config().getStringArray(PYTHON_VERSION_KEY); - if (pythonVersions.length != 0) { - ProjectPythonVersion.setCurrentVersions(PythonVersionUtils.fromStringArray(pythonVersions)); - } if (isInSonarLintRuntime(context)) { PythonScanner scanner = new PythonScanner(context, checks, fileLinesContextFactory, noSonarFilter, PythonParser::createIPythonParser, indexer, new DummyArchitectureCallback(), noSonarLineInfoCollector, new AnalysisWarningsWrapper()); diff --git a/python-commons/src/main/java/org/sonar/plugins/python/PythonScanner.java b/python-commons/src/main/java/org/sonar/plugins/python/PythonScanner.java index b337c65fb..8a98bb882 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/PythonScanner.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/PythonScanner.java @@ -49,6 +49,8 @@ import org.sonar.plugins.python.api.PythonInputFileContext; import org.sonar.plugins.python.api.PythonSubscriptionCheck; import org.sonar.plugins.python.api.PythonVisitorContext; +import org.sonar.plugins.python.api.ProjectPythonVersion; +import org.sonar.plugins.python.api.PythonVersionUtils; import org.sonar.plugins.python.api.internal.EndOfAnalysis; import org.sonar.plugins.python.api.tree.FileInput; import org.sonar.plugins.python.cpd.PythonCpdAnalyzer; @@ -66,6 +68,9 @@ import org.sonar.python.parser.PythonParser; import org.sonar.python.tree.IPythonTreeMaker; import org.sonar.python.tree.PythonTreeMaker; +import org.sonar.python.types.TypeShed; + +import static org.sonar.plugins.python.api.PythonVersionUtils.PYTHON_VERSION_KEY; public class PythonScanner extends Scanner { @@ -111,6 +116,9 @@ public PythonScanner( this.noSonarLineInfoCollector = noSonarLineInfoCollector; this.analysisWarnings = analysisWarnings; this.testSourcesConfigured = TestFileClassifier.isTestSourceConfigured(context.config()); + ProjectPythonVersion.setCurrentVersions(PythonVersionUtils.fromStringArray(context.config().getStringArray(PYTHON_VERSION_KEY))); + TypeShed.setProjectLevelSymbolTable(indexer.projectLevelSymbolTable()); + TypeShed.resetBuiltinSymbols(); this.indexer.buildOnce(context); this.architectureCallback = architectureCallback; this.checksExecutedWithoutParsingByFiles = new ConcurrentHashMap<>(); diff --git a/python-commons/src/main/java/org/sonar/plugins/python/PythonSensor.java b/python-commons/src/main/java/org/sonar/plugins/python/PythonSensor.java index d4af5276a..e85c72f5c 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/PythonSensor.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/PythonSensor.java @@ -36,10 +36,8 @@ import org.sonar.api.batch.sensor.SensorDescriptor; import org.sonar.api.issue.NoSonarFilter; import org.sonar.api.measures.FileLinesContextFactory; -import org.sonar.plugins.python.api.ProjectPythonVersion; import org.sonar.plugins.python.api.PythonCustomRuleRepositoryWrapper; import org.sonar.plugins.python.api.PythonFileConsumer; -import org.sonar.plugins.python.api.PythonVersionUtils; import org.sonar.plugins.python.api.SonarLintCache; import org.sonar.plugins.python.api.SonarLintCacheWrapper; import org.sonar.plugins.python.api.caching.CacheContext; @@ -62,7 +60,6 @@ import org.sonar.python.caching.CacheContextImpl; import org.sonar.python.parser.PythonParser; import org.sonar.python.project.config.ProjectConfigurationBuilder; -import org.sonar.python.types.TypeShed; import org.sonarsource.performance.measure.PerformanceMeasure; import static org.sonar.plugins.python.Scanner.PARALLEL_PROPERTY_NAME; @@ -146,14 +143,10 @@ public void execute(SensorContext context) { LOG.warn(UNSET_VERSION_WARNING); analysisWarnings.addUnique(UNSET_VERSION_WARNING); } - if (pythonVersionParameter.length != 0) { - ProjectPythonVersion.setCurrentVersions(PythonVersionUtils.fromStringArray(pythonVersionParameter)); - } updatePythonVersionTelemetry(context, pythonVersionParameter); CacheContext cacheContext = CacheContextImpl.of(context); PythonIndexer pythonIndexer = this.indexer != null ? this.indexer : new SonarQubePythonIndexer(pythonFiles, cacheContext, context, projectConfigurationBuilder); pythonIndexer.setSonarLintCache(sonarLintCache); - TypeShed.setProjectLevelSymbolTable(pythonIndexer.projectLevelSymbolTable()); PythonScanner scanner = new PythonScanner(context, checks, fileLinesContextFactory, noSonarFilter, PythonParser::create, pythonIndexer, architectureCallback, noSonarLineInfoCollector, analysisWarnings); scanner.execute(pythonFiles, context); diff --git a/python-commons/src/test/java/org/sonar/plugins/python/IPynbSensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/IPynbSensorTest.java index bc683d4fc..e477d019b 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/IPynbSensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/IPynbSensorTest.java @@ -199,6 +199,19 @@ void test_python_version_range_parameter() { PythonVersionUtils.Version.V_311); } + @Test + void absent_python_version_resets_current_versions() { + context.setRuntime(SONARLINT_RUNTIME); + PythonInputFile inputFile = inputFile(FILE_1); + activeRules = new ActiveRulesBuilder().build(); + PythonIndexer pythonIndexer = pythonIndexer(List.of(inputFile)); + ProjectPythonVersion.setCurrentVersions(PythonVersionUtils.fromString("3.10")); + + sensor(pythonIndexer).execute(context); + + assertThat(ProjectPythonVersion.currentVersions()).containsExactlyElementsOf(PythonVersionUtils.allVersions()); + } + private IPynbSensor notebookSensor() { FileLinesContextFactory fileLinesContextFactory = mock(FileLinesContextFactory.class); FileLinesContext fileLinesContext = mock(FileLinesContext.class); diff --git a/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java index 4b163a73f..afa2a969c 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java @@ -977,6 +977,31 @@ void test_python_version_range_parameter() { assertThat(logTester.logs(Level.WARN)).doesNotContain(PythonSensor.UNSET_VERSION_WARNING); } + @Test + void absent_python_version_resets_state_from_previous_analysis() throws IOException { + activeRules = new ActiveRulesBuilder() + .addRule(new NewActiveRule.Builder() + .setRuleKey(RuleKey.of(PythonRuleRepository.REPOSITORY_KEY, "S6794")) + .build()) + .build(); + inputFile("python-version/type_alias.py"); + context.setSettings(new MapSettings().setProperty("sonar.python.version", "3.12")); + + sensor().execute(context); + + assertThat(ProjectPythonVersion.currentVersions()).containsExactly(PythonVersionUtils.Version.V_312); + assertThat(context.allIssues()).hasSize(1); + + context = SensorContextTester.create(baseDir); + context.fileSystem().setWorkDir(Files.createTempDirectory("workDir")); + inputFile("python-version/type_alias.py"); + + sensor().execute(context); + + assertThat(ProjectPythonVersion.currentVersions()).containsExactlyElementsOf(PythonVersionUtils.allVersions()); + assertThat(context.allIssues()).isEmpty(); + } + void setup_typing_concise_rule(String pythonVersion) { context.fileSystem().add(inputFile("python-version/typing.py").wrappedFile()); diff --git a/python-commons/src/test/resources/org/sonar/plugins/python/sensor/python-version/type_alias.py b/python-commons/src/test/resources/org/sonar/plugins/python/sensor/python-version/type_alias.py new file mode 100644 index 000000000..c6ace5cf9 --- /dev/null +++ b/python-commons/src/test/resources/org/sonar/plugins/python/sensor/python-version/type_alias.py @@ -0,0 +1,3 @@ +from typing import TypeAlias + +Alias: TypeAlias = int diff --git a/python-frontend/src/main/java/org/sonar/python/types/TypeShed.java b/python-frontend/src/main/java/org/sonar/python/types/TypeShed.java index 755a09681..7437290ed 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/TypeShed.java +++ b/python-frontend/src/main/java/org/sonar/python/types/TypeShed.java @@ -64,7 +64,6 @@ public class TypeShed { private static volatile Map builtins; private static final Map> typeShedSymbols = new ConcurrentHashMap<>(); - private static final Map> builtinGlobalSymbols = new ConcurrentHashMap<>(); private static final ReentrantLock resolutionLock = new ReentrantLock(); private static final String PROTOBUF_CUSTOM_STUBS = "custom_protobuf/"; @@ -115,7 +114,6 @@ public static Map builtinSymbols() { Map builtinMap = getSymbolsFromProtobufModule(BUILTINS_FQN, PROTOBUF); builtinMap.put(NONE_TYPE, new ClassSymbolImpl(NONE_TYPE, NONE_TYPE)); builtins = Collections.unmodifiableMap(builtinMap); - builtinGlobalSymbols.put("", new HashSet<>(builtinMap.values())); } } finally { resolutionLock.unlock(); @@ -316,17 +314,26 @@ public static SymbolsProtos.ClassSymbol classDescriptorWithFQN(String fullyQuali return null; } + /** + * Invalidates cached Typeshed symbols from the previous analysis, then eagerly rebuilds the builtin symbols and + * supported Python version set for the current analysis. + */ + public static void resetBuiltinSymbols() { + resolutionLock.lock(); + try { + builtins = null; + typeShedSymbols.clear(); + supportedPythonVersions = null; + builtinSymbols(); + } finally { + resolutionLock.unlock(); + } + } + //================================================================================ // Private methods //================================================================================ - // used by tests whenever 'sonar.python.version' changes - public static void resetBuiltinSymbols() { - builtins = null; - typeShedSymbols.clear(); - builtinSymbols(); - } - private static Map searchTypeShedForModule(String moduleName, Set modulesInProgress) { if (modulesInProgress.contains(moduleName)) { return new HashMap<>(); diff --git a/python-frontend/src/test/java/org/sonar/python/types/TypeShedTest.java b/python-frontend/src/test/java/org/sonar/python/types/TypeShedTest.java index 4c245d38c..8bf30b85c 100644 --- a/python-frontend/src/test/java/org/sonar/python/types/TypeShedTest.java +++ b/python-frontend/src/test/java/org/sonar/python/types/TypeShedTest.java @@ -57,6 +57,7 @@ class TypeShedTest { @BeforeEach void setPythonVersions() { + TypeShed.setProjectLevelSymbolTable(ProjectLevelSymbolTable.empty()); ProjectPythonVersion.setCurrentVersions(PythonVersionUtils.allVersions()); TypeShed.resetBuiltinSymbols(); } @@ -149,10 +150,11 @@ void stdlib_symbols() { @Test void symbols_not_retrieved_when_within_same_project() { - ProjectLevelSymbolTable projectLevelSymbolTable = mock(ProjectLevelSymbolTable.class); - TypeShed.setProjectLevelSymbolTable(projectLevelSymbolTable); + ProjectLevelSymbolTable firstProjectLevelSymbolTable = mock(ProjectLevelSymbolTable.class); + TypeShed.setProjectLevelSymbolTable(firstProjectLevelSymbolTable); + when(firstProjectLevelSymbolTable.projectBasePackages()).thenReturn(Set.of("sklearn")); + TypeShed.resetBuiltinSymbols(); - when(projectLevelSymbolTable.projectBasePackages()).thenReturn(Set.of("sklearn")); Map sklearnSymbols = symbolsForModule("sklearn.ensemble"); assertThat(sklearnSymbols).isEmpty(); sklearnSymbols = symbolsForModule("sklearn"); @@ -160,7 +162,11 @@ void symbols_not_retrieved_when_within_same_project() { Symbol symbol = symbolWithFQN("sklearn.ensemble", "sklearn.ensemble.RandomForestClassifier"); assertThat(symbol).isNull(); - when(projectLevelSymbolTable.projectBasePackages()).thenReturn(Set.of("unrelated")); + ProjectLevelSymbolTable secondProjectLevelSymbolTable = mock(ProjectLevelSymbolTable.class); + TypeShed.setProjectLevelSymbolTable(secondProjectLevelSymbolTable); + when(secondProjectLevelSymbolTable.projectBasePackages()).thenReturn(Set.of("unrelated")); + TypeShed.resetBuiltinSymbols(); + sklearnSymbols = symbolsForModule("sklearn.ensemble"); assertThat(sklearnSymbols).isNotEmpty(); symbol = symbolWithFQN("sklearn.ensemble", "sklearn.ensemble.RandomForestClassifier"); From 03e2ccb44d55925442e97b092cf72786d17171c8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 18 Aug 2026 10:35:13 +0200 Subject: [PATCH 290/322] Update junit-team/junit-framework monorepo to v6.1.3 Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> GitOrigin-RevId: e1db4a56ce56d5722e09da2cbad40bf658e2fc16 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 4862c0664..ca9189523 100644 --- a/pom.xml +++ b/pom.xml @@ -90,7 +90,7 @@ 3.20.0 1.15.0 3.27.7 - 6.1.2 + 6.1.3 1.5.38 2.0.18 2.2.1 @@ -269,7 +269,7 @@ org.junit.platform junit-platform-suite-engine - 6.1.2 + 6.1.3 test From 013c09ad5f900d426536cc262cd4923e83016179 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 18 Aug 2026 10:35:19 +0200 Subject: [PATCH 291/322] Update dependency com.sonarsource.rule-api:rule-api to v2.28.0.6113 Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> GitOrigin-RevId: 01bf644b2fbaa4b977aa42e4ecebd962dff5c668 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ca9189523..074b6d7b1 100644 --- a/pom.xml +++ b/pom.xml @@ -114,7 +114,7 @@ 6.2.7 2.14.0 2.22.1 - 2.27.0.6068 + 2.28.0.6113 11 From cb2b957f2195454394d584761c2702f23eb67f8a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 18 Aug 2026 10:35:22 +0200 Subject: [PATCH 292/322] Update dependency python to v3.14.7 Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> GitOrigin-RevId: 4cfe2c32bed405ed9c3b0fdfbd431e4c9a378695 --- mise.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mise.toml b/mise.toml index 4370bc57c..01af55351 100644 --- a/mise.toml +++ b/mise.toml @@ -1,6 +1,6 @@ [tools] java = "21.0" maven = "3.9" -python = "3.9" +python = "3.14.7" uv = "latest" # required for pipx backend "pipx:tox" = { version = "4.57.0", uvx = "true" } From a0c6873bed3ecef7dce47234bd416828c8f78cea Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 18 Aug 2026 10:35:26 +0200 Subject: [PATCH 293/322] Update SonarSource/sonarqube monorepo to v26.8.0.126808 Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> GitOrigin-RevId: c6e78f9ee9ee6a6a983d4a010f03e3f5ebeb31cc --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 074b6d7b1..822eedc5f 100644 --- a/pom.xml +++ b/pom.xml @@ -100,7 +100,7 @@ at SonarSource/sonarqube/gradle.properties --> Python Enterprise - 26.7.0.124771 + 26.8.0.126808 13.8.0.4399 13.5.0.4089 6.4.0.4580 From f772f9ae22c210d55b6ac36275dc7419fc61f048 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 18 Aug 2026 10:35:31 +0200 Subject: [PATCH 294/322] Update SonarSource/parent-oss monorepo to v11.8.0.86067 Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> GitOrigin-RevId: d8d3859cd58d26aec0bb4933f7720351db08eb70 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 822eedc5f..945d7705f 100644 --- a/pom.xml +++ b/pom.xml @@ -108,7 +108,7 @@ its/**,private/its-enterprise/**,python-frontend/typeshed_serializer/**,**/test/resources/** - 11.7.0.86025 + 11.8.0.86067 1.26.0.4194 4.29.3 6.2.7 From a4f2a5aee8ce0f624be142f7fa568ad1b4c86f38 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 18 Aug 2026 10:35:58 +0200 Subject: [PATCH 295/322] Update dependency pipx:tox to v4.58.0 Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> GitOrigin-RevId: ab3a8cc39c4bbe4a62761b9f6148a643dcf809be --- mise.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mise.toml b/mise.toml index 01af55351..491ba6d53 100644 --- a/mise.toml +++ b/mise.toml @@ -3,4 +3,4 @@ java = "21.0" maven = "3.9" python = "3.14.7" uv = "latest" # required for pipx backend -"pipx:tox" = { version = "4.57.0", uvx = "true" } +"pipx:tox" = { version = "4.58.0", uvx = "true" } From 70d213b88d78973803aed896d9c656a96169b48f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 18 Aug 2026 11:13:23 +0200 Subject: [PATCH 296/322] Update dependency pipx:tox to v4.59.0 Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> GitOrigin-RevId: 408e88dcdb5ab317dbd48601a52a60995b4d5d64 --- mise.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mise.toml b/mise.toml index 491ba6d53..da9ca725d 100644 --- a/mise.toml +++ b/mise.toml @@ -3,4 +3,4 @@ java = "21.0" maven = "3.9" python = "3.14.7" uv = "latest" # required for pipx backend -"pipx:tox" = { version = "4.58.0", uvx = "true" } +"pipx:tox" = { version = "4.59.0", uvx = "true" } From 3f53c1987f4e810518b9b134c5baf5d8a13d998f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 18 Aug 2026 11:13:26 +0200 Subject: [PATCH 297/322] Update SonarSource/parent-oss monorepo to v11.9.0.86162 Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> GitOrigin-RevId: 853968346b477e8513ff473738bfe20193841046 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 945d7705f..78c20a0d0 100644 --- a/pom.xml +++ b/pom.xml @@ -108,7 +108,7 @@ its/**,private/its-enterprise/**,python-frontend/typeshed_serializer/**,**/test/resources/** - 11.8.0.86067 + 11.9.0.86162 1.26.0.4194 4.29.3 6.2.7 From 0c113884d7484ef1957f29d0fa9d29e77198863c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 18 Aug 2026 11:52:22 +0200 Subject: [PATCH 298/322] Update dependency ch.qos.logback:logback-classic to v1.6.2 Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> GitOrigin-RevId: b444fc66e43c36f2650f78a802cb8bb5f7091cfd --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 78c20a0d0..c2fbd44f2 100644 --- a/pom.xml +++ b/pom.xml @@ -91,7 +91,7 @@ 1.15.0 3.27.7 6.1.3 - 1.5.38 + 1.6.2 2.0.18 2.2.1 5.23.0 From 5a31d6bae9118340d4baf3574a13368e95e6721b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 18 Aug 2026 11:52:34 +0200 Subject: [PATCH 299/322] Update SonarSource/sonar-plugin-api monorepo to v13.11.0.4459 Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> GitOrigin-RevId: 22fd68542342ab9b4d40d9fcfe1463282371fb22 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c2fbd44f2..fcb0a1854 100644 --- a/pom.xml +++ b/pom.xml @@ -101,7 +101,7 @@ --> Python Enterprise 26.8.0.126808 - 13.8.0.4399 + 13.11.0.4459 13.5.0.4089 6.4.0.4580 2.29.0.5138 From 031cf10888a7891d126e8f015f1c55fad7e71f6d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 18 Aug 2026 11:52:44 +0200 Subject: [PATCH 300/322] Update dependency com.sonarsource.rule-api:rule-api to v2.29.0.6136 Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> GitOrigin-RevId: 57ddd990c52097c8eca86e5690d2e6cf744cd00a --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index fcb0a1854..e12664ff5 100644 --- a/pom.xml +++ b/pom.xml @@ -114,7 +114,7 @@ 6.2.7 2.14.0 2.22.1 - 2.28.0.6113 + 2.29.0.6136 11 From d8e202acbda7008945a2c719cb6ea86c0834e629 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 18 Aug 2026 10:17:40 +0000 Subject: [PATCH 301/322] Update SonarSource/orchestrator monorepo to v6.4.2.4626 Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> GitOrigin-RevId: 381771206f8c74f9bc4d0886f39b1ca5a0e46671 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e12664ff5..4ac16bb97 100644 --- a/pom.xml +++ b/pom.xml @@ -103,7 +103,7 @@ 26.8.0.126808 13.11.0.4459 13.5.0.4089 - 6.4.0.4580 + 6.4.2.4626 2.29.0.5138 its/**,private/its-enterprise/**,python-frontend/typeshed_serializer/**,**/test/resources/** From 189237cd3da9d386fd09803add167ca3c445467b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 18 Aug 2026 13:25:24 +0200 Subject: [PATCH 302/322] Update SonarSource/sonar-scanner-engine monorepo to v13.7.0.4455 Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> GitOrigin-RevId: 0899c78c4578cd74dde6221a19ac49e521f9bd15 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4ac16bb97..8aba7083f 100644 --- a/pom.xml +++ b/pom.xml @@ -102,7 +102,7 @@ Python Enterprise 26.8.0.126808 13.11.0.4459 - 13.5.0.4089 + 13.7.0.4455 6.4.2.4626 2.29.0.5138 From 7387f91a9510f44f095cbad40d634f515aceb5f6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 18 Aug 2026 13:55:38 +0200 Subject: [PATCH 303/322] Update SonarSource/sonar-analyzer-commons monorepo to v2.30.0.5193 Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Victor Diez GitOrigin-RevId: 995b87df7a414d0fd32789661913d8daeb91e726 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8aba7083f..2e879fc98 100644 --- a/pom.xml +++ b/pom.xml @@ -104,7 +104,7 @@ 13.11.0.4459 13.7.0.4455 6.4.2.4626 - 2.29.0.5138 + 2.30.0.5193 its/**,private/its-enterprise/**,python-frontend/typeshed_serializer/**,**/test/resources/** From 81f81209bbd2bcf53296399a49c4fa72abfe8c21 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 19 Aug 2026 10:39:25 +0200 Subject: [PATCH 304/322] Update dependency pipx:tox to v4.60.0 Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> GitOrigin-RevId: 5cccdaa052a8a78310fa0e4a90e7b2331ecab008 --- mise.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mise.toml b/mise.toml index da9ca725d..5387487fd 100644 --- a/mise.toml +++ b/mise.toml @@ -3,4 +3,4 @@ java = "21.0" maven = "3.9" python = "3.14.7" uv = "latest" # required for pipx backend -"pipx:tox" = { version = "4.59.0", uvx = "true" } +"pipx:tox" = { version = "4.60.0", uvx = "true" } From a4d5d4c396591d15548b5ed419b63a46cdb0842d Mon Sep 17 00:00:00 2001 From: erwan-leforestier-sonarsource Date: Wed, 19 Aug 2026 11:40:11 +0200 Subject: [PATCH 305/322] SONARPY-4544 Improve S3516: Count terminal raises as exits GitOrigin-RevId: 75eb5716bcd9d8c46182c56ea40104dacf26fe04 --- .../python/checks/InvariantReturnCheck.java | 23 ++++-- .../test/resources/checks/invariantReturn.py | 49 ++++++++++- .../java/org/sonar/python/cfg/CfgUtils.java | 18 +++- .../org/sonar/python/cfg/CfgUtilsTest.java | 82 +++++++++++++++---- 4 files changed, 143 insertions(+), 29 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/InvariantReturnCheck.java b/python-checks/src/main/java/org/sonar/python/checks/InvariantReturnCheck.java index 476e0b2ea..d254f00f4 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/InvariantReturnCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/InvariantReturnCheck.java @@ -42,6 +42,7 @@ import org.sonar.plugins.python.api.tree.Tree.Kind; import org.sonar.plugins.python.api.tree.TryStatement; import org.sonar.plugins.python.api.tree.UnaryExpression; +import org.sonar.python.cfg.CfgUtils; import org.sonar.python.cfg.PythonCfgBranchingBlock; import org.sonar.python.tree.TreeUtils; @@ -80,17 +81,21 @@ public void initialize(Context context) { private static List collectLatestExecutedBlocks(ControlFlowGraph cfg) { List collectedBlocks = new ArrayList<>(); + Set reachableBlocks = CfgUtils.reachableBlocks(cfg); for (CfgBlock predecessor : cfg.end().predecessors()) { + if (!reachableBlocks.contains(predecessor)) { + continue; + } if (predecessor instanceof PythonCfgBranchingBlock pythonCfgBranchingBlock) { - collectBranchingBlock(collectedBlocks, pythonCfgBranchingBlock); - } else if (!endsWithElementKind(predecessor, Kind.RAISE_STMT)) { + collectBranchingBlock(collectedBlocks, pythonCfgBranchingBlock, reachableBlocks); + } else { collectedBlocks.add(new LatestExecutedBlock(predecessor)); } } return collectedBlocks; } - private static void collectBranchingBlock(List collectedBlocks, PythonCfgBranchingBlock branchingBlock) { + private static void collectBranchingBlock(List collectedBlocks, PythonCfgBranchingBlock branchingBlock, Set reachableBlocks) { Tree branchingTree = branchingBlock.branchingTree(); if (branchingTree.is(Kind.TRY_STMT)) { TryStatement tryStatement = (TryStatement) branchingTree; @@ -100,16 +105,20 @@ private static void collectBranchingBlock(List collectedBlo } else if (branchingTree.is(Kind.IF_STMT) || branchingTree instanceof Pattern) { collectedBlocks.add(new LatestExecutedBlock(branchingBlock)); } else { - collectBlocksHavingReturnBeforeExceptOrFinallyBlock(collectedBlocks, branchingBlock); + collectBlocksHavingReturnBeforeExceptOrFinallyBlock(collectedBlocks, branchingBlock, reachableBlocks); } } - private static void collectBlocksHavingReturnBeforeExceptOrFinallyBlock(List collectedBlocks, PythonCfgBranchingBlock branchingBlock) { + private static void collectBlocksHavingReturnBeforeExceptOrFinallyBlock(List collectedBlocks, PythonCfgBranchingBlock branchingBlock, + Set reachableBlocks) { if (branchingBlock.branchingTree().is(Kind.EXCEPT_CLAUSE, Kind.FINALLY_CLAUSE)) { for (CfgBlock predecessor : branchingBlock.predecessors()) { + if (!reachableBlocks.contains(predecessor)) { + continue; + } if (predecessor instanceof PythonCfgBranchingBlock pythonCfgBranchingBlock) { - collectBlocksHavingReturnBeforeExceptOrFinallyBlock(collectedBlocks, pythonCfgBranchingBlock); - } else if (endsWithElementKind(predecessor, Kind.RETURN_STMT)) { + collectBlocksHavingReturnBeforeExceptOrFinallyBlock(collectedBlocks, pythonCfgBranchingBlock, reachableBlocks); + } else if (endsWithElementKind(predecessor, Kind.RETURN_STMT) || endsWithElementKind(predecessor, Kind.RAISE_STMT)) { collectedBlocks.add(new LatestExecutedBlock(predecessor)); } } diff --git a/python-checks/src/test/resources/checks/invariantReturn.py b/python-checks/src/test/resources/checks/invariantReturn.py index 3648cb887..14408417d 100644 --- a/python-checks/src/test/resources/checks/invariantReturn.py +++ b/python-checks/src/test/resources/checks/invariantReturn.py @@ -433,15 +433,56 @@ def f_raise_is_not_a_return(a, b): raise b return b -def f_function_exit_through_raise_should_be_ignored(a, b, c): # Noncompliant -# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +def f_function_exit_through_raise_prevents_reporting(a, b, c): if a: return b -# ^^^^^^^^< if c: raise return b -# ^^^^^^^^< + +def f_early_return_with_raise_guard(already_valid, invalid, obj): + if already_valid: + return obj + if invalid: + raise ValueError() + return obj + +def f_unreachable_raise_does_not_prevent_reporting(a, b): # Noncompliant + if a: + return b + return b + raise ValueError() + +def f_raise_in_try_with_finally(early, invalid, value): + if early: + return value + try: + if invalid: + raise ValueError() + finally: + pass + return value + +def f_raise_in_try_with_except(early, invalid, value): + if early: + return value + try: + if invalid: + raise ValueError() + except TypeError: + cleanup() + return value + +def f_unreachable_raise_before_finally_does_not_prevent_reporting(a, b): # Noncompliant + try: + if a: + return b + else: + return b + raise ValueError() + finally: + pass + return b def f_same_binding_through_multiple_paths(a): # Noncompliant d = 3 diff --git a/python-frontend/src/main/java/org/sonar/python/cfg/CfgUtils.java b/python-frontend/src/main/java/org/sonar/python/cfg/CfgUtils.java index e1d87acc3..5aca537c5 100644 --- a/python-frontend/src/main/java/org/sonar/python/cfg/CfgUtils.java +++ b/python-frontend/src/main/java/org/sonar/python/cfg/CfgUtils.java @@ -29,7 +29,12 @@ private CfgUtils() { // empty constructor } - public static Set unreachableBlocks(ControlFlowGraph cfg) { + /** + * Returns the blocks reachable from the control-flow graph start. + * @param cfg the control-flow graph to traverse + * @return the reachable blocks + */ + public static Set reachableBlocks(ControlFlowGraph cfg) { Set reachableBlocks = new HashSet<>(); Deque workList = new ArrayDeque<>(); workList.push(cfg.start()); @@ -39,7 +44,16 @@ public static Set unreachableBlocks(ControlFlowGraph cfg) { currentBlock.successors().forEach(workList::push); } } - return difference(cfg.blocks(), reachableBlocks); + return reachableBlocks; + } + + /** + * Returns the blocks that are not reachable from the control-flow graph start. + * @param cfg the control-flow graph to inspect + * @return the unreachable blocks + */ + public static Set unreachableBlocks(ControlFlowGraph cfg) { + return difference(cfg.blocks(), reachableBlocks(cfg)); } private static Set difference(Set a, Set b) { diff --git a/python-frontend/src/test/java/org/sonar/python/cfg/CfgUtilsTest.java b/python-frontend/src/test/java/org/sonar/python/cfg/CfgUtilsTest.java index 0dadac634..d2f585525 100644 --- a/python-frontend/src/test/java/org/sonar/python/cfg/CfgUtilsTest.java +++ b/python-frontend/src/test/java/org/sonar/python/cfg/CfgUtilsTest.java @@ -16,17 +16,17 @@ */ package org.sonar.python.cfg; - import java.util.Arrays; import java.util.HashSet; +import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; import org.junit.jupiter.api.Test; +import org.sonar.plugins.python.api.PythonFile; import org.sonar.plugins.python.api.cfg.CfgBlock; import org.sonar.plugins.python.api.cfg.ControlFlowGraph; import org.sonar.plugins.python.api.tree.FileInput; import org.sonar.plugins.python.api.tree.FunctionDef; -import org.sonar.plugins.python.api.PythonFile; import org.sonar.python.PythonTestUtils; import static org.assertj.core.api.Assertions.assertThat; @@ -34,44 +34,94 @@ class CfgUtilsTest { - private PythonFile file = mock(PythonFile.class, "file1.py"); + private final PythonFile file = mock(PythonFile.class, "file1.py"); @Test - void unreachableBlocks_empty() { + void all_blocks_reachable_without_jumps() { ControlFlowGraph cfg = cfg( "x = 10" ); - assertThat(CfgUtils.unreachableBlocks(cfg)).isEmpty(); + + assertAllBlocksReachable(cfg); } @Test - void unreachableBlocks_one() { + void return_makes_its_syntactic_successor_unreachable() { ControlFlowGraph cfg = cfg( "x = 10", "return", "y = 42" ); - assertThat(CfgUtils.unreachableBlocks(cfg)).containsExactlyInAnyOrder(cfg.start().syntacticSuccessor()); + + assertOnlySyntacticSuccessorIsUnreachable(cfg); } @Test - void unreachableBlocks_conditional() { + void raise_makes_its_syntactic_successor_unreachable() { ControlFlowGraph cfg = cfg( "x = 10", - "return", - "if x > 9:", - " print(x)", + "raise RuntimeError()", "y = 42" ); - Set unreachableBlocks = new HashSet<>(); - CfgBlock syntacticSuccessor = cfg.start().syntacticSuccessor(); - unreachableBlocks.add(syntacticSuccessor); - unreachableBlocks.addAll(syntacticSuccessor.successors()); - assertThat(CfgUtils.unreachableBlocks(cfg)).isEqualTo(unreachableBlocks); + assertOnlySyntacticSuccessorIsUnreachable(cfg); } + @Test + void break_makes_its_syntactic_successor_unreachable() { + ControlFlowGraph cfg = cfg( + "while condition:", + " break", + " unreachable()", + "after_loop()" + ); + + assertOnlySyntacticSuccessorIsUnreachable(cfg); + } + @Test + void continue_makes_its_syntactic_successor_unreachable() { + ControlFlowGraph cfg = cfg( + "while condition:", + " continue", + " unreachable()", + "after_loop()" + ); + + assertOnlySyntacticSuccessorIsUnreachable(cfg); + } + + @Test + void multiple_blocks_reachable_with_branching() { + ControlFlowGraph cfg = cfg( + "if condition:", + " if_branch()", + "else:", + " else_branch()", + "after_branch()" + ); + + assertThat(cfg.start().successors()).hasSize(2); + assertAllBlocksReachable(cfg); + } + + private static void assertAllBlocksReachable(ControlFlowGraph cfg) { + assertThat(CfgUtils.reachableBlocks(cfg)).isEqualTo(cfg.blocks()); + assertThat(CfgUtils.unreachableBlocks(cfg)).isEmpty(); + } + + private static void assertOnlySyntacticSuccessorIsUnreachable(ControlFlowGraph cfg) { + Set syntacticSuccessors = cfg.blocks().stream() + .map(CfgBlock::syntacticSuccessor) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + assertThat(syntacticSuccessors).hasSize(1); + + Set expectedReachableBlocks = new HashSet<>(cfg.blocks()); + expectedReachableBlocks.removeAll(syntacticSuccessors); + assertThat(CfgUtils.reachableBlocks(cfg)).isEqualTo(expectedReachableBlocks); + assertThat(CfgUtils.unreachableBlocks(cfg)).isEqualTo(syntacticSuccessors); + } private ControlFlowGraph cfg(String... lines) { FileInput fileInput = PythonTestUtils.parse("def wrapper():", Arrays.stream(lines).map(s -> " " + s).collect(Collectors.joining("\n"))); From 832ea1da3cfaadf4c644daa4dc328aa7dd4ae9cc Mon Sep 17 00:00:00 2001 From: erwan-leforestier-sonarsource Date: Wed, 19 Aug 2026 12:04:28 +0200 Subject: [PATCH 306/322] SONARPY-4540 Handle built-in type assignments GitOrigin-RevId: 2e8764124b108b25ba9b04e0af470d0a98d113e5 --- .../checks/DirectTypeComparisonCheck.java | 14 +---- ...riableAndParameterNameConventionCheck.java | 59 ++++++++++++------- .../python/checks/utils/Expressions.java | 30 ++++++++++ .../python/checks/utils/ExpressionsTest.java | 17 ++++++ ...VariableAndParameterNameIncompatibility.py | 34 +++++++++++ 5 files changed, 123 insertions(+), 31 deletions(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/DirectTypeComparisonCheck.java b/python-checks/src/main/java/org/sonar/python/checks/DirectTypeComparisonCheck.java index adb3ba25c..ebea45536 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/DirectTypeComparisonCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/DirectTypeComparisonCheck.java @@ -20,15 +20,13 @@ import org.sonar.check.Rule; import org.sonar.plugins.python.api.PythonSubscriptionCheck; import org.sonar.plugins.python.api.SubscriptionContext; -import org.sonar.plugins.python.api.symbols.Symbol; import org.sonar.plugins.python.api.tree.BinaryExpression; -import org.sonar.plugins.python.api.tree.CallExpression; import org.sonar.plugins.python.api.tree.Expression; import org.sonar.plugins.python.api.tree.Token; +import org.sonar.python.checks.utils.Expressions; import org.sonar.python.tree.TreeUtils; import static org.sonar.plugins.python.api.symbols.Symbol.Kind.CLASS; -import static org.sonar.plugins.python.api.tree.Tree.Kind.CALL_EXPR; import static org.sonar.plugins.python.api.tree.Tree.Kind.COMPARISON; @Rule(key = "S6660") @@ -53,13 +51,7 @@ private static void checkBinaryExpression(SubscriptionContext ctx, BinaryExpress } private static boolean isDirectTypeComparison(Expression lhs, Expression rhs) { - return (isTypeBuiltinCall(lhs) && TreeUtils.getSymbolFromTree(rhs).filter(s -> s.is(CLASS)).isPresent()) - || (isTypeBuiltinCall(rhs) && TreeUtils.getSymbolFromTree(lhs).filter(s -> s.is(CLASS)).isPresent()); - } - - private static boolean isTypeBuiltinCall(Expression expression) { - if (!expression.is(CALL_EXPR)) return false; - Symbol calleeSymbol = ((CallExpression) expression).calleeSymbol(); - return calleeSymbol != null && "type".equals(calleeSymbol.fullyQualifiedName()); + return (Expressions.isBuiltinTypeCall(lhs) && TreeUtils.getSymbolFromTree(rhs).filter(s -> s.is(CLASS)).isPresent()) + || (Expressions.isBuiltinTypeCall(rhs) && TreeUtils.getSymbolFromTree(lhs).filter(s -> s.is(CLASS)).isPresent()); } } diff --git a/python-checks/src/main/java/org/sonar/python/checks/LocalVariableAndParameterNameConventionCheck.java b/python-checks/src/main/java/org/sonar/python/checks/LocalVariableAndParameterNameConventionCheck.java index ee374a68c..24cd55521 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/LocalVariableAndParameterNameConventionCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/LocalVariableAndParameterNameConventionCheck.java @@ -32,6 +32,8 @@ import org.sonar.plugins.python.api.symbols.Usage; import org.sonar.plugins.python.api.symbols.v2.SymbolV2; import org.sonar.plugins.python.api.symbols.v2.UsageV2; +import org.sonar.plugins.python.api.tree.AnnotatedAssignment; +import org.sonar.plugins.python.api.tree.AssignmentExpression; import org.sonar.plugins.python.api.tree.AssignmentStatement; import org.sonar.plugins.python.api.tree.Expression; import org.sonar.plugins.python.api.tree.FunctionDef; @@ -40,6 +42,7 @@ import org.sonar.plugins.python.api.tree.SubscriptionExpression; import org.sonar.plugins.python.api.tree.Tree; import org.sonar.plugins.python.api.types.v2.PythonType; +import org.sonar.python.checks.utils.Expressions; import org.sonar.python.checks.utils.MarimoUtils; import org.sonar.python.semantic.SymbolUtils; import org.sonar.python.tree.TreeUtils; @@ -92,22 +95,32 @@ private void checkName(SymbolV2 symbol, SubscriptionContext ctx) { return; } if (!pattern.matcher(name).matches()) { - if (isType(symbol)) { + if (hasTypeVariableType(symbol)) { // Type variables generally adhere to class naming conventions rather than regular variable naming conventions return; } + boolean assignedFromType = isAssignedFromType(symbol); symbol.usages().stream() .filter(usage -> USAGES.contains(usage.kind())) .sorted(Comparator.comparingInt(u -> u.tree().firstToken().line())) .limit(1) - .forEach(usage -> raiseIssueForNameAndUsage(ctx, name, usage)); + .forEach(usage -> { + if (assignedFromType && usage.kind() == UsageV2.Kind.ASSIGNMENT_LHS) { + return; + } + raiseIssueForNameAndUsage(ctx, name, usage); + }); } } - private boolean isType(SymbolV2 symbolV2) { + private boolean hasTypeVariableType(SymbolV2 symbolV2) { // TypeV1 and TypeV2 can detect different cases and work complementary to find more issues Symbol symbolV1 = SymbolUtils.symbolV2ToSymbolV1(symbolV2).orElse(null); - return symbolV1 != null && (isExtendingType(symbolV1) || isAssignedFromTyping(symbolV2) || isPythonTypeAClassType(symbolV2)); + return (symbolV1 != null && isExtendingType(symbolV1)) || isPythonTypeAClassType(symbolV2); + } + + private static boolean isAssignedFromType(SymbolV2 symbolV2) { + return isAssignedFromTyping(symbolV2) || isAssignedFromBuiltinType(symbolV2); } private static boolean isExtendingType(Symbol symbol) { @@ -122,18 +135,13 @@ private static boolean isExtendingType(Symbol symbol) { } private static boolean isAssignedFromTyping(SymbolV2 symbol) { - List assignedValues = symbol.usages().stream() - .filter(u -> u.kind() == UsageV2.Kind.ASSIGNMENT_LHS) - .flatMap(usage -> getAssignedValue(usage.tree())) - .toList(); + return assignedValuesOf(symbol) + .map(LocalVariableAndParameterNameConventionCheck::getTypingSymbol) + .anyMatch(assignedSymbol -> assignedSymbol != null && isExtendingType(assignedSymbol)); + } - for (Expression assignedValue : assignedValues) { - Symbol assignedSymbol = getTypingSymbol(assignedValue); - if (assignedSymbol != null && isExtendingType(assignedSymbol)) { - return true; - } - } - return false; + private static boolean isAssignedFromBuiltinType(SymbolV2 symbol) { + return assignedValuesOf(symbol).anyMatch(Expressions::isBuiltinTypeAssignment); } private boolean isPythonTypeAClassType(SymbolV2 symbol) { @@ -141,13 +149,24 @@ private boolean isPythonTypeAClassType(SymbolV2 symbol) { return isDjangoModelTypeCheck.check(type).isTrue(); } + private static Stream assignedValuesOf(SymbolV2 symbol) { + return symbol.usages().stream() + .filter(u -> u.kind() == UsageV2.Kind.ASSIGNMENT_LHS) + .flatMap(usage -> getAssignedValue(usage.tree())); + } + private static Stream getAssignedValue(Tree assignmentName) { - var assignmentStmt = TreeUtils.firstAncestorOfClass(assignmentName, AssignmentStatement.class); - if (assignmentStmt != null) { - return Stream.of(assignmentStmt.assignedValue()); - } else { - return Stream.empty(); + Tree assignment = TreeUtils.firstAncestor(assignmentName, + t -> t.is(Tree.Kind.ASSIGNMENT_STMT, Tree.Kind.ANNOTATED_ASSIGNMENT, Tree.Kind.ASSIGNMENT_EXPRESSION)); + Expression assignedValue = null; + if (assignment instanceof AssignmentStatement assignmentStatement) { + assignedValue = assignmentStatement.assignedValue(); + } else if (assignment instanceof AnnotatedAssignment annotatedAssignment) { + assignedValue = annotatedAssignment.assignedValue(); + } else if (assignment instanceof AssignmentExpression assignmentExpression) { + assignedValue = assignmentExpression.expression(); } + return assignedValue != null ? Stream.of(assignedValue) : Stream.empty(); } private static @Nullable Symbol getTypingSymbol(Expression expr) { diff --git a/python-checks/src/main/java/org/sonar/python/checks/utils/Expressions.java b/python-checks/src/main/java/org/sonar/python/checks/utils/Expressions.java index 1cc283e55..198981298 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/utils/Expressions.java +++ b/python-checks/src/main/java/org/sonar/python/checks/utils/Expressions.java @@ -33,6 +33,7 @@ import org.sonar.plugins.python.api.tree.Argument; import org.sonar.plugins.python.api.tree.AssignmentStatement; import org.sonar.plugins.python.api.tree.CallExpression; +import org.sonar.plugins.python.api.tree.ConditionalExpression; import org.sonar.plugins.python.api.tree.DictionaryLiteral; import org.sonar.plugins.python.api.tree.Expression; import org.sonar.plugins.python.api.tree.ExpressionList; @@ -174,6 +175,35 @@ public static Expression removeParentheses(Expression expression) { return res; } + public static boolean isBuiltinTypeCall(Expression expression) { + Expression unwrapped = removeParentheses(expression); + if (unwrapped instanceof CallExpression callExpression) { + Symbol calleeSymbol = callExpression.calleeSymbol(); + return calleeSymbol != null && "type".equals(calleeSymbol.fullyQualifiedName()); + } + return false; + } + + public static boolean isBuiltinTypeAssignment(Expression expression) { + Expression unwrappedExpression = removeParentheses(expression); + if (isBuiltinTypeCall(unwrappedExpression)) { + return true; + } + if (unwrappedExpression instanceof ConditionalExpression conditionalExpression) { + Expression trueExpression = conditionalExpression.trueExpression(); + Expression falseExpression = conditionalExpression.falseExpression(); + return isTypeValuedBranch(trueExpression) + && isTypeValuedBranch(falseExpression) + && (isBuiltinTypeAssignment(trueExpression) || isBuiltinTypeAssignment(falseExpression)); + } + return false; + } + + private static boolean isTypeValuedBranch(Expression branch) { + Expression unwrappedBranch = removeParentheses(branch); + return unwrappedBranch.is(Tree.Kind.NONE) || isBuiltinTypeAssignment(unwrappedBranch); + } + public static Optional singleAssignedNonNameValue(Name name) { Set visited = new HashSet<>(); Expression result = singleAssignedValue(name, visited); diff --git a/python-checks/src/test/java/org/sonar/python/checks/utils/ExpressionsTest.java b/python-checks/src/test/java/org/sonar/python/checks/utils/ExpressionsTest.java index 01fd7c1f2..37f9c2211 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/utils/ExpressionsTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/utils/ExpressionsTest.java @@ -40,6 +40,7 @@ import static org.sonar.python.checks.utils.Expressions.expressionsFromListOrTuple; import static org.sonar.python.checks.utils.Expressions.getAssignedName; import static org.sonar.python.checks.utils.Expressions.isFalsy; +import static org.sonar.python.checks.utils.Expressions.isBuiltinTypeAssignment; import static org.sonar.python.checks.utils.Expressions.isTruthy; import static org.sonar.python.checks.utils.Expressions.removeParentheses; import static org.sonar.python.checks.utils.Expressions.unescape; @@ -117,6 +118,16 @@ void remove_parentheses() { assertThat(removeParentheses(exp("((a))")).getKind()).isEqualTo(Kind.NAME); } + @Test + void builtin_type_assignments() { + assertThat(isBuiltinTypeAssignment(expWithSemantics("type(role)"))).isTrue(); + assertThat(isBuiltinTypeAssignment(expWithSemantics("type(role) if x else None"))).isTrue(); + assertThat(isBuiltinTypeAssignment(expWithSemantics("None if x else type(role)"))).isTrue(); + assertThat(isBuiltinTypeAssignment(expWithSemantics("type(role) if x else 42"))).isFalse(); + assertThat(isBuiltinTypeAssignment(expWithSemantics("42 if x else type(role)"))).isFalse(); + assertThat(isBuiltinTypeAssignment(expWithSemantics("None if x else None"))).isFalse(); + } + @Test void unescape_string_literal() { assertThat(unescape(stringLiteral("''"))).isEmpty(); @@ -253,6 +264,12 @@ private Expression exp(String code) { return exp(parse(code)); } + private Expression expWithSemantics(String code) { + FileInput root = parse(code); + new SymbolTableBuilder(null).visitFileInput(root); + return exp(root); + } + private Expression exp(Tree tree) { if (tree instanceof Expression expression) { return expression; diff --git a/python-checks/src/test/resources/checks/localVariableAndParameterNameIncompatibility.py b/python-checks/src/test/resources/checks/localVariableAndParameterNameIncompatibility.py index 63baf38b4..c4a37f4a5 100644 --- a/python-checks/src/test/resources/checks/localVariableAndParameterNameIncompatibility.py +++ b/python-checks/src/test/resources/checks/localVariableAndParameterNameIncompatibility.py @@ -91,6 +91,40 @@ class MyClass: MyClassAlias = MyClass # OK MyTypeVariable: type = unknown_call() # Noncompliant +def builtin_type_assignments(role, roles): + RoleType = type(role) + OptionalRoleType = type(roles[0]) if roles else None + ParenthesizedRoleType = (type(role)) + BadName = wrapper(type(role)) # Noncompliant + +def annotated_builtin_type_assignments(role, roles): + AnnotatedRoleType: type = type(role) + AnnotatedOptionalRoleType: type | None = type(roles[0]) if roles else None + AnnotatedBadName: type = wrapper(type(role)) # Noncompliant + +def walrus_builtin_type_assignments(role): + if (WalrusRoleType := type(role)): + pass + while (WalrusBadName := wrapper(type(role))): # Noncompliant + pass + +def conditional_builtin_type_assignments(role, fallback, cond, roles): + BothBranchesType = type(role) if cond else type(fallback) + NestedType = type(role) if cond else type(fallback) if roles else None + ReversedType = None if not roles else type(roles[0]) + ParenthesizedNoneType = type(role) if cond else (None) + BothBranchesNone = None if cond else None # Noncompliant + MixedBranches = type(role) if cond else 5 # Noncompliant + +def reassigned_parameter(BadParam, role): # Noncompliant + BadParam = type(role) + +def shadowed_type_assignment(): + def type(value): + return value + + BadName = type("role") # Noncompliant + def ml_names(): X = [1, 2, 3] Y = [0, 1, 0] From 112cdf364a3322a8833c88d7d33b841365fe9648 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Coet?= Date: Wed, 19 Aug 2026 14:16:12 +0200 Subject: [PATCH 307/322] SONARPY-4554 Fix the quality gate GitOrigin-RevId: 5fae14329e3d57290ee77fdb6444dcca5f71a29a --- .../com/sonar/python/it/plugin/CoverageTest.java | 12 ++++++------ .../python/dependency/RequirementsTxtParser.java | 4 +++- .../main/java/org/sonar/python/types/TypeShed.java | 2 +- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/CoverageTest.java b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/CoverageTest.java index 5e35b8e34..97f4ee959 100644 --- a/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/CoverageTest.java +++ b/its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/CoverageTest.java @@ -25,6 +25,7 @@ import java.io.File; import java.util.HashMap; import java.util.Map; +import java.util.regex.Pattern; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -46,6 +47,8 @@ public class CoverageTest { private static final String EMPTY_XML = "empty.xml"; private static final String DEPRECATED_COVERAGE_REPORT_PATH = "sonar.python.coverage.reportPath"; private static final String COVERAGE_REPORT_PATHS = "sonar.python.coverage.reportPaths"; + private static final Pattern LINE_SEPARATOR = Pattern.compile("[\\r\\n]+"); + private static final Pattern EMPTY_REPORT_LOG = Pattern.compile("The report '[^']*' seems to be empty, ignoring"); @Test void basic_coverage_reports_with_unix_paths() { @@ -115,12 +118,9 @@ void empty_coverage_report() { .setProperty(COVERAGE_REPORT_PATHS, EMPTY_XML); BuildResult buildResult = ORCHESTRATOR.executeBuild(build); - int nbLog = 0; - for (String s : buildResult.getLogs().split("[\\r\\n]+")) { - if (s.matches(".*The report '[^']*' seems to be empty, ignoring.*")) { - nbLog++; - } - } + long nbLog = LINE_SEPARATOR.splitAsStream(buildResult.getLogs()) + .filter(line -> EMPTY_REPORT_LOG.matcher(line).find()) + .count(); assertThat(nbLog).isEqualTo(1); assertThat(TestsUtils.getMeasureAsDouble(PROJECT_KEY, COVERAGE)).isZero(); } diff --git a/python-commons/src/main/java/org/sonar/plugins/python/dependency/RequirementsTxtParser.java b/python-commons/src/main/java/org/sonar/plugins/python/dependency/RequirementsTxtParser.java index 092942689..e56584d68 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/dependency/RequirementsTxtParser.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/dependency/RequirementsTxtParser.java @@ -35,6 +35,8 @@ public class RequirementsTxtParser { private static final Pattern PACKAGE_NAME_PATTERN = Pattern.compile("^[A-Za-z0-9](?:[A-Za-z0-9._-]*[A-Za-z0-9])?(?=$|[\\[<>=!~;@])"); + private static final Pattern WHITESPACE_PATTERN = Pattern.compile("\\s+"); + private RequirementsTxtParser(){} public static Dependencies parseRequirementFile(InputFile requirementFile) { @@ -51,7 +53,7 @@ public static Dependencies parseRequirementFile(InputFile requirementFile) { if (line.isEmpty() || line.startsWith("#") || line.startsWith("-")) { continue; } - String[] splittedLine = line.split("\\s+"); + String[] splittedLine = WHITESPACE_PATTERN.split(line, 2); if (splittedLine.length >= 1) { Matcher matcher = PACKAGE_NAME_PATTERN.matcher(splittedLine[0]); if (matcher.find()) { diff --git a/python-frontend/src/main/java/org/sonar/python/types/TypeShed.java b/python-frontend/src/main/java/org/sonar/python/types/TypeShed.java index 7437290ed..56c6b3d11 100644 --- a/python-frontend/src/main/java/org/sonar/python/types/TypeShed.java +++ b/python-frontend/src/main/java/org/sonar/python/types/TypeShed.java @@ -111,7 +111,7 @@ public static Map builtinSymbols() { try { if (builtins == null) { supportedPythonVersions = ProjectPythonVersion.currentVersions().stream().map(PythonVersionUtils.Version::serializedValue).collect(Collectors.toSet()); - Map builtinMap = getSymbolsFromProtobufModule(BUILTINS_FQN, PROTOBUF); + Map builtinMap = new HashMap<>(getSymbolsFromProtobufModule(BUILTINS_FQN, PROTOBUF)); builtinMap.put(NONE_TYPE, new ClassSymbolImpl(NONE_TYPE, NONE_TYPE)); builtins = Collections.unmodifiableMap(builtinMap); } From 9945a83dd6acea0e8ef73c0d2d55bed3f70d92e4 Mon Sep 17 00:00:00 2001 From: erwan-leforestier-sonarsource Date: Wed, 19 Aug 2026 15:06:48 +0200 Subject: [PATCH 308/322] SONARPY-4533 Ignore startswith protocol literals GitOrigin-RevId: 63fb53378d66796b6a6d46a4a17de892402dc816 --- .../hotspots/ClearTextProtocolsCheck.java | 27 ++++++++++ .../checks/hotspots/clearTextProtocols.py | 49 +++++++++++++++++++ 2 files changed, 76 insertions(+) diff --git a/python-checks/src/main/java/org/sonar/python/checks/hotspots/ClearTextProtocolsCheck.java b/python-checks/src/main/java/org/sonar/python/checks/hotspots/ClearTextProtocolsCheck.java index 82be0bdb9..8817b50a9 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/hotspots/ClearTextProtocolsCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/hotspots/ClearTextProtocolsCheck.java @@ -24,6 +24,7 @@ import org.sonar.check.Rule; import org.sonar.plugins.python.api.PythonSubscriptionCheck; import org.sonar.plugins.python.api.SubscriptionContext; +import org.sonar.plugins.python.api.TriBool; import org.sonar.plugins.python.api.symbols.Symbol; import org.sonar.plugins.python.api.tree.ArgList; import org.sonar.plugins.python.api.tree.Argument; @@ -37,6 +38,8 @@ import org.sonar.plugins.python.api.tree.RegularArgument; import org.sonar.plugins.python.api.tree.StringElement; import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; import org.sonar.python.checks.utils.Expressions; import org.sonar.python.checks.cdk.ClearTextProtocolsCheckPart; import org.sonar.python.tree.TreeUtils; @@ -49,6 +52,8 @@ public class ClearTextProtocolsCheck extends PythonSubscriptionCheck { private static final String SENSITIVE_HTTP_SERVER_BIND_FQN = "socketserver.BaseServer.server_bind"; private static final Set SENSITIVE_HTTP_SERVER_METHOD_NAMES = Set.of("serve_forever", "server_bind"); private static final Set SENSITIVE_HTTP_SERVER_CLASSES = Set.of("http.server.HTTPServer", "http.server.ThreadingHTTPServer"); + private static final TypeMatcher STR_METHOD_MATCHER = TypeMatchers.isFunctionOwnerSatisfying(TypeMatchers.isOrExtendsType("builtins.str")); + private static final TypeMatcher STR_TYPE_MATCHER = TypeMatchers.isType("builtins.str"); @Override public void initialize(Context context) { @@ -56,6 +61,7 @@ public void initialize(Context context) { Tree node = ctx.syntaxNode(); String value = Expressions.unescape((StringElement) node); unsafeProtocol(value) + .filter(protocol -> !isStartsWithArgument(node, ctx)) // cleanup slashes .map(protocol -> protocol.substring(0, protocol.length() - 3)) .ifPresent(protocol -> ctx.addIssue(node, message(protocol))); @@ -175,6 +181,27 @@ private static Optional unsafeProtocol(String literalValue) { .findFirst(); } + private static boolean isStartsWithArgument(Tree stringElement, SubscriptionContext context) { + Tree argumentParent = stringElement.parent().parent(); + while (argumentParent.is(Tree.Kind.TUPLE, Tree.Kind.PARENTHESIZED)) { + argumentParent = argumentParent.parent(); + } + if (!(argumentParent instanceof RegularArgument argument) || argument.keywordArgument() != null) { + return false; + } + Tree callTree = TreeUtils.firstAncestorOfKind(argument, Tree.Kind.CALL_EXPR); + if (!(callTree instanceof CallExpression callExpression) + || !(callExpression.callee() instanceof QualifiedExpression callee) + || !"startswith".equals(callee.name().name()) + || STR_METHOD_MATCHER.evaluateFor(callee, context) == TriBool.FALSE) { + return false; + } + // unbound str.startswith(self, prefix) shifts the prefix to the second argument + int prefixIndex = STR_TYPE_MATCHER.evaluateFor(callee.qualifier(), context) == TriBool.TRUE ? 1 : 0; + List arguments = callExpression.arguments(); + return arguments.size() > prefixIndex && arguments.get(prefixIndex) == argument; + } + private static Optional isUnsafeLib(String qualifiedName) { if ("telnetlib.Telnet".equals(qualifiedName)) { return Optional.of("telnet"); diff --git a/python-checks/src/test/resources/checks/hotspots/clearTextProtocols.py b/python-checks/src/test/resources/checks/hotspots/clearTextProtocols.py index 0f0680c3f..295dd4981 100644 --- a/python-checks/src/test/resources/checks/hotspots/clearTextProtocols.py +++ b/python-checks/src/test/resources/checks/hotspots/clearTextProtocols.py @@ -4,6 +4,7 @@ from ftplib import FTP import smtplib import ssl +import urllib.request def clear_text_protocol(): url = "http://" # Noncompliant {{Using HTTP protocol is insecure. Use HTTPS instead.}} @@ -154,6 +155,54 @@ def get_url(self, path): smtp4 = smtplib.SMTP("smtp.gmail.com", port=587) # Noncompliant unknown.unknwon(smtp4) + +def clear_text_protocol_used_as_prefix(url: str): + url.startswith("http://insecure.com") # Compliant + url.startswith(("http://insecure.com", "ftp://insecure.com", "https://secure.com")) # Compliant + + +def clear_text_protocol_used_as_prefix_untyped(url): + url.startswith("http://insecure.com") # Compliant + url.startswith(("http://insecure.com", "ftp://insecure.com", "https://secure.com")) # Compliant + + +def clear_text_protocol_used_as_prefix_unbound(url: str): + str.startswith(url, "http://insecure.com") # Compliant + str.startswith(url, ("http://insecure.com", "ftp://insecure.com", "https://secure.com")) # Compliant + + +def clear_text_protocol_used_as_prefix_grouped(url: str): + url.startswith(("http://insecure.com")) # Compliant + url.startswith((("http://insecure.com"))) # Compliant + + +def clear_text_protocol_used_outside_startswith_prefix(url: str): + check_protocol("http://insecure.com") # Noncompliant + url.endswith("http://insecure.com") # Noncompliant + url.startswith(prefix="http://insecure.com") # Noncompliant + str.startswith("http://insecure.com") # Noncompliant + url.startswith("https://secure.com", "http://insecure.com") # Noncompliant + + +class ClearTextProtocolBase("http://insecure.com"): # Noncompliant + pass + + +def clear_text_protocol_prefix_via_variable(url: str): + prefix = "http://insecure.com" # Noncompliant + url.startswith(prefix) # Compliant + + +def clear_text_protocol_used_by_other_code(): + urllib.request.urlopen("http://insecure.com") # Noncompliant + + class ProtocolMatcher: + def startswith(self, prefix): + pass + + ProtocolMatcher().startswith("http://insecure.com") # Noncompliant + + def method(self): self.something[smth] = None From 32d57039a020dd9cab2855b15ded8bb9f0d958f5 Mon Sep 17 00:00:00 2001 From: erwan-leforestier-sonarsource Date: Wed, 19 Aug 2026 15:07:29 +0200 Subject: [PATCH 309/322] SONARPY-4541 Provide reusable Python test-file heuristic GitOrigin-RevId: 2397b84674fb866a8b87475ec5a810be92a39393 --- .../sonar/plugins/python/PythonScanner.java | 20 +- .../plugins/python/TestFileClassifier.java | 152 ------------- .../python/TestSourceConfiguration.java | 46 ++++ .../indexer/SonarQubePythonIndexer.java | 4 +- .../IpynbNotebookParserScannerTest.java | 14 ++ .../plugins/python/PythonSensorTest.java | 16 ++ .../python/TestFileClassifierTest.java | 209 ----------------- .../python/TestSourceConfigurationTest.java | 58 +++++ .../plugins/python/sensor/framework_helper.py | 6 + .../python/PythonTestFileClassifier.java | 178 +++++++++++++++ .../python/api/PythonVisitorContext.java | 41 +++- .../python/api/SubscriptionContext.java | 8 + .../org/sonar/python/SubscriptionVisitor.java | 5 + .../python/PythonTestFileClassifierTest.java | 211 ++++++++++++++++++ .../python/api/PythonVisitorContextTest.java | 43 ++++ .../python/api/SubscriptionContextTest.java | 151 +++++++++++++ .../sonar/python/SubscriptionVisitorTest.java | 3 +- 17 files changed, 792 insertions(+), 373 deletions(-) delete mode 100644 python-commons/src/main/java/org/sonar/plugins/python/TestFileClassifier.java create mode 100644 python-commons/src/main/java/org/sonar/plugins/python/TestSourceConfiguration.java delete mode 100644 python-commons/src/test/java/org/sonar/plugins/python/TestFileClassifierTest.java create mode 100644 python-commons/src/test/java/org/sonar/plugins/python/TestSourceConfigurationTest.java create mode 100644 python-commons/src/test/resources/org/sonar/plugins/python/sensor/framework_helper.py create mode 100644 python-frontend/src/main/java/org/sonar/plugins/python/PythonTestFileClassifier.java create mode 100644 python-frontend/src/test/java/org/sonar/plugins/python/PythonTestFileClassifierTest.java create mode 100644 python-frontend/src/test/java/org/sonar/plugins/python/api/SubscriptionContextTest.java diff --git a/python-commons/src/main/java/org/sonar/plugins/python/PythonScanner.java b/python-commons/src/main/java/org/sonar/plugins/python/PythonScanner.java index 8a98bb882..ba8262b84 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/PythonScanner.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/PythonScanner.java @@ -98,6 +98,7 @@ public class PythonScanner extends Scanner { private final ImportsTelemetryCollector importsTelemetryCollector; private final List> telemetryCollectors; private final boolean testSourcesConfigured; + private final PythonTestFileClassifier testFileClassifier; private final AnalysisWarningsWrapper analysisWarnings; private final AtomicBoolean heuristicWarningEmitted = new AtomicBoolean(false); private volatile int filesScannedWithCache = 0; @@ -115,7 +116,8 @@ public PythonScanner( this.indexer = indexer; this.noSonarLineInfoCollector = noSonarLineInfoCollector; this.analysisWarnings = analysisWarnings; - this.testSourcesConfigured = TestFileClassifier.isTestSourceConfigured(context.config()); + this.testSourcesConfigured = TestSourceConfiguration.isConfigured(context.config()); + this.testFileClassifier = new PythonTestFileClassifier(context.config()); ProjectPythonVersion.setCurrentVersions(PythonVersionUtils.fromStringArray(context.config().getStringArray(PYTHON_VERSION_KEY))); TypeShed.setProjectLevelSymbolTable(indexer.projectLevelSymbolTable()); TypeShed.resetBuiltinSymbols(); @@ -153,7 +155,7 @@ protected void scanFile(PythonInputFile inputFile) throws IOException { InputFile.Type fileType = inputFile.wrappedFile().type(); PythonVisitorContext visitorContext = createVisitorContext(inputFile, pythonFile); InputFile.Type effectiveTypeForRules = resolveEffectiveTypeForRules( - fileType, projectRelativePath(inputFile), visitorContext.rootTree()); + fileType, visitorContext.isLikelyTestFile()); if (!testSourcesConfigured && fileType == InputFile.Type.MAIN) { indexer.writeEffectiveFileType(inputFile.wrappedFile().key(), effectiveTypeForRules); } @@ -195,6 +197,7 @@ private PythonVisitorContext createVisitorContext(PythonInputFile inputFile, Pyt AstNode astNode = parserSupplier.get().parse(inputFile.contents()); PythonTreeMaker treeMaker = getTreeMaker(inputFile); FileInput parse = treeMaker.fileInput(astNode); + boolean likelyTestFile = isLikelyTestFile(inputFile, parse); visitorContext = new PythonVisitorContext.Builder(parse, pythonFile) .projectConfiguration(indexer.projectConfig()) .workingDirectory(getWorkingDirectory(context)) @@ -203,10 +206,11 @@ private PythonVisitorContext createVisitorContext(PythonInputFile inputFile, Pyt .typeTable(indexer.projectLevelTypeTable()) .cacheContext(indexer.cacheContext()) .sonarProduct(context.runtime().getProduct()) + .likelyTestFile(likelyTestFile) .build(); } catch (RecognitionException e) { - visitorContext = new PythonVisitorContext(pythonFile, e, context.runtime().getProduct()); + visitorContext = new PythonVisitorContext(pythonFile, e, context.runtime().getProduct(), isLikelyTestFile(inputFile, null)); var line = (inputFile.kind() == PythonInputFile.Kind.IPYTHON) ? ((GeneratedIPythonFile) inputFile).locationMap().get(e.getLine()).line() : e.getLine(); @@ -224,6 +228,10 @@ private PythonVisitorContext createVisitorContext(PythonInputFile inputFile, Pyt return visitorContext; } + private boolean isLikelyTestFile(PythonInputFile inputFile, @Nullable FileInput tree) { + return !testSourcesConfigured && testFileClassifier.looksLikeTestFile(inputFile.wrappedFile(), tree); + } + private void pushTokens(PythonInputFile inputFile, PythonVisitorContext visitorContext) { if (!isInSonarLint(context) && inputFile.kind() == PythonInputFile.Kind.PYTHON) { cpdAnalyzer.pushCpdTokens(inputFile.wrappedFile(), visitorContext); @@ -373,12 +381,11 @@ private boolean isBypassed(InputFile.Type platformType) { return testSourcesConfigured || platformType == InputFile.Type.TEST; } - private InputFile.Type resolveEffectiveTypeForRules(InputFile.Type platformType, String filePath, @Nullable FileInput tree) { + private InputFile.Type resolveEffectiveTypeForRules(InputFile.Type platformType, boolean likelyTestFile) { if (isBypassed(platformType)) { return platformType; } - boolean isTest = TestFileClassifier.looksLikeTestFile(filePath, tree); - if (isTest) { + if (likelyTestFile) { maybeEmitHeuristicWarning(); return InputFile.Type.TEST; } @@ -401,7 +408,6 @@ private InputFile.Type resolveEffectiveTypeForRulesFromCache(InputFile.Type plat private void maybeEmitHeuristicWarning() { if (heuristicWarningEmitted.compareAndSet(false, true)) { - LOG.warn(UNSET_SONAR_TESTS_WARNING); analysisWarnings.addUnique(UNSET_SONAR_TESTS_WARNING); } } diff --git a/python-commons/src/main/java/org/sonar/plugins/python/TestFileClassifier.java b/python-commons/src/main/java/org/sonar/plugins/python/TestFileClassifier.java deleted file mode 100644 index 80f3f175c..000000000 --- a/python-commons/src/main/java/org/sonar/plugins/python/TestFileClassifier.java +++ /dev/null @@ -1,152 +0,0 @@ -/* - * SonarQube Python Plugin - * Copyright (C) SonarSource Sàrl - * mailto:info AT sonarsource DOT com - * - * You can redistribute and/or modify this program under the terms of - * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the Sonar Source-Available License for more details. - * - * You should have received a copy of the Sonar Source-Available License - * along with this program; if not, see https://sonarsource.com/license/ssal/ - */ -package org.sonar.plugins.python; - -import java.util.Arrays; -import java.util.Locale; -import java.util.Set; -import javax.annotation.Nullable; -import org.sonar.api.config.Configuration; -import org.sonar.plugins.python.api.tree.AssertStatement; -import org.sonar.plugins.python.api.tree.BaseTreeVisitor; -import org.sonar.plugins.python.api.tree.FileInput; -import org.sonar.plugins.python.api.tree.FunctionDef; -import org.sonar.plugins.python.api.tree.ImportFrom; -import org.sonar.plugins.python.api.tree.ImportName; -import org.sonar.plugins.python.api.tree.Statement; -import static org.sonarsource.analyzer.commons.appsec.TestFileClassifier.HEURISTIC_DISABLED_KEY; -import org.sonar.plugins.python.api.tree.StatementList; - -/** - * Heuristic classifier used when {@code sonar.tests} is not configured. - * Determines whether a file should be treated as a test file for rule-execution - * purposes, without affecting metric computation (which always uses the platform - * {@code InputFile#type()}). - */ -public class TestFileClassifier { - - private static final Set TEST_FRAMEWORK_MODULES = Set.of("unittest", "pytest"); - - private TestFileClassifier() { - } - - /** - * Returns {@code true} when the project configuration explicitly controls which files are test - * files, making the path-based heuristic unnecessary. Both {@link PythonScanner} and - * {@link org.sonar.plugins.python.indexer.SonarQubePythonIndexer} use this to decide whether - * to activate (and cache) the heuristic. - */ - public static boolean isTestSourceConfigured(Configuration config) { - return isPropertyConfigured(config, "sonar.tests") - || config.getBoolean("sonar.python.testFileHeuristic.disabled").orElse(false) - || config.getBoolean(HEURISTIC_DISABLED_KEY).orElse(false); - } - - private static boolean isPropertyConfigured(Configuration config, String key) { - return config.get(key).filter(v -> !v.isBlank()).isPresent(); - } - - /** - * Path-only check — safe to call when no parsed tree is available (e.g. cache hits). - * Matches files whose directory contains {@code test} or {@code tests}, or whose - * filename follows the standard pytest discovery patterns ({@code test_*.py} / {@code *_test.py}). - */ - static boolean looksLikeTestFileByPath(String filePath) { - if (filePath.isEmpty()) { - return false; - } - String normalizedPath = filePath.replace('\\', '/'); - String[] components = normalizedPath.split("/"); - - // Check directory components (all but the last) - boolean dirMatch = Arrays.stream(components, 0, components.length - 1) - .map(c -> c.toLowerCase(Locale.ROOT)) - .anyMatch(dir -> "test".equals(dir) || "tests".equals(dir)); - if (dirMatch) { - return true; - } - - // Check filename - String filename = components[components.length - 1].toLowerCase(Locale.ROOT); - return filename.startsWith("test_") || filename.endsWith("_test.py"); - } - - /** - * Full check — uses the parsed tree in addition to path heuristics. - * Applies when a {@link FileInput} is available (i.e. during a full parse). - */ - static boolean looksLikeTestFile(String filePath, @Nullable FileInput tree) { - if (looksLikeTestFileByPath(filePath)) { - return true; - } - if (tree == null) { - return false; - } - return isImportBasedTestFile(tree) || isPytestPatternFile(tree); - } - - private static boolean isImportBasedTestFile(FileInput tree) { - StatementList statements = tree.statements(); - if (statements == null) { - return false; - } - return statements.statements().stream().anyMatch(TestFileClassifier::isTestFrameworkImport); - } - - private static boolean isTestFrameworkImport(Statement statement) { - if (statement instanceof ImportName importName) { - return importName.modules().stream() - .map(aliasedName -> aliasedName.dottedName().names()) - .filter(names -> !names.isEmpty()) - .anyMatch(names -> TEST_FRAMEWORK_MODULES.contains(names.get(0).name())); - } - if (statement instanceof ImportFrom importFrom) { - var module = importFrom.module(); - if (module != null) { - var names = module.names(); - return !names.isEmpty() && TEST_FRAMEWORK_MODULES.contains(names.get(0).name()); - } - } - return false; - } - - private static boolean isPytestPatternFile(FileInput tree) { - StatementList statements = tree.statements(); - if (statements == null) { - return false; - } - return statements.statements().stream() - .filter(FunctionDef.class::isInstance) - .map(FunctionDef.class::cast) - .anyMatch(f -> f.name().name().startsWith("test_") && containsAssert(f)); - } - - private static boolean containsAssert(FunctionDef functionDef) { - var visitor = new AssertVisitor(); - functionDef.body().accept(visitor); - return visitor.hasAssert; - } - - private static class AssertVisitor extends BaseTreeVisitor { - boolean hasAssert = false; - - @Override - public void visitAssertStatement(AssertStatement assertStatement) { - hasAssert = true; - } - } -} diff --git a/python-commons/src/main/java/org/sonar/plugins/python/TestSourceConfiguration.java b/python-commons/src/main/java/org/sonar/plugins/python/TestSourceConfiguration.java new file mode 100644 index 000000000..6cdf3a354 --- /dev/null +++ b/python-commons/src/main/java/org/sonar/plugins/python/TestSourceConfiguration.java @@ -0,0 +1,46 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.plugins.python; + +import org.sonar.api.config.Configuration; + +import static org.sonarsource.analyzer.commons.appsec.TestFileClassifier.HEURISTIC_DISABLED_KEY; + +/** + * Resolves whether explicit test-source classification is authoritative for the analysis, + * in which case the test-content heuristic must not be applied. + */ +public final class TestSourceConfiguration { + + private TestSourceConfiguration() { + } + + /** + * Checks whether test source classification is explicitly configured. + * @param config analysis configuration + * @return whether the heuristic must be disabled + */ + public static boolean isConfigured(Configuration config) { + return isPropertyConfigured(config, "sonar.tests") + || config.getBoolean("sonar.python.testFileHeuristic.disabled").orElse(false) + || config.getBoolean(HEURISTIC_DISABLED_KEY).orElse(false); + } + + private static boolean isPropertyConfigured(Configuration config, String key) { + return config.get(key).filter(value -> !value.isBlank()).isPresent(); + } +} diff --git a/python-commons/src/main/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexer.java b/python-commons/src/main/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexer.java index 3215f7bf7..510e6f2e3 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexer.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexer.java @@ -31,7 +31,7 @@ import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.sensor.SensorContext; import org.sonar.plugins.python.PythonInputFile; -import org.sonar.plugins.python.TestFileClassifier; +import org.sonar.plugins.python.TestSourceConfiguration; import org.sonar.plugins.python.api.caching.CacheContext; import org.sonar.plugins.python.caching.Caching; import org.sonar.python.index.Descriptor; @@ -66,7 +66,7 @@ public SonarQubePythonIndexer(List inputFiles, CacheContext cac this.projectBaseDirAbsolutePath = context.fileSystem().baseDir().getAbsolutePath(); this.packageRoots = resolvePackageRoots(context); this.caching = new Caching(cacheContext, getCacheVersion(context)); - this.testSourcesConfigured = TestFileClassifier.isTestSourceConfigured(context.config()); + this.testSourcesConfigured = TestSourceConfiguration.isConfigured(context.config()); inputFiles.forEach(f -> { this.inputFiles.add(f); inputFileToFQN.put(f, SymbolUtils.fullyQualifiedModuleName(packageName(f), f.wrappedFile().filename())); diff --git a/python-commons/src/test/java/org/sonar/plugins/python/IpynbNotebookParserScannerTest.java b/python-commons/src/test/java/org/sonar/plugins/python/IpynbNotebookParserScannerTest.java index 89bb47ff1..ab6400b19 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/IpynbNotebookParserScannerTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/IpynbNotebookParserScannerTest.java @@ -18,6 +18,7 @@ import java.io.File; import java.io.IOException; +import java.util.Map; import org.junit.jupiter.api.Test; import org.sonar.api.batch.fs.InputFile; import org.sonar.plugins.python.api.IssueLocation; @@ -32,6 +33,19 @@ class IpynbNotebookParserScannerTest { private final File baseDir = new File("src/test/resources/org/sonar/plugins/python"); + @Test + void generated_notebook_python_uses_the_test_file_classifier() { + var inputFile = createInputFile(baseDir, "notebook_trailing_whitespace.ipynb", InputFile.Status.CHANGED, InputFile.Type.MAIN); + var notebook = IpynbNotebookParser.parseNotebook(inputFile).get(); + var generatedFile = new GeneratedIPythonFile(notebook.wrappedFile(), "import pytest\n", Map.of()); + var context = new PythonVisitorContext.Builder( + TestPythonVisitorRunner.parseNotebookFile(Map.of(), "import pytest\n"), + SonarQubePythonFile.create(generatedFile)) + .build(); + + assertThat(context.isLikelyTestFile()).isTrue(); + } + @Test void trailing_whitespace() throws IOException { var inputFile = createInputFile(baseDir, "notebook_trailing_whitespace.ipynb", InputFile.Status.CHANGED, InputFile.Type.MAIN); diff --git a/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java b/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java index afa2a969c..4a7fda376 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java @@ -145,6 +145,7 @@ class PythonSensorTest { private static final String FILE_USING_TYPESHED = "uses_typeshed.py"; private static final String FILE_QUICKFIX = "file_quickfix.py"; private static final String FILE_TEST_FILE = "test_file.py"; + private static final String FILE_FRAMEWORK_HELPER = "framework_helper.py"; private static final String FILE_INVALID_SYNTAX = "invalid_syntax.py"; private static final String FILE_NO_SONAR_PY = "no_sonar.py"; private static final String ONE_STATEMENT_PER_LINE_RULE_KEY = "OneStatementPerLine"; @@ -650,6 +651,21 @@ void test_auto_reclassify_filename_heuristic_suppresses_main_rules() { verify(analysisWarning).addUnique(PythonScanner.UNSET_SONAR_TESTS_WARNING); } + @Test + void test_auto_reclassify_framework_import_suppresses_main_rules() { + activeRules = new ActiveRulesBuilder() + .addRule(new NewActiveRule.Builder() + .setRuleKey(RuleKey.of(PythonRuleRepository.REPOSITORY_KEY, "S1226")) + .build()) + .build(); + + inputFile(FILE_FRAMEWORK_HELPER, Type.MAIN); + sensor().execute(context); + + assertThat(context.allIssues()).isEmpty(); + verify(analysisWarning).addUnique(PythonScanner.UNSET_SONAR_TESTS_WARNING); + } + @ParameterizedTest @CsvSource({ "sonar.tests, tests", diff --git a/python-commons/src/test/java/org/sonar/plugins/python/TestFileClassifierTest.java b/python-commons/src/test/java/org/sonar/plugins/python/TestFileClassifierTest.java deleted file mode 100644 index 375fed964..000000000 --- a/python-commons/src/test/java/org/sonar/plugins/python/TestFileClassifierTest.java +++ /dev/null @@ -1,209 +0,0 @@ -/* - * SonarQube Python Plugin - * Copyright (C) SonarSource Sàrl - * mailto:info AT sonarsource DOT com - * - * You can redistribute and/or modify this program under the terms of - * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the Sonar Source-Available License for more details. - * - * You should have received a copy of the Sonar Source-Available License - * along with this program; if not, see https://sonarsource.com/license/ssal/ - */ -package org.sonar.plugins.python; - -import java.util.Optional; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ValueSource; -import org.sonar.api.config.Configuration; -import org.sonar.plugins.python.api.tree.FileInput; -import org.sonar.python.parser.PythonParser; -import org.sonar.python.tree.PythonTreeMaker; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; -import static org.sonarsource.analyzer.commons.appsec.TestFileClassifier.HEURISTIC_DISABLED_KEY; - -class TestFileClassifierTest { - - // --- isTestSourceConfigured --- - - @Test - void isTestSourceConfigured_returns_false_for_empty_config() { - var config = mock(Configuration.class); - when(config.get(anyString())).thenReturn(Optional.empty()); - when(config.getBoolean(anyString())).thenReturn(Optional.empty()); - assertThat(TestFileClassifier.isTestSourceConfigured(config)).isFalse(); - } - - @Test - void isTestSourceConfigured_returns_true_for_python_specific_key() { - var config = mock(Configuration.class); - when(config.get(anyString())).thenReturn(Optional.empty()); - when(config.getBoolean(anyString())).thenReturn(Optional.empty()); - when(config.getBoolean("sonar.python.testFileHeuristic.disabled")).thenReturn(Optional.of(true)); - assertThat(TestFileClassifier.isTestSourceConfigured(config)).isTrue(); - } - - @Test - void isTestSourceConfigured_returns_true_for_generic_heuristic_disabled_key() { - var config = mock(Configuration.class); - when(config.get(anyString())).thenReturn(Optional.empty()); - when(config.getBoolean(anyString())).thenReturn(Optional.empty()); - when(config.getBoolean(HEURISTIC_DISABLED_KEY)).thenReturn(Optional.of(true)); - assertThat(TestFileClassifier.isTestSourceConfigured(config)).isTrue(); - } - - // --- looksLikeTestFileByPath --- - - @Test - void empty_path_returns_false() { - assertThat(TestFileClassifier.looksLikeTestFileByPath("")).isFalse(); - } - - @Test - void file_in_tests_directory_returns_true() { - assertThat(TestFileClassifier.looksLikeTestFileByPath("tests/foo.py")).isTrue(); - } - - @Test - void file_in_test_singular_directory_returns_true() { - assertThat(TestFileClassifier.looksLikeTestFileByPath("test/foo.py")).isTrue(); - } - - @Test - void file_in_nested_tests_directory_returns_true() { - assertThat(TestFileClassifier.looksLikeTestFileByPath("src/mypackage/tests/foo.py")).isTrue(); - } - - @Test - void test_prefix_filename_returns_true() { - assertThat(TestFileClassifier.looksLikeTestFileByPath("test_foo.py")).isTrue(); - assertThat(TestFileClassifier.looksLikeTestFileByPath("src/test_bar.py")).isTrue(); - } - - @Test - void test_suffix_filename_returns_true() { - assertThat(TestFileClassifier.looksLikeTestFileByPath("foo_test.py")).isTrue(); - assertThat(TestFileClassifier.looksLikeTestFileByPath("src/bar_test.py")).isTrue(); - } - - @Test - void regular_file_in_src_returns_false() { - assertThat(TestFileClassifier.looksLikeTestFileByPath("src/foo.py")).isFalse(); - assertThat(TestFileClassifier.looksLikeTestFileByPath("module.py")).isFalse(); - } - - @Test - void directory_named_testing_not_matched() { - // only "test" and "tests" trigger — "testing" must not - assertThat(TestFileClassifier.looksLikeTestFileByPath("testing/foo.py")).isFalse(); - } - - @Test - void windows_style_path_normalized() { - assertThat(TestFileClassifier.looksLikeTestFileByPath("src\\tests\\foo.py")).isTrue(); - } - - // --- looksLikeTestFile with null tree --- - - @Test - void null_tree_non_test_path_returns_false() { - assertThat(TestFileClassifier.looksLikeTestFile("src/regular.py", null)).isFalse(); - } - - @Test - void null_tree_test_path_returns_true() { - assertThat(TestFileClassifier.looksLikeTestFile("tests/foo.py", null)).isTrue(); - } - - // --- import-based detection (visitImportName / visitImportFrom) --- - - @ParameterizedTest - @ValueSource(strings = { - "import unittest\n", - "import pytest\n", - "from unittest import TestCase\n", - "from pytest import mark\n" - }) - void test_framework_import_detected(String code) { - FileInput tree = parse(code); - assertThat(TestFileClassifier.looksLikeTestFile("regular.py", tree)).isTrue(); - } - - @Test - void multiple_top_level_imports_both_checked() { - FileInput tree = parse("import unittest\nimport unittest\n"); - assertThat(TestFileClassifier.looksLikeTestFile("regular.py", tree)).isTrue(); - } - - @ParameterizedTest - @ValueSource(strings = { - "import os\nimport sys\n", // non-test imports - "from . import foo\n", // relative import — null module, must not throw - "def test_something():\n pass\n", // test_ prefix but no assert - "def do_something():\n assert True\n" // assert but no test_ prefix - }) - void ast_heuristic_not_detected(String code) { - assertThat(TestFileClassifier.looksLikeTestFile("regular.py", parse(code))).isFalse(); - } - - @Test - void nested_import_not_detected() { - // import inside a function body must not classify the file as a test file - FileInput tree = parse("def helper():\n from unittest.mock import Mock\n return Mock()\n"); - assertThat(TestFileClassifier.looksLikeTestFile("regular.py", tree)).isFalse(); - } - - @Test - void nested_test_function_not_detected() { - // a test_* function nested inside another function must not classify the file as a test file - FileInput tree = parse("def outer():\n def test_inner():\n assert True\n"); - assertThat(TestFileClassifier.looksLikeTestFile("regular.py", tree)).isFalse(); - } - - @Test - void multiple_from_imports_all_checked() { - FileInput tree = parse("from unittest import TestCase\nfrom unittest import mock\n"); - assertThat(TestFileClassifier.looksLikeTestFile("regular.py", tree)).isTrue(); - } - - // --- pytest pattern detection (top-level functions only) --- - - @Test - void test_function_with_assert_detected() { - FileInput tree = parse("def test_something():\n assert True\n"); - assertThat(TestFileClassifier.looksLikeTestFile("regular.py", tree)).isTrue(); - } - - @Test - void multiple_top_level_test_functions_checked() { - FileInput tree = parse("def test_one():\n assert True\ndef test_two():\n assert True\n"); - assertThat(TestFileClassifier.looksLikeTestFile("regular.py", tree)).isTrue(); - } - - @Test - void path_match_short_circuits_ast_check() { - // Path already matches — tree is never examined - FileInput tree = parse("import os\n"); - assertThat(TestFileClassifier.looksLikeTestFile("tests/foo.py", tree)).isTrue(); - } - - @Test - void import_match_takes_precedence_over_pytest_pattern() { - FileInput tree = parse("import unittest\ndef regular_function():\n pass\n"); - assertThat(TestFileClassifier.looksLikeTestFile("regular.py", tree)).isTrue(); - } - - private static FileInput parse(String code) { - var astNode = PythonParser.create().parse(code); - return new PythonTreeMaker().fileInput(astNode); - } -} diff --git a/python-commons/src/test/java/org/sonar/plugins/python/TestSourceConfigurationTest.java b/python-commons/src/test/java/org/sonar/plugins/python/TestSourceConfigurationTest.java new file mode 100644 index 000000000..99344d9d4 --- /dev/null +++ b/python-commons/src/test/java/org/sonar/plugins/python/TestSourceConfigurationTest.java @@ -0,0 +1,58 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.plugins.python; + +import java.util.stream.Stream; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.sonar.api.config.Configuration; +import org.sonar.scanner.plugin.api.impl.config.MapSettings; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.sonarsource.analyzer.commons.appsec.TestFileClassifier.HEURISTIC_DISABLED_KEY; + +class TestSourceConfigurationTest { + + @ParameterizedTest(name = "{0}") + @MethodSource("configurationCases") + void is_configured(String caseName, Configuration configuration, boolean expected) { + assertThat(TestSourceConfiguration.isConfigured(configuration)).isEqualTo(expected); + } + + private static Stream configurationCases() { + return Stream.of( + Arguments.of("without test-source configuration", new MapSettings().asConfig(), false), + Arguments.of("with a blank sonar.tests property", configurationWith("sonar.tests", " "), false), + Arguments.of("with sonar.tests configured", configurationWith("sonar.tests", "tests"), true), + Arguments.of( + "with the Python heuristic enabled", + configurationWith("sonar.python.testFileHeuristic.disabled", "false"), + false), + Arguments.of( + "with the Python heuristic disabled", + configurationWith("sonar.python.testFileHeuristic.disabled", "true"), + true), + Arguments.of("with the common heuristic enabled", configurationWith(HEURISTIC_DISABLED_KEY, "false"), false), + Arguments.of("with the common heuristic disabled", configurationWith(HEURISTIC_DISABLED_KEY, "true"), true) + ); + } + + private static Configuration configurationWith(String key, String value) { + return new MapSettings().setProperty(key, value).asConfig(); + } +} diff --git a/python-commons/src/test/resources/org/sonar/plugins/python/sensor/framework_helper.py b/python-commons/src/test/resources/org/sonar/plugins/python/sensor/framework_helper.py new file mode 100644 index 000000000..d48475eaa --- /dev/null +++ b/python-commons/src/test/resources/org/sonar/plugins/python/sensor/framework_helper.py @@ -0,0 +1,6 @@ +import doctest + + +def regular_func(x): + x = 42 + assert (a, b) diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/PythonTestFileClassifier.java b/python-frontend/src/main/java/org/sonar/plugins/python/PythonTestFileClassifier.java new file mode 100644 index 000000000..a7427203a --- /dev/null +++ b/python-frontend/src/main/java/org/sonar/plugins/python/PythonTestFileClassifier.java @@ -0,0 +1,178 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.plugins.python; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.Set; +import javax.annotation.Nullable; +import org.sonar.api.batch.fs.InputFile; +import org.sonar.api.config.Configuration; +import org.sonar.plugins.python.api.tree.ClassDef; +import org.sonar.plugins.python.api.tree.DottedName; +import org.sonar.plugins.python.api.tree.FileInput; +import org.sonar.plugins.python.api.tree.FunctionDef; +import org.sonar.plugins.python.api.tree.ImportFrom; +import org.sonar.plugins.python.api.tree.ImportName; +import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.Statement; +import org.sonar.plugins.python.api.tree.StatementList; +import org.sonarsource.analyzer.commons.appsec.TestFileClassifier; + +/** + * Adds Python-specific structural signals to the shared test-file heuristic. + */ +public final class PythonTestFileClassifier { + + private static final String[] TEST_FILE_PATH_PATTERNS = { + "**/test/**", "**/tests/**", "**/testing/**", + "**/TEST/**", "**/TESTS/**", "**/TESTING/**", + "**/*test*", "*test*", "**/*Test*", "*Test*", "**/*TEST*", "*TEST*" + }; + private static final Set TEST_MODULE_ROOTS = Set.of( + "pytest", "unittest", "doctest", "hypothesis", "robot", "behave", "pytest_bdd", "nose", "nose2", + "testtools", "pytest_mock", "factory_boy", "freezegun", + "requests_mock", "respx", "httpretty", "moto", "testcontainers"); + private static final Set TEST_MODULE_PREFIXES = Set.of("django.test", "twisted.trial"); + private final TestFileClassifier delegate; + + public PythonTestFileClassifier(Configuration configuration) { + delegate = TestFileClassifier.of(configuration, PythonTestFileClassifier::hasTestContentContext, TEST_FILE_PATH_PATTERNS); + } + + /** + * Determines whether a Python file is likely to contain test code. + * @param inputFile analyzed input file + * @param tree parsed file tree, when parsing succeeded + * @return whether the file is likely test content + */ + public boolean looksLikeTestFile(InputFile inputFile, @Nullable FileInput tree) { + return delegate.looksLikeTestFile(inputFile, new PythonContext(tree)); + } + + /** + * Determines whether a parsed tree has Python-specific test signals. + * @param tree parsed file tree + * @return whether the tree contains test-specific imports or declarations + */ + public static boolean hasTestContent(@Nullable FileInput tree) { + return looksLikeTestFileByStatements(tree == null ? null : tree.statements()); + } + + private static boolean hasTestContentContext(TestFileClassifier.Context context) { + return context instanceof PythonContext pythonContext + && hasTestContent(pythonContext.tree); + } + + private static final class PythonContext implements TestFileClassifier.Context { + private final FileInput tree; + + private PythonContext(@Nullable FileInput tree) { + this.tree = tree; + } + } + + /** + * Determines whether top-level statements identify test content. + * @param statements top-level statements + * @return whether the statements indicate test content + */ + private static boolean looksLikeTestFileByStatements(@Nullable StatementList statements) { + if (statements == null) { + return false; + } + int functionCount = 0; + int testFunctionCount = 0; + for (Statement statement : statements.statements()) { + if (isTestFrameworkImport(statement) || isTestClass(statement)) { + return true; + } + if (statement instanceof FunctionDef functionDef) { + functionCount++; + if (isTestShaped(functionDef.name().name())) { + testFunctionCount++; + } + } + } + return testFunctionCount * 2 > functionCount; + } + + /** + * Determines whether a statement imports a testing framework or utility. + * @param statement top-level statement to inspect + * @return whether the statement imports test-specific code + */ + private static boolean isTestFrameworkImport(Statement statement) { + if (statement instanceof ImportName importName) { + return importName.modules().stream().anyMatch(aliasedName -> isTestModule(moduleNames(aliasedName.dottedName()))); + } + if (statement instanceof ImportFrom importFrom && importFrom.module() != null) { + List base = moduleNames(importFrom.module()); + if (isTestModule(base)) { + return true; + } + return importFrom.importedNames().stream() + .anyMatch(importedName -> isTestModule(concat(base, moduleNames(importedName.dottedName())))); + } + return false; + } + + /** + * Determines whether a dotted module name belongs to a testing ecosystem. + * @param names segments of the imported module name + * @return whether the module is test-specific + */ + private static boolean isTestModule(List names) { + if (names.isEmpty()) { + return false; + } + if (TEST_MODULE_ROOTS.contains(names.get(0))) { + return true; + } + return names.size() > 1 && TEST_MODULE_PREFIXES.contains(names.get(0) + "." + names.get(1)); + } + + private static List moduleNames(@Nullable DottedName dottedName) { + if (dottedName == null) { + return List.of(); + } + return dottedName.names().stream().map(Name::name).toList(); + } + + private static List concat(List base, List tail) { + List combined = new ArrayList<>(base); + combined.addAll(tail); + return combined; + } + + private static boolean isTestShaped(String name) { + String lowerCaseName = name.toLowerCase(Locale.ROOT); + return lowerCaseName.startsWith("test") + && (name.length() == 4 || !Character.isLowerCase(name.charAt(4))); + } + + /** + * Determines whether a statement declares a top-level test class. + * @param statement top-level statement to inspect + * @return whether the statement is a test class declaration + */ + private static boolean isTestClass(Statement statement) { + return statement instanceof ClassDef classDef + && isTestShaped(classDef.name().name()); + } +} diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonVisitorContext.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonVisitorContext.java index b36a70bbf..b8a5fc176 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonVisitorContext.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/PythonVisitorContext.java @@ -28,6 +28,7 @@ import javax.annotation.CheckForNull; import javax.annotation.Nullable; import org.sonar.api.SonarProduct; +import org.sonar.plugins.python.PythonTestFileClassifier; import org.sonar.plugins.python.api.PythonCheck.PreciseIssue; import org.sonar.plugins.python.api.caching.CacheContext; import org.sonar.plugins.python.api.cfg.ControlFlowGraph; @@ -63,6 +64,7 @@ public class PythonVisitorContext extends PythonInputFileContext { private final Map lvaMap; private final ReachingDefinitionsAnalysis reachingDefinitionsAnalysis; private final TypeTable typeTable; + private final boolean likelyTestFile; @@ -76,7 +78,8 @@ private PythonVisitorContext(FileInput rootTree, ModuleType moduleType, CallGraph callGraph, TypeTable typeTable, - Map cfgMap + Map cfgMap, + boolean likelyTestFile ) { super(pythonFile, workingDirectory, cacheContext, sonarProduct, projectLevelSymbolTable); this.moduleType = moduleType; @@ -90,9 +93,21 @@ private PythonVisitorContext(FileInput rootTree, this.typeTable = typeTable; this.typeChecker = new TypeChecker(typeTable); this.issues = new ArrayList<>(); + this.likelyTestFile = likelyTestFile; } public PythonVisitorContext(PythonFile pythonFile, RecognitionException parsingException, SonarProduct sonarProduct) { + this(pythonFile, parsingException, sonarProduct, false); + } + + /** + * Creates a context for a Python file that could not be parsed. + * @param pythonFile analyzed Python file + * @param parsingException parsing failure + * @param sonarProduct analysis product + * @param likelyTestFile whether the file was classified as test content before parsing failed + */ + public PythonVisitorContext(PythonFile pythonFile, RecognitionException parsingException, SonarProduct sonarProduct, boolean likelyTestFile) { super(pythonFile, null, CacheContextImpl.dummyCache(), sonarProduct, ProjectLevelSymbolTable.empty()); this.rootTree = null; this.parsingException = parsingException; @@ -105,12 +120,21 @@ public PythonVisitorContext(PythonFile pythonFile, RecognitionException parsingE this.lvaMap = new HashMap<>(); this.issues = new ArrayList<>(); this.moduleType = null; + this.likelyTestFile = likelyTestFile; } public FileInput rootTree() { return rootTree; } + /** + * Reports whether this file is likely to contain test code. + * @return whether the file is likely test content + */ + public boolean isLikelyTestFile() { + return likelyTestFile; + } + public TypeChecker typeChecker() { return typeChecker; } @@ -181,10 +205,12 @@ public static class Builder { private Optional packageName = Optional.empty(); private Optional moduleType = Optional.empty(); private Optional> cfgMap = Optional.empty(); + private boolean likelyTestFile = false; public Builder(FileInput rootTree, PythonFile pythonFile) { this.rootTree = rootTree; this.pythonFile = pythonFile; + this.likelyTestFile = PythonTestFileClassifier.hasTestContent(rootTree); } public Builder workingDirectory(@Nullable File workingDirectory) { @@ -238,6 +264,16 @@ public Builder cfgMap(Map cfgMap) { return this; } + /** + * Sets the test-content classification computed from the scanner input and parsed tree. + * @param likelyTestFile whether the file is likely test content + * @return this builder + */ + public Builder likelyTestFile(boolean likelyTestFile) { + this.likelyTestFile = likelyTestFile; + return this; + } + public PythonVisitorContext build() { var symbolTable = projectLevelSymbolTable.orElseGet(ProjectLevelSymbolTable::empty); var pkgName = packageName.orElse(""); @@ -270,7 +306,8 @@ public PythonVisitorContext build() { mt, finalCallGraph, finalTypeTable, - finalCfgMap + finalCfgMap, + likelyTestFile ); } diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/api/SubscriptionContext.java b/python-frontend/src/main/java/org/sonar/plugins/python/api/SubscriptionContext.java index aec793cdb..8eacbe4ec 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/api/SubscriptionContext.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/api/SubscriptionContext.java @@ -53,6 +53,14 @@ public interface SubscriptionContext { PythonFile pythonFile(); + /** + * Reports whether the current file is likely to contain test code. + * @return whether the file is likely test content + */ + default boolean isLikelyTestFile() { + return false; + } + /** * List of Python versions this project is compatible with. */ diff --git a/python-frontend/src/main/java/org/sonar/python/SubscriptionVisitor.java b/python-frontend/src/main/java/org/sonar/python/SubscriptionVisitor.java index df4b66dd6..c1aa7de58 100644 --- a/python-frontend/src/main/java/org/sonar/python/SubscriptionVisitor.java +++ b/python-frontend/src/main/java/org/sonar/python/SubscriptionVisitor.java @@ -172,6 +172,11 @@ public PythonFile pythonFile() { return pythonVisitorContext.pythonFile(); } + @Override + public boolean isLikelyTestFile() { + return pythonVisitorContext.isLikelyTestFile(); + } + @Override public Collection stubFilesSymbols() { return pythonVisitorContext.stubFilesSymbols(); diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/PythonTestFileClassifierTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/PythonTestFileClassifierTest.java new file mode 100644 index 000000000..e9dae3c0b --- /dev/null +++ b/python-frontend/src/test/java/org/sonar/plugins/python/PythonTestFileClassifierTest.java @@ -0,0 +1,211 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.plugins.python; + +import java.util.List; +import java.util.Optional; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; +import org.sonar.api.batch.fs.InputFile; +import org.sonar.api.config.Configuration; +import org.sonar.plugins.python.api.tree.AliasedName; +import org.sonar.plugins.python.api.tree.FileInput; +import org.sonar.plugins.python.api.tree.ImportName; +import org.sonar.plugins.python.api.tree.StatementList; +import org.sonar.python.parser.PythonParser; +import org.sonar.python.tree.PythonTreeMaker; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +class PythonTestFileClassifierTest { + + @ParameterizedTest + @ValueSource(strings = { + "tests/helpers.py", + "src/TESTING/factories.py", + "src\\test\\conftest.py", + "src/TestCase.py", + "src/latest.py" + }) + void path_signals_include_test_support_files_and_aggressive_filename_matches(String path) { + assertThat(classifier().looksLikeTestFile(file(path), null)).isTrue(); + } + + @ParameterizedTest + @ValueSource(strings = {"", "src/production.py", "src/module.py", "src/latest/module.py"}) + void non_test_paths_are_not_classified_without_an_ast_signal(String path) { + assertThat(classifier().looksLikeTestFile(file(path), null)).isFalse(); + } + + @Test + void shared_classifier_disables_the_python_detector_when_test_sources_are_configured() { + var configuration = config(); + when(configuration.get("sonar.tests")).thenReturn(Optional.of("tests")); + + assertThat(new PythonTestFileClassifier(configuration) + .looksLikeTestFile(file("src/production.py"), parse("import pytest\n"))).isFalse(); + } + + @ParameterizedTest + @ValueSource(strings = { + "import pytest as pt\n", + "from unittest.mock import Mock\n", + "import doctest\n", + "from django.test import TestCase\n", + "from django import test\n", + "from twisted import trial\n", + "import hypothesis.strategies as st\n", + "import robot\n", + "import behave\n", + "import pytest_bdd\n", + "import nose\n", + "import nose2\n", + "from twisted.trial import unittest\n", + "import testtools\n", + "import pytest_mock\n", + "import factory_boy\n", + "import freezegun\n", + "import requests_mock\n", + "import respx\n", + "import httpretty\n", + "import moto\n", + "import testcontainers\n" + }) + void test_framework_and_utility_imports_are_detected(String code) { + assertThat(classifier().looksLikeTestFile(file("src/production.py"), parse(code))).isTrue(); + } + + @Test + void non_test_submodule_imports_are_not_classified() { + assertThat(classifier().looksLikeTestFile(file("src/production.py"), parse("from django import forms\n"))).isFalse(); + assertThat(classifier().looksLikeTestFile(file("src/production.py"), parse("from twisted import internet\n"))).isFalse(); + } + + @ParameterizedTest + @ValueSource(strings = { + "import mock\n", + "import fixtures\n", + "import factory\n", + "import responses\n", + "import vcr\n" + }) + void generic_utility_imports_alone_are_not_classified(String code) { + assertThat(classifier().looksLikeTestFile(file("src/production.py"), parse(code))).isFalse(); + } + + @Test + void test_shaped_top_level_declarations_are_detected() { + assertThat(classifier().looksLikeTestFile(file("src/production.py"), parse("class TestService:\n pass\n"))).isTrue(); + assertThat(classifier().looksLikeTestFile(file("src/production.py"), parse("class test_service:\n pass\n"))).isTrue(); + assertThat(classifier().looksLikeTestFile(file("src/production.py"), parse(""" + def Test(): + pass + async def TEST_first(): + pass + def test_second(): + pass + def helper(): + pass + """))).isTrue(); + } + + @Test + void lowercase_continuations_after_test_are_not_test_shaped() { + assertThat(classifier().looksLikeTestFile(file("src/production.py"), parse("class Testing:\n pass\n"))).isFalse(); + assertThat(classifier().looksLikeTestFile(file("src/production.py"), parse(""" + def testing(): + pass + def testimony(): + pass + def helper(): + pass + """))).isFalse(); + } + + @Test + void function_ratio_requires_a_strict_majority() { + assertThat(classifier().looksLikeTestFile(file("src/production.py"), parse(""" + def test_first(): + pass + def helper(): + pass + """))).isFalse(); + assertThat(classifier().looksLikeTestFile(file("src/production.py"), parse("pass\n"))).isFalse(); + } + + @Test + void nested_test_signals_do_not_affect_top_level_classification() { + assertThat(classifier().looksLikeTestFile(file("src/production.py"), parse(""" + def helper(): + import pytest + def test_inner(): + pass + """))).isFalse(); + } + + @Test + void path_signal_is_available_when_parsing_fails() { + assertThat(classifier().looksLikeTestFile(file("tests/helpers.py"), null)).isTrue(); + assertThat(classifier().looksLikeTestFile(file("src/production.py"), null)).isFalse(); + } + + @Test + void absent_or_relative_import_input_does_not_indicate_a_test_file() { + assertThat(classifier().looksLikeTestFile(file("src/production.py"), parse("from . import pytest\n"))).isFalse(); + } + + @Test + void missing_ast_nodes_do_not_classify_a_file_as_a_test() { + var fileInput = mock(FileInput.class); + assertThat(classifier().looksLikeTestFile(file("src/production.py"), fileInput)).isFalse(); + + var aliasedName = mock(AliasedName.class); + var importName = mock(ImportName.class); + var statements = mock(StatementList.class); + when(importName.modules()).thenReturn(List.of(aliasedName)); + when(statements.statements()).thenReturn(List.of(importName)); + when(fileInput.statements()).thenReturn(statements); + + assertThat(classifier().looksLikeTestFile(file("src/production.py"), fileInput)).isFalse(); + } + + private static PythonTestFileClassifier classifier() { + return new PythonTestFileClassifier(config()); + } + + private static Configuration config() { + var configuration = mock(Configuration.class); + when(configuration.get(anyString())).thenReturn(Optional.empty()); + when(configuration.getBoolean(anyString())).thenReturn(Optional.empty()); + return configuration; + } + + private static InputFile file(String path) { + var inputFile = mock(InputFile.class); + when(inputFile.relativePath()).thenReturn(path); + return inputFile; + } + + private static FileInput parse(String code) { + var astNode = PythonParser.create().parse(code); + return new PythonTreeMaker().fileInput(astNode); + } +} diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/PythonVisitorContextTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/PythonVisitorContextTest.java index 99c54c93a..7596a4fcf 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/api/PythonVisitorContextTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/PythonVisitorContextTest.java @@ -45,6 +45,49 @@ import static org.sonar.python.PythonTestUtils.pythonFile; class PythonVisitorContextTest { + @Test + void likely_test_file_is_provided_by_the_scanner() { + var fileInput = PythonTestUtils.parse("import pytest"); + var context = new PythonVisitorContext.Builder(fileInput, pythonFile("production.py")) + .likelyTestFile(true) + .build(); + + assertThat(context.isLikelyTestFile()).isTrue(); + } + + @Test + void likely_test_file_uses_python_ast_signals_when_not_set_by_the_scanner() { + var fileInput = PythonTestUtils.parse("import pytest"); + var context = new PythonVisitorContext.Builder(fileInput, pythonFile("production.py")).build(); + + assertThat(context.isLikelyTestFile()).isTrue(); + } + + @Test + void likely_test_file_is_available_after_a_parse_error() { + RecognitionException parsingException = mock(RecognitionException.class); + var context = new PythonVisitorContext(pythonFile("production.py"), parsingException, SonarProduct.SONARQUBE, true); + + assertThat(context.isLikelyTestFile()).isTrue(); + } + + @Test + void likely_test_file_is_false_for_parse_error_context_without_a_classification() { + RecognitionException parsingException = mock(RecognitionException.class); + var context = new PythonVisitorContext(null, parsingException, SonarProduct.SONARQUBE); + + assertThat(context.isLikelyTestFile()).isFalse(); + } + + @Test + void likely_test_file_can_be_set_to_false() { + var context = new PythonVisitorContext.Builder(PythonTestUtils.parse("import pytest"), pythonFile("production.py")) + .likelyTestFile(false) + .build(); + + assertThat(context.isLikelyTestFile()).isFalse(); + } + @Test void fullyQualifiedModuleName() { FileInput fileInput = PythonTestUtils.parse("def foo(): pass"); diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/api/SubscriptionContextTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/api/SubscriptionContextTest.java new file mode 100644 index 000000000..1c8c8ec6a --- /dev/null +++ b/python-frontend/src/test/java/org/sonar/plugins/python/api/SubscriptionContextTest.java @@ -0,0 +1,151 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.plugins.python.api; + +import java.io.File; +import java.util.Collection; +import java.util.Optional; +import java.util.Set; +import org.junit.jupiter.api.Test; +import org.sonar.plugins.python.api.caching.CacheContext; +import org.sonar.plugins.python.api.cfg.ControlFlowGraph; +import org.sonar.plugins.python.api.project.configuration.ProjectConfiguration; +import org.sonar.plugins.python.api.symbols.Symbol; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.Token; +import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.python.cfg.fixpoint.LiveVariablesAnalysis; +import org.sonar.python.semantic.v2.callgraph.CallGraph; +import org.sonar.python.semantic.v2.typetable.TypeTable; +import org.sonar.python.types.v2.TypeChecker; + +import static org.assertj.core.api.Assertions.assertThat; + +class SubscriptionContextTest { + + @Test + void is_likely_test_file_defaults_to_false_for_external_implementations() { + // A SubscriptionContext implemented outside the analyzer that predates isLikelyTestFile() + // must keep compiling; the default implementation answers false. + SubscriptionContext context = new MinimalSubscriptionContext(); + + assertThat(context.isLikelyTestFile()).isFalse(); + } + + private static class MinimalSubscriptionContext implements SubscriptionContext { + @Override + public Tree syntaxNode() { + return null; + } + + @Override + public PythonCheck.PreciseIssue addIssue(Tree element, String message) { + return null; + } + + @Override + public PythonCheck.PreciseIssue addIssue(LocationInFile location, String message) { + return null; + } + + @Override + public PythonCheck.PreciseIssue addIssue(Token token, String message) { + return null; + } + + @Override + public PythonCheck.PreciseIssue addIssue(Token from, Token to, String message) { + return null; + } + + @Override + public PythonCheck.PreciseIssue addFileIssue(String finalMessage) { + return null; + } + + @Override + public PythonCheck.PreciseIssue addLineIssue(String message, int lineNumber) { + return null; + } + + @Override + public PythonFile pythonFile() { + return null; + } + + @Override + public Set sourcePythonVersions() { + return null; + } + + @Override + public Collection stubFilesSymbols() { + return null; + } + + @Override + public File workingDirectory() { + return null; + } + + @Override + public CacheContext cacheContext() { + return null; + } + + @Override + public TypeChecker typeChecker() { + return null; + } + + @Override + public TypeTable typeTable() { + return null; + } + + @Override + public ProjectConfiguration projectConfiguration() { + return null; + } + + @Override + public CallGraph callGraph() { + return null; + } + + @Override + public ControlFlowGraph cfg(Tree tree) { + return null; + } + + @Override + public LiveVariablesAnalysis lva(Tree tree) { + return null; + } + + @Override + public Set valuesAtLocation(Name name) { + return null; + } + + @Override + public Optional getDjangoViewInfo(String fqn) { + return Optional.empty(); + } + } +} diff --git a/python-frontend/src/test/java/org/sonar/python/SubscriptionVisitorTest.java b/python-frontend/src/test/java/org/sonar/python/SubscriptionVisitorTest.java index c1ff9918f..7052b2124 100644 --- a/python-frontend/src/test/java/org/sonar/python/SubscriptionVisitorTest.java +++ b/python-frontend/src/test/java/org/sonar/python/SubscriptionVisitorTest.java @@ -77,7 +77,7 @@ public void initialize(Context context) { @Test void exposed_visitor_data() { - FileInput fileInput = PythonTestUtils.parse("def foo(): ..."); + FileInput fileInput = PythonTestUtils.parse("import pytest\ndef foo(): ..."); var cache = mock(CacheContext.class); PythonFile pythonFile = PythonTestUtils.pythonFile("file"); @@ -92,6 +92,7 @@ public void initialize(Context context) { context.registerSyntaxNodeConsumer(Tree.Kind.FILE_INPUT, ctx -> { assertThat(ctx.cacheContext()).isSameAs(cache); assertThat(ctx.pythonFile()).isEqualTo(pythonFile); + assertThat(ctx.isLikelyTestFile()).isTrue(); assertThat(ctx.sourcePythonVersions()).isEqualTo(ProjectPythonVersion.currentVersions()); }); } From e19cd8508e52f26765c6baa0a0f47b563fcf5218 Mon Sep 17 00:00:00 2001 From: erwan-leforestier-sonarsource Date: Wed, 19 Aug 2026 15:37:05 +0200 Subject: [PATCH 310/322] SONARPY-4539 FP: S1313 should not report version values assigned to __version__ GitOrigin-RevId: a88ca1de54bca2a00bfa3e7bbfa35086bd2ad4b8 --- .../sonar/python/checks/HardcodedIPCheck.java | 34 ++++++++++++++++++- .../src/test/resources/checks/hardcodedIP.py | 10 ++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/python-checks/src/main/java/org/sonar/python/checks/HardcodedIPCheck.java b/python-checks/src/main/java/org/sonar/python/checks/HardcodedIPCheck.java index f9c569b7e..066a552a9 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/HardcodedIPCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/HardcodedIPCheck.java @@ -23,6 +23,12 @@ import javax.annotation.Nullable; import org.sonar.check.Rule; import org.sonar.plugins.python.api.PythonSubscriptionCheck; +import org.sonar.plugins.python.api.tree.AnnotatedAssignment; +import org.sonar.plugins.python.api.tree.AssignmentStatement; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.ExpressionList; +import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.ParenthesizedExpression; import org.sonar.plugins.python.api.tree.StringLiteral; import org.sonar.plugins.python.api.tree.Tree; import org.sonar.python.checks.utils.Expressions; @@ -63,7 +69,7 @@ public class HardcodedIPCheck extends PythonSubscriptionCheck { public void initialize(Context context) { context.registerSyntaxNodeConsumer(Tree.Kind.STRING_LITERAL, ctx -> { StringLiteral stringLiteral = (StringLiteral) ctx.syntaxNode(); - if (isMultilineString(stringLiteral)) { + if (isMultilineString(stringLiteral) || isVersionLiteral(stringLiteral)) { return; } String content = Expressions.unescape(stringLiteral); @@ -88,6 +94,32 @@ public void initialize(Context context) { }); } + private static boolean isVersionLiteral(StringLiteral stringLiteral) { + Expression assignedValue = stringLiteral; + while (assignedValue.parent() instanceof ParenthesizedExpression parenthesizedExpression) { + assignedValue = parenthesizedExpression; + } + Tree parent = assignedValue.parent(); + if (parent instanceof AssignmentStatement assignment) { + return assignment.assignedValue() == assignedValue && hasVersionName(assignment); + } + return parent instanceof AnnotatedAssignment assignment + && assignment.assignedValue() == assignedValue + && isVersionName(assignment.variable()); + } + + private static boolean hasVersionName(AssignmentStatement assignment) { + if (assignment.lhsExpressions().size() != 1) { + return false; + } + ExpressionList lhsExpressions = assignment.lhsExpressions().get(0); + return lhsExpressions.expressions().size() == 1 && isVersionName(lhsExpressions.expressions().get(0)); + } + + private static boolean isVersionName(Expression expression) { + return Expressions.removeParentheses(expression) instanceof Name name && "__version__".equals(name.name()); + } + private static boolean isMultilineString(StringLiteral pyStringLiteralTree) { return pyStringLiteralTree.stringElements().size() > 1; } diff --git a/python-checks/src/test/resources/checks/hardcodedIP.py b/python-checks/src/test/resources/checks/hardcodedIP.py index ea29346e0..f27c91134 100644 --- a/python-checks/src/test/resources/checks/hardcodedIP.py +++ b/python-checks/src/test/resources/checks/hardcodedIP.py @@ -22,6 +22,16 @@ fileName = "v0.0.1.200__do_something.sql" # Compliant - suffixed and prefixed version = "1.0.0.0-1" # Compliant - suffixed +__version__ = "26.8.0.1" # Compliant +__version__ = ("26.8.0.1") # Compliant +__version__: str = "26.8.0.1" # Compliant +(__version__) = "26.8.0.1" # Compliant +version = "26.8.0.1" # Noncompliant +VERSION = "26.8.0.1" # Noncompliant +__version__ = version = "26.8.0.1" # Noncompliant +metadata.__version__ = "26.8.0.1" # Noncompliant +versions["__version__"] = "26.8.0.1" # Noncompliant + "1080:0:0:0:8:800:200C:417A" # Noncompliant {{Make sure using this hardcoded IP address "1080:0:0:0:8:800:200C:417A" is safe here.}} "[1080::8:800:200C:417A]" # Noncompliant "::800:200C:417A" # Noncompliant From 6e8271e3a9862850acd4d90a4d0d0a333b8a4a07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Coet?= Date: Wed, 19 Aug 2026 16:23:35 +0200 Subject: [PATCH 311/322] SONARPY-4555 Revert Python version to 3.9 GitOrigin-RevId: b7583baf07886bede0df19d6d6ea6f35d7d71680 --- mise.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mise.toml b/mise.toml index 5387487fd..3e7762f1b 100644 --- a/mise.toml +++ b/mise.toml @@ -1,6 +1,6 @@ [tools] java = "21.0" maven = "3.9" -python = "3.14.7" +python = "3.9" uv = "latest" # required for pipx backend "pipx:tox" = { version = "4.60.0", uvx = "true" } From 184e4c985cbb68ebd37a7a48ac3af0490a028e2c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 19 Aug 2026 16:36:37 +0200 Subject: [PATCH 312/322] Update SonarSource/sonar-scanner-engine monorepo to v13.8.0.4534 Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> GitOrigin-RevId: 7dc7ae8800e1667f2aa09c0ec0192e8126b90616 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2e879fc98..3e6b9cee3 100644 --- a/pom.xml +++ b/pom.xml @@ -102,7 +102,7 @@ Python Enterprise 26.8.0.126808 13.11.0.4459 - 13.7.0.4455 + 13.8.0.4534 6.4.2.4626 2.30.0.5193 From 4577127395a9acc90a84117cdfca184a883738b8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 19 Aug 2026 16:36:40 +0200 Subject: [PATCH 313/322] Update dependency ch.qos.logback:logback-classic to v1.6.3 Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> GitOrigin-RevId: bc2e2408a5999bc89eeea15ef309ac97d2aec4ae --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3e6b9cee3..ab3df386b 100644 --- a/pom.xml +++ b/pom.xml @@ -91,7 +91,7 @@ 1.15.0 3.27.7 6.1.3 - 1.6.2 + 1.6.3 2.0.18 2.2.1 5.23.0 From 09ccba76c981efc023b7ff5951264095c25ab4ab Mon Sep 17 00:00:00 2001 From: Victor Date: Wed, 19 Aug 2026 16:41:58 +0200 Subject: [PATCH 314/322] SONARPY-4558 Fix Renovate Python version constraint GitOrigin-RevId: 901c02ffbb0bedcd2f4f8b29c5c08af94f8a0771 --- .github/renovate.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/renovate.json b/.github/renovate.json index cb644dd7f..7bf2d231e 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -12,7 +12,7 @@ "matchManagers": [ "mise" ], - "matchPackageNames": [ + "matchDepNames": [ "python" ], "allowedVersions": "<3.10" From 0167d9ff6e06ca552e75455423dc6dc4da8e2031 Mon Sep 17 00:00:00 2001 From: Mary Georgiou <89914005+mary-georgiou@users.noreply.github.com> Date: Thu, 20 Aug 2026 14:00:32 +0200 Subject: [PATCH 315/322] SONARPY-4561 Integrate Vortex (SonarQube agentic analysis) protocol GitOrigin-RevId: 02d021d68519ebac384a5682fc75988e6101f88a --- .mcp.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .mcp.json diff --git a/.mcp.json b/.mcp.json new file mode 100644 index 000000000..6be127ca6 --- /dev/null +++ b/.mcp.json @@ -0,0 +1,13 @@ +{ + "mcpServers": { + "sonarqube": { + "command": "sonar", + "args": [ + "run", + "mcp", + "--project", + "SonarSource_sonar-python-enterprise" + ] + } + } +} From f4f76966242fa055ba597ab088f830f6fadd1f8b Mon Sep 17 00:00:00 2001 From: erwan-leforestier-sonarsource Date: Thu, 20 Aug 2026 14:55:29 +0200 Subject: [PATCH 316/322] SONARPY-4542 FP: Skip S1313 in likely test files GitOrigin-RevId: 633c66eeab6be3ac1394788e78100e67b7fd6c0c --- .../java/org/sonar/python/checks/HardcodedIPCheck.java | 3 +++ .../org/sonar/python/checks/HardcodedIPCheckTest.java | 8 +++++++- .../src/test/resources/checks/hardcodedIPDjango.py | 6 ++++++ 3 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 python-checks/src/test/resources/checks/hardcodedIPDjango.py diff --git a/python-checks/src/main/java/org/sonar/python/checks/HardcodedIPCheck.java b/python-checks/src/main/java/org/sonar/python/checks/HardcodedIPCheck.java index 066a552a9..375948c57 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/HardcodedIPCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/HardcodedIPCheck.java @@ -68,6 +68,9 @@ public class HardcodedIPCheck extends PythonSubscriptionCheck { @Override public void initialize(Context context) { context.registerSyntaxNodeConsumer(Tree.Kind.STRING_LITERAL, ctx -> { + if (ctx.isLikelyTestFile()) { + return; + } StringLiteral stringLiteral = (StringLiteral) ctx.syntaxNode(); if (isMultilineString(stringLiteral) || isVersionLiteral(stringLiteral)) { return; diff --git a/python-checks/src/test/java/org/sonar/python/checks/HardcodedIPCheckTest.java b/python-checks/src/test/java/org/sonar/python/checks/HardcodedIPCheckTest.java index 32bf6d92c..c72ac34ea 100644 --- a/python-checks/src/test/java/org/sonar/python/checks/HardcodedIPCheckTest.java +++ b/python-checks/src/test/java/org/sonar/python/checks/HardcodedIPCheckTest.java @@ -22,7 +22,13 @@ class HardcodedIPCheckTest { @Test - void test() { + void reports_hardcoded_ips_in_non_test_files() { PythonCheckVerifier.verify("src/test/resources/checks/hardcodedIP.py", new HardcodedIPCheck()); } + + /** Verifies likely test files do not report hardcoded IP addresses. */ + @Test + void skips_likely_test_files() { + PythonCheckVerifier.verifyNoIssue("src/test/resources/checks/hardcodedIPDjango.py", new HardcodedIPCheck()); + } } diff --git a/python-checks/src/test/resources/checks/hardcodedIPDjango.py b/python-checks/src/test/resources/checks/hardcodedIPDjango.py new file mode 100644 index 000000000..edc7fc3f5 --- /dev/null +++ b/python-checks/src/test/resources/checks/hardcodedIPDjango.py @@ -0,0 +1,6 @@ +from django.test import TestCase + + +class FailedLoginAttemptRepositoryTest(TestCase): + def test_delete_removes_matching_record(self): + self.repository.delete("8.8.8.8", "dave") From 3d49aad7d4f01024a0d29f3e38452b2ae9c15b20 Mon Sep 17 00:00:00 2001 From: Asya Vorobeva Date: Thu, 20 Aug 2026 15:00:17 +0200 Subject: [PATCH 317/322] SONARPY-4535 Fix S7503 FP for async callbacks in httpx.AsyncClient and confluent_kafka AIOConsumer Co-authored-by: Claude Sonnet 4.6 GitOrigin-RevId: 4452aacd58fe0e4367a30214b0c18e45e6e70516 --- .../checks/AsyncFunctionNotAsyncCheck.java | 104 +++++++++++++++--- .../org/sonar/l10n/py/rules/python/S7503.html | 41 +++++++ .../resources/checks/asyncFunctionNotAsync.py | 89 +++++++++++++++ .../custom_protobuf/cohere.client.protobuf | 16 ++- .../custom_protobuf/cohere.client_v2.protobuf | 16 ++- .../types/custom_protobuf/cohere.protobuf | 24 ++-- .../confluent_kafka.aio.consumer.protobuf | 44 ++++++++ .../confluent_kafka.aio.protobuf | 47 ++++++++ .../custom_protobuf/confluent_kafka.protobuf | 47 ++++++++ .../types/custom_protobuf/httpx.protobuf | 35 ++++++ .../portkey_ai.api_resources.client.protobuf | 26 ++--- .../types/custom_protobuf/portkey_ai.protobuf | 24 ++-- .../semantic/v2/TypeInferenceV2Test.java | 28 ++++- .../checksums/custom.checksum | 4 +- .../custom/confluent_kafka/__init__.pyi | 1 + .../custom/confluent_kafka/aio/__init__.pyi | 1 + .../custom/confluent_kafka/aio/consumer.pyi | 13 +++ .../resources/custom/httpx/__init__.pyi | 8 ++ 18 files changed, 490 insertions(+), 78 deletions(-) create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/confluent_kafka.aio.consumer.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/confluent_kafka.aio.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/confluent_kafka.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/httpx.protobuf create mode 100644 python-frontend/typeshed_serializer/resources/custom/confluent_kafka/__init__.pyi create mode 100644 python-frontend/typeshed_serializer/resources/custom/confluent_kafka/aio/__init__.pyi create mode 100644 python-frontend/typeshed_serializer/resources/custom/confluent_kafka/aio/consumer.pyi create mode 100644 python-frontend/typeshed_serializer/resources/custom/httpx/__init__.pyi diff --git a/python-checks/src/main/java/org/sonar/python/checks/AsyncFunctionNotAsyncCheck.java b/python-checks/src/main/java/org/sonar/python/checks/AsyncFunctionNotAsyncCheck.java index 4db86503f..c2c60a4f1 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/AsyncFunctionNotAsyncCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/AsyncFunctionNotAsyncCheck.java @@ -16,20 +16,32 @@ */ package org.sonar.python.checks; +import java.util.List; +import java.util.Set; import javax.annotation.Nullable; import org.sonar.check.Rule; import org.sonar.plugins.python.api.PythonSubscriptionCheck; import org.sonar.plugins.python.api.SubscriptionContext; -import org.sonar.plugins.python.api.TriBool; +import org.sonar.plugins.python.api.symbols.v2.SymbolV2; +import org.sonar.plugins.python.api.symbols.v2.UsageV2; import org.sonar.plugins.python.api.tree.AwaitExpression; import org.sonar.plugins.python.api.tree.BaseTreeVisitor; +import org.sonar.plugins.python.api.tree.CallExpression; import org.sonar.plugins.python.api.tree.ComprehensionFor; +import org.sonar.plugins.python.api.tree.DictionaryLiteral; +import org.sonar.plugins.python.api.tree.Expression; +import org.sonar.plugins.python.api.tree.ExpressionList; import org.sonar.plugins.python.api.tree.ForStatement; import org.sonar.plugins.python.api.tree.FunctionDef; +import org.sonar.plugins.python.api.tree.KeyValuePair; +import org.sonar.plugins.python.api.tree.ListLiteral; +import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.RegularArgument; import org.sonar.plugins.python.api.tree.ReturnStatement; import org.sonar.plugins.python.api.tree.Statement; import org.sonar.plugins.python.api.tree.StatementList; +import org.sonar.plugins.python.api.tree.StringLiteral; import org.sonar.plugins.python.api.tree.Token; import org.sonar.plugins.python.api.tree.Tree; import org.sonar.plugins.python.api.tree.WithStatement; @@ -37,30 +49,31 @@ import org.sonar.plugins.python.api.tree.YieldStatement; import org.sonar.plugins.python.api.types.v2.ClassType; import org.sonar.plugins.python.api.types.v2.FunctionType; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; import org.sonar.python.checks.utils.CheckUtils; -import org.sonar.python.types.v2.TypeCheckBuilder; +import org.sonar.python.tree.TreeUtils; @Rule(key = "S7503") public class AsyncFunctionNotAsyncCheck extends PythonSubscriptionCheck { private static final String MESSAGE = "Use asynchronous features in this function or remove the `async` keyword."; - private TypeCheckBuilder notImplementedTypeChecker; + private static final Set AIO_CONSUMER_SUBSCRIBE_CALLBACK_KWARGS = Set.of("on_assign", "on_revoke", "on_lost"); + + private static final TypeMatcher NOT_IMPLEMENTED_MATCHER = TypeMatchers.isType("builtins.NotImplemented"); + private static final TypeMatcher HTTPX_ASYNC_CLIENT_MATCHER = TypeMatchers.isOrExtendsType("httpx.AsyncClient"); + private static final TypeMatcher AIO_CONSUMER_SUBSCRIBE_MATCHER = TypeMatchers.isType("confluent_kafka.aio.AIOConsumer.subscribe"); @Override public void initialize(Context context) { - context.registerSyntaxNodeConsumer(Tree.Kind.FILE_INPUT, this::setupTypeChecks); - context.registerSyntaxNodeConsumer(Tree.Kind.FUNCDEF, this::checkAsyncFunction); - } - - private void setupTypeChecks(SubscriptionContext ctx) { - notImplementedTypeChecker = ctx.typeChecker().typeCheckBuilder().isTypeWithName("NotImplemented"); + context.registerSyntaxNodeConsumer(Tree.Kind.FUNCDEF, AsyncFunctionNotAsyncCheck::checkAsyncFunction); } - private void checkAsyncFunction(SubscriptionContext ctx) { + private static void checkAsyncFunction(SubscriptionContext ctx) { FunctionDef functionDef = (FunctionDef) ctx.syntaxNode(); Token asyncKeyword = functionDef.asyncKeyword(); - if (asyncKeyword == null || isException(functionDef)) { + if (asyncKeyword == null || isException(functionDef, ctx)) { return; } AsyncFeatureVisitor visitor = new AsyncFeatureVisitor(); @@ -71,12 +84,67 @@ private void checkAsyncFunction(SubscriptionContext ctx) { } } - private boolean isException(FunctionDef functionDef) { + private static boolean isException(FunctionDef functionDef, SubscriptionContext ctx) { return CheckUtils.isAbstract(functionDef) || - isTrivialFunction(functionDef.body()) || + isTrivialFunction(functionDef.body(), ctx) || isDunderMethod(functionDef) || !functionDef.decorators().isEmpty() || - mightBeOverridingMethod(functionDef); + mightBeOverridingMethod(functionDef) || + isExemptedCoroutineCallback(functionDef, ctx); + } + + private static boolean isExemptedCoroutineCallback(FunctionDef functionDef, SubscriptionContext ctx) { + SymbolV2 symbol = functionDef.name().symbolV2(); + if (symbol == null) { + return false; + } + return symbol.usages().stream() + .filter(usage -> usage.kind() == UsageV2.Kind.OTHER) + .anyMatch(usage -> isCoroutineCallbackUsage(usage.tree(), ctx)); + } + + private static boolean isCoroutineCallbackUsage(Tree usageTree, SubscriptionContext ctx) { + return isHttpxAsyncClientEventHookCallback(usageTree, ctx) || isAioConsumerSubscribeCallback(usageTree, ctx); + } + + private static boolean isHttpxAsyncClientEventHookCallback(Tree usageTree, SubscriptionContext ctx) { + CallExpression call = TreeUtils.firstAncestorOfClass(usageTree, CallExpression.class); + if (call == null || !HTTPX_ASYNC_CLIENT_MATCHER.isTrueFor(call.callee(), ctx)) { + return false; + } + RegularArgument eventHooksArg = TreeUtils.argumentByKeyword("event_hooks", call.arguments()); + if (eventHooksArg == null || !(eventHooksArg.expression() instanceof DictionaryLiteral dict)) { + return false; + } + return dict.elements().stream() + .filter(KeyValuePair.class::isInstance) + .map(KeyValuePair.class::cast) + .filter(kv -> isRequestOrResponseKey(kv.key())) + .map(KeyValuePair::value) + .filter(ListLiteral.class::isInstance) + .map(ListLiteral.class::cast) + .map(ListLiteral::elements) + .map(ExpressionList::expressions) + .flatMap(List::stream) + .anyMatch(expr -> expr == usageTree); + } + + private static boolean isRequestOrResponseKey(Expression key) { + return key instanceof StringLiteral stringLiteral && + ("request".equals(stringLiteral.trimmedQuotesValue()) || "response".equals(stringLiteral.trimmedQuotesValue())); + } + + private static boolean isAioConsumerSubscribeCallback(Tree usageTree, SubscriptionContext ctx) { + RegularArgument arg = TreeUtils.firstAncestorOfClass(usageTree, RegularArgument.class); + if (arg == null || arg.expression() != usageTree) { + return false; + } + Name keyword = arg.keywordArgument(); + if (keyword == null || !AIO_CONSUMER_SUBSCRIBE_CALLBACK_KWARGS.contains(keyword.name())) { + return false; + } + CallExpression call = TreeUtils.firstAncestorOfClass(arg, CallExpression.class); + return call != null && AIO_CONSUMER_SUBSCRIBE_MATCHER.isTrueFor(call.callee(), ctx); } private static boolean isDunderMethod(FunctionDef functionDef) { @@ -84,18 +152,18 @@ private static boolean isDunderMethod(FunctionDef functionDef) { return methodName.startsWith("__"); } - private boolean isTrivialFunction(StatementList body) { + private static boolean isTrivialFunction(StatementList body, SubscriptionContext ctx) { for (Statement statement : body.statements()) { - if (!CheckUtils.isEmptyStatement(statement) && !statement.is(Tree.Kind.RAISE_STMT) && !isReturnNotImplemented(statement)) { + if (!CheckUtils.isEmptyStatement(statement) && !statement.is(Tree.Kind.RAISE_STMT) && !isReturnNotImplemented(statement, ctx)) { return false; } } return true; } - private boolean isReturnNotImplemented(Statement statement) { + private static boolean isReturnNotImplemented(Statement statement, SubscriptionContext ctx) { return statement.is(Tree.Kind.RETURN_STMT) && - ((ReturnStatement) statement).expressions().stream().allMatch(e -> notImplementedTypeChecker.check(e.typeV2()) == TriBool.TRUE); + ((ReturnStatement) statement).expressions().stream().allMatch(e -> NOT_IMPLEMENTED_MATCHER.isTrueFor(e, ctx)); } private static boolean mightBeOverridingMethod(FunctionDef functionDef) { diff --git a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S7503.html b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S7503.html index 77b0a9683..3538587b6 100644 --- a/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S7503.html +++ b/python-checks/src/main/resources/org/sonar/l10n/py/rules/python/S7503.html @@ -16,6 +16,8 @@

        Why is this an issue?

      How to fix it

      Either remove the async keyword, or start using the appropriate asynchronous features.

      +

      An async method may also need to remain awaitable to fulfil an inherited contract. In that case, make the contract explicit in the code, for +example by inheriting from the relevant base class or protocol and marking the method as an override.

      Code examples

      Noncompliant code example

      @@ -41,6 +43,45 @@ 

      Compliant solution

      async def my_function(): # Compliant return await another_function()
      +

      Exceptions

      +

      This rule does not raise an issue in the following cases:

      +
        +
      • Abstract methods: Methods decorated with @abstractmethod or @abc.abstractmethod are often async to + signal an async contract for subclasses, even if the abstract body itself is empty.
      • +
      • Dunder methods: Special methods such as __aenter__, __aexit__, or __anext__ form part of + the async protocol interface and must be async regardless of their body.
      • +
      • Decorated functions: Decorators may change the function’s behavior in ways that make the async keyword meaningful + (e.g., framework route handlers).
      • +
      • Overriding methods: A method that overrides an async method from a parent class may legitimately be async to respect the + parent’s interface.
      • +
      • Trivial bodies: Functions whose body consists only of pass, …​, or raise statements are + considered stubs or placeholders and are not flagged.
      • +
      • Framework-required coroutine callbacks: Some frameworks require callbacks to be coroutines even when they don’t internally use + await. This rule recognizes the following cases: +
          +
        • httpx.AsyncClient event hooks registered under the "request" or "response" keys of the + event_hooks parameter.
        • +
        • confluent_kafka.aio.AIOConsumer.subscribe callbacks passed as on_assign, on_revoke, or + on_lost keyword arguments.
        • +
      • +
      +
      +import httpx
      +
      +async def log_request(request: httpx.Request) -> None:  # Compliant - required coroutine callback
      +    print(f"Request: {request.method} {request.url}")
      +
      +client = httpx.AsyncClient(event_hooks={"request": [log_request]})
      +
      +
      +from confluent_kafka.aio import AIOConsumer
      +
      +async def on_assign(consumer, partitions) -> None:  # Compliant - required coroutine callback
      +    print(f"Assigned: {partitions}")
      +
      +consumer = AIOConsumer({"bootstrap.servers": "localhost:9092", "group.id": "mygroup"})
      +await consumer.subscribe(["topic"], on_assign=on_assign)
      +

      Resources

      Articles & blog posts

        diff --git a/python-checks/src/test/resources/checks/asyncFunctionNotAsync.py b/python-checks/src/test/resources/checks/asyncFunctionNotAsync.py index cae5813e9..7b1845614 100644 --- a/python-checks/src/test/resources/checks/asyncFunctionNotAsync.py +++ b/python-checks/src/test/resources/checks/asyncFunctionNotAsync.py @@ -189,3 +189,92 @@ async def async_comprehension(): async def sync_comprehension(): # Noncompliant return [something for something in async_iterable()] + + +# httpx.AsyncClient event hooks - coroutine callbacks are required +import httpx + +async def validate_response(response: httpx.Response) -> None: # Compliant - registered as AsyncClient hook + validate_url(response.url) + +async def validate_request(request: httpx.Request) -> None: # Compliant - registered as AsyncClient hook + validate_headers(request.headers) + +async def both_hooks(response: httpx.Response) -> None: # Compliant - used in both hooks + do_something() + +async_client = httpx.AsyncClient( + event_hooks={ + "request": [validate_request, both_hooks], + "response": [validate_response, both_hooks], + } +) + +class CustomAsyncClient(httpx.AsyncClient): + pass + +async def subclass_hook(response: httpx.Response) -> None: # Compliant - registered as subclass of AsyncClient hook + validate_url(response.url) + +CustomAsyncClient(event_hooks={"response": [subclass_hook]}) + +async def sync_client_hook(response: httpx.Response) -> None: # Noncompliant + validate_url(response.url) + +sync_client = httpx.Client( + event_hooks={"response": [sync_client_hook]} +) + +async def unrelated_hook(response) -> None: # Noncompliant + validate_url(response.url) + +async def hook_no_event_hooks_kwarg(response) -> None: # Noncompliant + validate_url(response.url) + +httpx.AsyncClient(timeout=hook_no_event_hooks_kwarg) # no event_hooks kwarg + +# FP: function is an event hook, but event_hooks is passed as a variable; variable indirection cannot be tracked +async def hook_via_variable(response) -> None: # Noncompliant + validate_url(response.url) + +hooks_dict = {"response": [hook_via_variable]} +httpx.AsyncClient(event_hooks=hooks_dict) + + +# confluent_kafka.aio.AIOConsumer.subscribe - coroutine callbacks are required +from confluent_kafka.aio import AIOConsumer + +consumer = AIOConsumer({"bootstrap.servers": "localhost:9092", "group.id": "mygroup"}) + +async def on_assign_handler(consumer, partitions) -> None: # Compliant - registered as AIOConsumer.subscribe callback + logger.info("Partitions assigned: %s", partitions) + +async def on_revoke_handler(consumer, partitions) -> None: # Compliant - registered as AIOConsumer.subscribe callback + logger.info("Partitions revoked: %s", partitions) + +async def on_lost_handler(consumer, partitions) -> None: # Compliant - registered as AIOConsumer.subscribe callback + logger.info("Partitions lost: %s", partitions) + +await consumer.subscribe( + ["topic"], + on_assign=on_assign_handler, + on_revoke=on_revoke_handler, + on_lost=on_lost_handler, +) + +async def unrelated_subscribe_callback(consumer, partitions) -> None: # Noncompliant + logger.info("Partitions: %s", partitions) + +unknown_obj.subscribe(on_assign=unrelated_subscribe_callback) + +# FP: callback is passed positionally as on_assign, but we only detect keyword arguments +async def positional_subscribe_callback(consumer, partitions) -> None: # Noncompliant + logger.info("Partitions: %s", partitions) + +await consumer.subscribe(["topic"], positional_subscribe_callback) + +# Passed via an unknown keyword argument (not on_assign/on_revoke/on_lost) +async def unknown_kwarg_subscribe_callback(consumer, partitions) -> None: # Noncompliant + logger.info("Partitions: %s", partitions) + +await consumer.subscribe(["topic"], on_other=unknown_kwarg_subscribe_callback) diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/cohere.client.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/cohere.client.protobuf index 509eb9dae..2322a28e2 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/cohere.client.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/cohere.client.protobuf @@ -1,6 +1,6 @@ - cohere.client3 -Clientcohere.client.Client"*SonarPythonAnalyzerFakeStub.CustomStubBase* + cohere.client4 +Clientcohere.client.Client"*SonarPythonAnalyzerFakeStub.CustomStubBase* __init__cohere.client.Client.__init__" None*6 self, @@ -24,10 +24,10 @@ timeoutJ Union[builtins.float,None] builtins.float"builtins.float -None *: - httpx_client& -Union[Any,None] -Any +None *X + httpx_clientD +Union[httpx.Client,None] + httpx.Client" httpx.Client None *x thread_pool_executor\ ,concurrent.futures.thread.ThreadPoolExecutor",concurrent.futures.thread.ThreadPoolExecutor *G @@ -286,6 +286,4 @@ MUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None] __annotations__cohere.client.__annotations__W builtins.dict[builtins.str,Any] builtins.str" builtins.str -Any" builtins.dict*% -httpxcohere.client.httpx -Any \ No newline at end of file +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/cohere.client_v2.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/cohere.client_v2.protobuf index e888ecaf9..deb819adc 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/cohere.client_v2.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/cohere.client_v2.protobuf @@ -1,6 +1,6 @@ -cohere.client_v2% -ClientV2cohere.client_v2.ClientV2"*SonarPythonAnalyzerFakeStub.CustomStubBase* +cohere.client_v2% +ClientV2cohere.client_v2.ClientV2"*SonarPythonAnalyzerFakeStub.CustomStubBase* __init__"cohere.client_v2.ClientV2.__init__" None*@ self6 @@ -22,10 +22,10 @@ timeoutJ Union[builtins.float,None] builtins.float"builtins.float -None *: - httpx_client& -Union[Any,None] -Any +None *X + httpx_clientD +Union[httpx.Client,None] + httpx.Client" httpx.Client None *x thread_pool_executor\ ,concurrent.futures.thread.ThreadPoolExecutor",concurrent.futures.thread.ThreadPoolExecutor *G @@ -213,6 +213,4 @@ max_tokensD __annotations__ cohere.client_v2.__annotations__W builtins.dict[builtins.str,Any] builtins.str" builtins.str -Any" builtins.dict*( -httpxcohere.client_v2.httpx -Any \ No newline at end of file +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/cohere.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/cohere.protobuf index 68a40016c..9a5d53443 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/cohere.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/cohere.protobuf @@ -1,6 +1,6 @@ -cohere3 -Clientcohere.client.Client"*SonarPythonAnalyzerFakeStub.CustomStubBase* +cohere4 +Clientcohere.client.Client"*SonarPythonAnalyzerFakeStub.CustomStubBase* __init__cohere.client.Client.__init__" None*6 self, @@ -24,10 +24,10 @@ timeoutJ Union[builtins.float,None] builtins.float"builtins.float -None *: - httpx_client& -Union[Any,None] -Any +None *X + httpx_clientD +Union[httpx.Client,None] + httpx.Client" httpx.Client None *x thread_pool_executor\ ,concurrent.futures.thread.ThreadPoolExecutor",concurrent.futures.thread.ThreadPoolExecutor *G @@ -282,8 +282,8 @@ MUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None] request_options& Union[Any,None] Any -None % -ClientV2cohere.client_v2.ClientV2"*SonarPythonAnalyzerFakeStub.CustomStubBase* +None % +ClientV2cohere.client_v2.ClientV2"*SonarPythonAnalyzerFakeStub.CustomStubBase* __init__"cohere.client_v2.ClientV2.__init__" None*@ self6 @@ -305,10 +305,10 @@ MUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None] timeoutJ Union[builtins.float,None] builtins.float"builtins.float -None *: - httpx_client& -Union[Any,None] -Any +None *X + httpx_clientD +Union[httpx.Client,None] + httpx.Client" httpx.Client None *x thread_pool_executor\ ,concurrent.futures.thread.ThreadPoolExecutor",concurrent.futures.thread.ThreadPoolExecutor *G diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/confluent_kafka.aio.consumer.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/confluent_kafka.aio.consumer.protobuf new file mode 100644 index 000000000..097b2f7fc --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/confluent_kafka.aio.consumer.protobuf @@ -0,0 +1,44 @@ + +confluent_kafka.aio.consumer + AIOConsumer(confluent_kafka.aio.consumer.AIOConsumer"*SonarPythonAnalyzerFakeStub.CustomStubBase* +__init__1confluent_kafka.aio.consumer.AIOConsumer.__init__" +None*^ +selfT +(confluent_kafka.aio.consumer.AIOConsumer"(confluent_kafka.aio.consumer.AIOConsumer*E +config9 +builtins.dict[Any,Any] +Any +Any" builtins.dict* +kwargs +Any* + subscribe2confluent_kafka.aio.consumer.AIOConsumer.subscribe"N +typing.Coroutine[Any,Any,None] +Any +Any +None"typing.Coroutine*^ +selfT +(confluent_kafka.aio.consumer.AIOConsumer"(confluent_kafka.aio.consumer.AIOConsumer*V +topicsJ +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list* + on_assign ++Union[CallableType[builtins.function],None]K +CallableType[builtins.function]& +builtins.function"builtins.function +None * + on_revoke ++Union[CallableType[builtins.function],None]K +CallableType[builtins.function]& +builtins.function"builtins.function +None * +on_lost ++Union[CallableType[builtins.function],None]K +CallableType[builtins.function]& +builtins.function"builtins.function +None * +kwargs +AnyH* +__annotations__,confluent_kafka.aio.consumer.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/confluent_kafka.aio.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/confluent_kafka.aio.protobuf new file mode 100644 index 000000000..60090a8fe --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/confluent_kafka.aio.protobuf @@ -0,0 +1,47 @@ + +confluent_kafka.aio + AIOConsumer(confluent_kafka.aio.consumer.AIOConsumer"*SonarPythonAnalyzerFakeStub.CustomStubBase* +__init__1confluent_kafka.aio.consumer.AIOConsumer.__init__" +None*^ +selfT +(confluent_kafka.aio.consumer.AIOConsumer"(confluent_kafka.aio.consumer.AIOConsumer*E +config9 +builtins.dict[Any,Any] +Any +Any" builtins.dict* +kwargs +Any* + subscribe2confluent_kafka.aio.consumer.AIOConsumer.subscribe"N +typing.Coroutine[Any,Any,None] +Any +Any +None"typing.Coroutine*^ +selfT +(confluent_kafka.aio.consumer.AIOConsumer"(confluent_kafka.aio.consumer.AIOConsumer*V +topicsJ +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list* + on_assign ++Union[CallableType[builtins.function],None]K +CallableType[builtins.function]& +builtins.function"builtins.function +None * + on_revoke ++Union[CallableType[builtins.function],None]K +CallableType[builtins.function]& +builtins.function"builtins.function +None * +on_lost ++Union[CallableType[builtins.function],None]K +CallableType[builtins.function]& +builtins.function"builtins.function +None * +kwargs +AnyH*t +__path__confluent_kafka.aio.__path__J +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list* +__annotations__#confluent_kafka.aio.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/confluent_kafka.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/confluent_kafka.protobuf new file mode 100644 index 000000000..456b1d6d6 --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/confluent_kafka.protobuf @@ -0,0 +1,47 @@ + +confluent_kafka + AIOConsumer(confluent_kafka.aio.consumer.AIOConsumer"*SonarPythonAnalyzerFakeStub.CustomStubBase* +__init__1confluent_kafka.aio.consumer.AIOConsumer.__init__" +None*^ +selfT +(confluent_kafka.aio.consumer.AIOConsumer"(confluent_kafka.aio.consumer.AIOConsumer*E +config9 +builtins.dict[Any,Any] +Any +Any" builtins.dict* +kwargs +Any* + subscribe2confluent_kafka.aio.consumer.AIOConsumer.subscribe"N +typing.Coroutine[Any,Any,None] +Any +Any +None"typing.Coroutine*^ +selfT +(confluent_kafka.aio.consumer.AIOConsumer"(confluent_kafka.aio.consumer.AIOConsumer*V +topicsJ +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list* + on_assign ++Union[CallableType[builtins.function],None]K +CallableType[builtins.function]& +builtins.function"builtins.function +None * + on_revoke ++Union[CallableType[builtins.function],None]K +CallableType[builtins.function]& +builtins.function"builtins.function +None * +on_lost ++Union[CallableType[builtins.function],None]K +CallableType[builtins.function]& +builtins.function"builtins.function +None * +kwargs +AnyH*p +__path__confluent_kafka.__path__J +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list* +__annotations__confluent_kafka.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/httpx.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/httpx.protobuf new file mode 100644 index 000000000..94e2e9205 --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/httpx.protobuf @@ -0,0 +1,35 @@ + +httpx + AsyncClienthttpx.AsyncClient"*SonarPythonAnalyzerFakeStub.CustomStubBase* +__init__httpx.AsyncClient.__init__" +None*0 +self& +httpx.AsyncClient"httpx.AsyncClient* + event_hooks +Jbuiltins.dict[builtins.str,builtins.list[CallableType[builtins.function]]] + builtins.str" builtins.str +.builtins.list[CallableType[builtins.function]]K +CallableType[builtins.function]& +builtins.function"builtins.function" builtins.list" builtins.dict * +kwargs +Any +Client httpx.Client"*SonarPythonAnalyzerFakeStub.CustomStubBase* +__init__httpx.Client.__init__" +None*& +self + httpx.Client" httpx.Client* + event_hooks +Jbuiltins.dict[builtins.str,builtins.list[CallableType[builtins.function]]] + builtins.str" builtins.str +.builtins.list[CallableType[builtins.function]]K +CallableType[builtins.function]& +builtins.function"builtins.function" builtins.list" builtins.dict * +kwargs +Any*f +__path__httpx.__path__J +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list* +__annotations__httpx.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/portkey_ai.api_resources.client.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/portkey_ai.api_resources.client.protobuf index 7c59600ec..d55b13e07 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/portkey_ai.api_resources.client.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/portkey_ai.api_resources.client.protobuf @@ -1,6 +1,6 @@ -portkey_ai.api_resources.client7 -Portkey'portkey_ai.api_resources.client.Portkey"*SonarPythonAnalyzerFakeStub.CustomStubBase*# +portkey_ai.api_resources.client7 +Portkey'portkey_ai.api_resources.client.Portkey"*SonarPythonAnalyzerFakeStub.CustomStubBase*# __init__0portkey_ai.api_resources.client.Portkey.__init__" None*\ selfR @@ -129,10 +129,10 @@ aws_regionD huggingface_base_urlD Union[builtins.str,None] builtins.str" builtins.str -None *9 - http_client& -Union[Any,None] -Any +None *W + http_clientD +Union[httpx.Client,None] + httpx.Client" httpx.Client None *[ request_timeoutD Union[builtins.int,None] @@ -256,8 +256,8 @@ guardrails2portkey_ai.api_resources.client.Portkey.guardrails videos.portkey_ai.api_resources.client.Portkey.videos Anyr= beta,portkey_ai.api_resources.client.Portkey.beta -Any8 - AsyncPortkey,portkey_ai.api_resources.client.AsyncPortkey"*SonarPythonAnalyzerFakeStub.CustomStubBase*# +Any9 + AsyncPortkey,portkey_ai.api_resources.client.AsyncPortkey"*SonarPythonAnalyzerFakeStub.CustomStubBase*# __init__5portkey_ai.api_resources.client.AsyncPortkey.__init__" None*f self\ @@ -386,10 +386,10 @@ aws_regionD huggingface_base_urlD Union[builtins.str,None] builtins.str" builtins.str -None *9 - http_client& -Union[Any,None] -Any +None *f + http_clientS +Union[httpx.AsyncClient,None]& +httpx.AsyncClient"httpx.AsyncClient None *[ request_timeoutD Union[builtins.int,None] @@ -521,6 +521,4 @@ guardrails7portkey_ai.api_resources.client.AsyncPortkey.guardrails APIClient)portkey_ai.api_resources.client.APIClient Any*I AsyncAPIClient.portkey_ai.api_resources.client.AsyncAPIClient -Any*7 -httpx%portkey_ai.api_resources.client.httpx Any \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/portkey_ai.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/portkey_ai.protobuf index 04bd70b49..1179c2062 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/portkey_ai.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/portkey_ai.protobuf @@ -1,7 +1,7 @@ -portkey_ai7 -Portkey'portkey_ai.api_resources.client.Portkey"*SonarPythonAnalyzerFakeStub.CustomStubBase*# +portkey_ai7 +Portkey'portkey_ai.api_resources.client.Portkey"*SonarPythonAnalyzerFakeStub.CustomStubBase*# __init__0portkey_ai.api_resources.client.Portkey.__init__" None*\ selfR @@ -130,10 +130,10 @@ aws_regionD huggingface_base_urlD Union[builtins.str,None] builtins.str" builtins.str -None *9 - http_client& -Union[Any,None] -Any +None *W + http_clientD +Union[httpx.Client,None] + httpx.Client" httpx.Client None *[ request_timeoutD Union[builtins.int,None] @@ -257,8 +257,8 @@ guardrails2portkey_ai.api_resources.client.Portkey.guardrails videos.portkey_ai.api_resources.client.Portkey.videos Anyr= beta,portkey_ai.api_resources.client.Portkey.beta -Any8 - AsyncPortkey,portkey_ai.api_resources.client.AsyncPortkey"*SonarPythonAnalyzerFakeStub.CustomStubBase*# +Any9 + AsyncPortkey,portkey_ai.api_resources.client.AsyncPortkey"*SonarPythonAnalyzerFakeStub.CustomStubBase*# __init__5portkey_ai.api_resources.client.AsyncPortkey.__init__" None*f self\ @@ -387,10 +387,10 @@ aws_regionD huggingface_base_urlD Union[builtins.str,None] builtins.str" builtins.str -None *9 - http_client& -Union[Any,None] -Any +None *f + http_clientS +Union[httpx.AsyncClient,None]& +httpx.AsyncClient"httpx.AsyncClient None *[ request_timeoutD Union[builtins.int,None] diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/v2/TypeInferenceV2Test.java b/python-frontend/src/test/java/org/sonar/python/semantic/v2/TypeInferenceV2Test.java index a1c5f55d3..57714ddca 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/v2/TypeInferenceV2Test.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/v2/TypeInferenceV2Test.java @@ -3356,12 +3356,36 @@ void import_conflict_between_member_and_submodule() { } @Test - void import_unknown_httpx_client() { + void import_httpx_client() { var statement = lastExpression(""" import httpx httpx.Client() """); - assertThat(statement.typeV2()).isEqualTo(PythonType.UNKNOWN); + PythonType clientType = PROJECT_LEVEL_TYPE_TABLE.getType("httpx.Client"); + assertThat(clientType).isNotEqualTo(PythonType.UNKNOWN); + assertThat(statement.typeV2()).is(TypesTestUtils.objectTypeOf(clientType)); + } + + @Test + void import_httpx_async_client() { + var statement = lastExpression(""" + import httpx + httpx.AsyncClient() + """); + PythonType asyncClientType = PROJECT_LEVEL_TYPE_TABLE.getType("httpx.AsyncClient"); + assertThat(asyncClientType).isNotEqualTo(PythonType.UNKNOWN); + assertThat(statement.typeV2()).is(TypesTestUtils.objectTypeOf(asyncClientType)); + } + + @Test + void import_confluent_kafka_aio_consumer() { + var statement = lastExpression(""" + from confluent_kafka.aio import AIOConsumer + AIOConsumer({}) + """); + PythonType aioConsumerType = PROJECT_LEVEL_TYPE_TABLE.getType("confluent_kafka.aio.AIOConsumer"); + assertThat(aioConsumerType).isNotEqualTo(PythonType.UNKNOWN); + assertThat(statement.typeV2()).is(TypesTestUtils.objectTypeOf(aioConsumerType)); } @Test diff --git a/python-frontend/typeshed_serializer/checksums/custom.checksum b/python-frontend/typeshed_serializer/checksums/custom.checksum index 4136b8806..7ee58aade 100644 --- a/python-frontend/typeshed_serializer/checksums/custom.checksum +++ b/python-frontend/typeshed_serializer/checksums/custom.checksum @@ -1,2 +1,2 @@ -bc0d06bd07460627ce055d86cfb2925426c046d7f11ca5b1360926859fcbe907 -b5be931e3d9b0f7553af70e8c3750e988fd285ce3bb83fd036839eb8170c4b5a \ No newline at end of file +242b3df8166ce6738470346be49a63fc492150844cf6a37e1e6282ba69a23420 +8ebc647d7c84f473b699ca1ad2a89e6085ee13f57fa95befcd49a849c927a18f \ No newline at end of file diff --git a/python-frontend/typeshed_serializer/resources/custom/confluent_kafka/__init__.pyi b/python-frontend/typeshed_serializer/resources/custom/confluent_kafka/__init__.pyi new file mode 100644 index 000000000..121127576 --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/confluent_kafka/__init__.pyi @@ -0,0 +1 @@ +from confluent_kafka.aio import AIOConsumer \ No newline at end of file diff --git a/python-frontend/typeshed_serializer/resources/custom/confluent_kafka/aio/__init__.pyi b/python-frontend/typeshed_serializer/resources/custom/confluent_kafka/aio/__init__.pyi new file mode 100644 index 000000000..add49994d --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/confluent_kafka/aio/__init__.pyi @@ -0,0 +1 @@ +from confluent_kafka.aio.consumer import AIOConsumer \ No newline at end of file diff --git a/python-frontend/typeshed_serializer/resources/custom/confluent_kafka/aio/consumer.pyi b/python-frontend/typeshed_serializer/resources/custom/confluent_kafka/aio/consumer.pyi new file mode 100644 index 000000000..db2f86b40 --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/confluent_kafka/aio/consumer.pyi @@ -0,0 +1,13 @@ +from SonarPythonAnalyzerFakeStub import CustomStubBase +from typing import Any, Callable, Coroutine, List, Optional + +class AIOConsumer(CustomStubBase): + def __init__(self, config: dict, **kwargs: Any) -> None: ... + async def subscribe( + self, + topics: List[str], + on_assign: Optional[Callable[..., Coroutine[Any, Any, None]]] = ..., + on_revoke: Optional[Callable[..., Coroutine[Any, Any, None]]] = ..., + on_lost: Optional[Callable[..., Coroutine[Any, Any, None]]] = ..., + **kwargs: Any, + ) -> None: ... diff --git a/python-frontend/typeshed_serializer/resources/custom/httpx/__init__.pyi b/python-frontend/typeshed_serializer/resources/custom/httpx/__init__.pyi new file mode 100644 index 000000000..99ff054d6 --- /dev/null +++ b/python-frontend/typeshed_serializer/resources/custom/httpx/__init__.pyi @@ -0,0 +1,8 @@ +from SonarPythonAnalyzerFakeStub import CustomStubBase +from typing import Any, Dict, List, Callable + +class AsyncClient(CustomStubBase): + def __init__(self, *, event_hooks: Dict[str, List[Callable[..., Any]]] = ..., **kwargs: Any) -> None: ... + +class Client(CustomStubBase): + def __init__(self, *, event_hooks: Dict[str, List[Callable[..., Any]]] = ..., **kwargs: Any) -> None: ... From b8307c3684d08564b4b69f02db03db6939efd1d1 Mon Sep 17 00:00:00 2001 From: David Kunzmann Date: Thu, 20 Aug 2026 17:39:51 +0200 Subject: [PATCH 318/322] SONARPY-4534 Always populate package root list for legacy projects Co-authored-by: Guillaume Dequenne GitOrigin-RevId: da7bb06c3a112773820e5f5edd297f1db1ebb97a --- .../quickfix/PythonQuickFixVerifier.java | 8 +- .../checks/utils/PythonCheckVerifier.java | 24 +- .../checks/utils/PythonMultiFileVerifier.java | 6 +- .../sonar/plugins/python/PythonSensor.java | 18 +- .../indexer/NamespacePackageTelemetry.java | 4 +- .../indexer/PackageResolutionResult.java | 22 +- .../python/indexer/PackageRootResolver.java | 183 +++++-- .../plugins/python/indexer/PythonIndexer.java | 42 +- .../indexer/SonarLintPythonIndexer.java | 307 +++++++++++- .../indexer/SonarQubePythonIndexer.java | 6 +- .../indexer/NamespacePackageAnalyzerTest.java | 4 +- .../indexer/PackageResolutionResultTest.java | 38 +- .../indexer/PackageRootResolverTest.java | 460 +++++++++++++++++- .../indexer/SonarLintPythonIndexerTest.java | 434 +++++++++++++++++ .../indexer/SonarQubePythonIndexerTest.java | 14 - .../python/indexer/TestModuleFileSystem.java | 6 +- .../sonar/python/TestPythonVisitorRunner.java | 40 +- .../config/ProjectConfigurationBuilder.java | 4 + .../semantic/ProjectLevelSymbolTable.java | 13 + .../sonar/python/semantic/SymbolUtils.java | 99 ++-- .../ProjectConfigurationBuilderTest.java | 36 ++ .../semantic/ProjectLevelSymbolTableTest.java | 25 + .../python/semantic/SymbolUtilsTest.java | 107 ++-- 23 files changed, 1651 insertions(+), 249 deletions(-) create mode 100644 python-frontend/src/test/java/org/sonar/python/project/config/ProjectConfigurationBuilderTest.java diff --git a/python-checks-testkit/src/main/java/org/sonar/python/checks/quickfix/PythonQuickFixVerifier.java b/python-checks-testkit/src/main/java/org/sonar/python/checks/quickfix/PythonQuickFixVerifier.java index 41de242b1..ddf0895fb 100644 --- a/python-checks-testkit/src/main/java/org/sonar/python/checks/quickfix/PythonQuickFixVerifier.java +++ b/python-checks-testkit/src/main/java/org/sonar/python/checks/quickfix/PythonQuickFixVerifier.java @@ -16,6 +16,7 @@ */ package org.sonar.python.checks.quickfix; +import java.io.File; import java.net.URI; import java.util.ArrayList; import java.util.Arrays; @@ -46,7 +47,7 @@ import static org.sonar.python.semantic.SymbolUtils.pythonPackageName; public class PythonQuickFixVerifier { - private static final String SEMANTIC_BASE_DIR = "/tmp/pythonQuickFixVerifier"; + private static final String SEMANTIC_BASE_DIR = new File("target/pythonQuickFixVerifier").getAbsolutePath(); private PythonQuickFixVerifier() { } @@ -173,8 +174,9 @@ private static PythonVisitorContext createIPythonVisitorContext(String code) { private static PythonVisitorContext createSemanticVisitorContext(String path, String code) { var pythonFile = new TestPythonVisitorRunner.MockPythonFile(SEMANTIC_BASE_DIR, path, code); - ProjectLevelSymbolTable globalSymbols = TestPythonVisitorRunner.globalSymbols(Map.of(path, code), SEMANTIC_BASE_DIR); - String packageName = pythonPackageName(pythonFile.file(), SEMANTIC_BASE_DIR); + List packageRoots = TestPythonVisitorRunner.computePackageRoots(List.of(pythonFile.file()), new File(SEMANTIC_BASE_DIR)); + ProjectLevelSymbolTable globalSymbols = TestPythonVisitorRunner.globalSymbols(Map.of(path, code), SEMANTIC_BASE_DIR, packageRoots); + String packageName = pythonPackageName(pythonFile.file(), packageRoots); return TestPythonVisitorRunner.createContext(pythonFile, null, packageName, globalSymbols, CacheContextImpl.dummyCache()); } diff --git a/python-checks-testkit/src/main/java/org/sonar/python/checks/utils/PythonCheckVerifier.java b/python-checks-testkit/src/main/java/org/sonar/python/checks/utils/PythonCheckVerifier.java index ee1ba29e6..e6e562ec9 100644 --- a/python-checks-testkit/src/main/java/org/sonar/python/checks/utils/PythonCheckVerifier.java +++ b/python-checks-testkit/src/main/java/org/sonar/python/checks/utils/PythonCheckVerifier.java @@ -58,7 +58,7 @@ public static void verify(String path, PythonCheck check) { public static void verifyNoIssue(String path, PythonCheck check) { File file = new File(path); - createVerifier(Collections.singletonList(file), check, ProjectLevelSymbolTable.empty(), null, null) + createVerifier(Collections.singletonList(file), check, ProjectLevelSymbolTable.empty(), List.of(), null) .assertNoIssues(); } @@ -69,31 +69,33 @@ public static void verify(List paths, PythonCheck check) { public static void verify(List paths, PythonCheck check, @Nullable ProjectConfiguration projectConfiguration) { List files = paths.stream().map(File::new).toList(); File baseDirFile = new File(files.get(0).getParent()); - ProjectLevelSymbolTable projectLevelSymbolTable = TestPythonVisitorRunner.globalSymbols(files, baseDirFile); - createVerifier(files, check, projectLevelSymbolTable, baseDirFile, projectConfiguration).assertOneOrMoreIssues(); + List packageRoots = TestPythonVisitorRunner.computePackageRoots(files, baseDirFile); + ProjectLevelSymbolTable projectLevelSymbolTable = TestPythonVisitorRunner.globalSymbols(files, packageRoots); + createVerifier(files, check, projectLevelSymbolTable, packageRoots, projectConfiguration).assertOneOrMoreIssues(); } public static void verifyNoIssue(List paths, PythonCheck check) { List files = paths.stream().map(File::new).toList(); File baseDirFile = new File(files.get(0).getParent()); - ProjectLevelSymbolTable projectLevelSymbolTable = TestPythonVisitorRunner.globalSymbols(files, baseDirFile); - createVerifier(files, check, projectLevelSymbolTable, baseDirFile, null).assertNoIssues(); + List packageRoots = TestPythonVisitorRunner.computePackageRoots(files, baseDirFile); + ProjectLevelSymbolTable projectLevelSymbolTable = TestPythonVisitorRunner.globalSymbols(files, packageRoots); + createVerifier(files, check, projectLevelSymbolTable, packageRoots, null).assertNoIssues(); } public static List issues(String path, PythonCheck check) { File file = new File(path); - PythonVisitorContext context = createContext(file, ProjectLevelSymbolTable.empty(), null, null); + PythonVisitorContext context = createContext(file, ProjectLevelSymbolTable.empty(), null, List.of()); return scanFileForIssues(check, context); } private static MultiFileVerifier createVerifier(List files, PythonCheck check, ProjectLevelSymbolTable projectLevelSymbolTable, - @Nullable File baseDir, + List packageRoots, @Nullable ProjectConfiguration projectConfiguration) { MultiFileVerifier multiFileVerifier = MultiFileVerifier.create(files.get(0).toPath(), UTF_8); for (File file : files) { - PythonVisitorContext context = createContext(file, projectLevelSymbolTable, projectConfiguration, baseDir); + PythonVisitorContext context = createContext(file, projectLevelSymbolTable, projectConfiguration, packageRoots); addFileIssues(check, multiFileVerifier, file, context); } return multiFileVerifier; @@ -102,11 +104,11 @@ private static MultiFileVerifier createVerifier(List files, private static PythonVisitorContext createContext(File file, ProjectLevelSymbolTable projectLevelSymbolTable, @Nullable ProjectConfiguration projectConfiguration, - @Nullable File baseDir) { - return baseDir != null + List packageRoots) { + return !packageRoots.isEmpty() ? TestPythonVisitorRunner.createContext(file, null, - pythonPackageName(file, baseDir.getAbsolutePath()), + pythonPackageName(file, packageRoots), projectLevelSymbolTable, CacheContextImpl.dummyCache(), projectConfiguration) diff --git a/python-checks-testkit/src/main/java/org/sonar/python/checks/utils/PythonMultiFileVerifier.java b/python-checks-testkit/src/main/java/org/sonar/python/checks/utils/PythonMultiFileVerifier.java index c5d61e3f1..47361aaac 100644 --- a/python-checks-testkit/src/main/java/org/sonar/python/checks/utils/PythonMultiFileVerifier.java +++ b/python-checks-testkit/src/main/java/org/sonar/python/checks/utils/PythonMultiFileVerifier.java @@ -21,6 +21,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; @@ -46,7 +47,10 @@ public static Map mapFiles(Map pathToCode, String var newBaseDir = getNewBaseDir(baseDir, tempDirectoryPath); - var symbolTable = TestPythonVisitorRunner.globalSymbols(pathToCode, newBaseDir); + File baseDirFile = new File(newBaseDir); + List files = pathToCode.keySet().stream().map(path -> new File(newBaseDir, path)).toList(); + List packageRoots = TestPythonVisitorRunner.computePackageRoots(files, baseDirFile); + var symbolTable = TestPythonVisitorRunner.globalSymbols(pathToCode, newBaseDir, packageRoots); Map results = new HashMap<>(); pathToFile.forEach((path, file) -> { diff --git a/python-commons/src/main/java/org/sonar/plugins/python/PythonSensor.java b/python-commons/src/main/java/org/sonar/plugins/python/PythonSensor.java index e85c72f5c..c9775936c 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/PythonSensor.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/PythonSensor.java @@ -241,20 +241,20 @@ private void updateNamespacePackageTelemetry(PythonIndexer pythonIndexer) { } private void updateResolutionMethodTelemetry(NamespacePackageTelemetry telemetry) { - PackageResolutionResult.ResolutionMethod method = telemetry.resolutionMethod(); + PackageResolutionResult.PrimaryResolutionMethod method = telemetry.resolutionMethod(); if (method == null) { return; } // Report boolean flags for each resolution method - boolean usedPyproject = method == PackageResolutionResult.ResolutionMethod.PYPROJECT_TOML - || method == PackageResolutionResult.ResolutionMethod.PYPROJECT_AND_SETUP_PY; - boolean usedSetupPy = method == PackageResolutionResult.ResolutionMethod.SETUP_PY - || method == PackageResolutionResult.ResolutionMethod.PYPROJECT_AND_SETUP_PY; - boolean usedSonarSources = method == PackageResolutionResult.ResolutionMethod.SONAR_SOURCES; - boolean usedConventionalFolders = method == PackageResolutionResult.ResolutionMethod.CONVENTIONAL_FOLDERS; - boolean usedBaseDir = method == PackageResolutionResult.ResolutionMethod.BASE_DIR; - boolean usedLegacyInitPy = method == PackageResolutionResult.ResolutionMethod.LEGACY_INIT_PY; + boolean usedPyproject = method == PackageResolutionResult.PrimaryResolutionMethod.PYPROJECT_TOML + || method == PackageResolutionResult.PrimaryResolutionMethod.PYPROJECT_AND_SETUP_PY; + boolean usedSetupPy = method == PackageResolutionResult.PrimaryResolutionMethod.SETUP_PY + || method == PackageResolutionResult.PrimaryResolutionMethod.PYPROJECT_AND_SETUP_PY; + boolean usedSonarSources = method == PackageResolutionResult.PrimaryResolutionMethod.SONAR_SOURCES; + boolean usedConventionalFolders = method == PackageResolutionResult.PrimaryResolutionMethod.CONVENTIONAL_FOLDERS; + boolean usedBaseDir = method == PackageResolutionResult.PrimaryResolutionMethod.BASE_DIR; + boolean usedLegacyInitPy = method == PackageResolutionResult.PrimaryResolutionMethod.LEGACY_INIT_PY; sensorTelemetryStorage.updateMetric(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_PYPROJECT_TOML, usedPyproject ? 1 : 0); sensorTelemetryStorage.updateMetric(TelemetryMetricKey.PYTHON_PACKAGE_RESOLVED_VIA_SETUP_PY, usedSetupPy ? 1 : 0); diff --git a/python-commons/src/main/java/org/sonar/plugins/python/indexer/NamespacePackageTelemetry.java b/python-commons/src/main/java/org/sonar/plugins/python/indexer/NamespacePackageTelemetry.java index 905ce2b99..74dfc58cd 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/indexer/NamespacePackageTelemetry.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/indexer/NamespacePackageTelemetry.java @@ -33,7 +33,7 @@ public record NamespacePackageTelemetry( int packagesWithoutInit, int duplicatePackagesWithoutInit, int namespacePackagesInRegularPackage, - @Nullable PackageResolutionResult.ResolutionMethod resolutionMethod, + @Nullable PackageResolutionResult.PrimaryResolutionMethod resolutionMethod, @Nullable PackageResolutionResult.BuildSystem buildSystem) { public static NamespacePackageTelemetry empty() { @@ -44,7 +44,7 @@ public static NamespacePackageTelemetry empty() { * Creates a new telemetry instance with resolution information added. */ public NamespacePackageTelemetry withResolutionInfo( - PackageResolutionResult.ResolutionMethod method, + PackageResolutionResult.PrimaryResolutionMethod method, PackageResolutionResult.BuildSystem system) { return new NamespacePackageTelemetry( packagesWithInit, diff --git a/python-commons/src/main/java/org/sonar/plugins/python/indexer/PackageResolutionResult.java b/python-commons/src/main/java/org/sonar/plugins/python/indexer/PackageResolutionResult.java index 7ee4df58e..4a5b2ddcd 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/indexer/PackageResolutionResult.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/indexer/PackageResolutionResult.java @@ -28,13 +28,13 @@ */ public record PackageResolutionResult( List roots, - ResolutionMethod method, + PrimaryResolutionMethod method, BuildSystem buildSystem) { /** * How the package roots were resolved. */ - public enum ResolutionMethod { + public enum PrimaryResolutionMethod { /** Resolved from pyproject.toml build configuration */ PYPROJECT_TOML, /** Resolved from setup.py configuration */ @@ -47,7 +47,7 @@ public enum ResolutionMethod { CONVENTIONAL_FOLDERS, /** Fallback to project base directory */ BASE_DIR, - /** No build config files found; FQN resolution uses legacy __init__.py detection */ + /** No build config files found; roots are computed by scanning __init__.py chains in source files */ LEGACY_INIT_PY } @@ -69,30 +69,30 @@ public enum BuildSystem { } public static PackageResolutionResult fromPyProjectToml(List roots, BuildSystem buildSystem) { - return new PackageResolutionResult(roots, ResolutionMethod.PYPROJECT_TOML, buildSystem); + return new PackageResolutionResult(roots, PrimaryResolutionMethod.PYPROJECT_TOML, buildSystem); } public static PackageResolutionResult fromSetupPy(List roots) { - return new PackageResolutionResult(roots, ResolutionMethod.SETUP_PY, BuildSystem.NONE); + return new PackageResolutionResult(roots, PrimaryResolutionMethod.SETUP_PY, BuildSystem.NONE); } public static PackageResolutionResult fromBothPyProjectAndSetupPy(List roots, BuildSystem buildSystem) { - return new PackageResolutionResult(roots, ResolutionMethod.PYPROJECT_AND_SETUP_PY, buildSystem); + return new PackageResolutionResult(roots, PrimaryResolutionMethod.PYPROJECT_AND_SETUP_PY, buildSystem); } public static PackageResolutionResult fromSonarSources(List roots) { - return new PackageResolutionResult(roots, ResolutionMethod.SONAR_SOURCES, BuildSystem.NONE); + return new PackageResolutionResult(roots, PrimaryResolutionMethod.SONAR_SOURCES, BuildSystem.NONE); } public static PackageResolutionResult fromConventionalFolders(List roots) { - return new PackageResolutionResult(roots, ResolutionMethod.CONVENTIONAL_FOLDERS, BuildSystem.NONE); + return new PackageResolutionResult(roots, PrimaryResolutionMethod.CONVENTIONAL_FOLDERS, BuildSystem.NONE); } public static PackageResolutionResult fromBaseDir(List roots) { - return new PackageResolutionResult(roots, ResolutionMethod.BASE_DIR, BuildSystem.NONE); + return new PackageResolutionResult(roots, PrimaryResolutionMethod.BASE_DIR, BuildSystem.NONE); } - public static PackageResolutionResult fromLegacyInitPy() { - return new PackageResolutionResult(List.of(), ResolutionMethod.LEGACY_INIT_PY, BuildSystem.NONE); + public static PackageResolutionResult fromLegacyInitPy(List roots) { + return new PackageResolutionResult(roots, PrimaryResolutionMethod.LEGACY_INIT_PY, BuildSystem.NONE); } } diff --git a/python-commons/src/main/java/org/sonar/plugins/python/indexer/PackageRootResolver.java b/python-commons/src/main/java/org/sonar/plugins/python/indexer/PackageRootResolver.java index 312d6f7d8..a61174501 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/indexer/PackageRootResolver.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/indexer/PackageRootResolver.java @@ -16,6 +16,8 @@ */ package org.sonar.plugins.python.indexer; +import static org.sonar.python.semantic.SymbolUtils.resolvedPath; + import com.google.common.annotations.VisibleForTesting; import java.io.File; import java.io.IOException; @@ -23,13 +25,16 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.Arrays; +import java.util.Comparator; import java.util.List; import java.util.Optional; import java.util.function.BiFunction; import java.util.stream.Stream; +import java.util.stream.StreamSupport; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.sonar.api.batch.fs.FileSystem; +import org.sonar.api.batch.fs.InputFile; import org.sonar.api.config.Configuration; /** @@ -39,9 +44,9 @@ *
          *
        • Extraction from pyproject.toml build system configurations
        • *
        • Extraction from setup.py configurations
        • - *
        • When no build config files exist: returns empty roots so that FQN resolution falls back - * to legacy __init__.py-based detection (see - * {@link org.sonar.python.semantic.SymbolUtils#pythonPackageName})
        • + *
        • When no build config files exist: computes roots by scanning Python source files + * and walking up __init__.py chains to find the first parent directory without __init__.py + * for each file (legacy detection mode)
        • *
        • Fallback when build files exist but provide no roots: conventional folders (src/, lib/), * then sonar.sources, then base directory
        • *
        @@ -60,27 +65,30 @@ private PackageRootResolver() { * Resolves package root directories for the project. * *

        Attempts to extract source roots from pyproject.toml and setup.py build system configurations. - * When no build config files exist, returns empty roots so that FQN resolution falls back to - * legacy __init__.py-based detection. When build config files exist but provide no source roots, - * conventional folders take priority over sonar.sources, then base directory as last resort. + * When no build config files exist, computes roots by scanning the provided Python source files + * and walking up __init__.py chains to find the package root for each file. When build config + * files exist but provide no source roots, conventional folders take priority over sonar.sources, + * then base directory as last resort. * * @param fileSystem the Sonar file system providing the base directory * @param config the Sonar configuration + * @param pythonFiles the Python source files in the project (used for legacy root computation) * @return resolution result including resolved root absolute paths and method information */ - public static PackageResolutionResult resolve(FileSystem fileSystem, Configuration config) { + public static PackageResolutionResult resolve(FileSystem fileSystem, Configuration config, Iterable pythonFiles) { File baseDir = fileSystem.baseDir(); // Discover build config files - List pyprojectFiles = findFilesRecursively(fileSystem, "pyproject.toml"); - List setupPyFiles = findFilesRecursively(fileSystem, "setup.py"); + BuildConfigFiles buildConfigFiles = findBuildConfigFiles(fileSystem); + List pyprojectFiles = buildConfigFiles.pyprojectFiles(); + List setupPyFiles = buildConfigFiles.setupPyFiles(); boolean hasBuildConfigFiles = !pyprojectFiles.isEmpty() || !setupPyFiles.isEmpty(); - // When no build config files exist, FQN resolution relies on legacy __init__.py detection. - // Returning empty roots causes SymbolUtils.pythonPackageName to use pythonPackageNameLegacy(). + // When no build config files exist, compute roots from __init__.py chains in source files. if (!hasBuildConfigFiles) { - LOG.debug("No build config files found; using legacy __init__.py-based package detection"); - return PackageResolutionResult.fromLegacyInitPy(); + List legacyRoots = computeLegacyRoots(pythonFiles, baseDir); + LOG.debug("No build config files found; computed package roots from __init__.py detection: {}", legacyRoots); + return PackageResolutionResult.fromLegacyInitPy(legacyRoots); } // Extract source roots from discovered files @@ -93,8 +101,8 @@ public static PackageResolutionResult resolve(FileSystem fileSystem, Configurati .filter(csr -> !csr.relativeRoots().isEmpty()) .toList(); - boolean hasPyproject = pyprojectResults.stream().anyMatch(PyProjectExtractionResult::hasRoots); - boolean hasSetupPy = !setupPyRoots.isEmpty(); + boolean hasPyprojectRoots = pyprojectResults.stream().anyMatch(PyProjectExtractionResult::hasRoots); + boolean hasSetupPyRoots = !setupPyRoots.isEmpty(); List combinedRoots = Stream.concat( pyprojectResults.stream().map(PyProjectExtractionResult::configRoots).flatMap(crs -> crs.toAbsolutePaths().stream()), @@ -102,36 +110,40 @@ public static PackageResolutionResult resolve(FileSystem fileSystem, Configurati .distinct() .toList(); - List adjustedRoots = adjustRoots(combinedRoots, baseDir); + // Build configs exist but extracted no roots — fall back, then augment with uncovered files. + if (!hasPyprojectRoots && !hasSetupPyRoots) { + return resolveRootsWhenBuildConfigHasNoSourceRoots(config, baseDir, pythonFiles); + } + + List adjustedRoots = augmentWithUncoveredFileRoots(adjustRoots(combinedRoots, baseDir), pythonFiles, baseDir); LOG.debug("Resolved package roots from build configuration: {}", adjustedRoots); - if (hasPyproject && hasSetupPy) { + if (hasPyprojectRoots && hasSetupPyRoots) { return PackageResolutionResult.fromBothPyProjectAndSetupPy(adjustedRoots, getCombinedBuildSystem(pyprojectResults)); } - if (hasPyproject) { + if (hasPyprojectRoots) { return PackageResolutionResult.fromPyProjectToml(adjustedRoots, getCombinedBuildSystem(pyprojectResults)); } - if (hasSetupPy) { - return PackageResolutionResult.fromSetupPy(adjustedRoots); - } - - return resolveFallback(config, baseDir); + return PackageResolutionResult.fromSetupPy(adjustedRoots); } /** * Resolves fallback package roots when build config files exist but provide no source roots. * *

        Priority order: conventional folders (src/, lib/), then sonar.sources, then base directory. + * After resolving the primary roots, augments with legacy __init__.py-based roots for any + * Python files not covered by the resolved roots. */ - private static PackageResolutionResult resolveFallback(Configuration config, File baseDir) { + private static PackageResolutionResult resolveRootsWhenBuildConfigHasNoSourceRoots(Configuration config, File baseDir, Iterable pythonFiles) { List>> candidates = List.of(PackageRootResolver::tryConventionalFolders, PackageRootResolver::trySonarSources); for (BiFunction> candidate : candidates) { Optional result = candidate.apply(config, baseDir); if (result.isPresent()) { - return result.get(); + var augmentedRoots = augmentWithUncoveredFileRoots(result.get().roots(), pythonFiles, baseDir); + return new PackageResolutionResult(augmentedRoots, result.get().method(), result.get().buildSystem()); } } @@ -236,32 +248,135 @@ private static List adjustRoots(List roots, File baseDir) { static String adjustPackageRoot(File root, File baseDir) { File current = root; String baseDirPath = baseDir.getAbsolutePath(); - while (current != null && !current.getAbsolutePath().equals(baseDirPath)) { + Path comparableBaseDirPath = resolvedPath(baseDir); + while (current != null && !resolvedPath(current).equals(comparableBaseDirPath)) { File initFile = new File(current, "__init__.py"); if (!initFile.exists()) { break; } current = current.getParentFile(); } - if (current == null) { + if (current == null || resolvedPath(current).equals(comparableBaseDirPath)) { return baseDirPath; } + Path comparableCurrentPath = resolvedPath(current); + if (comparableCurrentPath.startsWith(comparableBaseDirPath)) { + Path relativePath = comparableBaseDirPath.relativize(comparableCurrentPath); + return baseDir.toPath().toAbsolutePath().resolve(relativePath).normalize().toString(); + } return current.getAbsolutePath(); } /** - * Recursively finds files with the given filename under the project base directory. + * Computes package root directories for a set of files by walking up __init__.py chains. + * + *

        For each file, walks up from the file's parent directory toward the base directory, + * stopping at the first directory that does not contain an __init__.py. That directory is the + * package root for that file. Roots are deduplicated and sorted by path length descending so + * that the most specific root is matched first. + * + *

        If no files are provided, returns the base directory as the single root. + * + * @param files the Python source files whose roots to compute + * @param baseDir the project base directory (walk-up never crosses this boundary) + * @return deduplicated absolute package root paths, sorted deepest-first */ - private static List findFilesRecursively(FileSystem fileSystem, String filename) { + public static List computePackageRootsFromFiles(List files, File baseDir) { + List roots = files.stream() + .map(f -> adjustPackageRoot(f.getParentFile(), baseDir)) + .distinct() + .sorted(deepestFirstComparator()) + .toList(); + return roots.isEmpty() ? List.of(baseDir.getAbsolutePath()) : roots; + } + + /** + * Augments build-config roots with legacy __init__.py-based roots for files not covered + * by any existing root. + * + *

        Build configuration files (setup.py, pyproject.toml) typically declare only the source + * package roots (e.g. {@code src/}). Files outside those roots — most commonly test files + * under a {@code tests/} directory that has its own {@code __init__.py} — would otherwise + * receive an empty package name, breaking FQN resolution and type inference. + * + *

        This method identifies such uncovered files and computes additional roots for them + * using the same __init__.py walk-up algorithm used for legacy projects. + */ + private static List augmentWithUncoveredFileRoots(List configRoots, Iterable pythonFiles, File baseDir) { + List comparableRoots = configRoots.stream() + .map(root -> resolvedPath(new File(root))) + .toList(); + List uncoveredFiles = StreamSupport.stream(pythonFiles.spliterator(), false) + .map(InputFile::file) + .filter(file -> !isUnderAnyComparableRoot(file, comparableRoots)) + .toList(); + + if (uncoveredFiles.isEmpty()) { + return configRoots.stream() + .sorted(deepestFirstComparator()) + .toList(); + } + + List additionalRoots = computePackageRootsFromFiles(uncoveredFiles, baseDir); + return Stream.concat(configRoots.stream(), additionalRoots.stream()) + .distinct() + .sorted(deepestFirstComparator()) + .toList(); + } + + private static boolean isUnderAnyComparableRoot(File file, List roots) { + Path filePath = resolvedPath(file); + for (Path root : roots) { + if (filePath.startsWith(root)) { + return true; + } + } + return false; + } + + private static List computeLegacyRoots(Iterable pythonFiles, File baseDir) { + List files = StreamSupport.stream(pythonFiles.spliterator(), false) + .map(InputFile::file) + .toList(); + return computePackageRootsFromFiles(files, baseDir); + } + + /** + * Recursively finds supported build configuration files under the project base directory. + */ + private static BuildConfigFiles findBuildConfigFiles(FileSystem fileSystem) { + List pyprojectFiles = new ArrayList<>(); + List setupPyFiles = new ArrayList<>(); try (Stream stream = Files.walk(fileSystem.baseDir().toPath())) { - return stream + stream .filter(Files::isRegularFile) - .filter(path -> filename.equals(path.getFileName().toString())) - .map(Path::toFile) - .toList(); + .forEach(path -> { + String filename = path.getFileName().toString(); + if ("pyproject.toml".equals(filename)) { + pyprojectFiles.add(path.toFile()); + } else if ("setup.py".equals(filename)) { + setupPyFiles.add(path.toFile()); + } + }); } catch (IOException e) { - return List.of(); + return new BuildConfigFiles(List.of(), List.of()); } + return new BuildConfigFiles(List.copyOf(pyprojectFiles), List.copyOf(setupPyFiles)); + } + + private record BuildConfigFiles(List pyprojectFiles, List setupPyFiles) { + } + + /** + * Returns a comparator that sorts package root paths deepest-first (by separator count), + * breaking ties alphabetically. + */ + private static Comparator deepestFirstComparator() { + return Comparator.comparingInt(PackageRootResolver::pathDepth).reversed().thenComparing(Comparator.naturalOrder()); + } + + private static int pathDepth(String path) { + return (int) path.chars().filter(c -> c == File.separatorChar).count(); } /** diff --git a/python-commons/src/main/java/org/sonar/plugins/python/indexer/PythonIndexer.java b/python-commons/src/main/java/org/sonar/plugins/python/indexer/PythonIndexer.java index 4348b41a6..b246dc33b 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/indexer/PythonIndexer.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/indexer/PythonIndexer.java @@ -17,8 +17,10 @@ package org.sonar.plugins.python.indexer; import com.sonar.sslr.api.AstNode; +import java.io.File; import java.io.IOException; import java.net.URI; +import java.nio.file.Path; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -47,14 +49,15 @@ import org.sonar.python.tree.PythonTreeMaker; import static org.sonar.python.semantic.SymbolUtils.pythonPackageName; +import static org.sonar.python.semantic.SymbolUtils.resolvedPath; public abstract class PythonIndexer { private static final Logger LOG = LoggerFactory.getLogger(PythonIndexer.class); - protected String projectBaseDirAbsolutePath; protected List packageRoots = List.of(); protected @Nullable PackageResolutionResult packageResolutionResult; + private List resolvedPackageRoots = List.of(); private final Map packageNames = new ConcurrentHashMap<>(); private final Supplier parserSupplier = PythonParser::create; @@ -89,7 +92,7 @@ protected void recreateProjectLevelTypeTable() { public String packageName(PythonInputFile inputFile) { if (!packageNames.containsKey(inputFile.wrappedFile().uri())) { - String name = pythonPackageName(inputFile.wrappedFile().file(), packageRoots, projectBaseDirAbsolutePath); + String name = pythonPackageName(inputFile.wrappedFile().file(), resolvedPackageRoots); packageNames.put(inputFile.wrappedFile().uri(), name); projectLevelSymbolTable.addProjectPackage(name); } @@ -100,6 +103,12 @@ public List packageRoots() { return packageRoots; } + protected void clearProjectIndex() { + packageNames.clear(); + projectLevelSymbolTable.clear(); + projectConfigurationBuilder.clear(); + } + /** * Resolves package root directories for the project. * @@ -110,15 +119,32 @@ public List packageRoots() { * @return list of resolved package root absolute paths */ protected List resolvePackageRoots(SensorContext context) { - PackageResolutionResult result = PackageRootResolver.resolve(context.fileSystem(), context.config()); + var fs = context.fileSystem(); + Iterable pythonFiles = fs.inputFiles(fs.predicates().hasLanguage("py")); + PackageResolutionResult result = PackageRootResolver.resolve(fs, context.config(), pythonFiles); + setPackageResolutionResult(result); + return packageRoots; + } + + protected void setPackageResolutionResult(PackageResolutionResult result) { + this.packageRoots = result.roots(); + this.resolvedPackageRoots = packageRoots.stream() + .map(root -> resolvedPath(new File(root))) + .toList(); this.packageResolutionResult = result; - return result.roots(); + } + + protected boolean isResolvedPackageRoot(Path candidateRoot) { + return resolvedPackageRoots.contains(candidateRoot); + } + + protected boolean isUnderResolvedPackageRoot(Path path) { + return resolvedPackageRoots.stream().anyMatch(path::startsWith); } public void collectPackageNames(List inputFiles) { for (PythonInputFile inputFile : inputFiles) { - String packageName = pythonPackageName(inputFile.wrappedFile().file(), packageRoots, projectBaseDirAbsolutePath); - projectLevelSymbolTable.addProjectPackage(packageName); + packageName(inputFile); } } @@ -159,9 +185,7 @@ void removeFile(PythonInputFile inputFile) { void addFile(PythonInputFile inputFile) throws IOException { AstNode astNode = parserSupplier.get().parse(inputFile.wrappedFile().contents()); FileInput astRoot = new PythonTreeMaker().fileInput(astNode); - String packageName = pythonPackageName(inputFile.wrappedFile().file(), packageRoots, projectBaseDirAbsolutePath); - packageNames.put(inputFile.wrappedFile().uri(), packageName); - projectLevelSymbolTable.addProjectPackage(packageName); + String packageName = packageName(inputFile); PythonFile pythonFile = SonarQubePythonFile.create(inputFile.wrappedFile()); projectLevelSymbolTable.addModule(astRoot, packageName, pythonFile); signatureBasedAwsLambdaHandlersCollector.collect(projectConfigurationBuilder, astRoot, packageName); diff --git a/python-commons/src/main/java/org/sonar/plugins/python/indexer/SonarLintPythonIndexer.java b/python-commons/src/main/java/org/sonar/plugins/python/indexer/SonarLintPythonIndexer.java index 2788f3511..6279d58d8 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/indexer/SonarLintPythonIndexer.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/indexer/SonarLintPythonIndexer.java @@ -16,17 +16,24 @@ */ package org.sonar.plugins.python.indexer; +import com.google.common.annotations.VisibleForTesting; +import java.io.File; import java.io.IOException; +import java.nio.file.Path; import java.util.ArrayList; import java.util.Collections; -import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; +import java.util.function.Predicate; import javax.annotation.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.sonar.api.batch.fs.FileSystem; import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.sensor.SensorContext; +import org.sonar.api.config.Configuration; import org.sonar.plugins.python.Python; import org.sonar.plugins.python.api.SonarLintCache; import org.sonar.plugins.python.api.caching.CacheContext; @@ -41,15 +48,22 @@ import org.sonarsource.sonarlint.plugin.api.module.file.ModuleFileListener; import org.sonarsource.sonarlint.plugin.api.module.file.ModuleFileSystem; +import static org.sonar.python.semantic.SymbolUtils.resolvedPath; + @SonarLintSide(lifespan = "MODULE") public class SonarLintPythonIndexer extends PythonIndexer implements ModuleFileListener { private final ModuleFileSystem moduleFileSystem; private CacheContext cacheContext; - private final Map indexedFiles = new HashMap<>(); + private @Nullable FileSystem fileSystem; + private @Nullable Configuration configuration; + private final PackageRootState packageRootState = new PackageRootState(); + private final Map knownMainFiles = new ConcurrentHashMap<>(); + private final Map indexedFiles = new ConcurrentHashMap<>(); private static final Logger LOG = LoggerFactory.getLogger(SonarLintPythonIndexer.class); private boolean shouldBuildProjectSymbolTable = true; + private boolean indexingEnabled = true; private static final long DEFAULT_MAX_LINES_FOR_INDEXING = 300_000; private static final String MAX_LINES_PROPERTY = "sonar.python.sonarlint.indexing.maxlines"; @@ -63,8 +77,10 @@ public void buildOnce(SensorContext context) { if (!shouldBuildProjectSymbolTable) { return; } - this.projectBaseDirAbsolutePath = context.fileSystem().baseDir().getAbsolutePath(); - this.packageRoots = resolvePackageRoots(context); + this.fileSystem = context.fileSystem(); + this.configuration = context.config(); + List rootContributorFiles = getPackageRootContributorFiles(moduleFileSystem); + setPackageResolutionResult(PackageRootResolver.resolve(fileSystem, configuration, rootContributorFiles)); shouldBuildProjectSymbolTable = false; List files = getInputFiles(moduleFileSystem); collectPackageNames(files); @@ -74,8 +90,13 @@ public void buildOnce(SensorContext context) { // Avoid performance issues for large projects LOG.debug("Project symbol table deactivated due to project size (total number of lines is {}, maximum for indexing is {})", nLines, maxLinesForIndexing); LOG.debug("Update \"sonar.python.sonarlint.indexing.maxlines\" to set a different limit."); + indexingEnabled = false; return; } + files.stream() + .map(PythonInputFile::wrappedFile) + .forEach(file -> knownMainFiles.put(file.absolutePath(), file)); + packageRootState.initialize(rootContributorFiles); LOG.debug("Input files for indexing: {}", files); // computes "globalSymbolsByModuleName" GlobalSymbolsScanner globalSymbolsStep = new GlobalSymbolsScanner(context); @@ -115,6 +136,246 @@ private static List getInputFiles(ModuleFileSystem moduleFileSy return Collections.unmodifiableList(files); } + private static List getPackageRootContributorFiles(ModuleFileSystem moduleFileSystem) { + return moduleFileSystem.files() + .filter(file -> Python.KEY.equals(file.language())) + .toList(); + } + + @VisibleForTesting + boolean refreshPackageRoots() { + if (fileSystem == null || configuration == null) { + return false; + } + try { + PackageResolutionResult result = PackageRootResolver.resolve(fileSystem, configuration, packageRootState.contributorFiles()); + boolean rootsChanged = !packageRoots.equals(result.roots()); + setPackageResolutionResult(result); + packageRootState.onResolutionSucceeded(this::packageRootCandidate); + return rootsChanged; + } catch (RuntimeException e) { + // This module-scoped indexer survives failed events. Contributor state may already reflect the event while + // resolved roots or candidates do not, so require full resolution before handling another structural event. + packageRootState.onResolutionFailed(); + throw e; + } + } + + private @Nullable Path packageRootCandidate(InputFile file) { + if (fileSystem == null || file.file().getParentFile() == null) { + return null; + } + String candidateRoot = PackageRootResolver.adjustPackageRoot(file.file().getParentFile(), fileSystem.baseDir()); + return resolvedPath(new File(candidateRoot)); + } + + private void rebuildProjectIndex() { + clearProjectIndex(); + List filesToRebuild = knownMainFiles.values().stream() + .map(PythonInputFileImpl::new) + .toList(); + collectPackageNames(filesToRebuild); + for (PythonInputFile inputFile : filesToRebuild) { + try { + super.addFile(inputFile); + indexedFiles.put(inputFile.wrappedFile().absolutePath(), inputFile.wrappedFile()); + } catch (Exception e) { + LOG.debug("Failed to re-index file \"{}\" during project index rebuild", inputFile.wrappedFile().filename(), e); + } + } + recreateProjectLevelTypeTable(); + } + + private PackageRootImpact packageRootImpact(PythonInputFile target, ModuleFileEvent.Type type) { + Path candidateRoot = type == ModuleFileEvent.Type.CREATED ? packageRootCandidate(target.wrappedFile()) : null; + if (isPackageConfigurationFile(target.wrappedFile().filename())) { + return new PackageRootImpact(true, candidateRoot); + } + if (type == ModuleFileEvent.Type.MODIFIED) { + return new PackageRootImpact(false, null); + } + if (packageRootState.resolutionRetryRequired() || isPackageInitFile(target.wrappedFile().filename())) { + return new PackageRootImpact(true, candidateRoot); + } + if (type == ModuleFileEvent.Type.CREATED) { + return createdFilePackageRootImpact(target.wrappedFile(), candidateRoot); + } + if (type == ModuleFileEvent.Type.DELETED) { + return deletedFilePackageRootImpact(target.wrappedFile()); + } + return new PackageRootImpact(true, candidateRoot); + } + + private PackageRootImpact createdFilePackageRootImpact(InputFile target, @Nullable Path candidateRoot) { + boolean canImpactRoots = candidateRoot == null + || canIntroduceConventionalFolder(target) + || (!isCoveredByBaseDirFallback(target) && !isResolvedPackageRoot(candidateRoot)); + return new PackageRootImpact(canImpactRoots, candidateRoot); + } + + private PackageRootImpact deletedFilePackageRootImpact(InputFile target) { + File parentDirectory = target.file().getParentFile(); + if (parentDirectory == null || !parentDirectory.isDirectory()) { + return new PackageRootImpact(true, null); + } + if (isCoveredByBaseDirFallback(target)) { + return new PackageRootImpact(false, null); + } + return new PackageRootImpact(packageRootState.deletionCanImpactRoots(target.absolutePath(), this::isResolvedPackageRoot), null); + } + + private static boolean isPackageConfigurationFile(String filename) { + return "setup.py".equals(filename) || "pyproject.toml".equals(filename); + } + + private static boolean isPackageInitFile(String filename) { + return "__init__.py".equals(filename); + } + + private boolean canIntroduceConventionalFolder(InputFile target) { + if (fileSystem == null || packageResolutionResult == null) { + return true; + } + PackageResolutionResult.PrimaryResolutionMethod method = packageResolutionResult.method(); + if (method != PackageResolutionResult.PrimaryResolutionMethod.BASE_DIR + && method != PackageResolutionResult.PrimaryResolutionMethod.SONAR_SOURCES) { + return false; + } + Path targetPath = resolvedPath(target.file()); + Path baseDirPath = resolvedPath(fileSystem.baseDir()); + return PackageRootResolver.CONVENTIONAL_FOLDERS.stream() + .map(baseDirPath::resolve) + .anyMatch(targetPath::startsWith); + } + + private boolean isCoveredByBaseDirFallback(InputFile target) { + return fileSystem != null + && packageResolutionResult != null + && packageResolutionResult.method() == PackageResolutionResult.PrimaryResolutionMethod.BASE_DIR + && isUnderResolvedPackageRoot(resolvedPath(target.file())); + } + + /** + * Tracks the Python files that contribute to package-root resolution and caches each file's candidate legacy root + * (the root obtained by walking up its parent directories while they contain an {@code __init__.py} file). + * + *

        The candidate cache allows ordinary file events to skip full package-root resolution when the event cannot add + * or remove a resolved root. Structural changes such as creating or deleting an {@code __init__.py} invalidate the + * cache so that subsequent events remain conservative. + */ + private static final class PackageRootState { + private final Map contributorFiles = new ConcurrentHashMap<>(); + private final Map candidates = new ConcurrentHashMap<>(); + private boolean candidatesValid; + private boolean resolutionRetryRequired; + + void initialize(List files) { + contributorFiles.clear(); + files.forEach(file -> contributorFiles.put(file.absolutePath(), file)); + candidates.clear(); + candidatesValid = false; + resolutionRetryRequired = false; + } + + List contributorFiles() { + return List.copyOf(contributorFiles.values()); + } + + /** Marks that root resolution failed so subsequent structural file events retry it instead of using cached state. */ + void onResolutionFailed() { + resolutionRetryRequired = true; + } + + /** + * Synchronizes the candidate cache after successful root resolution and allows structural file events to use it + * again. This must only be called after the new resolution result has been installed. + */ + void onResolutionSucceeded(Function candidateResolver) { + if (candidatesValid) { + resolutionRetryRequired = false; + return; + } + candidates.clear(); + for (Map.Entry entry : contributorFiles.entrySet()) { + Path candidate = candidateResolver.apply(entry.getValue()); + if (candidate == null) { + resolutionRetryRequired = false; + return; + } + candidates.put(entry.getKey(), candidate); + } + candidatesValid = true; + resolutionRetryRequired = false; + } + + boolean resolutionRetryRequired() { + return resolutionRetryRequired; + } + + boolean deletionCanImpactRoots(String absolutePath, Predicate isResolvedPackageRoot) { + if (!candidatesValid) { + return true; + } + Path previousCandidate = candidates.get(absolutePath); + if (previousCandidate == null || !isResolvedPackageRoot.test(previousCandidate)) { + return previousCandidate == null; + } + return candidates.entrySet().stream() + .noneMatch(entry -> !entry.getKey().equals(absolutePath) && entry.getValue().equals(previousCandidate)); + } + + void update(PythonInputFile target, ModuleFileEvent.Type type, @Nullable Path candidate) { + InputFile file = target.wrappedFile(); + String absolutePath = file.absolutePath(); + if (isPackageInitFile(file.filename()) + && (type == ModuleFileEvent.Type.CREATED || type == ModuleFileEvent.Type.DELETED)) { + candidatesValid = false; + } + if (isCreatedOrModified(type)) { + contributorFiles.put(absolutePath, file); + if (type == ModuleFileEvent.Type.CREATED) { + if (candidate != null) { + candidates.put(absolutePath, candidate); + } else { + candidatesValid = false; + } + } + } else if (type == ModuleFileEvent.Type.DELETED) { + contributorFiles.remove(absolutePath); + candidates.remove(absolutePath); + } + } + } + + private record PackageRootImpact(boolean canImpactRoots, @Nullable Path candidateRoot) { + } + + private void updateKnownMainFile(PythonInputFile target, ModuleFileEvent.Type type, boolean mainPythonFile) { + String absolutePath = target.wrappedFile().absolutePath(); + boolean wasKnownMainFile = knownMainFiles.containsKey(absolutePath); + boolean shouldRemoveFromIndex = type.equals(ModuleFileEvent.Type.DELETED) + || type.equals(ModuleFileEvent.Type.MODIFIED) + || !mainPythonFile; + if (wasKnownMainFile && shouldRemoveFromIndex) { + removeFile(target); + } + if (mainPythonFile && isCreatedOrModified(type)) { + knownMainFiles.put(absolutePath, target.wrappedFile()); + } else if (type.equals(ModuleFileEvent.Type.DELETED) || !mainPythonFile) { + knownMainFiles.remove(absolutePath); + } + } + + private void addFileIfCreatedOrModified(PythonInputFile target, ModuleFileEvent.Type type) throws IOException { + if (isCreatedOrModified(type)) { + addFile(target); + } + } + + private static boolean isCreatedOrModified(ModuleFileEvent.Type type) { + return type.equals(ModuleFileEvent.Type.CREATED) || type.equals(ModuleFileEvent.Type.MODIFIED); + } + @Override void addFile(PythonInputFile inputFile) throws IOException { super.addFile(inputFile); @@ -130,23 +391,41 @@ void removeFile(PythonInputFile inputFile) { } @Override - public void process(ModuleFileEvent moduleFileEvent) { + protected void clearProjectIndex() { + super.clearProjectIndex(); + indexedFiles.clear(); + } + + @Override + public synchronized void process(ModuleFileEvent moduleFileEvent) { PythonInputFile target = new PythonInputFileImpl(moduleFileEvent.getTarget()); String language = target.wrappedFile().language(); - if (language == null || !language.equals(Python.KEY)) { + boolean packageConfigurationFile = isPackageConfigurationFile(target.wrappedFile().filename()); + boolean pythonFile = Python.KEY.equals(language); + boolean mainPythonFile = pythonFile && target.wrappedFile().type() == InputFile.Type.MAIN; + if (!pythonFile && !packageConfigurationFile) { LOG.debug("Module file event for {} has been ignored because it's not a Python file.", target); return; } - ModuleFileEvent.Type type = moduleFileEvent.getType(); - if (type.equals(ModuleFileEvent.Type.DELETED) || type.equals(ModuleFileEvent.Type.MODIFIED)) { - removeFile(target); + if (!indexingEnabled) { + return; } - if (type.equals(ModuleFileEvent.Type.CREATED) || type.equals(ModuleFileEvent.Type.MODIFIED)) { - try { - addFile(target); - } catch (IOException e) { - LOG.debug("Failed to load file \"{}\" ({}) to the project symbol table", target.wrappedFile().filename(), type); + ModuleFileEvent.Type type = moduleFileEvent.getType(); + try { + PackageRootImpact packageRootImpact = packageRootImpact(target, type); + if (pythonFile) { + packageRootState.update(target, type, packageRootImpact.candidateRoot()); + updateKnownMainFile(target, type, mainPythonFile); + } + + if (packageRootImpact.canImpactRoots() && refreshPackageRoots()) { + rebuildProjectIndex(); + } else if (mainPythonFile) { + addFileIfCreatedOrModified(target, type); } + } catch (Exception e) { + indexedFiles.remove(target.wrappedFile().absolutePath()); + LOG.debug("Failed to load file \"{}\" ({}) to the project symbol table", target.wrappedFile().filename(), type, e); } } } diff --git a/python-commons/src/main/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexer.java b/python-commons/src/main/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexer.java index 510e6f2e3..f3af3baa2 100644 --- a/python-commons/src/main/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexer.java +++ b/python-commons/src/main/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexer.java @@ -63,7 +63,11 @@ public class SonarQubePythonIndexer extends PythonIndexer { public SonarQubePythonIndexer(List inputFiles, CacheContext cacheContext, SensorContext context, ProjectConfigurationBuilder projectConfigurationBuilder) { super(projectConfigurationBuilder); - this.projectBaseDirAbsolutePath = context.fileSystem().baseDir().getAbsolutePath(); + // Package roots are resolved once from the current filesystem, which already reflects all + // PR changes (including __init__.py additions or deletions). All FQNs computed below use + // these roots, so they remain consistent for the entire analysis run — no mid-run + // recomputation is needed. This differs from SonarLint, which must refresh roots on every + // incremental file event because its indexer persists across multiple analysis runs. this.packageRoots = resolvePackageRoots(context); this.caching = new Caching(cacheContext, getCacheVersion(context)); this.testSourcesConfigured = TestSourceConfiguration.isConfigured(context.config()); diff --git a/python-commons/src/test/java/org/sonar/plugins/python/indexer/NamespacePackageAnalyzerTest.java b/python-commons/src/test/java/org/sonar/plugins/python/indexer/NamespacePackageAnalyzerTest.java index 4adf497c7..e5892636d 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/indexer/NamespacePackageAnalyzerTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/indexer/NamespacePackageAnalyzerTest.java @@ -257,10 +257,10 @@ void telemetry_with_resolution_info_can_be_created() { NamespacePackageTelemetry baseTelemetry = analyzer.analyze(emptyTree); NamespacePackageTelemetry withResolution = baseTelemetry.withResolutionInfo( - PackageResolutionResult.ResolutionMethod.PYPROJECT_TOML, + PackageResolutionResult.PrimaryResolutionMethod.PYPROJECT_TOML, PackageResolutionResult.BuildSystem.SETUPTOOLS); - assertThat(withResolution.resolutionMethod()).isEqualTo(PackageResolutionResult.ResolutionMethod.PYPROJECT_TOML); + assertThat(withResolution.resolutionMethod()).isEqualTo(PackageResolutionResult.PrimaryResolutionMethod.PYPROJECT_TOML); assertThat(withResolution.buildSystem()).isEqualTo(PackageResolutionResult.BuildSystem.SETUPTOOLS); // Original values preserved assertThat(withResolution.packagesWithInit()).isEqualTo(baseTelemetry.packagesWithInit()); diff --git a/python-commons/src/test/java/org/sonar/plugins/python/indexer/PackageResolutionResultTest.java b/python-commons/src/test/java/org/sonar/plugins/python/indexer/PackageResolutionResultTest.java index 20b146801..419a4d632 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/indexer/PackageResolutionResultTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/indexer/PackageResolutionResultTest.java @@ -29,7 +29,7 @@ void fromPyProjectToml_creates_correct_result() { var result = PackageResolutionResult.fromPyProjectToml(roots, PackageResolutionResult.BuildSystem.SETUPTOOLS); assertThat(result.roots()).containsExactly("/project/src"); - assertThat(result.method()).isEqualTo(PackageResolutionResult.ResolutionMethod.PYPROJECT_TOML); + assertThat(result.method()).isEqualTo(PackageResolutionResult.PrimaryResolutionMethod.PYPROJECT_TOML); assertThat(result.buildSystem()).isEqualTo(PackageResolutionResult.BuildSystem.SETUPTOOLS); } @@ -39,7 +39,7 @@ void fromSetupPy_creates_correct_result() { var result = PackageResolutionResult.fromSetupPy(roots); assertThat(result.roots()).containsExactly("/project/src"); - assertThat(result.method()).isEqualTo(PackageResolutionResult.ResolutionMethod.SETUP_PY); + assertThat(result.method()).isEqualTo(PackageResolutionResult.PrimaryResolutionMethod.SETUP_PY); assertThat(result.buildSystem()).isEqualTo(PackageResolutionResult.BuildSystem.NONE); } @@ -49,7 +49,7 @@ void fromSonarSources_creates_correct_result() { var result = PackageResolutionResult.fromSonarSources(roots); assertThat(result.roots()).containsExactly("/project/src", "/project/lib"); - assertThat(result.method()).isEqualTo(PackageResolutionResult.ResolutionMethod.SONAR_SOURCES); + assertThat(result.method()).isEqualTo(PackageResolutionResult.PrimaryResolutionMethod.SONAR_SOURCES); assertThat(result.buildSystem()).isEqualTo(PackageResolutionResult.BuildSystem.NONE); } @@ -59,7 +59,7 @@ void fromConventionalFolders_creates_correct_result() { var result = PackageResolutionResult.fromConventionalFolders(roots); assertThat(result.roots()).containsExactly("/project/src"); - assertThat(result.method()).isEqualTo(PackageResolutionResult.ResolutionMethod.CONVENTIONAL_FOLDERS); + assertThat(result.method()).isEqualTo(PackageResolutionResult.PrimaryResolutionMethod.CONVENTIONAL_FOLDERS); assertThat(result.buildSystem()).isEqualTo(PackageResolutionResult.BuildSystem.NONE); } @@ -69,7 +69,17 @@ void fromBaseDir_creates_correct_result() { var result = PackageResolutionResult.fromBaseDir(roots); assertThat(result.roots()).containsExactly("/project"); - assertThat(result.method()).isEqualTo(PackageResolutionResult.ResolutionMethod.BASE_DIR); + assertThat(result.method()).isEqualTo(PackageResolutionResult.PrimaryResolutionMethod.BASE_DIR); + assertThat(result.buildSystem()).isEqualTo(PackageResolutionResult.BuildSystem.NONE); + } + + @Test + void fromLegacyInitPy_creates_correct_result() { + List roots = List.of("/project", "/project/other"); + var result = PackageResolutionResult.fromLegacyInitPy(roots); + + assertThat(result.roots()).containsExactly("/project", "/project/other"); + assertThat(result.method()).isEqualTo(PackageResolutionResult.PrimaryResolutionMethod.LEGACY_INIT_PY); assertThat(result.buildSystem()).isEqualTo(PackageResolutionResult.BuildSystem.NONE); } @@ -90,14 +100,14 @@ void all_build_systems_exist() { @Test void all_resolution_methods_exist() { - assertThat(PackageResolutionResult.ResolutionMethod.values()).containsExactly( - PackageResolutionResult.ResolutionMethod.PYPROJECT_TOML, - PackageResolutionResult.ResolutionMethod.SETUP_PY, - PackageResolutionResult.ResolutionMethod.PYPROJECT_AND_SETUP_PY, - PackageResolutionResult.ResolutionMethod.SONAR_SOURCES, - PackageResolutionResult.ResolutionMethod.CONVENTIONAL_FOLDERS, - PackageResolutionResult.ResolutionMethod.BASE_DIR, - PackageResolutionResult.ResolutionMethod.LEGACY_INIT_PY + assertThat(PackageResolutionResult.PrimaryResolutionMethod.values()).containsExactly( + PackageResolutionResult.PrimaryResolutionMethod.PYPROJECT_TOML, + PackageResolutionResult.PrimaryResolutionMethod.SETUP_PY, + PackageResolutionResult.PrimaryResolutionMethod.PYPROJECT_AND_SETUP_PY, + PackageResolutionResult.PrimaryResolutionMethod.SONAR_SOURCES, + PackageResolutionResult.PrimaryResolutionMethod.CONVENTIONAL_FOLDERS, + PackageResolutionResult.PrimaryResolutionMethod.BASE_DIR, + PackageResolutionResult.PrimaryResolutionMethod.LEGACY_INIT_PY ); } @@ -107,7 +117,7 @@ void fromBothPyProjectAndSetupPy_creates_correct_result() { var result = PackageResolutionResult.fromBothPyProjectAndSetupPy(roots, PackageResolutionResult.BuildSystem.SETUPTOOLS); assertThat(result.roots()).containsExactly("/project/src", "/project/lib"); - assertThat(result.method()).isEqualTo(PackageResolutionResult.ResolutionMethod.PYPROJECT_AND_SETUP_PY); + assertThat(result.method()).isEqualTo(PackageResolutionResult.PrimaryResolutionMethod.PYPROJECT_AND_SETUP_PY); assertThat(result.buildSystem()).isEqualTo(PackageResolutionResult.BuildSystem.SETUPTOOLS); } } diff --git a/python-commons/src/test/java/org/sonar/plugins/python/indexer/PackageRootResolverTest.java b/python-commons/src/test/java/org/sonar/plugins/python/indexer/PackageRootResolverTest.java index 36e3b7c0c..21017fbae 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/indexer/PackageRootResolverTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/indexer/PackageRootResolverTest.java @@ -21,9 +21,11 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.List; +import org.junit.jupiter.api.Assumptions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import org.sonar.api.batch.fs.FileSystem; +import org.sonar.api.batch.fs.InputFile; import org.sonar.api.config.Configuration; import static org.assertj.core.api.Assertions.assertThat; @@ -35,7 +37,7 @@ class PackageRootResolverTest { @TempDir Path tempDir; - // ─── Helper ──────────────────────────────────────────────────────────────── + // ─── Helpers ─────────────────────────────────────────────────────────────── private FileSystem mockFileSystem(File baseDir) { FileSystem fs = mock(FileSystem.class); @@ -43,6 +45,12 @@ private FileSystem mockFileSystem(File baseDir) { return fs; } + private InputFile mockInputFile(File file) { + InputFile inputFile = mock(InputFile.class); + when(inputFile.file()).thenReturn(file); + return inputFile; + } + private Configuration noSonarSources() { Configuration config = mock(Configuration.class); when(config.getStringArray("sonar.sources")).thenReturn(new String[0]); @@ -58,38 +66,187 @@ private Configuration sonarSources(String... values) { // ─── resolve() — no build config files → LEGACY_INIT_PY ────────────────── @Test - void resolve_noBuildConfigFiles_returnsLegacyInitPy() { + void resolve_noBuildConfigFiles_noPythonFiles_returnsBaseDirAsRoot() { + File baseDir = tempDir.toFile(); + + PackageResolutionResult result = PackageRootResolver.resolve(mockFileSystem(baseDir), noSonarSources(), List.of()); + + assertThat(result.roots()).containsExactly(baseDir.getAbsolutePath()); + assertThat(result.method()).isEqualTo(PackageResolutionResult.PrimaryResolutionMethod.LEGACY_INIT_PY); + } + + @Test + void resolve_inaccessibleBaseDir_fallsBackToLegacyResolution() { + File missingBaseDir = tempDir.resolve("missing").toFile(); + + PackageResolutionResult result = PackageRootResolver.resolve(mockFileSystem(missingBaseDir), noSonarSources(), List.of()); + + assertThat(result.roots()).containsExactly(missingBaseDir.getAbsolutePath()); + assertThat(result.method()).isEqualTo(PackageResolutionResult.PrimaryResolutionMethod.LEGACY_INIT_PY); + } + + @Test + void resolve_noBuildConfigFiles_filesWithNoInitPy_returnsParentDirsAsRoots() throws IOException { + // Files with no __init__.py in their parent: root is the parent dir itself File baseDir = tempDir.toFile(); + File pkgDir = tempDir.resolve("mypkg").toFile(); + pkgDir.mkdir(); + File pyFile = new File(pkgDir, "module.py"); + pyFile.createNewFile(); - PackageResolutionResult result = PackageRootResolver.resolve(mockFileSystem(baseDir), noSonarSources()); + PackageResolutionResult result = PackageRootResolver.resolve( + mockFileSystem(baseDir), noSonarSources(), List.of(mockInputFile(pyFile))); - assertThat(result.roots()).isEmpty(); - assertThat(result.method()).isEqualTo(PackageResolutionResult.ResolutionMethod.LEGACY_INIT_PY); + // mypkg/ has no __init__.py, so root is mypkg/ itself + assertThat(result.roots()).containsExactly(pkgDir.getAbsolutePath()); + assertThat(result.method()).isEqualTo(PackageResolutionResult.PrimaryResolutionMethod.LEGACY_INIT_PY); } @Test - void resolve_noBuildConfigFiles_srcFolderPresent_stillReturnsLegacyInitPy() throws IOException { - // Conventional folders are ignored when no build config files exist + void resolve_noBuildConfigFiles_filesWithInitPy_walksUpToFindRoot() throws IOException { + // pkg/__init__.py exists → root walks up to baseDir + File baseDir = tempDir.toFile(); + File pkgDir = tempDir.resolve("mypkg").toFile(); + pkgDir.mkdir(); + new File(pkgDir, "__init__.py").createNewFile(); + File pyFile = new File(pkgDir, "module.py"); + pyFile.createNewFile(); + + PackageResolutionResult result = PackageRootResolver.resolve( + mockFileSystem(baseDir), noSonarSources(), List.of(mockInputFile(pyFile))); + + // mypkg/ has __init__.py → walk up → baseDir has no __init__.py → root = baseDir + assertThat(result.roots()).containsExactly(baseDir.getAbsolutePath()); + assertThat(result.method()).isEqualTo(PackageResolutionResult.PrimaryResolutionMethod.LEGACY_INIT_PY); + } + + @Test + void resolve_noBuildConfigFiles_srcFolderPresent_stillComputesLegacyRoots() throws IOException { + // Conventional folders are irrelevant when no build config files exist; roots come from __init__.py walk Files.createDirectory(tempDir.resolve("src")); File baseDir = tempDir.toFile(); + File pkgDir = tempDir.resolve("mypkg").toFile(); + pkgDir.mkdir(); + new File(pkgDir, "__init__.py").createNewFile(); + File pyFile = new File(pkgDir, "module.py"); + pyFile.createNewFile(); - PackageResolutionResult result = PackageRootResolver.resolve(mockFileSystem(baseDir), noSonarSources()); + PackageResolutionResult result = PackageRootResolver.resolve( + mockFileSystem(baseDir), noSonarSources(), List.of(mockInputFile(pyFile))); - assertThat(result.roots()).isEmpty(); - assertThat(result.method()).isEqualTo(PackageResolutionResult.ResolutionMethod.LEGACY_INIT_PY); + assertThat(result.roots()).containsExactly(baseDir.getAbsolutePath()); + assertThat(result.method()).isEqualTo(PackageResolutionResult.PrimaryResolutionMethod.LEGACY_INIT_PY); } @Test - void resolve_noBuildConfigFiles_sonarSourcesIgnored() { + void resolve_noBuildConfigFiles_sonarSourcesIgnored() throws IOException { // sonar.sources is also irrelevant when no build config files exist File baseDir = tempDir.toFile(); + File pkgDir = tempDir.resolve("mypkg").toFile(); + pkgDir.mkdir(); + new File(pkgDir, "__init__.py").createNewFile(); + File pyFile = new File(pkgDir, "module.py"); + pyFile.createNewFile(); + + PackageResolutionResult result = PackageRootResolver.resolve( + mockFileSystem(baseDir), sonarSources("."), List.of(mockInputFile(pyFile))); + + assertThat(result.roots()).containsExactly(baseDir.getAbsolutePath()); + assertThat(result.method()).isEqualTo(PackageResolutionResult.PrimaryResolutionMethod.LEGACY_INIT_PY); + } + + @Test + void resolve_noBuildConfigFiles_multiplePackages_multipleRootsSortedDeepestFirst() throws IOException { + // Two independent packages at different depths → two roots, sorted deepest first + File baseDir = tempDir.toFile(); + + File shallowDir = tempDir.resolve("shallow").toFile(); + shallowDir.mkdir(); + new File(shallowDir, "__init__.py").createNewFile(); + File shallowFile = new File(shallowDir, "mod.py"); + shallowFile.createNewFile(); + + File deepParentDir = tempDir.resolve("deep").toFile(); + deepParentDir.mkdir(); + File deepPkgDir = new File(deepParentDir, "nested"); + deepPkgDir.mkdir(); + new File(deepPkgDir, "__init__.py").createNewFile(); + File deepFile = new File(deepPkgDir, "mod.py"); + deepFile.createNewFile(); + + PackageResolutionResult result = PackageRootResolver.resolve( + mockFileSystem(baseDir), noSonarSources(), + List.of(mockInputFile(shallowFile), mockInputFile(deepFile))); + + // shallow/ has __init__.py → root = baseDir + // deep/nested/ has __init__.py, deep/ does not → root = deep/ + // Roots sorted deepest-first: deep/ (deeper path) before baseDir + assertThat(result.roots()).containsExactly( + deepParentDir.getAbsolutePath(), + baseDir.getAbsolutePath()); + assertThat(result.method()).isEqualTo(PackageResolutionResult.PrimaryResolutionMethod.LEGACY_INIT_PY); + } + + @Test + void resolve_noBuildConfigFiles_nestedInitPyChain_walksUpToCorrectRoot() throws IOException { + // level1/__init__.py, level1/level2/__init__.py, level1/level2/level3/__init__.py + // file at level3/ → root should be baseDir + File baseDir = tempDir.toFile(); + File l1 = new File(baseDir, "level1"); + File l2 = new File(l1, "level2"); + File l3 = new File(l2, "level3"); + l3.mkdirs(); + new File(l1, "__init__.py").createNewFile(); + new File(l2, "__init__.py").createNewFile(); + new File(l3, "__init__.py").createNewFile(); + File pyFile = new File(l3, "mod.py"); + pyFile.createNewFile(); + + PackageResolutionResult result = PackageRootResolver.resolve( + mockFileSystem(baseDir), noSonarSources(), List.of(mockInputFile(pyFile))); + + assertThat(result.roots()).containsExactly(baseDir.getAbsolutePath()); + assertThat(result.method()).isEqualTo(PackageResolutionResult.PrimaryResolutionMethod.LEGACY_INIT_PY); + } - PackageResolutionResult result = PackageRootResolver.resolve(mockFileSystem(baseDir), sonarSources(".")); + @Test + void resolve_noBuildConfigFiles_initPyGap_stopsAtGap() throws IOException { + // top/ (no __init__.py), top/mid/__init__.py, top/mid/bottom/__init__.py + // file at bottom/ → root = top/ (first parent without __init__.py) + File baseDir = tempDir.toFile(); + File top = new File(baseDir, "top"); + File mid = new File(top, "mid"); + File bottom = new File(mid, "bottom"); + bottom.mkdirs(); + new File(mid, "__init__.py").createNewFile(); + new File(bottom, "__init__.py").createNewFile(); + File pyFile = new File(bottom, "mod.py"); + pyFile.createNewFile(); + + PackageResolutionResult result = PackageRootResolver.resolve( + mockFileSystem(baseDir), noSonarSources(), List.of(mockInputFile(pyFile))); + + // bottom has __init__.py → up to mid (has __init__.py) → up to top (no __init__.py) → root = top + assertThat(result.roots()).containsExactly(top.getAbsolutePath()); + assertThat(result.method()).isEqualTo(PackageResolutionResult.PrimaryResolutionMethod.LEGACY_INIT_PY); + } - assertThat(result.roots()).isEmpty(); - assertThat(result.method()).isEqualTo(PackageResolutionResult.ResolutionMethod.LEGACY_INIT_PY); + @Test + void resolve_noBuildConfigFiles_fileAtBaseDir_producesBaseDirAsRoot() throws IOException { + File baseDir = tempDir.toFile(); + File pyFile = new File(baseDir, "script.py"); + pyFile.createNewFile(); + + PackageResolutionResult result = PackageRootResolver.resolve( + mockFileSystem(baseDir), noSonarSources(), List.of(mockInputFile(pyFile))); + + // File is directly in baseDir, which has no __init__.py → root = baseDir + assertThat(result.roots()).containsExactly(baseDir.getAbsolutePath()); + assertThat(result.method()).isEqualTo(PackageResolutionResult.PrimaryResolutionMethod.LEGACY_INIT_PY); } + // ─── resolve() — build config files present ─────────────────────────────── + @Test void resolve_buildFileExistsNoRoots_conventionalFoldersTakePriorityOverSonarSources() throws IOException { // pyproject.toml exists but provides no source roots; src/ exists; sonar.sources set @@ -98,10 +255,10 @@ void resolve_buildFileExistsNoRoots_conventionalFoldersTakePriorityOverSonarSour Files.writeString(tempDir.resolve("pyproject.toml"), "[project]\nname = \"myproject\"\n"); File baseDir = tempDir.toFile(); - PackageResolutionResult result = PackageRootResolver.resolve(mockFileSystem(baseDir), sonarSources("app")); + PackageResolutionResult result = PackageRootResolver.resolve(mockFileSystem(baseDir), sonarSources("app"), List.of()); assertThat(result.roots()).containsExactly(new File(baseDir, "src").getAbsolutePath()); - assertThat(result.method()).isEqualTo(PackageResolutionResult.ResolutionMethod.CONVENTIONAL_FOLDERS); + assertThat(result.method()).isEqualTo(PackageResolutionResult.PrimaryResolutionMethod.CONVENTIONAL_FOLDERS); } @Test @@ -110,10 +267,10 @@ void resolve_buildFileExistsNoRoots_fallsBackToSonarSources() throws IOException Files.writeString(tempDir.resolve("pyproject.toml"), "[project]\nname = \"myproject\"\n"); File baseDir = tempDir.toFile(); - PackageResolutionResult result = PackageRootResolver.resolve(mockFileSystem(baseDir), sonarSources("mysrc")); + PackageResolutionResult result = PackageRootResolver.resolve(mockFileSystem(baseDir), sonarSources("mysrc"), List.of()); assertThat(result.roots()).containsExactly(new File(baseDir, "mysrc").getAbsolutePath()); - assertThat(result.method()).isEqualTo(PackageResolutionResult.ResolutionMethod.SONAR_SOURCES); + assertThat(result.method()).isEqualTo(PackageResolutionResult.PrimaryResolutionMethod.SONAR_SOURCES); } @Test @@ -123,10 +280,66 @@ void resolve_setupPyExistsNoRoots_conventionalFoldersTakePriorityOverSonarSource Files.writeString(tempDir.resolve("setup.py"), "# empty\n"); File baseDir = tempDir.toFile(); - PackageResolutionResult result = PackageRootResolver.resolve(mockFileSystem(baseDir), sonarSources("app")); + PackageResolutionResult result = PackageRootResolver.resolve(mockFileSystem(baseDir), sonarSources("app"), List.of()); assertThat(result.roots()).containsExactly(new File(baseDir, "src").getAbsolutePath()); - assertThat(result.method()).isEqualTo(PackageResolutionResult.ResolutionMethod.CONVENTIONAL_FOLDERS); + assertThat(result.method()).isEqualTo(PackageResolutionResult.PrimaryResolutionMethod.CONVENTIONAL_FOLDERS); + } + + @Test + void resolve_conventionalFoldersFallback_augmentsWithUncoveredFileRoots() throws IOException { + // pyproject.toml exists but provides no source roots; src/ exists (conventional folder); + // a test file lives under tests/ with __init__.py (outside src/). + // The fallback should augment the conventional root with a legacy root for the test file. + File baseDir = tempDir.toFile(); + Files.createDirectory(tempDir.resolve("src")); + Files.writeString(tempDir.resolve("pyproject.toml"), "[project]\nname = \"myproject\"\n"); + + File testsDir = tempDir.resolve("tests").toFile(); + testsDir.mkdir(); + new File(testsDir, "__init__.py").createNewFile(); + File testFile = new File(testsDir, "test_app.py"); + testFile.createNewFile(); + + PackageResolutionResult result = PackageRootResolver.resolve( + mockFileSystem(baseDir), noSonarSources(), List.of(mockInputFile(testFile))); + + // src/ from conventional folders + baseDir from legacy walk-up (tests/ has __init__.py) + assertThat(result.roots()).containsExactlyInAnyOrder( + new File(baseDir, "src").getAbsolutePath(), + baseDir.getAbsolutePath()); + assertThat(result.method()).isEqualTo(PackageResolutionResult.PrimaryResolutionMethod.CONVENTIONAL_FOLDERS); + + // Verify FQN for the test file + String testPackageName = org.sonar.python.semantic.SymbolUtils.pythonPackageName(testFile, result.roots()); + assertThat(testPackageName).isEqualTo("tests"); + } + + @Test + void resolve_sonarSourcesFallback_augmentsWithUncoveredFileRoots() throws IOException { + // pyproject.toml exists but provides no source roots; no conventional folders; + // sonar.sources=app; a test file lives under tests/ with __init__.py (outside app/). + File baseDir = tempDir.toFile(); + Files.writeString(tempDir.resolve("pyproject.toml"), "[project]\nname = \"myproject\"\n"); + + File testsDir = tempDir.resolve("tests").toFile(); + testsDir.mkdir(); + new File(testsDir, "__init__.py").createNewFile(); + File testFile = new File(testsDir, "test_app.py"); + testFile.createNewFile(); + + PackageResolutionResult result = PackageRootResolver.resolve( + mockFileSystem(baseDir), sonarSources("app"), List.of(mockInputFile(testFile))); + + // app/ from sonar.sources + baseDir from legacy walk-up (tests/ has __init__.py) + assertThat(result.roots()).containsExactlyInAnyOrder( + new File(baseDir, "app").getAbsolutePath(), + baseDir.getAbsolutePath()); + assertThat(result.method()).isEqualTo(PackageResolutionResult.PrimaryResolutionMethod.SONAR_SOURCES); + + // Verify FQN for the test file + String testPackageName = org.sonar.python.semantic.SymbolUtils.pythonPackageName(testFile, result.roots()); + assertThat(testPackageName).isEqualTo("tests"); } // ─── toAbsolutePaths() — normalization ──────────────────────────────────── @@ -178,7 +391,7 @@ void toAbsolutePaths_windowsAbsolutePathWithForwardSlashes_notPrependedWithBaseD // Must not produce "/project/base/" prepended to the Windows path // Forward slashes are preserved as-is by Path.normalize() on non-Windows systems assertThat(result).hasSize(1); - assertThat(result.get(0)).isIn("C:\\Users\\user\\mixed-language-build","C:/Users/user/mixed-language-build"); + assertThat(result.get(0)).isIn("C:\\Users\\user\\mixed-language-build", "C:/Users/user/mixed-language-build"); } @Test @@ -189,9 +402,9 @@ void trySonarSources_windowsAbsolutePath_usedDirectlyNotPrependedWithBaseDir() t File baseDir = tempDir.toFile(); String windowsAbsPath = "C:\\Users\\user\\mixed-language-build"; - PackageResolutionResult result = PackageRootResolver.resolve(mockFileSystem(baseDir), sonarSources(windowsAbsPath)); + PackageResolutionResult result = PackageRootResolver.resolve(mockFileSystem(baseDir), sonarSources(windowsAbsPath), List.of()); - assertThat(result.method()).isEqualTo(PackageResolutionResult.ResolutionMethod.SONAR_SOURCES); + assertThat(result.method()).isEqualTo(PackageResolutionResult.PrimaryResolutionMethod.SONAR_SOURCES); assertThat(result.roots()).hasSize(1); assertThat(result.roots()).containsExactly("C:\\Users\\user\\mixed-language-build"); } @@ -208,6 +421,32 @@ void adjustPackageRoot_noInitPy(@TempDir Path localTempDir) { assertThat(result).isEqualTo(srcDir.getAbsolutePath()); } + @Test + void adjustPackageRoot_preservesBaseDirAliasForDerivedRoot(@TempDir Path localTempDir) throws IOException { + Path realBaseDir = Files.createDirectories(localTempDir.resolve("real")); + Path derivedRoot = Files.createDirectories(realBaseDir.resolve("tests/unit")); + Path aliasBaseDir = localTempDir.resolve("alias"); + try { + Files.createSymbolicLink(aliasBaseDir, realBaseDir); + } catch (UnsupportedOperationException | IOException | SecurityException e) { + Assumptions.assumeTrue(false, "Symbolic links are not available: " + e.getMessage()); + } + + String result = PackageRootResolver.adjustPackageRoot(derivedRoot.toFile(), aliasBaseDir.toFile()); + + assertThat(result).isEqualTo(aliasBaseDir.resolve("tests/unit").toAbsolutePath().toString()); + } + + @Test + void adjustPackageRoot_preservesRootOutsideBaseDir(@TempDir Path localTempDir) throws IOException { + File baseDir = Files.createDirectory(localTempDir.resolve("project")).toFile(); + File externalRoot = Files.createDirectory(localTempDir.resolve("external")).toFile(); + + String result = PackageRootResolver.adjustPackageRoot(externalRoot, baseDir); + + assertThat(result).isEqualTo(externalRoot.getAbsolutePath()); + } + @Test void adjustPackageRoot_withInitPy_walksUp(@TempDir Path localTempDir) throws Exception { File baseDir = localTempDir.toFile(); @@ -296,4 +535,179 @@ void adjustPackageRoot_singleLevelWithInitPy(@TempDir Path localTempDir) throws String result = PackageRootResolver.adjustPackageRoot(packageDir, baseDir); assertThat(result).isEqualTo(baseDir.getAbsolutePath()); } + + // ─── computePackageRootsFromFiles() ────────────────────────────────────── + + @Test + void computePackageRootsFromFiles_empty_returns_baseDir(@TempDir Path localTempDir) { + File baseDir = localTempDir.toFile(); + List roots = PackageRootResolver.computePackageRootsFromFiles(List.of(), baseDir); + assertThat(roots).containsExactly(baseDir.getAbsolutePath()); + } + + @Test + void computePackageRootsFromFiles_walks_up_init_py_chain(@TempDir Path localTempDir) throws Exception { + // pkg/__init__.py exists → pkg/ is a package, root should be localTempDir (parent of pkg) + File pkgDir = localTempDir.resolve("pkg").toFile(); + pkgDir.mkdirs(); + new File(pkgDir, "__init__.py").createNewFile(); + File module = new File(pkgDir, "mod.py"); + module.createNewFile(); + + List roots = PackageRootResolver.computePackageRootsFromFiles(List.of(module), localTempDir.toFile()); + assertThat(roots).containsExactly(localTempDir.toFile().getAbsolutePath()); + } + + // ─── augmentWithUncoveredFileRoots — files outside build-config roots ─── + + @Test + void resolve_setupPyWithPackageDir_testsDirOutsideSrcRoot_augmentedWithLegacyRoot() throws IOException { + // Reproduces the 'black' project scenario: + // - setup.py declares package_dir={"": "src"} + // - Tests live under tests/ with __init__.py (outside src/) + // - The resolver must add a root for tests/ files so they get correct package names + File baseDir = tempDir.toFile(); + + File srcDir = tempDir.resolve("src").toFile(); + File blackPkg = new File(srcDir, "black"); + blackPkg.mkdirs(); + new File(blackPkg, "__init__.py").createNewFile(); + File srcModule = new File(blackPkg, "linegen.py"); + srcModule.createNewFile(); + + File testsDir = tempDir.resolve("tests").toFile(); + testsDir.mkdirs(); + new File(testsDir, "__init__.py").createNewFile(); + File testFile = new File(testsDir, "test_black.py"); + testFile.createNewFile(); + + Files.writeString(tempDir.resolve("setup.py"), """ + from setuptools import setup, find_packages + setup(packages=find_packages(where='src'), package_dir={'': 'src'})"""); + + List pythonFiles = List.of(mockInputFile(srcModule), mockInputFile(testFile)); + PackageResolutionResult result = PackageRootResolver.resolve(mockFileSystem(baseDir), noSonarSources(), pythonFiles); + + assertThat(result.roots()).contains(srcDir.getAbsolutePath()); + // tests/ has __init__.py so the legacy root for test_black.py is baseDir + assertThat(result.roots()).contains(baseDir.getAbsolutePath()); + + // Verify that test_black.py gets the correct package name + String testPackageName = org.sonar.python.semantic.SymbolUtils.pythonPackageName(testFile, result.roots()); + assertThat(testPackageName).isEqualTo("tests"); + } + + @Test + void resolve_setupPyWithPackageDir_allFilesCovered_noAugmentation() throws IOException { + // When all files are under the build-config root, no extra roots are added + File baseDir = tempDir.toFile(); + + File srcDir = tempDir.resolve("src").toFile(); + File pkg = new File(srcDir, "mypackage"); + pkg.mkdirs(); + new File(pkg, "__init__.py").createNewFile(); + File module = new File(pkg, "mod.py"); + module.createNewFile(); + + Files.writeString(tempDir.resolve("setup.py"),""" + from setuptools import setup, find_packages + setup(packages=find_packages(where='src'), package_dir={'': 'src'})"""); + + List pythonFiles = List.of(mockInputFile(module)); + PackageResolutionResult result = PackageRootResolver.resolve(mockFileSystem(baseDir), noSonarSources(), pythonFiles); + + assertThat(result.roots()).containsExactly(srcDir.getAbsolutePath()); + } + + @Test + void resolve_setupPyWithMultipleRoots_allFilesCovered_rootsSortedDeepestFirst() throws IOException { + // When all files are covered (no augmentation), roots must still be sorted deepest-first. + // This verifies the fix for the early-return path in augmentWithUncoveredFileRoots. + File baseDir = tempDir.toFile(); + + // Create two source roots at different depths: src/ (shallow) and src/extra/nested/ (deep) + File srcDir = tempDir.resolve("src").toFile(); + File shallowPkg = new File(srcDir, "shallowpkg"); + shallowPkg.mkdirs(); + new File(shallowPkg, "__init__.py").createNewFile(); + File shallowModule = new File(shallowPkg, "mod.py"); + shallowModule.createNewFile(); + + File extraNested = new File(srcDir, "extra/nested"); + File deepPkg = new File(extraNested, "deeppkg"); + deepPkg.mkdirs(); + new File(deepPkg, "__init__.py").createNewFile(); + File deepModule = new File(deepPkg, "mod.py"); + deepModule.createNewFile(); + + // setup.py declares both src/ and src/extra/nested/ as package dirs + Files.writeString(tempDir.resolve("setup.py"), """ + from setuptools import setup, find_packages + setup( + packages=find_packages(where='src') + find_packages(where='src/extra/nested'), + package_dir={'': 'src', 'deeppkg': 'src/extra/nested/deeppkg'}, + )"""); + + // All files are under declared roots, so no augmentation occurs + List pythonFiles = List.of(mockInputFile(shallowModule), mockInputFile(deepModule)); + PackageResolutionResult result = PackageRootResolver.resolve(mockFileSystem(baseDir), noSonarSources(), pythonFiles); + + // Roots must be sorted deepest-first: src/extra/nested before src + assertThat(result.roots()).containsExactly( + extraNested.getAbsolutePath(), + srcDir.getAbsolutePath()); + } + + @Test + void computePackageRootsFromFiles_multiple_roots_sorted_deepest_first(@TempDir Path localTempDir) throws Exception { + // pkgA/__init__.py → root = localTempDir (shallow) + File pkgA = localTempDir.resolve("pkgA").toFile(); + pkgA.mkdirs(); + new File(pkgA, "__init__.py").createNewFile(); + File modA = new File(pkgA, "mod.py"); + modA.createNewFile(); + + // dir/pkgB/__init__.py → root = dir/ (deeper path) + File dir = localTempDir.resolve("dir").toFile(); + File pkgB = new File(dir, "pkgB"); + pkgB.mkdirs(); + new File(pkgB, "__init__.py").createNewFile(); + File modB = new File(pkgB, "mod.py"); + modB.createNewFile(); + + List roots = PackageRootResolver.computePackageRootsFromFiles(List.of(modA, modB), localTempDir.toFile()); + // dir/ is deeper (more separators) than localTempDir → dir/ comes first + assertThat(roots).containsExactly( + dir.getAbsolutePath(), + localTempDir.toFile().getAbsolutePath()); + } + + @Test + void computePackageRootsFromFiles_same_depth_sorted_alphabetically(@TempDir Path localTempDir) throws Exception { + // Two roots at the same depth should be sorted alphabetically + File baseDir = localTempDir.toFile(); + + // beta/pkgB/__init__.py → root = beta/ + File betaDir = localTempDir.resolve("beta").toFile(); + File pkgB = new File(betaDir, "pkgB"); + pkgB.mkdirs(); + new File(pkgB, "__init__.py").createNewFile(); + File modB = new File(pkgB, "mod.py"); + modB.createNewFile(); + + // alpha/pkgA/__init__.py → root = alpha/ + File alphaDir = localTempDir.resolve("alpha").toFile(); + File pkgA = new File(alphaDir, "pkgA"); + pkgA.mkdirs(); + new File(pkgA, "__init__.py").createNewFile(); + File modA = new File(pkgA, "mod.py"); + modA.createNewFile(); + + // Pass files in reverse alphabetical order to verify sorting is applied + List roots = PackageRootResolver.computePackageRootsFromFiles(List.of(modB, modA), baseDir); + // Same depth → alphabetical: alpha/ before beta/ + assertThat(roots).containsExactly( + alphaDir.getAbsolutePath(), + betaDir.getAbsolutePath()); + } } diff --git a/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarLintPythonIndexerTest.java b/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarLintPythonIndexerTest.java index 5d54031c8..418e5e9c6 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarLintPythonIndexerTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarLintPythonIndexerTest.java @@ -28,6 +28,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; +import org.junit.jupiter.api.io.TempDir; import org.slf4j.event.Level; import org.sonar.api.batch.fs.InputFile; import com.sonarsource.scanner.engine.sensor.test.fixtures.TestInputFileBuilder; @@ -49,11 +50,16 @@ import org.sonar.python.caching.DummyCache; import org.sonar.python.project.config.ProjectConfigurationBuilder; import org.sonar.python.semantic.ProjectLevelSymbolTable; +import org.sonar.scanner.plugin.api.impl.config.MapSettings; import org.sonarsource.sonarlint.plugin.api.module.file.ModuleFileEvent; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; class SonarLintPythonIndexerTest { @@ -178,6 +184,397 @@ void test_indexer_modified_file() { assertThat(modAddSymbol).isNotNull(); } + @Test + void incremental_update_preserves_build_config_roots(@TempDir Path projectDir) throws IOException { + Files.createDirectories(projectDir.resolve("src/acme")); + Files.writeString(projectDir.resolve("setup.py"), "setup(package_dir={'': 'src'}, packages=['acme'])"); + PythonInputFile module = inputFile(projectDir, "src/acme/mod.py", "def original():\n pass\n"); + var localContext = SensorContextTester.create(projectDir.toFile()); + localContext.fileSystem().add(module.wrappedFile()); + var localIndexer = new SonarLintPythonIndexer( + new TestModuleFileSystem(new ArrayList<>(List.of(module))), new ProjectConfigurationBuilder()); + + localIndexer.buildOnce(localContext); + + assertThat(localIndexer.packageRoots()).containsExactly(projectDir.resolve("src").toString()); + assertThat(localIndexer.projectLevelSymbolTable().getSymbol("acme.mod.original")).isNotNull(); + + PythonInputFile added = inputFile(projectDir, "src/acme/added.py", "def added():\n pass\n"); + localIndexer.process(event(ModuleFileEvent.Type.CREATED, added)); + + assertThat(localIndexer.packageRoots()).containsExactly(projectDir.resolve("src").toString()); + assertThat(localIndexer.projectLevelSymbolTable().getSymbol("acme.added.added")).isNotNull(); + } + + @Test + void modified_package_configuration_file_refreshes_roots(@TempDir Path projectDir) throws IOException { + Path pyproject = projectDir.resolve("pyproject.toml"); + Files.writeString(pyproject, "[project]\nname = 'before'\n"); + PythonInputFile module = inputFile(projectDir, "module.py", "def original():\n pass\n"); + var localIndexer = spy(buildIndexer(projectDir, module)); + + String updatedConfig = "[project]\nname = 'after'\n"; + Files.writeString(pyproject, updatedConfig); + InputFile configurationFile = TestInputFileBuilder.create("moduleKey", "pyproject.toml") + .setModuleBaseDir(projectDir) + .setCharset(StandardCharsets.UTF_8) + .setType(InputFile.Type.MAIN) + .setLanguage(null) + .initMetadata(updatedConfig) + .build(); + + localIndexer.process(event(ModuleFileEvent.Type.MODIFIED, configurationFile)); + + verify(localIndexer).refreshPackageRoots(); + assertThat(localIndexer.projectLevelSymbolTable().getSymbol("module.original")).isNotNull(); + } + + @Test + void incremental_init_file_addition_rebuilds_modules_with_new_fqns(@TempDir Path projectDir) throws IOException { + PythonInputFile module = inputFile(projectDir, "pkg/module.py", "def foo():\n pass\n"); + var localContext = SensorContextTester.create(projectDir.toFile()); + localContext.fileSystem().add(module.wrappedFile()); + var localIndexer = spy(new SonarLintPythonIndexer( + new TestModuleFileSystem(new ArrayList<>(List.of(module))), new ProjectConfigurationBuilder())); + localIndexer.buildOnce(localContext); + + assertThat(localIndexer.projectLevelSymbolTable().getSymbol("module.foo")).isNotNull(); + + PythonInputFile packageInit = inputFile(projectDir, "pkg/__init__.py", ""); + localIndexer.process(event(ModuleFileEvent.Type.CREATED, packageInit)); + + verify(localIndexer).refreshPackageRoots(); + assertThat(localIndexer.packageRoots()).containsExactly(projectDir.toString()); + assertThat(localIndexer.projectLevelSymbolTable().getSymbol("module.foo")).isNull(); + assertThat(localIndexer.projectLevelSymbolTable().getSymbol("pkg.module.foo")).isNotNull(); + } + + @Test + void incremental_init_file_deletion_rebuilds_modules_with_new_fqns(@TempDir Path projectDir) throws IOException { + PythonInputFile packageInit = inputFile(projectDir, "pkg/__init__.py", ""); + PythonInputFile module = inputFile(projectDir, "pkg/module.py", "def foo():\n pass\n"); + var localIndexer = spy(buildIndexer(projectDir, packageInit, module)); + + assertThat(localIndexer.projectLevelSymbolTable().getSymbol("pkg.module.foo")).isNotNull(); + assertThat(localIndexer.projectLevelSymbolTable().getSymbol("module.foo")).isNull(); + + Files.delete(packageInit.wrappedFile().path()); + + localIndexer.process(event(ModuleFileEvent.Type.DELETED, packageInit)); + + verify(localIndexer).refreshPackageRoots(); + assertThat(localIndexer.packageRoots()).containsExactly(projectDir.resolve("pkg").toString()); + assertThat(localIndexer.projectLevelSymbolTable().getSymbol("pkg.module.foo")).isNull(); + assertThat(localIndexer.projectLevelSymbolTable().getSymbol("module.foo")).isNotNull(); + } + + @Test + void created_file_under_existing_root_adds_more_specific_legacy_root(@TempDir Path projectDir) throws IOException { + PythonInputFile packageInit = inputFile(projectDir, "pkg/__init__.py", ""); + PythonInputFile module = inputFile(projectDir, "pkg/module.py", "def original():\n pass\n"); + var localIndexer = buildIndexer(projectDir, packageInit, module); + + assertThat(localIndexer.packageRoots()).containsExactly(projectDir.toString()); + + PythonInputFile script = inputFile(projectDir, "scripts/tool.py", "def run():\n pass\n"); + localIndexer.process(event(ModuleFileEvent.Type.CREATED, script)); + + assertThat(localIndexer.packageRoots()).containsExactly(projectDir.resolve("scripts").toString(), projectDir.toString()); + assertThat(localIndexer.projectLevelSymbolTable().getSymbol("tool.run")).isNotNull(); + assertThat(localIndexer.projectLevelSymbolTable().getSymbol("scripts.tool.run")).isNull(); + } + + @Test + void created_file_with_existing_candidate_root_skips_root_resolution(@TempDir Path projectDir) throws IOException { + PythonInputFile packageInit = inputFile(projectDir, "pkg/__init__.py", ""); + PythonInputFile module = inputFile(projectDir, "pkg/module.py", "def original():\n pass\n"); + var localIndexer = spy(buildIndexer(projectDir, packageInit, module)); + + PythonInputFile added = inputFile(projectDir, "pkg/added.py", "def added():\n pass\n"); + localIndexer.process(event(ModuleFileEvent.Type.CREATED, added)); + + verify(localIndexer, never()).refreshPackageRoots(); + assertThat(localIndexer.projectLevelSymbolTable().getSymbol("pkg.added.added")).isNotNull(); + } + + @Test + void created_file_in_new_conventional_folder_refreshes_when_candidate_root_is_active(@TempDir Path projectDir) throws IOException { + Files.writeString(projectDir.resolve("pyproject.toml"), "[project]\nname = 'sample'\n"); + PythonInputFile main = inputFile(projectDir, "main.py", "def original():\n pass\n"); + var localIndexer = spy(buildIndexer(projectDir, main)); + Files.createDirectories(projectDir.resolve("src")); + Files.writeString(projectDir.resolve("src/__init__.py"), ""); + + PythonInputFile added = inputFile(projectDir, "src/tool.py", "def run():\n pass\n"); + localIndexer.process(event(ModuleFileEvent.Type.CREATED, added)); + + verify(localIndexer).refreshPackageRoots(); + assertThat(localIndexer.projectLevelSymbolTable().getSymbol("src.tool.run")).isNotNull(); + } + + @Test + void created_file_covered_by_base_dir_fallback_skips_root_resolution(@TempDir Path projectDir) throws IOException { + Files.writeString(projectDir.resolve("pyproject.toml"), "[project]\nname = 'sample'\n"); + PythonInputFile main = inputFile(projectDir, "main.py", "def original():\n pass\n"); + var localIndexer = spy(buildIndexer(projectDir, main)); + + PythonInputFile added = inputFile(projectDir, "scripts/tool.py", "def run():\n pass\n"); + localIndexer.process(event(ModuleFileEvent.Type.CREATED, added)); + + verify(localIndexer, never()).refreshPackageRoots(); + assertThat(localIndexer.projectLevelSymbolTable().getSymbol("scripts.tool.run")).isNotNull(); + } + + @Test + void deleted_file_covered_by_base_dir_fallback_skips_root_resolution(@TempDir Path projectDir) throws IOException { + Files.writeString(projectDir.resolve("pyproject.toml"), "[project]\nname = 'sample'\n"); + PythonInputFile first = inputFile(projectDir, "scripts/first.py", "def first():\n pass\n"); + PythonInputFile second = inputFile(projectDir, "scripts/second.py", "def second():\n pass\n"); + var localIndexer = spy(buildIndexer(projectDir, first, second)); + Files.delete(first.wrappedFile().path()); + + localIndexer.process(event(ModuleFileEvent.Type.DELETED, first)); + + verify(localIndexer, never()).refreshPackageRoots(); + assertThat(localIndexer.projectLevelSymbolTable().getSymbol("scripts.first.first")).isNull(); + assertThat(localIndexer.projectLevelSymbolTable().getSymbol("scripts.second.second")).isNotNull(); + } + + @Test + void deleted_file_covered_by_configured_root_skips_root_resolution(@TempDir Path projectDir) throws IOException { + Files.writeString(projectDir.resolve("setup.py"), "setup(package_dir={'': 'src'}, packages=['acme'])"); + PythonInputFile module = inputFile(projectDir, "src/acme/module.py", "def original():\n pass\n"); + var localIndexer = spy(buildIndexer(projectDir, module)); + + PythonInputFile added = inputFile(projectDir, "src/acme/added.py", "def added():\n pass\n"); + localIndexer.process(event(ModuleFileEvent.Type.CREATED, added)); + clearInvocations(localIndexer); + Files.delete(added.wrappedFile().path()); + + localIndexer.process(event(ModuleFileEvent.Type.DELETED, added)); + + verify(localIndexer, never()).refreshPackageRoots(); + assertThat(localIndexer.projectLevelSymbolTable().getSymbol("acme.added.added")).isNull(); + assertThat(localIndexer.projectLevelSymbolTable().getSymbol("acme.module.original")).isNotNull(); + } + + @Test + void test_file_root_survives_refresh_triggered_by_main_file(@TempDir Path projectDir) throws IOException { + PythonInputFile packageInit = inputFile(projectDir, "pkg/__init__.py", ""); + PythonInputFile module = inputFile(projectDir, "pkg/module.py", "def original():\n pass\n"); + PythonInputFile testFile = inputFile(projectDir, "tests/unit/test_only.py", "def test_something():\n pass\n", InputFile.Type.TEST); + var localIndexer = buildIndexer(projectDir, packageInit, module, testFile); + + assertThat(localIndexer.packageRoots()).containsExactly(projectDir.resolve("tests/unit").toString(), projectDir.toString()); + assertThat(localIndexer.getFileWithId(testFile.wrappedFile().absolutePath())).isNull(); + + PythonInputFile script = inputFile(projectDir, "scripts/tool.py", "def run():\n pass\n"); + localIndexer.process(event(ModuleFileEvent.Type.CREATED, script)); + + assertThat(localIndexer.packageRoots()).containsExactly( + projectDir.resolve("tests/unit").toString(), + projectDir.resolve("scripts").toString(), + projectDir.toString()); + assertThat(localIndexer.projectLevelSymbolTable().getSymbol("pkg.module.original")).isNotNull(); + assertThat(localIndexer.getFileWithId(testFile.wrappedFile().absolutePath())).isNull(); + } + + @Test + void created_test_file_updates_roots_without_entering_project_index(@TempDir Path projectDir) throws IOException { + PythonInputFile packageInit = inputFile(projectDir, "pkg/__init__.py", ""); + PythonInputFile module = inputFile(projectDir, "pkg/module.py", "def original():\n pass\n"); + var localIndexer = buildIndexer(projectDir, packageInit, module); + + PythonInputFile testFile = inputFile(projectDir, "tests/unit/test_only.py", "def test_something():\n pass\n", InputFile.Type.TEST); + localIndexer.process(event(ModuleFileEvent.Type.CREATED, testFile)); + + assertThat(localIndexer.packageRoots()).containsExactly(projectDir.resolve("tests/unit").toString(), projectDir.toString()); + assertThat(localIndexer.projectLevelSymbolTable().getSymbol("pkg.module.original")).isNotNull(); + assertThat(localIndexer.projectLevelSymbolTable().getSymbol("test_only.test_something")).isNull(); + assertThat(localIndexer.getFileWithId(testFile.wrappedFile().absolutePath())).isNull(); + } + + @Test + void deleted_test_file_removes_its_root_without_affecting_main_index(@TempDir Path projectDir) throws IOException { + PythonInputFile packageInit = inputFile(projectDir, "pkg/__init__.py", ""); + PythonInputFile module = inputFile(projectDir, "pkg/module.py", "def original():\n pass\n"); + PythonInputFile testFile = inputFile(projectDir, "tests/unit/test_only.py", "def test_something():\n pass\n", InputFile.Type.TEST); + var localIndexer = buildIndexer(projectDir, packageInit, module, testFile); + + localIndexer.process(event(ModuleFileEvent.Type.DELETED, testFile)); + + assertThat(localIndexer.packageRoots()).containsExactly(projectDir.toString()); + assertThat(localIndexer.projectLevelSymbolTable().getSymbol("pkg.module.original")).isNotNull(); + assertThat(localIndexer.getFileWithId(testFile.wrappedFile().absolutePath())).isNull(); + } + + @Test + void deleted_file_with_another_root_contributor_skips_root_resolution(@TempDir Path projectDir) throws IOException { + PythonInputFile first = inputFile(projectDir, "scripts/first.py", "def first():\n pass\n"); + PythonInputFile second = inputFile(projectDir, "scripts/second.py", "def second():\n pass\n"); + PythonInputFile third = inputFile(projectDir, "scripts/third.py", "def third():\n pass\n"); + var localIndexer = spy(buildIndexer(projectDir, first, second, third)); + + localIndexer.process(event(ModuleFileEvent.Type.DELETED, first)); + clearInvocations(localIndexer); + localIndexer.process(event(ModuleFileEvent.Type.DELETED, second)); + + verify(localIndexer, never()).refreshPackageRoots(); + assertThat(localIndexer.projectLevelSymbolTable().getSymbol("first.first")).isNull(); + assertThat(localIndexer.projectLevelSymbolTable().getSymbol("second.second")).isNull(); + assertThat(localIndexer.projectLevelSymbolTable().getSymbol("third.third")).isNotNull(); + } + + @Test + void modified_main_file_reclassified_as_test_is_removed_from_project_index(@TempDir Path projectDir) throws IOException { + PythonInputFile mainFile = inputFile(projectDir, "module.py", "def original():\n pass\n"); + var localIndexer = buildIndexer(projectDir, mainFile); + + PythonInputFile testFile = inputFile(projectDir, "module.py", "def test_something():\n pass\n", InputFile.Type.TEST); + localIndexer.process(event(ModuleFileEvent.Type.MODIFIED, testFile)); + + assertThat(localIndexer.projectLevelSymbolTable().getSymbol("module.original")).isNull(); + assertThat(localIndexer.projectLevelSymbolTable().getSymbol("module.test_something")).isNull(); + assertThat(localIndexer.getFileWithId(testFile.wrappedFile().absolutePath())).isNull(); + } + + @Test + void modified_test_file_reclassified_as_main_is_added_to_project_index(@TempDir Path projectDir) throws IOException { + PythonInputFile testFile = inputFile(projectDir, "module.py", "def test_something():\n pass\n", InputFile.Type.TEST); + var localIndexer = buildIndexer(projectDir, testFile); + + PythonInputFile mainFile = inputFile(projectDir, "module.py", "def production():\n pass\n"); + localIndexer.process(event(ModuleFileEvent.Type.MODIFIED, mainFile)); + + assertThat(localIndexer.projectLevelSymbolTable().getSymbol("module.production")).isNotNull(); + assertThat(localIndexer.getFileWithId(mainFile.wrappedFile().absolutePath())).isSameAs(mainFile.wrappedFile()); + } + + @Test + void deleted_file_removes_legacy_root_and_rebuilds_remaining_modules(@TempDir Path projectDir) throws IOException { + PythonInputFile packageInit = inputFile(projectDir, "pkg/__init__.py", ""); + PythonInputFile module = inputFile(projectDir, "pkg/module.py", "def original():\n pass\n"); + PythonInputFile script = inputFile(projectDir, "scripts/tool.py", "def run():\n pass\n"); + var localIndexer = spy(buildIndexer(projectDir, packageInit, module, script)); + + assertThat(localIndexer.packageRoots()).containsExactly(projectDir.resolve("scripts").toString(), projectDir.toString()); + + localIndexer.process(event(ModuleFileEvent.Type.DELETED, script)); + + verify(localIndexer).refreshPackageRoots(); + assertThat(localIndexer.packageRoots()).containsExactly(projectDir.toString()); + assertThat(localIndexer.projectLevelSymbolTable().getSymbol("tool.run")).isNull(); + assertThat(localIndexer.projectLevelSymbolTable().getSymbol("pkg.module.original")).isNotNull(); + } + + @Test + void deleted_file_with_removed_conventional_directory_refreshes_roots(@TempDir Path projectDir) throws IOException { + Files.writeString(projectDir.resolve("pyproject.toml"), "[project]\nname = 'sample'\n"); + PythonInputFile script = inputFile(projectDir, "src/scripts/tool.py", "def run():\n pass\n"); + var localIndexer = spy(buildIndexer(projectDir, script)); + Files.delete(script.wrappedFile().path()); + Files.delete(projectDir.resolve("src/scripts")); + Files.delete(projectDir.resolve("src")); + + localIndexer.process(event(ModuleFileEvent.Type.DELETED, script)); + + verify(localIndexer).refreshPackageRoots(); + assertThat(localIndexer.packageRoots()).containsExactly(projectDir.toString()); + } + + @Test + void created_src_folder_switches_from_base_dir_to_conventional_roots(@TempDir Path projectDir) throws IOException { + Files.writeString(projectDir.resolve("pyproject.toml"), "[project]\nname = 'sample'\n"); + PythonInputFile main = inputFile(projectDir, "main.py", "def original():\n pass\n"); + var localIndexer = buildIndexer(projectDir, main); + + assertThat(localIndexer.packageRoots()).containsExactly(projectDir.toString()); + + PythonInputFile source = inputFile(projectDir, "src/tool.py", "def run():\n pass\n"); + localIndexer.process(event(ModuleFileEvent.Type.CREATED, source)); + + assertThat(localIndexer.packageRoots()).containsExactly(projectDir.resolve("src").toString(), projectDir.toString()); + assertThat(localIndexer.projectLevelSymbolTable().getSymbol("tool.run")).isNotNull(); + assertThat(localIndexer.projectLevelSymbolTable().getSymbol("src.tool.run")).isNull(); + } + + @Test + void rebuild_continues_after_invalid_python_and_keeps_it_for_root_resolution(@TempDir Path projectDir) throws IOException { + PythonInputFile packageInit = inputFile(projectDir, "pkg/__init__.py", ""); + PythonInputFile module = inputFile(projectDir, "pkg/module.py", "def original():\n pass\n"); + PythonInputFile invalid = inputFile(projectDir, "broken/invalid.py", "foo("); + var localIndexer = buildIndexer(projectDir, packageInit, module, invalid); + + assertThat(localIndexer.getFileWithId(invalid.wrappedFile().absolutePath())).isNull(); + + PythonInputFile script = inputFile(projectDir, "scripts/tool.py", "def run():\n pass\n"); + assertDoesNotThrow(() -> localIndexer.process(event(ModuleFileEvent.Type.CREATED, script))); + + assertThat(localIndexer.packageRoots()).containsExactly( + projectDir.resolve("broken").toString(), + projectDir.resolve("scripts").toString(), + projectDir.toString()); + assertThat(localIndexer.projectLevelSymbolTable().getSymbol("pkg.module.original")).isNotNull(); + assertThat(localIndexer.projectLevelSymbolTable().getSymbol("tool.run")).isNotNull(); + assertThat(localIndexer.getFileWithId(invalid.wrappedFile().absolutePath())).isNull(); + } + + @Test + void modified_file_can_be_temporarily_invalid_and_recover(@TempDir Path projectDir) throws IOException { + PythonInputFile original = inputFile(projectDir, "module.py", "def original():\n pass\n"); + var localIndexer = buildIndexer(projectDir, original); + + PythonInputFile invalid = inputFile(projectDir, "module.py", "foo("); + assertDoesNotThrow(() -> localIndexer.process(event(ModuleFileEvent.Type.MODIFIED, invalid))); + + assertThat(localIndexer.projectLevelSymbolTable().getSymbol("module.original")).isNull(); + assertThat(localIndexer.getFileWithId(invalid.wrappedFile().absolutePath())).isNull(); + + PythonInputFile recovered = inputFile(projectDir, "module.py", "def recovered():\n pass\n"); + localIndexer.process(event(ModuleFileEvent.Type.MODIFIED, recovered)); + + assertThat(localIndexer.projectLevelSymbolTable().getSymbol("module.recovered")).isNotNull(); + assertThat(localIndexer.getFileWithId(recovered.wrappedFile().absolutePath())).isSameAs(recovered.wrappedFile()); + } + + @Test + void rebuild_keeps_unreadable_file_for_root_resolution(@TempDir Path projectDir) throws IOException { + PythonInputFile packageInit = inputFile(projectDir, "pkg/__init__.py", ""); + PythonInputFile module = inputFile(projectDir, "pkg/module.py", "def original():\n pass\n"); + PythonInputFile readableInput = inputFile(projectDir, "unreadable/module.py", "def ignored():\n pass\n"); + InputFile unreadableFile = spy(readableInput.wrappedFile()); + when(unreadableFile.contents()).thenThrow(new IOException("not readable")); + PythonInputFile unreadableInput = new PythonInputFileImpl(unreadableFile); + var localIndexer = buildIndexer(projectDir, packageInit, module, unreadableInput); + + PythonInputFile script = inputFile(projectDir, "scripts/tool.py", "def run():\n pass\n"); + assertDoesNotThrow(() -> localIndexer.process(event(ModuleFileEvent.Type.CREATED, script))); + + assertThat(localIndexer.packageRoots()).containsExactly( + projectDir.resolve("scripts").toString(), + projectDir.resolve("unreadable").toString(), + projectDir.toString()); + assertThat(localIndexer.projectLevelSymbolTable().getSymbol("pkg.module.original")).isNotNull(); + assertThat(localIndexer.getFileWithId(unreadableFile.absolutePath())).isNull(); + } + + @Test + void project_over_line_limit_does_not_partially_activate_after_file_event(@TempDir Path projectDir) throws IOException { + PythonInputFile module = inputFile(projectDir, "module.py", "def original():\n pass\n"); + var localContext = SensorContextTester.create(projectDir.toFile()); + localContext.setSettings(new MapSettings().setProperty("sonar.python.sonarlint.indexing.maxlines", 1)); + localContext.fileSystem().add(module.wrappedFile()); + var localIndexer = new SonarLintPythonIndexer( + new TestModuleFileSystem(new ArrayList<>(List.of(module))), new ProjectConfigurationBuilder()); + localIndexer.buildOnce(localContext); + + PythonInputFile added = inputFile(projectDir, "scripts/tool.py", "def run():\n pass\n"); + localIndexer.process(event(ModuleFileEvent.Type.CREATED, added)); + + assertThat(localIndexer.projectLevelSymbolTable().getSymbol("tool.run")).isNull(); + assertThat(localIndexer.getFileWithId(added.wrappedFile().absolutePath())).isNull(); + } + @Test void test_indexer_non_python_file() { testNonPythonFile("txt"); @@ -302,4 +699,41 @@ private PythonInputFile createInputFile(String name, String languageKey) { .initMetadata(TestUtils.fileContent(new File(baseDir, name), StandardCharsets.UTF_8)) .build()); } + + private static PythonInputFile inputFile(Path projectDir, String relativePath, String content) throws IOException { + return inputFile(projectDir, relativePath, content, InputFile.Type.MAIN); + } + + private static PythonInputFile inputFile(Path projectDir, String relativePath, String content, InputFile.Type type) throws IOException { + Path path = projectDir.resolve(relativePath); + Files.createDirectories(path.getParent()); + Files.writeString(path, content); + return new PythonInputFileImpl(TestInputFileBuilder.create("moduleKey", relativePath) + .setModuleBaseDir(projectDir) + .setCharset(StandardCharsets.UTF_8) + .setType(type) + .setLanguage(Python.KEY) + .initMetadata(content) + .build()); + } + + private static ModuleFileEvent event(ModuleFileEvent.Type type, PythonInputFile inputFile) { + return event(type, inputFile.wrappedFile()); + } + + private static ModuleFileEvent event(ModuleFileEvent.Type type, InputFile inputFile) { + ModuleFileEvent event = mock(ModuleFileEvent.class); + when(event.getType()).thenReturn(type); + when(event.getTarget()).thenReturn(inputFile); + return event; + } + + private static SonarLintPythonIndexer buildIndexer(Path projectDir, PythonInputFile... files) { + var localContext = SensorContextTester.create(projectDir.toFile()); + Arrays.stream(files).map(PythonInputFile::wrappedFile).forEach(localContext.fileSystem()::add); + var localIndexer = new SonarLintPythonIndexer( + new TestModuleFileSystem(new ArrayList<>(Arrays.asList(files))), new ProjectConfigurationBuilder()); + localIndexer.buildOnce(localContext); + return localIndexer; + } } diff --git a/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexerTest.java b/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexerTest.java index 191a47a3a..4b619a027 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexerTest.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/indexer/SonarQubePythonIndexerTest.java @@ -516,10 +516,6 @@ void test_package_roots_from_pyproject_toml_setuptools() throws IOException { tempContext.fileSystem().setWorkDir(Files.createTempDirectory("workDir")); tempContext.settings().setProperty("sonar.python.skipUnchanged", false); - // Add pyproject.toml as input file so it can be found - PythonInputFile pyprojectFile = createInputFile(tempDir.toFile(), "pyproject.toml", InputFile.Status.SAME, InputFile.Type.MAIN); - tempContext.fileSystem().add(pyprojectFile.wrappedFile()); - PythonInputFile meanFile = createInputFile(srcDir.toFile(), "mean.py", InputFile.Status.ADDED, InputFile.Type.MAIN); @@ -683,10 +679,6 @@ void test_package_roots_from_setup_py() throws IOException { tempContext.fileSystem().setWorkDir(Files.createTempDirectory("workDir")); tempContext.settings().setProperty("sonar.python.skipUnchanged", false); - // Add setup.py as input file so it can be found - PythonInputFile setupPyFile = createInputFile(tempDir.toFile(), "setup.py", InputFile.Status.SAME, InputFile.Type.MAIN); - tempContext.fileSystem().add(setupPyFile.wrappedFile()); - PythonInputFile meanFile = createInputFile(tempDir.toFile(), Path.of("src", "acme", "math", "stats", "mean.py").toString(), InputFile.Status.ADDED, InputFile.Type.MAIN); @@ -732,12 +724,6 @@ void test_package_roots_from_both_pyproject_and_setup_py() throws IOException { tempContext.fileSystem().setWorkDir(Files.createTempDirectory("workDir")); tempContext.settings().setProperty("sonar.python.skipUnchanged", false); - // Add both config files - PythonInputFile pyprojectFile = createInputFile(tempDir.toFile(), "pyproject.toml", InputFile.Status.SAME, InputFile.Type.MAIN); - PythonInputFile setupPyFile = createInputFile(tempDir.toFile(), "setup.py", InputFile.Status.SAME, InputFile.Type.MAIN); - tempContext.fileSystem().add(pyprojectFile.wrappedFile()); - tempContext.fileSystem().add(setupPyFile.wrappedFile()); - PythonInputFile moduleFile = createInputFile(tempDir.toFile(), Path.of("src", "mypackage", "module.py").toString(), InputFile.Status.ADDED, InputFile.Type.MAIN); diff --git a/python-commons/src/test/java/org/sonar/plugins/python/indexer/TestModuleFileSystem.java b/python-commons/src/test/java/org/sonar/plugins/python/indexer/TestModuleFileSystem.java index a0da14037..70ba1b601 100644 --- a/python-commons/src/test/java/org/sonar/plugins/python/indexer/TestModuleFileSystem.java +++ b/python-commons/src/test/java/org/sonar/plugins/python/indexer/TestModuleFileSystem.java @@ -31,8 +31,10 @@ public TestModuleFileSystem(List inputFiles) { } @Override - public Stream files(String s, InputFile.Type type) { - return inputFiles.stream().map(PythonInputFile::wrappedFile); + public Stream files(String language, InputFile.Type type) { + return files() + .filter(file -> language.equals(file.language())) + .filter(file -> type == file.type()); } @Override diff --git a/python-frontend/src/main/java/org/sonar/python/TestPythonVisitorRunner.java b/python-frontend/src/main/java/org/sonar/python/TestPythonVisitorRunner.java index 24f38ceba..1fae2a80c 100644 --- a/python-frontend/src/main/java/org/sonar/python/TestPythonVisitorRunner.java +++ b/python-frontend/src/main/java/org/sonar/python/TestPythonVisitorRunner.java @@ -21,6 +21,7 @@ import java.net.URI; import java.nio.charset.StandardCharsets; import java.nio.file.Files; +import java.util.Comparator; import java.util.List; import java.util.Map; import javax.annotation.Nullable; @@ -133,20 +134,30 @@ public static PythonVisitorContext createNotebookContext(File file, Map files, File baseDir) { + return globalSymbols(files, computePackageRoots(files, baseDir)); + } + + public static ProjectLevelSymbolTable globalSymbols(List files, List packageRoots) { ProjectLevelSymbolTable projectLevelSymbolTable = ProjectLevelSymbolTable.empty(); for (File file : files) { var pythonFile = new TestPythonFile(file); - String packageName = pythonPackageName(file, baseDir.getAbsolutePath()); + String packageName = pythonPackageName(file, packageRoots); fillSymbolTableWithFile(pythonFile, projectLevelSymbolTable, packageName); } return projectLevelSymbolTable; } public static ProjectLevelSymbolTable globalSymbols(Map pathToContent, String baseDir) { + File baseDirFile = new File(baseDir); + List files = pathToContent.keySet().stream().map(path -> new File(baseDir, path)).toList(); + return globalSymbols(pathToContent, baseDir, computePackageRoots(files, baseDirFile)); + } + + public static ProjectLevelSymbolTable globalSymbols(Map pathToContent, String baseDir, List packageRoots) { ProjectLevelSymbolTable projectLevelSymbolTable = ProjectLevelSymbolTable.empty(); pathToContent.forEach((path, content) -> { var file = new MockPythonFile(baseDir, path, content); - var packageName = pythonPackageName(file.file(), baseDir); + var packageName = pythonPackageName(file.file(), packageRoots); fillSymbolTableWithFile(file, projectLevelSymbolTable, packageName); }); return projectLevelSymbolTable; @@ -175,6 +186,31 @@ private static FileInput parseFile(TestablePythonFile file) { return treeMaker.fileInput(astNode); } + /** + * Test-only counterpart of the package-root computation in {@code PackageRootResolver}. + * It lives here because python-frontend cannot depend on python-commons, while downstream + * test utilities can reuse this class through their existing python-frontend dependency. + */ + public static List computePackageRoots(List files, File baseDir) { + String baseDirPath = baseDir.getAbsolutePath(); + List roots = files.stream() + .map(f -> { + File current = f.getParentFile(); + while (current != null && !current.getAbsolutePath().equals(baseDirPath)) { + if (!new File(current, "__init__.py").exists()) { + break; + } + current = current.getParentFile(); + } + return current != null ? current.getAbsolutePath() : baseDirPath; + }) + .distinct() + .sorted(Comparator.comparingInt((String p) -> (int) p.chars().filter(c -> c == File.separatorChar).count()).reversed() + .thenComparing(Comparator.naturalOrder())) + .toList(); + return roots.isEmpty() ? List.of(baseDirPath) : roots; + } + interface TestablePythonFile extends PythonFile { default boolean isIPython() { return fileName().endsWith(".ipynb"); diff --git a/python-frontend/src/main/java/org/sonar/python/project/config/ProjectConfigurationBuilder.java b/python-frontend/src/main/java/org/sonar/python/project/config/ProjectConfigurationBuilder.java index 46ecca9c9..c7550ba36 100644 --- a/python-frontend/src/main/java/org/sonar/python/project/config/ProjectConfigurationBuilder.java +++ b/python-frontend/src/main/java/org/sonar/python/project/config/ProjectConfigurationBuilder.java @@ -46,6 +46,10 @@ public ProjectConfigurationBuilder removePackageAwsLambdaHandlers(String package return this; } + public void clear() { + awsLambdaHandlersByPackage.clear(); + } + public ProjectConfiguration build() { return new ProjectConfiguration( new AwsProjectConfiguration( diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/ProjectLevelSymbolTable.java b/python-frontend/src/main/java/org/sonar/python/semantic/ProjectLevelSymbolTable.java index 91114a8d4..6962d0680 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/ProjectLevelSymbolTable.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/ProjectLevelSymbolTable.java @@ -91,6 +91,19 @@ private ProjectLevelSymbolTable() { this.projectBasePackages = new HashSet<>(); } + /** + * Clears all project-derived state while keeping this table instance stable for its consumers. + */ + public synchronized void clear() { + globalDescriptorsByModuleName.clear(); + globalDescriptorsByFQN = null; + djangoViews.clear(); + importsByModule.clear(); + projectBasePackages.clear(); + typeShedDescriptorsProvider = null; + cachedSymbols = null; + } + public void removeModule(String packageName, String fileName) { String fullyQualifiedModuleName = SymbolUtils.fullyQualifiedModuleName(packageName, fileName); globalDescriptorsByModuleName.remove(fullyQualifiedModuleName); diff --git a/python-frontend/src/main/java/org/sonar/python/semantic/SymbolUtils.java b/python-frontend/src/main/java/org/sonar/python/semantic/SymbolUtils.java index e23fc3f4f..5982e1b59 100644 --- a/python-frontend/src/main/java/org/sonar/python/semantic/SymbolUtils.java +++ b/python-frontend/src/main/java/org/sonar/python/semantic/SymbolUtils.java @@ -20,14 +20,13 @@ import static org.sonar.python.tree.TreeUtils.getSymbolFromTree; import java.io.File; +import java.io.IOException; import java.net.URI; import java.nio.file.InvalidPathException; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Collection; -import java.util.Deque; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -35,7 +34,9 @@ import java.util.Optional; import java.util.Set; import java.util.function.Predicate; +import java.util.stream.Collectors; import java.util.stream.Stream; +import java.util.stream.StreamSupport; import javax.annotation.CheckForNull; import javax.annotation.Nullable; import org.sonar.plugins.python.api.PythonFile; @@ -171,30 +172,35 @@ public static List boundNamesFromExpression(@CheckForNull Tree tree) { /** * Computes the Python package name for a file using package roots. * - *

        If the file is under one of the provided package roots, computes the package name - * by converting the relative path from the root to the file's parent directory into a - * dotted package name. This supports PEP 420 namespace packages (directories without __init__.py). + *

        Finds the first root whose path is a prefix of the file's path and computes the + * package name by converting the relative path from that root to the file's parent directory + * into a dotted package name. This supports PEP 420 namespace packages (no __init__.py required). * - *

        If the file is not under any package root, falls back to the legacy behavior of - * walking up the directory tree and checking for __init__.py files. + *

        Returns an empty string when the file does not fall under any of the provided roots. * * @param file the Python source file * @param packageRoots list of absolute paths to package root directories - * @param projectBaseDirAbsolutePath the project base directory absolute path (used for fallback) - * @return the dotted package name, or empty string if not in a package + * @return the dotted package name, or empty string if not under any root */ - public static String pythonPackageName(File file, List packageRoots, String projectBaseDirAbsolutePath) { - if (!packageRoots.isEmpty()) { - String filePath = file.getAbsolutePath(); - for (String root : packageRoots) { - String normalizedRoot = root.endsWith(File.separator) ? root : (root + File.separator); - if (filePath.startsWith(normalizedRoot)) { - return computePackageNameFromRoot(file, normalizedRoot); - } + public static String pythonPackageName(File file, List packageRoots) { + List resolvedPackageRoots = packageRoots.stream() + .map(root -> resolvedPath(new File(root))) + .toList(); + return pythonPackageName(file, resolvedPackageRoots); + } + + /** + * Computes the Python package name using package roots that have already been resolved across + * filesystem aliases. This overload avoids resolving the same roots for every file in a project. + */ + public static String pythonPackageName(File file, Iterable resolvedPackageRoots) { + Path filePath = resolvedPath(file); + for (Path rootPath : resolvedPackageRoots) { + if (filePath.startsWith(rootPath)) { + return computePackageNameFromRoot(filePath, rootPath); } } - // Fallback to legacy __init__.py-based detection - return pythonPackageNameLegacy(file, projectBaseDirAbsolutePath); + return ""; } /** @@ -202,53 +208,38 @@ public static String pythonPackageName(File file, List packageRoots, Str * All directories between the root and the file become part of the package name * (PEP 420 namespace package support). */ - private static String computePackageNameFromRoot(File file, String packageRoot) { - File parentDir = file.getParentFile(); - if (parentDir == null) { - return ""; - } - String parentPath = parentDir.getAbsolutePath(); - if (!parentPath.startsWith(packageRoot)) { + private static String computePackageNameFromRoot(Path file, Path packageRoot) { + Path parentDir = file.getParent(); + if (parentDir == null || !parentDir.startsWith(packageRoot)) { return ""; } - String relativePath = parentPath.substring(packageRoot.length()); - if (relativePath.isEmpty()) { + Path relativePath = packageRoot.relativize(parentDir); + if (relativePath.getNameCount() == 0) { return ""; } - // Convert path separators to dots - return relativePath.replace(File.separatorChar, '.'); + return StreamSupport.stream(relativePath.spliterator(), false) + .map(Path::toString) + .collect(Collectors.joining(".")); } /** - * Legacy method for computing Python package name using __init__.py detection. - * Walks up from the file's parent directory toward the project base directory, - * stopping when encountering a directory without __init__.py. + * Resolves filesystem aliases, including Windows 8.3 short paths. If the complete path does + * not exist, the nearest existing ancestor is resolved and the remaining path is appended. */ - private static String pythonPackageNameLegacy(File file, String projectBaseDirAbsolutePath) { - File currentDirectory = file.getParentFile(); - Deque packages = new ArrayDeque<>(); - while (!currentDirectory.getAbsolutePath().equals(projectBaseDirAbsolutePath)) { - File initFile = new File(currentDirectory, "__init__.py"); - if (!initFile.exists()) { - break; + public static Path resolvedPath(File file) { + Path absolutePath = file.toPath().toAbsolutePath().normalize(); + Path existingAncestor = absolutePath; + while (existingAncestor != null) { + try { + return existingAncestor.toRealPath().resolve(existingAncestor.relativize(absolutePath)); + } catch (IOException e) { + existingAncestor = existingAncestor.getParent(); } - packages.push(currentDirectory.getName()); - currentDirectory = currentDirectory.getParentFile(); } - return String.join(".", packages); + return absolutePath; } - /** - * Computes the Python package name for a file using legacy __init__.py detection only. - * This method is kept for backward compatibility. - * - * @param file the Python source file - * @param projectBaseDirAbsolutePath the project base directory absolute path - * @return the dotted package name, or empty string if not in a package - */ - public static String pythonPackageName(File file, String projectBaseDirAbsolutePath) { - return pythonPackageNameLegacy(file, projectBaseDirAbsolutePath); - } + @CheckForNull public static Path pathOf(PythonFile pythonFile) { diff --git a/python-frontend/src/test/java/org/sonar/python/project/config/ProjectConfigurationBuilderTest.java b/python-frontend/src/test/java/org/sonar/python/project/config/ProjectConfigurationBuilderTest.java new file mode 100644 index 000000000..d61145064 --- /dev/null +++ b/python-frontend/src/test/java/org/sonar/python/project/config/ProjectConfigurationBuilderTest.java @@ -0,0 +1,36 @@ +/* + * SonarQube Python Plugin + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.python.project.config; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class ProjectConfigurationBuilderTest { + + @Test + void clear_removesCollectedAwsLambdaHandlers() { + var builder = new ProjectConfigurationBuilder() + .addAwsLambdaHandler("acme", "acme.handler"); + + assertThat(builder.build().awsProjectConfiguration().awsLambdaHandlers()).hasSize(1); + + builder.clear(); + + assertThat(builder.build().awsProjectConfiguration().awsLambdaHandlers()).isEmpty(); + } +} diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/ProjectLevelSymbolTableTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/ProjectLevelSymbolTableTest.java index a00c5fecf..cee912ef5 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/ProjectLevelSymbolTableTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/ProjectLevelSymbolTableTest.java @@ -1242,6 +1242,31 @@ void projectPackages() { assertThat(projectLevelSymbolTable.projectBasePackages()).containsExactlyInAnyOrder("first", "second", "third"); } + @Test + void clear_removesProjectDerivedState() { + var projectLevelSymbolTable = empty(); + var descriptor = new FunctionDescriptor.FunctionDescriptorBuilder() + .withName("function") + .withFullyQualifiedName("acme.module.function") + .build(); + projectLevelSymbolTable.insertEntry("acme.module", Set.of(descriptor)); + projectLevelSymbolTable.addProjectPackage("acme.package"); + var typeShedProvider = projectLevelSymbolTable.typeShedDescriptorsProvider(); + var stubSymbols = projectLevelSymbolTable.stubFilesSymbols(); + + assertThat(projectLevelSymbolTable.getSymbol("acme.module.function")).isNotNull(); + assertThat(projectLevelSymbolTable.projectBasePackages()).containsExactly("acme"); + + projectLevelSymbolTable.clear(); + + assertThat(projectLevelSymbolTable.getSymbolsFromModule("acme.module")).isNull(); + assertThat(projectLevelSymbolTable.getSymbol("acme.module.function")).isNull(); + assertThat(projectLevelSymbolTable.importsByModule()).isEmpty(); + assertThat(projectLevelSymbolTable.projectBasePackages()).isEmpty(); + assertThat(projectLevelSymbolTable.typeShedDescriptorsProvider()).isNotSameAs(typeShedProvider); + assertThat(projectLevelSymbolTable.stubFilesSymbols()).isNotSameAs(stubSymbols); + } + @Test void hasModuleWithPrefix_detectsNamespacePackages() { var symbolTable = empty(); diff --git a/python-frontend/src/test/java/org/sonar/python/semantic/SymbolUtilsTest.java b/python-frontend/src/test/java/org/sonar/python/semantic/SymbolUtilsTest.java index 27a1efa24..f6972ab73 100644 --- a/python-frontend/src/test/java/org/sonar/python/semantic/SymbolUtilsTest.java +++ b/python-frontend/src/test/java/org/sonar/python/semantic/SymbolUtilsTest.java @@ -38,11 +38,14 @@ import java.net.URISyntaxException; import java.nio.file.Files; import java.nio.file.InvalidPathException; +import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; import java.util.Objects; import javax.annotation.Nullable; +import org.junit.jupiter.api.Assumptions; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; import org.sonar.plugins.python.api.PythonFile; import org.sonar.plugins.python.api.symbols.ClassSymbol; import org.sonar.plugins.python.api.symbols.FunctionSymbol; @@ -64,14 +67,6 @@ class SymbolUtilsTest { - @Test - void package_name_by_file() { - String baseDir = new File("src/test/resources").getAbsoluteFile().getAbsolutePath(); - assertThat(pythonPackageName(new File(baseDir, "packages/sound/__init__.py"), baseDir)).isEqualTo("sound"); - assertThat(pythonPackageName(new File(baseDir, "packages/sound/formats/__init__.py"), baseDir)).isEqualTo("sound.formats"); - assertThat(pythonPackageName(new File(baseDir, "packages/sound/formats/wavread.py"), baseDir)).isEqualTo("sound.formats"); - } - @Test void package_name_with_package_roots_namespace_packages() { // Test namespace packages (PEP 420) with package roots @@ -81,17 +76,17 @@ void package_name_with_package_roots_namespace_packages() { List packageRoots = List.of(srcRoot); // File in namespace package (acme and math have no __init__.py, stats has __init__.py) - assertThat(pythonPackageName(new File(srcRoot, "acme/math/stats/__init__.py"), packageRoots, baseDir)) + assertThat(pythonPackageName(new File(srcRoot, "acme/math/stats/__init__.py"), packageRoots)) .isEqualTo("acme.math.stats"); - assertThat(pythonPackageName(new File(srcRoot, "acme/math/stats/mean.py"), packageRoots, baseDir)) + assertThat(pythonPackageName(new File(srcRoot, "acme/math/stats/mean.py"), packageRoots)) .isEqualTo("acme.math.stats"); - assertThat(pythonPackageName(new File(srcRoot, "acme/math/basic/__init__.py"), packageRoots, baseDir)) + assertThat(pythonPackageName(new File(srcRoot, "acme/math/basic/__init__.py"), packageRoots)) .isEqualTo("acme.math.basic"); // File in regular package (mathlib has __init__.py) - assertThat(pythonPackageName(new File(srcRoot, "mathlib/__init__.py"), packageRoots, baseDir)) + assertThat(pythonPackageName(new File(srcRoot, "mathlib/__init__.py"), packageRoots)) .isEqualTo("mathlib"); - assertThat(pythonPackageName(new File(srcRoot, "mathlib/utils/__init__.py"), packageRoots, baseDir)) + assertThat(pythonPackageName(new File(srcRoot, "mathlib/utils/__init__.py"), packageRoots)) .isEqualTo("mathlib.utils"); } @@ -103,33 +98,35 @@ void package_name_with_package_roots_file_at_root() { // A file directly in the package root should have empty package name File fileAtRoot = new File(srcRoot, "module.py"); - assertThat(pythonPackageName(fileAtRoot, packageRoots, baseDir)).isEmpty(); + assertThat(pythonPackageName(fileAtRoot, packageRoots)).isEmpty(); + } + + @Test + void package_name_with_resolved_root_file_at_root(@TempDir Path tempDir) throws IOException { + File fileAtRoot = Files.createFile(tempDir.resolve("module.py")).toFile(); + + assertThat(pythonPackageName(fileAtRoot, List.of(tempDir.toRealPath()))).isEmpty(); } @Test - void package_name_with_package_roots_fallback_to_legacy() { - // When file is not under any package root, should fall back to __init__.py detection + void package_name_with_package_roots_file_not_under_any_root_returns_empty() { + // When file is not under any declared root, return empty string (no fallback) String baseDir = new File("src/test/resources").getAbsoluteFile().getAbsolutePath(); String unrelatedRoot = new File(baseDir, "nonexistent").getAbsolutePath(); List packageRoots = List.of(unrelatedRoot); - // File is not under the package root, so fallback to legacy detection - assertThat(pythonPackageName(new File(baseDir, "packages/sound/__init__.py"), packageRoots, baseDir)) - .isEqualTo("sound"); - assertThat(pythonPackageName(new File(baseDir, "packages/sound/formats/wavread.py"), packageRoots, baseDir)) - .isEqualTo("sound.formats"); + assertThat(pythonPackageName(new File(baseDir, "packages/sound/__init__.py"), packageRoots)).isEmpty(); + assertThat(pythonPackageName(new File(baseDir, "packages/sound/formats/wavread.py"), packageRoots)).isEmpty(); } @Test - void package_name_with_empty_package_roots_uses_legacy() { - // Empty package roots should fall back to legacy __init__.py detection + void package_name_with_empty_package_roots_returns_empty() { + // Empty package roots: no root can match, so empty string is returned String baseDir = new File("src/test/resources").getAbsoluteFile().getAbsolutePath(); List packageRoots = List.of(); - assertThat(pythonPackageName(new File(baseDir, "packages/sound/__init__.py"), packageRoots, baseDir)) - .isEqualTo("sound"); - assertThat(pythonPackageName(new File(baseDir, "packages/sound/formats/wavread.py"), packageRoots, baseDir)) - .isEqualTo("sound.formats"); + assertThat(pythonPackageName(new File(baseDir, "packages/sound/__init__.py"), packageRoots)).isEmpty(); + assertThat(pythonPackageName(new File(baseDir, "packages/sound/formats/wavread.py"), packageRoots)).isEmpty(); } @Test @@ -140,11 +137,11 @@ void package_name_with_multiple_package_roots() { List packageRoots = List.of(packagesRoot, namespaceRoot); // File in first root - assertThat(pythonPackageName(new File(packagesRoot, "sound/__init__.py"), packageRoots, baseDir)) + assertThat(pythonPackageName(new File(packagesRoot, "sound/__init__.py"), packageRoots)) .isEqualTo("sound"); // File in second root - assertThat(pythonPackageName(new File(namespaceRoot, "acme/math/stats/__init__.py"), packageRoots, baseDir)) + assertThat(pythonPackageName(new File(namespaceRoot, "acme/math/stats/__init__.py"), packageRoots)) .isEqualTo("acme.math.stats"); } @@ -154,10 +151,10 @@ void package_name_with_package_roots_edge_case_single_directory() { String srcRoot = new File(baseDir, "src").getAbsolutePath(); List packageRoots = List.of(srcRoot); - assertThat(pythonPackageName(new File(srcRoot, "mathlib/__init__.py"), packageRoots, baseDir)) + assertThat(pythonPackageName(new File(srcRoot, "mathlib/__init__.py"), packageRoots)) .isEqualTo("mathlib"); - assertThat(pythonPackageName(new File(srcRoot, "mathlib/utils.py"), packageRoots, baseDir)) + assertThat(pythonPackageName(new File(srcRoot, "mathlib/utils.py"), packageRoots)) .isEqualTo("mathlib"); } @@ -168,8 +165,7 @@ void package_name_with_package_roots_parent_not_under_root() { List packageRoots = List.of(unrelatedRoot); File fileOutsideRoot = new File(baseDir, "packages/sound/__init__.py"); - assertThat(pythonPackageName(fileOutsideRoot, packageRoots, baseDir)) - .isEqualTo("sound"); + assertThat(pythonPackageName(fileOutsideRoot, packageRoots)).isEmpty(); } @Test @@ -177,14 +173,39 @@ void package_name_with_package_roots_trailing_separator() { String baseDir = new File("src/test/resources/namespace_packages").getAbsoluteFile().getAbsolutePath(); String srcRoot = new File(baseDir, "src").getAbsolutePath(); List packageRootsWithSeparator = List.of(srcRoot + File.separator); - assertThat(pythonPackageName(new File(srcRoot, "acme/math/stats/mean.py"), packageRootsWithSeparator, baseDir)) + assertThat(pythonPackageName(new File(srcRoot, "acme/math/stats/mean.py"), packageRootsWithSeparator)) .isEqualTo("acme.math.stats"); List packageRootsWithoutSeparator = List.of(srcRoot); - assertThat(pythonPackageName(new File(srcRoot, "acme/math/stats/mean.py"), packageRootsWithoutSeparator, baseDir)) + assertThat(pythonPackageName(new File(srcRoot, "acme/math/stats/mean.py"), packageRootsWithoutSeparator)) + .isEqualTo("acme.math.stats"); + } + + @Test + void package_name_resolves_equivalent_root_paths() { + File baseDir = new File("src/test/resources/namespace_packages").getAbsoluteFile(); + String equivalentSrcRoot = new File(baseDir, "src/../src").getPath(); + + assertThat(pythonPackageName(new File(baseDir, "src/acme/math/stats/mean.py"), List.of(equivalentSrcRoot))) .isEqualTo("acme.math.stats"); } + @Test + void package_name_resolves_symbolic_link_alias(@TempDir Path tempDir) throws IOException { + Path realRoot = Files.createDirectories(tempDir.resolve("real/src")); + Path module = Files.createDirectories(realRoot.resolve("acme/math")).resolve("module.py"); + Files.writeString(module, ""); + Path alias = tempDir.resolve("alias"); + try { + Files.createSymbolicLink(alias, tempDir.resolve("real")); + } catch (UnsupportedOperationException | IOException | SecurityException e) { + Assumptions.assumeTrue(false, "Symbolic links are not available: " + e.getMessage()); + } + + assertThat(pythonPackageName(alias.resolve("src/acme/math/module.py").toFile(), List.of(realRoot.toString()))) + .isEqualTo("acme.math"); + } + @Test void package_name_with_package_roots_nested_subdirectories() { String baseDir = new File("src/test/resources/namespace_packages").getAbsoluteFile().getAbsolutePath(); @@ -192,12 +213,12 @@ void package_name_with_package_roots_nested_subdirectories() { List packageRoots = List.of(srcRoot); File deeplyNestedFile = new File(srcRoot, "acme/math/stats/mean.py"); - assertThat(pythonPackageName(deeplyNestedFile, packageRoots, baseDir)) + assertThat(pythonPackageName(deeplyNestedFile, packageRoots)) .isEqualTo("acme.math.stats"); - assertThat(pythonPackageName(new File(srcRoot, "acme/math/stats/__init__.py"), packageRoots, baseDir)) + assertThat(pythonPackageName(new File(srcRoot, "acme/math/stats/__init__.py"), packageRoots)) .isEqualTo("acme.math.stats"); - assertThat(pythonPackageName(new File(srcRoot, "mathlib/utils/__init__.py"), packageRoots, baseDir)) + assertThat(pythonPackageName(new File(srcRoot, "mathlib/utils/__init__.py"), packageRoots)) .isEqualTo("mathlib.utils"); } @@ -208,7 +229,7 @@ void package_name_with_package_roots_various_path_separators() { List packageRoots = List.of(srcRoot); File fileWithSlash = new File(srcRoot, "acme/math/basic/__init__.py"); - String packageName = pythonPackageName(fileWithSlash, packageRoots, baseDir); + String packageName = pythonPackageName(fileWithSlash, packageRoots); assertThat(packageName).isEqualTo("acme.math.basic").doesNotContain("/").doesNotContain("\\"); } @@ -222,8 +243,8 @@ void package_name_with_package_roots_empty_package_name_for_root_files() { File rootFile1 = new File(srcRoot, "script.py"); File rootFile2 = new File(srcRoot, "main.py"); - assertThat(pythonPackageName(rootFile1, packageRoots, baseDir)).isEmpty(); - assertThat(pythonPackageName(rootFile2, packageRoots, baseDir)).isEmpty(); + assertThat(pythonPackageName(rootFile1, packageRoots)).isEmpty(); + assertThat(pythonPackageName(rootFile2, packageRoots)).isEmpty(); } @Test @@ -234,11 +255,11 @@ void package_name_with_package_roots_priority_order() { List packageRoots1 = List.of(soundRoot, packagesRoot); File soundFormatFile = new File(soundRoot, "formats/__init__.py"); - assertThat(pythonPackageName(soundFormatFile, packageRoots1, baseDir)) + assertThat(pythonPackageName(soundFormatFile, packageRoots1)) .isEqualTo("formats"); List packageRoots2 = List.of(packagesRoot); - assertThat(pythonPackageName(soundFormatFile, packageRoots2, baseDir)) + assertThat(pythonPackageName(soundFormatFile, packageRoots2)) .isEqualTo("sound.formats"); } From 835f7f02373a3859ae052702d82a1d02ac83a95f Mon Sep 17 00:00:00 2001 From: erwan-leforestier-sonarsource Date: Fri, 21 Aug 2026 09:18:40 +0200 Subject: [PATCH 319/322] SONARPY-4560 Fix false positives in test-file heuristic Co-authored-by: github-actions[bot] GitOrigin-RevId: 105a8782ffd7b534e581979c1b951f7dc1e94ac3 --- .../python/PythonTestFileClassifier.java | 60 +++++++++---- .../python/PythonTestFileClassifierTest.java | 86 ++++++++++++++++--- 2 files changed, 114 insertions(+), 32 deletions(-) diff --git a/python-frontend/src/main/java/org/sonar/plugins/python/PythonTestFileClassifier.java b/python-frontend/src/main/java/org/sonar/plugins/python/PythonTestFileClassifier.java index a7427203a..d172f4562 100644 --- a/python-frontend/src/main/java/org/sonar/plugins/python/PythonTestFileClassifier.java +++ b/python-frontend/src/main/java/org/sonar/plugins/python/PythonTestFileClassifier.java @@ -41,8 +41,12 @@ public final class PythonTestFileClassifier { private static final String[] TEST_FILE_PATH_PATTERNS = { "**/test/**", "**/tests/**", "**/testing/**", + "**/Test/**", "**/Tests/**", "**/Testing/**", "**/TEST/**", "**/TESTS/**", "**/TESTING/**", - "**/*test*", "*test*", "**/*Test*", "*Test*", "**/*TEST*", "*TEST*" + "**/conftest.py", + "**/test_*.py", + "**/*_test.py", "**/*_tests.py", + "**/*doctest.py", "**/*doctests.py" }; private static final Set TEST_MODULE_ROOTS = Set.of( "pytest", "unittest", "doctest", "hypothesis", "robot", "behave", "pytest_bdd", "nose", "nose2", @@ -62,7 +66,7 @@ public PythonTestFileClassifier(Configuration configuration) { * @return whether the file is likely test content */ public boolean looksLikeTestFile(InputFile inputFile, @Nullable FileInput tree) { - return delegate.looksLikeTestFile(inputFile, new PythonContext(tree)); + return delegate.looksLikeTestFile(inputFile, new PythonContext(inputFile, tree)); } /** @@ -75,14 +79,19 @@ public static boolean hasTestContent(@Nullable FileInput tree) { } private static boolean hasTestContentContext(TestFileClassifier.Context context) { - return context instanceof PythonContext pythonContext - && hasTestContent(pythonContext.tree); + PythonContext pythonContext = (PythonContext) context; + String fileName = fileName(pythonContext.inputFile.relativePath()); + return isUppercaseTestFileName(fileName) + || isCamelCaseTestFileName(fileName) + || hasTestContent(pythonContext.tree); } private static final class PythonContext implements TestFileClassifier.Context { + private final InputFile inputFile; private final FileInput tree; - private PythonContext(@Nullable FileInput tree) { + private PythonContext(InputFile inputFile, @Nullable FileInput tree) { + this.inputFile = inputFile; this.tree = tree; } } @@ -96,20 +105,25 @@ private static boolean looksLikeTestFileByStatements(@Nullable StatementList sta if (statements == null) { return false; } - int functionCount = 0; - int testFunctionCount = 0; + int declarationCount = 0; + int testDeclarationCount = 0; for (Statement statement : statements.statements()) { - if (isTestFrameworkImport(statement) || isTestClass(statement)) { + if (isTestFrameworkImport(statement)) { return true; } if (statement instanceof FunctionDef functionDef) { - functionCount++; + declarationCount++; if (isTestShaped(functionDef.name().name())) { - testFunctionCount++; + testDeclarationCount++; + } + } else if (statement instanceof ClassDef classDef) { + declarationCount++; + if (isTestShaped(classDef.name().name())) { + testDeclarationCount++; } } } - return testFunctionCount * 2 > functionCount; + return testDeclarationCount >= 2 && testDeclarationCount * 2 > declarationCount; } /** @@ -166,13 +180,21 @@ private static boolean isTestShaped(String name) { && (name.length() == 4 || !Character.isLowerCase(name.charAt(4))); } - /** - * Determines whether a statement declares a top-level test class. - * @param statement top-level statement to inspect - * @return whether the statement is a test class declaration - */ - private static boolean isTestClass(Statement statement) { - return statement instanceof ClassDef classDef - && isTestShaped(classDef.name().name()); + private static boolean isUppercaseTestFileName(String fileName) { + return fileName.startsWith("Test") + && fileName.endsWith(".py") + && (fileName.length() == 7 || !Character.isLowerCase(fileName.charAt(4))); } + + private static boolean isCamelCaseTestFileName(String fileName) { + return fileName.startsWith("test") + && fileName.endsWith(".py") + && Character.isUpperCase(fileName.charAt(4)); + } + + private static String fileName(String path) { + int fileNameStart = Math.max(path.lastIndexOf('/'), path.lastIndexOf('\\')) + 1; + return path.substring(fileNameStart); + } + } diff --git a/python-frontend/src/test/java/org/sonar/plugins/python/PythonTestFileClassifierTest.java b/python-frontend/src/test/java/org/sonar/plugins/python/PythonTestFileClassifierTest.java index e9dae3c0b..f6a3a801a 100644 --- a/python-frontend/src/test/java/org/sonar/plugins/python/PythonTestFileClassifierTest.java +++ b/python-frontend/src/test/java/org/sonar/plugins/python/PythonTestFileClassifierTest.java @@ -41,16 +41,46 @@ class PythonTestFileClassifierTest { @ValueSource(strings = { "tests/helpers.py", "src/TESTING/factories.py", - "src\\test\\conftest.py", - "src/TestCase.py", - "src/latest.py" + "src/Test/helpers.py", + "src/Tests/helpers.py", + "src/Testing/factories.py", + "src/test/conftest.py", + "conftest.py", + "src/test_module.py", + "test_module.py", + "src/testExample.py", + "src/Test.py", + "src/TestModule.py", + "src/module_test.py", + "module_test.py", + "src/module_tests.py", + "module_tests.py", + "src/module_doctest.py", + "module_doctest.py", + "src/module_doctests.py", + "module_doctests.py" }) - void path_signals_include_test_support_files_and_aggressive_filename_matches(String path) { + void path_signals_include_test_support_files_and_boundary_aware_filenames(String path) { assertThat(classifier().looksLikeTestFile(file(path), null)).isTrue(); } @ParameterizedTest - @ValueSource(strings = {"", "src/production.py", "src/module.py", "src/latest/module.py"}) + @ValueSource(strings = { + "", + "src/production.py", + "src/module.py", + "src/latest/module.py", + "src/greatest.py", + "src/latest_adopted_release_filter.py", + "src/primetest.py", + "src/stubtest.py", + "src/souptest.py", + "src/send_test_email.py", + "src/testExample.txt", + "src/testexample.py", + "src/Testing.py", + "src/Testimonial.py" + }) void non_test_paths_are_not_classified_without_an_ast_signal(String path) { assertThat(classifier().looksLikeTestFile(file(path), null)).isFalse(); } @@ -62,6 +92,8 @@ void shared_classifier_disables_the_python_detector_when_test_sources_are_config assertThat(new PythonTestFileClassifier(configuration) .looksLikeTestFile(file("src/production.py"), parse("import pytest\n"))).isFalse(); + assertThat(new PythonTestFileClassifier(configuration) + .looksLikeTestFile(file("src/TestModule.py"), null)).isFalse(); } @ParameterizedTest @@ -112,21 +144,39 @@ void generic_utility_imports_alone_are_not_classified(String code) { } @Test - void test_shaped_top_level_declarations_are_detected() { - assertThat(classifier().looksLikeTestFile(file("src/production.py"), parse("class TestService:\n pass\n"))).isTrue(); - assertThat(classifier().looksLikeTestFile(file("src/production.py"), parse("class test_service:\n pass\n"))).isTrue(); + void test_shaped_top_level_declarations_require_a_majority_of_two_or_more() { + assertThat(classifier().looksLikeTestFile(file("src/production.py"), parse("class TestService:\n pass\n"))).isFalse(); + assertThat(classifier().looksLikeTestFile(file("src/production.py"), parse("def test():\n pass\n"))).isFalse(); assertThat(classifier().looksLikeTestFile(file("src/production.py"), parse(""" - def Test(): + class TestService: pass - async def TEST_first(): + def test_synchronous(): pass - def test_second(): + async def test_asynchronous(): pass - def helper(): + class ProductionService: pass """))).isTrue(); } + @Test + void test_shaped_declarations_are_counted_with_other_top_level_classes() { + assertThat(classifier().looksLikeTestFile(file("src/production.py"), parse(""" + class Formatter: + pass + class HtmlFormatter: + pass + class TextFormatter: + pass + class JsonFormatter: + pass + class XmlFormatter: + pass + def test(): + pass + """))).isFalse(); + } + @Test void lowercase_continuations_after_test_are_not_test_shaped() { assertThat(classifier().looksLikeTestFile(file("src/production.py"), parse("class Testing:\n pass\n"))).isFalse(); @@ -141,13 +191,23 @@ def helper(): } @Test - void function_ratio_requires_a_strict_majority() { + void test_shaped_declaration_ratio_requires_a_strict_majority() { assertThat(classifier().looksLikeTestFile(file("src/production.py"), parse(""" def test_first(): pass def helper(): pass """))).isFalse(); + assertThat(classifier().looksLikeTestFile(file("src/production.py"), parse(""" + def test_first(): + pass + def test_second(): + pass + def first_helper(): + pass + def second_helper(): + pass + """))).isFalse(); assertThat(classifier().looksLikeTestFile(file("src/production.py"), parse("pass\n"))).isFalse(); } From c2a103d98ae879c6abb3aad5376f4c9458bd0515 Mon Sep 17 00:00:00 2001 From: Guillaume Dequenne Date: Fri, 21 Aug 2026 14:44:40 +0200 Subject: [PATCH 320/322] SONARPY-4568 Target Java 21 for analyzer builds GitOrigin-RevId: b5a982689055e1766a68d3e161925e68f8566740 --- docs/python-custom-rules-example/pom.xml | 4 ++-- its/plugin/python-custom-rules-plugin/pom.xml | 4 ++-- pom.xml | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/python-custom-rules-example/pom.xml b/docs/python-custom-rules-example/pom.xml index 6727f6f37..6ddb49d5c 100644 --- a/docs/python-custom-rules-example/pom.xml +++ b/docs/python-custom-rules-example/pom.xml @@ -76,8 +76,8 @@ maven-compiler-plugin 3.15.0 - 17 - 17 + 21 + 21 diff --git a/its/plugin/python-custom-rules-plugin/pom.xml b/its/plugin/python-custom-rules-plugin/pom.xml index 67807cf45..08d7ee5fd 100644 --- a/its/plugin/python-custom-rules-plugin/pom.xml +++ b/its/plugin/python-custom-rules-plugin/pom.xml @@ -67,8 +67,8 @@ maven-compiler-plugin - 1.8 - 1.8 + 21 + 21 diff --git a/pom.xml b/pom.xml index ab3df386b..bd9c9b363 100644 --- a/pom.xml +++ b/pom.xml @@ -117,12 +117,12 @@ 2.29.0.6136 - 11 + 21 - 17 - 17 - 17 + 21 + 21 + 21 From 35e340bc23d3898a69661c76c10cdea70ac00163 Mon Sep 17 00:00:00 2001 From: rombirli <56340680+rombirli@users.noreply.github.com> Date: Fri, 21 Aug 2026 14:51:17 +0200 Subject: [PATCH 321/322] SONARPY-4150 Fix S930 false positives from outdated pandas stubs GitOrigin-RevId: 5e4b6b0aa2f28369fd9a639de7602b5e54b37640 --- .../checks/PandasModifyInPlaceCheck.java | 50 +- .../test/resources/checks/argumentNumber.py | 6 + .../idna.core.protobuf | 172 +- .../idna.idnadata.protobuf | 11 +- .../idna.intranges.protobuf | 20 +- .../third_party_protobuf_mypy/idna.protobuf | 120 +- .../idna.uts46data.protobuf | 864 +- .../pandas._config.config.protobuf | 13 +- .../pandas._libs.lib.protobuf | 6 +- .../pandas._libs.properties.protobuf | 47 + .../pandas._libs.protobuf | 175 +- .../pandas._libs.tslibs.nattype.protobuf | 40 +- .../pandas._libs.tslibs.offsets.protobuf | 33 +- .../pandas._libs.tslibs.protobuf | 175 +- .../pandas._libs.tslibs.timedeltas.protobuf | Bin 72343 -> 72994 bytes .../pandas._libs.tslibs.timestamps.protobuf | 64 +- .../pandas._testing.protobuf | 442 +- .../pandas._typing.protobuf | 68 +- .../pandas.api.extensions.protobuf | Bin 17455 -> 18411 bytes .../pandas.api.types.protobuf | Bin 73609 -> 57848 bytes .../pandas.arrays.protobuf | 350 +- .../pandas.core.algorithms.protobuf | 28 +- .../pandas.core.api.protobuf | 53226 ++++++++------ .../pandas.core.arraylike.protobuf | 20 +- .../pandas.core.arrays.base.protobuf | Bin 16023 -> 16979 bytes .../pandas.core.arrays.boolean.protobuf | Bin 12317 -> 11241 bytes .../pandas.core.arrays.categorical.protobuf | Bin 48340 -> 42748 bytes .../pandas.core.arrays.datetimelike.protobuf | 104 +- .../pandas.core.arrays.datetimes.protobuf | Bin 8037 -> 7831 bytes .../pandas.core.arrays.integer.protobuf | 20 +- .../pandas.core.arrays.interval.protobuf | Bin 68800 -> 69591 bytes .../pandas.core.arrays.masked.protobuf | Bin 18038 -> 17642 bytes .../pandas.core.arrays.period.protobuf | 459 +- .../pandas.core.arrays.protobuf | Bin 78054 -> 70471 bytes .../pandas.core.arrays.sparse.array.protobuf | Bin 7807 -> 5751 bytes .../pandas.core.arrays.sparse.protobuf | Bin 17135 -> 15079 bytes .../pandas.core.base.protobuf | Bin 107253 -> 95785 bytes .../pandas.core.computation.pytables.protobuf | 18 +- .../pandas.core.dtypes.api.protobuf | Bin 67131 -> 51183 bytes .../pandas.core.dtypes.base.protobuf | 10 +- .../pandas.core.dtypes.common.protobuf | Bin 67153 -> 51205 bytes .../pandas.core.dtypes.dtypes.protobuf | 25 +- .../pandas.core.dtypes.generic.protobuf | 6 - .../pandas.core.dtypes.inference.protobuf | 3 - .../pandas.core.dtypes.missing.protobuf | 20 +- .../pandas.core.frame.protobuf | Bin 568915 -> 1201318 bytes .../pandas.core.generic.protobuf | 1134 +- .../pandas.core.groupby.generic.protobuf | Bin 630460 -> 344313 bytes .../pandas.core.groupby.groupby.protobuf | Bin 26562 -> 81172 bytes .../pandas.core.groupby.grouper.protobuf | Bin 5446 -> 11391 bytes .../pandas.core.groupby.indexing.protobuf | 103 + .../pandas.core.groupby.ops.protobuf | Bin 9763 -> 12626 bytes .../pandas.core.groupby.protobuf | Bin 7689 -> 407036 bytes .../pandas.core.indexes.accessors.protobuf | 277 +- .../pandas.core.indexes.api.protobuf | 4298 +- .../pandas.core.indexes.base.protobuf | 3655 +- .../pandas.core.indexes.category.protobuf | 287 +- .../pandas.core.indexes.datetimelike.protobuf | 327 +- .../pandas.core.indexes.datetimes.protobuf | 80 +- .../pandas.core.indexes.interval.protobuf | 23 +- .../pandas.core.indexes.multi.protobuf | 41 +- .../pandas.core.indexes.period.protobuf | 381 +- .../pandas.core.indexes.range.protobuf | Bin 9650 -> 8863 bytes .../pandas.core.indexes.timedeltas.protobuf | 120 +- .../pandas.core.resample.protobuf | 579 +- .../pandas.core.reshape.api.protobuf | 321 +- .../pandas.core.reshape.concat.protobuf | 304 +- .../pandas.core.reshape.merge.protobuf | 17 +- .../pandas.core.series.protobuf | 26848 +++---- .../pandas.core.strings.protobuf | 756 +- .../pandas.core.tools.datetimes.protobuf | 56 +- .../pandas.core.tools.numeric.protobuf | 95 +- .../pandas.core.tools.timedeltas.protobuf | 147 +- .../pandas.core.window.ewm.protobuf | 249 +- .../pandas.core.window.expanding.protobuf | 401 +- .../pandas.core.window.protobuf | 759 +- .../pandas.core.window.rolling.protobuf | Bin 30800 -> 25636 bytes .../pandas.io.api.protobuf | 1143 +- .../pandas.io.clipboards.protobuf | Bin 38065 -> 38872 bytes .../pandas.io.excel._base.protobuf | 664 +- .../pandas.io.excel.protobuf | 664 +- .../pandas.io.formats.style.protobuf | Bin 72507 -> 72904 bytes .../pandas.io.html.protobuf | Bin 5677 -> 6425 bytes .../pandas.io.json._json.protobuf | Bin 32699 -> 33723 bytes .../pandas.io.json.protobuf | Bin 31382 -> 32406 bytes .../pandas.io.parsers.protobuf | 220 +- .../pandas.io.parsers.readers.protobuf | 220 +- .../pandas.io.pytables.protobuf | 12 +- .../pandas.io.sql.protobuf | Bin 43960 -> 45340 bytes .../pandas.plotting._core.protobuf | Bin 58205 -> 57651 bytes .../pandas.plotting.protobuf | 156 +- .../third_party_protobuf_mypy/pandas.protobuf | 58870 +++++++++------- .../pandas.testing.protobuf | 107 +- .../pandas.tseries.frequencies.protobuf | 12 +- .../pandas.tseries.offsets.protobuf | 29 +- .../pandas.util._decorators.protobuf | 6 + .../pyspark.pandas.indexes.base.protobuf | Bin 31377 -> 31537 bytes .../pyspark.pandas.namespace.protobuf | 4 +- .../pyspark.pandas.typedef.protobuf | 22 +- .../pyspark.sql.connect._typing.protobuf | Bin 499858 -> 1128068 bytes .../pyspark.sql.connect.session.protobuf | 2 + .../pyspark.sql.pandas._typing.protobuf | Bin 3216656 -> 3881388 bytes .../checksums/importer.checksum | 2 +- .../typeshed_serializer/requirements.txt | 4 +- .../serializer_sources.checksum | 2 +- python-frontend/typeshed_serializer/tox.ini | 5 + 106 files changed, 87570 insertions(+), 72427 deletions(-) create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._libs.properties.protobuf delete mode 100644 python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.dtypes.generic.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.groupby.indexing.protobuf create mode 100644 python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.util._decorators.protobuf diff --git a/python-checks/src/main/java/org/sonar/python/checks/PandasModifyInPlaceCheck.java b/python-checks/src/main/java/org/sonar/python/checks/PandasModifyInPlaceCheck.java index e71fbdad7..a45b77502 100644 --- a/python-checks/src/main/java/org/sonar/python/checks/PandasModifyInPlaceCheck.java +++ b/python-checks/src/main/java/org/sonar/python/checks/PandasModifyInPlaceCheck.java @@ -21,26 +21,39 @@ import org.sonar.check.Rule; import org.sonar.plugins.python.api.PythonSubscriptionCheck; import org.sonar.plugins.python.api.SubscriptionContext; -import org.sonar.plugins.python.api.symbols.Symbol; import org.sonar.plugins.python.api.tree.CallExpression; import org.sonar.plugins.python.api.tree.Name; +import org.sonar.plugins.python.api.tree.QualifiedExpression; import org.sonar.plugins.python.api.tree.RegularArgument; import org.sonar.plugins.python.api.tree.Tree; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatcher; +import org.sonar.plugins.python.api.types.v2.matchers.TypeMatchers; import org.sonar.python.tree.TreeUtils; +import org.sonar.python.types.v2.matchers.InternalTypeMatchers; @Rule(key = "S6734") public class PandasModifyInPlaceCheck extends PythonSubscriptionCheck { private static final String MESSAGE = "Do not use \"inplace=True\" when modifying a dataframe."; - private static final Set FULLY_QUALIFIED_EXPRESSIONS = Set.of( - "pandas.core.frame.DataFrame.drop", - "pandas.core.frame.DataFrame.dropna", - "pandas.core.frame.DataFrame.drop_duplicates", - "pandas.core.frame.DataFrame.sort_values", - "pandas.core.frame.DataFrame.sort_index", - "pandas.core.frame.DataFrame.eval", - "pandas.core.frame.DataFrame.query"); + private static final Set METHOD_NAMES = Set.of( + "drop", + "dropna", + "drop_duplicates", + "sort_values", + "sort_index", + "eval", + "query"); + + private static final TypeMatcher IS_DATAFRAME = TypeMatchers.isObjectOfType("pandas.core.frame.DataFrame"); + private static final TypeMatcher IS_DATAFRAME_METHOD = TypeMatchers.isFunctionOwnerSatisfying( + TypeMatchers.isType("pandas.core.frame.DataFrame")); + private static final TypeMatcher IS_OR_CONTAINS_DATAFRAME = TypeMatchers.any( + IS_DATAFRAME, + InternalTypeMatchers.isAnyTypeInUnionSatisfying(IS_DATAFRAME)); + private static final TypeMatcher IS_OR_CONTAINS_DATAFRAME_METHOD = TypeMatchers.any( + IS_DATAFRAME_METHOD, + InternalTypeMatchers.isAnyTypeInUnionSatisfying(IS_DATAFRAME_METHOD)); @Override public void initialize(Context context) { @@ -49,15 +62,22 @@ public void initialize(Context context) { private static void checkInplaceParameter(SubscriptionContext ctx) { CallExpression callExpression = (CallExpression) ctx.syntaxNode(); - Optional.ofNullable(callExpression.calleeSymbol()) - .map(Symbol::fullyQualifiedName) - .filter(FULLY_QUALIFIED_EXPRESSIONS::contains) - .map(fqn -> TreeUtils.argumentByKeyword("inplace", callExpression.arguments())) + if (!(callExpression.callee() instanceof QualifiedExpression qualifiedExpression)) { + return; + } + if (!METHOD_NAMES.contains(qualifiedExpression.name().name())) { + return; + } + if (!IS_OR_CONTAINS_DATAFRAME_METHOD.isTrueFor(callExpression.callee(), ctx) + && !IS_OR_CONTAINS_DATAFRAME.isTrueFor(qualifiedExpression.qualifier(), ctx)) { + return; + } + RegularArgument inplaceArgument = TreeUtils.argumentByKeyword("inplace", callExpression.arguments()); + Optional.ofNullable(inplaceArgument) .map(RegularArgument::expression) .flatMap(TreeUtils.toOptionalInstanceOfMapper(Name.class)) .map(Name::name) .filter("True"::equals) - .flatMap(fqn -> Optional.ofNullable(TreeUtils.argumentByKeyword("inplace", callExpression.arguments()))) - .ifPresent(regularArgument -> ctx.addIssue(regularArgument, MESSAGE)); + .ifPresent(unused -> ctx.addIssue(inplaceArgument, MESSAGE)); } } diff --git a/python-checks/src/test/resources/checks/argumentNumber.py b/python-checks/src/test/resources/checks/argumentNumber.py index e99062aec..a13cc353a 100644 --- a/python-checks/src/test/resources/checks/argumentNumber.py +++ b/python-checks/src/test/resources/checks/argumentNumber.py @@ -318,3 +318,9 @@ def some_method(self, param): ... def torch(): import torch torch.cat(torch.Tensor(), axis=-1) + +def pandas(): + import pandas as pd + pd.testing.assert_index_equal(left_index, right_index, check_names=False) + df = pd.DataFrame() + df.stack("MASTER_FND_CODE", future_stack=True) diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/idna.core.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/idna.core.protobuf index b4830c4ea..2236cd523 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/idna.core.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/idna.core.protobuf @@ -1,9 +1,108 @@ - idna.core7 - IDNAErroridna.core.IDNAError"builtins.UnicodeError= + idna.core! + IDNAErroridna.core.IDNAError"builtins.UnicodeError* +__init__idna.core.IDNAError.__init__" +None*4 +self* +idna.core.IDNAError"idna.core.IDNAError*, +args" +builtins.object"builtins.object* +code +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"idna.core._ErrorCode +None *P +textD +Union[builtins.str,None] + builtins.str" builtins.str +None *U + codepointD +Union[builtins.int,None] + builtins.int" builtins.int +None *T +positionD +Union[builtins.int,None] + builtins.int" builtins.int +None rf +codeidna.core.IDNAError.codeD +Union[builtins.str,None] + builtins.str" builtins.str +Nonerf +textidna.core.IDNAError.textD +Union[builtins.str,None] + builtins.str" builtins.str +Nonerp + codepointidna.core.IDNAError.codepointD +Union[builtins.int,None] + builtins.int" builtins.int +Nonern +positionidna.core.IDNAError.positionD +Union[builtins.int,None] + builtins.int" builtins.int +None= IDNABidiErroridna.core.IDNABidiError"idna.core.IDNAErrorC InvalidCodepointidna.core.InvalidCodepoint"idna.core.IDNAErrorQ -InvalidCodepointContext!idna.core.InvalidCodepointContext"idna.core.IDNAErrorr +InvalidCodepointContext!idna.core.InvalidCodepointContext"idna.core.IDNAError + _joining_typeidna.core._joining_type"D +Union[builtins.str,None] + builtins.str" builtins.str +None*$ +cp + builtins.int" builtins.intr _combining_classidna.core._combining_class" builtins.int" builtins.int*$ cp @@ -28,10 +127,10 @@ _is_scriptidna.core._is_script" labelf "Union[builtins.bytes,builtins.str] builtins.bytes"builtins.bytes - builtins.str" builtins.str + builtins.str" builtins.str valid_string_lengthidna.core.valid_string_length" - builtins.bool" builtins.bool*q -labelf + builtins.bool" builtins.bool*r +domainf "Union[builtins.bytes,builtins.str] builtins.bytes"builtins.bytes builtins.str" builtins.str*0 @@ -87,7 +186,17 @@ check_bidiidna.core.check_bidi" 5Union[builtins.str,builtins.bytes,builtins.bytearray] builtins.str" builtins.str builtins.bytes"builtins.bytes( -builtins.bytearray"builtins.bytearray +builtins.bytearray"builtins.bytearray + _check_std3idna.core._check_std3" +None*& +text + builtins.str" builtins.str*( +domain + builtins.str" builtins.str*( +offset + builtins.int" builtins.int< +_warn_transitionalidna.core._warn_transitional" +None uts46_remapidna.core.uts46_remap" builtins.str" builtins.str*( domain @@ -112,7 +221,7 @@ std3_rules std3_rules builtins.bool" builtins.bool *2 transitional - builtins.bool" builtins.bool  + builtins.bool" builtins.bool  decodeidna.core.decode" builtins.str" builtins.str* s @@ -126,6 +235,8 @@ std3_rules builtins.bool" builtins.bool *0 std3_rules + builtins.bool" builtins.bool *- +display builtins.bool" builtins.bool * __annotations__idna.core.__annotations__W builtins.dict[builtins.str,Any] @@ -134,8 +245,49 @@ std3_rules _virama_combining_class!idna.core._virama_combining_class builtins.int" builtins.int*L _alabel_prefixidna.core._alabel_prefix -builtins.bytes"builtins.bytes*t +builtins.bytes"builtins.bytes*N +_max_input_lengthidna.core._max_input_length + builtins.int" builtins.int*F + _STATUS_VALIDidna.core._STATUS_VALID + builtins.int" builtins.int*H +_STATUS_MAPPEDidna.core._STATUS_MAPPED + builtins.int" builtins.int*N +_STATUS_DEVIATIONidna.core._STATUS_DEVIATION + builtins.int" builtins.int*J +_STATUS_IGNOREDidna.core._STATUS_IGNORED + builtins.int" builtins.int*t _unicode_dots_reidna.core._unicode_dots_reD re.Pattern[builtins.str] builtins.str" builtins.str" -re.Pattern \ No newline at end of file +re.Pattern*z +_std3_disallowed_reidna.core._std3_disallowed_reD +re.Pattern[builtins.str] + builtins.str" builtins.str" +re.Pattern* +_bidi_rtl_firstidna.core._bidi_rtl_firstT + builtins.frozenset[builtins.str] + builtins.str" builtins.str"builtins.frozenset* +_bidi_rtl_categoriesidna.core._bidi_rtl_categoriesT + builtins.frozenset[builtins.str] + builtins.str" builtins.str"builtins.frozenset* +_bidi_rtl_allowedidna.core._bidi_rtl_allowedT + builtins.frozenset[builtins.str] + builtins.str" builtins.str"builtins.frozenset* +_bidi_rtl_valid_ending idna.core._bidi_rtl_valid_endingT + builtins.frozenset[builtins.str] + builtins.str" builtins.str"builtins.frozenset* +_bidi_rtl_numericidna.core._bidi_rtl_numericT + builtins.frozenset[builtins.str] + builtins.str" builtins.str"builtins.frozenset* +_bidi_ltr_allowedidna.core._bidi_ltr_allowedT + builtins.frozenset[builtins.str] + builtins.str" builtins.str"builtins.frozenset* +_bidi_ltr_valid_ending idna.core._bidi_ltr_valid_endingT + builtins.frozenset[builtins.str] + builtins.str" builtins.str"builtins.frozenset* +_bidi_joiner_l_or_didna.core._bidi_joiner_l_or_dT + builtins.frozenset[builtins.str] + builtins.str" builtins.str"builtins.frozenset* +_bidi_joiner_r_or_didna.core._bidi_joiner_r_or_dT + builtins.frozenset[builtins.str] + builtins.str" builtins.str"builtins.frozenset \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/idna.idnadata.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/idna.idnadata.protobuf index 4181522dd..28559c685 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/idna.idnadata.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/idna.idnadata.protobuf @@ -10,11 +10,12 @@ 8builtins.dict[builtins.str,builtins.tuple[builtins.int]] builtins.str" builtins.strL builtins.tuple[builtins.int] - builtins.int" builtins.int"builtins.tuple" builtins.dict* - joining_typesidna.idnadata.joining_typesu -(builtins.dict[builtins.int,builtins.int] - builtins.int" builtins.int - builtins.int" builtins.int" builtins.dict* + builtins.int" builtins.int"builtins.tuple" builtins.dict* + joining_typesidna.idnadata.joining_types +8builtins.dict[builtins.str,builtins.tuple[builtins.int]] + builtins.str" builtins.strL +builtins.tuple[builtins.int] + builtins.int" builtins.int"builtins.tuple" builtins.dict* codepoint_classesidna.idnadata.codepoint_classes 8builtins.dict[builtins.str,builtins.tuple[builtins.int]] builtins.str" builtins.strL diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/idna.intranges.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/idna.intranges.protobuf index eaf9bc587..b2e2ab278 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/idna.intranges.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/idna.intranges.protobuf @@ -1,8 +1,9 @@ -idna.intranges -intranges_from_list"idna.intranges.intranges_from_list"L -builtins.tuple[builtins.int] - builtins.int" builtins.int"builtins.tuple*U +idna.intranges +intranges_from_list"idna.intranges.intranges_from_list"B +Tuple[builtins.int,Any] + builtins.int" builtins.int +Any*U list_J builtins.list[builtins.int] builtins.int" builtins.int" builtins.list @@ -17,14 +18,15 @@ builtins.int" builtins.int builtins.int" builtins.int*# r - builtins.int" builtins.int + builtins.int" builtins.int intranges_contain idna.intranges.intranges_contain" builtins.bool" builtins.bool*& int_ - builtins.int" builtins.int*X -rangesL -builtins.tuple[builtins.int] - builtins.int" builtins.int"builtins.tuple* + builtins.int" builtins.int*N +rangesB +Tuple[builtins.int,Any] + builtins.int" builtins.int +Any* __annotations__idna.intranges.__annotations__W builtins.dict[builtins.str,Any] builtins.str" builtins.str diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/idna.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/idna.protobuf index 82180ba5c..89050d4e5 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/idna.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/idna.protobuf @@ -1,7 +1,100 @@ idna= - IDNABidiErroridna.core.IDNABidiError"idna.core.IDNAError7 - IDNAErroridna.core.IDNAError"builtins.UnicodeErrorC + IDNABidiErroridna.core.IDNABidiError"idna.core.IDNAError! + IDNAErroridna.core.IDNAError"builtins.UnicodeError* +__init__idna.core.IDNAError.__init__" +None*4 +self* +idna.core.IDNAError"idna.core.IDNAError*, +args" +builtins.object"builtins.object* +code +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"idna.core._ErrorCode +None *P +textD +Union[builtins.str,None] + builtins.str" builtins.str +None *U + codepointD +Union[builtins.int,None] + builtins.int" builtins.int +None *T +positionD +Union[builtins.int,None] + builtins.int" builtins.int +None rf +codeidna.core.IDNAError.codeD +Union[builtins.str,None] + builtins.str" builtins.str +Nonerf +textidna.core.IDNAError.textD +Union[builtins.str,None] + builtins.str" builtins.str +Nonerp + codepointidna.core.IDNAError.codepointD +Union[builtins.int,None] + builtins.int" builtins.int +Nonern +positionidna.core.IDNAError.positionD +Union[builtins.int,None] + builtins.int" builtins.int +NoneC InvalidCodepointidna.core.InvalidCodepoint"idna.core.IDNAErrorQ InvalidCodepointContext!idna.core.InvalidCodepointContext"idna.core.IDNAErrore alabelidna.core.alabel" @@ -33,7 +126,7 @@ check_bidiidna.core.check_bidi" check_nfcidna.core.check_nfc" None*' label - builtins.str" builtins.str + builtins.str" builtins.str decodeidna.core.decode" builtins.str" builtins.str* s @@ -47,6 +140,8 @@ check_bidiidna.core.check_bidi" builtins.bool" builtins.bool *0 std3_rules + builtins.bool" builtins.bool *- +display builtins.bool" builtins.bool  encodeidna.core.encode" builtins.bytes"builtins.bytes* @@ -99,22 +194,23 @@ std3_rules labelf "Union[builtins.bytes,builtins.str] builtins.bytes"builtins.bytes - builtins.str" builtins.str + builtins.str" builtins.str valid_string_lengthidna.core.valid_string_length" - builtins.bool" builtins.bool*q -labelf + builtins.bool" builtins.bool*r +domainf "Union[builtins.bytes,builtins.str] builtins.bytes"builtins.bytes builtins.str" builtins.str*0 trailing_dot - builtins.bool" builtins.bool + builtins.bool" builtins.bool intranges_contain idna.intranges.intranges_contain" builtins.bool" builtins.bool*& int_ - builtins.int" builtins.int*X -rangesL -builtins.tuple[builtins.int] - builtins.int" builtins.int"builtins.tuple*e + builtins.int" builtins.int*N +rangesB +Tuple[builtins.int,Any] + builtins.int" builtins.int +Any*e __path__ idna.__path__J builtins.list[builtins.str] builtins.str" builtins.str" builtins.list* @@ -122,6 +218,8 @@ std3_rules builtins.dict[builtins.str,Any] builtins.str" builtins.str Any" builtins.dict*J +unicode_versionidna.idnadata.__version__ + builtins.str" builtins.str*J __version__idna.package_data.__version__ builtins.str" builtins.str*c __all__ idna.__all__J diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/idna.uts46data.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/idna.uts46data.protobuf index 9605fcc30..424efb3f0 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/idna.uts46data.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/idna.uts46data.protobuf @@ -1,858 +1,18 @@ -idna.uts46data -_seg_0idna.uts46data._seg_0" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_1idna.uts46data._seg_1" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_2idna.uts46data._seg_2" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_3idna.uts46data._seg_3" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_4idna.uts46data._seg_4" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_5idna.uts46data._seg_5" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_6idna.uts46data._seg_6" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_7idna.uts46data._seg_7" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_8idna.uts46data._seg_8" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_9idna.uts46data._seg_9" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_10idna.uts46data._seg_10" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_11idna.uts46data._seg_11" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_12idna.uts46data._seg_12" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_13idna.uts46data._seg_13" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_14idna.uts46data._seg_14" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_15idna.uts46data._seg_15" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_16idna.uts46data._seg_16" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_17idna.uts46data._seg_17" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_18idna.uts46data._seg_18" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_19idna.uts46data._seg_19" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_20idna.uts46data._seg_20" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_21idna.uts46data._seg_21" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_22idna.uts46data._seg_22" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_23idna.uts46data._seg_23" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_24idna.uts46data._seg_24" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_25idna.uts46data._seg_25" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_26idna.uts46data._seg_26" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_27idna.uts46data._seg_27" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_28idna.uts46data._seg_28" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_29idna.uts46data._seg_29" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_30idna.uts46data._seg_30" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_31idna.uts46data._seg_31" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_32idna.uts46data._seg_32" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_33idna.uts46data._seg_33" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_34idna.uts46data._seg_34" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_35idna.uts46data._seg_35" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_36idna.uts46data._seg_36" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_37idna.uts46data._seg_37" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_38idna.uts46data._seg_38" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_39idna.uts46data._seg_39" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_40idna.uts46data._seg_40" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_41idna.uts46data._seg_41" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_42idna.uts46data._seg_42" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_43idna.uts46data._seg_43" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_44idna.uts46data._seg_44" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_45idna.uts46data._seg_45" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_46idna.uts46data._seg_46" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_47idna.uts46data._seg_47" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_48idna.uts46data._seg_48" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_49idna.uts46data._seg_49" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_50idna.uts46data._seg_50" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_51idna.uts46data._seg_51" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_52idna.uts46data._seg_52" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_53idna.uts46data._seg_53" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_54idna.uts46data._seg_54" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_55idna.uts46data._seg_55" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_56idna.uts46data._seg_56" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_57idna.uts46data._seg_57" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_58idna.uts46data._seg_58" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_59idna.uts46data._seg_59" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_60idna.uts46data._seg_60" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_61idna.uts46data._seg_61" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_62idna.uts46data._seg_62" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_63idna.uts46data._seg_63" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_64idna.uts46data._seg_64" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_65idna.uts46data._seg_65" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_66idna.uts46data._seg_66" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_67idna.uts46data._seg_67" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_68idna.uts46data._seg_68" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_69idna.uts46data._seg_69" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_70idna.uts46data._seg_70" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_71idna.uts46data._seg_71" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_72idna.uts46data._seg_72" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_73idna.uts46data._seg_73" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_74idna.uts46data._seg_74" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_75idna.uts46data._seg_75" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_76idna.uts46data._seg_76" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_77idna.uts46data._seg_77" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_78idna.uts46data._seg_78" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_79idna.uts46data._seg_79" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_80idna.uts46data._seg_80" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_81idna.uts46data._seg_81" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_82idna.uts46data._seg_82" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list -_seg_83idna.uts46data._seg_83" -dbuiltins.list[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str" builtins.list* +idna.uts46data* __annotations__idna.uts46data.__annotations__W builtins.dict[builtins.str,Any] builtins.str" builtins.str Any" builtins.dict*G __version__idna.uts46data.__version__ - builtins.str" builtins.str* - uts46dataidna.uts46data.uts46data -ebuiltins.tuple[Union[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]] -UUnion[Tuple[builtins.int,builtins.str],Tuple[builtins.int,builtins.str,builtins.str]]` - Tuple[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str --Tuple[builtins.int,builtins.str,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str - builtins.str" builtins.str"builtins.tuple \ No newline at end of file + builtins.str" builtins.str*s + uts46_startsidna.uts46data.uts46_startsF +array.array[builtins.int] + builtins.int" builtins.int" array.array*Q +uts46_statusesidna.uts46data.uts46_statuses +builtins.bytes"builtins.bytes* +uts46_replacements!idna.uts46data.uts46_replacements +(builtins.tuple[Union[builtins.str,None]]D +Union[builtins.str,None] + builtins.str" builtins.str +None"builtins.tuple \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._config.config.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._config.config.protobuf index 83ca12615..86037f269 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._config.config.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._config.config.protobuf @@ -189,10 +189,15 @@ IOExcelXLS pandas._config.config.IOExcelXLS"!pandas._config.config.DictWrapperr parquet pandas._config.config.IO.parquetB pandas._config.config.IOParquet"pandas._config.config.IOParquetr_ sqlpandas._config.config.IO.sql: -pandas._config.config.IOSQL"pandas._config.config.IOSQL -Modepandas._config.config.Mode"!pandas._config.config.DictWrapperra -chained_assignment-pandas._config.config.Mode.chained_assignment - builtins.str" builtins.strrU +pandas._config.config.IOSQL"pandas._config.config.IOSQL +Modepandas._config.config.Mode"!pandas._config.config.DictWrapperr +chained_assignment-pandas._config.config.Mode.chained_assignment +7Union[Literal[builtins.str],Literal[builtins.str],None]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +NonerU data_manager'pandas._config.config.Mode.data_manager builtins.str" builtins.strr] sim_interactive*pandas._config.config.Mode.sim_interactive diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._libs.lib.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._libs.lib.protobuf index 8a63477a3..173ba9ccd 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._libs.lib.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._libs.lib.protobuf @@ -25,11 +25,7 @@ no_default&pandas._libs.lib._NoDefault.no_default& builtins.object"builtins.object*0 allow_sets - builtins.bool" builtins.bool x - is_intervalpandas._libs.lib.is_interval" - builtins.bool" builtins.bool*+ -val" -builtins.object"builtins.objectv + builtins.bool" builtins.bool v is_complexpandas._libs.lib.is_complex" builtins.bool" builtins.bool*+ diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._libs.properties.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._libs.properties.protobuf new file mode 100644 index 000000000..94dd32b5a --- /dev/null +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._libs.properties.protobuf @@ -0,0 +1,47 @@ + +pandas._libs.properties +CachedProperty&pandas._libs.properties.CachedProperty"builtins.object* +__init__/pandas._libs.properties.CachedProperty.__init__" +None*Z +selfP +&pandas._libs.properties.CachedProperty"&pandas._libs.properties.CachedProperty*U +funcK +CallableType[builtins.function]& +builtins.function"builtins.function*U +__get__.pandas._libs.properties.CachedProperty.__get__* +self* +obj* +typ* +__set__.pandas._libs.properties.CachedProperty.__set__" +None*Z +selfP +&pandas._libs.properties.CachedProperty"&pandas._libs.properties.CachedProperty* +obj +Any* +value +Any + AxisProperty$pandas._libs.properties.AxisProperty"builtins.object* +__init__-pandas._libs.properties.AxisProperty.__init__" +None*V +selfL +$pandas._libs.properties.AxisProperty"$pandas._libs.properties.AxisProperty*( +axis + builtins.int" builtins.int *' +doc + builtins.str" builtins.str *S +__get__,pandas._libs.properties.AxisProperty.__get__* +self* +obj* +typ* +__set__,pandas._libs.properties.AxisProperty.__set__" +None*V +selfL +$pandas._libs.properties.AxisProperty"$pandas._libs.properties.AxisProperty* +obj +Any* +value +Any* +__annotations__'pandas._libs.properties.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._libs.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._libs.protobuf index e77c88248..7298564ea 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._libs.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._libs.protobuf @@ -672,8 +672,12 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand mid"pandas._libs.interval.Interval.midL $pandas._libs.interval._MidDescriptor"$pandas._libs.interval._MidDescriptorr length%pandas._libs.interval.Interval.lengthR -'pandas._libs.interval._LengthDescriptor"'pandas._libs.interval._LengthDescriptor^ +'pandas._libs.interval._LengthDescriptor"'pandas._libs.interval._LengthDescriptork NaTType#pandas._libs.tslibs.nattype.NaTType"builtins.object* +__hash__,pandas._libs.tslibs.nattype.NaTType.__hash__" + builtins.int" builtins.int*T +selfJ +#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType* asm8(pandas._libs.tslibs.nattype.NaTType.asm8"$ numpy.datetime64"numpy.datetime64*T selfJ @@ -933,7 +937,39 @@ nanosecond.pandas._libs.tslibs.nattype.NaTType.nanosecond" __ne__*pandas._libs.tslibs.nattype.NaTType.__ne__" builtins.bool" builtins.bool*LJ #pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType*$" -builtins.object"builtins.objectr +builtins.object"builtins.object* +unit(pandas._libs.tslibs.nattype.NaTType.unit" +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.TimeUnit*T +selfJ +#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType0:builtins.property`* +as_unit+pandas._libs.tslibs.nattype.NaTType.as_unit" +(pandas._libs.tslibs.nattype.NaTType.SelfJ +#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType(* +self +(pandas._libs.tslibs.nattype.NaTType.SelfJ +#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType(* +unit +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.TimeUnit*. +round_ok + builtins.bool" builtins.bool r value)pandas._libs.tslibs.nattype.NaTType.value 4TypeAlias[numpy.signedinteger[numpy._typing._64Bit]]n )numpy.signedinteger[numpy._typing._64Bit], @@ -1378,8 +1414,8 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] __radd__*pandas._libs.tslibs.period.Period.__radd__"J #pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType*HF !pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*LJ -#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType0:typing.overloadX - Timedelta(pandas._libs.tslibs.timedeltas.Timedelta"datetime.timedelta*5 +#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType0:typing.overloadX + Timedelta(pandas._libs.tslibs.timedeltas.Timedelta"datetime.timedelta*- __new__0pandas._libs.tslibs.timedeltas.Timedelta.__new__" -pandas._libs.tslibs.timedeltas.Timedelta.SelfT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta(* @@ -1393,30 +1429,10 @@ nUnion[builtins.str,builtins.int,pandas._libs.tslibs.timedeltas.Timedelta,dateti builtins.int" builtins.intT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta( datetime.timedelta"datetime.timedelta& -numpy.timedelta64"numpy.timedelta64 *# -unit# -TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 +numpy.timedelta64"numpy.timedelta64 * +unit +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -1674,7 +1690,39 @@ aUnion[Tuple[TypeAlias[Any],builtins.int],Unknown,builtins.list[Any],TypeAlias[T builtins.list[Any] Any" builtins.listM TypeAlias[TypedDict] - TypedDict "$numpy._typing._dtype_like._DTypeDict"(numpy._typing._dtype_like._VoidDTypeLike"#numpy._typing._dtype_like.DTypeLike 2+ + TypedDict "$numpy._typing._dtype_like._DTypeDict"(numpy._typing._dtype_like._VoidDTypeLike"#numpy._typing._dtype_like.DTypeLike * +unit-pandas._libs.tslibs.timedeltas.Timedelta.unit" +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.TimeUnit*^ +selfT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta0:builtins.property`* +as_unit0pandas._libs.tslibs.timedeltas.Timedelta.as_unit" +-pandas._libs.tslibs.timedeltas.Timedelta.SelfT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta(* +self +-pandas._libs.tslibs.timedeltas.Timedelta.SelfT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta(* +unit +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.TimeUnit*. +round_ok + builtins.bool" builtins.bool 2+ __add__0pandas._libs.tslibs.timedeltas.Timedelta.__add__ __add__0pandas._libs.tslibs.timedeltas.Timedelta.__add__"T (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta*VT @@ -1838,7 +1886,7 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] mUnion[pandas.core.series.TimedeltaSeries,pandas.core.series.Series[pandas._libs.tslibs.timedeltas.Timedelta]]H "pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries Cpandas.core.series.Series[pandas._libs.tslibs.timedeltas.Timedelta]T -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas.core.series.Series0:typing.overloadX2$ +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas.core.series.Series0:typing.overloadX2$ __rsub__1pandas._libs.tslibs.timedeltas.Timedelta.__rsub__ __rsub__1pandas._libs.tslibs.timedeltas.Timedelta.__rsub__"T (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta*VT @@ -1846,11 +1894,12 @@ Cpandas.core.series.Series[pandas._libs.tslibs.timedeltas.Timedelta]T TUnion[datetime.timedelta,pandas._libs.tslibs.timedeltas.Timedelta,numpy.timedelta64]( datetime.timedelta"datetime.timedeltaT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta& -numpy.timedelta64"numpy.timedelta640:typing.overloadX +numpy.timedelta64"numpy.timedelta640:typing.overloadX __rsub__1pandas._libs.tslibs.timedeltas.Timedelta.__rsub__"T (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp*VT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta* -@Union[pandas._libs.tslibs.timestamps.Timestamp,numpy.datetime64]T +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta* +RUnion[datetime.datetime,pandas._libs.tslibs.timestamps.Timestamp,numpy.datetime64]& +datetime.datetime"datetime.datetimeT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp$ numpy.datetime64"numpy.datetime640:typing.overloadX __rsub__1pandas._libs.tslibs.timedeltas.Timedelta.__rsub__"J @@ -2377,7 +2426,7 @@ Cpandas.core.series.Series[pandas._libs.tslibs.timedeltas.Timedelta]T resolution3pandas._libs.tslibs.timedeltas.Timedelta.resolutionT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.TimedeltarU value.pandas._libs.tslibs.timedeltas.Timedelta.value - builtins.int" builtins.intю + builtins.int" builtins.int Timestamp(pandas._libs.tslibs.timestamps.Timestamp"datetime.datetime* __new__0pandas._libs.tslibs.timestamps.Timestamp.__new__" -pandas._libs.tslibs.timestamps.Timestamp.SelfT @@ -2574,12 +2623,14 @@ nanosecond3pandas._libs.tslibs.timestamps.Timestamp.nanosecond" cls 3Type[pandas._libs.tslibs.timestamps.Timestamp.Self] -pandas._libs.tslibs.timestamps.Timestamp.SelfT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp("type0:builtins.classmethodp* -combine0pandas._libs.tslibs.timestamps.Timestamp.combine"& -datetime.datetime"datetime.datetime* -cls -.Type[pandas._libs.tslibs.timestamps.Timestamp]T -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"type*( +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp("type0:builtins.classmethodp* +combine0pandas._libs.tslibs.timestamps.Timestamp.combine" +-pandas._libs.tslibs.timestamps.Timestamp.SelfT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp(* +cls +3Type[pandas._libs.tslibs.timestamps.Timestamp.Self] +-pandas._libs.tslibs.timestamps.Timestamp.SelfT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp("type*( date datetime.date" datetime.date*( time @@ -2762,13 +2813,9 @@ astimezone3pandas._libs.tslibs.timestamps.Timestamp.astimezone" isoweekday3pandas._libs.tslibs.timestamps.Timestamp.isoweekday" builtins.int" builtins.int*^ selfT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp* - isocalendar4pandas._libs.tslibs.timestamps.Timestamp.isocalendar" -8TypeAlias[Tuple[builtins.int,builtins.int,builtins.int]] --Tuple[builtins.int,builtins.int,builtins.int] - builtins.int" builtins.int - builtins.int" builtins.int - builtins.int" builtins.int"/pandas._libs.tslibs.timestamps._IsoCalendarDate*^ +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp* + isocalendar4pandas._libs.tslibs.timestamps.Timestamp.isocalendar" +Any*^ selfT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp* is_leap_year5pandas._libs.tslibs.timestamps.Timestamp.is_leap_year" @@ -3022,7 +3069,39 @@ weekofyear3pandas._libs.tslibs.timestamps.Timestamp.weekofyear" daysinmonth4pandas._libs.tslibs.timestamps.Timestamp.daysinmonth" builtins.int" builtins.int*^ selfT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp0:builtins.property`2 +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp0:builtins.property`* +unit-pandas._libs.tslibs.timestamps.Timestamp.unit" +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.TimeUnit*^ +selfT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp0:builtins.property`* +as_unit0pandas._libs.tslibs.timestamps.Timestamp.as_unit" +-pandas._libs.tslibs.timestamps.Timestamp.SelfT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp(* +self +-pandas._libs.tslibs.timestamps.Timestamp.SelfT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp(* +unit +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.TimeUnit*. +round_ok + builtins.bool" builtins.bool 2 __le__/pandas._libs.tslibs.timestamps.Timestamp.__le__ __le__/pandas._libs.tslibs.timestamps.Timestamp.__le__" builtins.bool" builtins.bool*VT diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._libs.tslibs.nattype.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._libs.tslibs.nattype.protobuf index 2733a7d53..c1daf2c12 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._libs.tslibs.nattype.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._libs.tslibs.nattype.protobuf @@ -45,8 +45,12 @@ pUnion[datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,nu datetime.timedelta"datetime.timedeltaF !pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period$ numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64"/pandas._libs.tslibs.nattype._NaTComparisonTypes^ +numpy.timedelta64"numpy.timedelta64"/pandas._libs.tslibs.nattype._NaTComparisonTypesk NaTType#pandas._libs.tslibs.nattype.NaTType"builtins.object* +__hash__,pandas._libs.tslibs.nattype.NaTType.__hash__" + builtins.int" builtins.int*T +selfJ +#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType* asm8(pandas._libs.tslibs.nattype.NaTType.asm8"$ numpy.datetime64"numpy.datetime64*T selfJ @@ -306,7 +310,39 @@ nanosecond.pandas._libs.tslibs.nattype.NaTType.nanosecond" __ne__*pandas._libs.tslibs.nattype.NaTType.__ne__" builtins.bool" builtins.bool*LJ #pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType*$" -builtins.object"builtins.objectr +builtins.object"builtins.object* +unit(pandas._libs.tslibs.nattype.NaTType.unit" +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.TimeUnit*T +selfJ +#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType0:builtins.property`* +as_unit+pandas._libs.tslibs.nattype.NaTType.as_unit" +(pandas._libs.tslibs.nattype.NaTType.SelfJ +#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType(* +self +(pandas._libs.tslibs.nattype.NaTType.SelfJ +#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType(* +unit +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.TimeUnit*. +round_ok + builtins.bool" builtins.bool r value)pandas._libs.tslibs.nattype.NaTType.value 4TypeAlias[numpy.signedinteger[numpy._typing._64Bit]]n )numpy.signedinteger[numpy._typing._64Bit], diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._libs.tslibs.offsets.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._libs.tslibs.offsets.protobuf index 627dd99b9..f0b111987 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._libs.tslibs.offsets.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._libs.tslibs.offsets.protobuf @@ -296,8 +296,21 @@ __reduce__>pandas._libs.tslibs.offsets.SingleConstructorOffset.__reduce__* normalize builtins.bool" builtins.bool *6 offset( -datetime.timedelta"datetime.timedelta a - BusinessDay'pandas._libs.tslibs.offsets.BusinessDay")pandas._libs.tslibs.offsets.BusinessMixin +datetime.timedelta"datetime.timedelta  + BusinessDay'pandas._libs.tslibs.offsets.BusinessDay"&pandas._libs.tslibs.offsets.BaseOffset* +__init__0pandas._libs.tslibs.offsets.BusinessDay.__init__" +None*\ +selfR +'pandas._libs.tslibs.offsets.BusinessDay"'pandas._libs.tslibs.offsets.BusinessDay*% +n + builtins.int" builtins.int */ + normalize + builtins.bool" builtins.bool *6 +offset( +datetime.timedelta"datetime.timedelta *J + +__reduce__2pandas._libs.tslibs.offsets.BusinessDay.__reduce__* +self BusinessHour(pandas._libs.tslibs.offsets.BusinessHour")pandas._libs.tslibs.offsets.BusinessMixin* __init__1pandas._libs.tslibs.offsets.BusinessHour.__init__" None*^ @@ -516,9 +529,9 @@ VUnion[builtins.str,datetime.time,typing.Collection[Union[builtins.str,datetime. Any" builtins.list None ~ CustomBusinessMonthEnd2pandas._libs.tslibs.offsets.CustomBusinessMonthEnd"0pandas._libs.tslibs.offsets._CustomBusinessMonth -CustomBusinessMonthBegin4pandas._libs.tslibs.offsets.CustomBusinessMonthBegin"0pandas._libs.tslibs.offsets._CustomBusinessMonth +CustomBusinessMonthBegin4pandas._libs.tslibs.offsets.CustomBusinessMonthBegin"0pandas._libs.tslibs.offsets._CustomBusinessMonth -DateOffset&pandas._libs.tslibs.offsets.DateOffset"/pandas._libs.tslibs.offsets.RelativeDeltaOffset* +DateOffset&pandas._libs.tslibs.offsets.DateOffset"/pandas._libs.tslibs.offsets.RelativeDeltaOffset* __init__/pandas._libs.tslibs.offsets.DateOffset.__init__" None*Z selfP @@ -552,9 +565,11 @@ DateOffset&pandas._libs.tslibs.offsets.DateOffset"/pandas._libs.tslibs.offsets. month builtins.int" builtins.int *' day - builtins.int" builtins.int *+ -weekday - builtins.int" builtins.int *( + builtins.int" builtins.int *Q +weekdayB +Union[builtins.int,Any] + builtins.int" builtins.int +Any *( hour builtins.int" builtins.int ** minute @@ -617,7 +632,9 @@ MUnion[datetime.timedelta,pandas._libs.tslibs.offsets.BaseOffset,builtins.str] __annotations__+pandas._libs.tslibs.offsets.__annotations__W builtins.dict[builtins.str,Any] builtins.str" builtins.str -Any" builtins.dict* +Any" builtins.dict*A + WeekdayClass(pandas._libs.tslibs.offsets.WeekdayClass +Any* npnumpy * prefix_mapping*pandas._libs.tslibs.offsets.prefix_mappingx )builtins.dict[builtins.str,builtins.type] diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._libs.tslibs.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._libs.tslibs.protobuf index 38a134cb6..46bdfd5ac 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._libs.tslibs.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._libs.tslibs.protobuf @@ -1,6 +1,10 @@ -pandas._libs.tslibs^ +pandas._libs.tslibsk NaTType#pandas._libs.tslibs.nattype.NaTType"builtins.object* +__hash__,pandas._libs.tslibs.nattype.NaTType.__hash__" + builtins.int" builtins.int*T +selfJ +#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType* asm8(pandas._libs.tslibs.nattype.NaTType.asm8"$ numpy.datetime64"numpy.datetime64*T selfJ @@ -260,7 +264,39 @@ nanosecond.pandas._libs.tslibs.nattype.NaTType.nanosecond" __ne__*pandas._libs.tslibs.nattype.NaTType.__ne__" builtins.bool" builtins.bool*LJ #pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType*$" -builtins.object"builtins.objectr +builtins.object"builtins.object* +unit(pandas._libs.tslibs.nattype.NaTType.unit" +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.TimeUnit*T +selfJ +#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType0:builtins.property`* +as_unit+pandas._libs.tslibs.nattype.NaTType.as_unit" +(pandas._libs.tslibs.nattype.NaTType.SelfJ +#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType(* +self +(pandas._libs.tslibs.nattype.NaTType.SelfJ +#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType(* +unit +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.TimeUnit*. +round_ok + builtins.bool" builtins.bool r value)pandas._libs.tslibs.nattype.NaTType.value 4TypeAlias[numpy.signedinteger[numpy._typing._64Bit]]n )numpy.signedinteger[numpy._typing._64Bit], @@ -969,8 +1005,8 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] __radd__*pandas._libs.tslibs.period.Period.__radd__"J #pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType*HF !pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*LJ -#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType0:typing.overloadX - Timedelta(pandas._libs.tslibs.timedeltas.Timedelta"datetime.timedelta*5 +#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType0:typing.overloadX + Timedelta(pandas._libs.tslibs.timedeltas.Timedelta"datetime.timedelta*- __new__0pandas._libs.tslibs.timedeltas.Timedelta.__new__" -pandas._libs.tslibs.timedeltas.Timedelta.SelfT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta(* @@ -984,30 +1020,10 @@ nUnion[builtins.str,builtins.int,pandas._libs.tslibs.timedeltas.Timedelta,dateti builtins.int" builtins.intT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta( datetime.timedelta"datetime.timedelta& -numpy.timedelta64"numpy.timedelta64 *# -unit# -TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 +numpy.timedelta64"numpy.timedelta64 * +unit +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -1265,7 +1281,39 @@ aUnion[Tuple[TypeAlias[Any],builtins.int],Unknown,builtins.list[Any],TypeAlias[T builtins.list[Any] Any" builtins.listM TypeAlias[TypedDict] - TypedDict "$numpy._typing._dtype_like._DTypeDict"(numpy._typing._dtype_like._VoidDTypeLike"#numpy._typing._dtype_like.DTypeLike 2+ + TypedDict "$numpy._typing._dtype_like._DTypeDict"(numpy._typing._dtype_like._VoidDTypeLike"#numpy._typing._dtype_like.DTypeLike * +unit-pandas._libs.tslibs.timedeltas.Timedelta.unit" +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.TimeUnit*^ +selfT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta0:builtins.property`* +as_unit0pandas._libs.tslibs.timedeltas.Timedelta.as_unit" +-pandas._libs.tslibs.timedeltas.Timedelta.SelfT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta(* +self +-pandas._libs.tslibs.timedeltas.Timedelta.SelfT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta(* +unit +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.TimeUnit*. +round_ok + builtins.bool" builtins.bool 2+ __add__0pandas._libs.tslibs.timedeltas.Timedelta.__add__ __add__0pandas._libs.tslibs.timedeltas.Timedelta.__add__"T (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta*VT @@ -1429,7 +1477,7 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] mUnion[pandas.core.series.TimedeltaSeries,pandas.core.series.Series[pandas._libs.tslibs.timedeltas.Timedelta]]H "pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries Cpandas.core.series.Series[pandas._libs.tslibs.timedeltas.Timedelta]T -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas.core.series.Series0:typing.overloadX2$ +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas.core.series.Series0:typing.overloadX2$ __rsub__1pandas._libs.tslibs.timedeltas.Timedelta.__rsub__ __rsub__1pandas._libs.tslibs.timedeltas.Timedelta.__rsub__"T (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta*VT @@ -1437,11 +1485,12 @@ Cpandas.core.series.Series[pandas._libs.tslibs.timedeltas.Timedelta]T TUnion[datetime.timedelta,pandas._libs.tslibs.timedeltas.Timedelta,numpy.timedelta64]( datetime.timedelta"datetime.timedeltaT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta& -numpy.timedelta64"numpy.timedelta640:typing.overloadX +numpy.timedelta64"numpy.timedelta640:typing.overloadX __rsub__1pandas._libs.tslibs.timedeltas.Timedelta.__rsub__"T (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp*VT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta* -@Union[pandas._libs.tslibs.timestamps.Timestamp,numpy.datetime64]T +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta* +RUnion[datetime.datetime,pandas._libs.tslibs.timestamps.Timestamp,numpy.datetime64]& +datetime.datetime"datetime.datetimeT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp$ numpy.datetime64"numpy.datetime640:typing.overloadX __rsub__1pandas._libs.tslibs.timedeltas.Timedelta.__rsub__"J @@ -1968,7 +2017,7 @@ Cpandas.core.series.Series[pandas._libs.tslibs.timedeltas.Timedelta]T resolution3pandas._libs.tslibs.timedeltas.Timedelta.resolutionT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.TimedeltarU value.pandas._libs.tslibs.timedeltas.Timedelta.value - builtins.int" builtins.intю + builtins.int" builtins.int Timestamp(pandas._libs.tslibs.timestamps.Timestamp"datetime.datetime* __new__0pandas._libs.tslibs.timestamps.Timestamp.__new__" -pandas._libs.tslibs.timestamps.Timestamp.SelfT @@ -2165,12 +2214,14 @@ nanosecond3pandas._libs.tslibs.timestamps.Timestamp.nanosecond" cls 3Type[pandas._libs.tslibs.timestamps.Timestamp.Self] -pandas._libs.tslibs.timestamps.Timestamp.SelfT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp("type0:builtins.classmethodp* -combine0pandas._libs.tslibs.timestamps.Timestamp.combine"& -datetime.datetime"datetime.datetime* -cls -.Type[pandas._libs.tslibs.timestamps.Timestamp]T -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"type*( +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp("type0:builtins.classmethodp* +combine0pandas._libs.tslibs.timestamps.Timestamp.combine" +-pandas._libs.tslibs.timestamps.Timestamp.SelfT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp(* +cls +3Type[pandas._libs.tslibs.timestamps.Timestamp.Self] +-pandas._libs.tslibs.timestamps.Timestamp.SelfT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp("type*( date datetime.date" datetime.date*( time @@ -2353,13 +2404,9 @@ astimezone3pandas._libs.tslibs.timestamps.Timestamp.astimezone" isoweekday3pandas._libs.tslibs.timestamps.Timestamp.isoweekday" builtins.int" builtins.int*^ selfT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp* - isocalendar4pandas._libs.tslibs.timestamps.Timestamp.isocalendar" -8TypeAlias[Tuple[builtins.int,builtins.int,builtins.int]] --Tuple[builtins.int,builtins.int,builtins.int] - builtins.int" builtins.int - builtins.int" builtins.int - builtins.int" builtins.int"/pandas._libs.tslibs.timestamps._IsoCalendarDate*^ +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp* + isocalendar4pandas._libs.tslibs.timestamps.Timestamp.isocalendar" +Any*^ selfT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp* is_leap_year5pandas._libs.tslibs.timestamps.Timestamp.is_leap_year" @@ -2613,7 +2660,39 @@ weekofyear3pandas._libs.tslibs.timestamps.Timestamp.weekofyear" daysinmonth4pandas._libs.tslibs.timestamps.Timestamp.daysinmonth" builtins.int" builtins.int*^ selfT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp0:builtins.property`2 +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp0:builtins.property`* +unit-pandas._libs.tslibs.timestamps.Timestamp.unit" +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.TimeUnit*^ +selfT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp0:builtins.property`* +as_unit0pandas._libs.tslibs.timestamps.Timestamp.as_unit" +-pandas._libs.tslibs.timestamps.Timestamp.SelfT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp(* +self +-pandas._libs.tslibs.timestamps.Timestamp.SelfT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp(* +unit +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.TimeUnit*. +round_ok + builtins.bool" builtins.bool 2 __le__/pandas._libs.tslibs.timestamps.Timestamp.__le__ __le__/pandas._libs.tslibs.timestamps.Timestamp.__le__" builtins.bool" builtins.bool*VT diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._libs.tslibs.timedeltas.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._libs.tslibs.timedeltas.protobuf index 2c78a8af36c87a629e6e50f576375e4d91a5cf3f..ffa0abc81ba36836bae5c20658a6ae1206d699d5 100644 GIT binary patch delta 349 zcmbQfm1WT`mJOZ~OdTDQy(PRkKkIU_$H(WTmQP-oroZ`|gfg?h1!*pp(!9(P0Y<6A z(p-O8H#5roX5xyC6=0X@6y^HFx|v(%Bh%*f%2U}l*Xf>B<<$De0?{zJ&{vxiq*LiU zGgszhMwxVeu&!fFTydd!nfZCqlN;qDCT~!FCZQx=keHW}SgaRcQdy9hm#!C*nVSk! zGr7UEl6yZp7kgrHJjkTU3njEUplqeda@N}>H`pHJzr_r9At9U8aoJR&rN_lllwX>c z5}%(fz&JgThf!g(XYez9#t)kfnmw2p8zvVtM@_z;DKPnVo7Uv_nURxg!{jGlS|I@z Xo82Zl`DU2LWF{$T5P$RSwmp*poGg7) delta 168 zcmZ3qi)H#&mJOZ~On;judrNq8J~icHkB`qwEuU-{t-tx4gfg?hA!RO>(!9(P0Y<5< z%3L?uH#5roW}2)Z_mFkIG}k%y$qW2rHy@C(VFD5+jFWRho^K9Nwqe`+K&?_^^PJEp z`i$E)H@12(F&$%`e6G`OQk(Q-gB*d$-Vx0_hZ&^~FmgGB=4IyRO;==RlmyHC>kysH OVhU5GwRuA4q{#pju{}@# diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._libs.tslibs.timestamps.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._libs.tslibs.timestamps.protobuf index d16a979a5..d0cef1c78 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._libs.tslibs.timestamps.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._libs.tslibs.timestamps.protobuf @@ -354,7 +354,7 @@ resolutiondatetime.time.resolution( datetime.datetime"datetime.datetime*, self" datetime.tzinfo"datetime.tzinfo*(& -datetime.datetime"datetime.datetimeю +datetime.datetime"datetime.datetime Timestamp(pandas._libs.tslibs.timestamps.Timestamp"datetime.datetime* __new__0pandas._libs.tslibs.timestamps.Timestamp.__new__" -pandas._libs.tslibs.timestamps.Timestamp.SelfT @@ -551,12 +551,14 @@ nanosecond3pandas._libs.tslibs.timestamps.Timestamp.nanosecond" cls 3Type[pandas._libs.tslibs.timestamps.Timestamp.Self] -pandas._libs.tslibs.timestamps.Timestamp.SelfT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp("type0:builtins.classmethodp* -combine0pandas._libs.tslibs.timestamps.Timestamp.combine"& -datetime.datetime"datetime.datetime* -cls -.Type[pandas._libs.tslibs.timestamps.Timestamp]T -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"type*( +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp("type0:builtins.classmethodp* +combine0pandas._libs.tslibs.timestamps.Timestamp.combine" +-pandas._libs.tslibs.timestamps.Timestamp.SelfT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp(* +cls +3Type[pandas._libs.tslibs.timestamps.Timestamp.Self] +-pandas._libs.tslibs.timestamps.Timestamp.SelfT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp("type*( date datetime.date" datetime.date*( time @@ -739,13 +741,9 @@ astimezone3pandas._libs.tslibs.timestamps.Timestamp.astimezone" isoweekday3pandas._libs.tslibs.timestamps.Timestamp.isoweekday" builtins.int" builtins.int*^ selfT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp* - isocalendar4pandas._libs.tslibs.timestamps.Timestamp.isocalendar" -8TypeAlias[Tuple[builtins.int,builtins.int,builtins.int]] --Tuple[builtins.int,builtins.int,builtins.int] - builtins.int" builtins.int - builtins.int" builtins.int - builtins.int" builtins.int"/pandas._libs.tslibs.timestamps._IsoCalendarDate*^ +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp* + isocalendar4pandas._libs.tslibs.timestamps.Timestamp.isocalendar" +Any*^ selfT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp* is_leap_year5pandas._libs.tslibs.timestamps.Timestamp.is_leap_year" @@ -999,7 +997,39 @@ weekofyear3pandas._libs.tslibs.timestamps.Timestamp.weekofyear" daysinmonth4pandas._libs.tslibs.timestamps.Timestamp.daysinmonth" builtins.int" builtins.int*^ selfT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp0:builtins.property`2 +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp0:builtins.property`* +unit-pandas._libs.tslibs.timestamps.Timestamp.unit" +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.TimeUnit*^ +selfT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp0:builtins.property`* +as_unit0pandas._libs.tslibs.timestamps.Timestamp.as_unit" +-pandas._libs.tslibs.timestamps.Timestamp.SelfT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp(* +self +-pandas._libs.tslibs.timestamps.Timestamp.SelfT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp(* +unit +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.TimeUnit*. +round_ok + builtins.bool" builtins.bool 2 __le__/pandas._libs.tslibs.timestamps.Timestamp.__le__ __le__/pandas._libs.tslibs.timestamps.Timestamp.__le__" builtins.bool" builtins.bool*VT @@ -1310,5 +1340,7 @@ resolution3pandas._libs.tslibs.timestamps.Timestamp.resolutionT __annotations__.pandas._libs.tslibs.timestamps.__annotations__W builtins.dict[builtins.str,Any] builtins.str" builtins.str -Any" builtins.dict* +Any" builtins.dict*L +_IsoCalendarDate/pandas._libs.tslibs.timestamps._IsoCalendarDate +Any* npnumpy  \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._testing.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._testing.protobuf index 1afb0406b..19459a4ac 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._testing.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._testing.protobuf @@ -1,30 +1,36 @@ -pandas._testing. - getSeriesDatapandas._testing.getSeriesData -assert_almost_equal#pandas._testing.assert_almost_equal" -Any* -left -Any* -right -Any*v - check_dtypec -!Union[builtins.bool,builtins.str] - builtins.bool" builtins.bool - builtins.str" builtins.str *} -check_less_precisec -!Union[builtins.bool,builtins.int] - builtins.bool" builtins.bool - builtins.int" builtins.int * +pandas._testing +assert_almost_equal#pandas._testing.assert_almost_equal" +None*S +leftI +pandas._typing.T" +builtins.object"builtins.object"builtins.object*T +rightI +pandas._typing.T" +builtins.object"builtins.object"builtins.object* + check_dtype +*Union[builtins.bool,Literal[builtins.str]] + builtins.bool" builtins.bool7 +Literal[builtins.str]  + builtins.str" builtins.str *, +rtol +builtins.float"builtins.float *, +atol +builtins.float"builtins.float * kwargs -Any -assert_dict_equal!pandas._testing.assert_dict_equal" -Any* -left -Any* -right -Any*2 +Any +assert_dict_equal!pandas._testing.assert_dict_equal" +None*C +left9 +builtins.dict[Any,Any] +Any +Any" builtins.dict*D +right9 +builtins.dict[Any,Any] +Any +Any" builtins.dict*2 compare_keys - builtins.bool" builtins.bool  + builtins.bool" builtins.bool  assert_index_equal"pandas._testing.assert_index_equal" None*X leftN @@ -32,113 +38,193 @@ Any"pandas.core.indexes.base.Index*Y rightN #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index -assert_class_equal"pandas._testing.assert_class_equal" -Any* -left -Any* -right -Any*p -exactc -!Union[builtins.bool,builtins.str] - builtins.bool" builtins.bool - builtins.str" builtins.str * -obj -Any  -assert_attr_equal!pandas._testing.assert_attr_equal" -Any* -attr -Any* -left -Any* -right -Any*' +Any"pandas.core.indexes.base.Index* +exact +*Union[builtins.bool,Literal[builtins.str]] + builtins.bool" builtins.bool7 +Literal[builtins.str]  + builtins.str" builtins.str *1 + check_names + builtins.bool" builtins.bool *1 + check_exact + builtins.bool" builtins.bool *7 +check_categorical + builtins.bool" builtins.bool *1 + check_order + builtins.bool" builtins.bool *, +rtol +builtins.float"builtins.float *, +atol +builtins.float"builtins.float *' +obj + builtins.str" builtins.str  +assert_class_equal"pandas._testing.assert_class_equal" +None*S +leftI +pandas._typing.T" +builtins.object"builtins.object"builtins.object*T +rightI +pandas._typing.T" +builtins.object"builtins.object"builtins.object* +exact +*Union[builtins.bool,Literal[builtins.str]] + builtins.bool" builtins.bool7 +Literal[builtins.str]  + builtins.str" builtins.str *' obj - builtins.str" builtins.str u + builtins.str" builtins.str  +assert_attr_equal!pandas._testing.assert_attr_equal" +None*& +attr + builtins.str" builtins.str*, +left" +builtins.object"builtins.object*- +right" +builtins.object"builtins.object*' +obj + builtins.str" builtins.str  "assert_is_valid_plot_return_object2pandas._testing.assert_is_valid_plot_return_object" -None* -objs -AnyP +None* +objs +kUnion[pandas.core.series.Series[Any],numpy.ndarray[Any,Any],Any,builtins.tuple[Any],builtins.dict[Any,Any]]D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray +Any. +builtins.tuple[Any] +Any"builtins.tuple9 +builtins.dict[Any,Any] +Any +Any" builtins.dict assert_is_sorted pandas._testing.assert_is_sorted" -None* -seq -Any +None* +seq +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.AnyArrayLike assert_categorical_equal(pandas._testing.assert_categorical_equal" -None* -left -Any* -right -Any*1 +None*b +leftX +*pandas.core.arrays.categorical.Categorical"*pandas.core.arrays.categorical.Categorical*c +rightX +*pandas.core.arrays.categorical.Categorical"*pandas.core.arrays.categorical.Categorical*1 check_dtype builtins.bool" builtins.bool *: check_category_order builtins.bool" builtins.bool *' obj - builtins.str" builtins.str  + builtins.str" builtins.str  assert_interval_array_equal+pandas._testing.assert_interval_array_equal" -None* -left -Any* -right -Any*) -exact +None*` +leftV +)pandas.core.arrays.interval.IntervalArray")pandas.core.arrays.interval.IntervalArray*a +rightV +)pandas.core.arrays.interval.IntervalArray")pandas.core.arrays.interval.IntervalArray* +exact +*Union[builtins.bool,Literal[builtins.str]] + builtins.bool" builtins.bool7 +Literal[builtins.str]  builtins.str" builtins.str *' obj - builtins.str" builtins.str  + builtins.str" builtins.str  assert_period_array_equal)pandas._testing.assert_period_array_equal" -None* -left -Any* -right -Any*' +None*X +leftN +%pandas.core.arrays.period.PeriodArray"%pandas.core.arrays.period.PeriodArray*Y +rightN +%pandas.core.arrays.period.PeriodArray"%pandas.core.arrays.period.PeriodArray*' obj - builtins.str" builtins.str  + builtins.str" builtins.str  assert_datetime_array_equal+pandas._testing.assert_datetime_array_equal" -None* -left -Any* -right -Any*' -obj - builtins.str" builtins.str  +None*b +leftX +*pandas.core.arrays.datetimes.DatetimeArray"*pandas.core.arrays.datetimes.DatetimeArray*c +rightX +*pandas.core.arrays.datetimes.DatetimeArray"*pandas.core.arrays.datetimes.DatetimeArray*0 + +check_freq + builtins.bool" builtins.bool  assert_timedelta_array_equal,pandas._testing.assert_timedelta_array_equal" +None*f +left\ +,pandas.core.arrays.timedeltas.TimedeltaArray",pandas.core.arrays.timedeltas.TimedeltaArray*g +right\ +,pandas.core.arrays.timedeltas.TimedeltaArray",pandas.core.arrays.timedeltas.TimedeltaArray*0 + +check_freq + builtins.bool" builtins.bool  +assert_numpy_array_equal(pandas._testing.assert_numpy_array_equal" None* left Any* right -Any*' -obj - builtins.str" builtins.str  -assert_numpy_array_equal(pandas._testing.assert_numpy_array_equal" -Any* -left -Any* -right Any*0 strict_nan - builtins.bool" builtins.bool *1 - check_dtype - builtins.bool" builtins.bool * -err_msg -Any * + builtins.bool" builtins.bool * + check_dtype +*Union[builtins.bool,Literal[builtins.str]] + builtins.bool" builtins.bool7 +Literal[builtins.str]  + builtins.str" builtins.str *S +err_msgD +Union[builtins.str,None] + builtins.str" builtins.str +None * -check_same -Any *' +check_same +7Union[Literal[builtins.str],Literal[builtins.str],None]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +None *' obj - builtins.str" builtins.str  + builtins.str" builtins.str * + index_values +FUnion[pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],None]N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray +None  assert_extension_array_equal,pandas._testing.assert_extension_array_equal" -None* -left -Any* -right -Any*1 - check_dtype - builtins.bool" builtins.bool *8 -check_less_precise - builtins.bool" builtins.bool *1 +None*Z +leftP +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray*[ +rightP +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray* + check_dtype +*Union[builtins.bool,Literal[builtins.str]] + builtins.bool" builtins.bool7 +Literal[builtins.str]  + builtins.str" builtins.str * + index_values +FUnion[pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],None]N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray +None *1 check_exact - builtins.bool" builtins.bool  + builtins.bool" builtins.bool *, +rtol +builtins.float"builtins.float *, +atol +builtins.float"builtins.float *' +obj + builtins.str" builtins.str  + assert_frame_equal"pandas._testing.assert_frame_equal" None*D left: @@ -161,10 +247,6 @@ check_same Literal[builtins.str]  builtins.str" builtins.str *6 check_frame_type - builtins.bool" builtins.bool *} -check_less_precisec -!Union[builtins.int,builtins.bool] - builtins.int" builtins.int builtins.bool" builtins.bool *1 check_names builtins.bool" builtins.bool */ @@ -181,9 +263,8 @@ check_like builtins.bool" builtins.bool *0 check_freq - builtins.bool" builtins.bool *0 - -check_flag + builtins.bool" builtins.bool *1 + check_flags builtins.bool" builtins.bool *, rtol builtins.float"builtins.float *, @@ -198,49 +279,74 @@ check_flag right Any* kwargs -Any +Any assert_sp_array_equal%pandas._testing.assert_sp_array_equal" -None* -left -Any* -right -Any*1 - check_dtype - builtins.bool" builtins.bool *0 - -check_kind - builtins.bool" builtins.bool *6 -check_fill_value - builtins.bool" builtins.bool *? -consolidate_block_indices - builtins.bool" builtins.bool m +None*d +leftZ ++pandas.core.arrays.sparse.array.SparseArray"+pandas.core.arrays.sparse.array.SparseArray*e +rightZ ++pandas.core.arrays.sparse.array.SparseArray"+pandas.core.arrays.sparse.array.SparseArray assert_contains_all#pandas._testing.assert_contains_all" -None* -iterable -Any* -dic -Anyu +None* +iterable +!typing.Iterable[pandas._typing.T]I +pandas._typing.T" +builtins.object"builtins.object"builtins.object"typing.Iterable* +dic +"typing.Container[pandas._typing.T]I +pandas._typing.T" +builtins.object"builtins.object"builtins.object"typing.Container assert_copypandas._testing.assert_copy" -None* -iter1 -Any* -iter2 -Any* +None* +iter1 +!typing.Iterable[pandas._typing.T]I +pandas._typing.T" +builtins.object"builtins.object"builtins.object"typing.Iterable* +iter2 +!typing.Iterable[pandas._typing.T]I +pandas._typing.T" +builtins.object"builtins.object"builtins.object"typing.Iterable* eql_kwargs -Any -assert_produces_warning'pandas._testing.assert_produces_warning" -None* -expected_warning -Any *0 - filter_level - builtins.str" builtins.str * -clear -Any *6 +Any +assert_produces_warning'pandas._testing.assert_produces_warning" +Btyping.Generator[builtins.list[warnings.WarningMessage],None,None]k +&builtins.list[warnings.WarningMessage]2 +warnings.WarningMessage"warnings.WarningMessage" builtins.list +None +None"typing.Generator* +expected_warning +`Union[Type[builtins.Warning],Literal[builtins.bool],builtins.tuple[Type[builtins.Warning]],None]F +Type[builtins.Warning]$ +builtins.Warning"builtins.Warning"type: +Literal[builtins.bool]  + builtins.bool" builtins.bool +&builtins.tuple[Type[builtins.Warning]]F +Type[builtins.Warning]$ +builtins.Warning"builtins.Warning"type"builtins.tuple +None * + filter_level +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str *6 check_stacklevel builtins.bool" builtins.bool *= raise_on_extra_warnings - builtins.bool" builtins.bool  + builtins.bool" builtins.bool *Q +matchD +Union[builtins.str,None] + builtins.str" builtins.str +None 0:contextlib.contextmanager ensure_cleanpandas._testing.ensure_clean"n (typing.Generator[builtins.str,None,None] builtins.str" builtins.str @@ -253,8 +359,9 @@ eql_kwargs return_filelike builtins.bool" builtins.bool * kwargs -Any0:contextlib.contextmanager" -assert_series_equal#pandas._testing.assert_series_equal +Any0:contextlib.contextmanager" +assert_series_equal#pandas._testing.assert_series_equal + assert_series_equal#pandas._testing.assert_series_equal" None*N leftD @@ -262,12 +369,16 @@ eql_kwargs Any"pandas.core.series.Series*O rightD pandas.core.series.Series[Any] -Any"pandas.core.series.Series*1 - check_dtype - builtins.bool" builtins.bool *{ -check_index_typec -!Union[builtins.bool,builtins.str] - builtins.bool" builtins.bool +Any"pandas.core.series.Series* + check_dtype +*Union[builtins.bool,Literal[builtins.str]] + builtins.bool" builtins.bool7 +Literal[builtins.str]  + builtins.str" builtins.str * +check_index_type +*Union[builtins.bool,Literal[builtins.str]] + builtins.bool" builtins.bool7 +Literal[builtins.str]  builtins.str" builtins.str *7 check_series_type builtins.bool" builtins.bool *1 @@ -298,7 +409,7 @@ check_freq check_like: Literal[builtins.bool]  - builtins.bool" builtins.bool 0:typing.overloadX + builtins.bool" builtins.bool 0:typing.overloadX assert_series_equal#pandas._testing.assert_series_equal" None*N leftD @@ -306,12 +417,16 @@ check_like: Any"pandas.core.series.Series*O rightD pandas.core.series.Series[Any] -Any"pandas.core.series.Series*1 - check_dtype - builtins.bool" builtins.bool *{ -check_index_typec -!Union[builtins.bool,builtins.str] - builtins.bool" builtins.bool +Any"pandas.core.series.Series* + check_dtype +*Union[builtins.bool,Literal[builtins.str]] + builtins.bool" builtins.bool7 +Literal[builtins.str]  + builtins.str" builtins.str * +check_index_type +*Union[builtins.bool,Literal[builtins.str]] + builtins.bool" builtins.bool7 +Literal[builtins.str]  builtins.str" builtins.str *7 check_series_type builtins.bool" builtins.bool *1 @@ -348,4 +463,7 @@ check_like __annotations__pandas._testing.__annotations__W builtins.dict[builtins.str,Any] builtins.str" builtins.str -Any" builtins.dict \ No newline at end of file +Any" builtins.dict*) +Artistpandas._testing.Artist +Any* +npnumpy  \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._typing.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._typing.protobuf index c53d4ef82..4926e5597 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._typing.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas._typing.protobuf @@ -211,16 +211,70 @@ ReadBufferpandas._typing.ReadBuffer"pandas._typing.BaseBuffer* self 7pandas._typing.ReadCsvBuffer[pandas._typing.AnyStr_cov]R pandas._typing.AnyStr_cov" -builtins.object"builtins.object"builtins.object"pandas._typing.ReadCsvBuffer0:builtins.property`PX -WriteExcelBufferpandas._typing.WriteExcelBuffer"pandas._typing.WriteBuffer* +builtins.object"builtins.object"builtins.object"pandas._typing.ReadCsvBuffer0:builtins.property`PX +WriteExcelBufferpandas._typing.WriteExcelBuffer"pandas._typing.WriteBuffer* truncate(pandas._typing.WriteExcelBuffer.truncate" - builtins.int" builtins.int*L -selfB -pandas._typing.WriteExcelBuffer"pandas._typing.WriteExcelBuffer*P -sizeD + builtins.int" builtins.int*DB +pandas._typing.WriteExcelBuffer"pandas._typing.WriteExcelBuffer*HD Union[builtins.int,None] builtins.int" builtins.int -None XP +None X +SequenceNotStrpandas._typing.SequenceNotStr"builtins.object* + __contains__*pandas._typing.SequenceNotStr.__contains__" + builtins.bool" builtins.bool* +3pandas._typing.SequenceNotStr[pandas._typing._T_co]M +pandas._typing._T_co" +builtins.object"builtins.object"builtins.object"pandas._typing.SequenceNotStr*$" +builtins.object"builtins.object* +__len__%pandas._typing.SequenceNotStr.__len__" + builtins.int" builtins.int* +3pandas._typing.SequenceNotStr[pandas._typing._T_co]M +pandas._typing._T_co" +builtins.object"builtins.object"builtins.object"pandas._typing.SequenceNotStr* +__iter__&pandas._typing.SequenceNotStr.__iter__" +%typing.Iterator[pandas._typing._T_co]M +pandas._typing._T_co" +builtins.object"builtins.object"builtins.object"typing.Iterator* +3pandas._typing.SequenceNotStr[pandas._typing._T_co]M +pandas._typing._T_co" +builtins.object"builtins.object"builtins.object"pandas._typing.SequenceNotStr* +index#pandas._typing.SequenceNotStr.index" + builtins.int" builtins.int* +3pandas._typing.SequenceNotStr[pandas._typing._T_co]M +pandas._typing._T_co" +builtins.object"builtins.object"builtins.object"pandas._typing.SequenceNotStr*  +Any*  + builtins.int" builtins.int *  + builtins.int" builtins.int * +count#pandas._typing.SequenceNotStr.count" + builtins.int" builtins.int* +3pandas._typing.SequenceNotStr[pandas._typing._T_co]M +pandas._typing._T_co" +builtins.object"builtins.object"builtins.object"pandas._typing.SequenceNotStr*  +Any* + __reversed__*pandas._typing.SequenceNotStr.__reversed__" +%typing.Iterator[pandas._typing._T_co]M +pandas._typing._T_co" +builtins.object"builtins.object"builtins.object"typing.Iterator* +3pandas._typing.SequenceNotStr[pandas._typing._T_co]M +pandas._typing._T_co" +builtins.object"builtins.object"builtins.object"pandas._typing.SequenceNotStr2 + __getitem__)pandas._typing.SequenceNotStr.__getitem__ + __getitem__)pandas._typing.SequenceNotStr.__getitem__"M +pandas._typing._T_co" +builtins.object"builtins.object"builtins.object* +3pandas._typing.SequenceNotStr[pandas._typing._T_co]M +pandas._typing._T_co" +builtins.object"builtins.object"builtins.object"pandas._typing.SequenceNotStr*., +typing.SupportsIndex"typing.SupportsIndex0:typing.overloadX + __getitem__)pandas._typing.SequenceNotStr.__getitem__" +%typing.Sequence[pandas._typing._T_co]M +pandas._typing._T_co" +builtins.object"builtins.object"builtins.object"typing.Sequence* +3pandas._typing.SequenceNotStr[pandas._typing._T_co]M +pandas._typing._T_co" +builtins.object"builtins.object"builtins.object"pandas._typing.SequenceNotStr*" +builtins.slice"builtins.slice0:typing.overloadXPXP _WindowingNumbaKwargs$pandas._typing._WindowingNumbaKwargs"typing._TypedDictD StyleExportDictpandas._typing.StyleExportDict"typing._TypedDict* __annotations__pandas._typing.__annotations__W diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.api.extensions.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.api.extensions.protobuf index b304843da4312ffcb078ea7faa7a7c4e43e61f01..af0ef04714dcc93ab7c7d9cb8a71f6f325e517ef 100644 GIT binary patch delta 248 zcmZ4A!T7qLae@R>Yr;mU89IDgSD3ii7ZYOq5%N|XC!lqX-;m6}|j zJACn42oVIQgT29G8|37h7?5WR zS-8046O)rmb4zm)OHwDxGiq_dxtl*IWHNH%GgCyEi!Hl6u_(P*fLV&2i`g-+Qh;^x zCY=h#Kby666&M*`O!m<;<=)TE)yEW?mzkdzJ$a#l=wyEVJSZ01T&rKkG@0Mfa`R_H G8zBJe=S_zI delta 61 zcmV-D0K)(4j{&cU0gxC1m|3wJm@JbYFn9s2vzRa-0RfqlxiK{h@CFL_0ab2kZ*E(Y TQ8KTSP%=WYGj;;AuQfap$7U9k diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.api.types.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.api.types.protobuf index 2dc80e1b868876c4f59a04e4d64c862bd057611a..7ec7a8607954425489b8275552780972aa947362 100644 GIT binary patch delta 245 zcmeC&&+_9i^M)rvOdmKVKNCu2n$9xWS9m`EHzqEYw4&5P0Y<5pOkCxYe+%nN1ZU=@ z=cGF4=M|R}l_r|z7}YRX@B delta 382 zcmexyn7MO5%Z4XHOk3F}KNCu2y2CWtS9m`EZbmMaw4&5P0Y<5Hj9gZee+%ogI3*UR zPR$VkjW#EVo|cljAkHO{Ssb67SdyBaUzC}gm=m8;Qdy8H zq&Jx{SC$(|e6yg(MDESH20r@Im&Cb5ftpf)no2TrQ_W0Ds-U{`LAoa24(4Jise)*z zj6Wnf`E3q6Z)RSJnF&;x#^k_Ch0XjPles7B8nAD6syxCieoCB65NIe+S!z)k+!@+H zm5MAN0f=#ItxF^(_pM@QD@ZNM%ukv8ZlWrb36Wnl_X!XGUREwnpi#vIiABY!LdqaF zv4T0110|IBU$Jm8Cl(a}!{`AE*F?t2h9O~-7f-g@yeY+paq_k^O`H2xJuu~jIzvcf U^2hrsU -dtype+pandas.core.arrays.period.PeriodArray.dtype* -self* + builtins.bool" builtins.bool * +dtype+pandas.core.arrays.period.PeriodArray.dtype"N +%pandas.core.dtypes.dtypes.PeriodDtype"%pandas.core.dtypes.dtypes.PeriodDtype*X +selfN +%pandas.core.arrays.period.PeriodArray"%pandas.core.arrays.period.PeriodArray0:builtins.property`* __array__/pandas.core.arrays.period.PeriodArray.__array__"9 numpy.ndarray[Any,Any] Any @@ -1196,7 +1023,7 @@ weekofyear0pandas.core.arrays.period.PeriodArray.weekofyear days_in_month3pandas.core.arrays.period.PeriodArray.days_in_month builtins.int" builtins.intr^ daysinmonth1pandas.core.arrays.period.PeriodArray.daysinmonth - builtins.int" builtins.int; + builtins.int" builtins.int+ SparseArray+pandas.core.arrays.sparse.array.SparseArray"&pandas.core.arrays.base.ExtensionArray")pandas.core.arrays.base.ExtensionOpsMixin* __init__4pandas.core.arrays.sparse.array.SparseArray.__init__" None*d @@ -1273,61 +1100,14 @@ fill_value fill_value Any *F unique2pandas.core.arrays.sparse.array.SparseArray.unique* -self* - factorize5pandas.core.arrays.sparse.array.SparseArray.factorize" -ITuple[numpy.ndarray[Any,Any],pandas.core.arrays.sparse.array.SparseArray]9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarrayZ -+pandas.core.arrays.sparse.array.SparseArray"+pandas.core.arrays.sparse.array.SparseArray*d -selfZ -+pandas.core.arrays.sparse.array.SparseArray"+pandas.core.arrays.sparse.array.SparseArray*/ - na_sentinel - builtins.int" builtins.int *5 -use_na_sentinel - builtins.bool" builtins.bool * +self* value_counts8pandas.core.arrays.sparse.array.SparseArray.value_counts" Any*d selfZ +pandas.core.arrays.sparse.array.SparseArray"+pandas.core.arrays.sparse.array.SparseArray*, dropna builtins.bool" builtins.bool *J - __getitem__7pandas.core.arrays.sparse.array.SparseArray.__getitem__*** - -take0pandas.core.arrays.sparse.array.SparseArray.take"Z -+pandas.core.arrays.sparse.array.SparseArray"+pandas.core.arrays.sparse.array.SparseArray*d -selfZ -+pandas.core.arrays.sparse.array.SparseArray"+pandas.core.arrays.sparse.array.SparseArray* -indices -TypeAlias[Union[typing.Sequence[builtins.int],typing.Sequence[numpy.integer[Any]],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]]] -Union[typing.Sequence[builtins.int],typing.Sequence[numpy.integer[Any]],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]]N -typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.Sequenced -#typing.Sequence[numpy.integer[Any]], -numpy.integer[Any] -Any" numpy.integer"typing.Sequence -STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] -Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] -Any -5numpy.dtype[numpy._typing._array_like._ScalarType_co][ -(numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.TakeIndexer*0 - -allow_fill - builtins.bool" builtins.bool * - -fill_value -Any * - searchsorted8pandas.core.arrays.sparse.array.SparseArray.searchsorted" -Any*d -selfZ -+pandas.core.arrays.sparse.array.SparseArray"+pandas.core.arrays.sparse.array.SparseArray* -v -Any*( -side - builtins.str" builtins.str * -sorter -Any *B + __getitem__7pandas.core.arrays.sparse.array.SparseArray.__getitem__***B copy0pandas.core.arrays.sparse.array.SparseArray.copy* self* astype2pandas.core.arrays.sparse.array.SparseArray.astype" diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.algorithms.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.algorithms.protobuf index 82c109d86..00f9438c8 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.algorithms.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.algorithms.protobuf @@ -59,7 +59,7 @@ allow_fill builtins.bool" builtins.bool * fill_value -Any " +Any " uniquepandas.core.algorithms.unique uniquepandas.core.algorithms.unique"P &pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex*\ @@ -100,23 +100,20 @@ DUnion[numpy.ndarray[Any,Any],pandas.core.arrays.base.ExtensionArray]9 &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray*P valuesD pandas.core.series.Series[Any] -Any"pandas.core.series.Series0:typing.overloadX +Any"pandas.core.series.Series0:typing.overloadX uniquepandas.core.algorithms.unique"9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray* -values -0Union[numpy.ndarray[Any,Any],builtins.list[Any]]9 +Any" numpy.ndarray*E +values9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray, -builtins.list[Any] -Any" builtins.list0:typing.overloadX +Any" numpy.ndarray0:typing.overloadX uniquepandas.core.algorithms.unique"P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray*\ valuesP -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray0:typing.overloadX" - factorize pandas.core.algorithms.factorize +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray0:typing.overloadX" + factorize pandas.core.algorithms.factorize factorize pandas.core.algorithms.factorize" 4Tuple[numpy.ndarray[Any,Any],numpy.ndarray[Any,Any]]9 numpy.ndarray[Any,Any] @@ -124,14 +121,11 @@ DUnion[numpy.ndarray[Any,Any],pandas.core.arrays.base.ExtensionArray]9 Any" numpy.ndarray9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray* -values -3Union[typing.Sequence[Any],numpy.recarray[Any,Any]]0 -typing.Sequence[Any] -Any"typing.Sequence; -numpy.recarray[Any,Any] +Any" numpy.ndarray*E +values9 +numpy.ndarray[Any,Any] Any -Any"numpy.recarray** +Any" numpy.ndarray** sort builtins.bool" builtins.bool *5 use_na_sentinel diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.api.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.api.protobuf index aad74f3a3..823d80b52 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.api.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.api.protobuf @@ -1,5 +1,5 @@ -pandas.core.api +pandas.core.api Categorical*pandas.core.arrays.categorical.Categorical"&pandas.core.arrays.base.ExtensionArray* __init__3pandas.core.arrays.categorical.Categorical.__init__" None*b @@ -66,10 +66,6 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P size/pandas.core.arrays.categorical.Categorical.size" builtins.int" builtins.int*b selfX -*pandas.core.arrays.categorical.Categorical"*pandas.core.arrays.categorical.Categorical* -itemsize3pandas.core.arrays.categorical.Categorical.itemsize" - builtins.int" builtins.int*b -selfX *pandas.core.arrays.categorical.Categorical"*pandas.core.arrays.categorical.Categorical* tolist1pandas.core.arrays.categorical.Categorical.tolist" builtins.list[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]]] @@ -142,6 +138,50 @@ as_ordered5pandas.core.arrays.categorical.Categorical.as_ordered"X as_unordered7pandas.core.arrays.categorical.Categorical.as_unordered"X *pandas.core.arrays.categorical.Categorical"*pandas.core.arrays.categorical.Categorical*b selfX +*pandas.core.arrays.categorical.Categorical"*pandas.core.arrays.categorical.Categorical* +set_categories9pandas.core.arrays.categorical.Categorical.set_categories"X +*pandas.core.arrays.categorical.Categorical"*pandas.core.arrays.categorical.Categorical*b +selfX +*pandas.core.arrays.categorical.Categorical"*pandas.core.arrays.categorical.Categorical* +new_categories +Any*V +orderedG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None *, +rename + builtins.bool" builtins.bool * +rename_categoriesUnion[typing.Hashable,builtins.list[pandas._typing.HashableT]]" -typing.Hashable"typing.Hashable -'builtins.list[pandas._typing.HashableT]Q -pandas._typing.HashableT" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.list 0:typing.overloadX - reset_index'pandas.core.frame.DataFrame.reset_index": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -level -NUnion[TypeAlias[Union[typing.Hashable,builtins.int]],typing.Sequence[Unknown]] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level- -typing.Sequence[Unknown]"typing.Sequence *q - col_level` - Union[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str *2 -col_fill" -typing.Hashable"typing.Hashable ** -drop - builtins.bool" builtins.bool *I -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool *6 -allow_duplicates - builtins.bool" builtins.bool * -names ->Union[typing.Hashable,builtins.list[pandas._typing.HashableT]]" -typing.Hashable"typing.Hashable -'builtins.list[pandas._typing.HashableT]Q -pandas._typing.HashableT" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.list 0:typing.overloadX - reset_index'pandas.core.frame.DataFrame.reset_index"q -'Union[pandas.core.frame.DataFrame,None]: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame -None*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -level -NUnion[TypeAlias[Union[typing.Hashable,builtins.int]],typing.Sequence[Unknown]] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level- -typing.Sequence[Unknown]"typing.Sequence ** -drop - builtins.bool" builtins.bool *V -inplaceG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None *q - col_level` - Union[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str *2 -col_fill" -typing.Hashable"typing.Hashable *6 -allow_duplicates - builtins.bool" builtins.bool * -names ->Union[typing.Hashable,builtins.list[pandas._typing.HashableT]]" -typing.Hashable"typing.Hashable -'builtins.list[pandas._typing.HashableT]Q -pandas._typing.HashableT" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.list 0:typing.overloadX2` -dropna"pandas.core.frame.DataFrame.dropna -dropna"pandas.core.frame.DataFrame.dropna" -None*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -how -2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str *R -threshD -Union[builtins.int,None] - builtins.int" builtins.int -None * -subset -Union[TypeAlias[Union[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],None] -TypeAlias[Union[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]] -uUnion[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]0 -typing.Sequence[Any] -Any"typing.Sequence9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarrayD -pandas.core.series.Series[Any] -Any"pandas.core.series.SeriesN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"pandas._typing.ListLikeU -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar -None *G -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool0:typing.overloadX -dropna"pandas.core.frame.DataFrame.dropna": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -how -2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str *R -threshD -Union[builtins.int,None] - builtins.int" builtins.int -None * -subset -Union[TypeAlias[Union[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],None] -TypeAlias[Union[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]] -uUnion[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]0 -typing.Sequence[Any] -Any"typing.Sequence9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarrayD -pandas.core.series.Series[Any] -Any"pandas.core.series.SeriesN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"pandas._typing.ListLikeU -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar -None *I -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool 0:typing.overloadX -dropna"pandas.core.frame.DataFrame.dropna"q -'Union[pandas.core.frame.DataFrame,None]: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame -None*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -how -2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str *R -threshD -Union[builtins.int,None] - builtins.int" builtins.int -None * -subset -Union[TypeAlias[Union[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],None] -TypeAlias[Union[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]] -uUnion[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]0 -typing.Sequence[Any] -Any"typing.Sequence9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarrayD -pandas.core.series.Series[Any] -Any"pandas.core.series.SeriesN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"pandas._typing.ListLikeU -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar -None *V -inplaceG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None 0:typing.overloadX2: - sort_values'pandas.core.frame.DataFrame.sort_values - sort_values'pandas.core.frame.DataFrame.sort_values" -None*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -by -1Union[builtins.str,typing.Sequence[builtins.str]] - builtins.str" builtins.strN -typing.Sequence[builtins.str] - builtins.str" builtins.str"typing.Sequence* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * - ascending -3Union[builtins.bool,typing.Sequence[builtins.bool]] - builtins.bool" builtins.boolQ -typing.Sequence[builtins.bool] - builtins.bool" builtins.bool"typing.Sequence * -kind -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -7972,56 +5980,15 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.SortKind * - na_position -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.NaPosition *2 - ignore_index - builtins.bool" builtins.bool *G -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool* -key -+Union[CallableType[builtins.function],None]K -CallableType[builtins.function]& -builtins.function"builtins.function -None 0:typing.overloadX - sort_values'pandas.core.frame.DataFrame.sort_values": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -by -1Union[builtins.str,typing.Sequence[builtins.str]] - builtins.str" builtins.strN -typing.Sequence[builtins.str] - builtins.str" builtins.str"typing.Sequence* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * - ascending -3Union[builtins.bool,typing.Sequence[builtins.bool]] - builtins.bool" builtins.boolQ -typing.Sequence[builtins.bool] - builtins.bool" builtins.bool"typing.Sequence * -kind -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -8029,62 +5996,17 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.SortKind * - na_position -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 + builtins.str" builtins.str" pandas._typing.TimedeltaDtypeArg& +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.NaPosition *2 - ignore_index - builtins.bool" builtins.bool *I -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool * -key -+Union[CallableType[builtins.function],None]K -CallableType[builtins.function]& -builtins.function"builtins.function -None 0:typing.overloadX - sort_values'pandas.core.frame.DataFrame.sort_values"q -'Union[pandas.core.frame.DataFrame,None]: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame -None*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -by -1Union[builtins.str,typing.Sequence[builtins.str]] - builtins.str" builtins.strN -typing.Sequence[builtins.str] - builtins.str" builtins.str"typing.Sequence* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * - ascending -3Union[builtins.bool,typing.Sequence[builtins.bool]] - builtins.bool" builtins.boolQ -typing.Sequence[builtins.bool] - builtins.bool" builtins.bool"typing.Sequence *V -inplaceG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None * -kind -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -8092,58 +6014,15 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.SortKind * - na_position -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.NaPosition *2 - ignore_index - builtins.bool" builtins.bool * -key -+Union[CallableType[builtins.function],None]K -CallableType[builtins.function]& -builtins.function"builtins.function -None 0:typing.overloadX2A - -sort_index&pandas.core.frame.DataFrame.sort_index - -sort_index&pandas.core.frame.DataFrame.sort_index" -None*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None * - ascending -3Union[builtins.bool,typing.Sequence[builtins.bool]] - builtins.bool" builtins.boolQ -typing.Sequence[builtins.bool] - builtins.bool" builtins.bool"typing.Sequence * -kind -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -8151,65 +6030,15 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.SortKind * - na_position -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.NaPosition *4 -sort_remaining - builtins.bool" builtins.bool *2 - ignore_index - builtins.bool" builtins.bool *G -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool* -key -+Union[CallableType[builtins.function],None]K -CallableType[builtins.function]& -builtins.function"builtins.function -None 0:typing.overloadX - -sort_index&pandas.core.frame.DataFrame.sort_index": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -level -rUnion[TypeAlias[Union[typing.Hashable,builtins.int]],builtins.list[builtins.int],builtins.list[builtins.str],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.LevelJ -builtins.list[builtins.int] - builtins.int" builtins.int" builtins.listJ -builtins.list[builtins.str] - builtins.str" builtins.str" builtins.list -None * - ascending -3Union[builtins.bool,typing.Sequence[builtins.bool]] - builtins.bool" builtins.boolQ -typing.Sequence[builtins.bool] - builtins.bool" builtins.bool"typing.Sequence * -kind -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -8217,71 +6046,15 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.SortKind * - na_position -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.NaPosition *4 -sort_remaining - builtins.bool" builtins.bool *2 - ignore_index - builtins.bool" builtins.bool *I -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool * -key -+Union[CallableType[builtins.function],None]K -CallableType[builtins.function]& -builtins.function"builtins.function -None 0:typing.overloadX - -sort_index&pandas.core.frame.DataFrame.sort_index"q -'Union[pandas.core.frame.DataFrame,None]: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame -None*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -level -rUnion[TypeAlias[Union[typing.Hashable,builtins.int]],builtins.list[builtins.int],builtins.list[builtins.str],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.LevelJ -builtins.list[builtins.int] - builtins.int" builtins.int" builtins.listJ -builtins.list[builtins.str] - builtins.str" builtins.str" builtins.list -None * - ascending -3Union[builtins.bool,typing.Sequence[builtins.bool]] - builtins.bool" builtins.boolQ -typing.Sequence[builtins.bool] - builtins.bool" builtins.bool"typing.Sequence *V -inplaceG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None * -kind -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -8289,1179 +6062,266 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.SortKind * - na_position -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.NaPosition *4 -sort_remaining - builtins.bool" builtins.bool *2 - ignore_index - builtins.bool" builtins.bool * -key -+Union[CallableType[builtins.function],None]K -CallableType[builtins.function]& -builtins.function"builtins.function -None 0:typing.overloadX2 -groupby#pandas.core.frame.DataFrame.groupby) -groupby#pandas.core.frame.DataFrame.groupby" -pandas.core.groupby.generic.DataFrameGroupBy[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]]] -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar",pandas.core.groupby.generic.DataFrameGroupBy*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -by -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *. -as_index - builtins.bool" builtins.bool ** -sort - builtins.bool" builtins.bool *0 - -group_keys - builtins.bool" builtins.bool *- -squeeze - builtins.bool" builtins.bool *. -observed - builtins.bool" builtins.bool *, -dropna - builtins.bool" builtins.bool 0:typing.overloadX -groupby#pandas.core.frame.DataFrame.groupby" -Vpandas.core.groupby.generic.DataFrameGroupBy[pandas._libs.tslibs.timestamps.Timestamp]T -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp",pandas.core.groupby.generic.DataFrameGroupBy*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*b -byZ -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *. -as_index - builtins.bool" builtins.bool ** -sort - builtins.bool" builtins.bool *0 - -group_keys - builtins.bool" builtins.bool *- -squeeze - builtins.bool" builtins.bool *. -observed - builtins.bool" builtins.bool *, -dropna - builtins.bool" builtins.bool 0:typing.overloadX -groupby#pandas.core.frame.DataFrame.groupby" -Vpandas.core.groupby.generic.DataFrameGroupBy[pandas._libs.tslibs.timedeltas.Timedelta]T -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta",pandas.core.groupby.generic.DataFrameGroupBy*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*f -by^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *. -as_index - builtins.bool" builtins.bool ** -sort - builtins.bool" builtins.bool *0 - -group_keys - builtins.bool" builtins.bool *- -squeeze - builtins.bool" builtins.bool *. -observed - builtins.bool" builtins.bool *, -dropna - builtins.bool" builtins.bool 0:typing.overloadX -groupby#pandas.core.frame.DataFrame.groupby" -Opandas.core.groupby.generic.DataFrameGroupBy[pandas._libs.tslibs.period.Period]F -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period",pandas.core.groupby.generic.DataFrameGroupBy*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*X -byP -&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *. -as_index - builtins.bool" builtins.bool ** -sort - builtins.bool" builtins.bool *0 - -group_keys - builtins.bool" builtins.bool *- -squeeze - builtins.bool" builtins.bool *. -observed - builtins.bool" builtins.bool *, -dropna - builtins.bool" builtins.bool 0:typing.overloadX -groupby#pandas.core.frame.DataFrame.groupby" -Fpandas.core.groupby.generic.DataFrameGroupBy[pandas._typing.IntervalT] -pandas._typing.IntervalTN -#pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval",pandas.core.groupby.generic.DataFrameGroupBy*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -by -Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] -pandas._typing.IntervalTN -#pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *. -as_index - builtins.bool" builtins.bool ** -sort - builtins.bool" builtins.bool *0 - -group_keys - builtins.bool" builtins.bool *- -squeeze - builtins.bool" builtins.bool *. -observed - builtins.bool" builtins.bool *, -dropna - builtins.bool" builtins.bool 0:typing.overloadX& -groupby#pandas.core.frame.DataFrame.groupby" -Apandas.core.groupby.generic.DataFrameGroupBy[builtins.tuple[Any]]. -builtins.tuple[Any] -Any"builtins.tuple",pandas.core.groupby.generic.DataFrameGroupBy*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -by -Union[pandas.core.indexes.multi.MultiIndex,TypeAlias[Union[builtins.tuple[Any],builtins.list[pandas._typing._HashableTa],TypeAlias[Union[numpy.ufunc,CallableType[builtins.function]]],builtins.list[Unknown],builtins.list[pandas.core.series.Series[Any]],numpy.ndarray[Any,Any],builtins.list[numpy.ndarray[Any,Any]],typing.Mapping[TypeAlias[Union[typing.Hashable,None]],Any],builtins.list[typing.Mapping[Unknown,Any]],builtins.list[pandas.core.indexes.base.Index[Any]],pandas.core.groupby.grouper.Grouper,builtins.list[pandas.core.groupby.grouper.Grouper]]],None]L -$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex -TypeAlias[Union[builtins.tuple[Any],builtins.list[pandas._typing._HashableTa],TypeAlias[Union[numpy.ufunc,CallableType[builtins.function]]],builtins.list[Unknown],builtins.list[pandas.core.series.Series[Any]],numpy.ndarray[Any,Any],builtins.list[numpy.ndarray[Any,Any]],typing.Mapping[TypeAlias[Union[typing.Hashable,None]],Any],builtins.list[typing.Mapping[Unknown,Any]],builtins.list[pandas.core.indexes.base.Index[Any]],pandas.core.groupby.grouper.Grouper,builtins.list[pandas.core.groupby.grouper.Grouper]]] -Union[builtins.tuple[Any],builtins.list[pandas._typing._HashableTa],TypeAlias[Union[numpy.ufunc,CallableType[builtins.function]]],builtins.list[Unknown],builtins.list[pandas.core.series.Series[Any]],numpy.ndarray[Any,Any],builtins.list[numpy.ndarray[Any,Any]],typing.Mapping[TypeAlias[Union[typing.Hashable,None]],Any],builtins.list[typing.Mapping[Unknown,Any]],builtins.list[pandas.core.indexes.base.Index[Any]],pandas.core.groupby.grouper.Grouper,builtins.list[pandas.core.groupby.grouper.Grouper]]. -builtins.tuple[Any] -Any"builtins.tuple -)builtins.list[pandas._typing._HashableTa]S -pandas._typing._HashableTa" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.list -=TypeAlias[Union[numpy.ufunc,CallableType[builtins.function]]] -2Union[numpy.ufunc,CallableType[builtins.function]] - numpy.ufunc" numpy.ufuncK -CallableType[builtins.function]& -builtins.function"builtins.function"pandas._typing.Function) -builtins.list[Unknown]" builtins.list --builtins.list[pandas.core.series.Series[Any]]D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series" builtins.list9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarrayq -%builtins.list[numpy.ndarray[Any,Any]]9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.list -:typing.Mapping[TypeAlias[Union[typing.Hashable,None]],Any] -&TypeAlias[Union[typing.Hashable,None]]M -Union[typing.Hashable,None]" -typing.Hashable"typing.Hashable -None"pandas._typing.Label -Any"typing.Mappingu -*builtins.list[typing.Mapping[Unknown,Any]]8 -typing.Mapping[Unknown,Any] -Any"typing.Mapping" builtins.list -2builtins.list[pandas.core.indexes.base.Index[Any]]N -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index" builtins.listJ -#pandas.core.groupby.grouper.Grouper"#pandas.core.groupby.grouper.Grouper -2builtins.list[pandas.core.groupby.grouper.Grouper]J -#pandas.core.groupby.grouper.Grouper"#pandas.core.groupby.grouper.Grouper" builtins.list"%pandas._typing.GroupByObjectNonScalar -None * -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *. -as_index - builtins.bool" builtins.bool ** -sort - builtins.bool" builtins.bool *0 - -group_keys - builtins.bool" builtins.bool *- -squeeze - builtins.bool" builtins.bool *. -observed - builtins.bool" builtins.bool *, -dropna - builtins.bool" builtins.bool 0:typing.overloadX! -groupby#pandas.core.frame.DataFrame.groupby" -Fpandas.core.groupby.generic.DataFrameGroupBy[pandas._typing.SeriesByT] - -pandas._typing.SeriesByT -Union[builtins.str,builtins.bytes,datetime.date,builtins.bool,builtins.int,builtins.float,builtins.complex,datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]]] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.Interval",pandas.core.groupby.generic.DataFrameGroupBy*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* - -by - -3pandas.core.series.Series[pandas._typing.SeriesByT] +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimestampDtypeArg +RTypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]] +GUnion[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]X +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.CategoryDtypeArg +gTypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]] +\Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]C +Type[builtins.object]" +builtins.object"builtins.object"type7 +Literal[builtins.str]  + builtins.str" builtins.str= +Type[numpy.object_] + numpy.object_" numpy.object_"type7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ObjectDtypeArg +dTypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +YUnion[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]4 +Type[numpy.void] -pandas._typing.SeriesByT -Union[builtins.str,builtins.bytes,datetime.date,builtins.bool,builtins.int,builtins.float,builtins.complex,datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]]] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.Interval"pandas.core.series.Series* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +numpy.void" +numpy.void"type7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *. -as_index - builtins.bool" builtins.bool ** -sort - builtins.bool" builtins.bool *0 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.VoidDtypeArg +STypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]] +HUnion[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]I +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtypeP +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype"pandas._typing.DtypeObj"pandas._typing.AstypeArg +None * -group_keys - builtins.bool" builtins.bool *- -squeeze - builtins.bool" builtins.bool *. -observed - builtins.bool" builtins.bool *, -dropna - builtins.bool" builtins.bool 0:typing.overloadX -groupby#pandas.core.frame.DataFrame.groupby"j -1pandas.core.groupby.generic.DataFrameGroupBy[Any] -Any",pandas.core.groupby.generic.DataFrameGroupBy*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -by -|Union[pandas.core.indexes.category.CategoricalIndex[Any],pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any]]l -2pandas.core.indexes.category.CategoricalIndex[Any] -Any"-pandas.core.indexes.category.CategoricalIndexN +columns + +Union[TypeAlias[Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]]],None] +TypeAlias[Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]]] +Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]] +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N #pandas.core.indexes.base.Index[Any] Any"pandas.core.indexes.base.IndexD pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +Any"pandas.core.series.Series9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.AnyArrayLike, +builtins.list[Any] +Any" builtins.list9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +builtins.range"builtins.range. +builtins.tuple[Any] +Any"builtins.tuple"pandas._typing.Axes +None 0:typing.overload:builtins.classmethodXp + from_dict%pandas.core.frame.DataFrame.from_dict": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*p +clsg +!Type[pandas.core.frame.DataFrame]: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame"type*C +data9 +builtins.dict[Any,Any] +Any +Any" builtins.dict* +orient +2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str * +dtype +4Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],None] +4TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]] +4Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]] +TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]= +Type[builtins.bool] + builtins.bool" builtins.bool"type7 +Literal[builtins.str]  + builtins.str" builtins.strR +'pandas.core.arrays.boolean.BooleanDtype"'pandas.core.arrays.boolean.BooleanDtype7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *. -as_index - builtins.bool" builtins.bool ** -sort - builtins.bool" builtins.bool *0 - -group_keys - builtins.bool" builtins.bool *- -squeeze - builtins.bool" builtins.bool *. -observed - builtins.bool" builtins.bool *, -dropna - builtins.bool" builtins.bool 0:typing.overloadX2 -aggpandas.core.frame.DataFrame.agg - -aggpandas.core.frame.DataFrame.agg"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -func -JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] -?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K -CallableType[builtins.function]& -builtins.function"builtins.function - builtins.str" builtins.str - numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +Type[numpy.bool_] + numpy.bool_" numpy.bool_"type7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -kwargs -Any0:typing.overloadX -aggpandas.core.frame.DataFrame.agg": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -func -Union[builtins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]],TypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]]] -Ybuiltins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]] -JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] -?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K -CallableType[builtins.function]& -builtins.function"builtins.function - builtins.str" builtins.str - numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase" builtins.list -YTypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]] -Ntyping.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]Q -pandas._typing.HashableT" -typing.Hashable"typing.Hashable"typing.HashableV -%Union[Unknown,builtins.list[Unknown]]) -builtins.list[Unknown]" builtins.list"typing.Mapping"#pandas._typing.AggFuncTypeDictFrame * -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -kwargs -Any0:typing.overloadX2 - aggregate%pandas.core.frame.DataFrame.aggregate - aggregate%pandas.core.frame.DataFrame.aggregate"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -func -JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] -?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K -CallableType[builtins.function]& -builtins.function"builtins.function - builtins.str" builtins.str - numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.BooleanDtypeArg& +TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: +Type[builtins.int] + builtins.int" builtins.int"type7 +Literal[builtins.str]  + builtins.str" builtins.strL +$pandas.core.arrays.integer.Int8Dtype"$pandas.core.arrays.integer.Int8DtypeN +%pandas.core.arrays.integer.Int16Dtype"%pandas.core.arrays.integer.Int16DtypeN +%pandas.core.arrays.integer.Int32Dtype"%pandas.core.arrays.integer.Int32DtypeN +%pandas.core.arrays.integer.Int64Dtype"%pandas.core.arrays.integer.Int64Dtype7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -kwargs -Any0:typing.overloadX - aggregate%pandas.core.frame.DataFrame.aggregate": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -func -Union[builtins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]],TypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]]] -Ybuiltins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]] -JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] -?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K -CallableType[builtins.function]& -builtins.function"builtins.function - builtins.str" builtins.str - numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase" builtins.list -YTypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]] -Ntyping.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]Q -pandas._typing.HashableT" -typing.Hashable"typing.Hashable"typing.HashableV -%Union[Unknown,builtins.list[Unknown]]) -builtins.list[Unknown]" builtins.list"typing.Mapping"#pandas._typing.AggFuncTypeDictFrame* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str +)Type[numpy.signedinteger[TypeAlias[Any]]]v +#numpy.signedinteger[TypeAlias[Any]]: +TypeAlias[Any] +Any"numpy._typing._nbit._NBitByte"numpy.signedinteger"type7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -kwargs -Any0:typing.overloadX2 -apply!pandas.core.frame.DataFrame.apply -apply!pandas.core.frame.DataFrame.apply": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R -fK -CallableType[builtins.function]& -builtins.function"builtins.function* -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *) -raw - builtins.bool" builtins.bool * - result_type -None * -args -Any * -kwargs -Any0:typing.overloadX -apply!pandas.core.frame.DataFrame.apply" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R -fK -CallableType[builtins.function]& -builtins.function"builtins.function* -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *) -raw - builtins.bool" builtins.bool * - result_type -None * -args -Any * -kwargs -Any0:typing.overloadX -apply!pandas.core.frame.DataFrame.apply"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R -fK -CallableType[builtins.function]& -builtins.function"builtins.function* -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *) -raw - builtins.bool" builtins.bool * - result_type -None * -args -Any * -kwargs -Any0:typing.overloadX! -apply!pandas.core.frame.DataFrame.apply" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R -fK -CallableType[builtins.function]& -builtins.function"builtins.function* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *) -raw - builtins.bool" builtins.bool * -args -Any * - result_type -2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str* -kwargs -Any0:typing.overloadX - -apply!pandas.core.frame.DataFrame.apply": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R -fK -CallableType[builtins.function]& -builtins.function"builtins.function* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *) -raw - builtins.bool" builtins.bool * -args -Any *H - result_type7 Literal[builtins.str]  - builtins.str" builtins.str* -kwargs -Any0:typing.overloadX - -apply!pandas.core.frame.DataFrame.apply"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R -fK -CallableType[builtins.function]& -builtins.function"builtins.function* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *) -raw - builtins.bool" builtins.bool * -args -Any *H - result_type7 Literal[builtins.str]  - builtins.str" builtins.str* -kwargs -Any0:typing.overloadX - -apply!pandas.core.frame.DataFrame.apply": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R -fK -CallableType[builtins.function]& -builtins.function"builtins.function* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *) -raw - builtins.bool" builtins.bool * -args -Any *H - result_type7 Literal[builtins.str]  - builtins.str" builtins.str* -kwargs -Any0:typing.overloadX -apply!pandas.core.frame.DataFrame.apply"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R -fK -CallableType[builtins.function]& -builtins.function"builtins.function* -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *) -raw - builtins.bool" builtins.bool * -args -Any *H - result_type7 Literal[builtins.str]  - builtins.str" builtins.str* -kwargs -Any0:typing.overloadX -apply!pandas.core.frame.DataFrame.apply" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R -fK -CallableType[builtins.function]& -builtins.function"builtins.function*) -raw - builtins.bool" builtins.bool * - result_type -None * -args -Any * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn* -kwargs -Any0:typing.overloadX -apply!pandas.core.frame.DataFrame.apply"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R -fK -CallableType[builtins.function]& -builtins.function"builtins.function*) -raw - builtins.bool" builtins.bool * - result_type -None * -args -Any * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IntDtypeArg$ +TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]N +%pandas.core.arrays.integer.UInt8Dtype"%pandas.core.arrays.integer.UInt8DtypeP +&pandas.core.arrays.integer.UInt16Dtype"&pandas.core.arrays.integer.UInt16DtypeP +&pandas.core.arrays.integer.UInt32Dtype"&pandas.core.arrays.integer.UInt32DtypeP +&pandas.core.arrays.integer.UInt64Dtype"&pandas.core.arrays.integer.UInt64Dtype7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn* -kwargs -Any0:typing.overloadX -apply!pandas.core.frame.DataFrame.apply": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R -fK -CallableType[builtins.function]& -builtins.function"builtins.function*) -raw - builtins.bool" builtins.bool * - result_type -None * -args -Any * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn* -kwargs -Any0:typing.overloadX -apply!pandas.core.frame.DataFrame.apply": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R -fK -CallableType[builtins.function]& -builtins.function"builtins.function*) -raw - builtins.bool" builtins.bool * -args -Any * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn*H - result_type7 Literal[builtins.str]  - builtins.str" builtins.str* -kwargs -Any0:typing.overloadX2 -count!pandas.core.frame.DataFrame.count - -count!pandas.core.frame.DataFrame.count": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *2 - numeric_only - builtins.bool" builtins.bool * -level -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level0:typing.overloadX -count!pandas.core.frame.DataFrame.count"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -level -None *2 - numeric_only - builtins.bool" builtins.bool 0:typing.overloadX2 -mode pandas.core.frame.DataFrame.mode - -mode pandas.core.frame.DataFrame.mode": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *, -skipna - builtins.bool" builtins.bool *2 - numeric_only - builtins.bool" builtins.bool * -level -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level* -kwargs -Any0:typing.overloadX -mode pandas.core.frame.DataFrame.mode"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *, -skipna - builtins.bool" builtins.bool * -level -None *2 - numeric_only - builtins.bool" builtins.bool * -kwargs -Any0:typing.overloadX2! -quantile$pandas.core.frame.DataFrame.quantile -quantile$pandas.core.frame.DataFrame.quantile"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*) -q -builtins.float"builtins.float * -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *2 - numeric_only - builtins.bool" builtins.bool * - interpolation -TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -tUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -9469,337 +6329,106 @@ tUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"$pandas._typing.QuantileInterpolation * -method -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.CalculationMethod 0:typing.overloadX -quantile$pandas.core.frame.DataFrame.quantile": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -q -;Union[builtins.list[builtins.float],numpy.ndarray[Any,Any]]P -builtins.list[builtins.float] -builtins.float"builtins.float" builtins.list9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *2 - numeric_only - builtins.bool" builtins.bool * - interpolation -TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -tUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.UIntDtypeArg +TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: +Type[builtins.str] + builtins.str" builtins.str"type7 +Literal[builtins.str]  + builtins.str" builtins.strP +&pandas.core.arrays.string_.StringDtype"&pandas.core.arrays.string_.StringDtype7 +Literal[builtins.str]  + builtins.str" builtins.str4 +Type[numpy.str_] + +numpy.str_" +numpy.str_"type7 +Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"$pandas._typing.QuantileInterpolation * -method -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.CalculationMethod 0:typing.overloadX2 - -columns#pandas.core.frame.DataFrame.columns -columns#pandas.core.frame.DataFrame.columns"l -,pandas.core.indexes.base.Index[builtins.str] - builtins.str" builtins.str"pandas.core.indexes.base.Index*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame0:builtins.propertyX` -columns#pandas.core.frame.DataFrame.columns" -None*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -cols -Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[pandas._typing.HashableT],builtins.tuple[pandas._typing.HashableT]] -kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] -`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.IndexD -pandas.core.series.Series[Any] -Any"pandas.core.series.Series9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.AnyArrayLike -'builtins.list[pandas._typing.HashableT]Q -pandas._typing.HashableT" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.list -(builtins.tuple[pandas._typing.HashableT]Q -pandas._typing.HashableT" -typing.Hashable"typing.Hashable"typing.Hashable"builtins.tuple0:.setter2 -index!pandas.core.frame.DataFrame.index -index!pandas.core.frame.DataFrame.index"N -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame0:builtins.propertyX` -index!pandas.core.frame.DataFrame.index" -None*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*W -idxN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index0:.setter2 -allpandas.core.frame.DataFrame.all -allpandas.core.frame.DataFrame.all" - builtins.bool" builtins.bool*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -axis -None*X - bool_onlyG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None *, -skipna - builtins.bool" builtins.bool * -kwargs -Any0:typing.overloadX -allpandas.core.frame.DataFrame.all"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str"pandas._typing.StrDtypeArg +TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ +Type[builtins.bytes] +builtins.bytes"builtins.bytes"type7 +Literal[builtins.str]  + builtins.str" builtins.str: +Type[numpy.bytes_] + numpy.bytes_" numpy.bytes_"type7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *X - bool_onlyG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None *, -skipna - builtins.bool" builtins.bool * -kwargs -Any0:typing.overloadX2 -anypandas.core.frame.DataFrame.any -anypandas.core.frame.DataFrame.any" - builtins.bool" builtins.bool*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -axis -None*X - bool_onlyG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None *, -skipna - builtins.bool" builtins.bool * -kwargs -Any0:typing.overloadX -anypandas.core.frame.DataFrame.any"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *X - bool_onlyG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None *, -skipna - builtins.bool" builtins.bool * -kwargs -Any0:typing.overloadX2 -bfill!pandas.core.frame.DataFrame.bfill -bfill!pandas.core.frame.DataFrame.bfill" -None*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -axis -Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.BytesDtypeArg +TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ +Type[builtins.float] +builtins.float"builtins.float"type7 +Literal[builtins.str]  + builtins.str" builtins.strT +(pandas.core.arrays.floating.Float32Dtype"(pandas.core.arrays.floating.Float32DtypeT +(pandas.core.arrays.floating.Float64Dtype"(pandas.core.arrays.floating.Float64Dtype7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis -None *G -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool*Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None *{ -downcastk -"Union[builtins.dict[Any,Any],None]9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -None 0:typing.overloadX -bfill!pandas.core.frame.DataFrame.bfill": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -axis -Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis -None *I -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool *Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None *{ -downcastk -"Union[builtins.dict[Any,Any],None]9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -None 0:typing.overloadX2 -ffill!pandas.core.frame.DataFrame.ffill -ffill!pandas.core.frame.DataFrame.ffill" -None*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -axis -Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis -None *G -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool*Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None *{ -downcastk -"Union[builtins.dict[Any,Any],None]9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -None 0:typing.overloadX -ffill!pandas.core.frame.DataFrame.ffill": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -axis -Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis -None *I -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool *Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None *{ -downcastk -"Union[builtins.dict[Any,Any],None]9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -None 0:typing.overloadX2X - interpolate'pandas.core.frame.DataFrame.interpolate - interpolate'pandas.core.frame.DataFrame.interpolate" -None*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -method -TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -9809,6 +6438,10 @@ kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[A Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 @@ -9827,6 +6460,16 @@ kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[A Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.FloatDtypeArg +TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]F +Type[builtins.complex]$ +builtins.complex"builtins.complex"type7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 @@ -9835,64 +6478,38 @@ kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[A Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"!pandas._typing.InterpolateOptions * -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None * -limit_direction -HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str * - -limit_area -7Union[Literal[builtins.str],Literal[builtins.str],None]7 + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str -None *x -downcasth -!Union[Literal[builtins.str],None]7 + builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str -None *G -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool* -kwargs -Any0:typing.overloadX - interpolate'pandas.core.frame.DataFrame.interpolate": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -method -TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ComplexDtypeArg$ +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 @@ -9923,61 +6540,23 @@ limit_area Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"!pandas._typing.InterpolateOptions * -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None * -limit_direction -HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str * - -limit_area -7Union[Literal[builtins.str],Literal[builtins.str],None]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str -None *x -downcasth -!Union[Literal[builtins.str],None]7 + builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str -None *I -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool * -kwargs -Any0:typing.overloadX - interpolate'pandas.core.frame.DataFrame.interpolate"q -'Union[pandas.core.frame.DataFrame,None]: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame -None*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -method -TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -10013,224 +6592,39 @@ limit_area Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"!pandas._typing.InterpolateOptions * -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None *V -inplaceG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None * -limit_direction -HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimedeltaDtypeArg& +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str * - -limit_area -7Union[Literal[builtins.str],Literal[builtins.str],None]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str -None *x -downcasth -!Union[Literal[builtins.str],None]7 + builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str -None * -kwargs -Any0:typing.overloadX2, - rename_axis'pandas.core.frame.DataFrame.rename_axis - - rename_axis'pandas.core.frame.DataFrame.rename_axis" -None*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -mapper -Any * -axis -Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis -None ** -copy - builtins.bool" builtins.bool *G -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool0:typing.overloadX - - rename_axis'pandas.core.frame.DataFrame.rename_axis": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -mapper -Any * -axis -Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis -None ** -copy - builtins.bool" builtins.bool *I -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool 0:typing.overloadX - rename_axis'pandas.core.frame.DataFrame.rename_axis" -None*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -index -Union[builtins.str,typing.Sequence[builtins.str],builtins.dict[Union[builtins.str,builtins.int],builtins.str],CallableType[builtins.function],None] - builtins.str" builtins.strN -typing.Sequence[builtins.str] - builtins.str" builtins.str"typing.Sequence -pandas.core.window.rolling.Window[pandas.core.frame.DataFrame]: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame"!pandas.core.window.rolling.Window*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -window -{Union[builtins.int,builtins.str,datetime.timedelta,pandas._libs.tslibs.offsets.BaseOffset,pandas.core.indexers.BaseIndexer] - builtins.int" builtins.int - builtins.str" builtins.str( -datetime.timedelta"datetime.timedeltaP -&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffsetD - pandas.core.indexers.BaseIndexer" pandas.core.indexers.BaseIndexer*W - min_periodsD -Union[builtins.int,None] - builtins.int" builtins.int -None *, -center - builtins.bool" builtins.bool *W -onM -Union[typing.Hashable,None]" -typing.Hashable"typing.Hashable -None * -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -closed -uUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -10238,62 +6632,11 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"!pandas._typing.IntervalClosedType -None *P -stepD -Union[builtins.int,None] - builtins.int" builtins.int -None * -method -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.CalculationMethod ** -win_type - builtins.str" builtins.str0:typing.overloadX -rolling#pandas.core.frame.DataFrame.rolling" -?pandas.core.window.rolling.Rolling[pandas.core.frame.DataFrame]: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame""pandas.core.window.rolling.Rolling*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -window -{Union[builtins.int,builtins.str,datetime.timedelta,pandas._libs.tslibs.offsets.BaseOffset,pandas.core.indexers.BaseIndexer] - builtins.int" builtins.int - builtins.str" builtins.str( -datetime.timedelta"datetime.timedeltaP -&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffsetD - pandas.core.indexers.BaseIndexer" pandas.core.indexers.BaseIndexer*W - min_periodsD -Union[builtins.int,None] - builtins.int" builtins.int -None *, -center - builtins.bool" builtins.bool *W -onM -Union[typing.Hashable,None]" -typing.Hashable"typing.Hashable -None * -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -closed -uUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -10301,51 +6644,13 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"!pandas._typing.IntervalClosedType -None *P -stepD -Union[builtins.int,None] - builtins.int" builtins.int -None * -method -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.CalculationMethod * -win_type -None 0:typing.overloadX2[ -to_json#pandas.core.frame.DataFrame.to_json -to_json#pandas.core.frame.DataFrame.to_json" -None*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* - path_or_buf -hUnion[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.WriteBuffer[builtins.str]] -8TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]] --Union[builtins.str,os.PathLike[builtins.str]] - builtins.str" builtins.strF -os.PathLike[builtins.str] - builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathd -(pandas._typing.WriteBuffer[builtins.str] - builtins.str" builtins.str"pandas._typing.WriteBuffer*C -orient7 -Literal[builtins.str]  - builtins.str" builtins.str* - date_format -7Union[Literal[builtins.str],Literal[builtins.str],None]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str -None *4 -double_precision - builtins.int" builtins.int *1 - force_ascii - builtins.bool" builtins.bool * - date_unit -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -10353,19 +6658,7 @@ hUnion[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.W Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str * -default_handler -+Union[CallableType[builtins.function],None]K -CallableType[builtins.function]& -builtins.function"builtins.function -None *E -lines: -Literal[builtins.bool]  - builtins.bool" builtins.bool* - compression -TypeAlias[Union[None,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],TypeAlias[builtins.dict[builtins.str,Any]]]] -Union[None,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],TypeAlias[builtins.dict[builtins.str,Any]]] -None7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -10377,42 +6670,15 @@ hUnion[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.W Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str -*TypeAlias[builtins.dict[builtins.str,Any]]W -builtins.dict[builtins.str,Any] - builtins.str" builtins.str -Any" builtins.dict"pandas._typing.CompressionDict"!pandas._typing.CompressionOptions *+ -index - builtins.bool" builtins.bool *R -indentD -Union[builtins.int,None] - builtins.int" builtins.int -None *A -mode7 + builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str0:typing.overloadX -to_json#pandas.core.frame.DataFrame.to_json" - builtins.str" builtins.str*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* - path_or_buf -None *C -orient7 + builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str* - date_format -7Union[Literal[builtins.str],Literal[builtins.str],None]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str -None *4 -double_precision - builtins.int" builtins.int *1 - force_ascii - builtins.bool" builtins.bool * - date_unit -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -10420,19 +6686,7 @@ hUnion[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.W Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str * -default_handler -+Union[CallableType[builtins.function],None]K -CallableType[builtins.function]& -builtins.function"builtins.function -None *E -lines: -Literal[builtins.bool]  - builtins.bool" builtins.bool* - compression -TypeAlias[Union[None,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],TypeAlias[builtins.dict[builtins.str,Any]]]] -Union[None,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],TypeAlias[builtins.dict[builtins.str,Any]]] -None7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -10444,55 +6698,139 @@ hUnion[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.W Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str -*TypeAlias[builtins.dict[builtins.str,Any]]W -builtins.dict[builtins.str,Any] - builtins.str" builtins.str -Any" builtins.dict"pandas._typing.CompressionDict"!pandas._typing.CompressionOptions *+ -index - builtins.bool" builtins.bool *R -indentD -Union[builtins.int,None] - builtins.int" builtins.int -None *A -mode7 + builtins.str" builtins.str" pandas._typing.TimestampDtypeArg +RTypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]] +GUnion[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]X +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype7 Literal[builtins.str]  - builtins.str" builtins.str0:typing.overloadX -to_json#pandas.core.frame.DataFrame.to_json" - builtins.str" builtins.str*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* - path_or_buf -None * -orient -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] -TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 + builtins.str" builtins.str"pandas._typing.CategoryDtypeArg +gTypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]] +\Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]C +Type[builtins.object]" +builtins.object"builtins.object"type7 +Literal[builtins.str]  + builtins.str" builtins.str= +Type[numpy.object_] + numpy.object_" numpy.object_"type7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ObjectDtypeArg +dTypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +YUnion[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]4 +Type[numpy.void] + +numpy.void" +numpy.void"type7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.VoidDtypeArg +STypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]] +HUnion[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]I +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtypeP +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype"pandas._typing.DtypeObj"pandas._typing.AstypeArg +None 0:typing.overload:builtins.classmethodXp20 +to_dict#pandas.core.frame.DataFrame.to_dict +to_dict#pandas.core.frame.DataFrame.to_dict" +9builtins.list[typing.MutableMapping[typing.Hashable,Any]]p +*typing.MutableMapping[typing.Hashable,Any]" +typing.Hashable"typing.Hashable +Any"typing.MutableMapping" builtins.list*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*C +orient7 +Literal[builtins.str]  + builtins.str" builtins.str* +into +JUnion[typing.MutableMapping[Any,Any],Type[typing.MutableMapping[Any,Any]]]I +typing.MutableMapping[Any,Any] +Any +Any"typing.MutableMappingy +$Type[typing.MutableMapping[Any,Any]]I +typing.MutableMapping[Any,Any] +Any +Any"typing.MutableMapping"type*G +index: +Literal[builtins.bool]  + builtins.bool" builtins.bool 0:typing.overloadX +to_dict#pandas.core.frame.DataFrame.to_dict" +1builtins.list[builtins.dict[typing.Hashable,Any]]` +"builtins.dict[typing.Hashable,Any]" +typing.Hashable"typing.Hashable +Any" builtins.dict" builtins.list*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*C +orient7 +Literal[builtins.str]  + builtins.str" builtins.str*m +intoa +Type[builtins.dict[Any,Any]]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict"type *G +index: +Literal[builtins.bool]  + builtins.bool" builtins.bool 0:typing.overloadX +to_dict#pandas.core.frame.DataFrame.to_dict"p +*typing.MutableMapping[typing.Hashable,Any]" +typing.Hashable"typing.Hashable +Any"typing.MutableMapping*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +orient +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.JsonFrameOrient -None * - date_format -7Union[Literal[builtins.str],Literal[builtins.str],None]7 + builtins.str" builtins.str* +into +JUnion[typing.MutableMapping[Any,Any],Type[typing.MutableMapping[Any,Any]]]I +typing.MutableMapping[Any,Any] +Any +Any"typing.MutableMappingy +$Type[typing.MutableMapping[Any,Any]]I +typing.MutableMapping[Any,Any] +Any +Any"typing.MutableMapping"type*G +index: +Literal[builtins.bool]  + builtins.bool" builtins.bool 0:typing.overloadX +to_dict#pandas.core.frame.DataFrame.to_dict"p +*typing.MutableMapping[typing.Hashable,Any]" +typing.Hashable"typing.Hashable +Any"typing.MutableMapping*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +orient +2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str -None *4 -double_precision - builtins.int" builtins.int *1 - force_ascii - builtins.bool" builtins.bool * - date_unit + builtins.str" builtins.str* +into +JUnion[typing.MutableMapping[Any,Any],Type[typing.MutableMapping[Any,Any]]]I +typing.MutableMapping[Any,Any] +Any +Any"typing.MutableMappingy +$Type[typing.MutableMapping[Any,Any]]I +typing.MutableMapping[Any,Any] +Any +Any"typing.MutableMapping"type*+ +index + builtins.bool" builtins.bool 0:typing.overloadX +to_dict#pandas.core.frame.DataFrame.to_dict"p +*typing.MutableMapping[typing.Hashable,Any]" +typing.Hashable"typing.Hashable +Any"typing.MutableMapping*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +orient ^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 @@ -10501,22 +6839,50 @@ hUnion[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.W Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str * -default_handler -+Union[CallableType[builtins.function],None]K -CallableType[builtins.function]& -builtins.function"builtins.function -None *+ -lines - builtins.bool" builtins.bool * - compression -TypeAlias[Union[None,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],TypeAlias[builtins.dict[builtins.str,Any]]]] -Union[None,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],TypeAlias[builtins.dict[builtins.str,Any]]] -None7 + builtins.str" builtins.str * +into +JUnion[typing.MutableMapping[Any,Any],Type[typing.MutableMapping[Any,Any]]]I +typing.MutableMapping[Any,Any] +Any +Any"typing.MutableMappingy +$Type[typing.MutableMapping[Any,Any]]I +typing.MutableMapping[Any,Any] +Any +Any"typing.MutableMapping"type*G +index: +Literal[builtins.bool]  + builtins.bool" builtins.bool 0:typing.overloadX +to_dict#pandas.core.frame.DataFrame.to_dict"p +*typing.MutableMapping[typing.Hashable,Any]" +typing.Hashable"typing.Hashable +Any"typing.MutableMapping*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +orient +2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str7 + builtins.str" builtins.str * +into +JUnion[typing.MutableMapping[Any,Any],Type[typing.MutableMapping[Any,Any]]]I +typing.MutableMapping[Any,Any] +Any +Any"typing.MutableMappingy +$Type[typing.MutableMapping[Any,Any]]I +typing.MutableMapping[Any,Any] +Any +Any"typing.MutableMapping"type*+ +index + builtins.bool" builtins.bool 0:typing.overloadX +to_dict#pandas.core.frame.DataFrame.to_dict"` +"builtins.dict[typing.Hashable,Any]" +typing.Hashable"typing.Hashable +Any" builtins.dict*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +orient +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -10524,84 +6890,109 @@ hUnion[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.W Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str -*TypeAlias[builtins.dict[builtins.str,Any]]W -builtins.dict[builtins.str,Any] - builtins.str" builtins.str -Any" builtins.dict"pandas._typing.CompressionDict"!pandas._typing.CompressionOptions *+ -index - builtins.bool" builtins.bool *R -indentD -Union[builtins.int,None] - builtins.int" builtins.int -None *C -mode7 + builtins.str" builtins.str *m +intoa +Type[builtins.dict[Any,Any]]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict"type *G +index: +Literal[builtins.bool]  + builtins.bool" builtins.bool 0:typing.overloadX +to_dict#pandas.core.frame.DataFrame.to_dict"` +"builtins.dict[typing.Hashable,Any]" +typing.Hashable"typing.Hashable +Any" builtins.dict*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +orient +2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  - builtins.str" builtins.str 0:typing.overloadX -to_json#pandas.core.frame.DataFrame.to_json" + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str *m +intoa +Type[builtins.dict[Any,Any]]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict"type *+ +index + builtins.bool" builtins.bool 0:typing.overloadX2 + +to_parquet&pandas.core.frame.DataFrame.to_parquet + +to_parquet&pandas.core.frame.DataFrame.to_parquet" None*D self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* - path_or_buf -hUnion[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.WriteBuffer[builtins.str]] +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +path +jUnion[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.WriteBuffer[builtins.bytes]] 8TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]] -Union[builtins.str,os.PathLike[builtins.str]] builtins.str" builtins.strF os.PathLike[builtins.str] - builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathd -(pandas._typing.WriteBuffer[builtins.str] - builtins.str" builtins.str"pandas._typing.WriteBuffer* -orient -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] -TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 + builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathj +*pandas._typing.WriteBuffer[builtins.bytes] +builtins.bytes"builtins.bytes"pandas._typing.WriteBuffer* +engine +STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str7 + builtins.str" builtins.str"pandas._typing.ParquetEngine * + compression +yUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.JsonFrameOrient -None * - date_format -7Union[Literal[builtins.str],Literal[builtins.str],None]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str -None *4 -double_precision - builtins.int" builtins.int *1 - force_ascii - builtins.bool" builtins.bool * - date_unit -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 +None *T +indexG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None * +partition_cols +3Union[builtins.list[pandas._typing.HashableT],None] +'builtins.list[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable" builtins.list +None * +storage_options +6TypeAlias[Union[builtins.dict[builtins.str,Any],None]] ++Union[builtins.dict[builtins.str,Any],None]W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict +None"pandas._typing.StorageOptions * +kwargs +Any0:typing.overloadX + +to_parquet&pandas.core.frame.DataFrame.to_parquet" +builtins.bytes"builtins.bytes*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +path +None * +engine +STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str * -default_handler -+Union[CallableType[builtins.function],None]K -CallableType[builtins.function]& -builtins.function"builtins.function -None *+ -lines - builtins.bool" builtins.bool * - compression -TypeAlias[Union[None,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],TypeAlias[builtins.dict[builtins.str,Any]]]] -Union[None,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],TypeAlias[builtins.dict[builtins.str,Any]]] -None7 -Literal[builtins.str]  - builtins.str" builtins.str7 + builtins.str" builtins.str"pandas._typing.ParquetEngine * + compression +yUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -10611,82 +7002,132 @@ hUnion[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.W Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str -*TypeAlias[builtins.dict[builtins.str,Any]]W + builtins.str" builtins.str +None *T +indexG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None * +partition_cols +3Union[builtins.list[pandas._typing.HashableT],None] +'builtins.list[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable" builtins.list +None * +storage_options +6TypeAlias[Union[builtins.dict[builtins.str,Any],None]] ++Union[builtins.dict[builtins.str,Any],None]W builtins.dict[builtins.str,Any] builtins.str" builtins.str -Any" builtins.dict"pandas._typing.CompressionDict"!pandas._typing.CompressionOptions *+ -index - builtins.bool" builtins.bool *R -indentD -Union[builtins.int,None] - builtins.int" builtins.int -None *C -mode7 -Literal[builtins.str]  - builtins.str" builtins.str 0:typing.overloadX2; - to_string%pandas.core.frame.DataFrame.to_string - to_string%pandas.core.frame.DataFrame.to_string" +Any" builtins.dict +None"pandas._typing.StorageOptions * +kwargs +Any0:typing.overloadX2 +to_orc"pandas.core.frame.DataFrame.to_orc +to_orc"pandas.core.frame.DataFrame.to_orc" None*D self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -buf -hUnion[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.WriteBuffer[builtins.str]] +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +path +jUnion[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.WriteBuffer[builtins.bytes]] 8TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]] -Union[builtins.str,os.PathLike[builtins.str]] builtins.str" builtins.strF os.PathLike[builtins.str] - builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathd -(pandas._typing.WriteBuffer[builtins.str] - builtins.str" builtins.str"pandas._typing.WriteBuffer* -columns -wUnion[builtins.list[pandas._typing.HashableT1],pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],None] -(builtins.list[pandas._typing.HashableT1]R -pandas._typing.HashableT1" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.listN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.IndexD -pandas.core.series.Series[Any] -Any"pandas.core.series.Series -None * - col_space -jUnion[builtins.int,builtins.list[builtins.int],builtins.dict[pandas._typing.HashableT2,builtins.int],None] - builtins.int" builtins.intJ -builtins.list[builtins.int] - builtins.int" builtins.int" builtins.list -5builtins.dict[pandas._typing.HashableT2,builtins.int]R -pandas._typing.HashableT2" -typing.Hashable"typing.Hashable"typing.Hashable - builtins.int" builtins.int" builtins.dict -None * -header -MUnion[builtins.bool,builtins.list[builtins.str],builtins.tuple[builtins.str]] - builtins.bool" builtins.boolJ -builtins.list[builtins.str] - builtins.str" builtins.str" builtins.listL -builtins.tuple[builtins.str] - builtins.str" builtins.str"builtins.tuple *+ + builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathj +*pandas._typing.WriteBuffer[builtins.bytes] +builtins.bytes"builtins.bytes"pandas._typing.WriteBuffer*E +engine7 +Literal[builtins.str]  + builtins.str" builtins.str *T +indexG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None * + engine_kwargs ++Union[builtins.dict[builtins.str,Any],None]W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict +None 0:typing.overloadX +to_orc"pandas.core.frame.DataFrame.to_orc" +builtins.bytes"builtins.bytes*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +path +None *E +engine7 +Literal[builtins.str]  + builtins.str" builtins.str *T +indexG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None * + engine_kwargs ++Union[builtins.dict[builtins.str,Any],None]W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict +None 0:typing.overloadX2I +to_html#pandas.core.frame.DataFrame.to_html& +to_html#pandas.core.frame.DataFrame.to_html" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +buf +hUnion[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.WriteBuffer[builtins.str]] +8TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]] +-Union[builtins.str,os.PathLike[builtins.str]] + builtins.str" builtins.strF +os.PathLike[builtins.str] + builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathd +(pandas._typing.WriteBuffer[builtins.str] + builtins.str" builtins.str"pandas._typing.WriteBuffer* +columns +vUnion[builtins.list[pandas._typing.HashableT],pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],None] +'builtins.list[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable" builtins.listN +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series +None * + col_space +Union[TypeAlias[Union[builtins.str,builtins.int,typing.Sequence[Union[builtins.int,builtins.str]],typing.Mapping[typing.Hashable,Union[builtins.str,builtins.int]]]],None] +TypeAlias[Union[builtins.str,builtins.int,typing.Sequence[Union[builtins.int,builtins.str]],typing.Mapping[typing.Hashable,Union[builtins.str,builtins.int]]]] +Union[builtins.str,builtins.int,typing.Sequence[Union[builtins.int,builtins.str]],typing.Mapping[typing.Hashable,Union[builtins.str,builtins.int]]] + builtins.str" builtins.str + builtins.int" builtins.int +1typing.Sequence[Union[builtins.int,builtins.str]]` + Union[builtins.int,builtins.str] + builtins.int" builtins.int + builtins.str" builtins.str"typing.Sequence +@typing.Mapping[typing.Hashable,Union[builtins.str,builtins.int]]" +typing.Hashable"typing.Hashable` + Union[builtins.str,builtins.int] + builtins.str" builtins.str + builtins.int" builtins.int"typing.Mapping"pandas._typing.ColspaceArgType +None *, +header + builtins.bool" builtins.bool *+ index builtins.bool" builtins.bool ** na_rep - builtins.str" builtins.str * + builtins.str" builtins.str * -formatters -Union[TypeAlias[Union[builtins.list[CallableType[builtins.function]],builtins.tuple[CallableType[builtins.function]],typing.Mapping[Union[builtins.str,builtins.int],CallableType[builtins.function]]]],None] -TypeAlias[Union[builtins.list[CallableType[builtins.function]],builtins.tuple[CallableType[builtins.function]],typing.Mapping[Union[builtins.str,builtins.int],CallableType[builtins.function]]]] -Union[builtins.list[CallableType[builtins.function]],builtins.tuple[CallableType[builtins.function]],typing.Mapping[Union[builtins.str,builtins.int],CallableType[builtins.function]]] +formatters +Union[builtins.list[CallableType[builtins.function]],builtins.tuple[CallableType[builtins.function]],typing.Mapping[typing.Hashable,CallableType[builtins.function]],None] .builtins.list[CallableType[builtins.function]]K CallableType[builtins.function]& builtins.function"builtins.function" builtins.list /builtins.tuple[CallableType[builtins.function]]K CallableType[builtins.function]& -builtins.function"builtins.function"builtins.tuple -Ptyping.Mapping[Union[builtins.str,builtins.int],CallableType[builtins.function]]` - Union[builtins.str,builtins.int] - builtins.str" builtins.str - builtins.int" builtins.intK +builtins.function"builtins.function"builtins.tuple +?typing.Mapping[typing.Hashable,CallableType[builtins.function]]" +typing.Hashable"typing.HashableK CallableType[builtins.function]& -builtins.function"builtins.function"typing.Mapping"pandas._typing.FormattersType +builtins.function"builtins.function"typing.Mapping None * float_format +Union[CallableType[builtins.function],None]K @@ -10698,9 +7139,30 @@ Ptyping.Mapping[Union[builtins.str,builtins.int],CallableType[builtins.function] builtins.bool" builtins.bool None *1 index_names - builtins.bool" builtins.bool *S -justifyD -Union[builtins.str,None] + builtins.bool" builtins.bool * +justify +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  builtins.str" builtins.str None *T max_rowsD @@ -10714,75 +7176,79 @@ Ptyping.Mapping[Union[builtins.str,builtins.int],CallableType[builtins.function] show_dimensions builtins.bool" builtins.bool *+ decimal - builtins.str" builtins.str *V - -line_widthD -Union[builtins.int,None] - builtins.int" builtins.int -None *T -min_rowsD -Union[builtins.int,None] - builtins.int" builtins.int -None *X - max_colwidthD + builtins.str" builtins.str */ + bold_rows + builtins.bool" builtins.bool * +classes +)Union[typing.Sequence[builtins.str],None]N +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.Sequence +None *, +escape + builtins.bool" builtins.bool *. +notebook + builtins.bool" builtins.bool *R +borderD Union[builtins.int,None] builtins.int" builtins.int None *T +table_idD +Union[builtins.str,None] + builtins.str" builtins.str +None *2 + render_links + builtins.bool" builtins.bool *T encodingD Union[builtins.str,None] builtins.str" builtins.str -None 0:typing.overloadX - to_string%pandas.core.frame.DataFrame.to_string" +None 0:typing.overloadX! +to_html#pandas.core.frame.DataFrame.to_html" builtins.str" builtins.str*D self: pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* buf -None * -columns -vUnion[builtins.list[pandas._typing.HashableT],pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],None] -'builtins.list[pandas._typing.HashableT]Q +None * +columns +5Union[typing.Sequence[pandas._typing.HashableT],None] +)typing.Sequence[pandas._typing.HashableT]Q pandas._typing.HashableT" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.listN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.IndexD -pandas.core.series.Series[Any] -Any"pandas.core.series.Series -None * - col_space -`Union[builtins.int,builtins.list[builtins.int],builtins.dict[typing.Hashable,builtins.int],None] - builtins.int" builtins.intJ -builtins.list[builtins.int] - builtins.int" builtins.int" builtins.list~ -+builtins.dict[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int" builtins.dict -None * -header -2Union[builtins.bool,typing.Sequence[builtins.str]] - builtins.bool" builtins.boolN -typing.Sequence[builtins.str] - builtins.str" builtins.str"typing.Sequence *+ +typing.Hashable"typing.Hashable"typing.Hashable"typing.Sequence +None * + col_space +Union[TypeAlias[Union[builtins.str,builtins.int,typing.Sequence[Union[builtins.int,builtins.str]],typing.Mapping[typing.Hashable,Union[builtins.str,builtins.int]]]],None] +TypeAlias[Union[builtins.str,builtins.int,typing.Sequence[Union[builtins.int,builtins.str]],typing.Mapping[typing.Hashable,Union[builtins.str,builtins.int]]]] +Union[builtins.str,builtins.int,typing.Sequence[Union[builtins.int,builtins.str]],typing.Mapping[typing.Hashable,Union[builtins.str,builtins.int]]] + builtins.str" builtins.str + builtins.int" builtins.int +1typing.Sequence[Union[builtins.int,builtins.str]]` + Union[builtins.int,builtins.str] + builtins.int" builtins.int + builtins.str" builtins.str"typing.Sequence +@typing.Mapping[typing.Hashable,Union[builtins.str,builtins.int]]" +typing.Hashable"typing.Hashable` + Union[builtins.str,builtins.int] + builtins.str" builtins.str + builtins.int" builtins.int"typing.Mapping"pandas._typing.ColspaceArgType +None *, +header + builtins.bool" builtins.bool *+ index builtins.bool" builtins.bool ** na_rep - builtins.str" builtins.str * + builtins.str" builtins.str * -formatters -Union[TypeAlias[Union[builtins.list[CallableType[builtins.function]],builtins.tuple[CallableType[builtins.function]],typing.Mapping[Union[builtins.str,builtins.int],CallableType[builtins.function]]]],None] -TypeAlias[Union[builtins.list[CallableType[builtins.function]],builtins.tuple[CallableType[builtins.function]],typing.Mapping[Union[builtins.str,builtins.int],CallableType[builtins.function]]]] -Union[builtins.list[CallableType[builtins.function]],builtins.tuple[CallableType[builtins.function]],typing.Mapping[Union[builtins.str,builtins.int],CallableType[builtins.function]]] +formatters +Union[builtins.list[CallableType[builtins.function]],builtins.tuple[CallableType[builtins.function]],typing.Mapping[typing.Hashable,CallableType[builtins.function]],None] .builtins.list[CallableType[builtins.function]]K CallableType[builtins.function]& builtins.function"builtins.function" builtins.list /builtins.tuple[CallableType[builtins.function]]K CallableType[builtins.function]& -builtins.function"builtins.function"builtins.tuple -Ptyping.Mapping[Union[builtins.str,builtins.int],CallableType[builtins.function]]` - Union[builtins.str,builtins.int] - builtins.str" builtins.str - builtins.int" builtins.intK +builtins.function"builtins.function"builtins.tuple +?typing.Mapping[typing.Hashable,CallableType[builtins.function]]" +typing.Hashable"typing.HashableK CallableType[builtins.function]& -builtins.function"builtins.function"typing.Mapping"pandas._typing.FormattersType +builtins.function"builtins.function"typing.Mapping None * float_format +Union[CallableType[builtins.function],None]K @@ -10794,9 +7260,30 @@ Ptyping.Mapping[Union[builtins.str,builtins.int],CallableType[builtins.function] builtins.bool" builtins.bool None *1 index_names - builtins.bool" builtins.bool *S -justifyD -Union[builtins.str,None] + builtins.bool" builtins.bool * +justify +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  builtins.str" builtins.str None *T max_rowsD @@ -10810,425 +7297,8729 @@ Ptyping.Mapping[Union[builtins.str,builtins.int],CallableType[builtins.function] show_dimensions builtins.bool" builtins.bool *+ decimal - builtins.str" builtins.str *V - -line_widthD -Union[builtins.int,None] - builtins.int" builtins.int -None *T -min_rowsD -Union[builtins.int,None] - builtins.int" builtins.int -None *X - max_colwidthD + builtins.str" builtins.str */ + bold_rows + builtins.bool" builtins.bool * +classes +)Union[typing.Sequence[builtins.str],None]N +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.Sequence +None *, +escape + builtins.bool" builtins.bool *. +notebook + builtins.bool" builtins.bool *R +borderD Union[builtins.int,None] builtins.int" builtins.int None *T +table_idD +Union[builtins.str,None] + builtins.str" builtins.str +None *2 + render_links + builtins.bool" builtins.bool *T encodingD Union[builtins.str,None] builtins.str" builtins.str -None 0:typing.overloadXr: -__hash__$pandas.core.frame.DataFrame.__hash__ -NonerT -sparse"pandas.core.frame.DataFrame.sparse& -builtins.ellipsis"builtins.ellipsisrF -Name pandas.core.frame.DataFrame.Name - builtins.str" builtins.str -Grouper#pandas.core.groupby.grouper.Grouper"builtins.object*U -__new__+pandas.core.groupby.grouper.Grouper.__new__* -cls* -args* - -kwargs* -__init__,pandas.core.groupby.grouper.Grouper.__init__" -None*T -selfJ -#pandas.core.groupby.grouper.Grouper"#pandas.core.groupby.grouper.Grouper* -key -Any * -level -Any * -freq -Any *( -axis - builtins.int" builtins.int ** -sort - builtins.bool" builtins.bool *M -ax&pandas.core.groupby.grouper.Grouper.ax* -self0:builtins.property`*U -groups*pandas.core.groupby.grouper.Grouper.groups* -self0:builtins.property`rV -key'pandas.core.groupby.grouper.Grouper.key& -builtins.ellipsis"builtins.ellipsisrZ -level)pandas.core.groupby.grouper.Grouper.level& -builtins.ellipsis"builtins.ellipsisrX -freq(pandas.core.groupby.grouper.Grouper.freq& -builtins.ellipsis"builtins.ellipsisrX -axis(pandas.core.groupby.grouper.Grouper.axis& -builtins.ellipsis"builtins.ellipsisrX -sort(pandas.core.groupby.grouper.Grouper.sort& -builtins.ellipsis"builtins.ellipsisr^ -grouper+pandas.core.groupby.grouper.Grouper.grouper& -builtins.ellipsis"builtins.ellipsisrV -obj'pandas.core.groupby.grouper.Grouper.obj& -builtins.ellipsis"builtins.ellipsisr^ -indexer+pandas.core.groupby.grouper.Grouper.indexer& -builtins.ellipsis"builtins.ellipsisr\ -binner*pandas.core.groupby.grouper.Grouper.binner& -builtins.ellipsis"builtins.ellipsis. -NamedAgg$pandas.core.groupby.generic.NamedAgg"builtins.tuple* +None 0:typing.overloadX2< +to_xml"pandas.core.frame.DataFrame.to_xml +to_xml"pandas.core.frame.DataFrame.to_xml" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +path_or_buffer +Union[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.WriteBuffer[builtins.bytes],pandas._typing.WriteBuffer[builtins.str]] +8TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]] +-Union[builtins.str,os.PathLike[builtins.str]] + builtins.str" builtins.strF +os.PathLike[builtins.str] + builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathj +*pandas._typing.WriteBuffer[builtins.bytes] +builtins.bytes"builtins.bytes"pandas._typing.WriteBufferd +(pandas._typing.WriteBuffer[builtins.str] + builtins.str" builtins.str"pandas._typing.WriteBuffer*+ +index + builtins.bool" builtins.bool *- + root_name + builtins.str" builtins.str *, +row_name + builtins.str" builtins.str *R +na_repD +Union[builtins.str,None] + builtins.str" builtins.str +None * + attr_cols +4Union[builtins.list[pandas._typing.HashableT1],None] +(builtins.list[pandas._typing.HashableT1]R +pandas._typing.HashableT1" +typing.Hashable"typing.Hashable"typing.Hashable" builtins.list +None * + elem_cols +4Union[builtins.list[pandas._typing.HashableT2],None] +(builtins.list[pandas._typing.HashableT2]R +pandas._typing.HashableT2" +typing.Hashable"typing.Hashable"typing.Hashable" builtins.list +None * -_replace-pandas.core.groupby.generic.NamedAgg._replace" -(pandas.core.groupby.generic.NamedAgg._NT -RTuple[builtins.str,TypeAlias[Union[builtins.str,CallableType[builtins.function]]]] - builtins.str" builtins.str ->TypeAlias[Union[builtins.str,CallableType[builtins.function]]] -3Union[builtins.str,CallableType[builtins.function]] - builtins.str" builtins.strK -CallableType[builtins.function]& -builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalar* -_self -(pandas.core.groupby.generic.NamedAgg._NT -RTuple[builtins.str,TypeAlias[Union[builtins.str,CallableType[builtins.function]]]] - builtins.str" builtins.str ->TypeAlias[Union[builtins.str,CallableType[builtins.function]]] -3Union[builtins.str,CallableType[builtins.function]] - builtins.str" builtins.strK -CallableType[builtins.function]& -builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalar** -column - builtins.str" builtins.str * -aggfunc ->TypeAlias[Union[builtins.str,CallableType[builtins.function]]] -3Union[builtins.str,CallableType[builtins.function]] - builtins.str" builtins.strK -CallableType[builtins.function]& -builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalar * +namespaces +@Union[builtins.dict[Union[builtins.str,None],builtins.str],None] +4builtins.dict[Union[builtins.str,None],builtins.str]D +Union[builtins.str,None] + builtins.str" builtins.str +None + builtins.str" builtins.str" builtins.dict +None *R +prefixD +Union[builtins.str,None] + builtins.str" builtins.str +None *, +encoding + builtins.str" builtins.str *5 +xml_declaration + builtins.bool" builtins.bool *2 + pretty_print + builtins.bool" builtins.bool * +parser +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.XMLParsers * -__new__,pandas.core.groupby.generic.NamedAgg.__new__" -(pandas.core.groupby.generic.NamedAgg._NT -RTuple[builtins.str,TypeAlias[Union[builtins.str,CallableType[builtins.function]]]] - builtins.str" builtins.str ->TypeAlias[Union[builtins.str,CallableType[builtins.function]]] -3Union[builtins.str,CallableType[builtins.function]] - builtins.str" builtins.strK -CallableType[builtins.function]& -builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalar* -_cls -.Type[pandas.core.groupby.generic.NamedAgg._NT] -(pandas.core.groupby.generic.NamedAgg._NT -RTuple[builtins.str,TypeAlias[Union[builtins.str,CallableType[builtins.function]]]] - builtins.str" builtins.str ->TypeAlias[Union[builtins.str,CallableType[builtins.function]]] -3Union[builtins.str,CallableType[builtins.function]] - builtins.str" builtins.strK -CallableType[builtins.function]& -builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalar"type** -column - builtins.str" builtins.str * -aggfunc ->TypeAlias[Union[builtins.str,CallableType[builtins.function]]] -3Union[builtins.str,CallableType[builtins.function]] - builtins.str" builtins.strK -CallableType[builtins.function]& -builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalar * -_asdict,pandas.core.groupby.generic.NamedAgg._asdict"W -builtins.dict[builtins.str,Any] - builtins.str" builtins.str -Any" builtins.dict* -_self -(pandas.core.groupby.generic.NamedAgg._NT -RTuple[builtins.str,TypeAlias[Union[builtins.str,CallableType[builtins.function]]]] - builtins.str" builtins.str ->TypeAlias[Union[builtins.str,CallableType[builtins.function]]] -3Union[builtins.str,CallableType[builtins.function]] - builtins.str" builtins.strK -CallableType[builtins.function]& -builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalar* -_make*pandas.core.groupby.generic.NamedAgg._make" -(pandas.core.groupby.generic.NamedAgg._NT -RTuple[builtins.str,TypeAlias[Union[builtins.str,CallableType[builtins.function]]]] - builtins.str" builtins.str ->TypeAlias[Union[builtins.str,CallableType[builtins.function]]] -3Union[builtins.str,CallableType[builtins.function]] - builtins.str" builtins.strK -CallableType[builtins.function]& -builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalar* -_cls -.Type[pandas.core.groupby.generic.NamedAgg._NT] -(pandas.core.groupby.generic.NamedAgg._NT -RTuple[builtins.str,TypeAlias[Union[builtins.str,CallableType[builtins.function]]]] - builtins.str" builtins.str ->TypeAlias[Union[builtins.str,CallableType[builtins.function]]] -3Union[builtins.str,CallableType[builtins.function]] - builtins.str" builtins.strK -CallableType[builtins.function]& -builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalar"type*> -iterable0 -typing.Iterable[Any] -Any"typing.Iterable* -new -Any * -len -Any 0:prS -column+pandas.core.groupby.generic.NamedAgg.column - builtins.str" builtins.strr -aggfunc,pandas.core.groupby.generic.NamedAgg.aggfunc ->TypeAlias[Union[builtins.str,CallableType[builtins.function]]] -3Union[builtins.str,CallableType[builtins.function]] - builtins.str" builtins.strK -CallableType[builtins.function]& -builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalarrS -column+pandas.core.groupby.generic.NamedAgg.column - builtins.str" builtins.strr -aggfunc,pandas.core.groupby.generic.NamedAgg.aggfunc ->TypeAlias[Union[builtins.str,CallableType[builtins.function]]] -3Union[builtins.str,CallableType[builtins.function]] - builtins.str" builtins.strK -CallableType[builtins.function]& -builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalarr -_fields,pandas.core.groupby.generic.NamedAgg._fields` - Tuple[builtins.str,builtins.str] - builtins.str" builtins.str - builtins.str" builtins.strr - _field_types1pandas.core.groupby.generic.NamedAgg._field_typesW +stylesheet +Union[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.ReadBuffer[builtins.str],pandas._typing.ReadBuffer[builtins.bytes],None] +8TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]] +-Union[builtins.str,os.PathLike[builtins.str]] + builtins.str" builtins.strF +os.PathLike[builtins.str] + builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathb +'pandas._typing.ReadBuffer[builtins.str] + builtins.str" builtins.str"pandas._typing.ReadBufferh +)pandas._typing.ReadBuffer[builtins.bytes] +builtins.bytes"builtins.bytes"pandas._typing.ReadBuffer +None * + compression +TypeAlias[Union[None,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],TypeAlias[builtins.dict[builtins.str,Any]]]] +Union[None,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],TypeAlias[builtins.dict[builtins.str,Any]]] +None7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +*TypeAlias[builtins.dict[builtins.str,Any]]W builtins.dict[builtins.str,Any] builtins.str" builtins.str -Any" builtins.dictr -_field_defaults4pandas.core.groupby.generic.NamedAgg._field_defaultsW +Any" builtins.dict"pandas._typing.CompressionDict"!pandas._typing.CompressionOptions * +storage_options +6TypeAlias[Union[builtins.dict[builtins.str,Any],None]] ++Union[builtins.dict[builtins.str,Any],None]W builtins.dict[builtins.str,Any] builtins.str" builtins.str -Any" builtins.dictrU -_source,pandas.core.groupby.generic.NamedAgg._source - builtins.str" builtins.strr -__annotations__4pandas.core.groupby.generic.NamedAgg.__annotations__W +Any" builtins.dict +None"pandas._typing.StorageOptions 0:typing.overloadX +to_xml"pandas.core.frame.DataFrame.to_xml" + builtins.str" builtins.str*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +path_or_buffer +None *+ +index + builtins.bool" builtins.bool *U + root_nameD +Union[builtins.str,None] + builtins.str" builtins.str +None *T +row_nameD +Union[builtins.str,None] + builtins.str" builtins.str +None *R +na_repD +Union[builtins.str,None] + builtins.str" builtins.str +None * + attr_cols +4Union[builtins.list[pandas._typing.HashableT1],None] +(builtins.list[pandas._typing.HashableT1]R +pandas._typing.HashableT1" +typing.Hashable"typing.Hashable"typing.Hashable" builtins.list +None * + elem_cols +4Union[builtins.list[pandas._typing.HashableT2],None] +(builtins.list[pandas._typing.HashableT2]R +pandas._typing.HashableT2" +typing.Hashable"typing.Hashable"typing.Hashable" builtins.list +None * + +namespaces +@Union[builtins.dict[Union[builtins.str,None],builtins.str],None] +4builtins.dict[Union[builtins.str,None],builtins.str]D +Union[builtins.str,None] + builtins.str" builtins.str +None + builtins.str" builtins.str" builtins.dict +None *R +prefixD +Union[builtins.str,None] + builtins.str" builtins.str +None *, +encoding + builtins.str" builtins.str *^ +xml_declarationG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None *[ + pretty_printG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None *R +parserD +Union[builtins.str,None] + builtins.str" builtins.str +None * + +stylesheet +Union[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.ReadBuffer[builtins.str],pandas._typing.ReadBuffer[builtins.bytes],None] +8TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]] +-Union[builtins.str,os.PathLike[builtins.str]] + builtins.str" builtins.strF +os.PathLike[builtins.str] + builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathb +'pandas._typing.ReadBuffer[builtins.str] + builtins.str" builtins.str"pandas._typing.ReadBufferh +)pandas._typing.ReadBuffer[builtins.bytes] +builtins.bytes"builtins.bytes"pandas._typing.ReadBuffer +None * + compression +TypeAlias[Union[None,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],TypeAlias[builtins.dict[builtins.str,Any]]]] +Union[None,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],TypeAlias[builtins.dict[builtins.str,Any]]] +None7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +*TypeAlias[builtins.dict[builtins.str,Any]]W builtins.dict[builtins.str,Any] builtins.str" builtins.str -Any" builtins.dict -CategoricalIndex-pandas.core.indexes.category.CategoricalIndex",pandas.core.indexes.extension.ExtensionIndex"#pandas.core.accessor.PandasDelegate*I -__new__5pandas.core.indexes.category.CategoricalIndex.__new__" -2pandas.core.indexes.category.CategoricalIndex.Self -@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"-pandas.core.indexes.category.CategoricalIndex"-pandas.core.indexes.category.CategoricalIndex(* -cls -8Type[pandas.core.indexes.category.CategoricalIndex.Self] -2pandas.core.indexes.category.CategoricalIndex.Self -@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" builtins.dict"pandas._typing.CompressionDict"!pandas._typing.CompressionOptions * +storage_options +6TypeAlias[Union[builtins.dict[builtins.str,Any],None]] ++Union[builtins.dict[builtins.str,Any],None]W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict +None"pandas._typing.StorageOptions 0:typing.overloadX2 + __getitem__'pandas.core.frame.DataFrame.__getitem__ + __getitem__'pandas.core.frame.DataFrame.__getitem__"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series*<: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],builtins.tuple[typing.Hashable]] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] builtins.str" builtins.str builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& + datetime.date" datetime.date& datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"-pandas.core.indexes.category.CategoricalIndex"-pandas.core.indexes.category.CategoricalIndex("type* -data -"typing.Iterable[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"typing.Iterable * - -categories -Any * -ordered -Any * -dtype -Any ** -copy +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.ScalarU +builtins.tuple[typing.Hashable]" +typing.Hashable"typing.Hashable"builtins.tuple0:typing.overloadX + __getitem__'pandas.core.frame.DataFrame.__getitem__": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*<: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +6Union[typing.Iterable[typing.Hashable],builtins.slice]W + typing.Iterable[typing.Hashable]" +typing.Hashable"typing.Hashable"typing.Iterable +builtins.slice"builtins.slice0:typing.overloadX + __getitem__'pandas.core.frame.DataFrame.__getitem__"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series*<: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*$" +typing.Hashable"typing.Hashable0:typing.overloadX2 +query!pandas.core.frame.DataFrame.query +query!pandas.core.frame.DataFrame.query" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*& +expr + builtins.str" builtins.str*G +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool* +kwargs +Any0:typing.overloadX +query!pandas.core.frame.DataFrame.query": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*& +expr + builtins.str" builtins.str*I +inplace: +Literal[builtins.bool]  builtins.bool" builtins.bool * -name -Any *S -equals4pandas.core.indexes.category.CategoricalIndex.equals* -self* -other* - inferred_type;pandas.core.indexes.category.CategoricalIndex.inferred_type" - builtins.str" builtins.str* -self -@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: +kwargs +Any0:typing.overloadX2 + select_dtypes)pandas.core.frame.DataFrame.select_dtypes + select_dtypes)pandas.core.frame.DataFrame.select_dtypes" +NoReturn +*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +include +TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= + builtins.str" builtins.str"type7 +Literal[builtins.str]  + builtins.str" builtins.strP +&pandas.core.arrays.string_.StringDtype"&pandas.core.arrays.string_.StringDtype7 +Literal[builtins.str]  + builtins.str" builtins.str4 +Type[numpy.str_] + +numpy.str_" +numpy.str_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.StrDtypeArg* +exclude +6Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],builtins.list[Unknown]]],None] +6TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],builtins.list[Unknown]]] +6Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],builtins.list[Unknown]] +5TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +5Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]] +4TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]] +4Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]] +TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]= Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"-pandas.core.indexes.category.CategoricalIndex0:builtins.property`*_ -values4pandas.core.indexes.category.CategoricalIndex.values* -self0:builtins.property`* - __contains__:pandas.core.indexes.category.CategoricalIndex.__contains__" - builtins.bool" builtins.bool* -@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: + builtins.bool" builtins.bool"type7 +Literal[builtins.str]  + builtins.str" builtins.strR +'pandas.core.arrays.boolean.BooleanDtype"'pandas.core.arrays.boolean.BooleanDtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Type[numpy.bool_] + numpy.bool_" numpy.bool_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.BooleanDtypeArg& +TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: +Type[builtins.int] + builtins.int" builtins.int"type7 +Literal[builtins.str]  + builtins.str" builtins.strL +$pandas.core.arrays.integer.Int8Dtype"$pandas.core.arrays.integer.Int8DtypeN +%pandas.core.arrays.integer.Int16Dtype"%pandas.core.arrays.integer.Int16DtypeN +%pandas.core.arrays.integer.Int32Dtype"%pandas.core.arrays.integer.Int32DtypeN +%pandas.core.arrays.integer.Int64Dtype"%pandas.core.arrays.integer.Int64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +)Type[numpy.signedinteger[TypeAlias[Any]]]v +#numpy.signedinteger[TypeAlias[Any]]: +TypeAlias[Any] +Any"numpy._typing._nbit._NBitByte"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IntDtypeArg$ +TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]N +%pandas.core.arrays.integer.UInt8Dtype"%pandas.core.arrays.integer.UInt8DtypeP +&pandas.core.arrays.integer.UInt16Dtype"&pandas.core.arrays.integer.UInt16DtypeP +&pandas.core.arrays.integer.UInt32Dtype"&pandas.core.arrays.integer.UInt32DtypeP +&pandas.core.arrays.integer.UInt64Dtype"&pandas.core.arrays.integer.UInt64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.UIntDtypeArg +TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"-pandas.core.indexes.category.CategoricalIndex*  -Any* - __array__7pandas.core.indexes.category.CategoricalIndex.__array__"9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray* -self -@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes + builtins.str" builtins.str"type7 +Literal[builtins.str]  + builtins.str" builtins.strP +&pandas.core.arrays.string_.StringDtype"&pandas.core.arrays.string_.StringDtype7 +Literal[builtins.str]  + builtins.str" builtins.str4 +Type[numpy.str_] + +numpy.str_" +numpy.str_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.StrDtypeArg +TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ +Type[builtins.bytes] +builtins.bytes"builtins.bytes"type7 +Literal[builtins.str]  + builtins.str" builtins.str: +Type[numpy.bytes_] + numpy.bytes_" numpy.bytes_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.BytesDtypeArg +TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ +Type[builtins.float] +builtins.float"builtins.float"type7 +Literal[builtins.str]  + builtins.str" builtins.strT +(pandas.core.arrays.floating.Float32Dtype"(pandas.core.arrays.floating.Float32DtypeT +(pandas.core.arrays.floating.Float64Dtype"(pandas.core.arrays.floating.Float64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.FloatDtypeArg +TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]F +Type[builtins.complex]$ +builtins.complex"builtins.complex"type7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ComplexDtypeArg$ +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimedeltaDtypeArg& +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimestampDtypeArg +RTypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]] +GUnion[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]X +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.CategoryDtypeArg +gTypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]] +\Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]C +Type[builtins.object]" +builtins.object"builtins.object"type7 +Literal[builtins.str]  + builtins.str" builtins.str= +Type[numpy.object_] + numpy.object_" numpy.object_"type7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ObjectDtypeArg +dTypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +YUnion[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]4 +Type[numpy.void] + +numpy.void" +numpy.void"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.VoidDtypeArg +STypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]] +HUnion[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]I +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtypeP +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype"pandas._typing.DtypeObj"pandas._typing.AstypeArg7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"(pandas.core.frame.DataFrame.AstypeArgExt) +builtins.list[Unknown]" builtins.list",pandas.core.frame.DataFrame.AstypeArgExtList +None 0:typing.overloadX + select_dtypes)pandas.core.frame.DataFrame.select_dtypes" +NoReturn +*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +include +6Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],builtins.list[Unknown]]],None] +6TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],builtins.list[Unknown]]] +6Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],builtins.list[Unknown]] +5TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +5Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]] +4TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]] +4Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]] +TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]= +Type[builtins.bool] + builtins.bool" builtins.bool"type7 +Literal[builtins.str]  + builtins.str" builtins.strR +'pandas.core.arrays.boolean.BooleanDtype"'pandas.core.arrays.boolean.BooleanDtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Type[numpy.bool_] + numpy.bool_" numpy.bool_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.BooleanDtypeArg& +TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: +Type[builtins.int] + builtins.int" builtins.int"type7 +Literal[builtins.str]  + builtins.str" builtins.strL +$pandas.core.arrays.integer.Int8Dtype"$pandas.core.arrays.integer.Int8DtypeN +%pandas.core.arrays.integer.Int16Dtype"%pandas.core.arrays.integer.Int16DtypeN +%pandas.core.arrays.integer.Int32Dtype"%pandas.core.arrays.integer.Int32DtypeN +%pandas.core.arrays.integer.Int64Dtype"%pandas.core.arrays.integer.Int64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +)Type[numpy.signedinteger[TypeAlias[Any]]]v +#numpy.signedinteger[TypeAlias[Any]]: +TypeAlias[Any] +Any"numpy._typing._nbit._NBitByte"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IntDtypeArg$ +TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]N +%pandas.core.arrays.integer.UInt8Dtype"%pandas.core.arrays.integer.UInt8DtypeP +&pandas.core.arrays.integer.UInt16Dtype"&pandas.core.arrays.integer.UInt16DtypeP +&pandas.core.arrays.integer.UInt32Dtype"&pandas.core.arrays.integer.UInt32DtypeP +&pandas.core.arrays.integer.UInt64Dtype"&pandas.core.arrays.integer.UInt64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.UIntDtypeArg +TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: +Type[builtins.str] + builtins.str" builtins.str"type7 +Literal[builtins.str]  + builtins.str" builtins.strP +&pandas.core.arrays.string_.StringDtype"&pandas.core.arrays.string_.StringDtype7 +Literal[builtins.str]  + builtins.str" builtins.str4 +Type[numpy.str_] + +numpy.str_" +numpy.str_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.StrDtypeArg +TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ +Type[builtins.bytes] +builtins.bytes"builtins.bytes"type7 +Literal[builtins.str]  + builtins.str" builtins.str: +Type[numpy.bytes_] + numpy.bytes_" numpy.bytes_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.BytesDtypeArg +TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ +Type[builtins.float] +builtins.float"builtins.float"type7 +Literal[builtins.str]  + builtins.str" builtins.strT +(pandas.core.arrays.floating.Float32Dtype"(pandas.core.arrays.floating.Float32DtypeT +(pandas.core.arrays.floating.Float64Dtype"(pandas.core.arrays.floating.Float64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.FloatDtypeArg +TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]F +Type[builtins.complex]$ +builtins.complex"builtins.complex"type7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ComplexDtypeArg$ +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimedeltaDtypeArg& +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimestampDtypeArg +RTypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]] +GUnion[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]X +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.CategoryDtypeArg +gTypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]] +\Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]C +Type[builtins.object]" +builtins.object"builtins.object"type7 +Literal[builtins.str]  + builtins.str" builtins.str= +Type[numpy.object_] + numpy.object_" numpy.object_"type7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ObjectDtypeArg +dTypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +YUnion[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]4 +Type[numpy.void] + +numpy.void" +numpy.void"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.VoidDtypeArg +STypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]] +HUnion[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]I +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtypeP +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype"pandas._typing.DtypeObj"pandas._typing.AstypeArg7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"(pandas.core.frame.DataFrame.AstypeArgExt) +builtins.list[Unknown]" builtins.list",pandas.core.frame.DataFrame.AstypeArgExtList +None* +exclude +TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: +Type[builtins.str] + builtins.str" builtins.str"type7 +Literal[builtins.str]  + builtins.str" builtins.strP +&pandas.core.arrays.string_.StringDtype"&pandas.core.arrays.string_.StringDtype7 +Literal[builtins.str]  + builtins.str" builtins.str4 +Type[numpy.str_] + +numpy.str_" +numpy.str_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.StrDtypeArg0:typing.overloadX + + select_dtypes)pandas.core.frame.DataFrame.select_dtypes" +NoReturn +*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +exclude +TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: +Type[builtins.str] + builtins.str" builtins.str"type7 +Literal[builtins.str]  + builtins.str" builtins.strP +&pandas.core.arrays.string_.StringDtype"&pandas.core.arrays.string_.StringDtype7 +Literal[builtins.str]  + builtins.str" builtins.str4 +Type[numpy.str_] + +numpy.str_" +numpy.str_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.StrDtypeArg0:typing.overloadX + select_dtypes)pandas.core.frame.DataFrame.select_dtypes" +NoReturn +*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*C +include6 +builtins.list[NoReturn] +NoReturn +" builtins.list*C +exclude6 +builtins.list[NoReturn] +NoReturn +" builtins.list0:typing.overloadX + select_dtypes)pandas.core.frame.DataFrame.select_dtypes": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*ŵ +include +6TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],builtins.list[Unknown]]] +6Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],builtins.list[Unknown]] +5TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +5Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]] +4TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]] +4Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]] +TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]= +Type[builtins.bool] + builtins.bool" builtins.bool"type7 +Literal[builtins.str]  + builtins.str" builtins.strR +'pandas.core.arrays.boolean.BooleanDtype"'pandas.core.arrays.boolean.BooleanDtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Type[numpy.bool_] + numpy.bool_" numpy.bool_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.BooleanDtypeArg& +TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: +Type[builtins.int] + builtins.int" builtins.int"type7 +Literal[builtins.str]  + builtins.str" builtins.strL +$pandas.core.arrays.integer.Int8Dtype"$pandas.core.arrays.integer.Int8DtypeN +%pandas.core.arrays.integer.Int16Dtype"%pandas.core.arrays.integer.Int16DtypeN +%pandas.core.arrays.integer.Int32Dtype"%pandas.core.arrays.integer.Int32DtypeN +%pandas.core.arrays.integer.Int64Dtype"%pandas.core.arrays.integer.Int64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +)Type[numpy.signedinteger[TypeAlias[Any]]]v +#numpy.signedinteger[TypeAlias[Any]]: +TypeAlias[Any] +Any"numpy._typing._nbit._NBitByte"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IntDtypeArg$ +TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]N +%pandas.core.arrays.integer.UInt8Dtype"%pandas.core.arrays.integer.UInt8DtypeP +&pandas.core.arrays.integer.UInt16Dtype"&pandas.core.arrays.integer.UInt16DtypeP +&pandas.core.arrays.integer.UInt32Dtype"&pandas.core.arrays.integer.UInt32DtypeP +&pandas.core.arrays.integer.UInt64Dtype"&pandas.core.arrays.integer.UInt64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.UIntDtypeArg +TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: +Type[builtins.str] + builtins.str" builtins.str"type7 +Literal[builtins.str]  + builtins.str" builtins.strP +&pandas.core.arrays.string_.StringDtype"&pandas.core.arrays.string_.StringDtype7 +Literal[builtins.str]  + builtins.str" builtins.str4 +Type[numpy.str_] + +numpy.str_" +numpy.str_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.StrDtypeArg +TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ +Type[builtins.bytes] +builtins.bytes"builtins.bytes"type7 +Literal[builtins.str]  + builtins.str" builtins.str: +Type[numpy.bytes_] + numpy.bytes_" numpy.bytes_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.BytesDtypeArg +TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ +Type[builtins.float] +builtins.float"builtins.float"type7 +Literal[builtins.str]  + builtins.str" builtins.strT +(pandas.core.arrays.floating.Float32Dtype"(pandas.core.arrays.floating.Float32DtypeT +(pandas.core.arrays.floating.Float64Dtype"(pandas.core.arrays.floating.Float64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.FloatDtypeArg +TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]F +Type[builtins.complex]$ +builtins.complex"builtins.complex"type7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ComplexDtypeArg$ +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimedeltaDtypeArg& +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimestampDtypeArg +RTypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]] +GUnion[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]X +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.CategoryDtypeArg +gTypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]] +\Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]C +Type[builtins.object]" +builtins.object"builtins.object"type7 +Literal[builtins.str]  + builtins.str" builtins.str= +Type[numpy.object_] + numpy.object_" numpy.object_"type7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ObjectDtypeArg +dTypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +YUnion[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]4 +Type[numpy.void] + +numpy.void" +numpy.void"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.VoidDtypeArg +STypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]] +HUnion[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]I +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtypeP +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype"pandas._typing.DtypeObj"pandas._typing.AstypeArg7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"(pandas.core.frame.DataFrame.AstypeArgExt) +builtins.list[Unknown]" builtins.list",pandas.core.frame.DataFrame.AstypeArgExtList* +exclude +6Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],builtins.list[Unknown]]],None] +6TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],builtins.list[Unknown]]] +6Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],builtins.list[Unknown]] +5TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +5Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]] +4TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]] +4Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]] +TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]= +Type[builtins.bool] + builtins.bool" builtins.bool"type7 +Literal[builtins.str]  + builtins.str" builtins.strR +'pandas.core.arrays.boolean.BooleanDtype"'pandas.core.arrays.boolean.BooleanDtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Type[numpy.bool_] + numpy.bool_" numpy.bool_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.BooleanDtypeArg& +TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: +Type[builtins.int] + builtins.int" builtins.int"type7 +Literal[builtins.str]  + builtins.str" builtins.strL +$pandas.core.arrays.integer.Int8Dtype"$pandas.core.arrays.integer.Int8DtypeN +%pandas.core.arrays.integer.Int16Dtype"%pandas.core.arrays.integer.Int16DtypeN +%pandas.core.arrays.integer.Int32Dtype"%pandas.core.arrays.integer.Int32DtypeN +%pandas.core.arrays.integer.Int64Dtype"%pandas.core.arrays.integer.Int64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +)Type[numpy.signedinteger[TypeAlias[Any]]]v +#numpy.signedinteger[TypeAlias[Any]]: +TypeAlias[Any] +Any"numpy._typing._nbit._NBitByte"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IntDtypeArg$ +TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]N +%pandas.core.arrays.integer.UInt8Dtype"%pandas.core.arrays.integer.UInt8DtypeP +&pandas.core.arrays.integer.UInt16Dtype"&pandas.core.arrays.integer.UInt16DtypeP +&pandas.core.arrays.integer.UInt32Dtype"&pandas.core.arrays.integer.UInt32DtypeP +&pandas.core.arrays.integer.UInt64Dtype"&pandas.core.arrays.integer.UInt64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.UIntDtypeArg +TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: +Type[builtins.str] + builtins.str" builtins.str"type7 +Literal[builtins.str]  + builtins.str" builtins.strP +&pandas.core.arrays.string_.StringDtype"&pandas.core.arrays.string_.StringDtype7 +Literal[builtins.str]  + builtins.str" builtins.str4 +Type[numpy.str_] + +numpy.str_" +numpy.str_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.StrDtypeArg +TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ +Type[builtins.bytes] +builtins.bytes"builtins.bytes"type7 +Literal[builtins.str]  + builtins.str" builtins.str: +Type[numpy.bytes_] + numpy.bytes_" numpy.bytes_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.BytesDtypeArg +TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ +Type[builtins.float] +builtins.float"builtins.float"type7 +Literal[builtins.str]  + builtins.str" builtins.strT +(pandas.core.arrays.floating.Float32Dtype"(pandas.core.arrays.floating.Float32DtypeT +(pandas.core.arrays.floating.Float64Dtype"(pandas.core.arrays.floating.Float64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.FloatDtypeArg +TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]F +Type[builtins.complex]$ +builtins.complex"builtins.complex"type7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ComplexDtypeArg$ +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimedeltaDtypeArg& +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimestampDtypeArg +RTypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]] +GUnion[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]X +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.CategoryDtypeArg +gTypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]] +\Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]C +Type[builtins.object]" +builtins.object"builtins.object"type7 +Literal[builtins.str]  + builtins.str" builtins.str= +Type[numpy.object_] + numpy.object_" numpy.object_"type7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ObjectDtypeArg +dTypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +YUnion[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]4 +Type[numpy.void] + +numpy.void" +numpy.void"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.VoidDtypeArg +STypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]] +HUnion[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]I +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtypeP +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype"pandas._typing.DtypeObj"pandas._typing.AstypeArg7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"(pandas.core.frame.DataFrame.AstypeArgExt) +builtins.list[Unknown]" builtins.list",pandas.core.frame.DataFrame.AstypeArgExtList +None 0:typing.overloadX + select_dtypes)pandas.core.frame.DataFrame.select_dtypes": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +include +6Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],builtins.list[Unknown]]],None] +6TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],builtins.list[Unknown]]] +6Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],builtins.list[Unknown]] +5TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +5Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]] +4TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]] +4Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]] +TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]= +Type[builtins.bool] + builtins.bool" builtins.bool"type7 +Literal[builtins.str]  + builtins.str" builtins.strR +'pandas.core.arrays.boolean.BooleanDtype"'pandas.core.arrays.boolean.BooleanDtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Type[numpy.bool_] + numpy.bool_" numpy.bool_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.BooleanDtypeArg& +TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: +Type[builtins.int] + builtins.int" builtins.int"type7 +Literal[builtins.str]  + builtins.str" builtins.strL +$pandas.core.arrays.integer.Int8Dtype"$pandas.core.arrays.integer.Int8DtypeN +%pandas.core.arrays.integer.Int16Dtype"%pandas.core.arrays.integer.Int16DtypeN +%pandas.core.arrays.integer.Int32Dtype"%pandas.core.arrays.integer.Int32DtypeN +%pandas.core.arrays.integer.Int64Dtype"%pandas.core.arrays.integer.Int64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +)Type[numpy.signedinteger[TypeAlias[Any]]]v +#numpy.signedinteger[TypeAlias[Any]]: +TypeAlias[Any] +Any"numpy._typing._nbit._NBitByte"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IntDtypeArg$ +TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]N +%pandas.core.arrays.integer.UInt8Dtype"%pandas.core.arrays.integer.UInt8DtypeP +&pandas.core.arrays.integer.UInt16Dtype"&pandas.core.arrays.integer.UInt16DtypeP +&pandas.core.arrays.integer.UInt32Dtype"&pandas.core.arrays.integer.UInt32DtypeP +&pandas.core.arrays.integer.UInt64Dtype"&pandas.core.arrays.integer.UInt64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.UIntDtypeArg +TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: +Type[builtins.str] + builtins.str" builtins.str"type7 +Literal[builtins.str]  + builtins.str" builtins.strP +&pandas.core.arrays.string_.StringDtype"&pandas.core.arrays.string_.StringDtype7 +Literal[builtins.str]  + builtins.str" builtins.str4 +Type[numpy.str_] + +numpy.str_" +numpy.str_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.StrDtypeArg +TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ +Type[builtins.bytes] +builtins.bytes"builtins.bytes"type7 +Literal[builtins.str]  + builtins.str" builtins.str: +Type[numpy.bytes_] + numpy.bytes_" numpy.bytes_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.BytesDtypeArg +TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ +Type[builtins.float] +builtins.float"builtins.float"type7 +Literal[builtins.str]  + builtins.str" builtins.strT +(pandas.core.arrays.floating.Float32Dtype"(pandas.core.arrays.floating.Float32DtypeT +(pandas.core.arrays.floating.Float64Dtype"(pandas.core.arrays.floating.Float64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.FloatDtypeArg +TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]F +Type[builtins.complex]$ +builtins.complex"builtins.complex"type7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ComplexDtypeArg$ +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimedeltaDtypeArg& +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimestampDtypeArg +RTypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]] +GUnion[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]X +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.CategoryDtypeArg +gTypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]] +\Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]C +Type[builtins.object]" +builtins.object"builtins.object"type7 +Literal[builtins.str]  + builtins.str" builtins.str= +Type[numpy.object_] + numpy.object_" numpy.object_"type7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ObjectDtypeArg +dTypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +YUnion[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]4 +Type[numpy.void] + +numpy.void" +numpy.void"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.VoidDtypeArg +STypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]] +HUnion[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]I +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtypeP +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype"pandas._typing.DtypeObj"pandas._typing.AstypeArg7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"(pandas.core.frame.DataFrame.AstypeArgExt) +builtins.list[Unknown]" builtins.list",pandas.core.frame.DataFrame.AstypeArgExtList +None*ŵ +exclude +6TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],builtins.list[Unknown]]] +6Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],builtins.list[Unknown]] +5TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +5Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]] +4TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]] +4Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]] +TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]= +Type[builtins.bool] + builtins.bool" builtins.bool"type7 +Literal[builtins.str]  + builtins.str" builtins.strR +'pandas.core.arrays.boolean.BooleanDtype"'pandas.core.arrays.boolean.BooleanDtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Type[numpy.bool_] + numpy.bool_" numpy.bool_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.BooleanDtypeArg& +TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: +Type[builtins.int] + builtins.int" builtins.int"type7 +Literal[builtins.str]  + builtins.str" builtins.strL +$pandas.core.arrays.integer.Int8Dtype"$pandas.core.arrays.integer.Int8DtypeN +%pandas.core.arrays.integer.Int16Dtype"%pandas.core.arrays.integer.Int16DtypeN +%pandas.core.arrays.integer.Int32Dtype"%pandas.core.arrays.integer.Int32DtypeN +%pandas.core.arrays.integer.Int64Dtype"%pandas.core.arrays.integer.Int64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +)Type[numpy.signedinteger[TypeAlias[Any]]]v +#numpy.signedinteger[TypeAlias[Any]]: +TypeAlias[Any] +Any"numpy._typing._nbit._NBitByte"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IntDtypeArg$ +TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]N +%pandas.core.arrays.integer.UInt8Dtype"%pandas.core.arrays.integer.UInt8DtypeP +&pandas.core.arrays.integer.UInt16Dtype"&pandas.core.arrays.integer.UInt16DtypeP +&pandas.core.arrays.integer.UInt32Dtype"&pandas.core.arrays.integer.UInt32DtypeP +&pandas.core.arrays.integer.UInt64Dtype"&pandas.core.arrays.integer.UInt64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.UIntDtypeArg +TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: +Type[builtins.str] + builtins.str" builtins.str"type7 +Literal[builtins.str]  + builtins.str" builtins.strP +&pandas.core.arrays.string_.StringDtype"&pandas.core.arrays.string_.StringDtype7 +Literal[builtins.str]  + builtins.str" builtins.str4 +Type[numpy.str_] + +numpy.str_" +numpy.str_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.StrDtypeArg +TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ +Type[builtins.bytes] +builtins.bytes"builtins.bytes"type7 +Literal[builtins.str]  + builtins.str" builtins.str: +Type[numpy.bytes_] + numpy.bytes_" numpy.bytes_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.BytesDtypeArg +TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ +Type[builtins.float] +builtins.float"builtins.float"type7 +Literal[builtins.str]  + builtins.str" builtins.strT +(pandas.core.arrays.floating.Float32Dtype"(pandas.core.arrays.floating.Float32DtypeT +(pandas.core.arrays.floating.Float64Dtype"(pandas.core.arrays.floating.Float64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.FloatDtypeArg +TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]F +Type[builtins.complex]$ +builtins.complex"builtins.complex"type7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ComplexDtypeArg$ +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimedeltaDtypeArg& +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimestampDtypeArg +RTypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]] +GUnion[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]X +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.CategoryDtypeArg +gTypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]] +\Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]C +Type[builtins.object]" +builtins.object"builtins.object"type7 +Literal[builtins.str]  + builtins.str" builtins.str= +Type[numpy.object_] + numpy.object_" numpy.object_"type7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ObjectDtypeArg +dTypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +YUnion[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]4 +Type[numpy.void] + +numpy.void" +numpy.void"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.VoidDtypeArg +STypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]] +HUnion[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]I +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtypeP +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype"pandas._typing.DtypeObj"pandas._typing.AstypeArg7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"(pandas.core.frame.DataFrame.AstypeArgExt) +builtins.list[Unknown]" builtins.list",pandas.core.frame.DataFrame.AstypeArgExtList0:typing.overloadX + select_dtypes)pandas.core.frame.DataFrame.select_dtypes": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*ŵ +exclude +6TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],builtins.list[Unknown]]] +6Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],builtins.list[Unknown]] +5TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +5Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]] +4TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]] +4Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]] +TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]= +Type[builtins.bool] + builtins.bool" builtins.bool"type7 +Literal[builtins.str]  + builtins.str" builtins.strR +'pandas.core.arrays.boolean.BooleanDtype"'pandas.core.arrays.boolean.BooleanDtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Type[numpy.bool_] + numpy.bool_" numpy.bool_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.BooleanDtypeArg& +TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: +Type[builtins.int] + builtins.int" builtins.int"type7 +Literal[builtins.str]  + builtins.str" builtins.strL +$pandas.core.arrays.integer.Int8Dtype"$pandas.core.arrays.integer.Int8DtypeN +%pandas.core.arrays.integer.Int16Dtype"%pandas.core.arrays.integer.Int16DtypeN +%pandas.core.arrays.integer.Int32Dtype"%pandas.core.arrays.integer.Int32DtypeN +%pandas.core.arrays.integer.Int64Dtype"%pandas.core.arrays.integer.Int64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +)Type[numpy.signedinteger[TypeAlias[Any]]]v +#numpy.signedinteger[TypeAlias[Any]]: +TypeAlias[Any] +Any"numpy._typing._nbit._NBitByte"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IntDtypeArg$ +TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]N +%pandas.core.arrays.integer.UInt8Dtype"%pandas.core.arrays.integer.UInt8DtypeP +&pandas.core.arrays.integer.UInt16Dtype"&pandas.core.arrays.integer.UInt16DtypeP +&pandas.core.arrays.integer.UInt32Dtype"&pandas.core.arrays.integer.UInt32DtypeP +&pandas.core.arrays.integer.UInt64Dtype"&pandas.core.arrays.integer.UInt64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.UIntDtypeArg +TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: +Type[builtins.str] + builtins.str" builtins.str"type7 +Literal[builtins.str]  + builtins.str" builtins.strP +&pandas.core.arrays.string_.StringDtype"&pandas.core.arrays.string_.StringDtype7 +Literal[builtins.str]  + builtins.str" builtins.str4 +Type[numpy.str_] + +numpy.str_" +numpy.str_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.StrDtypeArg +TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ +Type[builtins.bytes] +builtins.bytes"builtins.bytes"type7 +Literal[builtins.str]  + builtins.str" builtins.str: +Type[numpy.bytes_] + numpy.bytes_" numpy.bytes_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.BytesDtypeArg +TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ +Type[builtins.float] +builtins.float"builtins.float"type7 +Literal[builtins.str]  + builtins.str" builtins.strT +(pandas.core.arrays.floating.Float32Dtype"(pandas.core.arrays.floating.Float32DtypeT +(pandas.core.arrays.floating.Float64Dtype"(pandas.core.arrays.floating.Float64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.FloatDtypeArg +TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]F +Type[builtins.complex]$ +builtins.complex"builtins.complex"type7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ComplexDtypeArg$ +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimedeltaDtypeArg& +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimestampDtypeArg +RTypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]] +GUnion[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]X +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.CategoryDtypeArg +gTypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]] +\Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]C +Type[builtins.object]" +builtins.object"builtins.object"type7 +Literal[builtins.str]  + builtins.str" builtins.str= +Type[numpy.object_] + numpy.object_" numpy.object_"type7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ObjectDtypeArg +dTypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +YUnion[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]4 +Type[numpy.void] + +numpy.void" +numpy.void"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.VoidDtypeArg +STypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]] +HUnion[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]I +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtypeP +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype"pandas._typing.DtypeObj"pandas._typing.AstypeArg7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"(pandas.core.frame.DataFrame.AstypeArgExt) +builtins.list[Unknown]" builtins.list",pandas.core.frame.DataFrame.AstypeArgExtList0:typing.overloadX2^ +rename"pandas.core.frame.DataFrame.rename +rename"pandas.core.frame.DataFrame.rename" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +mapper +xUnion[TypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]],None] +lTypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]] +aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]] +:typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]] +Any +&TypeAlias[Union[typing.Hashable,None]]M +Union[typing.Hashable,None]" +typing.Hashable"typing.Hashable +None"pandas._typing.Label"typing.MappingK +CallableType[builtins.function]& +builtins.function"builtins.function"pandas._typing.Renamer +None * +index +xUnion[TypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]],None] +lTypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]] +aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]] +:typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]] +Any +&TypeAlias[Union[typing.Hashable,None]]M +Union[typing.Hashable,None]" +typing.Hashable"typing.Hashable +None"pandas._typing.Label"typing.MappingK +CallableType[builtins.function]& +builtins.function"builtins.function"pandas._typing.Renamer +None * +columns +xUnion[TypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]],None] +lTypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]] +aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]] +:typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]] +Any +&TypeAlias[Union[typing.Hashable,None]]M +Union[typing.Hashable,None]" +typing.Hashable"typing.Hashable +None"pandas._typing.Label"typing.MappingK +CallableType[builtins.function]& +builtins.function"builtins.function"pandas._typing.Renamer +None * +axis +Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis +None ** +copy + builtins.bool" builtins.bool *G +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX +rename"pandas.core.frame.DataFrame.rename": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +mapper +xUnion[TypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]],None] +lTypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]] +aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]] +:typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]] +Any +&TypeAlias[Union[typing.Hashable,None]]M +Union[typing.Hashable,None]" +typing.Hashable"typing.Hashable +None"pandas._typing.Label"typing.MappingK +CallableType[builtins.function]& +builtins.function"builtins.function"pandas._typing.Renamer +None * +index +xUnion[TypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]],None] +lTypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]] +aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]] +:typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]] +Any +&TypeAlias[Union[typing.Hashable,None]]M +Union[typing.Hashable,None]" +typing.Hashable"typing.Hashable +None"pandas._typing.Label"typing.MappingK +CallableType[builtins.function]& +builtins.function"builtins.function"pandas._typing.Renamer +None * +columns +xUnion[TypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]],None] +lTypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]] +aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]] +:typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]] +Any +&TypeAlias[Union[typing.Hashable,None]]M +Union[typing.Hashable,None]" +typing.Hashable"typing.Hashable +None"pandas._typing.Label"typing.MappingK +CallableType[builtins.function]& +builtins.function"builtins.function"pandas._typing.Renamer +None * +axis +Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis +None ** +copy + builtins.bool" builtins.bool *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool * +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX +rename"pandas.core.frame.DataFrame.rename"q +'Union[pandas.core.frame.DataFrame,None]: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +mapper +xUnion[TypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]],None] +lTypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]] +aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]] +:typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]] +Any +&TypeAlias[Union[typing.Hashable,None]]M +Union[typing.Hashable,None]" +typing.Hashable"typing.Hashable +None"pandas._typing.Label"typing.MappingK +CallableType[builtins.function]& +builtins.function"builtins.function"pandas._typing.Renamer +None * +index +xUnion[TypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]],None] +lTypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]] +aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]] +:typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]] +Any +&TypeAlias[Union[typing.Hashable,None]]M +Union[typing.Hashable,None]" +typing.Hashable"typing.Hashable +None"pandas._typing.Label"typing.MappingK +CallableType[builtins.function]& +builtins.function"builtins.function"pandas._typing.Renamer +None * +columns +xUnion[TypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]],None] +lTypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]] +aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]] +:typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]] +Any +&TypeAlias[Union[typing.Hashable,None]]M +Union[typing.Hashable,None]" +typing.Hashable"typing.Hashable +None"pandas._typing.Label"typing.MappingK +CallableType[builtins.function]& +builtins.function"builtins.function"pandas._typing.Renamer +None * +axis +Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis +None ** +copy + builtins.bool" builtins.bool *- +inplace + builtins.bool" builtins.bool * +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX2[ +fillna"pandas.core.frame.DataFrame.fillna +fillna"pandas.core.frame.DataFrame.fillna" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +value +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],pandas.core.series.Series[Any],pandas.core.frame.DataFrame,None] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.floatT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar: +pandas._libs.missing.NAType"pandas._libs.missing.NAType9 +builtins.dict[Any,Any] +Any +Any" builtins.dictD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame +None * +axis +Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis +None *) +limit + builtins.int" builtins.int *{ +downcastk +"Union[builtins.dict[Any,Any],None]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +None *G +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool0:typing.overloadX +fillna"pandas.core.frame.DataFrame.fillna": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +value +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],pandas.core.series.Series[Any],pandas.core.frame.DataFrame,None] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.floatT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar: +pandas._libs.missing.NAType"pandas._libs.missing.NAType9 +builtins.dict[Any,Any] +Any +Any" builtins.dictD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame +None * +axis +Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis +None *) +limit + builtins.int" builtins.int *{ +downcastk +"Union[builtins.dict[Any,Any],None]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +None *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool 0:typing.overloadX +fillna"pandas.core.frame.DataFrame.fillna"q +'Union[pandas.core.frame.DataFrame,None]: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +value +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],pandas.core.series.Series[Any],pandas.core.frame.DataFrame,None] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.floatT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar: +pandas._libs.missing.NAType"pandas._libs.missing.NAType9 +builtins.dict[Any,Any] +Any +Any" builtins.dictD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame +None * +axis +Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis +None *V +inplaceG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None *) +limit + builtins.int" builtins.int *{ +downcastk +"Union[builtins.dict[Any,Any],None]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +None 0:typing.overloadX2J +replace#pandas.core.frame.DataFrame.replace +replace#pandas.core.frame.DataFrame.replace" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* + +to_replace +Any * +value +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,typing.Sequence[Any],typing.Mapping[Any,Any],re.Pattern[Any],None] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.floatT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar: +pandas._libs.missing.NAType"pandas._libs.missing.NAType0 +typing.Sequence[Any] +Any"typing.Sequence; +typing.Mapping[Any,Any] +Any +Any"typing.Mapping& +re.Pattern[Any] +Any" +re.Pattern +None *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None * +regex +Any * +method +STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ReplaceMethod *G +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool0:typing.overloadX +replace#pandas.core.frame.DataFrame.replace": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* + +to_replace +Any * +value +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,typing.Sequence[Any],typing.Mapping[Any,Any],re.Pattern[Any],None] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.floatT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar: +pandas._libs.missing.NAType"pandas._libs.missing.NAType0 +typing.Sequence[Any] +Any"typing.Sequence; +typing.Mapping[Any,Any] +Any +Any"typing.Mapping& +re.Pattern[Any] +Any" +re.Pattern +None *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None * +regex +Any * +method +STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ReplaceMethod 0:typing.overloadX +replace#pandas.core.frame.DataFrame.replace"q +'Union[pandas.core.frame.DataFrame,None]: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* + +to_replace +Any * +value +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,typing.Sequence[Any],typing.Mapping[Any,Any],re.Pattern[Any],None] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.floatT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar: +pandas._libs.missing.NAType"pandas._libs.missing.NAType0 +typing.Sequence[Any] +Any"typing.Sequence; +typing.Mapping[Any,Any] +Any +Any"typing.Mapping& +re.Pattern[Any] +Any" +re.Pattern +None *V +inplaceG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None * +regex +Any * +method +STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ReplaceMethod 0:typing.overloadX2 + set_index%pandas.core.frame.DataFrame.set_index + set_index%pandas.core.frame.DataFrame.set_index" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +keys +Union[TypeAlias[Union[typing.Hashable,None]],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],typing.Iterator[pandas._typing.HashableT],builtins.list[pandas._typing.HashableT]] +&TypeAlias[Union[typing.Hashable,None]]M +Union[typing.Hashable,None]" +typing.Hashable"typing.Hashable +None"pandas._typing.LabelD +pandas.core.series.Series[Any] +Any"pandas.core.series.SeriesN +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray +)typing.Iterator[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable"typing.Iterator +'builtins.list[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable" builtins.list** +drop + builtins.bool" builtins.bool *, +append + builtins.bool" builtins.bool *6 +verify_integrity + builtins.bool" builtins.bool *G +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool0:typing.overloadX + + set_index%pandas.core.frame.DataFrame.set_index": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +keys +Union[TypeAlias[Union[typing.Hashable,None]],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],typing.Iterator[pandas._typing.HashableT],builtins.list[pandas._typing.HashableT]] +&TypeAlias[Union[typing.Hashable,None]]M +Union[typing.Hashable,None]" +typing.Hashable"typing.Hashable +None"pandas._typing.LabelD +pandas.core.series.Series[Any] +Any"pandas.core.series.SeriesN +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray +)typing.Iterator[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable"typing.Iterator +'builtins.list[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable" builtins.list** +drop + builtins.bool" builtins.bool *, +append + builtins.bool" builtins.bool *6 +verify_integrity + builtins.bool" builtins.bool *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool 0:typing.overloadX2 + reset_index'pandas.core.frame.DataFrame.reset_index + reset_index'pandas.core.frame.DataFrame.reset_index" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +level +NUnion[TypeAlias[Union[typing.Hashable,builtins.int]],typing.Sequence[Unknown]] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level- +typing.Sequence[Unknown]"typing.Sequence ** +drop + builtins.bool" builtins.bool *q + col_level` + Union[builtins.int,builtins.str] + builtins.int" builtins.int + builtins.str" builtins.str *2 +col_fill" +typing.Hashable"typing.Hashable *G +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool*6 +allow_duplicates + builtins.bool" builtins.bool * +names +>Union[typing.Hashable,builtins.list[pandas._typing.HashableT]]" +typing.Hashable"typing.Hashable +'builtins.list[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable" builtins.list 0:typing.overloadX + reset_index'pandas.core.frame.DataFrame.reset_index": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +level +NUnion[TypeAlias[Union[typing.Hashable,builtins.int]],typing.Sequence[Unknown]] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level- +typing.Sequence[Unknown]"typing.Sequence *q + col_level` + Union[builtins.int,builtins.str] + builtins.int" builtins.int + builtins.str" builtins.str *2 +col_fill" +typing.Hashable"typing.Hashable ** +drop + builtins.bool" builtins.bool *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool *6 +allow_duplicates + builtins.bool" builtins.bool * +names +>Union[typing.Hashable,builtins.list[pandas._typing.HashableT]]" +typing.Hashable"typing.Hashable +'builtins.list[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable" builtins.list 0:typing.overloadX + reset_index'pandas.core.frame.DataFrame.reset_index"q +'Union[pandas.core.frame.DataFrame,None]: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +level +NUnion[TypeAlias[Union[typing.Hashable,builtins.int]],typing.Sequence[Unknown]] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level- +typing.Sequence[Unknown]"typing.Sequence ** +drop + builtins.bool" builtins.bool *V +inplaceG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None *q + col_level` + Union[builtins.int,builtins.str] + builtins.int" builtins.int + builtins.str" builtins.str *2 +col_fill" +typing.Hashable"typing.Hashable *6 +allow_duplicates + builtins.bool" builtins.bool * +names +>Union[typing.Hashable,builtins.list[pandas._typing.HashableT]]" +typing.Hashable"typing.Hashable +'builtins.list[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable" builtins.list 0:typing.overloadX2` +dropna"pandas.core.frame.DataFrame.dropna +dropna"pandas.core.frame.DataFrame.dropna" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * +how +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str *R +threshD +Union[builtins.int,None] + builtins.int" builtins.int +None * +subset +Union[TypeAlias[Union[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],None] +TypeAlias[Union[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]] +uUnion[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]0 +typing.Sequence[Any] +Any"typing.Sequence9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarrayD +pandas.core.series.Series[Any] +Any"pandas.core.series.SeriesN +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index"pandas._typing.ListLikeU +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.floatT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar +None *G +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool0:typing.overloadX +dropna"pandas.core.frame.DataFrame.dropna": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * +how +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str *R +threshD +Union[builtins.int,None] + builtins.int" builtins.int +None * +subset +Union[TypeAlias[Union[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],None] +TypeAlias[Union[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]] +uUnion[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]0 +typing.Sequence[Any] +Any"typing.Sequence9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarrayD +pandas.core.series.Series[Any] +Any"pandas.core.series.SeriesN +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index"pandas._typing.ListLikeU +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.floatT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar +None *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool 0:typing.overloadX +dropna"pandas.core.frame.DataFrame.dropna"q +'Union[pandas.core.frame.DataFrame,None]: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * +how +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str *R +threshD +Union[builtins.int,None] + builtins.int" builtins.int +None * +subset +Union[TypeAlias[Union[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],None] +TypeAlias[Union[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]] +uUnion[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]0 +typing.Sequence[Any] +Any"typing.Sequence9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarrayD +pandas.core.series.Series[Any] +Any"pandas.core.series.SeriesN +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index"pandas._typing.ListLikeU +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.floatT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar +None *V +inplaceG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None 0:typing.overloadX2: + sort_values'pandas.core.frame.DataFrame.sort_values + sort_values'pandas.core.frame.DataFrame.sort_values" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +by +1Union[builtins.str,typing.Sequence[builtins.str]] + builtins.str" builtins.strN +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.Sequence* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * + ascending +3Union[builtins.bool,typing.Sequence[builtins.bool]] + builtins.bool" builtins.boolQ +typing.Sequence[builtins.bool] + builtins.bool" builtins.bool"typing.Sequence * +kind +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.SortKind * + na_position +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.NaPosition *2 + ignore_index + builtins.bool" builtins.bool *G +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool* +key ++Union[CallableType[builtins.function],None]K +CallableType[builtins.function]& +builtins.function"builtins.function +None 0:typing.overloadX + sort_values'pandas.core.frame.DataFrame.sort_values": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +by +1Union[builtins.str,typing.Sequence[builtins.str]] + builtins.str" builtins.strN +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.Sequence* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * + ascending +3Union[builtins.bool,typing.Sequence[builtins.bool]] + builtins.bool" builtins.boolQ +typing.Sequence[builtins.bool] + builtins.bool" builtins.bool"typing.Sequence * +kind +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.SortKind * + na_position +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.NaPosition *2 + ignore_index + builtins.bool" builtins.bool *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool * +key ++Union[CallableType[builtins.function],None]K +CallableType[builtins.function]& +builtins.function"builtins.function +None 0:typing.overloadX + sort_values'pandas.core.frame.DataFrame.sort_values"q +'Union[pandas.core.frame.DataFrame,None]: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +by +1Union[builtins.str,typing.Sequence[builtins.str]] + builtins.str" builtins.strN +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.Sequence* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * + ascending +3Union[builtins.bool,typing.Sequence[builtins.bool]] + builtins.bool" builtins.boolQ +typing.Sequence[builtins.bool] + builtins.bool" builtins.bool"typing.Sequence *V +inplaceG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None * +kind +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.SortKind * + na_position +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.NaPosition *2 + ignore_index + builtins.bool" builtins.bool * +key ++Union[CallableType[builtins.function],None]K +CallableType[builtins.function]& +builtins.function"builtins.function +None 0:typing.overloadX2A + +sort_index&pandas.core.frame.DataFrame.sort_index + +sort_index&pandas.core.frame.DataFrame.sort_index" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None * + ascending +3Union[builtins.bool,typing.Sequence[builtins.bool]] + builtins.bool" builtins.boolQ +typing.Sequence[builtins.bool] + builtins.bool" builtins.bool"typing.Sequence * +kind +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.SortKind * + na_position +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.NaPosition *4 +sort_remaining + builtins.bool" builtins.bool *2 + ignore_index + builtins.bool" builtins.bool *G +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool* +key ++Union[CallableType[builtins.function],None]K +CallableType[builtins.function]& +builtins.function"builtins.function +None 0:typing.overloadX + +sort_index&pandas.core.frame.DataFrame.sort_index": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * +level +rUnion[TypeAlias[Union[typing.Hashable,builtins.int]],builtins.list[builtins.int],builtins.list[builtins.str],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.LevelJ +builtins.list[builtins.int] + builtins.int" builtins.int" builtins.listJ +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list +None * + ascending +3Union[builtins.bool,typing.Sequence[builtins.bool]] + builtins.bool" builtins.boolQ +typing.Sequence[builtins.bool] + builtins.bool" builtins.bool"typing.Sequence * +kind +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.SortKind * + na_position +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.NaPosition *4 +sort_remaining + builtins.bool" builtins.bool *2 + ignore_index + builtins.bool" builtins.bool *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool * +key ++Union[CallableType[builtins.function],None]K +CallableType[builtins.function]& +builtins.function"builtins.function +None 0:typing.overloadX + +sort_index&pandas.core.frame.DataFrame.sort_index"q +'Union[pandas.core.frame.DataFrame,None]: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * +level +rUnion[TypeAlias[Union[typing.Hashable,builtins.int]],builtins.list[builtins.int],builtins.list[builtins.str],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.LevelJ +builtins.list[builtins.int] + builtins.int" builtins.int" builtins.listJ +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list +None * + ascending +3Union[builtins.bool,typing.Sequence[builtins.bool]] + builtins.bool" builtins.boolQ +typing.Sequence[builtins.bool] + builtins.bool" builtins.bool"typing.Sequence *V +inplaceG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None * +kind +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.SortKind * + na_position +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.NaPosition *4 +sort_remaining + builtins.bool" builtins.bool *2 + ignore_index + builtins.bool" builtins.bool * +key ++Union[CallableType[builtins.function],None]K +CallableType[builtins.function]& +builtins.function"builtins.function +None 0:typing.overloadX2 + + value_counts(pandas.core.frame.DataFrame.value_counts + value_counts(pandas.core.frame.DataFrame.value_counts"b +'pandas.core.series.Series[builtins.int] + builtins.int" builtins.int"pandas.core.series.Series*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +subset +,Union[typing.Sequence[typing.Hashable],None]W + typing.Sequence[typing.Hashable]" +typing.Hashable"typing.Hashable"typing.Sequence +None *K + normalize: +Literal[builtins.bool]  + builtins.bool" builtins.bool ** +sort + builtins.bool" builtins.bool */ + ascending + builtins.bool" builtins.bool *, +dropna + builtins.bool" builtins.bool 0:typing.overloadX + value_counts(pandas.core.frame.DataFrame.value_counts"h +)pandas.core.series.Series[builtins.float] +builtins.float"builtins.float"pandas.core.series.Series*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*I + normalize: +Literal[builtins.bool]  + builtins.bool" builtins.bool* +subset +,Union[typing.Sequence[typing.Hashable],None]W + typing.Sequence[typing.Hashable]" +typing.Hashable"typing.Hashable"typing.Sequence +None ** +sort + builtins.bool" builtins.bool */ + ascending + builtins.bool" builtins.bool *, +dropna + builtins.bool" builtins.bool 0:typing.overloadX2 +groupby#pandas.core.frame.DataFrame.groupby* +groupby#pandas.core.frame.DataFrame.groupby" +pandas.core.groupby.generic.DataFrameGroupBy[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]]] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.floatT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar",pandas.core.groupby.generic.DataFrameGroupBy*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +by +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.floatT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar* +axis +tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Literal[pandas._libs.lib._NoDefault]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault * +level +NUnion[TypeAlias[Union[typing.Hashable,typing.Sequence[typing.Hashable]]],None] +BTypeAlias[Union[typing.Hashable,typing.Sequence[typing.Hashable]]] +7Union[typing.Hashable,typing.Sequence[typing.Hashable]]" +typing.Hashable"typing.HashableW + typing.Sequence[typing.Hashable]" +typing.Hashable"typing.Hashable"typing.Sequence"pandas._typing.IndexLabel +None *. +as_index + builtins.bool" builtins.bool ** +sort + builtins.bool" builtins.bool *0 + +group_keys + builtins.bool" builtins.bool * +observed +DUnion[builtins.bool,TypeAlias[Literal[pandas._libs.lib._NoDefault]]] + builtins.bool" builtins.bool +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault *, +dropna + builtins.bool" builtins.bool 0:typing.overloadX +groupby#pandas.core.frame.DataFrame.groupby" +Vpandas.core.groupby.generic.DataFrameGroupBy[pandas._libs.tslibs.timestamps.Timestamp]T +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp",pandas.core.groupby.generic.DataFrameGroupBy*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*b +byZ ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* +axis +tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Literal[pandas._libs.lib._NoDefault]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault * +level +NUnion[TypeAlias[Union[typing.Hashable,typing.Sequence[typing.Hashable]]],None] +BTypeAlias[Union[typing.Hashable,typing.Sequence[typing.Hashable]]] +7Union[typing.Hashable,typing.Sequence[typing.Hashable]]" +typing.Hashable"typing.HashableW + typing.Sequence[typing.Hashable]" +typing.Hashable"typing.Hashable"typing.Sequence"pandas._typing.IndexLabel +None *. +as_index + builtins.bool" builtins.bool ** +sort + builtins.bool" builtins.bool *0 + +group_keys + builtins.bool" builtins.bool * +observed +DUnion[builtins.bool,TypeAlias[Literal[pandas._libs.lib._NoDefault]]] + builtins.bool" builtins.bool +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault *, +dropna + builtins.bool" builtins.bool 0:typing.overloadX +groupby#pandas.core.frame.DataFrame.groupby" +Vpandas.core.groupby.generic.DataFrameGroupBy[pandas._libs.tslibs.timedeltas.Timedelta]T +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta",pandas.core.groupby.generic.DataFrameGroupBy*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*f +by^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex* +axis +tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Literal[pandas._libs.lib._NoDefault]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault * +level +NUnion[TypeAlias[Union[typing.Hashable,typing.Sequence[typing.Hashable]]],None] +BTypeAlias[Union[typing.Hashable,typing.Sequence[typing.Hashable]]] +7Union[typing.Hashable,typing.Sequence[typing.Hashable]]" +typing.Hashable"typing.HashableW + typing.Sequence[typing.Hashable]" +typing.Hashable"typing.Hashable"typing.Sequence"pandas._typing.IndexLabel +None *. +as_index + builtins.bool" builtins.bool ** +sort + builtins.bool" builtins.bool *0 + +group_keys + builtins.bool" builtins.bool * +observed +DUnion[builtins.bool,TypeAlias[Literal[pandas._libs.lib._NoDefault]]] + builtins.bool" builtins.bool +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault *, +dropna + builtins.bool" builtins.bool 0:typing.overloadX +groupby#pandas.core.frame.DataFrame.groupby" +Opandas.core.groupby.generic.DataFrameGroupBy[pandas._libs.tslibs.period.Period]F +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period",pandas.core.groupby.generic.DataFrameGroupBy*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*X +byP +&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex* +axis +tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Literal[pandas._libs.lib._NoDefault]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault * +level +NUnion[TypeAlias[Union[typing.Hashable,typing.Sequence[typing.Hashable]]],None] +BTypeAlias[Union[typing.Hashable,typing.Sequence[typing.Hashable]]] +7Union[typing.Hashable,typing.Sequence[typing.Hashable]]" +typing.Hashable"typing.HashableW + typing.Sequence[typing.Hashable]" +typing.Hashable"typing.Hashable"typing.Sequence"pandas._typing.IndexLabel +None *. +as_index + builtins.bool" builtins.bool ** +sort + builtins.bool" builtins.bool *0 + +group_keys + builtins.bool" builtins.bool * +observed +DUnion[builtins.bool,TypeAlias[Literal[pandas._libs.lib._NoDefault]]] + builtins.bool" builtins.bool +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault *, +dropna + builtins.bool" builtins.bool 0:typing.overloadX +groupby#pandas.core.frame.DataFrame.groupby" +Fpandas.core.groupby.generic.DataFrameGroupBy[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval",pandas.core.groupby.generic.DataFrameGroupBy*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +by +Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* +axis +tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Literal[pandas._libs.lib._NoDefault]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault * +level +NUnion[TypeAlias[Union[typing.Hashable,typing.Sequence[typing.Hashable]]],None] +BTypeAlias[Union[typing.Hashable,typing.Sequence[typing.Hashable]]] +7Union[typing.Hashable,typing.Sequence[typing.Hashable]]" +typing.Hashable"typing.HashableW + typing.Sequence[typing.Hashable]" +typing.Hashable"typing.Hashable"typing.Sequence"pandas._typing.IndexLabel +None *. +as_index + builtins.bool" builtins.bool ** +sort + builtins.bool" builtins.bool *0 + +group_keys + builtins.bool" builtins.bool * +observed +DUnion[builtins.bool,TypeAlias[Literal[pandas._libs.lib._NoDefault]]] + builtins.bool" builtins.bool +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault *, +dropna + builtins.bool" builtins.bool 0:typing.overloadX' +groupby#pandas.core.frame.DataFrame.groupby" +Apandas.core.groupby.generic.DataFrameGroupBy[builtins.tuple[Any]]. +builtins.tuple[Any] +Any"builtins.tuple",pandas.core.groupby.generic.DataFrameGroupBy*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +by +Union[pandas.core.indexes.multi.MultiIndex,TypeAlias[Union[builtins.tuple[Any],builtins.list[pandas._typing._HashableTa],TypeAlias[Union[numpy.ufunc,CallableType[builtins.function]]],builtins.list[Unknown],builtins.list[pandas.core.series.Series[Any]],numpy.ndarray[Any,Any],builtins.list[numpy.ndarray[Any,Any]],typing.Mapping[TypeAlias[Union[typing.Hashable,None]],Any],builtins.list[typing.Mapping[Unknown,Any]],builtins.list[pandas.core.indexes.base.Index[Any]],pandas.core.groupby.grouper.Grouper,builtins.list[pandas.core.groupby.grouper.Grouper]]],None]L +$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex +TypeAlias[Union[builtins.tuple[Any],builtins.list[pandas._typing._HashableTa],TypeAlias[Union[numpy.ufunc,CallableType[builtins.function]]],builtins.list[Unknown],builtins.list[pandas.core.series.Series[Any]],numpy.ndarray[Any,Any],builtins.list[numpy.ndarray[Any,Any]],typing.Mapping[TypeAlias[Union[typing.Hashable,None]],Any],builtins.list[typing.Mapping[Unknown,Any]],builtins.list[pandas.core.indexes.base.Index[Any]],pandas.core.groupby.grouper.Grouper,builtins.list[pandas.core.groupby.grouper.Grouper]]] +Union[builtins.tuple[Any],builtins.list[pandas._typing._HashableTa],TypeAlias[Union[numpy.ufunc,CallableType[builtins.function]]],builtins.list[Unknown],builtins.list[pandas.core.series.Series[Any]],numpy.ndarray[Any,Any],builtins.list[numpy.ndarray[Any,Any]],typing.Mapping[TypeAlias[Union[typing.Hashable,None]],Any],builtins.list[typing.Mapping[Unknown,Any]],builtins.list[pandas.core.indexes.base.Index[Any]],pandas.core.groupby.grouper.Grouper,builtins.list[pandas.core.groupby.grouper.Grouper]]. +builtins.tuple[Any] +Any"builtins.tuple +)builtins.list[pandas._typing._HashableTa]S +pandas._typing._HashableTa" +typing.Hashable"typing.Hashable"typing.Hashable" builtins.list +=TypeAlias[Union[numpy.ufunc,CallableType[builtins.function]]] +2Union[numpy.ufunc,CallableType[builtins.function]] + numpy.ufunc" numpy.ufuncK +CallableType[builtins.function]& +builtins.function"builtins.function"pandas._typing.Function) +builtins.list[Unknown]" builtins.list +-builtins.list[pandas.core.series.Series[Any]]D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series" builtins.list9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarrayq +%builtins.list[numpy.ndarray[Any,Any]]9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.list +:typing.Mapping[TypeAlias[Union[typing.Hashable,None]],Any] +&TypeAlias[Union[typing.Hashable,None]]M +Union[typing.Hashable,None]" +typing.Hashable"typing.Hashable +None"pandas._typing.Label +Any"typing.Mappingu +*builtins.list[typing.Mapping[Unknown,Any]]8 +typing.Mapping[Unknown,Any] +Any"typing.Mapping" builtins.list +2builtins.list[pandas.core.indexes.base.Index[Any]]N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index" builtins.listJ +#pandas.core.groupby.grouper.Grouper"#pandas.core.groupby.grouper.Grouper +2builtins.list[pandas.core.groupby.grouper.Grouper]J +#pandas.core.groupby.grouper.Grouper"#pandas.core.groupby.grouper.Grouper" builtins.list"%pandas._typing.GroupByObjectNonScalar +None * +axis +tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Literal[pandas._libs.lib._NoDefault]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault * +level +NUnion[TypeAlias[Union[typing.Hashable,typing.Sequence[typing.Hashable]]],None] +BTypeAlias[Union[typing.Hashable,typing.Sequence[typing.Hashable]]] +7Union[typing.Hashable,typing.Sequence[typing.Hashable]]" +typing.Hashable"typing.HashableW + typing.Sequence[typing.Hashable]" +typing.Hashable"typing.Hashable"typing.Sequence"pandas._typing.IndexLabel +None *. +as_index + builtins.bool" builtins.bool ** +sort + builtins.bool" builtins.bool *0 + +group_keys + builtins.bool" builtins.bool * +observed +DUnion[builtins.bool,TypeAlias[Literal[pandas._libs.lib._NoDefault]]] + builtins.bool" builtins.bool +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault *, +dropna + builtins.bool" builtins.bool 0:typing.overloadX" +groupby#pandas.core.frame.DataFrame.groupby" +Fpandas.core.groupby.generic.DataFrameGroupBy[pandas._typing.SeriesByT] + +pandas._typing.SeriesByT +Union[builtins.str,builtins.bytes,datetime.date,builtins.bool,builtins.int,builtins.float,builtins.complex,datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]]] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period +pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.int" builtins.int +builtins.float"builtins.floatT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.Interval",pandas.core.groupby.generic.DataFrameGroupBy*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* + +by + +3pandas.core.series.Series[pandas._typing.SeriesByT] + +pandas._typing.SeriesByT +Union[builtins.str,builtins.bytes,datetime.date,builtins.bool,builtins.int,builtins.float,builtins.complex,datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]]] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period +pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.int" builtins.int +builtins.float"builtins.floatT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.Interval"pandas.core.series.Series* +axis +tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Literal[pandas._libs.lib._NoDefault]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault * +level +NUnion[TypeAlias[Union[typing.Hashable,typing.Sequence[typing.Hashable]]],None] +BTypeAlias[Union[typing.Hashable,typing.Sequence[typing.Hashable]]] +7Union[typing.Hashable,typing.Sequence[typing.Hashable]]" +typing.Hashable"typing.HashableW + typing.Sequence[typing.Hashable]" +typing.Hashable"typing.Hashable"typing.Sequence"pandas._typing.IndexLabel +None *. +as_index + builtins.bool" builtins.bool ** +sort + builtins.bool" builtins.bool *0 + +group_keys + builtins.bool" builtins.bool * +observed +DUnion[builtins.bool,TypeAlias[Literal[pandas._libs.lib._NoDefault]]] + builtins.bool" builtins.bool +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault *, +dropna + builtins.bool" builtins.bool 0:typing.overloadX +groupby#pandas.core.frame.DataFrame.groupby"j +1pandas.core.groupby.generic.DataFrameGroupBy[Any] +Any",pandas.core.groupby.generic.DataFrameGroupBy*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +by +|Union[pandas.core.indexes.category.CategoricalIndex[Any],pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any]]l +2pandas.core.indexes.category.CategoricalIndex[Any] +Any"-pandas.core.indexes.category.CategoricalIndexN +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series* +axis +tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Literal[pandas._libs.lib._NoDefault]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault * +level +NUnion[TypeAlias[Union[typing.Hashable,typing.Sequence[typing.Hashable]]],None] +BTypeAlias[Union[typing.Hashable,typing.Sequence[typing.Hashable]]] +7Union[typing.Hashable,typing.Sequence[typing.Hashable]]" +typing.Hashable"typing.HashableW + typing.Sequence[typing.Hashable]" +typing.Hashable"typing.Hashable"typing.Sequence"pandas._typing.IndexLabel +None *. +as_index + builtins.bool" builtins.bool ** +sort + builtins.bool" builtins.bool *0 + +group_keys + builtins.bool" builtins.bool * +observed +DUnion[builtins.bool,TypeAlias[Literal[pandas._libs.lib._NoDefault]]] + builtins.bool" builtins.bool +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault *, +dropna + builtins.bool" builtins.bool 0:typing.overloadX2 +stack!pandas.core.frame.DataFrame.stack +stack!pandas.core.frame.DataFrame.stack" +AUnion[pandas.core.frame.DataFrame,pandas.core.series.Series[Any]]: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrameD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +level +LUnion[TypeAlias[Union[typing.Hashable,builtins.int]],builtins.list[Unknown]] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level) +builtins.list[Unknown]" builtins.list *, +dropna + builtins.bool" builtins.bool ** +sort + builtins.bool" builtins.bool 0:typing.overloadX +stack!pandas.core.frame.DataFrame.stack" +AUnion[pandas.core.frame.DataFrame,pandas.core.series.Series[Any]]: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrameD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +level +LUnion[TypeAlias[Union[typing.Hashable,builtins.int]],builtins.list[Unknown]] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level) +builtins.list[Unknown]" builtins.list *2 + future_stack + builtins.bool" builtins.bool 0:typing.overloadX2 +aggpandas.core.frame.DataFrame.agg +aggpandas.core.frame.DataFrame.agg"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +func +Union[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]],TypeAlias[typing.Mapping[pandas._typing.HashableT,Unknown]]] +JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] +?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K +CallableType[builtins.function]& +builtins.function"builtins.function + builtins.str" builtins.str + numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase +;TypeAlias[typing.Mapping[pandas._typing.HashableT,Unknown]] +0typing.Mapping[pandas._typing.HashableT,Unknown]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable"typing.Mapping"$pandas._typing.AggFuncTypeDictSeries* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * +kwargs +Any0:typing.overloadX +aggpandas.core.frame.DataFrame.agg": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +func +Union[builtins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]],TypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]]] +Ybuiltins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]] +JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] +?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K +CallableType[builtins.function]& +builtins.function"builtins.function + builtins.str" builtins.str + numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase" builtins.list +YTypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]] +Ntyping.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.HashableV +%Union[Unknown,builtins.list[Unknown]]) +builtins.list[Unknown]" builtins.list"typing.Mapping"#pandas._typing.AggFuncTypeDictFrame * +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * +kwargs +Any0:typing.overloadX2 + aggregate%pandas.core.frame.DataFrame.aggregate + aggregate%pandas.core.frame.DataFrame.aggregate"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +func +Union[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]],TypeAlias[typing.Mapping[pandas._typing.HashableT,Unknown]]] +JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] +?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K +CallableType[builtins.function]& +builtins.function"builtins.function + builtins.str" builtins.str + numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase +;TypeAlias[typing.Mapping[pandas._typing.HashableT,Unknown]] +0typing.Mapping[pandas._typing.HashableT,Unknown]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable"typing.Mapping"$pandas._typing.AggFuncTypeDictSeries* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * +kwargs +Any0:typing.overloadX + aggregate%pandas.core.frame.DataFrame.aggregate": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +func +Union[builtins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]],TypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]]] +Ybuiltins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]] +JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] +?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K +CallableType[builtins.function]& +builtins.function"builtins.function + builtins.str" builtins.str + numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase" builtins.list +YTypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]] +Ntyping.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.HashableV +%Union[Unknown,builtins.list[Unknown]]) +builtins.list[Unknown]" builtins.list"typing.Mapping"#pandas._typing.AggFuncTypeDictFrame* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * +kwargs +Any0:typing.overloadX2 +apply!pandas.core.frame.DataFrame.apply +apply!pandas.core.frame.DataFrame.apply": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R +fK +CallableType[builtins.function]& +builtins.function"builtins.function* +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex *) +raw + builtins.bool" builtins.bool * + result_type +None * +args +Any * +kwargs +Any0:typing.overloadX +apply!pandas.core.frame.DataFrame.apply" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R +fK +CallableType[builtins.function]& +builtins.function"builtins.function* +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex *) +raw + builtins.bool" builtins.bool * + result_type +None * +args +Any * +kwargs +Any0:typing.overloadX +apply!pandas.core.frame.DataFrame.apply"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R +fK +CallableType[builtins.function]& +builtins.function"builtins.function* +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex *) +raw + builtins.bool" builtins.bool * + result_type +None * +args +Any * +kwargs +Any0:typing.overloadX +apply!pandas.core.frame.DataFrame.apply" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R +fK +CallableType[builtins.function]& +builtins.function"builtins.function* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *) +raw + builtins.bool" builtins.bool * +args +Any * + result_type +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str* +kwargs +Any0:typing.overloadX + +apply!pandas.core.frame.DataFrame.apply": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R +fK +CallableType[builtins.function]& +builtins.function"builtins.function* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *) +raw + builtins.bool" builtins.bool * +args +Any *H + result_type7 +Literal[builtins.str]  + builtins.str" builtins.str* +kwargs +Any0:typing.overloadX + +apply!pandas.core.frame.DataFrame.apply"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R +fK +CallableType[builtins.function]& +builtins.function"builtins.function* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *) +raw + builtins.bool" builtins.bool * +args +Any *H + result_type7 +Literal[builtins.str]  + builtins.str" builtins.str* +kwargs +Any0:typing.overloadX + +apply!pandas.core.frame.DataFrame.apply": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R +fK +CallableType[builtins.function]& +builtins.function"builtins.function* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *) +raw + builtins.bool" builtins.bool * +args +Any *H + result_type7 +Literal[builtins.str]  + builtins.str" builtins.str* +kwargs +Any0:typing.overloadX +apply!pandas.core.frame.DataFrame.apply"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R +fK +CallableType[builtins.function]& +builtins.function"builtins.function* +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex *) +raw + builtins.bool" builtins.bool * +args +Any *H + result_type7 +Literal[builtins.str]  + builtins.str" builtins.str* +kwargs +Any0:typing.overloadX +apply!pandas.core.frame.DataFrame.apply" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R +fK +CallableType[builtins.function]& +builtins.function"builtins.function*) +raw + builtins.bool" builtins.bool * + result_type +None * +args +Any * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn* +kwargs +Any0:typing.overloadX +apply!pandas.core.frame.DataFrame.apply"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R +fK +CallableType[builtins.function]& +builtins.function"builtins.function*) +raw + builtins.bool" builtins.bool * + result_type +None * +args +Any * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn* +kwargs +Any0:typing.overloadX +apply!pandas.core.frame.DataFrame.apply": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R +fK +CallableType[builtins.function]& +builtins.function"builtins.function*) +raw + builtins.bool" builtins.bool * + result_type +None * +args +Any * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn* +kwargs +Any0:typing.overloadX +apply!pandas.core.frame.DataFrame.apply": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R +fK +CallableType[builtins.function]& +builtins.function"builtins.function*) +raw + builtins.bool" builtins.bool * +args +Any * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn*H + result_type7 +Literal[builtins.str]  + builtins.str" builtins.str* +kwargs +Any0:typing.overloadX2 +count!pandas.core.frame.DataFrame.count + +count!pandas.core.frame.DataFrame.count": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *2 + numeric_only + builtins.bool" builtins.bool * +level +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level0:typing.overloadX +count!pandas.core.frame.DataFrame.count"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * +level +None *2 + numeric_only + builtins.bool" builtins.bool 0:typing.overloadX2 +mode pandas.core.frame.DataFrame.mode + +mode pandas.core.frame.DataFrame.mode": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *, +skipna + builtins.bool" builtins.bool *2 + numeric_only + builtins.bool" builtins.bool * +level +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level* +kwargs +Any0:typing.overloadX +mode pandas.core.frame.DataFrame.mode"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *, +skipna + builtins.bool" builtins.bool * +level +None *2 + numeric_only + builtins.bool" builtins.bool * +kwargs +Any0:typing.overloadX2! +quantile$pandas.core.frame.DataFrame.quantile +quantile$pandas.core.frame.DataFrame.quantile"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*) +q +builtins.float"builtins.float * +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *2 + numeric_only + builtins.bool" builtins.bool * + interpolation +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +tUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"$pandas._typing.QuantileInterpolation * +method +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.CalculationMethod 0:typing.overloadX +quantile$pandas.core.frame.DataFrame.quantile": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +q +;Union[builtins.list[builtins.float],numpy.ndarray[Any,Any]]P +builtins.list[builtins.float] +builtins.float"builtins.float" builtins.list9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *2 + numeric_only + builtins.bool" builtins.bool * + interpolation +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +tUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"$pandas._typing.QuantileInterpolation * +method +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.CalculationMethod 0:typing.overloadX2 + +columns#pandas.core.frame.DataFrame.columns +columns#pandas.core.frame.DataFrame.columns"l +,pandas.core.indexes.base.Index[builtins.str] + builtins.str" builtins.str"pandas.core.indexes.base.Index*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame0:builtins.propertyX` +columns#pandas.core.frame.DataFrame.columns" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +cols +Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[pandas._typing.HashableT],builtins.tuple[pandas._typing.HashableT]] +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.AnyArrayLike +'builtins.list[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable" builtins.list +(builtins.tuple[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable"builtins.tuple0:.setter2 +index!pandas.core.frame.DataFrame.index +index!pandas.core.frame.DataFrame.index"N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame0:builtins.propertyX` +index!pandas.core.frame.DataFrame.index" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*W +idxN +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index0:.setter2 +allpandas.core.frame.DataFrame.all +allpandas.core.frame.DataFrame.all" + builtins.bool" builtins.bool*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +axis +None*X + bool_onlyG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None *, +skipna + builtins.bool" builtins.bool * +kwargs +Any0:typing.overloadX +allpandas.core.frame.DataFrame.all"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *X + bool_onlyG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None *, +skipna + builtins.bool" builtins.bool * +kwargs +Any0:typing.overloadX2 +anypandas.core.frame.DataFrame.any +anypandas.core.frame.DataFrame.any" + builtins.bool" builtins.bool*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +axis +None*X + bool_onlyG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None *, +skipna + builtins.bool" builtins.bool * +kwargs +Any0:typing.overloadX +anypandas.core.frame.DataFrame.any"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *X + bool_onlyG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None *, +skipna + builtins.bool" builtins.bool * +kwargs +Any0:typing.overloadX2 +bfill!pandas.core.frame.DataFrame.bfill +bfill!pandas.core.frame.DataFrame.bfill" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +axis +Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis +None *G +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool*Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None *{ +downcastk +"Union[builtins.dict[Any,Any],None]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +None 0:typing.overloadX +bfill!pandas.core.frame.DataFrame.bfill": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +axis +Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis +None *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None *{ +downcastk +"Union[builtins.dict[Any,Any],None]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +None 0:typing.overloadX2 +ffill!pandas.core.frame.DataFrame.ffill +ffill!pandas.core.frame.DataFrame.ffill" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +axis +Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis +None *G +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool*Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None *{ +downcastk +"Union[builtins.dict[Any,Any],None]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +None 0:typing.overloadX +ffill!pandas.core.frame.DataFrame.ffill": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +axis +Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis +None *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None *{ +downcastk +"Union[builtins.dict[Any,Any],None]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +None 0:typing.overloadX2 +getpandas.core.frame.DataFrame.get +getpandas.core.frame.DataFrame.get"~ +*Union[pandas.core.series.Series[Any],None]D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*+ +key" +typing.Hashable"typing.Hashable* +default +None 0:typing.overloadX +getpandas.core.frame.DataFrame.get" +6Union[pandas.core.series.Series[Any],pandas._typing.T]D +pandas.core.series.Series[Any] +Any"pandas.core.series.SeriesI +pandas._typing.T" +builtins.object"builtins.object"builtins.object*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*+ +key" +typing.Hashable"typing.Hashable*V +defaultI +pandas._typing.T" +builtins.object"builtins.object"builtins.object0:typing.overloadX +getpandas.core.frame.DataFrame.get"q +'Union[pandas.core.frame.DataFrame,None]: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*\ +keyS +builtins.list[typing.Hashable]" +typing.Hashable"typing.Hashable" builtins.list* +default +None 0:typing.overloadX +getpandas.core.frame.DataFrame.get" +3Union[pandas.core.frame.DataFrame,pandas._typing.T]: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrameI +pandas._typing.T" +builtins.object"builtins.object"builtins.object*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*\ +keyS +builtins.list[typing.Hashable]" +typing.Hashable"typing.Hashable" builtins.list*V +defaultI +pandas._typing.T" +builtins.object"builtins.object"builtins.object0:typing.overloadX2X + interpolate'pandas.core.frame.DataFrame.interpolate + interpolate'pandas.core.frame.DataFrame.interpolate" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +method +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"!pandas._typing.InterpolateOptions * +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None * +limit_direction +HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str * + +limit_area +7Union[Literal[builtins.str],Literal[builtins.str],None]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +None *x +downcasth +!Union[Literal[builtins.str],None]7 +Literal[builtins.str]  + builtins.str" builtins.str +None *G +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool* +kwargs +Any0:typing.overloadX + interpolate'pandas.core.frame.DataFrame.interpolate": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +method +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"!pandas._typing.InterpolateOptions * +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None * +limit_direction +HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str * + +limit_area +7Union[Literal[builtins.str],Literal[builtins.str],None]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +None *x +downcasth +!Union[Literal[builtins.str],None]7 +Literal[builtins.str]  + builtins.str" builtins.str +None *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool * +kwargs +Any0:typing.overloadX + interpolate'pandas.core.frame.DataFrame.interpolate"q +'Union[pandas.core.frame.DataFrame,None]: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +method +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"!pandas._typing.InterpolateOptions * +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None *V +inplaceG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None * +limit_direction +HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str * + +limit_area +7Union[Literal[builtins.str],Literal[builtins.str],None]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +None *x +downcasth +!Union[Literal[builtins.str],None]7 +Literal[builtins.str]  + builtins.str" builtins.str +None * +kwargs +Any0:typing.overloadX2, + rename_axis'pandas.core.frame.DataFrame.rename_axis + + rename_axis'pandas.core.frame.DataFrame.rename_axis" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +mapper +Any * +axis +Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis +None ** +copy + builtins.bool" builtins.bool *G +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool0:typing.overloadX + + rename_axis'pandas.core.frame.DataFrame.rename_axis": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +mapper +Any * +axis +Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis +None ** +copy + builtins.bool" builtins.bool *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool 0:typing.overloadX + rename_axis'pandas.core.frame.DataFrame.rename_axis" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +index +Union[builtins.str,typing.Sequence[builtins.str],builtins.dict[Union[builtins.str,builtins.int],builtins.str],CallableType[builtins.function],None] + builtins.str" builtins.strN +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.Sequence +pandas.core.window.rolling.Window[pandas.core.frame.DataFrame]: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame"!pandas.core.window.rolling.Window*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +window +{Union[builtins.int,builtins.str,datetime.timedelta,pandas._libs.tslibs.offsets.BaseOffset,pandas.core.indexers.BaseIndexer] + builtins.int" builtins.int + builtins.str" builtins.str( +datetime.timedelta"datetime.timedeltaP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffsetD + pandas.core.indexers.BaseIndexer" pandas.core.indexers.BaseIndexer*W + min_periodsD +Union[builtins.int,None] + builtins.int" builtins.int +None *, +center + builtins.bool" builtins.bool *W +onM +Union[typing.Hashable,None]" +typing.Hashable"typing.Hashable +None * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex * +closed +uUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"!pandas._typing.IntervalClosedType +None *P +stepD +Union[builtins.int,None] + builtins.int" builtins.int +None * +method +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.CalculationMethod ** +win_type + builtins.str" builtins.str0:typing.overloadX +rolling#pandas.core.frame.DataFrame.rolling" +?pandas.core.window.rolling.Rolling[pandas.core.frame.DataFrame]: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame""pandas.core.window.rolling.Rolling*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +window +{Union[builtins.int,builtins.str,datetime.timedelta,pandas._libs.tslibs.offsets.BaseOffset,pandas.core.indexers.BaseIndexer] + builtins.int" builtins.int + builtins.str" builtins.str( +datetime.timedelta"datetime.timedeltaP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffsetD + pandas.core.indexers.BaseIndexer" pandas.core.indexers.BaseIndexer*W + min_periodsD +Union[builtins.int,None] + builtins.int" builtins.int +None *, +center + builtins.bool" builtins.bool *W +onM +Union[typing.Hashable,None]" +typing.Hashable"typing.Hashable +None * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex * +closed +uUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"!pandas._typing.IntervalClosedType +None *P +stepD +Union[builtins.int,None] + builtins.int" builtins.int +None * +method +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.CalculationMethod * +win_type +None 0:typing.overloadX2` +to_json#pandas.core.frame.DataFrame.to_json +to_json#pandas.core.frame.DataFrame.to_json" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* + path_or_buf +hUnion[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.WriteBuffer[builtins.str]] +8TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]] +-Union[builtins.str,os.PathLike[builtins.str]] + builtins.str" builtins.strF +os.PathLike[builtins.str] + builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathd +(pandas._typing.WriteBuffer[builtins.str] + builtins.str" builtins.str"pandas._typing.WriteBuffer*C +orient7 +Literal[builtins.str]  + builtins.str" builtins.str* + date_format +7Union[Literal[builtins.str],Literal[builtins.str],None]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +None *4 +double_precision + builtins.int" builtins.int *1 + force_ascii + builtins.bool" builtins.bool * + date_unit +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.TimeUnit * +default_handler ++Union[CallableType[builtins.function],None]K +CallableType[builtins.function]& +builtins.function"builtins.function +None *E +lines: +Literal[builtins.bool]  + builtins.bool" builtins.bool* + compression +TypeAlias[Union[None,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],TypeAlias[builtins.dict[builtins.str,Any]]]] +Union[None,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],TypeAlias[builtins.dict[builtins.str,Any]]] +None7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +*TypeAlias[builtins.dict[builtins.str,Any]]W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict"pandas._typing.CompressionDict"!pandas._typing.CompressionOptions *+ +index + builtins.bool" builtins.bool *R +indentD +Union[builtins.int,None] + builtins.int" builtins.int +None *A +mode7 +Literal[builtins.str]  + builtins.str" builtins.str0:typing.overloadX +to_json#pandas.core.frame.DataFrame.to_json" + builtins.str" builtins.str*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* + path_or_buf +None *C +orient7 +Literal[builtins.str]  + builtins.str" builtins.str* + date_format +7Union[Literal[builtins.str],Literal[builtins.str],None]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +None *4 +double_precision + builtins.int" builtins.int *1 + force_ascii + builtins.bool" builtins.bool * + date_unit +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.TimeUnit * +default_handler ++Union[CallableType[builtins.function],None]K +CallableType[builtins.function]& +builtins.function"builtins.function +None *E +lines: +Literal[builtins.bool]  + builtins.bool" builtins.bool* + compression +TypeAlias[Union[None,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],TypeAlias[builtins.dict[builtins.str,Any]]]] +Union[None,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],TypeAlias[builtins.dict[builtins.str,Any]]] +None7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +*TypeAlias[builtins.dict[builtins.str,Any]]W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict"pandas._typing.CompressionDict"!pandas._typing.CompressionOptions *+ +index + builtins.bool" builtins.bool *R +indentD +Union[builtins.int,None] + builtins.int" builtins.int +None *A +mode7 +Literal[builtins.str]  + builtins.str" builtins.str0:typing.overloadX +to_json#pandas.core.frame.DataFrame.to_json" + builtins.str" builtins.str*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* + path_or_buf +None * +orient +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.JsonFrameOrient +None * + date_format +7Union[Literal[builtins.str],Literal[builtins.str],None]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +None *4 +double_precision + builtins.int" builtins.int *1 + force_ascii + builtins.bool" builtins.bool * + date_unit +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.TimeUnit * +default_handler ++Union[CallableType[builtins.function],None]K +CallableType[builtins.function]& +builtins.function"builtins.function +None *+ +lines + builtins.bool" builtins.bool * + compression +TypeAlias[Union[None,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],TypeAlias[builtins.dict[builtins.str,Any]]]] +Union[None,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],TypeAlias[builtins.dict[builtins.str,Any]]] +None7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +*TypeAlias[builtins.dict[builtins.str,Any]]W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict"pandas._typing.CompressionDict"!pandas._typing.CompressionOptions *+ +index + builtins.bool" builtins.bool *R +indentD +Union[builtins.int,None] + builtins.int" builtins.int +None *C +mode7 +Literal[builtins.str]  + builtins.str" builtins.str 0:typing.overloadX +to_json#pandas.core.frame.DataFrame.to_json" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* + path_or_buf +hUnion[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.WriteBuffer[builtins.str]] +8TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]] +-Union[builtins.str,os.PathLike[builtins.str]] + builtins.str" builtins.strF +os.PathLike[builtins.str] + builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathd +(pandas._typing.WriteBuffer[builtins.str] + builtins.str" builtins.str"pandas._typing.WriteBuffer* +orient +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.JsonFrameOrient +None * + date_format +7Union[Literal[builtins.str],Literal[builtins.str],None]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +None *4 +double_precision + builtins.int" builtins.int *1 + force_ascii + builtins.bool" builtins.bool * + date_unit +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.TimeUnit * +default_handler ++Union[CallableType[builtins.function],None]K +CallableType[builtins.function]& +builtins.function"builtins.function +None *+ +lines + builtins.bool" builtins.bool * + compression +TypeAlias[Union[None,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],TypeAlias[builtins.dict[builtins.str,Any]]]] +Union[None,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],TypeAlias[builtins.dict[builtins.str,Any]]] +None7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +*TypeAlias[builtins.dict[builtins.str,Any]]W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict"pandas._typing.CompressionDict"!pandas._typing.CompressionOptions *+ +index + builtins.bool" builtins.bool *R +indentD +Union[builtins.int,None] + builtins.int" builtins.int +None *C +mode7 +Literal[builtins.str]  + builtins.str" builtins.str 0:typing.overloadX2; + to_string%pandas.core.frame.DataFrame.to_string + to_string%pandas.core.frame.DataFrame.to_string" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +buf +hUnion[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.WriteBuffer[builtins.str]] +8TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]] +-Union[builtins.str,os.PathLike[builtins.str]] + builtins.str" builtins.strF +os.PathLike[builtins.str] + builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathd +(pandas._typing.WriteBuffer[builtins.str] + builtins.str" builtins.str"pandas._typing.WriteBuffer* +columns +wUnion[builtins.list[pandas._typing.HashableT1],pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],None] +(builtins.list[pandas._typing.HashableT1]R +pandas._typing.HashableT1" +typing.Hashable"typing.Hashable"typing.Hashable" builtins.listN +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series +None * + col_space +jUnion[builtins.int,builtins.list[builtins.int],builtins.dict[pandas._typing.HashableT2,builtins.int],None] + builtins.int" builtins.intJ +builtins.list[builtins.int] + builtins.int" builtins.int" builtins.list +5builtins.dict[pandas._typing.HashableT2,builtins.int]R +pandas._typing.HashableT2" +typing.Hashable"typing.Hashable"typing.Hashable + builtins.int" builtins.int" builtins.dict +None * +header +MUnion[builtins.bool,builtins.list[builtins.str],builtins.tuple[builtins.str]] + builtins.bool" builtins.boolJ +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.listL +builtins.tuple[builtins.str] + builtins.str" builtins.str"builtins.tuple *+ +index + builtins.bool" builtins.bool ** +na_rep + builtins.str" builtins.str * + +formatters +Union[TypeAlias[Union[builtins.list[CallableType[builtins.function]],builtins.tuple[CallableType[builtins.function]],typing.Mapping[Union[builtins.str,builtins.int],CallableType[builtins.function]]]],None] +TypeAlias[Union[builtins.list[CallableType[builtins.function]],builtins.tuple[CallableType[builtins.function]],typing.Mapping[Union[builtins.str,builtins.int],CallableType[builtins.function]]]] +Union[builtins.list[CallableType[builtins.function]],builtins.tuple[CallableType[builtins.function]],typing.Mapping[Union[builtins.str,builtins.int],CallableType[builtins.function]]] +.builtins.list[CallableType[builtins.function]]K +CallableType[builtins.function]& +builtins.function"builtins.function" builtins.list +/builtins.tuple[CallableType[builtins.function]]K +CallableType[builtins.function]& +builtins.function"builtins.function"builtins.tuple +Ptyping.Mapping[Union[builtins.str,builtins.int],CallableType[builtins.function]]` + Union[builtins.str,builtins.int] + builtins.str" builtins.str + builtins.int" builtins.intK +CallableType[builtins.function]& +builtins.function"builtins.function"typing.Mapping"pandas._typing.FormattersType +None * + float_format ++Union[CallableType[builtins.function],None]K +CallableType[builtins.function]& +builtins.function"builtins.function +None *W +sparsifyG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None *1 + index_names + builtins.bool" builtins.bool *S +justifyD +Union[builtins.str,None] + builtins.str" builtins.str +None *T +max_rowsD +Union[builtins.int,None] + builtins.int" builtins.int +None *T +max_colsD +Union[builtins.int,None] + builtins.int" builtins.int +None *5 +show_dimensions + builtins.bool" builtins.bool *+ +decimal + builtins.str" builtins.str *V + +line_widthD +Union[builtins.int,None] + builtins.int" builtins.int +None *T +min_rowsD +Union[builtins.int,None] + builtins.int" builtins.int +None *X + max_colwidthD +Union[builtins.int,None] + builtins.int" builtins.int +None *T +encodingD +Union[builtins.str,None] + builtins.str" builtins.str +None 0:typing.overloadX + to_string%pandas.core.frame.DataFrame.to_string" + builtins.str" builtins.str*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +buf +None * +columns +vUnion[builtins.list[pandas._typing.HashableT],pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],None] +'builtins.list[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable" builtins.listN +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series +None * + col_space +`Union[builtins.int,builtins.list[builtins.int],builtins.dict[typing.Hashable,builtins.int],None] + builtins.int" builtins.intJ +builtins.list[builtins.int] + builtins.int" builtins.int" builtins.list~ ++builtins.dict[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int" builtins.dict +None * +header +2Union[builtins.bool,typing.Sequence[builtins.str]] + builtins.bool" builtins.boolN +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.Sequence *+ +index + builtins.bool" builtins.bool ** +na_rep + builtins.str" builtins.str * + +formatters +Union[TypeAlias[Union[builtins.list[CallableType[builtins.function]],builtins.tuple[CallableType[builtins.function]],typing.Mapping[Union[builtins.str,builtins.int],CallableType[builtins.function]]]],None] +TypeAlias[Union[builtins.list[CallableType[builtins.function]],builtins.tuple[CallableType[builtins.function]],typing.Mapping[Union[builtins.str,builtins.int],CallableType[builtins.function]]]] +Union[builtins.list[CallableType[builtins.function]],builtins.tuple[CallableType[builtins.function]],typing.Mapping[Union[builtins.str,builtins.int],CallableType[builtins.function]]] +.builtins.list[CallableType[builtins.function]]K +CallableType[builtins.function]& +builtins.function"builtins.function" builtins.list +/builtins.tuple[CallableType[builtins.function]]K +CallableType[builtins.function]& +builtins.function"builtins.function"builtins.tuple +Ptyping.Mapping[Union[builtins.str,builtins.int],CallableType[builtins.function]]` + Union[builtins.str,builtins.int] + builtins.str" builtins.str + builtins.int" builtins.intK +CallableType[builtins.function]& +builtins.function"builtins.function"typing.Mapping"pandas._typing.FormattersType +None * + float_format ++Union[CallableType[builtins.function],None]K +CallableType[builtins.function]& +builtins.function"builtins.function +None *W +sparsifyG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None *1 + index_names + builtins.bool" builtins.bool *S +justifyD +Union[builtins.str,None] + builtins.str" builtins.str +None *T +max_rowsD +Union[builtins.int,None] + builtins.int" builtins.int +None *T +max_colsD +Union[builtins.int,None] + builtins.int" builtins.int +None *5 +show_dimensions + builtins.bool" builtins.bool *+ +decimal + builtins.str" builtins.str *V + +line_widthD +Union[builtins.int,None] + builtins.int" builtins.int +None *T +min_rowsD +Union[builtins.int,None] + builtins.int" builtins.int +None *X + max_colwidthD +Union[builtins.int,None] + builtins.int" builtins.int +None *T +encodingD +Union[builtins.str,None] + builtins.str" builtins.str +None 0:typing.overloadXr: +__hash__$pandas.core.frame.DataFrame.__hash__ +NonerT +sparse"pandas.core.frame.DataFrame.sparse& +builtins.ellipsis"builtins.ellipsisrF +Name pandas.core.frame.DataFrame.Name + builtins.str" builtins.str5 +Grouper#pandas.core.groupby.grouper.Grouper"builtins.object* +__repr__,pandas.core.groupby.grouper.Grouper.__repr__" + builtins.str" builtins.str*LJ +#pandas.core.groupby.grouper.Grouper"#pandas.core.groupby.grouper.Grouper0: typing.finalP2 +__new__+pandas.core.groupby.grouper.Grouper.__new__ +__new__+pandas.core.groupby.grouper.Grouper.__new__" +(pandas.core.groupby.grouper.Grouper.SelfJ +#pandas.core.groupby.grouper.Grouper"#pandas.core.groupby.grouper.Grouper"#pandas.core.groupby.grouper.Grouper(* +cls +.Type[pandas.core.groupby.grouper.Grouper.Self] +(pandas.core.groupby.grouper.Grouper.SelfJ +#pandas.core.groupby.grouper.Grouper"#pandas.core.groupby.grouper.Grouper"#pandas.core.groupby.grouper.Grouper("type*l +keya +Union[TypeAlias[Any],None]7 +TypeAlias[Any] +Any"pandas._typing.KeysArgType +None * +level +Union[TypeAlias[Union[typing.Hashable,builtins.int]],TypeAlias[Union[typing.MutableSequence[pandas._typing.HashableT],numpy.ndarray[Any,Any],builtins.tuple[pandas._typing.HashableT],builtins.range]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +TypeAlias[Union[typing.MutableSequence[pandas._typing.HashableT],numpy.ndarray[Any,Any],builtins.tuple[pandas._typing.HashableT],builtins.range]] +Union[typing.MutableSequence[pandas._typing.HashableT],numpy.ndarray[Any,Any],builtins.tuple[pandas._typing.HashableT],builtins.range] +0typing.MutableSequence[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable"typing.MutableSequence9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray +(builtins.tuple[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable"builtins.tuple +builtins.range"builtins.range"pandas._typing.ListLikeHashable +None * +axis +Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],TypeAlias[Literal[pandas._libs.lib._NoDefault]]] +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault ** +sort + builtins.bool" builtins.bool *, +dropna + builtins.bool" builtins.bool 0:typing.overloadX +__new__+pandas.core.groupby.grouper.Grouper.__new__"D + pandas.core.resample.TimeGrouper" pandas.core.resample.TimeGrouper* +cls +)Type[pandas.core.groupby.grouper.Grouper]J +#pandas.core.groupby.grouper.Grouper"#pandas.core.groupby.grouper.Grouper"type* +args +Any* +freq +ETypeAlias[Union[builtins.str,pandas._libs.tslibs.offsets.BaseOffset]] +:Union[builtins.str,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.strP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas._typing.Frequency* +kwargs +Any0:typing.overloadXr +key'pandas.core.groupby.grouper.Grouper.keya +Union[TypeAlias[Any],None]7 +TypeAlias[Any] +Any"pandas._typing.KeysArgType +Noner +level)pandas.core.groupby.grouper.Grouper.level +Union[TypeAlias[Union[typing.Hashable,builtins.int]],TypeAlias[Union[typing.MutableSequence[pandas._typing.HashableT],numpy.ndarray[Any,Any],builtins.tuple[pandas._typing.HashableT],builtins.range]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +TypeAlias[Union[typing.MutableSequence[pandas._typing.HashableT],numpy.ndarray[Any,Any],builtins.tuple[pandas._typing.HashableT],builtins.range]] +Union[typing.MutableSequence[pandas._typing.HashableT],numpy.ndarray[Any,Any],builtins.tuple[pandas._typing.HashableT],builtins.range] +0typing.MutableSequence[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable"typing.MutableSequence9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray +(builtins.tuple[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable"builtins.tuple +builtins.range"builtins.range"pandas._typing.ListLikeHashable +Noner +freq(pandas.core.groupby.grouper.Grouper.freq +QUnion[TypeAlias[Union[builtins.str,pandas._libs.tslibs.offsets.BaseOffset]],None] +ETypeAlias[Union[builtins.str,pandas._libs.tslibs.offsets.BaseOffset]] +:Union[builtins.str,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.strP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas._typing.Frequency +Noner +axis(pandas.core.groupby.grouper.Grouper.axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.AxisrP +sort(pandas.core.groupby.grouper.Grouper.sort + builtins.bool" builtins.boolrT +dropna*pandas.core.groupby.grouper.Grouper.dropna + builtins.bool" builtins.boolrl +binner*pandas.core.groupby.grouper.Grouper.binner6 +TypeAlias[Any] +Any"pandas._typing.Incomplete. +NamedAgg$pandas.core.groupby.generic.NamedAgg"builtins.tuple* + +_replace-pandas.core.groupby.generic.NamedAgg._replace" +(pandas.core.groupby.generic.NamedAgg._NT +RTuple[builtins.str,TypeAlias[Union[builtins.str,CallableType[builtins.function]]]] + builtins.str" builtins.str +>TypeAlias[Union[builtins.str,CallableType[builtins.function]]] +3Union[builtins.str,CallableType[builtins.function]] + builtins.str" builtins.strK +CallableType[builtins.function]& +builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalar* +_self +(pandas.core.groupby.generic.NamedAgg._NT +RTuple[builtins.str,TypeAlias[Union[builtins.str,CallableType[builtins.function]]]] + builtins.str" builtins.str +>TypeAlias[Union[builtins.str,CallableType[builtins.function]]] +3Union[builtins.str,CallableType[builtins.function]] + builtins.str" builtins.strK +CallableType[builtins.function]& +builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalar** +column + builtins.str" builtins.str * +aggfunc +>TypeAlias[Union[builtins.str,CallableType[builtins.function]]] +3Union[builtins.str,CallableType[builtins.function]] + builtins.str" builtins.strK +CallableType[builtins.function]& +builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalar * + +__new__,pandas.core.groupby.generic.NamedAgg.__new__" +(pandas.core.groupby.generic.NamedAgg._NT +RTuple[builtins.str,TypeAlias[Union[builtins.str,CallableType[builtins.function]]]] + builtins.str" builtins.str +>TypeAlias[Union[builtins.str,CallableType[builtins.function]]] +3Union[builtins.str,CallableType[builtins.function]] + builtins.str" builtins.strK +CallableType[builtins.function]& +builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalar* +_cls +.Type[pandas.core.groupby.generic.NamedAgg._NT] +(pandas.core.groupby.generic.NamedAgg._NT +RTuple[builtins.str,TypeAlias[Union[builtins.str,CallableType[builtins.function]]]] + builtins.str" builtins.str +>TypeAlias[Union[builtins.str,CallableType[builtins.function]]] +3Union[builtins.str,CallableType[builtins.function]] + builtins.str" builtins.strK +CallableType[builtins.function]& +builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalar"type*( +column + builtins.str" builtins.str* +aggfunc +>TypeAlias[Union[builtins.str,CallableType[builtins.function]]] +3Union[builtins.str,CallableType[builtins.function]] + builtins.str" builtins.strK +CallableType[builtins.function]& +builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalar* +_asdict,pandas.core.groupby.generic.NamedAgg._asdict"W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict* +_self +(pandas.core.groupby.generic.NamedAgg._NT +RTuple[builtins.str,TypeAlias[Union[builtins.str,CallableType[builtins.function]]]] + builtins.str" builtins.str +>TypeAlias[Union[builtins.str,CallableType[builtins.function]]] +3Union[builtins.str,CallableType[builtins.function]] + builtins.str" builtins.strK +CallableType[builtins.function]& +builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalar* +_make*pandas.core.groupby.generic.NamedAgg._make" +(pandas.core.groupby.generic.NamedAgg._NT +RTuple[builtins.str,TypeAlias[Union[builtins.str,CallableType[builtins.function]]]] + builtins.str" builtins.str +>TypeAlias[Union[builtins.str,CallableType[builtins.function]]] +3Union[builtins.str,CallableType[builtins.function]] + builtins.str" builtins.strK +CallableType[builtins.function]& +builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalar* +_cls +.Type[pandas.core.groupby.generic.NamedAgg._NT] +(pandas.core.groupby.generic.NamedAgg._NT +RTuple[builtins.str,TypeAlias[Union[builtins.str,CallableType[builtins.function]]]] + builtins.str" builtins.str +>TypeAlias[Union[builtins.str,CallableType[builtins.function]]] +3Union[builtins.str,CallableType[builtins.function]] + builtins.str" builtins.strK +CallableType[builtins.function]& +builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalar"type*> +iterable0 +typing.Iterable[Any] +Any"typing.Iterable* +new +Any * +len +Any 0:prS +column+pandas.core.groupby.generic.NamedAgg.column + builtins.str" builtins.strr +aggfunc,pandas.core.groupby.generic.NamedAgg.aggfunc +>TypeAlias[Union[builtins.str,CallableType[builtins.function]]] +3Union[builtins.str,CallableType[builtins.function]] + builtins.str" builtins.strK +CallableType[builtins.function]& +builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalarrS +column+pandas.core.groupby.generic.NamedAgg.column + builtins.str" builtins.strr +aggfunc,pandas.core.groupby.generic.NamedAgg.aggfunc +>TypeAlias[Union[builtins.str,CallableType[builtins.function]]] +3Union[builtins.str,CallableType[builtins.function]] + builtins.str" builtins.strK +CallableType[builtins.function]& +builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalarr +_fields,pandas.core.groupby.generic.NamedAgg._fields` + Tuple[builtins.str,builtins.str] + builtins.str" builtins.str + builtins.str" builtins.strr + _field_types1pandas.core.groupby.generic.NamedAgg._field_typesW +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dictr +_field_defaults4pandas.core.groupby.generic.NamedAgg._field_defaultsW +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dictrU +_source,pandas.core.groupby.generic.NamedAgg._source + builtins.str" builtins.strr +__annotations__4pandas.core.groupby.generic.NamedAgg.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict +CategoricalIndex-pandas.core.indexes.category.CategoricalIndex",pandas.core.indexes.extension.ExtensionIndex"#pandas.core.accessor.PandasDelegate*> +__new__5pandas.core.indexes.category.CategoricalIndex.__new__" +2pandas.core.indexes.category.CategoricalIndex.Self +@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes datetime.date" datetime.date datetime.time" datetime.time builtins.bool" builtins.bool @@ -11253,23 +16044,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"-pandas.core.indexes.category.CategoricalIndex* -dtype -Any *& -astype4pandas.core.indexes.category.CategoricalIndex.astype"N -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index* -self -@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"-pandas.core.indexes.category.CategoricalIndex"-pandas.core.indexes.category.CategoricalIndex(* +cls +8Type[pandas.core.indexes.category.CategoricalIndex.Self] +2pandas.core.indexes.category.CategoricalIndex.Self +@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -11296,17 +16081,23 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"-pandas.core.indexes.category.CategoricalIndex"-pandas.core.indexes.category.CategoricalIndex("type* +data +"typing.Iterable[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"-pandas.core.indexes.category.CategoricalIndex* -dtype -TypeAlias[Union[TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],typing.Mapping[Any,Unknown]]] -Union[TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],typing.Mapping[Any,Unknown]] +builtins.float"builtins.float$ +builtins.complex"builtins.complex TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P &pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype @@ -11322,21 +16113,34 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand Type[builtins.bool] builtins.bool" builtins.bool"typeC Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype8 -typing.Mapping[Any,Unknown] -Any"typing.Mapping"pandas._typing.DtypeArg** +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Iterable * + +categories +Any * +ordered +Any * +dtype +Any ** copy - builtins.bool" builtins.bool *e -fillna4pandas.core.indexes.category.CategoricalIndex.fillna* -self* -value * -downcast * - is_unique7pandas.core.indexes.category.CategoricalIndex.is_unique" - builtins.bool" builtins.bool* -self -@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool * +name +Any *S +equals4pandas.core.indexes.category.CategoricalIndex.equals* +self* +other* + inferred_type;pandas.core.indexes.category.CategoricalIndex.inferred_type" + builtins.str" builtins.str* +self +@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -11363,20 +16167,18 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"-pandas.core.indexes.category.CategoricalIndex0:builtins.property`* -is_monotonic_increasingEpandas.core.indexes.category.CategoricalIndex.is_monotonic_increasing" - builtins.bool" builtins.bool* -self -@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"-pandas.core.indexes.category.CategoricalIndex0:builtins.property`*_ +values4pandas.core.indexes.category.CategoricalIndex.values* +self0:builtins.property`* + __contains__:pandas.core.indexes.category.CategoricalIndex.__contains__" + builtins.bool" builtins.bool* +@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -11403,20 +16205,60 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"-pandas.core.indexes.category.CategoricalIndex*  +Any* + __array__7pandas.core.indexes.category.CategoricalIndex.__array__"9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray* +self +@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"-pandas.core.indexes.category.CategoricalIndex0:builtins.property`* -is_monotonic_decreasingEpandas.core.indexes.category.CategoricalIndex.is_monotonic_decreasing" - builtins.bool" builtins.bool* -self -@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"-pandas.core.indexes.category.CategoricalIndex* +dtype +Any *# +astype4pandas.core.indexes.category.CategoricalIndex.astype"N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index* +self +@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -11443,24 +16285,159 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"-pandas.core.indexes.category.CategoricalIndex* +dtype +TypeAlias[Union[TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],typing.Mapping[Any,Unknown]]] +Union[TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],typing.Mapping[Any,Unknown]] +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype8 +typing.Mapping[Any,Unknown] +Any"typing.Mapping"pandas._typing.DtypeArg** +copy + builtins.bool" builtins.bool *e +fillna4pandas.core.indexes.category.CategoricalIndex.fillna* +self* +value * +downcast * + is_unique7pandas.core.indexes.category.CategoricalIndex.is_unique" + builtins.bool" builtins.bool* +self +@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"-pandas.core.indexes.category.CategoricalIndex0:builtins.property`*U +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"-pandas.core.indexes.category.CategoricalIndex0:builtins.property`* +is_monotonic_increasingEpandas.core.indexes.category.CategoricalIndex.is_monotonic_increasing" + builtins.bool" builtins.bool* +self +@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"-pandas.core.indexes.category.CategoricalIndex0:builtins.property`* +is_monotonic_decreasingEpandas.core.indexes.category.CategoricalIndex.is_monotonic_decreasing" + builtins.bool" builtins.bool* +self +@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"-pandas.core.indexes.category.CategoricalIndex0:builtins.property`*U unique4pandas.core.indexes.category.CategoricalIndex.unique* self* -level * +level * duplicated8pandas.core.indexes.category.CategoricalIndex.duplicated" -Any* -self -@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any* +self +@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -11487,14 +16464,11 @@ duplicated8pandas.core.indexes.category.CategoricalIndex.duplicated" builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"-pandas.core.indexes.category.CategoricalIndex* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"-pandas.core.indexes.category.CategoricalIndex* keep IUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.bool]]7 Literal[builtins.str]  @@ -11502,14 +16476,7 @@ IUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.bool]]7 Literal[builtins.str]  builtins.str" builtins.str: Literal[builtins.bool]  - builtins.bool" builtins.bool *S -get_loc5pandas.core.indexes.category.CategoricalIndex.get_loc* -self* -key*l - get_value7pandas.core.indexes.category.CategoricalIndex.get_value* -self* -seriesArrayLike* -key*] + builtins.bool" builtins.bool *] where3pandas.core.indexes.category.CategoricalIndex.where* self* cond* @@ -11532,16 +16499,7 @@ IUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.bool]]7 get_indexer_non_uniqueDpandas.core.indexes.category.CategoricalIndex.get_indexer_non_unique* self* -target*` -take_nd5pandas.core.indexes.category.CategoricalIndex.take_nd* -self* -args* - -kwargs*N -map1pandas.core.indexes.category.CategoricalIndex.map* -self* - -mapper*Q +target*Q delete4pandas.core.indexes.category.CategoricalIndex.delete* self* loc*[ @@ -11556,8 +16514,8 @@ IUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.bool]]7 categories8pandas.core.indexes.category.CategoricalIndex.categoriesN #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.IndexA - DatetimeIndex+pandas.core.indexes.datetimes.DatetimeIndex"7pandas.core.indexes.datetimelike.DatetimeTimedeltaMixin"5pandas.core.indexes.accessors.DatetimeIndexProperties* +Any"pandas.core.indexes.base.Index> + DatetimeIndex+pandas.core.indexes.datetimes.DatetimeIndex"7pandas.core.indexes.datetimelike.DatetimeTimedeltaMixin"5pandas.core.indexes.accessors.DatetimeIndexProperties* __init__4pandas.core.indexes.datetimes.DatetimeIndex.__init__" None*d selfZ @@ -11586,10 +16544,6 @@ kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[A freq Any * tz -Any */ - normalize - builtins.bool" builtins.bool * -closed Any *- ambiguous builtins.str" builtins.str *. @@ -11613,13 +16567,11 @@ kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[A Any *N __reduce__6pandas.core.indexes.datetimes.DatetimeIndex.__reduce__* -self* +self* to_series5pandas.core.indexes.datetimes.DatetimeIndex.to_series"H "pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries*d selfZ -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* -keep_tz -Any * ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* index Any * name @@ -11629,16 +16581,7 @@ __reduce__6pandas.core.indexes.datetimes.DatetimeIndex.__reduce__* selfZ +pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex*( freq - builtins.str" builtins.str *a - get_value5pandas.core.indexes.datetimes.DatetimeIndex.get_value* -self* - -series* -key*b -get_loc3pandas.core.indexes.datetimes.DatetimeIndex.get_loc* -self* -key* - tolerance *x + builtins.str" builtins.str *x slice_indexer9pandas.core.indexes.datetimes.DatetimeIndex.slice_indexer* self* start * @@ -11654,13 +16597,7 @@ __reduce__6pandas.core.indexes.datetimes.DatetimeIndex.__reduce__* side builtins.str" builtins.str * sorter -Any * -is_type_compatible>pandas.core.indexes.datetimes.DatetimeIndex.is_type_compatible" - builtins.bool" builtins.bool*d -selfZ -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* -typ -Any* +Any * inferred_type9pandas.core.indexes.datetimes.DatetimeIndex.inferred_type" builtins.str" builtins.str*d selfZ @@ -11689,13 +16626,7 @@ start_time include_start builtins.bool" builtins.bool *1 include_end - builtins.bool" builtins.bool * -to_perioddelta:pandas.core.indexes.datetimes.DatetimeIndex.to_perioddelta"^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex*d -selfZ -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* -freq -Any* + builtins.bool" builtins.bool * to_julian_date:pandas.core.indexes.datetimes.DatetimeIndex.to_julian_date"r .pandas.core.indexes.base.Index[builtins.float] builtins.float"builtins.float"pandas.core.indexes.base.Index*d @@ -11717,42 +16648,47 @@ AUnion[numpy.dtype[Any],pandas.core.dtypes.dtypes.DatetimeTZDtype]( Any" numpy.dtypeV )pandas.core.dtypes.dtypes.DatetimeTZDtype")pandas.core.dtypes.dtypes.DatetimeTZDtype*d selfZ -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex0:builtins.property`2 ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex0:builtins.property`2 __add__3pandas.core.indexes.datetimes.DatetimeIndex.__add__ __add__3pandas.core.indexes.datetimes.DatetimeIndex.__add__"H "pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries*\Z +pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex*JH -"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries0:typing.overloadX +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries0:typing.overloadX __add__3pandas.core.indexes.datetimes.DatetimeIndex.__add__"Z +pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex*\Z -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* -]Union[pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.indexes.timedeltas.TimedeltaIndex]T ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* +Union[datetime.timedelta,pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.indexes.timedeltas.TimedeltaIndex,pandas._libs.tslibs.offsets.BaseOffset]( +datetime.timedelta"datetime.timedeltaT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex0:typing.overloadX2 +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndexP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset0:typing.overloadX2 __sub__3pandas.core.indexes.datetimes.DatetimeIndex.__sub__ __sub__3pandas.core.indexes.datetimes.DatetimeIndex.__sub__"H "pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries*\Z +pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex*JH -"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries0:typing.overloadX +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries0:typing.overloadX __sub__3pandas.core.indexes.datetimes.DatetimeIndex.__sub__"Z +pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex*\Z -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* -]Union[pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.indexes.timedeltas.TimedeltaIndex]T ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* +Union[datetime.timedelta,pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.indexes.timedeltas.TimedeltaIndex,pandas._libs.tslibs.offsets.BaseOffset]( +datetime.timedelta"datetime.timedeltaT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex0:typing.overloadX +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndexP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset0:typing.overloadX __sub__3pandas.core.indexes.datetimes.DatetimeIndex.__sub__"^ -pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex*\Z -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* -[Union[pandas._libs.tslibs.timestamps.Timestamp,pandas.core.indexes.datetimes.DatetimeIndex]T ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* +mUnion[datetime.datetime,pandas._libs.tslibs.timestamps.Timestamp,pandas.core.indexes.datetimes.DatetimeIndex]& +datetime.datetime"datetime.datetimeT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampZ -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex0:typing.overloadXف -Indexpandas.core.indexes.base.Index"pandas.core.base.IndexOpsMixin*1 -str"pandas.core.indexes.base.Index.str" -kpandas.core.strings.StringMethods[pandas.core.indexes.base.Index.Self,pandas.core.indexes.multi.MultiIndex] -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex0:typing.overloadX +Indexpandas.core.indexes.base.Index"pandas.core.base.IndexOpsMixin*/ +str"pandas.core.indexes.base.Index.str" +pandas.core.strings.StringMethods[pandas.core.indexes.base.Index.Self,pandas.core.indexes.multi.MultiIndex,TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]]] +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -11779,66 +16715,24 @@ kpandas.core.strings.StringMethods[pandas.core.indexes.base.Index.Self,pandas.co builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(L -$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex"!pandas.core.strings.StringMethods* -self -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(0:builtins.property`* -asi8#pandas.core.indexes.base.Index.asi8" +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(L +$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex ^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] Any 5numpy.dtype[numpy._typing._array_like._ScalarType_co][ (numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_int64* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_bool"!pandas.core.strings.StringMethods* +self +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -11865,20 +16759,17 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index0:builtins.property`* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(0:builtins.property`* is_"pandas.core.indexes.base.Index.is_" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -11905,21 +16796,18 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* other -Any* +Any* __len__&pandas.core.indexes.base.Index.__len__" - builtins.int" builtins.int* -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int* +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -11946,22 +16834,19 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* __array__(pandas.core.indexes.base.Index.__array__"9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -11988,31 +16873,28 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* dtype Any *d __array_wrap__-pandas.core.indexes.base.Index.__array_wrap__* self* result* -context * +context * dtype$pandas.core.indexes.base.Index.dtype" STypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]] HUnion[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]I numpy.dtype[numpy.generic] numpy.generic" numpy.generic" numpy.dtypeP -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype"pandas._typing.DtypeObj* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype"pandas._typing.DtypeObj* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12039,20 +16921,17 @@ HUnion[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]I builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index0:builtins.property`* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index0:builtins.property`* ravel$pandas.core.indexes.base.Index.ravel" -Any* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12079,26 +16958,23 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index*) +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index*) order builtins.str" builtins.str *@ view#pandas.core.indexes.base.Index.view* self* -cls *& +cls *" astype%pandas.core.indexes.base.Index.astype"N #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any"pandas.core.indexes.base.Index* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12125,14 +17001,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* dtype TypeAlias[Union[TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],typing.Mapping[Any,Unknown]]] Union[TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],typing.Mapping[Any,Unknown]] @@ -12155,13 +17028,13 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand typing.Mapping[Any,Unknown] Any"typing.Mapping"pandas._typing.DtypeArg** copy - builtins.bool" builtins.bool * + builtins.bool" builtins.bool * take#pandas.core.indexes.base.Index.take" -Any* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12188,14 +17061,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* indices Any*( axis @@ -12212,12 +17082,12 @@ fill_value self* repeats* -axis *0 -copy#pandas.core.indexes.base.Index.copy" -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +axis *( +copy#pandas.core.indexes.base.Index.copy" +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12244,19 +17114,16 @@ fill_value builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* -self -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +self +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12283,14 +17150,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* name Any ** deep @@ -12302,14 +17166,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand __deepcopy__+pandas.core.indexes.base.Index.__deepcopy__* self* -memo * +memo * format%pandas.core.indexes.base.Index.format"J builtins.list[builtins.str] - builtins.str" builtins.str" builtins.list* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.str" builtins.str" builtins.list* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12336,14 +17200,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index** +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index** name builtins.bool" builtins.bool * formatter @@ -12352,21 +17213,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.function"builtins.function None ** na_rep - builtins.str" builtins.str *e -to_native_types.pandas.core.indexes.base.Index.to_native_types* -self* -slicer * - -kwargs*G + builtins.str" builtins.str *G to_flat_index,pandas.core.indexes.base.Index.to_flat_index* -self* +self* to_series(pandas.core.indexes.base.Index.to_series"D pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any"pandas.core.series.Series* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12393,24 +17249,21 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* index Any * name -Any * +Any * to_frame'pandas.core.indexes.base.Index.to_frame": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12437,24 +17290,21 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index*+ +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index*+ index builtins.bool" builtins.bool * name -Any * +Any * set_names(pandas.core.indexes.base.Index.set_names" -Any* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12481,70 +17331,23 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* names Any* level Any *- inplace - builtins.bool" builtins.bool * -rename%pandas.core.indexes.base.Index.rename" -Any* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* -name -Any*- -inplace - builtins.bool" builtins.bool * + builtins.bool" builtins.bool * nlevels&pandas.core.indexes.base.Index.nlevels" - builtins.int" builtins.int* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12571,20 +17374,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index0:builtins.property`* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index0:builtins.property`* sortlevel(pandas.core.indexes.base.Index.sortlevel" -Any* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12611,27 +17411,24 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* level Any */ ascending builtins.bool" builtins.bool * sort_remaining -Any * +Any * get_level_values/pandas.core.indexes.base.Index.get_level_values"N #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any"pandas.core.indexes.base.Index* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12658,24 +17455,21 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index*k +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index*k level` Union[builtins.int,builtins.str] builtins.int" builtins.int - builtins.str" builtins.str* + builtins.str" builtins.str* droplevel(pandas.core.indexes.base.Index.droplevel" -Any* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12702,27 +17496,24 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* level LUnion[TypeAlias[Union[typing.Hashable,builtins.int]],builtins.list[Unknown]] .TypeAlias[Union[typing.Hashable,builtins.int]]i #Union[typing.Hashable,builtins.int]" typing.Hashable"typing.Hashable builtins.int" builtins.int"pandas._typing.Level) -builtins.list[Unknown]" builtins.list * +builtins.list[Unknown]" builtins.list * is_monotonic_increasing6pandas.core.indexes.base.Index.is_monotonic_increasing" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12749,20 +17540,17 @@ LUnion[TypeAlias[Union[typing.Hashable,builtins.int]],builtins.list[Unknown]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index0:builtins.property`* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index0:builtins.property`* is_monotonic_decreasing6pandas.core.indexes.base.Index.is_monotonic_decreasing" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12789,20 +17577,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index0:builtins.property`* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index0:builtins.property`* is_unique(pandas.core.indexes.base.Index.is_unique" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12829,20 +17614,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index0:builtins.property`* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index0:builtins.property`* has_duplicates-pandas.core.indexes.base.Index.has_duplicates" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12869,21 +17651,18 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index0:builtins.property`* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index0:builtins.property`* is_boolean)pandas.core.indexes.base.Index.is_boolean" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12910,21 +17689,18 @@ is_boolean)pandas.core.indexes.base.Index.is_boolean" builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* is_integer)pandas.core.indexes.base.Index.is_integer" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12951,20 +17727,17 @@ is_integer)pandas.core.indexes.base.Index.is_integer" builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* is_floating*pandas.core.indexes.base.Index.is_floating" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12991,21 +17764,18 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* is_numeric)pandas.core.indexes.base.Index.is_numeric" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13032,20 +17802,17 @@ is_numeric)pandas.core.indexes.base.Index.is_numeric" builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* is_object(pandas.core.indexes.base.Index.is_object" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13072,20 +17839,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* is_categorical-pandas.core.indexes.base.Index.is_categorical" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13112,20 +17876,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* is_interval*pandas.core.indexes.base.Index.is_interval" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13152,20 +17913,19 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* -is_mixed'pandas.core.indexes.base.Index.is_mixed" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index*G + holds_integer,pandas.core.indexes.base.Index.holds_integer* +self* + inferred_type,pandas.core.indexes.base.Index.inferred_type" + builtins.str" builtins.str* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13192,27 +17952,20 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index*G - holds_integer,pandas.core.indexes.base.Index.holds_integer* -self*^ - inferred_type,pandas.core.indexes.base.Index.inferred_type* -self0:builtins.property`*A +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index0:builtins.property`*A __reduce__)pandas.core.indexes.base.Index.__reduce__* -self* +self* hasnans&pandas.core.indexes.base.Index.hasnans" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13239,14 +17992,11 @@ __reduce__)pandas.core.indexes.base.Index.__reduce__* builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index0:builtins.property`*5 +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index0:builtins.property`*5 isna#pandas.core.indexes.base.Index.isna* self*7 notna$pandas.core.indexes.base.Index.notna* @@ -13254,12 +18004,12 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand fillna%pandas.core.indexes.base.Index.fillna* self* value * -downcast *0 -dropna%pandas.core.indexes.base.Index.dropna" -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +downcast *) +dropna%pandas.core.indexes.base.Index.dropna" +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13286,19 +18036,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* -self -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +self +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13325,25 +18072,22 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* how 2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str */ -unique%pandas.core.indexes.base.Index.unique" -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.str" builtins.str *( +unique%pandas.core.indexes.base.Index.unique" +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13370,19 +18114,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* -self -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +self +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13409,21 +18150,18 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* level -Any *3 -drop_duplicates.pandas.core.indexes.base.Index.drop_duplicates" -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any *+ +drop_duplicates.pandas.core.indexes.base.Index.drop_duplicates" +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13450,19 +18188,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* -self -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +self +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13489,14 +18224,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* keep [Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],Literal[builtins.bool]] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] @@ -13506,7 +18238,7 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand Literal[builtins.str]  builtins.str" builtins.str"pandas._typing.NaPosition: Literal[builtins.bool]  - builtins.bool" builtins.bool * + builtins.bool" builtins.bool * duplicated)pandas.core.indexes.base.Index.duplicated" ^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] @@ -13515,59 +18247,11 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] Any 5numpy.dtype[numpy._typing._array_like._ScalarType_co][ (numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* -keep -IUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.bool]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str: -Literal[builtins.bool]  - builtins.bool" builtins.bool * -__and__&pandas.core.indexes.base.Index.__and__" -NoReturn -* -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13594,22 +18278,64 @@ IUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.bool]]7 builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* +keep +IUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.bool]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str: +Literal[builtins.bool]  + builtins.bool" builtins.bool * +__and__&pandas.core.indexes.base.Index.__and__" +NoReturn +* +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* NoReturn -* +* __rand__'pandas.core.indexes.base.Index.__rand__" NoReturn -* -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +* +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13636,22 +18362,19 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* NoReturn -* +* __or__%pandas.core.indexes.base.Index.__or__" NoReturn -* -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +* +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13678,22 +18401,19 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* NoReturn -* +* __ror__&pandas.core.indexes.base.Index.__ror__" NoReturn -* -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +* +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13720,22 +18440,19 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* NoReturn -* +* __xor__&pandas.core.indexes.base.Index.__xor__" NoReturn -* -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +* +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13762,22 +18479,19 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* NoReturn -* +* __rxor__'pandas.core.indexes.base.Index.__rxor__" NoReturn -* -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +* +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13804,21 +18518,18 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* NoReturn -*/ -__neg__&pandas.core.indexes.base.Index.__neg__" -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +*( +__neg__&pandas.core.indexes.base.Index.__neg__" +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13845,18 +18556,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13883,20 +18591,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* __nonzero__*pandas.core.indexes.base.Index.__nonzero__" -None* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +None* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13923,21 +18628,18 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* union$pandas.core.indexes.base.Index.union"N #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any"pandas.core.indexes.base.Index* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13964,14 +18666,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* other RUnion[builtins.list[pandas._typing.HashableT],pandas.core.indexes.base.Index[Any]] 'builtins.list[pandas._typing.HashableT]Q @@ -13980,12 +18679,12 @@ RUnion[builtins.list[pandas._typing.HashableT],pandas.core.indexes.base.Index[An #pandas.core.indexes.base.Index[Any] Any"pandas.core.indexes.base.Index* sort -Any *^ - intersection+pandas.core.indexes.base.Index.intersection" -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any *P + intersection+pandas.core.indexes.base.Index.intersection" +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14012,19 +18711,16 @@ RUnion[builtins.list[pandas._typing.HashableT],pandas.core.indexes.base.Index[An builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* -self -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +self +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14051,19 +18747,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(*. -other. -KUnion[builtins.list[pandas._typing.S1],pandas.core.indexes.base.Index.Self] - builtins.list[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(*' +other' +KUnion[builtins.list[pandas._typing.S1],pandas.core.indexes.base.Index.Self] + builtins.list[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14090,18 +18783,15 @@ KUnion[builtins.list[pandas._typing.S1],pandas.core.indexes.base.Index.Self] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype" builtins.list -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset" builtins.list +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14128,22 +18818,19 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(** +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(** sort - builtins.bool" builtins.bool *1 + builtins.bool" builtins.bool ** -difference)pandas.core.indexes.base.Index.difference" -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +difference)pandas.core.indexes.base.Index.difference" +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14170,19 +18857,16 @@ difference)pandas.core.indexes.base.Index.difference" builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* -self -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +self +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14209,14 +18893,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* other =Union[builtins.list[Any],pandas.core.indexes.base.Index[Any]], builtins.list[Any] @@ -14226,12 +18907,12 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand sortG Union[builtins.bool,None] builtins.bool" builtins.bool -None *_ -symmetric_difference3pandas.core.indexes.base.Index.symmetric_difference" -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +None *P +symmetric_difference3pandas.core.indexes.base.Index.symmetric_difference" +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14258,19 +18939,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* -self -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +self +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14297,19 +18975,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(*. -other. -KUnion[builtins.list[pandas._typing.S1],pandas.core.indexes.base.Index.Self] - builtins.list[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(*' +other' +KUnion[builtins.list[pandas._typing.S1],pandas.core.indexes.base.Index.Self] + builtins.list[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14336,18 +19011,15 @@ KUnion[builtins.list[pandas._typing.S1],pandas.core.indexes.base.Index.Self] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype" builtins.list -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset" builtins.list +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14374,24 +19046,30 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* result_name Any * sort -Any * -get_loc&pandas.core.indexes.base.Index.get_loc" -Any* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any * +get_loc&pandas.core.indexes.base.Index.get_loc" +Union[builtins.int,builtins.slice,TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]]] + builtins.int" builtins.int +builtins.slice"builtins.slice +^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14418,14 +19096,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* key &TypeAlias[Union[typing.Hashable,None]]M Union[typing.Hashable,None]" @@ -14462,13 +19137,13 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st method * level * limit * - tolerance * + tolerance * join#pandas.core.indexes.base.Index.join" -Any* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14495,14 +19170,11 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* other Any*' how @@ -14512,15 +19184,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand return_indexers builtins.bool" builtins.bool ** sort - builtins.bool" builtins.bool * + builtins.bool" builtins.bool * values%pandas.core.indexes.base.Index.values"9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14547,20 +19219,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index0:builtins.property`* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index0:builtins.property`* array$pandas.core.indexes.base.Index.array"P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14587,20 +19256,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index0:builtins.property`* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index0:builtins.property`* memory_usage+pandas.core.indexes.base.Index.memory_usage" -Any* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14627,67 +19293,22 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index** +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index** deep builtins.bool" builtins.bool *N where$pandas.core.indexes.base.Index.where* self* cond* -other * -is_type_compatible1pandas.core.indexes.base.Index.is_type_compatible" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* -kind -Any* +other * __contains__+pandas.core.indexes.base.Index.__contains__" - builtins.bool" builtins.bool* -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14714,20 +19335,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index*  -Any* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index*  +Any* __setitem__*pandas.core.indexes.base.Index.__setitem__" -None* -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +None* +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14754,14 +19372,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index*  +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index*  Any*  Any*D append%pandas.core.indexes.base.Index.append* @@ -14770,13 +19385,13 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand putmask&pandas.core.indexes.base.Index.putmask* self* mask* -value* +value* equals%pandas.core.indexes.base.Index.equals" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14803,22 +19418,19 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* other -Any* +Any* identical(pandas.core.indexes.base.Index.identical" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14845,14 +19457,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* other Any*@ asof#pandas.core.indexes.base.Index.asof* @@ -14861,13 +19470,13 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand asof_locs(pandas.core.indexes.base.Index.asof_locs* self* where* -mask* +mask* sort_values*pandas.core.indexes.base.Index.sort_values" -Any* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14894,24 +19503,21 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index*4 +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index*4 return_indexer builtins.bool" builtins.bool */ ascending - builtins.bool" builtins.bool * + builtins.bool" builtins.bool * sort#pandas.core.indexes.base.Index.sort" -None* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +None* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14938,24 +19544,21 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* args Any* kwargs -Any* +Any* shift$pandas.core.indexes.base.Index.shift" -None* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +None* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14982,14 +19585,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index*+ +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index*+ periods builtins.int" builtins.int * freq @@ -14998,58 +19598,7 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand self* args* -kwargs*T - get_value(pandas.core.indexes.base.Index.get_value* -self* - -series* -key* - set_value(pandas.core.indexes.base.Index.set_value" -None* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* -arr -Any* -key -Any* -value -Any*e +kwargs*e get_indexer_non_unique5pandas.core.indexes.base.Index.get_indexer_non_unique* self* @@ -15059,17 +19608,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand target* -kwargs* +kwargs* groupby&pandas.core.indexes.base.Index.groupby" 5builtins.dict[typing.Hashable,numpy.ndarray[Any,Any]]" typing.Hashable"typing.Hashable9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray" builtins.dict* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray" builtins.dict* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -15096,23 +19645,20 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* values -Any* +Any0: typing.finalP* map"pandas.core.indexes.base.Index.map"N #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any"pandas.core.indexes.base.Index* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -15139,18 +19685,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* mapper Any* na_action -Any * +Any * isin#pandas.core.indexes.base.Index.isin" ^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] @@ -15158,11 +19701,11 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] Any 5numpy.dtype[numpy._typing._array_like._ScalarType_co][ (numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -15189,14 +19732,11 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* values Any* level @@ -15224,12 +19764,12 @@ slice_locs)pandas.core.indexes.base.Index.slice_locs* insert%pandas.core.indexes.base.Index.insert* self* loc* -item*0 -drop#pandas.core.indexes.base.Index.drop" -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +item*( +drop#pandas.core.indexes.base.Index.drop" +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -15256,19 +19796,16 @@ slice_locs)pandas.core.indexes.base.Index.slice_locs* builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* -self -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +self +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -15295,25 +19832,22 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* labels Any** errors - builtins.str" builtins.str * + builtins.str" builtins.str * shape$pandas.core.indexes.base.Index.shape"L builtins.tuple[builtins.int] - builtins.int" builtins.int"builtins.tuple* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"builtins.tuple* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -15340,14 +19874,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index0:builtins.property`* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index0:builtins.property`* __eq__%pandas.core.indexes.base.Index.__eq__" ^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] @@ -15355,10 +19886,10 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] Any 5numpy.dtype[numpy._typing._array_like._ScalarType_co][ (numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_bool* -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_bool* +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -15385,19 +19916,16 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index*$" -builtins.object"builtins.object*. -__iter__'pandas.core.indexes.base.Index.__iter__" -"typing.Iterator[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index*$" +builtins.object"builtins.object*& +__iter__'pandas.core.indexes.base.Index.__iter__" +"typing.Iterator[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -15424,17 +19952,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"typing.Iterator* -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Iterator* +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -15461,14 +19986,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* __ne__%pandas.core.indexes.base.Index.__ne__" ^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] @@ -15476,10 +19998,10 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] Any 5numpy.dtype[numpy._typing._array_like._ScalarType_co][ (numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_bool* -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_bool* +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -15506,15 +20028,12 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index*$" -builtins.object"builtins.object*J +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index*$" +builtins.object"builtins.object*? __le__%pandas.core.indexes.base.Index.__le__" ^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] @@ -15522,11 +20041,11 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] Any 5numpy.dtype[numpy._typing._array_like._ScalarType_co][ (numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_bool* -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_bool* +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -15553,19 +20072,161 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(*'' + +rename%pandas.core.indexes.base.Index.rename) +rename%pandas.core.indexes.base.Index.rename" +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -17939,18 +22574,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +self +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -17977,35 +22610,22 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(*  -Union[builtins.slice,TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],typing.Sequence[builtins.int],pandas.core.indexes.base.Index[Any],pandas.core.series.Series[builtins.bool],typing.Sequence[builtins.bool],TypeAlias[Unknown]] -builtins.slice"builtins.slice -^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] -STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] -Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] -Any -5numpy.dtype[numpy._typing._array_like._ScalarType_co][ -(numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray" pandas._typing.np_ndarray_anyintN -typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.SequenceN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Indexe -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.SeriesQ -typing.Sequence[builtins.bool] - builtins.bool" builtins.bool"typing.Sequence8 -TypeAlias[Unknown]"pandas._typing.np_ndarray_bool0:typing.overloadX4 - __getitem__*pandas.core.indexes.base.Index.__getitem__" -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +name +Any*I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool 0:typing.overloadX +rename%pandas.core.indexes.base.Index.rename" +None* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -18032,17 +22652,22 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype* -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* +name +Any*G +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool0:typing.overloadX2_ + __getitem__*pandas.core.indexes.base.Index.__getitem__2 + __getitem__*pandas.core.indexes.base.Index.__getitem__" +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -18069,38 +22694,67 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* -Union[builtins.int,builtins.tuple[TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]]]] - builtins.int" builtins.int -nbuiltins.tuple[TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]]] +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(*  +Union[builtins.slice,TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],typing.Sequence[builtins.int],pandas.core.indexes.base.Index[Any],pandas.core.series.Series[builtins.bool],typing.Sequence[builtins.bool],TypeAlias[Unknown]] +builtins.slice"builtins.slice ^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] Any 5numpy.dtype[numpy._typing._array_like._ScalarType_co][ (numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray" pandas._typing.np_ndarray_anyint"builtins.tuple0:typing.overloadX24 -__mul__&pandas.core.indexes.base.Index.__mul__ -__mul__&pandas.core.indexes.base.Index.__mul__"^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex* -bUnion[pandas.core.indexes.base.Index[builtins.int],pandas.core.indexes.base.Index[builtins.float]]l -,pandas.core.indexes.base.Index[builtins.int] - builtins.int" builtins.int"pandas.core.indexes.base.Indexr -.pandas.core.indexes.base.Index[builtins.float] -builtins.float"builtins.float"pandas.core.indexes.base.Index**( -datetime.timedelta"datetime.timedelta0:typing.overloadX/ -__mul__&pandas.core.indexes.base.Index.__mul__" -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray" pandas._typing.np_ndarray_anyintN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.SequenceN +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Indexe +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.SeriesQ +typing.Sequence[builtins.bool] + builtins.bool" builtins.bool"typing.Sequence8 +TypeAlias[Unknown]"pandas._typing.np_ndarray_bool0:typing.overloadX- + __getitem__*pandas.core.indexes.base.Index.__getitem__" +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -18127,18 +22781,14 @@ bUnion[pandas.core.indexes.base.Index[builtins.int],pandas.core.indexes.base.Ind builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset* +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -18165,30 +22815,35 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(*  -Any0:typing.overloadX23 - __truediv__*pandas.core.indexes.base.Index.__truediv__ - __truediv__*pandas.core.indexes.base.Index.__truediv__" -NoReturn -* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* +Union[builtins.int,builtins.tuple[TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]]]] + builtins.int" builtins.int +nbuiltins.tuple[TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]]] +^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray" pandas._typing.np_ndarray_anyint"builtins.tuple0:typing.overloadX2- +__mul__&pandas.core.indexes.base.Index.__mul__ +__mul__&pandas.core.indexes.base.Index.__mul__"^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex* bUnion[pandas.core.indexes.base.Index[builtins.int],pandas.core.indexes.base.Index[builtins.float]]l ,pandas.core.indexes.base.Index[builtins.int] builtins.int" builtins.int"pandas.core.indexes.base.Indexr .pandas.core.indexes.base.Index[builtins.float] builtins.float"builtins.float"pandas.core.indexes.base.Index**( -datetime.timedelta"datetime.timedelta0:typing.overloadX/ - __truediv__*pandas.core.indexes.base.Index.__truediv__" -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +datetime.timedelta"datetime.timedelta0:typing.overloadX( +__mul__&pandas.core.indexes.base.Index.__mul__" +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -18210,23 +22865,20 @@ bUnion[pandas.core.indexes.base.Index[builtins.int],pandas.core.indexes.base.Ind Type[builtins.complex]$ builtins.complex"builtins.complex"type= Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -18253,14 +22905,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(*  +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(*  Any0:typing.overloadXPr= __hash__'pandas.core.indexes.base.Index.__hash__ NonerW @@ -18269,24 +22918,656 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand notnull&pandas.core.indexes.base.Index.notnull& builtins.ellipsis"builtins.ellipsisr[ __bool__'pandas.core.indexes.base.Index.__bool__& -builtins.ellipsis"builtins.ellipsis +builtins.ellipsis"builtins.ellipsis IntervalIndex*pandas.core.indexes.interval.IntervalIndex",pandas.core.indexes.extension.ExtensionIndex"#pandas._libs.interval.IntervalMixin* __new__2pandas.core.indexes.interval.IntervalIndex.__new__" Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] pandas._typing.IntervalTN #pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* +cls +JType[pandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT]] +Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex"type* +data +)typing.Sequence[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"typing.Sequence* +closed +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"!pandas._typing.IntervalClosedType * +dtype +3Union[pandas.core.dtypes.dtypes.IntervalDtype,None]R +'pandas.core.dtypes.dtypes.IntervalDtype"'pandas.core.dtypes.dtypes.IntervalDtype +None ** +copy + builtins.bool" builtins.bool *. +name" +typing.Hashable"typing.Hashable *6 +verify_integrity + builtins.bool" builtins.bool * + to_tuples4pandas.core.indexes.interval.IntervalIndex.to_tuples"N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index* +self +Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex*. +na_tuple + builtins.bool" builtins.bool * +astype1pandas.core.indexes.interval.IntervalIndex.astype"f +/pandas.core.indexes.interval.IntervalIndex[Any] +Any"*pandas.core.indexes.interval.IntervalIndex* +self +Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* +dtype +TypeAlias[Union[TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],typing.Mapping[Any,Unknown]]] +Union[TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],typing.Mapping[Any,Unknown]] +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype8 +typing.Mapping[Any,Unknown] +Any"typing.Mapping"pandas._typing.DtypeArg** +copy + builtins.bool" builtins.bool * + inferred_type8pandas.core.indexes.interval.IntervalIndex.inferred_type" + builtins.str" builtins.str* +self +Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex0:builtins.property`* + memory_usage7pandas.core.indexes.interval.IntervalIndex.memory_usage" + builtins.int" builtins.int* +self +Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex** +deep + builtins.bool" builtins.bool * +is_overlapping9pandas.core.indexes.interval.IntervalIndex.is_overlapping" + builtins.bool" builtins.bool* +self +Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex0:builtins.property`* +get_loc2pandas.core.indexes.interval.IntervalIndex.get_loc" +vUnion[builtins.int,builtins.slice,TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] + builtins.int" builtins.int +builtins.slice"builtins.slice +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray* +self +Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* +key +&TypeAlias[Union[typing.Hashable,None]]M +Union[typing.Hashable,None]" +typing.Hashable"typing.Hashable +None"pandas._typing.Label* +method +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],Literal[builtins.str],None] +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.FillnaOptions7 +Literal[builtins.str]  + builtins.str" builtins.str +None * + tolerance +Any * + get_indexer6pandas.core.indexes.interval.IntervalIndex.get_indexer" +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray* +self +Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex*Z +targetN +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index* +method +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],Literal[builtins.str],None] +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.FillnaOptions7 +Literal[builtins.str]  + builtins.str" builtins.str +None *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None * + tolerance +Any * +get_indexer_non_uniqueApandas.core.indexes.interval.IntervalIndex.get_indexer_non_unique"* +self +Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex*Z +targetN +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index* +left/pandas.core.indexes.interval.IntervalIndex.left"N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index* +self +Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex0:builtins.property`* +right0pandas.core.indexes.interval.IntervalIndex.right"N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index* +self +Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex0:builtins.property`* +mid.pandas.core.indexes.interval.IntervalIndex.mid"N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index* +self +Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex0:builtins.property`* +length1pandas.core.indexes.interval.IntervalIndex.length"N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index* +self +Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex0:builtins.property`2Z + from_breaks6pandas.core.indexes.interval.IntervalIndex.from_breaks + from_breaks6pandas.core.indexes.interval.IntervalIndex.from_breaks" +Xpandas.core.indexes.interval.IntervalIndex[pandas._libs.interval.Interval[builtins.int]]l +,pandas._libs.interval.Interval[builtins.int] + builtins.int" builtins.int"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* +cls +JType[pandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT]] +Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex"type* +breaks +TypeAlias[Union[typing.Sequence[builtins.int],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],Unknown,Unknown,pandas.core.series.Series[builtins.int],pandas.core.indexes.base.Index[builtins.int]]] +Union[typing.Sequence[builtins.int],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],Unknown,Unknown,pandas.core.series.Series[builtins.int],pandas.core.indexes.base.Index[builtins.int]]N +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.Sequence +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArrayb +'pandas.core.series.Series[builtins.int] + builtins.int" builtins.int"pandas.core.series.Seriesl +,pandas.core.indexes.base.Index[builtins.int] + builtins.int" builtins.int"pandas.core.indexes.base.Index"&pandas.core.indexes.interval._EdgesInt* +closed +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"!pandas._typing.IntervalClosedType *. +name" +typing.Hashable"typing.Hashable ** +copy + builtins.bool" builtins.bool * +dtype +3Union[pandas.core.dtypes.dtypes.IntervalDtype,None]R +'pandas.core.dtypes.dtypes.IntervalDtype"'pandas.core.dtypes.dtypes.IntervalDtype +None 0:typing.overload:builtins.classmethodXp + from_breaks6pandas.core.indexes.interval.IntervalIndex.from_breaks" +Zpandas.core.indexes.interval.IntervalIndex[pandas._libs.interval.Interval[builtins.float]]r +.pandas._libs.interval.Interval[builtins.float] +builtins.float"builtins.float"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* +cls +JType[pandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT]] +Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex"type* +breaks +TypeAlias[Union[typing.Sequence[builtins.float],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],pandas.core.series.Series[builtins.float],pandas.core.indexes.base.Index[builtins.float]]] +Union[typing.Sequence[builtins.float],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],pandas.core.series.Series[builtins.float],pandas.core.indexes.base.Index[builtins.float]]T +typing.Sequence[builtins.float] +builtins.float"builtins.float"typing.Sequence +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArrayh +)pandas.core.series.Series[builtins.float] +builtins.float"builtins.float"pandas.core.series.Seriesr +.pandas.core.indexes.base.Index[builtins.float] +builtins.float"builtins.float"pandas.core.indexes.base.Index"(pandas.core.indexes.interval._EdgesFloat* +closed +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"!pandas._typing.IntervalClosedType *. +name" +typing.Hashable"typing.Hashable ** +copy + builtins.bool" builtins.bool * +dtype +3Union[pandas.core.dtypes.dtypes.IntervalDtype,None]R +'pandas.core.dtypes.dtypes.IntervalDtype"'pandas.core.dtypes.dtypes.IntervalDtype +None 0:typing.overload:builtins.classmethodXp + from_breaks6pandas.core.indexes.interval.IntervalIndex.from_breaks" +tpandas.core.indexes.interval.IntervalIndex[pandas._libs.interval.Interval[pandas._libs.tslibs.timestamps.Timestamp]] +Hpandas._libs.interval.Interval[pandas._libs.tslibs.timestamps.Timestamp]T +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* +cls +JType[pandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT]] +Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex"type* +breaks +TypeAlias[Union[typing.Sequence[TypeAlias[Union[datetime.datetime,numpy.datetime64,pandas._libs.tslibs.timestamps.Timestamp]]],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],pandas.core.series.TimestampSeries,pandas.core.indexes.datetimes.DatetimeIndex]] + +Union[typing.Sequence[TypeAlias[Union[datetime.datetime,numpy.datetime64,pandas._libs.tslibs.timestamps.Timestamp]]],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],pandas.core.series.TimestampSeries,pandas.core.indexes.datetimes.DatetimeIndex] +ntyping.Sequence[TypeAlias[Union[datetime.datetime,numpy.datetime64,pandas._libs.tslibs.timestamps.Timestamp]]] +]TypeAlias[Union[datetime.datetime,numpy.datetime64,pandas._libs.tslibs.timestamps.Timestamp]] +RUnion[datetime.datetime,numpy.datetime64,pandas._libs.tslibs.timestamps.Timestamp]& +datetime.datetime"datetime.datetime$ +numpy.datetime64"numpy.datetime64T +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"pandas._typing.DatetimeLike"typing.Sequence +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArrayH +"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeriesZ ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex",pandas.core.indexes.interval._EdgesTimestamp* +closed +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"!pandas._typing.IntervalClosedType *. +name" +typing.Hashable"typing.Hashable ** +copy + builtins.bool" builtins.bool * +dtype +3Union[pandas.core.dtypes.dtypes.IntervalDtype,None]R +'pandas.core.dtypes.dtypes.IntervalDtype"'pandas.core.dtypes.dtypes.IntervalDtype +None 0:typing.overload:builtins.classmethodXp + from_breaks6pandas.core.indexes.interval.IntervalIndex.from_breaks" +tpandas.core.indexes.interval.IntervalIndex[pandas._libs.interval.Interval[pandas._libs.tslibs.timedeltas.Timedelta]] +Hpandas._libs.interval.Interval[pandas._libs.tslibs.timedeltas.Timedelta]T +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* +cls +JType[pandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT]] +Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex"type* +breaks +TypeAlias[Union[typing.Sequence[pandas._libs.tslibs.timedeltas.Timedelta],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],pandas.core.series.TimedeltaSeries,pandas.core.indexes.timedeltas.TimedeltaIndex]] +Union[typing.Sequence[pandas._libs.tslibs.timedeltas.Timedelta],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],pandas.core.series.TimedeltaSeries,pandas.core.indexes.timedeltas.TimedeltaIndex] +9typing.Sequence[pandas._libs.tslibs.timedeltas.Timedelta]T +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"typing.Sequence +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArrayH +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex",pandas.core.indexes.interval._EdgesTimedelta* +closed +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"!pandas._typing.IntervalClosedType *. +name" +typing.Hashable"typing.Hashable ** +copy + builtins.bool" builtins.bool * +dtype +3Union[pandas.core.dtypes.dtypes.IntervalDtype,None]R +'pandas.core.dtypes.dtypes.IntervalDtype"'pandas.core.dtypes.dtypes.IntervalDtype +None 0:typing.overload:builtins.classmethodXp2 + from_arrays6pandas.core.indexes.interval.IntervalIndex.from_arrays + from_arrays6pandas.core.indexes.interval.IntervalIndex.from_arrays" +Xpandas.core.indexes.interval.IntervalIndex[pandas._libs.interval.Interval[builtins.int]]l +,pandas._libs.interval.Interval[builtins.int] + builtins.int" builtins.int"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* +cls +JType[pandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT]] +Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex"type* +left +TypeAlias[Union[typing.Sequence[builtins.int],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],Unknown,Unknown,pandas.core.series.Series[builtins.int],pandas.core.indexes.base.Index[builtins.int]]] +Union[typing.Sequence[builtins.int],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],Unknown,Unknown,pandas.core.series.Series[builtins.int],pandas.core.indexes.base.Index[builtins.int]]N +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.Sequence +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArrayb +'pandas.core.series.Series[builtins.int] + builtins.int" builtins.int"pandas.core.series.Seriesl +,pandas.core.indexes.base.Index[builtins.int] + builtins.int" builtins.int"pandas.core.indexes.base.Index"&pandas.core.indexes.interval._EdgesInt* +right +TypeAlias[Union[typing.Sequence[builtins.int],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],Unknown,Unknown,pandas.core.series.Series[builtins.int],pandas.core.indexes.base.Index[builtins.int]]] +Union[typing.Sequence[builtins.int],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],Unknown,Unknown,pandas.core.series.Series[builtins.int],pandas.core.indexes.base.Index[builtins.int]]N +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.Sequence +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArrayb +'pandas.core.series.Series[builtins.int] + builtins.int" builtins.int"pandas.core.series.Seriesl +,pandas.core.indexes.base.Index[builtins.int] + builtins.int" builtins.int"pandas.core.indexes.base.Index"&pandas.core.indexes.interval._EdgesInt* +closed +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"!pandas._typing.IntervalClosedType *. +name" +typing.Hashable"typing.Hashable ** +copy + builtins.bool" builtins.bool * +dtype +3Union[pandas.core.dtypes.dtypes.IntervalDtype,None]R +'pandas.core.dtypes.dtypes.IntervalDtype"'pandas.core.dtypes.dtypes.IntervalDtype +None 0:typing.overload:builtins.classmethodXp + from_arrays6pandas.core.indexes.interval.IntervalIndex.from_arrays" +Zpandas.core.indexes.interval.IntervalIndex[pandas._libs.interval.Interval[builtins.float]]r +.pandas._libs.interval.Interval[builtins.float] +builtins.float"builtins.float"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* +cls +JType[pandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT]] +Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex"type* +left +TypeAlias[Union[typing.Sequence[builtins.float],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],pandas.core.series.Series[builtins.float],pandas.core.indexes.base.Index[builtins.float]]] +Union[typing.Sequence[builtins.float],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],pandas.core.series.Series[builtins.float],pandas.core.indexes.base.Index[builtins.float]]T +typing.Sequence[builtins.float] +builtins.float"builtins.float"typing.Sequence +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArrayh +)pandas.core.series.Series[builtins.float] +builtins.float"builtins.float"pandas.core.series.Seriesr +.pandas.core.indexes.base.Index[builtins.float] +builtins.float"builtins.float"pandas.core.indexes.base.Index"(pandas.core.indexes.interval._EdgesFloat* +right +TypeAlias[Union[typing.Sequence[builtins.float],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],pandas.core.series.Series[builtins.float],pandas.core.indexes.base.Index[builtins.float]]] +Union[typing.Sequence[builtins.float],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],pandas.core.series.Series[builtins.float],pandas.core.indexes.base.Index[builtins.float]]T +typing.Sequence[builtins.float] +builtins.float"builtins.float"typing.Sequence +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArrayh +)pandas.core.series.Series[builtins.float] +builtins.float"builtins.float"pandas.core.series.Seriesr +.pandas.core.indexes.base.Index[builtins.float] +builtins.float"builtins.float"pandas.core.indexes.base.Index"(pandas.core.indexes.interval._EdgesFloat* +closed +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"!pandas._typing.IntervalClosedType *. +name" +typing.Hashable"typing.Hashable ** +copy + builtins.bool" builtins.bool * +dtype +3Union[pandas.core.dtypes.dtypes.IntervalDtype,None]R +'pandas.core.dtypes.dtypes.IntervalDtype"'pandas.core.dtypes.dtypes.IntervalDtype +None 0:typing.overload:builtins.classmethodXp' + from_arrays6pandas.core.indexes.interval.IntervalIndex.from_arrays" +tpandas.core.indexes.interval.IntervalIndex[pandas._libs.interval.Interval[pandas._libs.tslibs.timestamps.Timestamp]] +Hpandas._libs.interval.Interval[pandas._libs.tslibs.timestamps.Timestamp]T +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* +cls +JType[pandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT]] +Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex"type* +left +TypeAlias[Union[typing.Sequence[TypeAlias[Union[datetime.datetime,numpy.datetime64,pandas._libs.tslibs.timestamps.Timestamp]]],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],pandas.core.series.TimestampSeries,pandas.core.indexes.datetimes.DatetimeIndex]] + +Union[typing.Sequence[TypeAlias[Union[datetime.datetime,numpy.datetime64,pandas._libs.tslibs.timestamps.Timestamp]]],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],pandas.core.series.TimestampSeries,pandas.core.indexes.datetimes.DatetimeIndex] +ntyping.Sequence[TypeAlias[Union[datetime.datetime,numpy.datetime64,pandas._libs.tslibs.timestamps.Timestamp]]] +]TypeAlias[Union[datetime.datetime,numpy.datetime64,pandas._libs.tslibs.timestamps.Timestamp]] +RUnion[datetime.datetime,numpy.datetime64,pandas._libs.tslibs.timestamps.Timestamp]& +datetime.datetime"datetime.datetime$ +numpy.datetime64"numpy.datetime64T +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"pandas._typing.DatetimeLike"typing.Sequence +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArrayH +"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeriesZ ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex",pandas.core.indexes.interval._EdgesTimestamp* +right +TypeAlias[Union[typing.Sequence[TypeAlias[Union[datetime.datetime,numpy.datetime64,pandas._libs.tslibs.timestamps.Timestamp]]],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],pandas.core.series.TimestampSeries,pandas.core.indexes.datetimes.DatetimeIndex]] + +Union[typing.Sequence[TypeAlias[Union[datetime.datetime,numpy.datetime64,pandas._libs.tslibs.timestamps.Timestamp]]],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],pandas.core.series.TimestampSeries,pandas.core.indexes.datetimes.DatetimeIndex] +ntyping.Sequence[TypeAlias[Union[datetime.datetime,numpy.datetime64,pandas._libs.tslibs.timestamps.Timestamp]]] +]TypeAlias[Union[datetime.datetime,numpy.datetime64,pandas._libs.tslibs.timestamps.Timestamp]] +RUnion[datetime.datetime,numpy.datetime64,pandas._libs.tslibs.timestamps.Timestamp]& +datetime.datetime"datetime.datetime$ +numpy.datetime64"numpy.datetime64T +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"pandas._typing.DatetimeLike"typing.Sequence +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArrayH +"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeriesZ ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex",pandas.core.indexes.interval._EdgesTimestamp* +closed +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"!pandas._typing.IntervalClosedType *. +name" +typing.Hashable"typing.Hashable ** +copy + builtins.bool" builtins.bool * +dtype +3Union[pandas.core.dtypes.dtypes.IntervalDtype,None]R +'pandas.core.dtypes.dtypes.IntervalDtype"'pandas.core.dtypes.dtypes.IntervalDtype +None 0:typing.overload:builtins.classmethodXp + from_arrays6pandas.core.indexes.interval.IntervalIndex.from_arrays" +tpandas.core.indexes.interval.IntervalIndex[pandas._libs.interval.Interval[pandas._libs.tslibs.timedeltas.Timedelta]] +Hpandas._libs.interval.Interval[pandas._libs.tslibs.timedeltas.Timedelta]T +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* cls JType[pandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT]] Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] pandas._typing.IntervalTN #pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex"type* -data -)typing.Sequence[pandas._typing.IntervalT] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex"type* +left +TypeAlias[Union[typing.Sequence[pandas._libs.tslibs.timedeltas.Timedelta],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],pandas.core.series.TimedeltaSeries,pandas.core.indexes.timedeltas.TimedeltaIndex]] +Union[typing.Sequence[pandas._libs.tslibs.timedeltas.Timedelta],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],pandas.core.series.TimedeltaSeries,pandas.core.indexes.timedeltas.TimedeltaIndex] +9typing.Sequence[pandas._libs.tslibs.timedeltas.Timedelta]T +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"typing.Sequence +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArrayH +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex",pandas.core.indexes.interval._EdgesTimedelta* +right +TypeAlias[Union[typing.Sequence[pandas._libs.tslibs.timedeltas.Timedelta],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],pandas.core.series.TimedeltaSeries,pandas.core.indexes.timedeltas.TimedeltaIndex]] +Union[typing.Sequence[pandas._libs.tslibs.timedeltas.Timedelta],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],pandas.core.series.TimedeltaSeries,pandas.core.indexes.timedeltas.TimedeltaIndex] +9typing.Sequence[pandas._libs.tslibs.timedeltas.Timedelta]T +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"typing.Sequence +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArrayH +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex",pandas.core.indexes.interval._EdgesTimedelta* +closed +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"!pandas._typing.IntervalClosedType *. +name" +typing.Hashable"typing.Hashable ** +copy + builtins.bool" builtins.bool * +dtype +3Union[pandas.core.dtypes.dtypes.IntervalDtype,None]R +'pandas.core.dtypes.dtypes.IntervalDtype"'pandas.core.dtypes.dtypes.IntervalDtype +None 0:typing.overload:builtins.classmethodXp2B + from_tuples6pandas.core.indexes.interval.IntervalIndex.from_tuples + from_tuples6pandas.core.indexes.interval.IntervalIndex.from_tuples" +Xpandas.core.indexes.interval.IntervalIndex[pandas._libs.interval.Interval[builtins.int]]l +,pandas._libs.interval.Interval[builtins.int] + builtins.int" builtins.int"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* +cls +JType[pandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT]] +Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] pandas._typing.IntervalTN #pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"typing.Sequence* +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex"type* +data +1typing.Sequence[Tuple[builtins.int,builtins.int]]` + Tuple[builtins.int,builtins.int] + builtins.int" builtins.int + builtins.int" builtins.int"typing.Sequence* closed iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] ^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 @@ -18297,376 +23578,399 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"!pandas._typing.IntervalClosedType * + builtins.str" builtins.str"!pandas._typing.IntervalClosedType *. +name" +typing.Hashable"typing.Hashable ** +copy + builtins.bool" builtins.bool * dtype 3Union[pandas.core.dtypes.dtypes.IntervalDtype,None]R 'pandas.core.dtypes.dtypes.IntervalDtype"'pandas.core.dtypes.dtypes.IntervalDtype -None ** -copy - builtins.bool" builtins.bool *. +None 0:typing.overload:builtins.classmethodXp + from_tuples6pandas.core.indexes.interval.IntervalIndex.from_tuples" +Zpandas.core.indexes.interval.IntervalIndex[pandas._libs.interval.Interval[builtins.float]]r +.pandas._libs.interval.Interval[builtins.float] +builtins.float"builtins.float"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* +cls +JType[pandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT]] +Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex"type* +data +5typing.Sequence[Tuple[builtins.float,builtins.float]]l +$Tuple[builtins.float,builtins.float] +builtins.float"builtins.float +builtins.float"builtins.float"typing.Sequence* +closed +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"!pandas._typing.IntervalClosedType *. name" -typing.Hashable"typing.Hashable *6 -verify_integrity - builtins.bool" builtins.bool * - to_tuples4pandas.core.indexes.interval.IntervalIndex.to_tuples"N -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index* -self +typing.Hashable"typing.Hashable ** +copy + builtins.bool" builtins.bool * +dtype +3Union[pandas.core.dtypes.dtypes.IntervalDtype,None]R +'pandas.core.dtypes.dtypes.IntervalDtype"'pandas.core.dtypes.dtypes.IntervalDtype +None 0:typing.overload:builtins.classmethodXp + from_tuples6pandas.core.indexes.interval.IntervalIndex.from_tuples" +tpandas.core.indexes.interval.IntervalIndex[pandas._libs.interval.Interval[pandas._libs.tslibs.timestamps.Timestamp]] +Hpandas._libs.interval.Interval[pandas._libs.tslibs.timestamps.Timestamp]T +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* +cls +JType[pandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT]] Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] pandas._typing.IntervalTN #pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex*. -na_tuple - builtins.bool" builtins.bool * -astype1pandas.core.indexes.interval.IntervalIndex.astype"f -/pandas.core.indexes.interval.IntervalIndex[Any] -Any"*pandas.core.indexes.interval.IntervalIndex* -self +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex"type* +data +typing.Sequence[Union[Tuple[pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timestamps.Timestamp],Tuple[datetime.datetime,datetime.datetime],Tuple[numpy.datetime64,numpy.datetime64]]] +Union[Tuple[pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timestamps.Timestamp],Tuple[datetime.datetime,datetime.datetime],Tuple[numpy.datetime64,numpy.datetime64]] +XTuple[pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timestamps.Timestamp]T +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp~ +*Tuple[datetime.datetime,datetime.datetime]& +datetime.datetime"datetime.datetime& +datetime.datetime"datetime.datetimex +(Tuple[numpy.datetime64,numpy.datetime64]$ +numpy.datetime64"numpy.datetime64$ +numpy.datetime64"numpy.datetime64"typing.Sequence* +closed +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"!pandas._typing.IntervalClosedType *. +name" +typing.Hashable"typing.Hashable ** +copy + builtins.bool" builtins.bool * +dtype +3Union[pandas.core.dtypes.dtypes.IntervalDtype,None]R +'pandas.core.dtypes.dtypes.IntervalDtype"'pandas.core.dtypes.dtypes.IntervalDtype +None 0:typing.overload:builtins.classmethodXp + from_tuples6pandas.core.indexes.interval.IntervalIndex.from_tuples" +tpandas.core.indexes.interval.IntervalIndex[pandas._libs.interval.Interval[pandas._libs.tslibs.timedeltas.Timedelta]] +Hpandas._libs.interval.Interval[pandas._libs.tslibs.timedeltas.Timedelta]T +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* +cls +JType[pandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT]] Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] pandas._typing.IntervalTN #pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* -dtype -TypeAlias[Union[TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],typing.Mapping[Any,Unknown]]] -Union[TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],typing.Mapping[Any,Unknown]] -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype8 -typing.Mapping[Any,Unknown] -Any"typing.Mapping"pandas._typing.DtypeArg** +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex"type* +data +typing.Sequence[Union[Tuple[pandas._libs.tslibs.timedeltas.Timedelta,pandas._libs.tslibs.timedeltas.Timedelta],Tuple[datetime.timedelta,datetime.timedelta],Tuple[numpy.timedelta64,numpy.timedelta64]]] +Union[Tuple[pandas._libs.tslibs.timedeltas.Timedelta,pandas._libs.tslibs.timedeltas.Timedelta],Tuple[datetime.timedelta,datetime.timedelta],Tuple[numpy.timedelta64,numpy.timedelta64]] +XTuple[pandas._libs.tslibs.timedeltas.Timedelta,pandas._libs.tslibs.timedeltas.Timedelta]T +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.TimedeltaT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta +,Tuple[datetime.timedelta,datetime.timedelta]( +datetime.timedelta"datetime.timedelta( +datetime.timedelta"datetime.timedelta~ +*Tuple[numpy.timedelta64,numpy.timedelta64]& +numpy.timedelta64"numpy.timedelta64& +numpy.timedelta64"numpy.timedelta64"typing.Sequence* +closed +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"!pandas._typing.IntervalClosedType *. +name" +typing.Hashable"typing.Hashable ** copy - builtins.bool" builtins.bool * - inferred_type8pandas.core.indexes.interval.IntervalIndex.inferred_type" - builtins.str" builtins.str* -self + builtins.bool" builtins.bool * +dtype +3Union[pandas.core.dtypes.dtypes.IntervalDtype,None]R +'pandas.core.dtypes.dtypes.IntervalDtype"'pandas.core.dtypes.dtypes.IntervalDtype +None 0:typing.overload:builtins.classmethodXp2 + __contains__7pandas.core.indexes.interval.IntervalIndex.__contains__ + __contains__7pandas.core.indexes.interval.IntervalIndex.__contains__" + builtins.bool" builtins.bool* Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] pandas._typing.IntervalTN #pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex0:builtins.property`* - memory_usage7pandas.core.indexes.interval.IntervalIndex.memory_usage" - builtins.int" builtins.int* -self +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval0:typing.overloadX + __contains__7pandas.core.indexes.interval.IntervalIndex.__contains__": +Literal[builtins.bool]  + builtins.bool" builtins.bool* Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] pandas._typing.IntervalTN #pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex** -deep - builtins.bool" builtins.bool * -is_overlapping9pandas.core.indexes.interval.IntervalIndex.is_overlapping" - builtins.bool" builtins.bool* -self +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex*$" +builtins.object"builtins.object0:typing.overloadX2 + __getitem__6pandas.core.indexes.interval.IntervalIndex.__getitem__ + __getitem__6pandas.core.indexes.interval.IntervalIndex.__getitem__" Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] pandas._typing.IntervalTN #pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex0:builtins.property`* -get_loc2pandas.core.indexes.interval.IntervalIndex.get_loc" -vUnion[builtins.int,builtins.slice,TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] - builtins.int" builtins.int -builtins.slice"builtins.slice +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* +Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* +Union[builtins.slice,TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],typing.Sequence[builtins.int],pandas.core.indexes.base.Index[Any],pandas.core.series.Series[builtins.bool],TypeAlias[Unknown]] +builtins.slice"builtins.slice +^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] Any 5numpy.dtype[numpy._typing._array_like._ScalarType_co][ (numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray* -self + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray" pandas._typing.np_ndarray_anyintN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.SequenceN +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Indexe +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series8 +TypeAlias[Unknown]"pandas._typing.np_ndarray_bool0:typing.overloadX + __getitem__6pandas.core.indexes.interval.IntervalIndex.__getitem__" +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval* Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] pandas._typing.IntervalTN #pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* -key -&TypeAlias[Union[typing.Hashable,None]]M -Union[typing.Hashable,None]" -typing.Hashable"typing.Hashable -None"pandas._typing.Label* -method -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],Literal[builtins.str],None] -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.FillnaOptions7 -Literal[builtins.str]  - builtins.str" builtins.str -None * - tolerance -Any * - get_indexer6pandas.core.indexes.interval.IntervalIndex.get_indexer" +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* + builtins.int" builtins.int0:typing.overloadX2 +__gt__1pandas.core.indexes.interval.IntervalIndex.__gt__ + +__gt__1pandas.core.indexes.interval.IntervalIndex.__gt__" +^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] Any 5numpy.dtype[numpy._typing._array_like._ScalarType_co][ (numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray* -self + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_bool* Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] pandas._typing.IntervalTN #pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex*Z -targetN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index* -method -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],Literal[builtins.str],None] -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.FillnaOptions7 -Literal[builtins.str]  - builtins.str" builtins.str -None *Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None * - tolerance -Any * -get_indexer_non_uniqueApandas.core.indexes.interval.IntervalIndex.get_indexer_non_unique"* -self +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* +dUnion[pandas._typing.IntervalT,pandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT]] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] pandas._typing.IntervalTN #pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex*Z -targetN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index* -left/pandas.core.indexes.interval.IntervalIndex.left"N -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index* -self +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex0:typing.overloadX +__gt__1pandas.core.indexes.interval.IntervalIndex.__gt__"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] pandas._typing.IntervalTN #pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex0:builtins.property`* -right0pandas.core.indexes.interval.IntervalIndex.right"N -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index* -self +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* +3pandas.core.series.Series[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"pandas.core.series.Series0:typing.overloadX2 +__ge__1pandas.core.indexes.interval.IntervalIndex.__ge__ + +__ge__1pandas.core.indexes.interval.IntervalIndex.__ge__" +^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_bool* Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] pandas._typing.IntervalTN #pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex0:builtins.property`* -mid.pandas.core.indexes.interval.IntervalIndex.mid"N -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index* -self +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* +dUnion[pandas._typing.IntervalT,pandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT]] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval +Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex0:typing.overloadX +__ge__1pandas.core.indexes.interval.IntervalIndex.__ge__"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* +Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* +3pandas.core.series.Series[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"pandas.core.series.Series0:typing.overloadX2 +__le__1pandas.core.indexes.interval.IntervalIndex.__le__ + +__le__1pandas.core.indexes.interval.IntervalIndex.__le__" +^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_bool* +Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* +dUnion[pandas._typing.IntervalT,pandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT]] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval +Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex0:typing.overloadX +__le__1pandas.core.indexes.interval.IntervalIndex.__le__"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* +Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* +3pandas.core.series.Series[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"pandas.core.series.Series0:typing.overloadX2 +__lt__1pandas.core.indexes.interval.IntervalIndex.__lt__ + +__lt__1pandas.core.indexes.interval.IntervalIndex.__lt__" +^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_bool* Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] pandas._typing.IntervalTN #pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex0:builtins.property`* -length1pandas.core.indexes.interval.IntervalIndex.length"N -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index* -self -Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* +dUnion[pandas._typing.IntervalT,pandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT]] pandas._typing.IntervalTN #pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex0:builtins.property`* - get_value4pandas.core.indexes.interval.IntervalIndex.get_value" -Any* -self +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] pandas._typing.IntervalTN #pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* -series -/TypeAlias[Type[pandas.core.series.Series[Any]]]t -$Type[pandas.core.series.Series[Any]]D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series"type"$pandas.core.dtypes.generic.ABCSeries* -key -Any* - is_all_dates7pandas.core.indexes.interval.IntervalIndex.is_all_dates" - builtins.bool" builtins.bool* -self +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex0:typing.overloadX +__lt__1pandas.core.indexes.interval.IntervalIndex.__lt__"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] pandas._typing.IntervalTN #pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex0:builtins.property`2Z - from_breaks6pandas.core.indexes.interval.IntervalIndex.from_breaks - from_breaks6pandas.core.indexes.interval.IntervalIndex.from_breaks" -Xpandas.core.indexes.interval.IntervalIndex[pandas._libs.interval.Interval[builtins.int]]l -,pandas._libs.interval.Interval[builtins.int] - builtins.int" builtins.int"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* -cls -JType[pandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT]] -Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* +3pandas.core.series.Series[pandas._typing.IntervalT] pandas._typing.IntervalTN #pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex"type* -breaks -TypeAlias[Union[typing.Sequence[builtins.int],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],Unknown,Unknown,pandas.core.series.Series[builtins.int],pandas.core.indexes.base.Index[builtins.int]]] -Union[typing.Sequence[builtins.int],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],Unknown,Unknown,pandas.core.series.Series[builtins.int],pandas.core.indexes.base.Index[builtins.int]]N -typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.Sequence +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"pandas.core.series.Series0:typing.overloadX2 +__eq__1pandas.core.indexes.interval.IntervalIndex.__eq__ + +__eq__1pandas.core.indexes.interval.IntervalIndex.__eq__" +^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] Any 5numpy.dtype[numpy._typing._array_like._ScalarType_co][ (numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArrayb -'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Seriesl -,pandas.core.indexes.base.Index[builtins.int] - builtins.int" builtins.int"pandas.core.indexes.base.Index"&pandas.core.indexes.interval._EdgesInt* -closed -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"!pandas._typing.IntervalClosedType *. -name" -typing.Hashable"typing.Hashable ** -copy - builtins.bool" builtins.bool * -dtype -3Union[pandas.core.dtypes.dtypes.IntervalDtype,None]R -'pandas.core.dtypes.dtypes.IntervalDtype"'pandas.core.dtypes.dtypes.IntervalDtype -None 0:typing.overload:builtins.classmethodXp - from_breaks6pandas.core.indexes.interval.IntervalIndex.from_breaks" -Zpandas.core.indexes.interval.IntervalIndex[pandas._libs.interval.Interval[builtins.float]]r -.pandas._libs.interval.Interval[builtins.float] -builtins.float"builtins.float"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* -cls -JType[pandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT]] + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_bool* Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] pandas._typing.IntervalTN #pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex"type* -breaks -TypeAlias[Union[typing.Sequence[builtins.float],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],pandas.core.series.Series[builtins.float],pandas.core.indexes.base.Index[builtins.float]]] -Union[typing.Sequence[builtins.float],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],pandas.core.series.Series[builtins.float],pandas.core.indexes.base.Index[builtins.float]]T -typing.Sequence[builtins.float] -builtins.float"builtins.float"typing.Sequence -STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] -Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] -Any -5numpy.dtype[numpy._typing._array_like._ScalarType_co][ -(numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArrayh -)pandas.core.series.Series[builtins.float] -builtins.float"builtins.float"pandas.core.series.Seriesr -.pandas.core.indexes.base.Index[builtins.float] -builtins.float"builtins.float"pandas.core.indexes.base.Index"(pandas.core.indexes.interval._EdgesFloat* -closed -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"!pandas._typing.IntervalClosedType *. -name" -typing.Hashable"typing.Hashable ** -copy - builtins.bool" builtins.bool * -dtype -3Union[pandas.core.dtypes.dtypes.IntervalDtype,None]R -'pandas.core.dtypes.dtypes.IntervalDtype"'pandas.core.dtypes.dtypes.IntervalDtype -None 0:typing.overload:builtins.classmethodXp - from_breaks6pandas.core.indexes.interval.IntervalIndex.from_breaks" -tpandas.core.indexes.interval.IntervalIndex[pandas._libs.interval.Interval[pandas._libs.tslibs.timestamps.Timestamp]] -Hpandas._libs.interval.Interval[pandas._libs.tslibs.timestamps.Timestamp]T -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* -cls -JType[pandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT]] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* +dUnion[pandas._typing.IntervalT,pandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT]] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] pandas._typing.IntervalTN #pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex"type* -breaks -TypeAlias[Union[typing.Sequence[TypeAlias[Union[datetime.datetime,numpy.datetime64,pandas._libs.tslibs.timestamps.Timestamp]]],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],pandas.core.series.TimestampSeries,pandas.core.indexes.datetimes.DatetimeIndex]] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex0:typing.overloadX +__eq__1pandas.core.indexes.interval.IntervalIndex.__eq__"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* +Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* +3pandas.core.series.Series[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"pandas.core.series.Series0:typing.overloadX +__eq__1pandas.core.indexes.interval.IntervalIndex.__eq__": +Literal[builtins.bool]  + builtins.bool" builtins.bool* +Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex*$" +builtins.object"builtins.object0:typing.overloadX2 +__ne__1pandas.core.indexes.interval.IntervalIndex.__ne__ -Union[typing.Sequence[TypeAlias[Union[datetime.datetime,numpy.datetime64,pandas._libs.tslibs.timestamps.Timestamp]]],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],pandas.core.series.TimestampSeries,pandas.core.indexes.datetimes.DatetimeIndex] -ntyping.Sequence[TypeAlias[Union[datetime.datetime,numpy.datetime64,pandas._libs.tslibs.timestamps.Timestamp]]] -]TypeAlias[Union[datetime.datetime,numpy.datetime64,pandas._libs.tslibs.timestamps.Timestamp]] -RUnion[datetime.datetime,numpy.datetime64,pandas._libs.tslibs.timestamps.Timestamp]& -datetime.datetime"datetime.datetime$ -numpy.datetime64"numpy.datetime64T -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"pandas._typing.DatetimeLike"typing.Sequence +__ne__1pandas.core.indexes.interval.IntervalIndex.__ne__" +^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] Any 5numpy.dtype[numpy._typing._array_like._ScalarType_co][ (numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArrayH -"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeriesZ -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex",pandas.core.indexes.interval._EdgesTimestamp* -closed -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"!pandas._typing.IntervalClosedType *. -name" -typing.Hashable"typing.Hashable ** -copy - builtins.bool" builtins.bool * -dtype -3Union[pandas.core.dtypes.dtypes.IntervalDtype,None]R -'pandas.core.dtypes.dtypes.IntervalDtype"'pandas.core.dtypes.dtypes.IntervalDtype -None 0:typing.overload:builtins.classmethodXp - from_breaks6pandas.core.indexes.interval.IntervalIndex.from_breaks" -tpandas.core.indexes.interval.IntervalIndex[pandas._libs.interval.Interval[pandas._libs.tslibs.timedeltas.Timedelta]] -Hpandas._libs.interval.Interval[pandas._libs.tslibs.timedeltas.Timedelta]T -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* -cls -JType[pandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT]] + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_bool* Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] pandas._typing.IntervalTN #pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex"type* -breaks -TypeAlias[Union[typing.Sequence[pandas._libs.tslibs.timedeltas.Timedelta],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],pandas.core.series.TimedeltaSeries,pandas.core.indexes.timedeltas.TimedeltaIndex]] -Union[typing.Sequence[pandas._libs.tslibs.timedeltas.Timedelta],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],pandas.core.series.TimedeltaSeries,pandas.core.indexes.timedeltas.TimedeltaIndex] -9typing.Sequence[pandas._libs.tslibs.timedeltas.Timedelta]T -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"typing.Sequence -STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] -Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] -Any -5numpy.dtype[numpy._typing._array_like._ScalarType_co][ -(numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArrayH -"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex",pandas.core.indexes.interval._EdgesTimedelta* -closed +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* +dUnion[pandas._typing.IntervalT,pandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT]] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval +Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex0:typing.overloadX +__ne__1pandas.core.indexes.interval.IntervalIndex.__ne__"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* +Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* +3pandas.core.series.Series[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"pandas.core.series.Series0:typing.overloadX +__ne__1pandas.core.indexes.interval.IntervalIndex.__ne__": +Literal[builtins.bool]  + builtins.bool" builtins.bool* +Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex*$" +builtins.object"builtins.object0:typing.overloadXPr +closed1pandas.core.indexes.interval.IntervalIndex.closed iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] ^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  @@ -18676,346 +23980,1145 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"!pandas._typing.IntervalClosedType *. -name" -typing.Hashable"typing.Hashable ** -copy - builtins.bool" builtins.bool * -dtype -3Union[pandas.core.dtypes.dtypes.IntervalDtype,None]R -'pandas.core.dtypes.dtypes.IntervalDtype"'pandas.core.dtypes.dtypes.IntervalDtype -None 0:typing.overload:builtins.classmethodXp2 - from_arrays6pandas.core.indexes.interval.IntervalIndex.from_arrays - from_arrays6pandas.core.indexes.interval.IntervalIndex.from_arrays" -Xpandas.core.indexes.interval.IntervalIndex[pandas._libs.interval.Interval[builtins.int]]l -,pandas._libs.interval.Interval[builtins.int] - builtins.int" builtins.int"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* -cls -JType[pandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT]] -Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] -pandas._typing.IntervalTN -#pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex"type* -left -TypeAlias[Union[typing.Sequence[builtins.int],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],Unknown,Unknown,pandas.core.series.Series[builtins.int],pandas.core.indexes.base.Index[builtins.int]]] -Union[typing.Sequence[builtins.int],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],Unknown,Unknown,pandas.core.series.Series[builtins.int],pandas.core.indexes.base.Index[builtins.int]]N -typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.Sequence -STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] -Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] -Any -5numpy.dtype[numpy._typing._array_like._ScalarType_co][ -(numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArrayb -'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Seriesl -,pandas.core.indexes.base.Index[builtins.int] - builtins.int" builtins.int"pandas.core.indexes.base.Index"&pandas.core.indexes.interval._EdgesInt* -right -TypeAlias[Union[typing.Sequence[builtins.int],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],Unknown,Unknown,pandas.core.series.Series[builtins.int],pandas.core.indexes.base.Index[builtins.int]]] -Union[typing.Sequence[builtins.int],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],Unknown,Unknown,pandas.core.series.Series[builtins.int],pandas.core.indexes.base.Index[builtins.int]]N -typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.Sequence -STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] -Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] -Any -5numpy.dtype[numpy._typing._array_like._ScalarType_co][ -(numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArrayb -'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Seriesl -,pandas.core.indexes.base.Index[builtins.int] - builtins.int" builtins.int"pandas.core.indexes.base.Index"&pandas.core.indexes.interval._EdgesInt* -closed -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 + builtins.str" builtins.str"!pandas._typing.IntervalClosedType + +MultiIndex$pandas.core.indexes.multi.MultiIndex"pandas.core.indexes.base.Index* +__new__,pandas.core.indexes.multi.MultiIndex.__new__" +)pandas.core.indexes.multi.MultiIndex.SelfL +$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex(* +cls +/Type[pandas.core.indexes.multi.MultiIndex.Self] +)pandas.core.indexes.multi.MultiIndex.SelfL +$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex("type* +levels +Any * +codes +Any * + sortorder +Any * +names +Any * +dtype +Any * +copy +Any * +name +Any *6 +verify_integrity + builtins.bool" builtins.bool *3 + _set_identity + builtins.bool" builtins.bool * +__init__-pandas.core.indexes.multi.MultiIndex.__init__" +None*V +selfL +$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex* +levels +Any * +codes +Any * + sortorder +Any * +names +Any * +dtype +Any * +copy +Any * +name +Any *6 +verify_integrity + builtins.bool" builtins.bool *3 + _set_identity + builtins.bool" builtins.bool * + from_arrays0pandas.core.indexes.multi.MultiIndex.from_arrays" +)pandas.core.indexes.multi.MultiIndex.SelfL +$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex(* +cls +/Type[pandas.core.indexes.multi.MultiIndex.Self] +)pandas.core.indexes.multi.MultiIndex.SelfL +$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex("type* +arrays +Any* + sortorder +Any * +names +Any 0:builtins.classmethodp* + from_tuples0pandas.core.indexes.multi.MultiIndex.from_tuples" +)pandas.core.indexes.multi.MultiIndex.SelfL +$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex(* +cls +/Type[pandas.core.indexes.multi.MultiIndex.Self] +)pandas.core.indexes.multi.MultiIndex.SelfL +$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex("type* +tuples +Any* + sortorder +Any * +names +Any 0:builtins.classmethodp* + from_product1pandas.core.indexes.multi.MultiIndex.from_product" +)pandas.core.indexes.multi.MultiIndex.SelfL +$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex(* +cls +/Type[pandas.core.indexes.multi.MultiIndex.Self] +)pandas.core.indexes.multi.MultiIndex.SelfL +$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex("type* + iterables +Any* + sortorder +Any * +names +Any 0:builtins.classmethodp* + +from_frame/pandas.core.indexes.multi.MultiIndex.from_frame" +)pandas.core.indexes.multi.MultiIndex.SelfL +$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex(* +cls +/Type[pandas.core.indexes.multi.MultiIndex.Self] +)pandas.core.indexes.multi.MultiIndex.SelfL +$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex("type* +df +Any* + sortorder +Any * +names +Any 0:builtins.classmethodp*T +shape*pandas.core.indexes.multi.MultiIndex.shape* +self0:builtins.property`* +levels+pandas.core.indexes.multi.MultiIndex.levels" +2builtins.list[pandas.core.indexes.base.Index[Any]]N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index" builtins.list*V +selfL +$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex0:builtins.property`* + +set_levels/pandas.core.indexes.multi.MultiIndex.set_levels" +Any*V +selfL +$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex* +levels +Any* +level +Any *6 +verify_integrity + builtins.bool" builtins.bool *T +codes*pandas.core.indexes.multi.MultiIndex.codes* +self0:builtins.property`* + set_codes.pandas.core.indexes.multi.MultiIndex.set_codes" +Any*V +selfL +$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex* +codes +Any* +level +Any *6 +verify_integrity + builtins.bool" builtins.bool * +copy)pandas.core.indexes.multi.MultiIndex.copy" +)pandas.core.indexes.multi.MultiIndex.SelfL +$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex(* +self +)pandas.core.indexes.multi.MultiIndex.SelfL +$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex(* +names +Any ** +deep + builtins.bool" builtins.bool * + __array__.pandas.core.indexes.multi.MultiIndex.__array__"9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray*V +selfL +$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex* +dtype +Any *F +view)pandas.core.indexes.multi.MultiIndex.view* +self* +cls * + __contains__1pandas.core.indexes.multi.MultiIndex.__contains__" + builtins.bool" builtins.bool*NL +$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex*  +Any* +dtype*pandas.core.indexes.multi.MultiIndex.dtype"( +numpy.dtype[Any] +Any" numpy.dtype*V +selfL +$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex0:builtins.property`* +dtypes+pandas.core.indexes.multi.MultiIndex.dtypes" +pandas.core.series.Series[TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]]] +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype"pandas.core.series.Series*V +selfL +$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex0:builtins.property`* + memory_usage1pandas.core.indexes.multi.MultiIndex.memory_usage" + builtins.int" builtins.int*V +selfL +$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex** +deep + builtins.bool" builtins.bool * +nbytes+pandas.core.indexes.multi.MultiIndex.nbytes" + builtins.int" builtins.int*V +selfL +$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex0:builtins.property`* +format+pandas.core.indexes.multi.MultiIndex.format", +builtins.list[Any] +Any" builtins.list*V +selfL +$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex*S +nameG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None * + formatter ++Union[CallableType[builtins.function],None]K +CallableType[builtins.function]& +builtins.function"builtins.function +None *R +na_repD +Union[builtins.str,None] + builtins.str" builtins.str +None *+ +names + builtins.bool" builtins.bool *) +space + builtins.int" builtins.int *W +sparsifyG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None *, +adjoin + builtins.bool" builtins.bool * +__len__,pandas.core.indexes.multi.MultiIndex.__len__" + builtins.int" builtins.int*NL +$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex*V +values+pandas.core.indexes.multi.MultiIndex.values* +self0:builtins.property`* +is_monotonic_increasing + interpolate%pandas.core.series.Series.interpolate" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -22181,18 +30844,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -22219,20 +30879,51 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -repeats -/Union[builtins.int,builtins.list[builtins.int]] - builtins.int" builtins.intJ -builtins.list[builtins.int] - builtins.int" builtins.int" builtins.list* -axis +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +method +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"!pandas._typing.InterpolateOptions * +axis IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 @@ -22240,13 +30931,60 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.str" builtins.str7 Literal[builtins.int]  builtins.int" builtins.int"pandas._typing.AxisIndex -None * - to_xarray#pandas.core.series.Series.to_xarray" -Any* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +None *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None *- +inplace + builtins.bool" builtins.bool * +limit_direction +MUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +None * + +limit_area +7Union[Literal[builtins.str],Literal[builtins.str],None]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +None *x +downcasth +!Union[Literal[builtins.str],None]7 +Literal[builtins.str]  + builtins.str" builtins.str +None * +kwargs +Any*I +asofpandas.core.series.Series.asof"# +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1]] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.floatT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -22273,20 +31011,15 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*. -itemspandas.core.series.Series.items" -9typing.Iterable[Tuple[typing.Hashable,pandas._typing.S1]] -(Tuple[typing.Hashable,pandas._typing.S1]" -typing.Hashable"typing.Hashable -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -22313,18 +31046,42 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +where +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],typing.Sequence[Unknown]] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"typing.Iterable* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar- +typing.Sequence[Unknown]"typing.Sequence* +subset +6Union[builtins.str,typing.Sequence[builtins.str],None] + builtins.str" builtins.strN +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.Sequence +None *4 +clippandas.core.series.Series.clip" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -22351,21 +31108,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -keyspandas.core.series.Series.keys", -builtins.list[Any] -Any" builtins.list* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -22392,20 +31143,54 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -to_frame"pandas.core.series.Series.to_frame": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +lower +Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.float,None] +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.AnyArrayLike +builtins.float"builtins.float +None * +upper +Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.float,None] +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.AnyArrayLike +builtins.float"builtins.float +None * +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *- +inplace + builtins.bool" builtins.bool * +kwargs +Any*= +asfreq pandas.core.series.Series.asfreq" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -22431,23 +31216,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand Type[builtins.object]" builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*Y -nameM -Union[builtins.object,None]" -builtins.object"builtins.object -None *. -modepandas.core.series.Series.mode" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -22474,18 +31252,61 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +freq +Any* +method +uUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.FillnaOptions +None * +how +7Union[Literal[builtins.str],Literal[builtins.str],None]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +None */ + normalize + builtins.bool" builtins.bool * + +fill_value +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],None] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar +None *+ +at_time!pandas.core.series.Series.at_time" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -22512,24 +31333,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -dropna -Any * -unique pandas.core.series.Series.unique"9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -22556,22 +31368,30 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* - -duplicated$pandas.core.series.Series.duplicated"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*m +timec +!Union[builtins.str,datetime.time] + builtins.str" builtins.str + datetime.time" datetime.time** +asof + builtins.bool" builtins.bool * +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *+ + between_time&pandas.core.series.Series.between_time" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -22598,32 +31418,15 @@ duplicated$pandas.core.series.Series.duplicated"e builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -keep -[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],Literal[builtins.bool]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.NaPosition: -Literal[builtins.bool]  - builtins.bool" builtins.bool * -idxmax pandas.core.series.Series.idxmax"` - Union[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -22650,35 +31453,33 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*s + +start_timec +!Union[builtins.str,datetime.time] + builtins.str" builtins.str + datetime.time" datetime.time*q +end_timec +!Union[builtins.str,datetime.time] + builtins.str" builtins.str + datetime.time" datetime.time* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *, -skipna - builtins.bool" builtins.bool * -args -Any* -kwargs -Any* -idxmin pandas.core.series.Series.idxmin"` - Union[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex +None *' +firstpandas.core.series.Series.first" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -22705,31 +31506,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *, -skipna - builtins.bool" builtins.bool * -args -Any* -kwargs -Any*. -roundpandas.core.series.Series.round" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -22756,18 +31541,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +offset +Any*' +lastpandas.core.series.Series.last" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -22794,26 +31578,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*, -decimals - builtins.int" builtins.int * -args -Any* -kwargs -Any*0 -corrpandas.core.series.Series.corr" -builtins.float"builtins.float* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -22840,18 +31613,20 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -other -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +offset +Any* +rankpandas.core.series.Series.rank"h +)pandas.core.series.Series[builtins.float] +builtins.float"builtins.float"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -22878,15 +31653,33 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -method +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex * +method +tUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str *2 + numeric_only + builtins.bool" builtins.bool * + na_option HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 @@ -22894,14 +31687,14 @@ HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str */ - min_periods - builtins.int" builtins.int */ -covpandas.core.series.Series.cov" -builtins.float"builtins.float* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + ascending + builtins.bool" builtins.bool *) +pct + builtins.bool" builtins.bool *C +wherepandas.core.series.Series.where" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -22928,18 +31721,15 @@ HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -other -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -22966,24 +31756,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*W - min_periodsD -Union[builtins.int,None] - builtins.int" builtins.int -None *( -ddof - builtins.int" builtins.int *. -diffpandas.core.series.Series.diff" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +cond +Union[pandas.core.series.Series[pandas._typing.S1],pandas.core.series.Series[builtins.bool],numpy.ndarray[Any,Any],CallableType[builtins.function],CallableType[builtins.function]] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23010,18 +31792,44 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Seriese +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarrayK +CallableType[builtins.function]& +builtins.function"builtins.functionK +CallableType[builtins.function]& +builtins.function"builtins.function* +other +Any *- +inplace + builtins.bool" builtins.bool * +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None * +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *i +maskpandas.core.series.Series.mask" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23048,22 +31856,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*+ -periods - builtins.int" builtins.int * -autocorr"pandas.core.series.Series.autocorr" -builtins.float"builtins.float* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23090,23 +31891,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*' -lag - builtins.int" builtins.int *6 - -__matmul__$pandas.core.series.Series.__matmul__***8 - __rmatmul__%pandas.core.series.Series.__rmatmul__***U -combine!pandas.core.series.Series.combine" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +cond +Union[pandas.core.series.Series[pandas._typing.S1],pandas.core.series.Series[builtins.bool],numpy.ndarray[Any,Any],CallableType[builtins.function],CallableType[builtins.function]] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23133,18 +31927,43 @@ __matmul__$pandas.core.series.Series.__matmul__***8 builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Seriese +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarrayK +CallableType[builtins.function]& +builtins.function"builtins.functionK +CallableType[builtins.function]& +builtins.function"builtins.function*% +other% +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1],pandas.core.frame.DataFrame,CallableType[builtins.function],pandas._libs.missing.NAType,None] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23171,18 +31990,41 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -other -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrameK +CallableType[builtins.function]& +builtins.function"builtins.function: +pandas._libs.missing.NAType"pandas._libs.missing.NAType +None *- +inplace + builtins.bool" builtins.bool * +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None * +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *6 + case_when#pandas.core.series.Series.case_when"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23209,20 +32051,33 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*U -funcK +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*" +caselist" +builtins.list[Tuple[Union[typing.Sequence[builtins.bool],pandas.core.series.Series[builtins.bool],CallableType[builtins.function]],Union[TypeAlias[Union[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],CallableType[builtins.function]]]] +Tuple[Union[typing.Sequence[builtins.bool],pandas.core.series.Series[builtins.bool],CallableType[builtins.function]],Union[TypeAlias[Union[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],CallableType[builtins.function]]] +nUnion[typing.Sequence[builtins.bool],pandas.core.series.Series[builtins.bool],CallableType[builtins.function]]Q +typing.Sequence[builtins.bool] + builtins.bool" builtins.bool"typing.Sequencee +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.SeriesK CallableType[builtins.function]& -builtins.function"builtins.function* - -fill_value -Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],None] +builtins.function"builtins.function +Union[TypeAlias[Union[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],CallableType[builtins.function]] +TypeAlias[Union[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]] +uUnion[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]0 +typing.Sequence[Any] +Any"typing.Sequence9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarrayD +pandas.core.series.Series[Any] +Any"pandas.core.series.SeriesN +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index"pandas._typing.ListLikeU TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] @@ -23240,12 +32095,13 @@ fill_value builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar -None *E - combine_first'pandas.core.series.Series.combine_first" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.complex"builtins.complex"pandas._typing.ScalarK +CallableType[builtins.function]& +builtins.function"builtins.function" builtins.list*, +truncate"pandas.core.series.Series.truncate" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23272,18 +32128,15 @@ fill_value builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23310,18 +32163,39 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -other -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +before +3Union[datetime.date,builtins.str,builtins.int,None] + datetime.date" datetime.date + builtins.str" builtins.str + builtins.int" builtins.int +None * +after +3Union[datetime.date,builtins.str,builtins.int,None] + datetime.date" datetime.date + builtins.str" builtins.str + builtins.int" builtins.int +None * +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None ** +copy + builtins.bool" builtins.bool *+ + +tz_convert$pandas.core.series.Series.tz_convert" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23348,20 +32222,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*] -update pandas.core.series.Series.update" -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23388,19 +32257,33 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*E -otherE -Union[pandas.core.series.Series[pandas._typing.S1],typing.Sequence[pandas._typing.S1],typing.Mapping[builtins.int,pandas._typing.S1]] -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +tz +Any* +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex * +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None ** +copy + builtins.bool" builtins.bool *, + tz_localize%pandas.core.series.Series.tz_localize" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23427,17 +32310,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series -"typing.Sequence[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23464,18 +32345,37 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"typing.Sequence -.typing.Mapping[builtins.int,pandas._typing.S1] - builtins.int" builtins.int -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +tz +Any* +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex * +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None ** +copy + builtins.bool" builtins.bool * + ambiguous +Any */ + nonexistent + builtins.str" builtins.str *& +abspandas.core.series.Series.abs" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23502,21 +32402,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"typing.Mapping* -argsort!pandas.core.series.Series.argsort"b -'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23543,38 +32437,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex * -kind -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.SortKind * -order -None *1 -nlargest"pandas.core.series.Series.nlargest" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*c +describe"pandas.core.series.Series.describe" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23601,18 +32472,15 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23639,30 +32507,23 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*% -n - builtins.int" builtins.int * -keep -ZUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],Literal[builtins.str]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.NaPosition7 +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* + percentiles +)Union[builtins.list[builtins.float],None]P +builtins.list[builtins.float] +builtins.float"builtins.float" builtins.list +None * +include +BUnion[Literal[builtins.str],builtins.list[pandas._typing.S1],None]7 Literal[builtins.str]  - builtins.str" builtins.str *1 - nsmallest#pandas.core.series.Series.nsmallest" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.str" builtins.str + builtins.list[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23689,18 +32550,16 @@ ZUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],Literal[bui builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset" builtins.list +None *& +exclude& +>Union[pandas._typing.S1,builtins.list[pandas._typing.S1],None] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23727,30 +32586,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*% -n - builtins.int" builtins.int * -keep -ZUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],Literal[builtins.str]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.NaPosition7 -Literal[builtins.str]  - builtins.str" builtins.str *1 - swaplevel#pandas.core.series.Series.swaplevel" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset + builtins.list[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23777,18 +32620,17 @@ ZUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],Literal[bui builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset" builtins.list +None *( + +pct_change$pandas.core.series.Series.pct_change" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23815,30 +32657,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -i -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level * -j -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level ** -copy - builtins.bool" builtins.bool *. -reorder_levels(pandas.core.series.Series.reorder_levels" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23865,18 +32692,46 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*+ +periods + builtins.int" builtins.int */ + fill_method + builtins.str" builtins.str *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None * +freq +Any * +kwargs +Any*! +first_valid_index+pandas.core.series.Series.first_valid_index" +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23903,21 +32758,34 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*! +last_valid_index*pandas.core.series.Series.last_valid_index" +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*7 -order, -builtins.list[Any] -Any" builtins.list*. -explode!pandas.core.series.Series.explode" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23944,18 +32812,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*' + transpose#pandas.core.series.Series.transpose" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23982,20 +32847,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -unstack!pandas.core.series.Series.unstack": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -24022,32 +32882,20 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -level -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level * - -fill_value -pandas.core.resample.Resampler[pandas.core.series.Series[Any]]D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series"pandas.core.resample.Resampler* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -27277,87 +35320,30 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -rule -Any* -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *R -closedD -Union[builtins.str,None] - builtins.str" builtins.str -None *Q -labelD -Union[builtins.str,None] - builtins.str" builtins.str -None * - -convention -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str""pandas._typing.TimestampConvention * -kind -7Union[Literal[builtins.str],Literal[builtins.str],None]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str -None * -loffset -Any *( -base - builtins.int" builtins.int *N -onD -Union[builtins.str,None] - builtins.str" builtins.str -None * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None * -origin -Union[pandas._libs.tslibs.timestamps.Timestamp,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]T -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str * -offset -AUnion[pandas._libs.tslibs.timedeltas.Timedelta,builtins.str,None]T -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta - builtins.str" builtins.str -None *. -firstpandas.core.series.Series.first" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*D +otherD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -27384,18 +35370,14 @@ AUnion[pandas._libs.tslibs.timedeltas.Timedelta,builtins.str,None]T builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -27422,20 +35404,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -offset -Any*. -lastpandas.core.series.Series.last" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -27462,18 +35438,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*k +__rpow__"pandas.core.series.Series.__rpow__" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -27500,23 +35473,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -offset -Any* -rankpandas.core.series.Series.rank"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -27543,51 +35507,29 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex * -method -tUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str *2 - numeric_only - builtins.bool" builtins.bool * - na_option -HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str */ - ascending - builtins.bool" builtins.bool *) -pct - builtins.bool" builtins.bool *N -wherepandas.core.series.Series.where" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*DD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -27614,18 +35556,14 @@ HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -27652,19 +35590,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -cond -Union[pandas.core.series.Series[pandas._typing.S1],pandas.core.series.Series[builtins.bool],numpy.ndarray[Any,Any],CallableType[builtins.function],CallableType[builtins.function]] -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -27691,49 +35624,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Seriese -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarrayK -CallableType[builtins.function]& -builtins.function"builtins.functionK -CallableType[builtins.function]& -builtins.function"builtins.function* -other -Any *- -inplace - builtins.bool" builtins.bool * -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *. -try_cast - builtins.bool" builtins.bool *e -maskpandas.core.series.Series.mask" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*X +__rsub__"pandas.core.series.Series.__rsub__"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -27760,18 +35661,29 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*DD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -27798,51 +35710,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -cond -TypeAlias[Union[pandas.core.series.Series[builtins.bool],TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],builtins.list[builtins.bool]]] -Union[pandas.core.series.Series[builtins.bool],TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],builtins.list[builtins.bool]]e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series -^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] -STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] -Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] -Any -5numpy.dtype[numpy._typing._array_like._ScalarType_co][ -(numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_boolM -builtins.list[builtins.bool] - builtins.bool" builtins.bool" builtins.list"pandas._typing.MaskType*) -other) -Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1],pandas.core.frame.DataFrame,CallableType[builtins.function],pandas._libs.missing.NAType,None] -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -27869,43 +35744,14 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrameK -CallableType[builtins.function]& -builtins.function"builtins.function: -pandas._libs.missing.NAType"pandas._libs.missing.NAType -None *- -inplace - builtins.bool" builtins.bool * -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *. -try_cast - builtins.bool" builtins.bool *0 - slice_shift%pandas.core.series.Series.slice_shift" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -27932,18 +35778,17 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*X + __rtruediv__&pandas.core.series.Series.__rtruediv__"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -27970,27 +35815,29 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*+ -periods - builtins.int" builtins.int * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *0 -tshift pandas.core.series.Series.tshift" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*DD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28017,18 +35864,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28055,29 +35898,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*+ -periods - builtins.int" builtins.int * -freq -Any * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *4 -truncate"pandas.core.series.Series.truncate" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28104,18 +35932,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*X + __truediv__%pandas.core.series.Series.__truediv__"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28142,42 +35969,29 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -before -3Union[datetime.date,builtins.str,builtins.int,None] - datetime.date" datetime.date - builtins.str" builtins.str - builtins.int" builtins.int -None * -after -3Union[datetime.date,builtins.str,builtins.int,None] - datetime.date" datetime.date - builtins.str" builtins.str - builtins.int" builtins.int -None * -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None ** -copy - builtins.bool" builtins.bool *2 - -tz_convert$pandas.core.series.Series.tz_convert" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*DD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28204,18 +36018,14 @@ tz_convert$pandas.core.series.Series.tz_convert" builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28242,36 +36052,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -tz -Any* -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None ** -copy - builtins.bool" builtins.bool *3 - tz_localize%pandas.core.series.Series.tz_localize" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28298,18 +36086,18 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* + +__invert__$pandas.core.series.Series.__invert__"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28336,40 +36124,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -tz -Any* -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None ** -copy - builtins.bool" builtins.bool * - ambiguous -Any */ - nonexistent - builtins.str" builtins.str *. -abspandas.core.series.Series.abs" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +atpandas.core.series.Series.at"B +pandas.core.indexing._AtIndexer"pandas.core.indexing._AtIndexer* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28396,18 +36161,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series0:builtins.property`* +catpandas.core.series.Series.cat"h +2pandas.core.arrays.categorical.CategoricalAccessor"2pandas.core.arrays.categorical.CategoricalAccessor* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28434,18 +36198,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*u -describe"pandas.core.series.Series.describe" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series0:builtins.property`* +iatpandas.core.series.Series.iat"D + pandas.core.indexing._iAtIndexer" pandas.core.indexing._iAtIndexer* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28472,18 +36235,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series0:builtins.property`*' +ilocpandas.core.series.Series.iloc" +8pandas.core.series._iLocIndexerSeries[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28510,26 +36270,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* - percentiles -)Union[builtins.list[builtins.float],None]P -builtins.list[builtins.float] -builtins.float"builtins.float" builtins.list -None * -include -BUnion[Literal[builtins.str],builtins.list[pandas._typing.S1],None]7 -Literal[builtins.str]  - builtins.str" builtins.str - builtins.list[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"%pandas.core.series._iLocIndexerSeries* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28556,19 +36305,15 @@ BUnion[Literal[builtins.str],builtins.list[pandas._typing.S1],None]7 builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype" builtins.list -None *- -exclude- ->Union[pandas._typing.S1,builtins.list[pandas._typing.S1],None] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series0:builtins.property`*' +locpandas.core.series.Series.loc" +7pandas.core.series._LocIndexerSeries[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28595,17 +36340,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype - builtins.list[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"$pandas.core.series._LocIndexerSeries* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28632,24 +36375,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype" builtins.list -None *b -datetime_is_numericG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None */ - -pct_change$pandas.core.series.Series.pct_change" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series0:builtins.property`*M +addpandas.core.series.Series.add" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28676,18 +36410,15 @@ pct_change$pandas.core.series.Series.pct_change" builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28714,49 +36445,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*+ -periods - builtins.int" builtins.int */ - fill_method - builtins.str" builtins.str *Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None * -freq -Any * -kwargs -Any*$ -first_valid_index+pandas.core.series.Series.first_valid_index" -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*# +other# +Union[pandas.core.series.Series[pandas._typing.S1],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]]] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28783,15 +36481,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*$ -last_valid_index*pandas.core.series.Series.last_valid_index" +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] @@ -28809,11 +36503,27 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.complex"builtins.complex"pandas._typing.Scalar* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None *( +axis + builtins.int" builtins.int * +allpandas.core.series.Series.all" + builtins.bool" builtins.bool* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28840,21 +36550,32 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* - value_counts&pandas.core.series.Series.value_counts"b -'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex *X + bool_onlyG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None *, +skipna + builtins.bool" builtins.bool * +kwargs +Any* +anypandas.core.series.Series.any" + builtins.bool" builtins.bool* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28881,30 +36602,30 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*/ - normalize - builtins.bool" builtins.bool ** -sort - builtins.bool" builtins.bool */ - ascending - builtins.bool" builtins.bool *P -binsD -Union[builtins.int,None] - builtins.int" builtins.int +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex *X + bool_onlyG +Union[builtins.bool,None] + builtins.bool" builtins.bool None *, -dropna - builtins.bool" builtins.bool *. - transpose#pandas.core.series.Series.transpose" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +skipna + builtins.bool" builtins.bool * +kwargs +Any** +cummax pandas.core.series.Series.cummax" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28931,18 +36652,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28969,22 +36687,30 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *, +skipna + builtins.bool" builtins.bool * args Any* kwargs -Any*. -Tpandas.core.series.Series.T" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any** +cummin pandas.core.series.Series.cummin" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29011,18 +36737,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29049,18 +36772,30 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series0:builtins.property`*P -__div__!pandas.core.series.Series.__div__" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *, +skipna + builtins.bool" builtins.bool * +args +Any* +kwargs +Any** +cumprod!pandas.core.series.Series.cumprod" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29087,18 +36822,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29125,39 +36857,30 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*" -other" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *, +skipna + builtins.bool" builtins.bool * +args +Any* +kwargs +Any** +cumsum pandas.core.series.Series.cumsum" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29184,20 +36907,15 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -__eq__ pandas.core.series.Series.__eq__"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29224,21 +36942,33 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*$" -builtins.object"builtins.object*: - __floordiv__&pandas.core.series.Series.__floordiv__"b -'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *, +skipna + builtins.bool" builtins.bool * +args +Any* +kwargs +Any*] +divide pandas.core.series.Series.divide"h +)pandas.core.series.Series[builtins.float] +builtins.float"builtins.float"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29265,18 +36995,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*"" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*D +otherD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 @@ -29287,16 +37015,10 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.str" builtins.str9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29322,21 +37044,15 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P Type[builtins.object]" builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*Q -__ge__ pandas.core.series.Series.__ge__"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29363,17 +37079,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*99 -Union[pandas._typing.S1,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1],datetime.datetime,datetime.timedelta] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29400,36 +37113,34 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex *p +divmod pandas.core.series.Series.divmod" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29456,22 +37167,15 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta*Q -__gt__ pandas.core.series.Series.__gt__"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29498,17 +37202,30 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*99 -Union[pandas._typing.S1,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1],datetime.datetime,datetime.timedelta] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*D +otherD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29535,36 +37252,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29591,22 +37286,14 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta*Q -__le__ pandas.core.series.Series.__le__"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29633,17 +37320,37 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*99 -Union[pandas._typing.S1,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1],datetime.datetime,datetime.timedelta] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex *= +eqpandas.core.series.Series.eq"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29670,36 +37377,34 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*# +other# +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1]] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29726,22 +37431,38 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta*Q -__lt__ pandas.core.series.Series.__lt__"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex * +ewmpandas.core.series.Series.ewm" +Npandas.core.window.ewm.ExponentialMovingWindow[pandas.core.series.Series[Any]]D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series".pandas.core.window.ewm.ExponentialMovingWindow* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29768,17 +37489,41 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*99 -Union[pandas._typing.S1,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1],datetime.datetime,datetime.timedelta] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*U +comJ +Union[builtins.float,None] +builtins.float"builtins.float +None *V +spanJ +Union[builtins.float,None] +builtins.float"builtins.float +None *Z +halflifeJ +Union[builtins.float,None] +builtins.float"builtins.float +None *W +alphaJ +Union[builtins.float,None] +builtins.float"builtins.float +None */ + min_periods + builtins.int" builtins.int *, +adjust + builtins.bool" builtins.bool */ + ignore_na + builtins.bool" builtins.bool * + expanding#pandas.core.series.Series.expanding" +Fpandas.core.window.expanding.Expanding[pandas.core.series.Series[Any]]D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series"&pandas.core.window.expanding.Expanding* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29805,36 +37550,27 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*/ + min_periods + builtins.int" builtins.int * +method +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.CalculationMethod *^ +floordiv"pandas.core.series.Series.floordiv"b +'pandas.core.series.Series[builtins.int] + builtins.int" builtins.int"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29861,20 +37597,30 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta*P -__mod__!pandas.core.series.Series.__mod__" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*D +otherD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29901,17 +37647,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29938,38 +37681,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*"" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29996,20 +37715,39 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -__ne__ pandas.core.series.Series.__ne__"e +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *= +gepandas.core.series.Series.ge"e (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30036,19 +37774,34 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*# +other# +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1]] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*$" -builtins.object"builtins.object*P -__pow__!pandas.core.series.Series.__pow__" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30075,17 +37828,37 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex *= +gtpandas.core.series.Series.gt"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30112,38 +37885,34 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*# +other# +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1]] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*"" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30170,18 +37939,33 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*P -__radd__"pandas.core.series.Series.__radd__" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex *& +itempandas.core.series.Series.item" +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30208,17 +37992,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30245,39 +38027,34 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*% +kurtpandas.core.series.Series.kurt" +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*"" -Union[builtins.complex,builtins.str,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex - builtins.str" builtins.str -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30304,18 +38081,51 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *, +skipna + builtins.bool" builtins.bool * +level +None *2 + numeric_only + builtins.bool" builtins.bool * +kwargs +Any*% +kurtosis"pandas.core.series.Series.kurtosis" +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*P -__rdiv__"pandas.core.series.Series.__rdiv__" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30342,17 +38152,35 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *, +skipna + builtins.bool" builtins.bool * +level +None *2 + numeric_only + builtins.bool" builtins.bool * +kwargs +Any*= +lepandas.core.series.Series.le"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30379,38 +38207,34 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*# +other# +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1]] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*"" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30437,18 +38261,37 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*P - __rdivmod__%pandas.core.series.Series.__rdivmod__" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex *= +ltpandas.core.series.Series.lt"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30475,18 +38318,34 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*# +other# +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1]] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30513,39 +38372,33 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*" -other" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex ** +maxpandas.core.series.Series.max" +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30572,18 +38425,15 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*P - __rfloordiv__'pandas.core.series.Series.__rfloordiv__" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30610,17 +38460,34 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *, +skipna + builtins.bool" builtins.bool * +level +None *2 + numeric_only + builtins.bool" builtins.bool * +kwargs +Any* +meanpandas.core.series.Series.mean" +builtins.float"builtins.float* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30647,38 +38514,34 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*"" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *, +skipna + builtins.bool" builtins.bool * +level +None *2 + numeric_only + builtins.bool" builtins.bool * +kwargs +Any* +median pandas.core.series.Series.median" +builtins.float"builtins.float* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30705,18 +38568,31 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*P -__rmod__"pandas.core.series.Series.__rmod__" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *, +skipna + builtins.bool" builtins.bool * +level +None *2 + numeric_only + builtins.bool" builtins.bool * +kwargs +Any** +minpandas.core.series.Series.min" +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30743,17 +38619,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30780,38 +38654,32 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*"" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *, +skipna + builtins.bool" builtins.bool * +level +None *2 + numeric_only + builtins.bool" builtins.bool * +kwargs +Any*q +modpandas.core.series.Series.mod" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30838,20 +38706,15 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*# -__rmul__"pandas.core.series.Series.__rmul__"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30878,18 +38741,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*  -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[Any]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*D +otherD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 @@ -30900,19 +38761,10 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.str" builtins.str9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLikeD -pandas.core.series.Series[Any] -Any"pandas.core.series.Series*P - __rnatmul__%pandas.core.series.Series.__rnatmul__" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30939,18 +38791,14 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30977,39 +38825,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*" -other" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31036,18 +38859,36 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*P -__rpow__"pandas.core.series.Series.__rpow__" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *q +multiply"pandas.core.series.Series.multiply" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31074,17 +38915,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31111,18 +38950,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*"" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*D +otherD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 @@ -31133,16 +38970,10 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.str" builtins.str9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31169,20 +39000,14 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*: -__rsub__"pandas.core.series.Series.__rsub__"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31209,38 +39034,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*"" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31267,20 +39068,39 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*: - __truediv__%pandas.core.series.Series.__truediv__"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *= +nepandas.core.series.Series.ne"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31307,38 +39127,34 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*# +other# +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1]] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*"" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31365,21 +39181,36 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ -__invert__$pandas.core.series.Series.__invert__"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex * +nunique!pandas.core.series.Series.nunique" + builtins.int" builtins.int* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31406,20 +39237,17 @@ __invert__$pandas.core.series.Series.__invert__"e builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -atpandas.core.series.Series.at"B -pandas.core.indexing._AtIndexer"pandas.core.indexing._AtIndexer* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*, +dropna + builtins.bool" builtins.bool *q +powpandas.core.series.Series.pow" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31446,20 +39274,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series0:builtins.property`* -catpandas.core.series.Series.cat"h -2pandas.core.arrays.categorical.CategoricalAccessor"2pandas.core.arrays.categorical.CategoricalAccessor* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31486,20 +39309,30 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series0:builtins.property`* -iatpandas.core.series.Series.iat"D - pandas.core.indexing._iAtIndexer" pandas.core.indexing._iAtIndexer* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*D +otherD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31526,18 +39359,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series0:builtins.property`*. -ilocpandas.core.series.Series.iloc" -8pandas.core.series._iLocIndexerSeries[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31564,18 +39393,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"%pandas.core.series._iLocIndexerSeries* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31602,18 +39427,55 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *% +prodpandas.core.series.Series.prod" +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series0:builtins.property`*. -locpandas.core.series.Series.loc" -7pandas.core.series._LocIndexerSeries[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31640,18 +39502,55 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *U +skipnaG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None * +level +None *2 + numeric_only + builtins.bool" builtins.bool *- + min_count + builtins.int" builtins.int * +kwargs +Any*% +product!pandas.core.series.Series.product" +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"$pandas.core.series._LocIndexerSeries* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31678,18 +39577,36 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series0:builtins.property`*X -addpandas.core.series.Series.add" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *U +skipnaG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None * +level +None *2 + numeric_only + builtins.bool" builtins.bool *- + min_count + builtins.int" builtins.int * +kwargs +Any*O +raddpandas.core.series.Series.radd" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31716,18 +39633,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31754,19 +39668,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*' -other& -Union[pandas.core.series.Series[pandas._typing.S1],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]]] -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*# +other# +Union[pandas.core.series.Series[pandas._typing.S1],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]]] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31793,14 +39704,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] @@ -31830,15 +39738,18 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand fill_valueJ Union[builtins.float,None] builtins.float"builtins.float -None *( -axis - builtins.int" builtins.int * -allpandas.core.series.Series.all" - builtins.bool" builtins.bool* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +None * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex *O +rdivmod!pandas.core.series.Series.rdivmod" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31865,35 +39776,51 @@ fill_valueJ builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *X - bool_onlyG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None *, -skipna - builtins.bool" builtins.bool * -kwargs -Any* -anypandas.core.series.Series.any" - builtins.bool" builtins.bool* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*# +other# +Union[pandas.core.series.Series[pandas._typing.S1],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]]] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31920,33 +39847,52 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *X - bool_onlyG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None *, -skipna - builtins.bool" builtins.bool * -kwargs -Any*1 -cummax pandas.core.series.Series.cummax" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex *, + rfloordiv#pandas.core.series.Series.rfloordiv" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31973,18 +39919,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -32011,33 +39954,36 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +other +Any* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *, -skipna - builtins.bool" builtins.bool * -args -Any* -kwargs -Any*1 -cummin pandas.core.series.Series.cummin" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex *O +rmodpandas.core.series.Series.rmod" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -32064,18 +40010,15 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -32102,33 +40045,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *, -skipna - builtins.bool" builtins.bool * -args -Any* -kwargs -Any*1 -cumprod!pandas.core.series.Series.cumprod" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*# +other# +Union[pandas.core.series.Series[pandas._typing.S1],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]]] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -32155,18 +40081,52 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex *O +rpowpandas.core.series.Series.rpow" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -32193,33 +40153,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *, -skipna - builtins.bool" builtins.bool * -args -Any* -kwargs -Any*1 -cumsum pandas.core.series.Series.cumsum" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -32246,18 +40188,16 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*# +other# +Union[pandas.core.series.Series[pandas._typing.S1],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]]] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -32284,36 +40224,52 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *, -skipna - builtins.bool" builtins.bool * -args -Any* -kwargs -Any*? -divide pandas.core.series.Series.divide"h -)pandas.core.series.Series[builtins.float] -builtins.float"builtins.float"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex *O +rsubpandas.core.series.Series.rsub" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -32340,39 +40296,15 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*" -other" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -32399,37 +40331,16 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *\ - -fill_valueJ -Union[builtins.float,None] -builtins.float"builtins.float -None * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *U -divmod pandas.core.series.Series.divmod" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*# +other# +Union[pandas.core.series.Series[pandas._typing.S1],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]]] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -32456,18 +40367,52 @@ fill_valueJ builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex *, +rtruediv"pandas.core.series.Series.rtruediv" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -32494,39 +40439,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*" -other" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -32553,14 +40474,13 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +other +Any* level :Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] .TypeAlias[Union[typing.Hashable,builtins.int]]i @@ -32579,14 +40499,30 @@ fill_valueJ Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *D -eqpandas.core.series.Series.eq"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex *% +sempandas.core.series.Series.sem" +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.floatT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -32613,16 +40549,33 @@ fill_valueJ builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*' -other& -Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1]] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *U +skipnaG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None * +level +None *( +ddof + builtins.int" builtins.int *2 + numeric_only + builtins.bool" builtins.bool * +kwargs +Any*% +skewpandas.core.series.Series.skew" TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] @@ -32640,10 +40593,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.complex"builtins.complex"pandas._typing.Scalar* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -32670,41 +40624,36 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *\ - -fill_valueJ -Union[builtins.float,None] -builtins.float"builtins.float -None * -axis +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex * -ewmpandas.core.series.Series.ewm" -Npandas.core.window.ewm.ExponentialMovingWindow[pandas.core.series.Series[Any]]D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series".pandas.core.window.ewm.ExponentialMovingWindow* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex +None *U +skipnaG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None * +level +None *2 + numeric_only + builtins.bool" builtins.bool * +kwargs +Any* +stdpandas.core.series.Series.std" +builtins.float"builtins.float* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -32731,51 +40680,36 @@ Npandas.core.window.ewm.ExponentialMovingWindow[pandas.core.series.Series[Any]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*U -comJ -Union[builtins.float,None] -builtins.float"builtins.float -None *V -spanJ -Union[builtins.float,None] -builtins.float"builtins.float -None *Z -halflifeJ -Union[builtins.float,None] -builtins.float"builtins.float -None *W -alphaJ -Union[builtins.float,None] -builtins.float"builtins.float -None */ - min_periods - builtins.int" builtins.int *, -adjust - builtins.bool" builtins.bool */ - ignore_na - builtins.bool" builtins.bool * -axis +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex * - expanding#pandas.core.series.Series.expanding" -Fpandas.core.window.expanding.Expanding[pandas.core.series.Series[Any]]D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series"&pandas.core.window.expanding.Expanding* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex +None *U +skipnaG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None * +level +None *( +ddof + builtins.int" builtins.int *2 + numeric_only + builtins.bool" builtins.bool * +kwargs +Any*q +subpandas.core.series.Series.sub" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -32802,37 +40736,15 @@ Fpandas.core.window.expanding.Expanding[pandas.core.series.Series[Any]]D builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*/ - min_periods - builtins.int" builtins.int * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex * -method -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.CalculationMethod *@ -floordiv"pandas.core.series.Series.floordiv"b -'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -32859,19 +40771,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*" -other" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*D +otherD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 @@ -32882,16 +40791,10 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.str" builtins.str9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -32918,42 +40821,14 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *\ - -fill_valueJ -Union[builtins.float,None] -builtins.float"builtins.float -None * -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *D -gepandas.core.series.Series.ge"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -32980,37 +40855,14 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*' -other& -Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1]] -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -33037,14 +40889,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* level :Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] .TypeAlias[Union[typing.Hashable,builtins.int]]i @@ -33056,21 +40905,20 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand fill_valueJ Union[builtins.float,None] builtins.float"builtins.float -None * -axis +None * +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *D -gtpandas.core.series.Series.gt"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex +None *q +subtract"pandas.core.series.Series.subtract" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -33097,37 +40945,15 @@ fill_valueJ builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*' -other& -Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1]] -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -33154,36 +40980,30 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *\ - -fill_valueJ -Union[builtins.float,None] -builtins.float"builtins.float -None * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *- -itempandas.core.series.Series.item" -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*D +otherD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -33210,18 +41030,14 @@ fill_valueJ builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -33248,37 +41064,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*( -kurtpandas.core.series.Series.kurt" -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -33305,88 +41098,23 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *, -skipna - builtins.bool" builtins.bool * -level -None *2 - numeric_only - builtins.bool" builtins.bool * -kwargs -Any*( -kurtosis"pandas.core.series.Series.kurtosis" -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * axis IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] @@ -33395,22 +41123,11 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.str" builtins.str7 Literal[builtins.int]  builtins.int" builtins.int"pandas._typing.AxisIndex -None *, -skipna - builtins.bool" builtins.bool * -level -None *2 - numeric_only - builtins.bool" builtins.bool * -kwargs -Any*D -lepandas.core.series.Series.le"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +None *& +to_list!pandas.core.series.Series.to_list" + builtins.list[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -33437,37 +41154,15 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*' -other& -Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1]] -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset" builtins.list* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -33487,47 +41182,26 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand Type[builtins.str] builtins.str" builtins.str"typeF Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *\ - -fill_valueJ -Union[builtins.float,None] -builtins.float"builtins.float -None * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *D -ltpandas.core.series.Series.lt"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*. +to_numpy"pandas.core.series.Series.to_numpy"9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -33554,16 +41228,38 @@ fill_valueJ builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*' -other& -Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1]] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +dtype +Union[TypeAlias[Union[numpy.dtype[Any],None,builtins.type,numpy._typing._dtype_like._SupportsDType[numpy.dtype[Any]],builtins.str,TypeAlias[Union[Tuple[TypeAlias[Any],builtins.int],Unknown,builtins.list[Any],TypeAlias[TypedDict],Unknown]]]],None] + +TypeAlias[Union[numpy.dtype[Any],None,builtins.type,numpy._typing._dtype_like._SupportsDType[numpy.dtype[Any]],builtins.str,TypeAlias[Union[Tuple[TypeAlias[Any],builtins.int],Unknown,builtins.list[Any],TypeAlias[TypedDict],Unknown]]]] +Union[numpy.dtype[Any],None,builtins.type,numpy._typing._dtype_like._SupportsDType[numpy.dtype[Any]],builtins.str,TypeAlias[Union[Tuple[TypeAlias[Any],builtins.int],Unknown,builtins.list[Any],TypeAlias[TypedDict],Unknown]]]( +numpy.dtype[Any] +Any" numpy.dtype +None + builtins.type" builtins.type +:numpy._typing._dtype_like._SupportsDType[numpy.dtype[Any]]( +numpy.dtype[Any] +Any" numpy.dtype"(numpy._typing._dtype_like._SupportsDType + builtins.str" builtins.str +lTypeAlias[Union[Tuple[TypeAlias[Any],builtins.int],Unknown,builtins.list[Any],TypeAlias[TypedDict],Unknown]] +aUnion[Tuple[TypeAlias[Any],builtins.int],Unknown,builtins.list[Any],TypeAlias[TypedDict],Unknown] +"Tuple[TypeAlias[Any],builtins.int]G +TypeAlias[Any] +Any"*numpy._typing._dtype_like._DTypeLikeNested + builtins.int" builtins.int, +builtins.list[Any] +Any" builtins.listM +TypeAlias[TypedDict] + TypedDict "$numpy._typing._dtype_like._DTypeDict"(numpy._typing._dtype_like._VoidDTypeLike"#numpy._typing._dtype_like.DTypeLike +None ** +copy + builtins.bool" builtins.bool * +na_value TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] @@ -33581,10 +41277,13 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.complex"builtins.complex"pandas._typing.Scalar * +kwargs +Any*& +tolist pandas.core.series.Series.tolist" + builtins.list[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -33611,36 +41310,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *\ - -fill_valueJ -Union[builtins.float,None] -builtins.float"builtins.float -None * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *1 -maxpandas.core.series.Series.max" -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset" builtins.list* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -33667,18 +41345,18 @@ fill_valueJ builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +truediv!pandas.core.series.Series.truediv"h +)pandas.core.series.Series[builtins.float] +builtins.float"builtins.float"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -33705,94 +41383,55 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +other +Any* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *, -skipna - builtins.bool" builtins.bool * -level -None *2 - numeric_only - builtins.bool" builtins.bool * -kwargs -Any* -meanpandas.core.series.Series.mean" -builtins.float"builtins.float* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex *% +varpandas.core.series.Series.var" +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] builtins.str" builtins.str builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& + datetime.date" datetime.date& datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *, -skipna - builtins.bool" builtins.bool * -level -None *2 - numeric_only - builtins.bool" builtins.bool * -kwargs -Any* -median pandas.core.series.Series.median" -builtins.float"builtins.float* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -33819,14 +41458,11 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* axis IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] @@ -33835,18 +41471,24 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.str" builtins.str7 Literal[builtins.int]  builtins.int" builtins.int"pandas._typing.AxisIndex -None *, -skipna - builtins.bool" builtins.bool * +None *U +skipnaG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None * level -None *2 +None *( +ddof + builtins.int" builtins.int *2 numeric_only builtins.bool" builtins.bool * kwargs -Any*1 -minpandas.core.series.Series.min" -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any*/ +set_axis"pandas.core.series.Series.set_axis" +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -33873,18 +41515,16 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(* +self +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -33911,35 +41551,34 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(* +labels +Any* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *, -skipna - builtins.bool" builtins.bool * -level -None *2 - numeric_only - builtins.bool" builtins.bool * -kwargs -Any*V -modpandas.core.series.Series.mod" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis ** +copy + builtins.bool" builtins.bool *& +__iter__"pandas.core.series.Series.__iter__" +"typing.Iterator[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -33966,18 +41605,14 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Iterator* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -34004,39 +41639,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*" -other" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*- +xspandas.core.series.Series.xs" +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -34063,39 +41675,16 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *\ - -fill_valueJ -Union[builtins.float,None] -builtins.float"builtins.float -None * -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *V -mulpandas.core.series.Series.mul" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(* +self +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -34122,18 +41711,39 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(*+ +key" +typing.Hashable"typing.Hashable* +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex * +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *0 + +drop_level + builtins.bool" builtins.bool 2 +__new__!pandas.core.series.Series.__new__, +__new__!pandas.core.series.Series.__new__"h +)pandas.core.series.Series[builtins.float] +builtins.float"builtins.float"pandas.core.series.Series* +cls +2Type[pandas.core.series.Series[pandas._typing.S1]] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -34160,47 +41770,43 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*" -other" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"type* +data +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray* + +index + +Union[TypeAlias[Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]]],None] +TypeAlias[Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]]] +Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]] +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray" builtins.dict, +Any" numpy.ndarray"pandas._typing.AnyArrayLike, builtins.list[Any] -Any" builtins.list. +Any" builtins.list9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +builtins.range"builtins.range. builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex +Any"builtins.tuple"pandas._typing.Axes +None * +dtype TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P &pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype @@ -34216,42 +41822,18 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P Type[builtins.bool] builtins.bool" builtins.bool"typeC Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *\ - -fill_valueJ -Union[builtins.float,None] -builtins.float"builtins.float -None * -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *V -multiply"pandas.core.series.Series.multiply" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype *. +name" +typing.Hashable"typing.Hashable ** +copy + builtins.bool" builtins.bool 0:typing.overloadXO +__new__!pandas.core.series.Series.__new__"H +"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries* +cls +2Type[pandas.core.series.Series[pandas._typing.S1]] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -34278,18 +41860,163 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"type* +data +Union[pandas.core.indexes.datetimes.DatetimeIndex,typing.Sequence[Union[numpy.datetime64,datetime.datetime,datetime.date]],builtins.dict[pandas._typing.HashableT1,Union[numpy.datetime64,datetime.datetime,datetime.date]],numpy.datetime64,datetime.datetime,datetime.date]Z ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex +Htyping.Sequence[Union[numpy.datetime64,datetime.datetime,datetime.date]] +7Union[numpy.datetime64,datetime.datetime,datetime.date]$ +numpy.datetime64"numpy.datetime64& +datetime.datetime"datetime.datetime + datetime.date" datetime.date"typing.Sequence +`builtins.dict[pandas._typing.HashableT1,Union[numpy.datetime64,datetime.datetime,datetime.date]]R +pandas._typing.HashableT1" +typing.Hashable"typing.Hashable"typing.Hashable +7Union[numpy.datetime64,datetime.datetime,datetime.date]$ +numpy.datetime64"numpy.datetime64& +datetime.datetime"datetime.datetime + datetime.date" datetime.date" builtins.dict$ +numpy.datetime64"numpy.datetime64& +datetime.datetime"datetime.datetime + datetime.date" datetime.date* + +index + +Union[TypeAlias[Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]]],None] +TypeAlias[Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]]] +Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]] +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.AnyArrayLike, +builtins.list[Any] +Any" builtins.list9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +builtins.range"builtins.range. +builtins.tuple[Any] +Any"builtins.tuple"pandas._typing.Axes +None *& +dtype& +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimestampDtypeArg *. +name" +typing.Hashable"typing.Hashable ** +copy + builtins.bool" builtins.bool 0:typing.overloadXt +__new__!pandas.core.series.Series.__new__"H +"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries* +cls +2Type[pandas.core.series.Series[pandas._typing.S1]] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -34316,19 +42043,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*" -other" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"type*. +data. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 @@ -34339,16 +42061,10 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.str" builtins.str9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -34375,42 +42091,14 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *\ - -fill_valueJ -Union[builtins.float,None] -builtins.float"builtins.float -None * -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *D -nepandas.core.series.Series.ne"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -34437,174 +42125,145 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*' -other& -Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1]] -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike* -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *\ +index -fill_valueJ -Union[builtins.float,None] -builtins.float"builtins.float -None * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +Union[TypeAlias[Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]]],None] +TypeAlias[Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]]] +Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]] +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.AnyArrayLike, +builtins.list[Any] +Any" builtins.list9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +builtins.range"builtins.range. +builtins.tuple[Any] +Any"builtins.tuple"pandas._typing.Axes +None *& +dtype& +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex * -nunique!pandas.core.series.Series.nunique" - builtins.int" builtins.int* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*, -dropna - builtins.bool" builtins.bool *V -powpandas.core.series.Series.pow" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimestampDtypeArg*. +name" +typing.Hashable"typing.Hashable ** +copy + builtins.bool" builtins.bool 0:typing.overloadX# +__new__!pandas.core.series.Series.__new__"B +pandas.core.series.PeriodSeries"pandas.core.series.PeriodSeries* +cls +2Type[pandas.core.series.Series[pandas._typing.S1]] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -34631,39 +42290,53 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*" -other" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"type* +data +`Union[pandas.core.indexes.period.PeriodIndex,typing.Sequence[pandas._libs.tslibs.period.Period]]P +&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex +2typing.Sequence[pandas._libs.tslibs.period.Period]F +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period"typing.Sequence* + +index + +Union[TypeAlias[Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]]],None] +TypeAlias[Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]]] +Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]] +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray" builtins.dict, +Any" numpy.ndarray"pandas._typing.AnyArrayLike, builtins.list[Any] -Any" builtins.list. +Any" builtins.list9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +builtins.range"builtins.range. builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any"builtins.tuple"pandas._typing.Axes +None *[ +dtypeN +%pandas.core.dtypes.dtypes.PeriodDtype"%pandas.core.dtypes.dtypes.PeriodDtype *. +name" +typing.Hashable"typing.Hashable ** +copy + builtins.bool" builtins.bool 0:typing.overloadXL +__new__!pandas.core.series.Series.__new__"H +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* +cls +2Type[pandas.core.series.Series[pandas._typing.S1]] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -34690,58 +42363,162 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *\ +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"type* +data +Union[pandas.core.indexes.timedeltas.TimedeltaIndex,typing.Sequence[Union[numpy.timedelta64,datetime.timedelta]],builtins.dict[pandas._typing.HashableT1,Union[numpy.timedelta64,datetime.timedelta]],numpy.timedelta64,datetime.timedelta]^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex + - sort_values%pandas.core.series.Series.sort_values" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX: +rename pandas.core.series.Series.rename" +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -42122,18 +49203,16 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(* +self +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -42160,15 +49239,26 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(* +index +xUnion[TypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]],None] +lTypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]] +aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]] +:typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]] +Any +&TypeAlias[Union[typing.Hashable,None]]M +Union[typing.Hashable,None]" +typing.Hashable"typing.Hashable +None"pandas._typing.Label"typing.MappingK +CallableType[builtins.function]& +builtins.function"builtins.function"pandas._typing.Renamer +None * +axis +Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] @@ -42182,45 +49272,32 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * - ascending -3Union[builtins.bool,typing.Sequence[builtins.bool]] - builtins.bool" builtins.boolQ -typing.Sequence[builtins.bool] - builtins.bool" builtins.bool"typing.Sequence * -kind -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.SortKind * - na_position + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis +None ** +copy + builtins.bool" builtins.bool *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool * +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None * +errors =TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] 2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.NaPosition *2 - ignore_index - builtins.bool" builtins.bool *I -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool * -key -+Union[CallableType[builtins.function],None]K -CallableType[builtins.function]& -builtins.function"builtins.function -None 0:typing.overloadX? - sort_values%pandas.core.series.Series.sort_values" -8Union[pandas.core.series.Series[pandas._typing.S1],None] -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX6 +rename pandas.core.series.Series.rename" +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -42247,19 +49324,16 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(* +self +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -42286,15 +49360,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(*Z +indexM +Union[typing.Hashable,None]" +typing.Hashable"typing.Hashable +None * +axis +Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] @@ -42308,50 +49384,36 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * - ascending -3Union[builtins.bool,typing.Sequence[builtins.bool]] - builtins.bool" builtins.boolQ -typing.Sequence[builtins.bool] - builtins.bool" builtins.bool"typing.Sequence *V -inplaceG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None * -kind -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.SortKind * - na_position + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis +None ** +copy + builtins.bool" builtins.bool *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool * +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None * +errors =TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] 2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.NaPosition *2 - ignore_index - builtins.bool" builtins.bool * -key -+Union[CallableType[builtins.function],None]K -CallableType[builtins.function]& -builtins.function"builtins.function -None 0:typing.overloadX2 - -sort_index$pandas.core.series.Series.sort_index* - -sort_index$pandas.core.series.Series.sort_index" -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX' +rename pandas.core.series.Series.rename"~ +*Union[pandas.core.series.Series[Any],None]D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series +None* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -42378,15 +49440,27 @@ sort_index$pandas.core.series.Series.sort_index" builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +index +Union[TypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]],typing.Hashable,None] +lTypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]] +aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]] +:typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]] +Any +&TypeAlias[Union[typing.Hashable,None]]M +Union[typing.Hashable,None]" +typing.Hashable"typing.Hashable +None"pandas._typing.Label"typing.MappingK +CallableType[builtins.function]& +builtins.function"builtins.function"pandas._typing.Renamer" +typing.Hashable"typing.Hashable +None * +axis +Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] @@ -42400,57 +49474,33 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis +None ** +copy + builtins.bool" builtins.bool *- +inplace + builtins.bool" builtins.bool * level :Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] .TypeAlias[Union[typing.Hashable,builtins.int]]i #Union[typing.Hashable,builtins.int]" typing.Hashable"typing.Hashable builtins.int" builtins.int"pandas._typing.Level -None * - ascending -3Union[builtins.bool,typing.Sequence[builtins.bool]] - builtins.bool" builtins.boolQ -typing.Sequence[builtins.bool] - builtins.bool" builtins.bool"typing.Sequence * -kind -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.SortKind * - na_position +None * +errors =TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] 2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.NaPosition *4 -sort_remaining - builtins.bool" builtins.bool *2 - ignore_index - builtins.bool" builtins.bool *G -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool* -key -+Union[CallableType[builtins.function],None]K -CallableType[builtins.function]& -builtins.function"builtins.function -None 0:typing.overloadX, - -sort_index$pandas.core.series.Series.sort_index"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX2 +fillna pandas.core.series.Series.fillna> +fillna pandas.core.series.Series.fillna" +None* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -42477,85 +49527,188 @@ sort_index$pandas.core.series.Series.sort_index"D builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*% +value% +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],pandas.core.frame.DataFrame,None] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar: +pandas._libs.missing.NAType"pandas._libs.missing.NAType9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame +None * +axis =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -level -rUnion[TypeAlias[Union[typing.Hashable,builtins.int]],builtins.list[builtins.int],builtins.list[builtins.str],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.LevelJ -builtins.list[builtins.int] - builtins.int" builtins.int" builtins.listJ -builtins.list[builtins.str] - builtins.str" builtins.str" builtins.list -None * - ascending -3Union[builtins.bool,typing.Sequence[builtins.bool]] - builtins.bool" builtins.boolQ -typing.Sequence[builtins.bool] - builtins.bool" builtins.bool"typing.Sequence * -kind -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.SortKind * - na_position -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.NaPosition *4 -sort_remaining - builtins.bool" builtins.bool *2 - ignore_index - builtins.bool" builtins.bool *I + builtins.int" builtins.int"pandas._typing.AxisIndex *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None *{ +downcastk +"Union[builtins.dict[Any,Any],None]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +None *G inplace: Literal[builtins.bool]  - builtins.bool" builtins.bool * -key -+Union[CallableType[builtins.function],None]K -CallableType[builtins.function]& -builtins.function"builtins.function -None 0:typing.overloadX- - -sort_index$pandas.core.series.Series.sort_index"~ -*Union[pandas.core.series.Series[Any],None]D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool0:typing.overloadXQ +fillna pandas.core.series.Series.fillna" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*% +value% +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],pandas.core.frame.DataFrame,None] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.floatT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar: +pandas._libs.missing.NAType"pandas._libs.missing.NAType9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -42582,80 +49735,38 @@ sort_index$pandas.core.series.Series.sort_index"~ builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame +None * +axis =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -level -rUnion[TypeAlias[Union[typing.Hashable,builtins.int]],builtins.list[builtins.int],builtins.list[builtins.str],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.LevelJ -builtins.list[builtins.int] - builtins.int" builtins.int" builtins.listJ -builtins.list[builtins.str] - builtins.str" builtins.str" builtins.list -None * - ascending -3Union[builtins.bool,typing.Sequence[builtins.bool]] - builtins.bool" builtins.boolQ -typing.Sequence[builtins.bool] - builtins.bool" builtins.bool"typing.Sequence *V -inplaceG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None * -kind -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.SortKind * - na_position -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.NaPosition *4 -sort_remaining - builtins.bool" builtins.bool *2 - ignore_index - builtins.bool" builtins.bool * -key -+Union[CallableType[builtins.function],None]K -CallableType[builtins.function]& -builtins.function"builtins.function -None 0:typing.overloadX2l - aggregate#pandas.core.series.Series.aggregate2 - aggregate#pandas.core.series.Series.aggregate" -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None *{ +downcastk +"Union[builtins.dict[Any,Any],None]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +None *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool 0:typing.overloadXQ +fillna pandas.core.series.Series.fillna" +8Union[pandas.core.series.Series[pandas._typing.S1],None] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -42682,18 +49793,16 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series +None* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -42720,36 +49829,38 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*% +value% +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],pandas.core.frame.DataFrame,None] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -func -JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] -?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K -CallableType[builtins.function]& -builtins.function"builtins.function - builtins.str" builtins.str - numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase* -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex * -args -Any* -kwargs -Any0:typing.overloadX9 - aggregate#pandas.core.series.Series.aggregate" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar: +pandas._libs.missing.NAType"pandas._libs.missing.NAType9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -42776,18 +49887,37 @@ JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame +None * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex *- +inplace + builtins.bool" builtins.bool *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None *{ +downcastk +"Union[builtins.dict[Any,Any],None]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +None 0:typing.overloadX2 +replace!pandas.core.series.Series.replaceS +replace!pandas.core.series.Series.replace" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -42814,44 +49944,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -func -TypeAlias[Union[builtins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]],TypeAlias[typing.Mapping[pandas._typing.HashableT,Unknown]]]] -Union[builtins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]],TypeAlias[typing.Mapping[pandas._typing.HashableT,Unknown]]] -Ybuiltins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]] -JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] -?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K -CallableType[builtins.function]& -builtins.function"builtins.function - builtins.str" builtins.str - numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase" builtins.list -;TypeAlias[typing.Mapping[pandas._typing.HashableT,Unknown]] -0typing.Mapping[pandas._typing.HashableT,Unknown]Q -pandas._typing.HashableT" -typing.Hashable"typing.Hashable"typing.Hashable"typing.Mapping"$pandas._typing.AggFuncTypeDictSeries"'pandas._typing.AggFuncTypeSeriesToFrame * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex * -args -Any* -kwargs -Any0:typing.overloadX2V - transform#pandas.core.series.Series.transform3 - transform#pandas.core.series.Series.transform" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -42878,18 +49979,23 @@ JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* + +to_replace +~Union[builtins.str,builtins.list[Any],builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],builtins.float,None] + builtins.str" builtins.str, +builtins.list[Any] +Any" builtins.list9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -42916,38 +50022,65 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series +builtins.float"builtins.float +None * +value +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],builtins.list[Any],builtins.str,None] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -func -JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] -?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K -CallableType[builtins.function]& -builtins.function"builtins.function - builtins.str" builtins.str - numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase* -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar: +pandas._libs.missing.NAType"pandas._libs.missing.NAType9 +builtins.dict[Any,Any] +Any +Any" builtins.dict, +builtins.list[Any] +Any" builtins.list + builtins.str" builtins.str +None *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None * +regex +Any * +method +STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex * -args -Any* -kwargs -Any0:typing.overloadX" - transform#pandas.core.series.Series.transform": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ReplaceMethod 0:typing.overloadX@ +replace!pandas.core.series.Series.replace" +None* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -42974,48 +50107,23 @@ JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -func -Union[builtins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]],TypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]]] -Ybuiltins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]] -JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] -?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K -CallableType[builtins.function]& -builtins.function"builtins.function - builtins.str" builtins.str - numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase" builtins.list -YTypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]] -Ntyping.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]Q -pandas._typing.HashableT" -typing.Hashable"typing.Hashable"typing.HashableV -%Union[Unknown,builtins.list[Unknown]]) -builtins.list[Unknown]" builtins.list"typing.Mapping"#pandas._typing.AggFuncTypeDictFrame* -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex * -args -Any* -kwargs -Any0:typing.overloadX23 -applypandas.core.series.Series.apply -applypandas.core.series.Series.apply"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* + +to_replace +~Union[builtins.str,builtins.list[Any],builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],builtins.float,None] + builtins.str" builtins.str, +builtins.list[Any] +Any" builtins.list9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -43042,30 +50150,64 @@ Ntyping.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series +builtins.float"builtins.float +None * +value +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],builtins.list[Any],builtins.str,None] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*U -funcK -CallableType[builtins.function]& -builtins.function"builtins.function*2 - convertDType - builtins.bool" builtins.bool *: -args. -builtins.tuple[Any] -Any"builtins.tuple * -kwds -Any0:typing.overloadX -applypandas.core.series.Series.apply": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar: +pandas._libs.missing.NAType"pandas._libs.missing.NAType9 +builtins.dict[Any,Any] +Any +Any" builtins.dict, +builtins.list[Any] +Any" builtins.list + builtins.str" builtins.str +None *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None * +regex +Any * +method +STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ReplaceMethod *G +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool0:typing.overloadXT +replace!pandas.core.series.Series.replace" +8Union[pandas.core.series.Series[pandas._typing.S1],None] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -43092,31 +50234,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*U -funcK -CallableType[builtins.function]& -builtins.function"builtins.function*2 - convertDType - builtins.bool" builtins.bool *: -args. -builtins.tuple[Any] -Any"builtins.tuple * -kwds -Any0:typing.overloadX2 -rename pandas.core.series.Series.rename* -rename pandas.core.series.Series.rename" -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series +None* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -43143,71 +50270,23 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -index -Union[TypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]],typing.Hashable,None] -lTypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]] -aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]] -:typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]] -Any -&TypeAlias[Union[typing.Hashable,None]]M -Union[typing.Hashable,None]" -typing.Hashable"typing.Hashable -None"pandas._typing.Label"typing.MappingK -CallableType[builtins.function]& -builtins.function"builtins.function"pandas._typing.Renamer" -typing.Hashable"typing.Hashable -None * -axis -Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis -None ** -copy - builtins.bool" builtins.bool *G -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool* -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX* -rename pandas.core.series.Series.rename"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* + +to_replace +~Union[builtins.str,builtins.list[Any],builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],builtins.float,None] + builtins.str" builtins.str, +builtins.list[Any] +Any" builtins.list9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -43234,70 +50313,65 @@ aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[b builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series +builtins.float"builtins.float +None * +value +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],builtins.list[Any],builtins.str,None] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -index -xUnion[TypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]],None] -lTypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]] -aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]] -:typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]] -Any -&TypeAlias[Union[typing.Hashable,None]]M -Union[typing.Hashable,None]" -typing.Hashable"typing.Hashable -None"pandas._typing.Label"typing.MappingK -CallableType[builtins.function]& -builtins.function"builtins.function"pandas._typing.Renamer -None * -axis -Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar: +pandas._libs.missing.NAType"pandas._libs.missing.NAType9 +builtins.dict[Any,Any] +Any +Any" builtins.dict, +builtins.list[Any] +Any" builtins.list + builtins.str" builtins.str +None *- +inplace + builtins.bool" builtins.bool *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None * +regex +Any * +method +STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis -None ** -copy - builtins.bool" builtins.bool *I -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX% -rename pandas.core.series.Series.rename"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.str" builtins.str"pandas._typing.ReplaceMethod 0:typing.overloadX2o +dropna pandas.core.series.Series.dropna +dropna pandas.core.series.Series.dropna" +None* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -43324,63 +50398,32 @@ aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[b builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*Z -indexM -Union[typing.Hashable,None]" -typing.Hashable"typing.Hashable -None * -axis -Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis -None ** -copy - builtins.bool" builtins.bool *I + builtins.int" builtins.int"pandas._typing.AxisIndex *G inplace: Literal[builtins.bool]  - builtins.bool" builtins.bool * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 + builtins.bool" builtins.bool* +how +7Union[Literal[builtins.str],Literal[builtins.str],None]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX+ -rename pandas.core.series.Series.rename"~ -*Union[pandas.core.series.Series[Any],None]D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.str" builtins.str +None 0:typing.overloadX+ +dropna pandas.core.series.Series.dropna" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -43407,70 +50450,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -index -Union[TypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]],typing.Hashable,None] -lTypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]] -aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]] -:typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]] -Any -&TypeAlias[Union[typing.Hashable,None]]M -Union[typing.Hashable,None]" -typing.Hashable"typing.Hashable -None"pandas._typing.Label"typing.MappingK -CallableType[builtins.function]& -builtins.function"builtins.function"pandas._typing.Renamer" -typing.Hashable"typing.Hashable -None * -axis -Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis -None ** -copy - builtins.bool" builtins.bool *- -inplace - builtins.bool" builtins.bool * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX2 -droppandas.core.series.Series.drop+ -droppandas.core.series.Series.drop" -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -43497,77 +50485,33 @@ aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[b builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -labels -cUnion[typing.Hashable,builtins.list[pandas._typing.HashableT1],pandas.core.indexes.base.Index[Any]]" -typing.Hashable"typing.Hashable -(builtins.list[pandas._typing.HashableT1]R -pandas._typing.HashableT1" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.listN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index * -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -index -cUnion[typing.Hashable,builtins.list[pandas._typing.HashableT2],pandas.core.indexes.base.Index[Any]]" -typing.Hashable"typing.Hashable -(builtins.list[pandas._typing.HashableT2]R -pandas._typing.HashableT2" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.listN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index * -columns -cUnion[typing.Hashable,builtins.list[pandas._typing.HashableT3],pandas.core.indexes.base.Index[Any]]" -typing.Hashable"typing.Hashable -(builtins.list[pandas._typing.HashableT3]R -pandas._typing.HashableT3" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.listN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *G + builtins.int" builtins.int"pandas._typing.AxisIndex *I inplace: Literal[builtins.bool]  - builtins.bool" builtins.bool* -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 + builtins.bool" builtins.bool * +how +7Union[Literal[builtins.str],Literal[builtins.str],None]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX, -droppandas.core.series.Series.drop"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.str" builtins.str +None 0:typing.overloadX+ +dropna pandas.core.series.Series.dropna" +8Union[pandas.core.series.Series[pandas._typing.S1],None] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -43594,79 +50538,16 @@ cUnion[typing.Hashable,builtins.list[pandas._typing.HashableT3],pandas.core.inde builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -labels -cUnion[typing.Hashable,builtins.list[pandas._typing.HashableT1],pandas.core.indexes.base.Index[Any]]" -typing.Hashable"typing.Hashable -(builtins.list[pandas._typing.HashableT1]R -pandas._typing.HashableT1" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.listN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index * -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -index -cUnion[typing.Hashable,builtins.list[pandas._typing.HashableT2],pandas.core.indexes.base.Index[Any]]" -typing.Hashable"typing.Hashable -(builtins.list[pandas._typing.HashableT2]R -pandas._typing.HashableT2" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.listN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index * -columns -cUnion[typing.Hashable,builtins.list[pandas._typing.HashableT3],pandas.core.indexes.base.Index[Any]]" -typing.Hashable"typing.Hashable -(builtins.list[pandas._typing.HashableT3]R -pandas._typing.HashableT3" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.listN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *I -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX, -droppandas.core.series.Series.drop"~ -*Union[pandas.core.series.Series[Any],None]D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series +None* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -43693,76 +50574,35 @@ cUnion[typing.Hashable,builtins.list[pandas._typing.HashableT3],pandas.core.inde builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -labels -cUnion[typing.Hashable,builtins.list[pandas._typing.HashableT1],pandas.core.indexes.base.Index[Any]]" -typing.Hashable"typing.Hashable -(builtins.list[pandas._typing.HashableT1]R -pandas._typing.HashableT1" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.listN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index * -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -index -cUnion[typing.Hashable,builtins.list[pandas._typing.HashableT2],pandas.core.indexes.base.Index[Any]]" -typing.Hashable"typing.Hashable -(builtins.list[pandas._typing.HashableT2]R -pandas._typing.HashableT2" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.listN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index * -columns -cUnion[typing.Hashable,builtins.list[pandas._typing.HashableT3],pandas.core.indexes.base.Index[Any]]" -typing.Hashable"typing.Hashable -(builtins.list[pandas._typing.HashableT3]R -pandas._typing.HashableT3" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.listN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *- + builtins.int" builtins.int"pandas._typing.AxisIndex *- inplace - builtins.bool" builtins.bool * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 + builtins.bool" builtins.bool * +how +7Union[Literal[builtins.str],Literal[builtins.str],None]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX2 -fillna pandas.core.series.Series.fillnaI -fillna pandas.core.series.Series.fillna" -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.str" builtins.str +None 0:typing.overloadX2 +astype pandas.core.series.Series.astype +astype pandas.core.series.Series.astype"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -43789,41 +50629,49 @@ cUnion[typing.Hashable,builtins.list[pandas._typing.HashableT3],pandas.core.inde builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*) -value) -Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],pandas.core.frame.DataFrame,None] -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar: -pandas._libs.missing.NAType"pandas._libs.missing.NAType9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +dtype +TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]= +Type[builtins.bool] + builtins.bool" builtins.bool"type7 +Literal[builtins.str]  + builtins.str" builtins.strR +'pandas.core.arrays.boolean.BooleanDtype"'pandas.core.arrays.boolean.BooleanDtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Type[numpy.bool_] + numpy.bool_" numpy.bool_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.BooleanDtypeArg** +copy + builtins.bool" builtins.bool * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadXs +astype pandas.core.series.Series.astype"b +'pandas.core.series.Series[builtins.int] + builtins.int" builtins.int"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -43850,20 +50698,23 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame -None * -method -uUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*[ +dtype[ +Union[TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]]]& +TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: +Type[builtins.int] + builtins.int" builtins.int"type7 +Literal[builtins.str]  + builtins.str" builtins.strL +$pandas.core.arrays.integer.Int8Dtype"$pandas.core.arrays.integer.Int8DtypeN +%pandas.core.arrays.integer.Int16Dtype"%pandas.core.arrays.integer.Int16DtypeN +%pandas.core.arrays.integer.Int32Dtype"%pandas.core.arrays.integer.Int32DtypeN +%pandas.core.arrays.integer.Int64Dtype"%pandas.core.arrays.integer.Int64Dtype7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -43871,32 +50722,163 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.FillnaOptions -None * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str +)Type[numpy.signedinteger[TypeAlias[Any]]]v +#numpy.signedinteger[TypeAlias[Any]]: +TypeAlias[Any] +Any"numpy._typing._nbit._NBitByte"numpy.signedinteger"type7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None *{ -downcastk -"Union[builtins.dict[Any,Any],None]9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -None *G -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool0:typing.overloadX` -fillna pandas.core.series.Series.fillna" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IntDtypeArg$ +TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]N +%pandas.core.arrays.integer.UInt8Dtype"%pandas.core.arrays.integer.UInt8DtypeP +&pandas.core.arrays.integer.UInt16Dtype"&pandas.core.arrays.integer.UInt16DtypeP +&pandas.core.arrays.integer.UInt32Dtype"&pandas.core.arrays.integer.UInt32DtypeP +&pandas.core.arrays.integer.UInt64Dtype"&pandas.core.arrays.integer.UInt64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.UIntDtypeArg** +copy + builtins.bool" builtins.bool * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX +astype pandas.core.series.Series.astype"b +'pandas.core.series.Series[builtins.str] + builtins.str" builtins.str"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -43923,79 +50905,53 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +dtype +TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*) -value) -Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],pandas.core.frame.DataFrame,None] -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + builtins.str" builtins.str"type7 +Literal[builtins.str]  + builtins.str" builtins.strP +&pandas.core.arrays.string_.StringDtype"&pandas.core.arrays.string_.StringDtype7 +Literal[builtins.str]  + builtins.str" builtins.str4 +Type[numpy.str_] -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar: -pandas._libs.missing.NAType"pandas._libs.missing.NAType9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +numpy.str_" +numpy.str_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.StrDtypeArg** +copy + builtins.bool" builtins.bool * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX +astype pandas.core.series.Series.astype"h +)pandas.core.series.Series[builtins.bytes] +builtins.bytes"builtins.bytes"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -44022,20 +50978,20 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame -None * -method -uUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +dtype +TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ +Type[builtins.bytes] +builtins.bytes"builtins.bytes"type7 +Literal[builtins.str]  + builtins.str" builtins.str: +Type[numpy.bytes_] + numpy.bytes_" numpy.bytes_"type7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -44043,33 +50999,25 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.FillnaOptions -None * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.BytesDtypeArg** +copy + builtins.bool" builtins.bool * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None *{ -downcastk -"Union[builtins.dict[Any,Any],None]9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -None *I -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool 0:typing.overloadXa -fillna pandas.core.series.Series.fillna" -8Union[pandas.core.series.Series[pandas._typing.S1],None] -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX5 +astype pandas.core.series.Series.astype"h +)pandas.core.series.Series[builtins.float] +builtins.float"builtins.float"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -44096,19 +51044,98 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +dtype +TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ +Type[builtins.float] +builtins.float"builtins.float"type7 +Literal[builtins.str]  + builtins.str" builtins.strT +(pandas.core.arrays.floating.Float32Dtype"(pandas.core.arrays.floating.Float32DtypeT +(pandas.core.arrays.floating.Float64Dtype"(pandas.core.arrays.floating.Float64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +$Type[numpy.floating[TypeAlias[Any]]]l +numpy.floating[TypeAlias[Any]]: +TypeAlias[Any] +Any"numpy._typing._nbit._NBitHalf"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.FloatDtypeArg** +copy + builtins.bool" builtins.bool * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX, +astype pandas.core.series.Series.astype"n ++pandas.core.series.Series[builtins.complex]$ +builtins.complex"builtins.complex"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -44135,81 +51162,22 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*) -value) -Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],pandas.core.frame.DataFrame,None] -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar: -pandas._libs.missing.NAType"pandas._libs.missing.NAType9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +dtype +TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[TypeAlias[Any],Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[TypeAlias[Any],Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]F Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame -None * -method -uUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +builtins.complex"builtins.complex"type7 +Literal[builtins.str]  + builtins.str" builtins.str +3Type[numpy.complexfloating[TypeAlias[Any],Unknown]] +-numpy.complexfloating[TypeAlias[Any],Unknown]< +TypeAlias[Any] +Any"numpy._typing._nbit._NBitSingle"numpy.complexfloating"type7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -44217,70 +51185,52 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.FillnaOptions -None * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *- -inplace - builtins.bool" builtins.bool *Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None *{ -downcastk -"Union[builtins.dict[Any,Any],None]9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -None 0:typing.overloadX2 -replace!pandas.core.series.Series.replace^ -replace!pandas.core.series.Series.replace" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ComplexDtypeArg** +copy + builtins.bool" builtins.bool * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX; +astype pandas.core.series.Series.astype"H +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -44307,26 +51257,121 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* - -to_replace -~Union[builtins.str,builtins.list[Any],builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],builtins.float,None] - builtins.str" builtins.str, -builtins.list[Any] -Any" builtins.list9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*$ +dtype$ +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimedeltaDtypeArg** +copy + builtins.bool" builtins.bool * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX= +astype pandas.core.series.Series.astype"H +"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -44353,68 +51398,126 @@ to_replace builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series -builtins.float"builtins.float -None * -value -Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],builtins.list[Any],builtins.str,None] -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar: -pandas._libs.missing.NAType"pandas._libs.missing.NAType9 -builtins.dict[Any,Any] -Any -Any" builtins.dict, -builtins.list[Any] -Any" builtins.list - builtins.str" builtins.str -None *I -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool *Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None * -regex -Any * -method -STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*& +dtype& +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.ReplaceMethod 0:typing.overloadXG -replace!pandas.core.series.Series.replace" -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimestampDtypeArg** +copy + builtins.bool" builtins.bool * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX +astype pandas.core.series.Series.astype" +Epandas.core.series.Series[pandas.core.dtypes.dtypes.CategoricalDtype]X +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -44441,26 +51544,33 @@ HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* - -to_replace -~Union[builtins.str,builtins.list[Any],builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],builtins.float,None] - builtins.str" builtins.str, -builtins.list[Any] -Any" builtins.list9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +dtype +RTypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]] +GUnion[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]X +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.CategoryDtypeArg** +copy + builtins.bool" builtins.bool * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX$ +astype pandas.core.series.Series.astype"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -44487,106 +51597,57 @@ to_replace builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series -builtins.float"builtins.float -None * -value -Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],builtins.list[Any],builtins.str,None] -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +dtype +Union[TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]] +gTypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]] +\Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]C +Type[builtins.object]" +builtins.object"builtins.object"type7 +Literal[builtins.str]  + builtins.str" builtins.str= +Type[numpy.object_] + numpy.object_" numpy.object_"type7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ObjectDtypeArg +dTypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +YUnion[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]4 +Type[numpy.void] -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar: -pandas._libs.missing.NAType"pandas._libs.missing.NAType9 -builtins.dict[Any,Any] -Any -Any" builtins.dict, -builtins.list[Any] -Any" builtins.list - builtins.str" builtins.str -None *Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None * -regex -Any * -method -STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +numpy.void" +numpy.void"type7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.ReplaceMethod *G -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool0:typing.overloadX^ -replace!pandas.core.series.Series.replace" -8Union[pandas.core.series.Series[pandas._typing.S1],None] -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI + builtins.str" builtins.str"pandas._typing.VoidDtypeArgP +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +STypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]] +HUnion[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]I numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + numpy.generic" numpy.generic" numpy.dtypeP +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype"pandas._typing.DtypeObj** +copy + builtins.bool" builtins.bool * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX2E +ffillpandas.core.series.Series.ffill +ffillpandas.core.series.Series.ffill" +None* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -44613,26 +51674,37 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* - -to_replace -~Union[builtins.str,builtins.list[Any],builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],builtins.float,None] - builtins.str" builtins.str, -builtins.list[Any] -Any" builtins.list9 +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *G +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool*Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None *{ +downcastk +"Union[builtins.dict[Any,Any],None]9 builtins.dict[Any,Any] Any -Any" builtins.dict -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" builtins.dict +None 0:typing.overloadX, +ffillpandas.core.series.Series.ffill" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -44659,68 +51731,15 @@ to_replace builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series -builtins.float"builtins.float -None * -value -Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],builtins.list[Any],builtins.str,None] -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar: -pandas._libs.missing.NAType"pandas._libs.missing.NAType9 -builtins.dict[Any,Any] -Any -Any" builtins.dict, -builtins.list[Any] -Any" builtins.list - builtins.str" builtins.str -None *- -inplace - builtins.bool" builtins.bool *Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None * -regex -Any * -method -STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.ReplaceMethod 0:typing.overloadX2 -dropna pandas.core.series.Series.dropna -dropna pandas.core.series.Series.dropna" -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -44747,73 +51766,40 @@ HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *G + builtins.int" builtins.int"pandas._typing.AxisIndex +None *I inplace: Literal[builtins.bool]  - builtins.bool" builtins.bool* -how -7Union[Literal[builtins.str],Literal[builtins.str],None]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str -None 0:typing.overloadX2 -dropna pandas.core.series.Series.dropna" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None *{ +downcastk +"Union[builtins.dict[Any,Any],None]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +None 0:typing.overloadX2ř +bfillpandas.core.series.Series.bfill +bfillpandas.core.series.Series.bfill" +None* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -44840,36 +51826,37 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *I + builtins.int" builtins.int"pandas._typing.AxisIndex +None *G inplace: Literal[builtins.bool]  - builtins.bool" builtins.bool * -how -7Union[Literal[builtins.str],Literal[builtins.str],None]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str -None 0:typing.overloadX2 -dropna pandas.core.series.Series.dropna" -8Union[pandas.core.series.Series[pandas._typing.S1],None] -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool*Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None *{ +downcastk +"Union[builtins.dict[Any,Any],None]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +None 0:typing.overloadX, +bfillpandas.core.series.Series.bfill" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -44896,19 +51883,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -44935,38 +51918,38 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *- -inplace - builtins.bool" builtins.bool * -how -7Union[Literal[builtins.str],Literal[builtins.str],None]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str -None 0:typing.overloadX2֔ -astype pandas.core.series.Series.astype$ -astype pandas.core.series.Series.astype"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None *{ +downcastk +"Union[builtins.dict[Any,Any],None]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +None 0:typing.overloadXS +bfillpandas.core.series.Series.bfill" +8Union[pandas.core.series.Series[pandas._typing.S1],None] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -44993,54 +51976,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -dtype -TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]= -Type[builtins.bool] - builtins.bool" builtins.bool"type7 -Literal[builtins.str]  - builtins.str" builtins.strR -'pandas.core.arrays.boolean.BooleanDtype"'pandas.core.arrays.boolean.BooleanDtype7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Type[numpy.bool_] - numpy.bool_" numpy.bool_"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.BooleanDtypeArg** -copy - builtins.bool" builtins.bool * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadXx -astype pandas.core.series.Series.astype"b -'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series +None* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -45067,194 +52012,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*] -dtype] -Union[TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]]]' -TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: -Type[builtins.int] - builtins.int" builtins.int"type7 -Literal[builtins.str]  - builtins.str" builtins.strL -$pandas.core.arrays.integer.Int8Dtype"$pandas.core.arrays.integer.Int8DtypeN -%pandas.core.arrays.integer.Int16Dtype"%pandas.core.arrays.integer.Int16DtypeN -%pandas.core.arrays.integer.Int32Dtype"%pandas.core.arrays.integer.Int32DtypeN -%pandas.core.arrays.integer.Int64Dtype"%pandas.core.arrays.integer.Int64Dtype7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str -)Type[numpy.signedinteger[TypeAlias[Any]]]v -#numpy.signedinteger[TypeAlias[Any]]: -TypeAlias[Any] -Any"numpy._typing._nbit._NBitByte"numpy.signedinteger"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.strc -"Type[numpy.signedinteger[Unknown]]5 -numpy.signedinteger[Unknown]"numpy.signedinteger"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.strc -"Type[numpy.signedinteger[Unknown]]5 -numpy.signedinteger[Unknown]"numpy.signedinteger"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.strc -"Type[numpy.signedinteger[Unknown]]5 -numpy.signedinteger[Unknown]"numpy.signedinteger"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.strc -"Type[numpy.signedinteger[Unknown]]5 -numpy.signedinteger[Unknown]"numpy.signedinteger"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.strc -"Type[numpy.signedinteger[Unknown]]5 -numpy.signedinteger[Unknown]"numpy.signedinteger"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IntDtypeArg% -TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]N -%pandas.core.arrays.integer.UInt8Dtype"%pandas.core.arrays.integer.UInt8DtypeP -&pandas.core.arrays.integer.UInt16Dtype"&pandas.core.arrays.integer.UInt16DtypeP -&pandas.core.arrays.integer.UInt32Dtype"&pandas.core.arrays.integer.UInt32DtypeP -&pandas.core.arrays.integer.UInt64Dtype"&pandas.core.arrays.integer.UInt64Dtype7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.stri -$Type[numpy.unsignedinteger[Unknown]]9 -numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.stri -$Type[numpy.unsignedinteger[Unknown]]9 -numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.stri -$Type[numpy.unsignedinteger[Unknown]]9 -numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.stri -$Type[numpy.unsignedinteger[Unknown]]9 -numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.stri -$Type[numpy.unsignedinteger[Unknown]]9 -numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.stri -$Type[numpy.unsignedinteger[Unknown]]9 -numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.UIntDtypeArg** -copy - builtins.bool" builtins.bool * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX$ -astype pandas.core.series.Series.astype"b -'pandas.core.series.Series[builtins.str] - builtins.str" builtins.str"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*' +value' +xUnion[pandas._typing.S1,builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],pandas.core.frame.DataFrame] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -45281,56 +52047,17 @@ $Type[numpy.unsignedinteger[Unknown]]9 builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -dtype -TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: -Type[builtins.str] - builtins.str" builtins.str"type7 -Literal[builtins.str]  - builtins.str" builtins.strP -&pandas.core.arrays.string_.StringDtype"&pandas.core.arrays.string_.StringDtype7 -Literal[builtins.str]  - builtins.str" builtins.str4 -Type[numpy.str_] - -numpy.str_" -numpy.str_"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.StrDtypeArg** -copy - builtins.bool" builtins.bool * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX" -astype pandas.core.series.Series.astype"h -)pandas.core.series.Series[builtins.bytes] -builtins.bytes"builtins.bytes"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -45357,51 +52084,39 @@ numpy.str_"type7 builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -dtype -TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ -Type[builtins.bytes] -builtins.bytes"builtins.bytes"type7 -Literal[builtins.str]  - builtins.str" builtins.str: -Type[numpy.bytes_] - numpy.bytes_" numpy.bytes_"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.BytesDtypeArg** -copy - builtins.bool" builtins.bool * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX9 -astype pandas.core.series.Series.astype"h -)pandas.core.series.Series[builtins.float] -builtins.float"builtins.float"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex *- +inplace + builtins.bool" builtins.bool *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None *{ +downcastk +"Union[builtins.dict[Any,Any],None]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +None 0:typing.overloadX2. + value_counts&pandas.core.series.Series.value_counts + value_counts&pandas.core.series.Series.value_counts"b +'pandas.core.series.Series[builtins.int] + builtins.int" builtins.int"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -45428,101 +52143,31 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -dtype -TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ -Type[builtins.float] -builtins.float"builtins.float"type7 -Literal[builtins.str]  - builtins.str" builtins.strT -(pandas.core.arrays.floating.Float32Dtype"(pandas.core.arrays.floating.Float32DtypeT -(pandas.core.arrays.floating.Float64Dtype"(pandas.core.arrays.floating.Float64Dtype7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str -$Type[numpy.floating[TypeAlias[Any]]]l -numpy.floating[TypeAlias[Any]]: -TypeAlias[Any] -Any"numpy._typing._nbit._NBitHalf"numpy.floating"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.strT -Type[numpy.floating[Unknown]]+ -numpy.floating[Unknown]"numpy.floating"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.strT -Type[numpy.floating[Unknown]]+ -numpy.floating[Unknown]"numpy.floating"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.strT -Type[numpy.floating[Unknown]]+ -numpy.floating[Unknown]"numpy.floating"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.FloatDtypeArg** -copy - builtins.bool" builtins.bool * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX0 -astype pandas.core.series.Series.astype"n -+pandas.core.series.Series[builtins.complex]$ -builtins.complex"builtins.complex"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*K + normalize: +Literal[builtins.bool]  + builtins.bool" builtins.bool ** +sort + builtins.bool" builtins.bool */ + ascending + builtins.bool" builtins.bool *P +binsD +Union[builtins.int,None] + builtins.int" builtins.int +None *, +dropna + builtins.bool" builtins.bool 0:typing.overloadX + value_counts&pandas.core.series.Series.value_counts"h +)pandas.core.series.Series[builtins.float] +builtins.float"builtins.float"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -45549,78 +52194,65 @@ $Type[numpy.floating[TypeAlias[Any]]]l builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*I + normalize: +Literal[builtins.bool]  + builtins.bool" builtins.bool** +sort + builtins.bool" builtins.bool */ + ascending + builtins.bool" builtins.bool *P +binsD +Union[builtins.int,None] + builtins.int" builtins.int +None *, +dropna + builtins.bool" builtins.bool 0:typing.overloadX2ϗ +__add__!pandas.core.series.Series.__add__O +__add__!pandas.core.series.Series.__add__" +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -dtype -TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[TypeAlias[Any],Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[TypeAlias[Any],Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]F -Type[builtins.complex]$ -builtins.complex"builtins.complex"type7 -Literal[builtins.str]  - builtins.str" builtins.str -3Type[numpy.complexfloating[TypeAlias[Any],Unknown]] --numpy.complexfloating[TypeAlias[Any],Unknown]< -TypeAlias[Any] -Any"numpy._typing._nbit._NBitSingle"numpy.complexfloating"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str{ -,Type[numpy.complexfloating[Unknown,Unknown]]C -&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str{ -,Type[numpy.complexfloating[Unknown,Unknown]]C -&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.ComplexDtypeArg** -copy - builtins.bool" builtins.bool * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX? -astype pandas.core.series.Series.astype"H -"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(* +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -45647,124 +52279,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*$ -dtype$ -TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.TimedeltaDtypeArg** -copy - builtins.bool" builtins.bool * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadXA -astype pandas.core.series.Series.astype"H -"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(*'& +7Union[pandas._typing.S1,pandas.core.series.Series.Self] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -45791,129 +52313,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*& -dtype& -TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.TimestampDtypeArg** -copy - builtins.bool" builtins.bool * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX -astype pandas.core.series.Series.astype"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -45940,36 +52348,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -dtype -RTypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]] -GUnion[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]X -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.CategoryDtypeArg** -copy - builtins.bool" builtins.bool * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX( -astype pandas.core.series.Series.astype"D +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(0:typing.overloadXH +__add__!pandas.core.series.Series.__add__"D pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -45996,60 +52385,32 @@ GUnion[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]X builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -dtype -Union[TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]] -gTypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]] -\Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]C -Type[builtins.object]" -builtins.object"builtins.object"type7 -Literal[builtins.str]  - builtins.str" builtins.str= -Type[numpy.object_] - numpy.object_" numpy.object_"type7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.ObjectDtypeArg -dTypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -YUnion[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]4 -Type[numpy.void] - -numpy.void" -numpy.void"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.VoidDtypeArgP -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -STypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]] -HUnion[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]I -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtypeP -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype"pandas._typing.DtypeObj** -copy - builtins.bool" builtins.bool * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX2P -ffillpandas.core.series.Series.ffill -ffillpandas.core.series.Series.ffill" -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*33 +Union[builtins.complex,builtins.str,datetime.timedelta,pandas._libs.tslibs.timedeltas.Timedelta,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[Any],numpy.timedelta64]$ +builtins.complex"builtins.complex + builtins.str" builtins.str( +datetime.timedelta"datetime.timedeltaT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -46076,40 +52437,14 @@ HUnion[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]I builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *G -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool*Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None *{ -downcastk -"Union[builtins.dict[Any,Any],None]9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -None 0:typing.overloadX3 -ffillpandas.core.series.Series.ffill" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -46136,18 +52471,21 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLikeD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series& +numpy.timedelta64"numpy.timedelta640:typing.overloadX28 +__and__!pandas.core.series.Series.__and__ +__and__!pandas.core.series.Series.__and__"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -46174,43 +52512,32 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *I -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool *Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None *{ -downcastk -"Union[builtins.dict[Any,Any],None]9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -None 0:typing.overloadX2IJ -bfillpandas.core.series.Series.bfill -bfillpandas.core.series.Series.bfill" -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +Union[builtins.bool,builtins.list[builtins.bool],builtins.list[builtins.int],TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.bool]] + builtins.bool" builtins.boolM +builtins.list[builtins.bool] + builtins.bool" builtins.bool" builtins.listJ +builtins.list[builtins.int] + builtins.int" builtins.int" builtins.list +^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_boole +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series0:typing.overloadX +__and__!pandas.core.series.Series.__and__"b +'pandas.core.series.Series[builtins.int] + builtins.int" builtins.int"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -46237,40 +52564,28 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *G -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool*Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None *{ -downcastk -"Union[builtins.dict[Any,Any],None]9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -None 0:typing.overloadX3 -bfillpandas.core.series.Series.bfill" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +Union[builtins.int,TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.int]] + builtins.int" builtins.int +^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray" pandas._typing.np_ndarray_anyintb +'pandas.core.series.Series[builtins.int] + builtins.int" builtins.int"pandas.core.series.Series0:typing.overloadX2] +__mul__!pandas.core.series.Series.__mul__ +__mul__!pandas.core.series.Series.__mul__"H +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -46297,18 +52612,22 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +wUnion[datetime.timedelta,pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.series.TimedeltaSeries,numpy.timedelta64]( +datetime.timedelta"datetime.timedeltaT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.TimedeltaH +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries& +numpy.timedelta64"numpy.timedelta640:typing.overloadXE +__mul__!pandas.core.series.Series.__mul__"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -46335,41 +52654,63 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *I -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool *Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None *{ -downcastk -"Union[builtins.dict[Any,Any],None]9 -builtins.dict[Any,Any] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*11 +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[Any]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] Any -Any" builtins.dict -None 0:typing.overloadXb -bfillpandas.core.series.Series.bfill" -8Union[pandas.core.series.Series[pandas._typing.S1],None] -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -46396,19 +52737,20 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLikeD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series0:typing.overloadX28 +__or__ pandas.core.series.Series.__or__ +__or__ pandas.core.series.Series.__or__"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -46435,18 +52777,32 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*/ -value/ -xUnion[pandas._typing.S1,builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],pandas.core.frame.DataFrame] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +Union[builtins.bool,builtins.list[builtins.bool],builtins.list[builtins.int],TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.bool]] + builtins.bool" builtins.boolM +builtins.list[builtins.bool] + builtins.bool" builtins.bool" builtins.listJ +builtins.list[builtins.int] + builtins.int" builtins.int" builtins.list +^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_boole +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series0:typing.overloadX +__or__ pandas.core.series.Series.__or__"b +'pandas.core.series.Series[builtins.int] + builtins.int" builtins.int"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -46473,20 +52829,28 @@ xUnion[pandas._typing.S1,builtins.dict[Any,Any],pandas.core.series.Series[pandas builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +Union[builtins.int,TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.int]] + builtins.int" builtins.int +^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray" pandas._typing.np_ndarray_anyintb +'pandas.core.series.Series[builtins.int] + builtins.int" builtins.int"pandas.core.series.Series0:typing.overloadX2 +__radd__"pandas.core.series.Series.__radd__N +__radd__"pandas.core.series.Series.__radd__" +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -46513,40 +52877,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *- -inplace - builtins.bool" builtins.bool *Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None *{ -downcastk -"Union[builtins.dict[Any,Any],None]9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -None 0:typing.overloadX2φ -__add__!pandas.core.series.Series.__add__ -__add__!pandas.core.series.Series.__add__"H -"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(* +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -46573,20 +52912,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*JH -"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries0:typing.overloadX -__add__!pandas.core.series.Series.__add__"H -"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(*&& +EUnion[pandas._typing.S1,pandas.core.series.Series[pandas._typing.S1]] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -46613,20 +52946,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*\Z -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex0:typing.overloadX -__add__!pandas.core.series.Series.__add__"H -"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -46653,21 +52980,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*VT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp0:typing.overloadX< -__add__!pandas.core.series.Series.__add__"D +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series0:typing.overloadXF +__radd__"pandas.core.series.Series.__radd__"D pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -46694,20 +53017,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*$$ -Union[builtins.complex,builtins.str,pandas._libs.tslibs.timedeltas.Timedelta,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1],numpy.timedelta64]$ +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*11 +Union[builtins.complex,builtins.str,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[Any]]$ builtins.complex"builtins.complex - builtins.str" builtins.strT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] + builtins.str" builtins.str. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 @@ -46718,16 +53037,10 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.str" builtins.str9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -46754,22 +53067,54 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series& -numpy.timedelta64"numpy.timedelta640:typing.overloadX2? -__and__!pandas.core.series.Series.__and__ -__and__!pandas.core.series.Series.__and__"e +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLikeD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series0:typing.overloadX28 +__rand__"pandas.core.series.Series.__rand__ +__rand__"pandas.core.series.Series.__rand__"e (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -46796,14 +53141,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* Union[builtins.bool,builtins.list[builtins.bool],builtins.list[builtins.int],TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.bool]] builtins.bool" builtins.boolM builtins.list[builtins.bool] @@ -46818,13 +53160,13 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] (numpy._typing._array_like._ScalarType_co numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_boole (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series0:typing.overloadX -__and__!pandas.core.series.Series.__and__"b + builtins.bool" builtins.bool"pandas.core.series.Series0:typing.overloadX +__rand__"pandas.core.series.Series.__rand__"b 'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -46851,14 +53193,11 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* Union[builtins.int,TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.int]] builtins.int" builtins.int ^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] @@ -46869,13 +53208,13 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] (numpy._typing._array_like._ScalarType_co numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray" pandas._typing.np_ndarray_anyintb 'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series0:typing.overloadX2> -__mul__!pandas.core.series.Series.__mul__ -__mul__!pandas.core.series.Series.__mul__"H -"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas.core.series.Series0:typing.overloadX2] +__rmul__"pandas.core.series.Series.__rmul__ +__rmul__"pandas.core.series.Series.__rmul__"H +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -46902,24 +53241,22 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -dUnion[pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.series.TimedeltaSeries,numpy.timedelta64]T +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +wUnion[datetime.timedelta,pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.series.TimedeltaSeries,numpy.timedelta64]( +datetime.timedelta"datetime.timedeltaT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.TimedeltaH "pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries& -numpy.timedelta64"numpy.timedelta640:typing.overloadX$ -__mul__!pandas.core.series.Series.__mul__"D +numpy.timedelta64"numpy.timedelta640:typing.overloadXE +__rmul__"pandas.core.series.Series.__rmul__"D pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -46946,18 +53283,15 @@ dUnion[pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.series.TimedeltaSeri builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*  -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[Any]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*11 +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[Any]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 @@ -46968,22 +53302,10 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.str" builtins.str9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLikeD -pandas.core.series.Series[Any] -Any"pandas.core.series.Series0:typing.overloadX2? -__or__ pandas.core.series.Series.__or__ -__or__ pandas.core.series.Series.__or__"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -47010,35 +53332,14 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -Union[builtins.bool,builtins.list[builtins.bool],builtins.list[builtins.int],TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.bool]] - builtins.bool" builtins.boolM -builtins.list[builtins.bool] - builtins.bool" builtins.bool" builtins.listJ -builtins.list[builtins.int] - builtins.int" builtins.int" builtins.list -^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] -STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] -Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] -Any -5numpy.dtype[numpy._typing._array_like._ScalarType_co][ -(numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_boole -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series0:typing.overloadX -__or__ pandas.core.series.Series.__or__"b -'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -47065,32 +53366,20 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -Union[builtins.int,TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.int]] - builtins.int" builtins.int -^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] -STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] -Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] -Any -5numpy.dtype[numpy._typing._array_like._ScalarType_co][ -(numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray" pandas._typing.np_ndarray_anyintb -'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series0:typing.overloadX2? -__rand__"pandas.core.series.Series.__rand__ -__rand__"pandas.core.series.Series.__rand__"e +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLikeD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series0:typing.overloadX28 +__ror__!pandas.core.series.Series.__ror__ +__ror__!pandas.core.series.Series.__ror__"e (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -47117,14 +53406,11 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* Union[builtins.bool,builtins.list[builtins.bool],builtins.list[builtins.int],TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.bool]] builtins.bool" builtins.boolM builtins.list[builtins.bool] @@ -47139,13 +53425,13 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] (numpy._typing._array_like._ScalarType_co numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_boole (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series0:typing.overloadX -__rand__"pandas.core.series.Series.__rand__"b + builtins.bool" builtins.bool"pandas.core.series.Series0:typing.overloadX +__ror__!pandas.core.series.Series.__ror__"b 'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -47172,14 +53458,11 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* Union[builtins.int,TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.int]] builtins.int" builtins.int ^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] @@ -47190,14 +53473,14 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] (numpy._typing._array_like._ScalarType_co numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray" pandas._typing.np_ndarray_anyintb 'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series0:typing.overloadX2? -__ror__!pandas.core.series.Series.__ror__ -__ror__!pandas.core.series.Series.__ror__"e + builtins.int" builtins.int"pandas.core.series.Series0:typing.overloadX28 +__rxor__"pandas.core.series.Series.__rxor__ +__rxor__"pandas.core.series.Series.__rxor__"e (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -47224,14 +53507,11 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* Union[builtins.bool,builtins.list[builtins.bool],builtins.list[builtins.int],TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.bool]] builtins.bool" builtins.boolM builtins.list[builtins.bool] @@ -47246,13 +53526,13 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] (numpy._typing._array_like._ScalarType_co numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_boole (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series0:typing.overloadX -__ror__!pandas.core.series.Series.__ror__"b + builtins.bool" builtins.bool"pandas.core.series.Series0:typing.overloadX +__rxor__"pandas.core.series.Series.__rxor__"b 'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -47279,14 +53559,11 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* Union[builtins.int,TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.int]] builtins.int" builtins.int ^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] @@ -47297,14 +53574,31 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] (numpy._typing._array_like._ScalarType_co numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray" pandas._typing.np_ndarray_anyintb 'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series0:typing.overloadX2S - __rtruediv__&pandas.core.series.Series.__rtruediv__ - __rtruediv__&pandas.core.series.Series.__rtruediv__"h -)pandas.core.series.Series[builtins.float] -builtins.float"builtins.float"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas.core.series.Series0:typing.overloadX2i +__sub__!pandas.core.series.Series.__sub__ +__sub__!pandas.core.series.Series.__sub__"H +"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries* +Cpandas.core.series.Series[pandas._libs.tslibs.timestamps.Timestamp]T +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"pandas.core.series.Series* +Union[pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.series.TimedeltaSeries,pandas.core.indexes.timedeltas.TimedeltaIndex,numpy.timedelta64]T +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.TimedeltaH +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex& +numpy.timedelta64"numpy.timedelta640:typing.overloadX +__sub__!pandas.core.series.Series.__sub__"H +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* +Cpandas.core.series.Series[pandas._libs.tslibs.timedeltas.Timedelta]T +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas.core.series.Series* +Union[pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.series.TimedeltaSeries,pandas.core.indexes.timedeltas.TimedeltaIndex,numpy.timedelta64]T +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.TimedeltaH +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex& +numpy.timedelta64"numpy.timedelta640:typing.overloadX +__sub__!pandas.core.series.Series.__sub__"H +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -47331,21 +53625,21 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*JH -"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries0:typing.overloadX: - __rtruediv__&pandas.core.series.Series.__rtruediv__"D +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +dUnion[pandas._libs.tslibs.timestamps.Timestamp,datetime.datetime,pandas.core.series.TimestampSeries]T +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp& +datetime.datetime"datetime.datetimeH +"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries0:typing.overloadXE +__sub__!pandas.core.series.Series.__sub__"D pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -47372,18 +53666,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*"" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*11 +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[Any]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 @@ -47394,16 +53685,10 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.str" builtins.str9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -47430,21 +53715,54 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series0:typing.overloadX2? -__rxor__"pandas.core.series.Series.__rxor__ -__rxor__"pandas.core.series.Series.__rxor__"e +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLikeD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series0:typing.overloadX28 +__xor__!pandas.core.series.Series.__xor__ +__xor__!pandas.core.series.Series.__xor__"e (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -47471,14 +53789,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* Union[builtins.bool,builtins.list[builtins.bool],builtins.list[builtins.int],TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.bool]] builtins.bool" builtins.boolM builtins.list[builtins.bool] @@ -47493,13 +53808,211 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] (numpy._typing._array_like._ScalarType_co numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_boole (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series0:typing.overloadX -__rxor__"pandas.core.series.Series.__rxor__"b + builtins.bool" builtins.bool"pandas.core.series.Series0:typing.overloadX +__xor__!pandas.core.series.Series.__xor__"b +'pandas.core.series.Series[builtins.int] + builtins.int" builtins.int"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +Union[builtins.int,TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.int]] + builtins.int" builtins.int +^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray" pandas._typing.np_ndarray_anyintb 'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas.core.series.Series0:typing.overloadX2i +mulpandas.core.series.Series.mul +mulpandas.core.series.Series.mul"H +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +other +wUnion[datetime.timedelta,pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.series.TimedeltaSeries,numpy.timedelta64]( +datetime.timedelta"datetime.timedeltaT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.TimedeltaH +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries& +numpy.timedelta64"numpy.timedelta64* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None 0:typing.overloadXK +mulpandas.core.series.Series.mul"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*1 +other1 +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[Any]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -47526,49 +54039,41 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -Union[builtins.int,TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.int]] - builtins.int" builtins.int -^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] -STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] -Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] -Any -5numpy.dtype[numpy._typing._array_like._ScalarType_co][ -(numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray" pandas._typing.np_ndarray_anyintb -'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series0:typing.overloadX2K -__sub__!pandas.core.series.Series.__sub__ -__sub__!pandas.core.series.Series.__sub__"H -"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries* -Cpandas.core.series.Series[pandas._libs.tslibs.timestamps.Timestamp]T -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"pandas.core.series.Series* -Union[pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.series.TimedeltaSeries,pandas.core.indexes.timedeltas.TimedeltaIndex,numpy.timedelta64]T -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.TimedeltaH -"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex& -numpy.timedelta64"numpy.timedelta640:typing.overloadX -__sub__!pandas.core.series.Series.__sub__"H -"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* -Cpandas.core.series.Series[pandas._libs.tslibs.timedeltas.Timedelta]T -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas.core.series.Series* -Union[pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.series.TimedeltaSeries,pandas.core.indexes.timedeltas.TimedeltaIndex,numpy.timedelta64]T -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.TimedeltaH -"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex& -numpy.timedelta64"numpy.timedelta640:typing.overloadX -__sub__!pandas.core.series.Series.__sub__"H -"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLikeD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None 0:typing.overloadX2g +rmulpandas.core.series.Series.rmul +rmulpandas.core.series.Series.rmul"H +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -47595,24 +54100,43 @@ Cpandas.core.series.Series[pandas._libs.tslibs.timedeltas.Timedelta]T builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -dUnion[pandas._libs.tslibs.timestamps.Timestamp,datetime.datetime,pandas.core.series.TimestampSeries]T -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp& -datetime.datetime"datetime.datetimeH -"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries0:typing.overloadX$ -__sub__!pandas.core.series.Series.__sub__"D +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +other +wUnion[datetime.timedelta,pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.series.TimedeltaSeries,numpy.timedelta64]( +datetime.timedelta"datetime.timedeltaT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.TimedeltaH +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries& +numpy.timedelta64"numpy.timedelta64* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex 0:typing.overloadXJ +rmulpandas.core.series.Series.rmul"D pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -47639,18 +54163,16 @@ dUnion[pandas._libs.tslibs.timestamps.Timestamp,datetime.datetime,pandas.core.se builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*  -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[Any]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*1 +other1 +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[Any]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 @@ -47661,22 +54183,10 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.str" builtins.str9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLikeD -pandas.core.series.Series[Any] -Any"pandas.core.series.Series0:typing.overloadX2? -__xor__!pandas.core.series.Series.__xor__ -__xor__!pandas.core.series.Series.__xor__"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -47703,35 +54213,14 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -Union[builtins.bool,builtins.list[builtins.bool],builtins.list[builtins.int],TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.bool]] - builtins.bool" builtins.boolM -builtins.list[builtins.bool] - builtins.bool" builtins.bool" builtins.listJ -builtins.list[builtins.int] - builtins.int" builtins.int" builtins.list -^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] -STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] -Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] -Any -5numpy.dtype[numpy._typing._array_like._ScalarType_co][ -(numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_boole -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series0:typing.overloadX -__xor__!pandas.core.series.Series.__xor__"b -'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -47758,34 +54247,41 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -Union[builtins.int,TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.int]] - builtins.int" builtins.int -^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] -STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] -Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] -Any -5numpy.dtype[numpy._typing._array_like._ScalarType_co][ -(numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray" pandas._typing.np_ndarray_anyintb -'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series0:typing.overloadX2P -rolling!pandas.core.series.Series.rolling' +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLikeD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex 0:typing.overloadX2D +rolling!pandas.core.series.Series.rolling" rolling!pandas.core.series.Series.rolling" Apandas.core.window.rolling.Window[pandas.core.series.Series[Any]]D pandas.core.series.Series[Any] -Any"pandas.core.series.Series"!pandas.core.window.rolling.Window* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any"pandas.core.series.Series"!pandas.core.window.rolling.Window* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -47812,14 +54308,11 @@ Apandas.core.window.rolling.Window[pandas.core.series.Series[Any]]D builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* window {Union[builtins.int,builtins.str,datetime.timedelta,pandas._libs.tslibs.offsets.BaseOffset,pandas.core.indexers.BaseIndexer] builtins.int" builtins.int @@ -47836,14 +54329,7 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand onD Union[builtins.str,None] builtins.str" builtins.str -None * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex * +None * closed uUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] @@ -47869,15 +54355,15 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str" pandas._typing.CalculationMethod ** win_type - builtins.str" builtins.str0:typing.overloadX' + builtins.str" builtins.str0:typing.overloadX" rolling!pandas.core.series.Series.rolling" Bpandas.core.window.rolling.Rolling[pandas.core.series.Series[Any]]D pandas.core.series.Series[Any] -Any"pandas.core.series.Series""pandas.core.window.rolling.Rolling* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any"pandas.core.series.Series""pandas.core.window.rolling.Rolling* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -47904,14 +54390,11 @@ Bpandas.core.window.rolling.Rolling[pandas.core.series.Series[Any]]D builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* window {Union[builtins.int,builtins.str,datetime.timedelta,pandas._libs.tslibs.offsets.BaseOffset,pandas.core.indexers.BaseIndexer] builtins.int" builtins.int @@ -47928,14 +54411,7 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand onD Union[builtins.str,None] builtins.str" builtins.str -None * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex * +None * closed uUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] @@ -47961,7 +54437,7 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str" pandas._typing.CalculationMethod * win_type -None 0:typing.overloadX2> +None 0:typing.overloadX27 sumpandas.core.series.Series.sum sumpandas.core.series.Series.sum" Any*X @@ -48015,10 +54491,10 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] min_count builtins.int" builtins.int * kwargs -Any0:typing.overloadX2 -sumpandas.core.series.Series.sum" -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any0:typing.overloadX+ +sumpandas.core.series.Series.sum" +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -48045,18 +54521,15 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -48083,14 +54556,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* axis IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] @@ -48111,14 +54581,14 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] min_count builtins.int" builtins.int * kwargs -Any0:typing.overloadX2΢ - rename_axis%pandas.core.series.Series.rename_axisP +Any0:typing.overloadX2 + rename_axis%pandas.core.series.Series.rename_axisM rename_axis%pandas.core.series.Series.rename_axis" -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +None* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -48145,14 +54615,11 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* mapper Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._typing.ListLike] TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] @@ -48244,14 +54711,12 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.bool" builtins.bool *G inplace: Literal[builtins.bool]  - builtins.bool" builtins.bool0:typing.overloadXQ - rename_axis%pandas.core.series.Series.rename_axis"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool0:typing.overloadXa + rename_axis%pandas.core.series.Series.rename_axis" +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -48278,14 +54743,47 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(* +self +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(* mapper Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._typing.ListLike] TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] @@ -48816,8 +55314,8 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] __radd__*pandas._libs.tslibs.period.Period.__radd__"J #pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType*HF !pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*LJ -#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType0:typing.overloadX - Timedelta(pandas._libs.tslibs.timedeltas.Timedelta"datetime.timedelta*5 +#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType0:typing.overloadX + Timedelta(pandas._libs.tslibs.timedeltas.Timedelta"datetime.timedelta*- __new__0pandas._libs.tslibs.timedeltas.Timedelta.__new__" -pandas._libs.tslibs.timedeltas.Timedelta.SelfT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta(* @@ -48831,30 +55329,10 @@ nUnion[builtins.str,builtins.int,pandas._libs.tslibs.timedeltas.Timedelta,dateti builtins.int" builtins.intT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta( datetime.timedelta"datetime.timedelta& -numpy.timedelta64"numpy.timedelta64 *# -unit# -TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 +numpy.timedelta64"numpy.timedelta64 * +unit +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -49112,7 +55590,39 @@ aUnion[Tuple[TypeAlias[Any],builtins.int],Unknown,builtins.list[Any],TypeAlias[T builtins.list[Any] Any" builtins.listM TypeAlias[TypedDict] - TypedDict "$numpy._typing._dtype_like._DTypeDict"(numpy._typing._dtype_like._VoidDTypeLike"#numpy._typing._dtype_like.DTypeLike 2+ + TypedDict "$numpy._typing._dtype_like._DTypeDict"(numpy._typing._dtype_like._VoidDTypeLike"#numpy._typing._dtype_like.DTypeLike * +unit-pandas._libs.tslibs.timedeltas.Timedelta.unit" +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.TimeUnit*^ +selfT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta0:builtins.property`* +as_unit0pandas._libs.tslibs.timedeltas.Timedelta.as_unit" +-pandas._libs.tslibs.timedeltas.Timedelta.SelfT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta(* +self +-pandas._libs.tslibs.timedeltas.Timedelta.SelfT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta(* +unit +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.TimeUnit*. +round_ok + builtins.bool" builtins.bool 2+ __add__0pandas._libs.tslibs.timedeltas.Timedelta.__add__ __add__0pandas._libs.tslibs.timedeltas.Timedelta.__add__"T (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta*VT @@ -49276,7 +55786,7 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] mUnion[pandas.core.series.TimedeltaSeries,pandas.core.series.Series[pandas._libs.tslibs.timedeltas.Timedelta]]H "pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries Cpandas.core.series.Series[pandas._libs.tslibs.timedeltas.Timedelta]T -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas.core.series.Series0:typing.overloadX2$ +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas.core.series.Series0:typing.overloadX2$ __rsub__1pandas._libs.tslibs.timedeltas.Timedelta.__rsub__ __rsub__1pandas._libs.tslibs.timedeltas.Timedelta.__rsub__"T (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta*VT @@ -49284,11 +55794,12 @@ Cpandas.core.series.Series[pandas._libs.tslibs.timedeltas.Timedelta]T TUnion[datetime.timedelta,pandas._libs.tslibs.timedeltas.Timedelta,numpy.timedelta64]( datetime.timedelta"datetime.timedeltaT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta& -numpy.timedelta64"numpy.timedelta640:typing.overloadX +numpy.timedelta64"numpy.timedelta640:typing.overloadX __rsub__1pandas._libs.tslibs.timedeltas.Timedelta.__rsub__"T (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp*VT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta* -@Union[pandas._libs.tslibs.timestamps.Timestamp,numpy.datetime64]T +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta* +RUnion[datetime.datetime,pandas._libs.tslibs.timestamps.Timestamp,numpy.datetime64]& +datetime.datetime"datetime.datetimeT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp$ numpy.datetime64"numpy.datetime640:typing.overloadX __rsub__1pandas._libs.tslibs.timedeltas.Timedelta.__rsub__"J @@ -49815,7 +56326,7 @@ Cpandas.core.series.Series[pandas._libs.tslibs.timedeltas.Timedelta]T resolution3pandas._libs.tslibs.timedeltas.Timedelta.resolutionT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.TimedeltarU value.pandas._libs.tslibs.timedeltas.Timedelta.value - builtins.int" builtins.intю + builtins.int" builtins.int Timestamp(pandas._libs.tslibs.timestamps.Timestamp"datetime.datetime* __new__0pandas._libs.tslibs.timestamps.Timestamp.__new__" -pandas._libs.tslibs.timestamps.Timestamp.SelfT @@ -50012,12 +56523,14 @@ nanosecond3pandas._libs.tslibs.timestamps.Timestamp.nanosecond" cls 3Type[pandas._libs.tslibs.timestamps.Timestamp.Self] -pandas._libs.tslibs.timestamps.Timestamp.SelfT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp("type0:builtins.classmethodp* -combine0pandas._libs.tslibs.timestamps.Timestamp.combine"& -datetime.datetime"datetime.datetime* -cls -.Type[pandas._libs.tslibs.timestamps.Timestamp]T -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"type*( +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp("type0:builtins.classmethodp* +combine0pandas._libs.tslibs.timestamps.Timestamp.combine" +-pandas._libs.tslibs.timestamps.Timestamp.SelfT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp(* +cls +3Type[pandas._libs.tslibs.timestamps.Timestamp.Self] +-pandas._libs.tslibs.timestamps.Timestamp.SelfT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp("type*( date datetime.date" datetime.date*( time @@ -50200,13 +56713,9 @@ astimezone3pandas._libs.tslibs.timestamps.Timestamp.astimezone" isoweekday3pandas._libs.tslibs.timestamps.Timestamp.isoweekday" builtins.int" builtins.int*^ selfT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp* - isocalendar4pandas._libs.tslibs.timestamps.Timestamp.isocalendar" -8TypeAlias[Tuple[builtins.int,builtins.int,builtins.int]] --Tuple[builtins.int,builtins.int,builtins.int] - builtins.int" builtins.int - builtins.int" builtins.int - builtins.int" builtins.int"/pandas._libs.tslibs.timestamps._IsoCalendarDate*^ +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp* + isocalendar4pandas._libs.tslibs.timestamps.Timestamp.isocalendar" +Any*^ selfT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp* is_leap_year5pandas._libs.tslibs.timestamps.Timestamp.is_leap_year" @@ -50460,7 +56969,39 @@ weekofyear3pandas._libs.tslibs.timestamps.Timestamp.weekofyear" daysinmonth4pandas._libs.tslibs.timestamps.Timestamp.daysinmonth" builtins.int" builtins.int*^ selfT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp0:builtins.property`2 +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp0:builtins.property`* +unit-pandas._libs.tslibs.timestamps.Timestamp.unit" +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.TimeUnit*^ +selfT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp0:builtins.property`* +as_unit0pandas._libs.tslibs.timestamps.Timestamp.as_unit" +-pandas._libs.tslibs.timestamps.Timestamp.SelfT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp(* +self +-pandas._libs.tslibs.timestamps.Timestamp.SelfT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp(* +unit +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.TimeUnit*. +round_ok + builtins.bool" builtins.bool 2 __le__/pandas._libs.tslibs.timestamps.Timestamp.__le__ __le__/pandas._libs.tslibs.timestamps.Timestamp.__le__" builtins.bool" builtins.bool*VT @@ -50864,16 +57405,17 @@ aUnion[Tuple[TypeAlias[Any],builtins.int],Unknown,builtins.list[Any],TypeAlias[T Any" numpy.dtype None*\ selfR -'pandas.core.dtypes.dtypes.IntervalDtype"'pandas.core.dtypes.dtypes.IntervalDtype0:builtins.property` - PeriodDtype%pandas.core.dtypes.dtypes.PeriodDtype".pandas.core.dtypes.dtypes.PandasExtensionDtype* +'pandas.core.dtypes.dtypes.IntervalDtype"'pandas.core.dtypes.dtypes.IntervalDtype0:builtins.property` + PeriodDtype%pandas.core.dtypes.dtypes.PeriodDtype".pandas.core.dtypes.dtypes.PandasExtensionDtype* __init__.pandas.core.dtypes.dtypes.PeriodDtype.__init__" None*X selfN -%pandas.core.dtypes.dtypes.PeriodDtype"%pandas.core.dtypes.dtypes.PeriodDtype* -freq -:Union[builtins.str,pandas._libs.tslibs.offsets.BaseOffset] - builtins.str" builtins.strP -&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset * +%pandas.core.dtypes.dtypes.PeriodDtype"%pandas.core.dtypes.dtypes.PeriodDtype* +freq +wUnion[builtins.str,pandas._libs.tslibs.offsets.SingleConstructorOffset,pandas._libs.tslibs.offsets.RelativeDeltaOffset] + builtins.str" builtins.strj +3pandas._libs.tslibs.offsets.SingleConstructorOffset"3pandas._libs.tslibs.offsets.SingleConstructorOffsetb +/pandas._libs.tslibs.offsets.RelativeDeltaOffset"/pandas._libs.tslibs.offsets.RelativeDeltaOffset * freq*pandas.core.dtypes.dtypes.PeriodDtype.freq"P &pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset*X selfN @@ -50881,9 +57423,9 @@ aUnion[Tuple[TypeAlias[Any],builtins.int],Unknown,builtins.list[Any],TypeAlias[T na_value.pandas.core.dtypes.dtypes.PeriodDtype.na_value"J #pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType*X selfN -%pandas.core.dtypes.dtypes.PeriodDtype"%pandas.core.dtypes.dtypes.PeriodDtype0:builtins.property` +%pandas.core.dtypes.dtypes.PeriodDtype"%pandas.core.dtypes.dtypes.PeriodDtype0:builtins.property` -DateOffset&pandas._libs.tslibs.offsets.DateOffset"/pandas._libs.tslibs.offsets.RelativeDeltaOffset* +DateOffset&pandas._libs.tslibs.offsets.DateOffset"/pandas._libs.tslibs.offsets.RelativeDeltaOffset* __init__/pandas._libs.tslibs.offsets.DateOffset.__init__" None*Z selfP @@ -50917,9 +57459,11 @@ DateOffset&pandas._libs.tslibs.offsets.DateOffset"/pandas._libs.tslibs.offsets. month builtins.int" builtins.int *' day - builtins.int" builtins.int *+ -weekday - builtins.int" builtins.int *( + builtins.int" builtins.int *Q +weekdayB +Union[builtins.int,Any] + builtins.int" builtins.int +Any *( hour builtins.int" builtins.int ** minute @@ -50974,7 +57518,7 @@ PUnion[builtins.str,numpy.dtype[Any],pandas.core.dtypes.base.ExtensionDtype,None &pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype None ** copy - builtins.bool" builtins.bool  + builtins.bool" builtins.bool  date_range(pandas.core.indexes.datetimes.date_range"Z +pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* @@ -51032,9 +57576,11 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"!pandas._typing.IntervalClosedType * -unit -cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]7 + builtins.str" builtins.str"!pandas._typing.IntervalClosedType * +unit +uUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -51042,7 +57588,7 @@ cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str + builtins.str" builtins.str"pandas._typing.TimeUnit None  period_range'pandas.core.indexes.period.period_range"P @@ -51127,8 +57673,8 @@ cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal accuracy builtins.int" builtins.int *4 use_eng_prefix - builtins.bool" builtins.bool " - factorize pandas.core.algorithms.factorize + builtins.bool" builtins.bool " + factorize pandas.core.algorithms.factorize factorize pandas.core.algorithms.factorize" 4Tuple[numpy.ndarray[Any,Any],numpy.ndarray[Any,Any]]9 numpy.ndarray[Any,Any] @@ -51136,14 +57682,11 @@ cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal Any" numpy.ndarray9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray* -values -3Union[typing.Sequence[Any],numpy.recarray[Any,Any]]0 -typing.Sequence[Any] -Any"typing.Sequence; -numpy.recarray[Any,Any] +Any" numpy.ndarray*E +values9 +numpy.ndarray[Any,Any] Any -Any"numpy.recarray** +Any" numpy.ndarray** sort builtins.bool" builtins.bool *5 use_na_sentinel @@ -51188,7 +57731,7 @@ HTuple[numpy.ndarray[Any,Any],pandas.core.arrays.categorical.Categorical]9 size_hintD Union[builtins.int,None] builtins.int" builtins.int -None 0:typing.overloadX" +None 0:typing.overloadX" uniquepandas.core.algorithms.unique uniquepandas.core.algorithms.unique"P &pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex*\ @@ -51229,18 +57772,15 @@ DUnion[numpy.ndarray[Any,Any],pandas.core.arrays.base.ExtensionArray]9 &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray*P valuesD pandas.core.series.Series[Any] -Any"pandas.core.series.Series0:typing.overloadX +Any"pandas.core.series.Series0:typing.overloadX uniquepandas.core.algorithms.unique"9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray* -values -0Union[numpy.ndarray[Any,Any],builtins.list[Any]]9 +Any" numpy.ndarray*E +values9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray, -builtins.list[Any] -Any" builtins.list0:typing.overloadX +Any" numpy.ndarray0:typing.overloadX uniquepandas.core.algorithms.unique"P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray*\ valuesP @@ -51780,7 +58320,7 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"!pandas._typing.IntervalClosedType 0:typing.overloadX"\ + builtins.str" builtins.str"!pandas._typing.IntervalClosedType 0:typing.overloadX"Z to_datetime'pandas.core.tools.datetimes.to_datetime to_datetime'pandas.core.tools.datetimes.to_datetime"T (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp* @@ -51891,7 +58431,7 @@ eUnion[TypeAlias[Union[builtins.float,builtins.str]],datetime.datetime,numpy.dat builtins.float"builtins.float builtins.str" builtins.str"(pandas._typing.TimestampConvertibleTypes *+ cache - builtins.bool" builtins.bool 0:typing.overloadX + builtins.bool" builtins.bool 0:typing.overloadX to_datetime'pandas.core.tools.datetimes.to_datetime"H "pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries* arg @@ -51902,16 +58442,14 @@ BTypeAlias[Union[TypeAlias[TypedDict],pandas.core.frame.DataFrame]] 7Union[TypeAlias[TypedDict],pandas.core.frame.DataFrame]H TypeAlias[TypedDict] TypedDict "pandas._typing.FulldatetimeDict: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame"pandas._typing.DictConvertible* -errors -STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame"pandas._typing.DictConvertible* +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.IgnoreRaiseCoerce *. + builtins.str" builtins.str"pandas._typing.RaiseCoerce *. dayfirst builtins.bool" builtins.bool */ yearfirst @@ -51948,22 +58486,24 @@ HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 builtins.float"builtins.float builtins.str" builtins.str"(pandas._typing.TimestampConvertibleTypes *+ cache - builtins.bool" builtins.bool 0:typing.overloadX + builtins.bool" builtins.bool 0:typing.overloadX to_datetime'pandas.core.tools.datetimes.to_datetime"Z -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* -arg -Union[typing.Sequence[Union[builtins.float,datetime.datetime]],builtins.list[builtins.str],builtins.tuple[Union[builtins.float,builtins.str,datetime.datetime]],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],Unknown,Unknown,pandas.core.indexes.base.Index[Any],pandas.core.arrays.base.ExtensionArray] -8typing.Sequence[Union[builtins.float,datetime.datetime]]u -'Union[builtins.float,datetime.datetime] -builtins.float"builtins.float& -datetime.datetime"datetime.datetime"typing.SequenceJ ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* + +arg + +Union[typing.Sequence[Union[builtins.float,datetime.date]],builtins.list[builtins.str],builtins.tuple[Union[builtins.float,builtins.str,datetime.date]],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],Unknown,Unknown,pandas.core.indexes.base.Index[Any],pandas.core.arrays.base.ExtensionArray] +4typing.Sequence[Union[builtins.float,datetime.date]]i +#Union[builtins.float,datetime.date] +builtins.float"builtins.float + datetime.date" datetime.date"typing.SequenceJ builtins.list[builtins.str] - builtins.str" builtins.str" builtins.list -Dbuiltins.tuple[Union[builtins.float,builtins.str,datetime.datetime]] -4Union[builtins.float,builtins.str,datetime.datetime] + builtins.str" builtins.str" builtins.list +@builtins.tuple[Union[builtins.float,builtins.str,datetime.date]] +0Union[builtins.float,builtins.str,datetime.date] builtins.float"builtins.float - builtins.str" builtins.str& -datetime.datetime"datetime.datetime"builtins.tuple + builtins.str" builtins.str + datetime.date" datetime.date"builtins.tuple STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] Any @@ -51972,16 +58512,14 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArrayN #pandas.core.indexes.base.Index[Any] Any"pandas.core.indexes.base.IndexP -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray* -errors -STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray* +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.IgnoreRaiseCoerce *. + builtins.str" builtins.str"pandas._typing.RaiseCoerce *. dayfirst builtins.bool" builtins.bool */ yearfirst @@ -52018,7 +58556,7 @@ HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 builtins.float"builtins.float builtins.str" builtins.str"(pandas._typing.TimestampConvertibleTypes *+ cache - builtins.bool" builtins.bool 0:typing.overloadX"\ + builtins.bool" builtins.bool 0:typing.overloadX"5 to_numeric$pandas.core.tools.numeric.to_numeric @@ -52071,72 +58609,7 @@ tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],TypeAlias[L builtins.str" builtins.str"pandas._typing.DtypeBackend /TypeAlias[Literal[pandas._libs.lib._NoDefault]]d $Literal[pandas._libs.lib._NoDefault] : -pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadX$ - -to_numeric$pandas.core.tools.numeric.to_numeric" -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar* -arg -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar*C -errors7 -Literal[builtins.str]  - builtins.str" builtins.str* -downcast -nTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]] -cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str -None"#pandas.core.tools.numeric._Downcast * - dtype_backend -tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Literal[pandas._libs.lib._NoDefault]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.DtypeBackend -/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d -$Literal[pandas._libs.lib._NoDefault] : -pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadX +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadX to_numeric$pandas.core.tools.numeric.to_numeric" STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] @@ -52153,16 +58626,14 @@ DUnion[builtins.list[Any],builtins.tuple[Any],numpy.ndarray[Any,Any]], Any"builtins.tuple9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray* -errors -STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 +Any" numpy.ndarray* +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.IgnoreRaiseCoerce * + builtins.str" builtins.str"pandas._typing.RaiseCoerce * downcast nTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]] cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]7 @@ -52185,23 +58656,21 @@ tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],TypeAlias[L builtins.str" builtins.str"pandas._typing.DtypeBackend /TypeAlias[Literal[pandas._libs.lib._NoDefault]]d $Literal[pandas._libs.lib._NoDefault] : -pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadX +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadX to_numeric$pandas.core.tools.numeric.to_numeric"D pandas.core.series.Series[Any] Any"pandas.core.series.Series*M argD pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -errors -STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 +Any"pandas.core.series.Series* +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.IgnoreRaiseCoerce * + builtins.str" builtins.str"pandas._typing.RaiseCoerce * downcast nTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]] cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]7 @@ -52224,39 +58693,19 @@ tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],TypeAlias[L builtins.str" builtins.str"pandas._typing.DtypeBackend /TypeAlias[Literal[pandas._libs.lib._NoDefault]]d $Literal[pandas._libs.lib._NoDefault] : -pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadX"ϝ - to_timedelta)pandas.core.tools.timedeltas.to_timedelta1 +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadX"| + to_timedelta)pandas.core.tools.timedeltas.to_timedelta& to_timedelta)pandas.core.tools.timedeltas.to_timedelta"T (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta* arg 5Union[builtins.str,builtins.float,datetime.timedelta] builtins.str" builtins.str builtins.float"builtins.float( -datetime.timedelta"datetime.timedelta*+ -unit+ -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None]# -TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 +datetime.timedelta"datetime.timedelta*! +unit! +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -52325,45 +58774,23 @@ $Literal[pandas._libs.lib._NoDefault] : builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str"3pandas._libs.tslibs.timedeltas.TimeDeltaUnitChoices -None * -errors -STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 +None * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.IgnoreRaiseCoerce 0:typing.overloadX0 + builtins.str" builtins.str"pandas._typing.RaiseCoerce 0:typing.overloadX% to_timedelta)pandas.core.tools.timedeltas.to_timedelta"H "pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries*M argD pandas.core.series.Series[Any] -Any"pandas.core.series.Series*+ -unit+ -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None]# -TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 +Any"pandas.core.series.Series*! +unit! +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -52432,29 +58859,26 @@ HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str"3pandas._libs.tslibs.timedeltas.TimeDeltaUnitChoices -None * -errors -STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 +None * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.IgnoreRaiseCoerce 0:typing.overloadX; + builtins.str" builtins.str"pandas._typing.RaiseCoerce 0:typing.overloadX/ to_timedelta)pandas.core.tools.timedeltas.to_timedelta"^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex* -arg -Union[typing.Sequence[Union[builtins.float,datetime.timedelta]],builtins.list[Union[builtins.str,builtins.float,datetime.timedelta]],builtins.tuple[Union[builtins.str,builtins.float,datetime.timedelta]],builtins.range,TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],pandas.core.indexes.base.Index[Any]] +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex* + +arg + +Union[pandas._typing.SequenceNotStr[Any],typing.Sequence[Union[builtins.float,datetime.timedelta]],builtins.tuple[Union[builtins.str,builtins.float,datetime.timedelta]],builtins.range,TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],pandas.core.indexes.base.Index[Any]]L +"pandas._typing.SequenceNotStr[Any] +Any"pandas._typing.SequenceNotStr 9typing.Sequence[Union[builtins.float,datetime.timedelta]]x (Union[builtins.float,datetime.timedelta] builtins.float"builtins.float( -datetime.timedelta"datetime.timedelta"typing.Sequence -Dbuiltins.list[Union[builtins.str,builtins.float,datetime.timedelta]] -5Union[builtins.str,builtins.float,datetime.timedelta] - builtins.str" builtins.str -builtins.float"builtins.float( -datetime.timedelta"datetime.timedelta" builtins.list +datetime.timedelta"datetime.timedelta"typing.Sequence Ebuiltins.tuple[Union[builtins.str,builtins.float,datetime.timedelta]] 5Union[builtins.str,builtins.float,datetime.timedelta] builtins.str" builtins.str @@ -52468,31 +58892,11 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P Any Any" numpy.ndarray"pandas._typing.ArrayLikeN #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index*+ -unit+ -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None]# -TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 +Any"pandas.core.indexes.base.Index*! +unit! +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -52561,16 +58965,14 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str"3pandas._libs.tslibs.timedeltas.TimeDeltaUnitChoices -None * -errors -STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 +None * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.IgnoreRaiseCoerce 0:typing.overloadX" + builtins.str" builtins.str"pandas._typing.RaiseCoerce 0:typing.overloadX" isnapandas.core.dtypes.missing.isna isnapandas.core.dtypes.missing.isna": pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*C @@ -52600,9 +59002,9 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray"pandas._typing.ArrayLike0:typing.overloadX -isnapandas.core.dtypes.missing.isna" - builtins.bool" builtins.bool* +Any" numpy.ndarray"pandas._typing.ArrayLike0:typing.overloadX +isnapandas.core.dtypes.missing.isna" +Any* obj Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.tslibs.nattype.NaTType,pandas._libs.missing.NAType,None] TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] @@ -52625,7 +59027,7 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.complex"builtins.complex"pandas._typing.ScalarJ #pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType: pandas._libs.missing.NAType"pandas._libs.missing.NAType -None0:typing.overloadX" +None0:typing.overloadX" notna pandas.core.dtypes.missing.notna notna pandas.core.dtypes.missing.notna": pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*C @@ -52655,9 +59057,9 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray"pandas._typing.ArrayLike0:typing.overloadX -notna pandas.core.dtypes.missing.notna" - builtins.bool" builtins.bool* +Any" numpy.ndarray"pandas._typing.ArrayLike0:typing.overloadX +notna pandas.core.dtypes.missing.notna" +Any* obj bUnion[pandas._typing.ScalarT,pandas._libs.tslibs.nattype.NaTType,pandas._libs.missing.NAType,None] pandas._typing.ScalarT diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.arraylike.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.arraylike.protobuf index 807ad85b1..69828bfa2 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.arraylike.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.arraylike.protobuf @@ -1,5 +1,5 @@ -pandas.core.arraylikeN +pandas.core.arraylikeF OpsMixinpandas.core.arraylike.OpsMixin"builtins.object* __eq__%pandas.core.arraylike.OpsMixin.__eq__" #pandas.core.arraylike.OpsMixin.Self@ @@ -108,24 +108,6 @@ pandas.core.arraylike.OpsMixin"pandas.core.arraylike.OpsMixin"pandas.core.arraylike.OpsMixin(* #pandas.core.arraylike.OpsMixin.Self@ pandas.core.arraylike.OpsMixin"pandas.core.arraylike.OpsMixin"pandas.core.arraylike.OpsMixin(*  -Any* - __truediv__*pandas.core.arraylike.OpsMixin.__truediv__" -#pandas.core.arraylike.OpsMixin.Self@ -pandas.core.arraylike.OpsMixin"pandas.core.arraylike.OpsMixin"pandas.core.arraylike.OpsMixin(* -#pandas.core.arraylike.OpsMixin.Self@ -pandas.core.arraylike.OpsMixin"pandas.core.arraylike.OpsMixin"pandas.core.arraylike.OpsMixin(*  -Any* - __rtruediv__+pandas.core.arraylike.OpsMixin.__rtruediv__" -#pandas.core.arraylike.OpsMixin.Self@ -pandas.core.arraylike.OpsMixin"pandas.core.arraylike.OpsMixin"pandas.core.arraylike.OpsMixin(* -#pandas.core.arraylike.OpsMixin.Self@ -pandas.core.arraylike.OpsMixin"pandas.core.arraylike.OpsMixin"pandas.core.arraylike.OpsMixin(*  -Any* - __rfloordiv__,pandas.core.arraylike.OpsMixin.__rfloordiv__" -#pandas.core.arraylike.OpsMixin.Self@ -pandas.core.arraylike.OpsMixin"pandas.core.arraylike.OpsMixin"pandas.core.arraylike.OpsMixin(* -#pandas.core.arraylike.OpsMixin.Self@ -pandas.core.arraylike.OpsMixin"pandas.core.arraylike.OpsMixin"pandas.core.arraylike.OpsMixin(*  Any* __mod__&pandas.core.arraylike.OpsMixin.__mod__" #pandas.core.arraylike.OpsMixin.Self@ diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.arrays.base.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.arrays.base.protobuf index 1a074344018b3800740e357f333e30daf08ce754..f3b8be562f6ddb489027cb9261ba78a6d88e0690 100644 GIT binary patch delta 235 zcmbPUd%1;if)wMQjnWE?j4vkJFq(4jXXol;3eC&R&x@Wsky&)|f5tp07TcW5RK_&< zKeOfL$1Ld_OsxrQ@wn9F4XVzZ zYFsRNiMgo)jFTTS%W-MxaIqCXl$fw1P;3`dSFj+VGl*UfH1_KQe+5E(EGYbF+cTQ^n delta 61 zcmV-D0K)&%gaMa*kQxE4u^S)(0hyCL0W}No1`7BARc>i-Zd;N9gOmROZnJ{|b^^09 T1!o8Xm|3%%4VWympgpq$ruY^! diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.arrays.boolean.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.arrays.boolean.protobuf index db5d3d47d4c644bb043e3e4a8114ba8aadee8bf0..e8bb140f56c8bade30aafc91ef1c6c6b7af4d579 100644 GIT binary patch delta 117 zcmV-*0E+*eVCh$o9Ri&wu^)&Mv!EB20RjB8HyI!S0qB!h8Z`^Q2MUe?Rc>i-Zd;R) z9Tk)B8k&>u8d$T58+HPda2z?a{~c!t0_FviXeM9+?E#ZuC_Diolbt9#lX@&LlMpB_ XlaCS@0hE()AsDmaCVc_3*eFE@@}?>_ delta 1108 zcmaDEJ~v^4EYmcjjq)8rT;DjkSV|JJQ-$;;^@%4%>2CQlFEY2ymYtVWh;B^~5=od{+Vk)sIUS>LJV^ zoIFWJxt^^nMh zs76E$*?tDbOB)lH2hrx$0}~g%sD}GUY9S++Da2S3lZ#X|mj*;5mb6ummbe61q~y4u zftQ||ms*sW3=2yfTy7*s!IVM+Qb`e~y?TBwj-YIyr6g652vlCI2XkBqFpGLZGNqOQ z7gu6VPJVfOT4qkpLD|N@iqS zyV*`efst|MD?0#a+mPV^ diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.arrays.categorical.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.arrays.categorical.protobuf index c0060dc1fba81835f3cfab2e14973c2ae68ef327..e93a1fb2f5ed507444152a9f1ffde4381e1091eb 100644 GIT binary patch delta 292 zcmccelj+Y{rU{u$tqB{mXXx;0U18#4k1tA1DNRll(wlryM4bc5Q=06!LwWLSu~;@W zE|$E++{qJS6(@UE=yU6Fab%~a7Nlh67Ek^tsXDnSTa?9|H16Jr%7CkBda zR@7@}W%@jG@hW59&3TR@LX2xR^VMoFPWJMNn0#)B9^;zH+Ks`J*Y@0IY}*{yZUB~G zTE?_Fu}7VeaoOaL{UFJGlPxESGtQlScdN|g$5UKEBAc6nS4(cL$jxQl{I$55WwLMO P%*h^AKR3(G+@=fwsR3^c delta 1914 zcmb`HUr19?9LG8L&bFO$-ljRd6kD1kYg^NxrBEahVJTRaYk%^3?H=Xk^D>&bd&m%jSTm*@WI1R}?cbNky5?M*J-7HoDnBq;-& zQ3-0gtDtn)hLBb@JZ{3D5jOQI0f-3^})i(qv8&16XTqq4)qa^T<_;4 zd!3Ht-Icnf1xAaIrFLQ`w#A7G&%?*ycAL$@CaBbnB6y(6&=lOarxcr&m_TAgNKpx| zgEiG>4E=o)f0Zy4TaQbdbR%QD6zS|2B~_H;zD`Avt}s@Z7;!oLsJ=+oCCc4C%sI zK1Z<&FcWT0nwF1{+@ZDE@WH%)LZee`$rEQI2BgAQ9z_o8A_3hJgOo5>aPfXlH0$UdI-s|528t M`}DNaV~dr40Lyc5O8@`> diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.arrays.datetimelike.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.arrays.datetimelike.protobuf index e826cf7b7..f4ddae3ee 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.arrays.datetimelike.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.arrays.datetimelike.protobuf @@ -1,6 +1,10 @@ -pandas.core.arrays.datetimelike^ +pandas.core.arrays.datetimelikek NaTType#pandas._libs.tslibs.nattype.NaTType"builtins.object* +__hash__,pandas._libs.tslibs.nattype.NaTType.__hash__" + builtins.int" builtins.int*T +selfJ +#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType* asm8(pandas._libs.tslibs.nattype.NaTType.asm8"$ numpy.datetime64"numpy.datetime64*T selfJ @@ -260,7 +264,39 @@ nanosecond.pandas._libs.tslibs.nattype.NaTType.nanosecond" __ne__*pandas._libs.tslibs.nattype.NaTType.__ne__" builtins.bool" builtins.bool*LJ #pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType*$" -builtins.object"builtins.objectr +builtins.object"builtins.object* +unit(pandas._libs.tslibs.nattype.NaTType.unit" +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.TimeUnit*T +selfJ +#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType0:builtins.property`* +as_unit+pandas._libs.tslibs.nattype.NaTType.as_unit" +(pandas._libs.tslibs.nattype.NaTType.SelfJ +#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType(* +self +(pandas._libs.tslibs.nattype.NaTType.SelfJ +#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType(* +unit +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.TimeUnit*. +round_ok + builtins.bool" builtins.bool r value)pandas._libs.tslibs.nattype.NaTType.value 4TypeAlias[numpy.signedinteger[numpy._typing._64Bit]]n )numpy.signedinteger[numpy._typing._64Bit], @@ -276,8 +312,38 @@ nanosecond.pandas._libs.tslibs.nattype.NaTType.nanosecond" DatelikeOps+pandas.core.arrays.datetimelike.DatelikeOps"builtins.object*[ strftime4pandas.core.arrays.datetimelike.DatelikeOps.strftime* self* - date_format - TimelikeOps+pandas.core.arrays.datetimelike.TimelikeOps"builtins.object* + date_format + TimelikeOps+pandas.core.arrays.datetimelike.TimelikeOps"builtins.object* +unit0pandas.core.arrays.datetimelike.TimelikeOps.unit" +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.TimeUnit*d +selfZ ++pandas.core.arrays.datetimelike.TimelikeOps"+pandas.core.arrays.datetimelike.TimelikeOps0:builtins.property`* +as_unit3pandas.core.arrays.datetimelike.TimelikeOps.as_unit" +0pandas.core.arrays.datetimelike.TimelikeOps.SelfZ ++pandas.core.arrays.datetimelike.TimelikeOps"+pandas.core.arrays.datetimelike.TimelikeOps"+pandas.core.arrays.datetimelike.TimelikeOps(* +self +0pandas.core.arrays.datetimelike.TimelikeOps.SelfZ ++pandas.core.arrays.datetimelike.TimelikeOps"+pandas.core.arrays.datetimelike.TimelikeOps"+pandas.core.arrays.datetimelike.TimelikeOps(* +unit +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.TimeUnit* round1pandas.core.arrays.datetimelike.TimelikeOps.round" Any*d selfZ @@ -307,7 +373,7 @@ nanosecond.pandas._libs.tslibs.nattype.NaTType.nanosecond" ambiguous builtins.str" builtins.str */ nonexistent - builtins.str" builtins.str J + builtins.str" builtins.str = DatetimeLikeArrayMixin6pandas.core.arrays.datetimelike.DatetimeLikeArrayMixin")pandas.core.arrays.base.ExtensionOpsMixin"&pandas.core.arrays.base.ExtensionArray* ndim;pandas.core.arrays.datetimelike.DatetimeLikeArrayMixin.ndim" builtins.int" builtins.int*z @@ -373,33 +439,7 @@ _Union[builtins.int,typing.Sequence[builtins.int],typing.Sequence[builtins.bool] self* dtype *Q unique=pandas.core.arrays.datetimelike.DatetimeLikeArrayMixin.unique* -self* -take;pandas.core.arrays.datetimelike.DatetimeLikeArrayMixin.take" -;pandas.core.arrays.datetimelike.DatetimeLikeArrayMixin.Selfp -6pandas.core.arrays.datetimelike.DatetimeLikeArrayMixin"6pandas.core.arrays.datetimelike.DatetimeLikeArrayMixin"6pandas.core.arrays.datetimelike.DatetimeLikeArrayMixin(* -self -;pandas.core.arrays.datetimelike.DatetimeLikeArrayMixin.Selfp -6pandas.core.arrays.datetimelike.DatetimeLikeArrayMixin"6pandas.core.arrays.datetimelike.DatetimeLikeArrayMixin"6pandas.core.arrays.datetimelike.DatetimeLikeArrayMixin(* -indices -TypeAlias[Union[typing.Sequence[builtins.int],typing.Sequence[numpy.integer[Any]],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]]] -Union[typing.Sequence[builtins.int],typing.Sequence[numpy.integer[Any]],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]]N -typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.Sequenced -#typing.Sequence[numpy.integer[Any]], -numpy.integer[Any] -Any" numpy.integer"typing.Sequence -STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] -Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] -Any -5numpy.dtype[numpy._typing._array_like._ScalarType_co][ -(numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.TakeIndexer*0 - -allow_fill - builtins.bool" builtins.bool * - -fill_value -Any *M +self*M copy;pandas.core.arrays.datetimelike.DatetimeLikeArrayMixin.copy* self* shiftxdYiwoyb<8f=He<(P0h|vt4vKS5;C1^D5%W>5}5o!OrJBJ3(OYM Q2MJGB5YyfKNOUU)0A!sPo&W#< diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.arrays.integer.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.arrays.integer.protobuf index 3c0845389..f7be465e2 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.arrays.integer.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.arrays.integer.protobuf @@ -1,12 +1,14 @@ -pandas.core.arrays.integer +pandas.core.arrays.integer ExtensionDtype&pandas.core.dtypes.base.ExtensionDtype"builtins.object* na_value/pandas.core.dtypes.base.ExtensionDtype.na_value"" builtins.object"builtins.object*Z selfP -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype0:builtins.property`* -kind+pandas.core.dtypes.base.ExtensionDtype.kind" -Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype0:builtins.property`* +kind+pandas.core.dtypes.base.ExtensionDtype.kind" +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -88,10 +90,12 @@ .Type[pandas.core.arrays.integer._IntegerDtype]T (pandas.core.arrays.integer._IntegerDtype"(pandas.core.arrays.integer._IntegerDtype"type0:builtins.classmethodpr? base-pandas.core.arrays.integer._IntegerDtype.base -None - IntegerArray'pandas.core.arrays.integer.IntegerArray")pandas.core.arrays.masked.BaseMaskedArray*@ -dtype-pandas.core.arrays.integer.IntegerArray.dtype* -self* +None + IntegerArray'pandas.core.arrays.integer.IntegerArray")pandas.core.arrays.masked.BaseMaskedArray* +dtype-pandas.core.arrays.integer.IntegerArray.dtype"T +(pandas.core.arrays.integer._IntegerDtype"(pandas.core.arrays.integer._IntegerDtype*\ +selfR +'pandas.core.arrays.integer.IntegerArray"'pandas.core.arrays.integer.IntegerArray0:builtins.property`* __init__0pandas.core.arrays.integer.IntegerArray.__init__" None*\ selfR diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.arrays.interval.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.arrays.interval.protobuf index 088ee23e66a34a67e70f97339445986f5eda341c..e5d32877aac5e27b77476558a388d44761e401fe 100644 GIT binary patch delta 207 zcmX>wljZt+mI-o9tqB_yX6W!~U18#4k1tA1DNRll(wjU{NSy=9Q<|K^qB1#9EQVc; zizP2HH+Ay;dkS1yI$UhU*_j1-iIW`_RJrxIII>ey3sN$3i$VO!`R_ypC$n&I$0sHy zm*$q{B$lKK8G%gYK@w4#yisxeno>-J#EWj+q&c*DQS1G`{d52Ec TTE@AXm2X)ZZr{Ys$j1l(ym3Qa delta 54 zcmcaUpXIhcP$OsL%3M-QZjQV3%=2TFcNF!wx8f* H#SD3ii`;A9pq?)b#y z -dtype+pandas.core.arrays.period.PeriodArray.dtype* -self* + builtins.bool" builtins.bool * +dtype+pandas.core.arrays.period.PeriodArray.dtype"N +%pandas.core.dtypes.dtypes.PeriodDtype"%pandas.core.dtypes.dtypes.PeriodDtype*X +selfN +%pandas.core.arrays.period.PeriodArray"%pandas.core.arrays.period.PeriodArray0:builtins.property`* __array__/pandas.core.arrays.period.PeriodArray.__array__"9 numpy.ndarray[Any,Any] Any diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.arrays.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.arrays.protobuf index 5ef1b3f7f43134f69b121fcf9bc2f9c28d7c64a5..c221434aa2b5d82fb1bc5060470617107fed5c45 100644 GIT binary patch delta 469 zcmaF%kmdL?mIq$%zuN z>}p&rd5O8HlNM@&v?)B}pxw**f< z-+G&=jd`+6XUOENnfoRu)XRbtFfC)6{Gr!-@`3(4K;~xKDe8R!@|`VaEJ`6<8j}@|hzqBu7U{)%=9Q!Z87?K21*uA4aX}36$?+zNlO48+OrEt> zb8_hsiOsTG<(L`gZnoKBX}J0H%Q=ipFBCRszFyAA^p$b4;9CN5_Q`Aabi_~>!`gL=cd!pCg-W!uN zUFV;IuI`6}wXa}?R*4^LVIUo6Y$BAcg6vNPqmF^UI?txcQi|+J3S`)Bh=BuTT_O@B~EFx@@lVl_zpCpi7aDwfy zXCr}rucOyHPS~kOyijfF#HOSsNJLHKw^pqu{3gsLh!VBY#gm%Ba)!aiq&Q3jRho*e zfv$&;NvZcauu)bea)QKdh&N)kT^+X>`~i$bMbXBDsH`Z^^6>*8T&{pat5zDAc%3tS zgD^LuNd#KhHN<;CCiNcBH_lasafO@^q~v&v2;|jKQGuRN)0PxHc&ZYyty30g4;^9o zzZre)g4WZ1h=re;9;kJ?uu+RkBu=DFykMcPrSX{@hXfu&YZqEiNkk$46x) zDXWR*-n+RRW@Rqqag zdgL!d!=gr^aaVW-XfYW{8RYM zj6KjE_JAY&w1L0CoD>8=UT1C>4SnzngZ`jTe)vd> zu@`fyB#*$g8%_vbb>9o_ATNFG+Zn{n*HQk)EHXZh4LM}ER_}td-`gv<)S*{yE?JpR zAEl>$GFhy5S!|Aqk)#&S4GcL!wqL6q`Hb&JggbjjV+!eqjN1jhUI$F9cwoZ&1Y~Xx zKEfNqhW`NT!~~rH diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.arrays.sparse.array.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.arrays.sparse.array.protobuf index d8c8618fb09058a65dc90e7151dd68df816c5445..783ef1dfe19934cb851b61805e3c4ec0a0c27627 100644 GIT binary patch delta 35 rcmexw^Id0x64Ns6jVc`6o7H$t7}=e;Sd#M#DkndX)Z08)Dp+%bM0UWin?VkoQNP_kExDd5`p8x8G{w$6KE+FUgIg z3Y;HcCmIFxIZ->=HA&x`+S+#kcKWgJ5tGG_{ls7{4g#E*U6$zlwRE1pS+$f3%D##> zvvtMFRw{$~Rgf9BL&74;h?l)oTWSXyaY*c0_Ye8Xp)Ow+-~~W6!h1yB&db;GPc6Fx z4|1&Zvjh@lE_Fz#27n;RDixk#!4pDZn)J(NTDGRyKD!B@s%(07fP!~x@5>z<(N=>^k z7hJ6JsscSuYg+8QyrDCX&e!u=gnOsOOLL9=ZR694(18G*G3-C82AQxi{&7)aX<1`R z6 z0QS7mQ+q%?PZ6`9a%*c9Ah+y&?8QV8rv$AD?KdJUhXe=Cqi_^N#8q$Pw?F5~>WYu* mAnbFAPQ=pQfNDrx!d=;yT62{nt-!fsh+rmdO*pidFT!t%@VBx6 diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.arrays.sparse.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.arrays.sparse.protobuf index 9e89fb20a98c3deca67b60064ed76b66a098fb49..b24294529e3eed949bb9e5f80c41c647f8a8683d 100644 GIT binary patch delta 26 icmaFg%J{r=!znhVW!jt1uyJs2J|}F#xLH8@zB&M%&kAY) delta 1214 zcmbtUO=#3m5GMPV?es63;!h)$Hj7xcF;%c4iiZ^s_Oc+mp4J$i$=mv9e2Mv~#!HH# zcz+(f^rGTHlm*Y8#iLgb1;L|7ufBA5+in)6)<7U{X5KgReKV6E(a)#C`_HA^yUX1# zrSka1uRM%(kQKT|PDC7@ zH_!VQ71ZS(Ztx^-MO$8Hix^G0hzU1Vbv7wqV^`~S=T}1_1M8(uT#} z#nBOyvoj_Y*b8-my;4uy9%$I#PIci=AXsl)tEUUBDjwp|fj&so;#;>$ZTt}XwX*=o zaoh)Hhd7RuV_W6wnOT7JWNsiQ!cuOR?7UEWo`Z=1Bj36kxPFLj`68>#XhSA;QudBb ufv~~HZP57IA`}8*W43)^eu2Xrfzr->e_sqYUxk9@dU5(|=w6w5d-^wk_pHeP diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.base.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.base.protobuf index f6c13820f6b5229a0433d7b736decabaeac93f43..fac51b4122af37c94a051a6ba4fcb484ad3f68b8 100644 GIT binary patch literal 95785 zcmeHQUx*~feb(%s+uPEeZfQG*1P2p8*w~mDjQyYl6TkZ*_{AXk!C(S;2n1sVg!8NF zuIj4pp6R(iyL+d6C&W%y|EjvXy1MGC@Ar?jM}9c)6R#h|+}rXK-ucc9TfP=u<8NF_ z(>U1LOL_9SU_S^uPnAWzIx+Xm)?P47gD~-;t=D)z?Y`4ukM?>APkm~z*XvxEsvXa$ z;+|x4*P@WOPjp{pa|s`Aw_DCNHsuXXC)Rz6&EDn*)bK~xDg6jZ8oSm}x5MUN_lJ9& z1Q*!srSPCV-}&+adu)Rb>0yH?%sT61m4~zis@?R988#OVg5A!O4OKlM<(hXHgsE|t zbkzM>OZU@HTI_clTD+N`@1+N$Al&h;U3n??clnJ?CuJWRbFMw-Tx1_M8{Xj|kAuFd z?cV*#rq27F*2Po#t!@XQKfHKe-Q+OXO1x1Vjd+{}oQAdEzr}ko_XklpJhtg(w&?Hd#C*q3dFSb-+FGlbR;@9?G z*l)MQFF)Q%+H+mTPTYP&{+_+wivO|2X6ftcJkiuV2_4Tnioe=ojPLh{dkKyCq| z(?ZtSWKZZ1Y&(wL}+szW>T7 zpSnI;xjXB;Yn}Jw*gqHsx4Eb4ci&xOi)rkK$ta>3a&2;Jo|bgqTVmB$XkA*2wr%>B zzO}@v^P(kL{zx}2Y&t*fu(SEisBd@U0=4#bhrK`h`Hm96W8tpl3Y*9SC& z(_oi-;zw~LiVV>x8Wu-1xfBQ6!^k%d`_b-b$oJQ89E|v-Vc;h>vs*B`Ye27*zDxO` zeP%zUS5G&2MHE)5>6;aI9`5aq4m?@=X7)RuZZ>5->oLnk`F)j(x9GvjW!aLoDgG7x zp}MIk5j`~E!_;3_y)P%8G|A>4ng*kRcU}ImC8+y&OzVetHUDvwR*+34BNySkhw?v{ z>CNm!G_Cr>te5I87;SIU7nFD}()9I;{Jq(=cDYjdU82HT>H>E zFFM3HFAl}|;tJH)u6<~&v(zv43TEA(9B0P;$z$h9*4FLkuh^}WIBzYoAGbajBeK2V z{9u9ou=NmsRWvNGGqqZq!@XugaHo`WzCO>sQhCLCXdK7vL2v5Uv+PguH+7u1(l`%X zWzP7yReZzNZ0nW|A2sR{9_)w@&7Oy=j`hFfAig)a@>p%4Ml@o}IO( zSvi$fi<~vq(Q1~ikQDdZ?SDA$p2h=?T z1@b@Th0eVLSz}JguAMK$)pb$NDNS+~B9xPp1;+HV>U}e<=mz3kYjwZ0tN_0Q7$}fv zJ|-JxeZatsi<$g&D8$$>i~$4lWdtyg=2~-4rkAqgfJb6j0tO!CeikrLZ1w>I1v_f8 z6M%t&Fdh#V?;Qr7RTQtr$=#)b>n#f3USq8romCSgRbi)h1C*j5H?+QxM(#uMc8j4?IetVhClkMb) z*H{o+%4ttZxgJ~6&7^zu`Afv08A-$5N}lb0e@QE}VXX*i5!526#Yy(Fz?8t0z?9M= zzG{{XYei*24{OB<>StvE-C*X`WQ{luG5#HyC`y+zW#>7@nsFMBGoVBGvcQ)`aBW~5 z!8mfyc5c(`K!f!&6wgpR^L?O0phKMT#bbjoZ)IL4z2TWMJC6B!*-4bxd(C&18yB~>$vZ39g|G(lHg6=sALsF zK!=DUn7cf~=@;RoH6wU;Rs|pmK@@^01W^d0@YspMap>?T<(=@(AFaQcPQug+OyPov`lk;1J5ZXIyzC~O7c^m}|xzwdbL zWE%Bk;-1bY%m{il@uroa`)Rh4rTU?4p#ne(i?ns2iq!F9^beIID3=6;1cZeBBJ3A6 zTM4DLIUxW-LTSA(GLs<7ok$vrEO%ow;vIwi;x|vRdAX}4tB|)&v0vp0Ek%k%Gntf; z1TtIcMY8rHO|Z!GmnZO5S&DnIRZ?P7mgU~Y-e?rXX>vuhn`ifx=VfD?MMEN2Rr%UC zWaPr4RGP=>wT5DGY_5Mkyd6ewghe~UAW5?uE$WG1gDXM5ke5k-#gmA1Re#Iae^zpg zesG_gbc4THVDIGb`vd!&^kUaoyZm^?PR2@aO3B*AXlS3Xa*3uiZVXklICTEH#V%%z z-pzQQ{+8UeX|FOl2dncpb8J|A3R!;P!~C#lc>QXI`G6-@`2UW)mT7}IP0v)TCZoK;!;JHY;n^099u4K zOZ>_vDZ07SY*8P#Pq|Mv-J+P>oJS^(nJ+}aKtGQA#P}AqkfXnf)mFF5=K9g-fO@?l z+b+re=rlVS`aQ~pzQ?J;cTcmg%@hxsj|_TTbDh!Cx>yMG!NgqlDrIh6?)L2Ql*IGT z^8d%cp;7XuC)oegr61Ql@j?A+Xb60Sozjm2wLCSBZ?z(+5;!U#CY`RXraa#0`$IpTa@T!MJ#U(2 zbk8c&Dps4yk-Wa<`R*t^XtdgpQf|Xy2?E{Z%PJc{Jy^xuo_|I3n$$+}up{9Vz(N6u zqC|hEwTr%$h}D*$uad_EjVP&n_5%bu2y{KrL7v=pfM5;sXMmKR^WfIJ@3| zUuLtr{(i@8Fux!fS8-5)f#$3a7zk5bnBu||7pAyFxig~8FJK^GAYfn=b1yf<&;MLL zcK0r#3FrL%AR%sAp*i9X*V&2Wb}$NkDsG?v$1#l(M+RXtjtoNJ$g(5c6~Ph$M*>Fz zM*>FzM*>Gu?k;6$0ejq(3+)x?#0QB^JTx5n%g5OXKi(0P!XVx&?^ zU{K^$RNh^GHp5;h&}`OnrOu?52-be1#h$(Mn#BEnik+*yR(sL1)TPUpESc*niU%uI zq#~oDIC{Kf&U%TsX=xa1d2`$uKYf;7PP~(}=QPD#Zyc+(8pK*pv(+Ht8e5ITQ@fvy z3)I1Hci8*0*-$fwdEqWH(Y9Y~>kZK+zZQLkoEoVR=H`Ae*SN?)B6b4oN;Tasjcb_g z`ol~cp+3xEu$7Dt5hEN@58KIsG*W6ElyQ5El&g{$YS36&_g9&LEGLY5CxfZn;hnb@ z*^evUJ`d-Jq$T7B3+#uv)6PTr3^XiD5h%w`2-s?1tAVYCnqtATKTte7wi?EcfdE?V z9_4}GYW(^Nm;Rp^spz0b32&YQR=QZ^#<<4nS%^YRG4Xd}hdJcKi-+|9hS- zQ0@rHy`498S@k(4gdE7Xf~tT{oG2aW#7lwrrVCaFo%p1vv6+K_R7>X`3WppZ4m$B8 z?(#<4n5)bge@lX3&(7xKLS-{jhgL}Ni>zaF%z}0%-?53tIqn=OlQ^ZoTCwXYjR}0u z;CprqF$_SyjW`QVE&U24E(XSDG{R_ay?B$?>0lve6%qbq`B zbeBuzvQ#7zQVWd6aBj5-uV9X*`PLGSV46jVCNzKD=iwPox6(=uDQg` zw_FbCAG1(4Cd`E<7U>_!n4K0d%ajIjWCGGY!41Oni_*?za!MXQaR3ei4gwAW4jv^O z9GCv_`-Bq1y)gLWJ>G~Cb2-;EDXpx7aFsQe1X%0AS`XHGu-1dM9<23Xt*6vfTGI=) z?vbi>n&a13zLZ@79kpC$s40rE9)(C*#6zxvwhnwWovy9O>k0Tj>w9Gz4_-{7~ zqcjSGes940G4~U4@aQ~mK72iHtg8nU2^0wwDI@X;eB>4`^H5dGxMO9M02B!nsXZ9( zk5dv*Bv51>L9TUtWI2Oy!1vWmDU)4Sb4$p!6R%(Nqi1lzf^nBShB4h&Jgmi1SEb90`{b^+8TZMuuzfW-CfL5h_7%3T zuziK?D{Nn3`wH9F2ikO@+hub}6sLq#8)9Xxwz}`Fuu}>5gr%Ra1YRO?UnTsCyaqAEZvKx}nCI@v7A zHs{TCV$t??!qdci(NFj*^0x?pXpUo2!_?N70DwddN44eR;cRwR&pj-8O` zIyN3gVDD$x8R4YX8xR*ynfVAKbi4-mU6Oa-Thcb%V{A~o4L;m%&mrh32a5|97c4GV zT(G!calzt(#eJYz+$PiFwO02_%LIo7xNA9pfk70ip#2gEkB?ah7zh{$7zh{$7zh{$ z7zh~nu*1Ob&a%1NoR28A)z@d)&5RWl$*(RA13$@+YdOy`ENKmUDqW5RefsA!?1g)3 zoARnWJlw7OTR9!u%d<#b^RGuqkP_H*F0z$Mr^;?3Cb`k>;@S6qo1K#UcCR1pg=x}g zcVP-UKO?IRv*3CLHQoSPqx77?RFH8k0 zb{yDoV8?+S2X-9TabU-R9mfN`3i~LEp=qG(14k(x! zUAPfMcbC}Q7Uk|CS!E(ZRuy*?`IlTPRf5>)bsi5RfADI{dH0^+^)2@F6!3bRu0;Ub zv=Ws?hLvb`43KU1CTM+x7e;ttg!B-mhz)u^gcrUKkzi+GmAAmJDZ#C zEAM@E_^45rkVZ#Piv#9$L>OaZa+M_5hcB>^>J1?*$ zyPb^En`uHL`E6Wg=j`gy)@!_?rsa%#i=h@i` zqIRoA$WK8W=RovhVuqi{`tUlNHf->;a!uyVSMM9hekdXK^;XPTr`MA~D0(A`TO9}K zL9f@jV1m7>S-4lNVoeVfj=KAoEp~<~g%q#Z7rcE!7g?=bq$J_|5&M|_SO-BrwdN!l eBgMLG)%#0rNDPle(N6a?n+Zpqc{%N^w*C+1XZx7| delta 4441 zcmd^?-%C?r7{__v?QHGUl^eFRt<`eo(4pH>6RAO^LRKIe1pQJu=E)9jXKUvSTtq6} zhz`r1*qpkR{ z2C7jd8crsV2f->npsPjZmFGH`)z;!w9~3ZUc#;K<$;Uq|FnY8U-?hL5V_~{1_ z2~1B%z-g;AzF~=0;)CZ@U<&bD@r(}=Hupx%y#mIHtoSDjZ;Kj?oquIWpZ@#%%kctx zz5EEh@b8LXM@3;8%)Z$}rNq9q9K5LZ_3;{NH6{xwZwVK9b1wARoG{XuON|BJvcjOy zK`nmfy<)OS4mXOiP$UlXOF6JpuA)PuIwR@4TxQHzWC_EEB68fkYh9oA9yc8#bsQLa ztwa;z+RUzXl!1OD9Tc@V@M!o1?zO_iKnY!jQ3n`C7O62L?~lDiWYj@)T(l)5h+rDY zgTbfI=mOzxFU(E)@p}uHrgGCTzqh-LO)()T3!>x=3X)83oF}|+>O=8H%v{xccBvG9 zw1DwzUK%uKU0dXML=aoNhh;v>$>FHym&KmG{Yafc8OtoupXVfz6D6fnk8aza zTUJpandas.core.computation.pytables.JointConditionBinOp.condition& builtins.ellipsis"builtins.ellipsis UnaryOp(pandas.core.computation.pytables.UnaryOp"#pandas.core.computation.ops.UnaryOp*L diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.dtypes.api.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.dtypes.api.protobuf index 62b3783593d1f9b462129aec8331fd53303ce056..7b1269b9f2fc5f9a92a91c89af8155d1790afec3 100644 GIT binary patch delta 49 zcmV-10M7rrj0EqG1F%LIvl%2zFS9yd!Wpx}gv$%FTb!gAv&g{Y43qz~2eWg~w==h~ H1ObWxG~O2T delta 339 zcmaFg&%C>bWrLf<#?KN0QpiXfu&} zvzvsEzVsz=E>WOl3Q%83W^SsPNl6t{qdrLEWLX1Vrjjb4hG12ZBjQ{jgEI3<%uJw) zG(d{jAcC7W%$v-;IVABkx5z1RE`hf4gfSh$!Ii;4sor5>Yo;5_7=DO%7xdn;am(#Q_rqE0?+;&Lsj=nhdl(J-;Y38LB!}NDpK=HJcf0V}wwN*%C@<(6c$?utX;Z{yoIO?~#_}C;y E0Lg}US^xk5 diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.dtypes.dtypes.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.dtypes.dtypes.protobuf index c077108f9..cdb782e71 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.dtypes.dtypes.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.dtypes.dtypes.protobuf @@ -1,12 +1,14 @@ -pandas.core.dtypes.dtypes +pandas.core.dtypes.dtypes ExtensionDtype&pandas.core.dtypes.base.ExtensionDtype"builtins.object* na_value/pandas.core.dtypes.base.ExtensionDtype.na_value"" builtins.object"builtins.object*Z selfP -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype0:builtins.property`* -kind+pandas.core.dtypes.base.ExtensionDtype.kind" -Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype0:builtins.property`* +kind+pandas.core.dtypes.base.ExtensionDtype.kind" +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -133,16 +135,17 @@ $TypeAlias[Union[builtins.bool,None]]G na_value2pandas.core.dtypes.dtypes.DatetimeTZDtype.na_value"J #pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType*` selfV -)pandas.core.dtypes.dtypes.DatetimeTZDtype")pandas.core.dtypes.dtypes.DatetimeTZDtype0:builtins.property` - PeriodDtype%pandas.core.dtypes.dtypes.PeriodDtype".pandas.core.dtypes.dtypes.PandasExtensionDtype* +)pandas.core.dtypes.dtypes.DatetimeTZDtype")pandas.core.dtypes.dtypes.DatetimeTZDtype0:builtins.property` + PeriodDtype%pandas.core.dtypes.dtypes.PeriodDtype".pandas.core.dtypes.dtypes.PandasExtensionDtype* __init__.pandas.core.dtypes.dtypes.PeriodDtype.__init__" None*X selfN -%pandas.core.dtypes.dtypes.PeriodDtype"%pandas.core.dtypes.dtypes.PeriodDtype* -freq -:Union[builtins.str,pandas._libs.tslibs.offsets.BaseOffset] - builtins.str" builtins.strP -&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset * +%pandas.core.dtypes.dtypes.PeriodDtype"%pandas.core.dtypes.dtypes.PeriodDtype* +freq +wUnion[builtins.str,pandas._libs.tslibs.offsets.SingleConstructorOffset,pandas._libs.tslibs.offsets.RelativeDeltaOffset] + builtins.str" builtins.strj +3pandas._libs.tslibs.offsets.SingleConstructorOffset"3pandas._libs.tslibs.offsets.SingleConstructorOffsetb +/pandas._libs.tslibs.offsets.RelativeDeltaOffset"/pandas._libs.tslibs.offsets.RelativeDeltaOffset * freq*pandas.core.dtypes.dtypes.PeriodDtype.freq"P &pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset*X selfN diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.dtypes.generic.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.dtypes.generic.protobuf deleted file mode 100644 index dda9fa5a1..000000000 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.dtypes.generic.protobuf +++ /dev/null @@ -1,6 +0,0 @@ - -pandas.core.dtypes.generic* -__annotations__*pandas.core.dtypes.generic.__annotations__W -builtins.dict[builtins.str,Any] - builtins.str" builtins.str -Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.dtypes.inference.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.dtypes.inference.protobuf index fe7b599a8..56c33a92f 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.dtypes.inference.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.dtypes.inference.protobuf @@ -52,9 +52,6 @@ is_complex'pandas.core.dtypes.inference.is_complexK builtins.function"builtins.function* is_scalar&pandas.core.dtypes.inference.is_scalarK CallableType[builtins.function]& -builtins.function"builtins.function* - is_interval(pandas.core.dtypes.inference.is_intervalK -CallableType[builtins.function]& builtins.function"builtins.function* is_list_like)pandas.core.dtypes.inference.is_list_likeK CallableType[builtins.function]& diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.dtypes.missing.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.dtypes.missing.protobuf index 9472459cb..71641f89a 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.dtypes.missing.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.dtypes.missing.protobuf @@ -1,5 +1,5 @@ -pandas.core.dtypes.missing" +pandas.core.dtypes.missing" isnapandas.core.dtypes.missing.isna isnapandas.core.dtypes.missing.isna": pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*C @@ -29,9 +29,9 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray"pandas._typing.ArrayLike0:typing.overloadX -isnapandas.core.dtypes.missing.isna" - builtins.bool" builtins.bool* +Any" numpy.ndarray"pandas._typing.ArrayLike0:typing.overloadX +isnapandas.core.dtypes.missing.isna" +Any* obj Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.tslibs.nattype.NaTType,pandas._libs.missing.NAType,None] TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] @@ -54,7 +54,7 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.complex"builtins.complex"pandas._typing.ScalarJ #pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType: pandas._libs.missing.NAType"pandas._libs.missing.NAType -None0:typing.overloadX" +None0:typing.overloadX" notna pandas.core.dtypes.missing.notna notna pandas.core.dtypes.missing.notna": pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*C @@ -84,9 +84,9 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray"pandas._typing.ArrayLike0:typing.overloadX -notna pandas.core.dtypes.missing.notna" - builtins.bool" builtins.bool* +Any" numpy.ndarray"pandas._typing.ArrayLike0:typing.overloadX +notna pandas.core.dtypes.missing.notna" +Any* obj bUnion[pandas._typing.ScalarT,pandas._libs.tslibs.nattype.NaTType,pandas._libs.missing.NAType,None] pandas._typing.ScalarT @@ -115,7 +115,9 @@ bUnion[pandas._typing.ScalarT,pandas._libs.tslibs.nattype.NaTType,pandas._libs.m builtins.str" builtins.str Any" builtins.dict* npnumpy * -npt numpy.typing *e +npt numpy.typing *4 +TypeIs!pandas.core.dtypes.missing.TypeIs +Any*e isposinf_scalar*pandas.core.dtypes.missing.isposinf_scalar& builtins.ellipsis"builtins.ellipsis*e isneginf_scalar*pandas.core.dtypes.missing.isneginf_scalar& diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.frame.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.frame.protobuf index 5728619cc4f4d5eb10168463112ba6e2a10a8153..318d82ffde8189ff4d295187e9ea6710a9b3a706 100644 GIT binary patch delta 17893 zcmeG^Yj_kzwzsOgx;vG}%;X832a`!a6Ceo*4|%RZLgW|sWetv6iiQBI=&H*Cy6V++zvKfhTu~mrcR{(;GkGK41n;LG_nRO2 z(p^>O)TyfTs?+Dpdw;h*^@m9ff3@J_x9SHh*WjwTuEsQBiF*yCYRB#zauEHmlm`6>uY ziPblH*575aBZodhbbEfhZ^O(){1cY`vYa~wSf-~wfuFaO~WGw~-4 zx^?gG@Cy#zv3ITFo1`{OqHATSPbW5g(|6D4`|DKS;WrN*_>(R~^+G25wf0 z`Sfoo^d;EtmJ|8Vb-sJvz9oUEpUU(tKx@UzeGLPBLP+|1vFiRSb&Lsh9<^oI`xZ)mMI&sA!6azsFFR zgoZFF5nYYgqGTi>Hm*N!O5rSf9UUE=a+;5Z@_gt@3t zQnP?hTShO32lZFYdnr}jSqbo(M*_MOQK;< z3W|lyYls5>3K6Z4Jrj+DbBn~Vh`BV>v(VTNS51}I+>yw6!`&x3YCs(Xn9^pV*luiAIekS38&)13Xj*=-6ZyVJN_4IcmXdHXRi3|JV|J(qf z58{TXmURLpWrk+tRKL$(UKkE20u9iuM@49U6H{*1b zC$sAHcq?N3aj;opA7SbnswZD#?Hy>QDa0(REn6^sdZ;n8+Vfd6Ofo0>q(c7*GondM zH$d3G8WFNjq9+j4ZN||Z3xUF2NMw&4!E-TW9mC0_aR7ZqK%!%U-lS&EC95U(C1qz_ct0u!-+&r!ju?c z4}yl7#KLCB3F~JoE2F7c>a5^g#5o4~x`Y*$RfH0!Yl-IOJM^PS??GUBL5P7pKAZp> zv+*2wJ6W``gpZ?u-iT(=L8tkOfp%WS5RVbV{AgR%wXJortCc6ccQY7yHO<>S*JG zqMhaJ66(h)=S)kQI-5LFJetNHafypZvdP=T`u=#I!ahAHjuPREVmX?<{fYQwKXeDH zJ|hYW+ai#y68=JB(;@Vq&(FEB-cGFdGb2!OhOTx*6$@nyZaw{5& z)w8g`iiV3iqC@pRniAlTUm+>dUg)SQb9f3Im0DR*O|?@i)=^fRsavbQF*4TNtxbb) zE1Cmq%Ftl>aw=AF3~E((p$O5n1gY*GDWoxu3h00im?k{9*J>P~9+UjEYLSAM-zyIH1)R%ua# z>i0KNzjx=c)0>+c=;lpX>;7!2cTqe0Lty zpOTUiFMRgd|B(eh4kH#-G=m=E~O0a zHo-JUwc$*vwKTPedyC!ats6_CFM#PhQr8S4aWFBL%);A5#<#u2tG;Z zG$uTZDg~~YnzzPXWv0+_7s`*^A427ds#0f7nGq$}6GB(Pj79uf;ExaRAixRsiAnGY zvFUexE>c-r+BWj5<09SK9#1gyz<}}Bi?~9T3I5i=FRN>w!E@np9v!t57q`W$)R$fq z>4xF05r_W^mUr?()2)Uf3Rk2kEFW!IIIrd8!cy zgh+cJb{Xf1UB_2}bi@92ShWkeEWM_e?QVL|{07Z$ z#}~>TNYw?rUQylDW?X_kZuh%zP{@Kp)+-?!a-QkxqU5CkKPmuxoJ#R);n1`^BeYawx&`0;r#$R-UE)Z>Z9!(evKEbRzs z&Gu@@mY#-plcgK*#w5mj`_e!M;~fgZhmryyM{}f<)*hI&P@2R3GC?}>4Bkp%?d#|Y ztbWb(*U`NwVhRnZa=9xV&Wf9j#2NEsWgIl9@?fali*5kx)jV(Pd*DMy2@7eO-f~@v zKdTA`g%cIB-az>glg>jh1{S}8o`O50 zx}AT!$uz!J=Q=AKo_Rfh^M7F|qp3X^Y7S9H(fFSs!glq~_NwQBwv%r~>G$#kB&W7m zbMmF10n5!&8qCkeDePo6z6`-yo4hV+JEn@O#G|bgUj{ z&acq381~!bfq?+g8%E1**pyAf7S!;hRgG6lJ4$ba?Nh{5V?>OQeKHBg70Q?4H4(=D z0kFDIUTyl6*Dx=rsVe1xje~@)hTVX8Y4x@8DEPvHhmjkrTuZ8$ISNle;yFY|!wCx> z8sTsC$8Z4AEU=Wz>4A}uyG$yA3Arc|+fv~~46h_zKVF_E7}bSota+9^Lc#U@px_2M zTTs_W7!OUqDhcnE%DIYg_i6-=+vRkY>y$TRyrPfsHV|)#0*gz|#2-dN)9rFBX^Nyj z2>Oipk?diYT#1C-s#;hxkC%_uT`Tl~FQ+I2;NV1sm;U?4GubV-5ZIh3PY2~@d9J7y z(gDU#DZq}Y$|yK}L@t4*HF6Q_bBmlW;v5cuZhv56J%=iSPLp7rDkKuSe|g zbMnYJQbRZu$~8dQq#rHUyehAyZhM#cyX`ibuFtr_3WatO4hNf29@Nbz6h?26@?j+* zgTvyeTo#Bn28s%kW%YetE#8V#F>t)YbI1KicHNG`!t6Yq)Ts9^GOGCxG^2^UKs9HC zSno#{&MWlW(fQja`_s3i;~jKy++Nt!U)j<3dMezg)pFUmh9-4M95ZUjhr@o4Wcn%k zzVAlgPDFFyrg1n867E6@DuV6f@Rfd=dNRXLk?fCDCn`$*_|Oe0RCc?ZPQGL~-N*}{ zcTQI1FtyRrwVCneVxhGP*)>B+6+^dm8)85z?Dbj7?DlcjE0H4JFdx=<6&^HxE7o|( zWQXP}PYU5J0u3p1cr|-XRRxa(?~&d`N>N3n#vtLoL4n# zY-DtJmu4N+L`S5zL>R@yoIm)_sJQhj^WxO*WwaUX-M)QGUY7JDX?=dG{5G;XTzZne TeR&d0*{0MBW{RPCo8tK&JOW@F delta 5972 zcmc&&d3aP+vj5JxYfdM*_cmGZ2C_ofLN-|@KrqM~5m`(SAuO@eNgC*()7?pTLjYwH zQAZHsMQdb{gyD(X;{}>GXIPWSCa4I)Q%4Y46ds#|L3G%{obF@@Fevza^PGP=b?Vfw zs!pA{Rdw>_+XMF>O04-r!+)G+?9;~L#(004xk8fWnDtp^GLzQ3P-g^npDB{@wLZw- ztzolhbV%F`o35e|zc1;76#QYO@lft)Zr534+{n-7^lL-e-yQPuA^OrGo$zx_>*lCuMjhZnUJbMi3Mpc#q`}>=d{PI(Ok%VL2$a=x=9P^vIiTPhv68$qK ztcw)Rb7U@pdb5;ryCTmFCCR9sUSk}~8V|!7)xrK{GfE@yYAf@nuVLx^h_P_d;IN$* zeVc`>l%90jT~6cZXVFI43-SJtS0{4*QR^#(0C0%E{tut0$tzYOVzO8~Ms;qQ@yQ27 z+B%|Tt?Vk4f1jg2pF=(rpfW~CG}80J!Of$2M%SwvMNkrt9)SgoTpy$Vo4jR&)|W;hX9Mugy_I;GwN370!3TL!sde3Zo-;qJ;=;rEO=bFCtj^BF=!X zSE(rwH(Py*p7;RGiw}RUH8HvElU!bl*IMKN>)To!6n={YSa}M)C=VmzB&)+`gUTyn z6fEq6de94}(Pe_(p^Ych_b@$u2|-fm>l~4-ZntAfsnrd6Oilp z-0F3ekAb`*oFKAfA4d{{G-zdfGAt{?ZH;s#gwA*1-1hj=AK~jtT+{0Ma;`ZuS@0Uz zVqQ;L-%$udQ1us~HQn1u=)gCT3)f0g6A2AVaU9KAD!G_;WM~8Bs z^89{@?1z4UBBAil@~WVB{Fegx0IVtU+9p%EHG&4pGAza+uYZ&kL-4Zg=yFK3%2U;OHeE*E14V$I{f7xGmvPMWj`U)ob(G zOKldr$Kv#r+RE+4P}!d!O3%K|RmbC9Cc0n)Hv-WI!|-s9uJdVe2zTBHZMJYV;p2&5 z_u5JWRbe!Vg))PSFwz>rz+1<6HQbj8EvV%dWy=S`314dUOoWUHC>ElxbI&U)G2x3{ z&Ju=v9g}=x-^cNs%Bxq+{MF%9{nd8@b+e`3-KkU`i#jm({0YtH%p#Rx0i3 zMV=p(jw?AB+MWLzQp#sR@%z45J_9flI4z`87Ms*^b zpT>2fANAl*b|T-jCUUvWV=Z+Z_1*IMA zeiAMTZ6RbMmmL>-56O&aXn>>As51mO|gU3|B_$_lJi&!1d3*G6@HE* zgoSw$>o=_DQ|mB%49VLN;V0UiCGbW&bFDCxU>9pwtb5VM3ap^kEBRoH8gF;9xV*}f zWhgi>j4{gePH^l~$%$2DBz!fJ4jYNuAe}XvPZ2|m8`o51w<6N78Bm?j5v4%oVH9bs zrB5352jieFABTdcO3kGHLVi+~vR)=8kHcPUvv?-h$9ZAaDHJOVYmW1r z{LhKxKf}Kx;vWTS`77TS$&}OAapYMPsE(0F&Ugu`uJCElaFOpx*Z;_;AuhAFKTK`p zQ|aVJ{*?rJJy8hb@t0j-`erc|>ucee&0;#g3Xx1$vze9u!tJUAIapGmZimPV1$q%l zf($INSnLopq33p0fz^SZq4nZCoT6D4OBR3dI!4+Iv9( zo2m5PBpNP!rbNS2hm|C$gtQ$Vm>>34C=sThjEZj)Nrasri7G;{Z;{d$a(9SP_y8C1 zIE}tlCuXAfh?{0*!Vh&hZK}vFb^!anoh7yk)__}p*To=^yURJ`o#FtxaH}{1{dxyM zTZ0k*33qP%zd0f#@~pc;UV@O?6wn*@h)d``G5?mh;D7xE+tBu(i^TvS2gD660r^*Z zkhn`6h*ktWSXHuD#J?n|{;w$;f#Kc?x+yhhB)kzP^$r9$lFK};!|MMPyK(w=;gk_a zxTwXLn2KGcZdO!1tiZ7kgALe2p!y5^C^T%-roxdCD2rAd6`#SJ{=O*y?@s^vm3RZ) zKQwX>u6`IAQluW7K0h@;^fa8(33|0|44wkEovyFUJ}Fv%M-;`hqe6i^5H(W!#2DirFljhU~@JNX@Pdo>VZ4N zQUc#(@W=Qn%MpAiL1tH+i=Ou%$vKTsTVroeo%49hjXgtq^E)(>4o5eudeCIV9l8qi z*&2ZhCaslr$BxR=|LQ6g$n6rtihOp5*Y5PBI_w^=ep(~hcl9&&4h=1S-rGvDezVrJ zP>Je4*|FBKa&-#b9(j~#)OSyW`8}m5d{ztWZIl+X1FK}cVSOUnKXY*_6yB`rQLASH z8`G)vxUxZ{MZb}DWBFh<;Y-S0Zm@>pxKKvu^I68-fh zQqrx$qyD5^ysPlwIz#BqWo9Or?$5%rYEz`w9abN{FQ*>nGQWs{3m4U7PQT15>_xQ$292a{6XsKZy4b&1?tDpD*lZpq0^tz?iJ-jlAjE09hMVLj*~#Yan%zi( z4+56xK+2ezGdzVZU%B(00= zA3J;QJ+JS4=X;#<`@Z}93p2jl7{6mGINBGnqLc=|>MO7K2MIFdqBR*r=I*|hHOZiF zOZD+ca{t)~xuRh$xFo;z>_hrXR!F%;N23w&=dGysB3VJa6C?ME3G|CG@GDXQY4nqT zES5UasUJ}mx!fHe<7{kniypUik>D0rY306@O{EOE5~j-K{nPZgv5jY;+Q~@E7eBp+ zEQ2%T+@`p=kv+{?#b`sGa=oONAASAh=w}GXh*FbX5{(4Emw=1p+`L(`(M;=CIwjF& zGqSt_;4B&BXQ^)~^{qT$EtfB3rIqNQ_H1O#Q(c18Ah@lyo=%rtYO+?_r3U9ZTq@PZ zHi68)0jT#*RNJynXlrug`OW}1Q{I=tZ&=;w5*teF^&XogFztQNR3+J+QjJ4p`9~Hi?1w4_bmze{XZy2eY}P^ks~*KJfEzC>1ba9&7%*tavYj-giV## z7U^We^4L&b$8kN%0bnMvc{#EHa8D?c`jXzVAHWEg*j6t}9=k(SbznQz0k52UysC2> z79^q0A=aQ(^Vmr-tKqa^708rJ-JBCO>}^nTv9kS94_UiZ?`UsO)%v6!UIJKylMHq3 zSWfMd+v>2pJvDNQ{Z+=Raag72$37GR-v%R_0GlFYll!Q}X8n-LAv12pGm0Jl881h| z0pMNLkS^Mk$v!2=+Ix)|XIyQ@J!g4<^rgIf zh@p-Xa1|0FbgR%ZgYI)VmM;Bq%>1lcm_EkQcr!$^dCr{uJ+onGmmt5fio6OS(<*wJ zoeg+VS9EdmiAj-BA90WpI_z%T@Es1mhH}e5qMY+{qkO^QnB}G3vO3_TmfKYYcGUR& zjl*82>RX+)cBQjKY!uoZ9-Gak-1Rwi8@VA!68~!ev%lde*vmD*>0_DD$nk}6$_SFm zf;5>&)()!VM|2G=2JTYtSVy-_Im6z z0sj;We+Gie;Nf1=@TpQl3;Hh;$0<~IVA zbc8M2fQ>-v7*@?&V9ZEn1nv@M{g6tt|A66VB>w;jD}y`_GL9X@x%p$F9NVpK0xk^> zF=&JhV;LbpG`|nP0`E8tm<9gb9>W-X4b1R%9NIWxwB0sRvhbS}w09;w1gJqR{ht<&iPf+PmKO`X4B8o12Sh)n?QXhVnfH5>m&dXQfvpM)ToyMokfVARe$A2RqTdO`Pc_p8{T`6ZVCNaTF9CY~m7TT(dc* z%7;PEsD`F%HTShmi5-Esm?xv1OQ^W0e~1@BT8{y_j?heNG)+t;h; zd^=3{fnmqeh)F23pNd3>3RyEcvVciOJ9Mlb^%SyqXdOGhVaIuM**j2U5%Z$%Ab?aI z4kID(7xF2j>!%)#*q#Gv4S|WtMjH{4>3s-k+vL?*`0s4Uv`co37JAPX{ZEAY*@8G+ ziwY9xBI>hjSdCU4&=sKfyMc+d+4$~kcq^(spi9%WSN$Ab>Ts+Bd({}#B(BAZ@XGlmjwoCQcCp=EVHJXR~I*}`6y#7zQZ#TUVL!{e3V$x0-_e3cB(rUzgb&_qu~IVL7rd0_!tZTJr7 zM3e?`t8qlJ0?`lRY`XG#8M`gaGKVJ^2n{5~j21A`9mQ$0TE4{EW-eRlxKmeU2qyrH zl7J9S0HCk`1c2{ucG<*OQeQs6TrGU;L8?jc#*hD%48K1#eysW@U;Ox=Ne~ImoRv|- z$wo>!70qx4RQxGz9Tu|vGAR(Uy>cJ(m7}DOPxB$#nyso?#8eqTFX}C04iflGEtE5P zsCEOD&;E6)7q-PI;+i9kReo2_R2Z%ahN1`8bNRYIXF;kN=j>|B*Gek1qGa`OafawE zBxLHHj`mjRhQPz74a37QPJRQSfwZ=Il<_V#=l=@-DH#5%Bu0V$;DKbwXwVwX`x|6_bitd2!a8e9T6B&kvDZf3bdnSt*ScdNULRUh3o~-^a zMt|Q#`z#Y%>;)lEZaJ8Xe!_AI#QrRAqg$Hj`HJZ?I?fQ)8xepio``_w0vT{f#VgR$ z37lIW0PUaS;2ZMA87W$wg6n=jg+YwqXIB&TQIm#sC6Jpp17w}eEg|`y+ttESrGE;S zl*I0g=C?(|b8_$diQcaO)ZokH$)0u>{%pmEnEJE)ah5F568i~XOeC!eP79tI&;Nd zeo}583R&aN7kCp4Ql||$h+6F#SN68tue*E;`qlFGnB zUA!S;=^%!Gu!}1SGdy#m82+)w@W^}NO^V$7_Ze9etGBjY{@#XAOEtNUj)K`*^|x{tIa7g=hc( delta 17161 zcmds9dvsLA89#UC-t6vVce7dYfRKc+1dxSnFyV20a3rV!f&~Ir5f3gmyEn-_Z0;_* zH$X~Tz(0Brt%A45@dcPxdpz|4i1ebOkaDPPwN=DNYdtEhJyIV<@NsN?v@>(>-4}_7 zE_Ro{c4qF}neY2%?)Ui3H~a4m<@=r-x4G7R><$juX2+wwu~~iIFL})qPKMsO9^L996E>#D}W!U4Mi3mb}FwJ|RUq zJzUjaICQZ!xOVKAXWjhETH|7mbmg)t6;;MWB`hWaLA5U?D_sHWnTM~s5REh+hN5vP z&?PBSTn<@1eBbyX@L9Z;I6i@h?~z2stMv;Nj44lm)(e;??3oVAo&SNTs7DIRgf+h< zd@o^*wiG&Zjwg8p6KdFNZB%zjfK&^ZE!%mB4~L_j_(UH!2H&?0PGLN*665JSlIpp~ zV?ydl=aE#;Egp{m#7Da$p_GOZ0#UiVpJ1qWHKu}S;({&@M7BGL#`#8iY#2?(sp+-%dQ_V-@go=x& zfytgWG_s>tj;OMd2+&sT%QqW_yE2;mi%?NG9*rp?-2&y>a*oG4r-3Hd`vBQj_KJ!s zXMDQ8fYs=;A=skyc?5r9IHf)h;#LwlS!CC7{_~MbR#Yh-i$+A1INI9bRdpq#{Z``T zDP7cqPkDK^fYE|?i~zF>#K7QwK{(%a8?iE>-X0cIq*)nzz-+`1j{tKDi6h6OJh2s` zvLfC1(|REpe}|t&5^8reOm`g?IXK1HfEv@E1gtJ&Y8cw-6!|1}&rgL;<6TLlIyO^|`W4tPh^1|=;apN77 zF;$c!>5S2O!87(L!FoI8IB~>NSTCy=GG`PQWq@x)OsMHgM(YL7*hdgS>SU#1qJ`~Y zF{mrgXmkZ9l#1{+( z6=`)a$l|sdZ9PD{vG4?>!9yq->Fr@5t2UD_*}c)>Q=R<3AaBF7J+*zw1G_(!o~{pG_UnfxZsfyJ)E|1 z$to>g<;NR_b78&i2skS2UM`LXc>M})sqT9h4!AH7xPUQDBw|eyiJX;bia&2gf*6ZM z`n-*dAH1lZpO-^syrsmS=~Y5$))=377L?&&J6{I;{o29GjX9i7d#r7z);oC^8y@

        zQ6={LlX%!~9pf&;TVCVqaz^?A7Y>d9!@C)-ST+RN76Za~xTRcM6YRxKaZAKJNv5!eM7Qg3i4@e|97n^BI6B&ADMvY`2DWkVQ4AW!P_9&hHOrfQEASphQFgZX@;XQ zCn=r%IqkQQ-9Qm~!^SbJK5w=IRfOPRGrnK}*pS0;&$j16;<(9%Uo?^w)YLg%?w}h_ zDFPjR>3~%A8~jxKul;b6>neoSM8pm$!VpfHz=iKU0GH7AzO44248SFLnW_IBcFUEmV1uNklI0!tmwHKEokdr86~ZrREY z!|QCk3qRZiM(ZQH!5yw|WjjaWYt{j;u(#>k!mjoMWb=jP&QA8h86}#Rl*1KCLQz>u zL;Q%QrxkqSHqZhdnNELaVyDQ@$l=ub#2w)G9EC+Ez^dn_8FQ@Lom2KoeoKxDOtAL} zfZFhNF}@9d@(ehhgna$r;Rs&%9GDG`Po=-DxrP|^r``sD10R~B=NL=e^FF+TgSXyN zf^Pt@)3&FE9R*MqzZTD|=e?YwZ)oNhxfz6SJSM<>@-c`+bdpQmZafF?*6Jq!yt;&e z)%w~p_+^db#u^ic#j#m@qXEMj?{J&&ok#hW>#jqij2kROhfEqwuPjSbZB?h!J-(96 zA@u&Gu)^({jchDePYRR4aO@U%F&Dtf2mGWm;!WPkStljr;f)+>(Av3SgQ_^ZV;UI0 z;7nYd>@%m=q#9NxdrTRlB`Kv)rl(3AW zNBJ^`|GiqolZ!lY3VtLuIZ zm2RwVgXh~f)tkD6j=*$@v4}%y0P3W_PL`g*ug21|qVZNH3<_=@i(fecXW^YAK&yV> zalXu5d^r-LYPS@(Rx3-vATqq4P(+ea@ve{fv6+c-^y#na8MKPmH^C+|3C^553)E~7 zxGS7yZ{qZNoAJ?)`36X^LH*`d!hhDxnD#IJbW93RB%ptzm5w#|6f8mQlQE1S>h>E` zP^w7nD_;3!O)B*tA3XvawOQfI^#$8uncFzZq!MP>njv9U98AK_x5l9&np&cW*5pRb z=v?DPLU!H_ja`g9l+2vpEOEGqsOKV^ti&Q>h#aB*j&IS{>|0#AmQWsDt%S(&K3T#Q z$fv!&Z?x9<UaL4HkIGc6i_nT-*}Io zK+@&0c#^LlMn)ejQ=Y2J>CV@PBC~GuuyLGL&DVyk8=<^YiU-(@S1F#nCd#8!qaK5> z+)WRvjXOZ8cq4fL@ABV8vL4L4M5dZGY9_(oqu>k;gKSsPyhJgCe>wo$g$8nONYdu- z^A~I6UhZm1?&?+(cq=d5Sh*b`C&?QRM|*+^RaB|X-h|Lw+Dg4r+g$9>Vsm)y zDJ1*0FJSZx1lf&QQH>Ig=-pXbnv~I_Lsru|&63q2`t_)E$iN~-!D33lvSpK~FG0Pc zpV`r$xhwl(QcDEiU(5~re-PubRoz~M{>T|VoN;eN>zQMtLXk6APUCk7X1}>mw3Qvc z-5rn4;nuaH(Wjl&cls_>i_rLtafYVNm)>z*PhjYtRkP5jj6qLbUEgUtRApV;PTLy9 z&n!(jn*Si`l0sO_U0**@@B+#7HU>eV4%eHR$A(R2Nyk|liM~Zsc_~s%wMnKUHI}q| zMG`L~hG1JMVpLQ4oJx#sdo9C9(>hyz(h$JiH^V2XpTQ6*rVeSzREG=>+EuSNEQOog zvu9BMCM<^}3W%Js70(iraa*CE7)F)J*z(7Wnkn%KM)LIdTL0Hb^QGP{l`ci`m~^S( zqBUc%Q^l*_@DBV*HK*$y8^5<&e{~GMqXE2hIX>LZUka)|(w}eVx4VmGl29<-rS1CB zMYw$yUjc3(Pdi+uyF`AWyX26AJthKq%t1bWt$kdbuEhA;czpa>P(cGgKe#u6W2^Z& z;PwmX?`-{rci_d<#$fx+CeK#BqPp&is_aW>*Cy|uCDiybt>w@tcjlEeI!rli`e+^w zRtOh@2gcFg3-lK&g!ZA`3#|Bs_rRvHtgj{?n{5OeSuQQ6{tGH6S=Z7kDdOQU_b_as zEZ05`L>p$jSt;2nn2zL*!dYeO~rmB~M#Gb~axJokVw)9u~PH9d-f8!9ZkUwFd z-_bgM90@Ck%R~287aC2K`L$p1*9*%$;9LDU15cu3$&Wcy5)6up62)~hg=ajMpyHM_ zQets$M=TOmz2mhLu%Bu2#eA}P@uVVS%&Q_@?i#-Y;W+DYUlZY&`u Ie5W@358_-#4*&oF diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.groupby.groupby.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.groupby.groupby.protobuf index c609d3601d1b0d1d17a02528957f87fd1b0bf4ea..2e932e9bd23f6fcf23843be71ac310cfbccb4b05 100644 GIT binary patch literal 81172 zcmeG_Ym6jEdGyTe>+`L>w|6GcCic1Ub9{^+_>r7Ia1Wn-w(q>$onuF*W!yW{yE|O( z%(}bxZZ{HA0>J?sjEF!G0x@8lnDE9J9Efldz(FMZAb`M5M6d*Mf{0Nt!Z;R5zN)UO zu71pP&D_jBZtK@fcYjq~UG>%X{=R~97VT!;_A9lP=Tzpr*3#n43jdw_vmrR+26AuD z%9Ps*CNJ&)T#*1RivccTtDw=Gt5j+Kq?6sXn&bN|ul(5(j8?0SW+SLpC$CWKxx!mm zqfk23YC03c3za}8O6DDKNheU&>9O6- zm1%PXiugM*WW8LWi5igV@|3?|z{p&<);MV!=L>(wm@+0m_IC!HvB&luHl3ZZQUbKj zlV^Gcd#D_7T&ET^TFrxvt(QIW~t%g4)O6dffc(d|JX2}GT^m}opOAx1}lqXw1@WX_v{4+F*tzV zVtpi^AiKiJ0hbr8CMv)wy+`3Hk!6OWt6{DAe6y#7QH;mAoYWj z8n%edsvmgLtm4(?oz?f1V3;DKKUq=4sgM!));}7sM<8mwQ45Z-6}!>)=j|ES*(rBO zH;m&~=nkX1g;Km}(}J@S?X2Vt^AN=7VVk}p>UnPGH(TSeahHE)2wt%X_tvhhVm21N z)}rGDD^tduM)?^eVoin{%0!Gch;6qt5z`aS=zDC!?*h-Q*{*o}S(*#^yHs;F!2V{RkAA`b?+HHy7c^ z0M=q+#JsxzH}-371>H42Y``@=;fHw)E(sgvBNNIe=fZdhJr_zQR_Dtzq%m<&hSJvg z?O%In-)@5S=1p*pK-V<#njPgeiPey%(k0oVn)7f$H%18mw*+HzPEe)HXEIa%&Jv(S z6KhR`+fBBZ<*iU^qAr1CZ-i;B<%bO@wr1XdxBkk2m&Zso-`89N*-7;DX@p#pwK9dF zV26>RYdjHJAp)mMU86x;SRXFHYmh$@h3f#`v4fU(?C8>>>$H=QlaqrC@t+N-bk}C0 zsKiCrWWI$+&*x*)YFt-6JqD%4#-cMBQ;#@3FOQ6kvDfQCKIsg+1HUB8`Pt>^t zN5lP!)($K8M){kOMeVTyD32bkDYN*>O`up=s@9E5jPh+znq6wvkpA5a=k2v!mnh6c z)Qcoz@|;+qrYAedOzb6a-( z4#WJ{HAkw=r3scliIxVo?jJGWl_7!8S^h|KLQB;&Qu%&jOiX%B+r^N_Gkg*}ew&0= z{AMP0UG>6S&?Z~0qF9D}aRIG%uawO)oYL`Mnc_)}%y(`-^-iq2;Hu1bGsET)G;cco z4WUzmYPm6Myby4#OO<;mf66dFZot0G2F#-(eR51KpCvZh%04@=skL@GX^%}jkK1FD z4^@d$`CVJhd$+<9g-~pZ)XwZ{!9NgbA`G2b2^@cC-41Zg@e|0O_!YSw-62<5 zRbUOTy_($+0C-2dai-OBqboEZL>IG2*aFU)&=N7@R{}r$!B_c#y|Cz4j`F{40qK}R zK>AlUU({L)D9J73Ehgd#bEg1qn`~kbOWraJzhoxC&Gqq!0%)(W+Ob=uaF1xt`;lu-(c5_J@XCa2QIv*bK3sy~vm6S{UkMyWuSH<(4(6 z*6ghB1b&5RueZ|wM6(&RG$KnYWI`lqgVYfu>ms}!e`gt{Mi}ypRJa&?!o3Q44;p}*G z#t^Ur6%P&l7VE{FM&p;!5YI(Qx~=Vr`}FPrl)C+JK7W(UC1PyJ$_J5RXF~Rt&AcL0 ztWbIATT{>&c3sZc`E{Hnj6zH@I;#s5YouDbcEZUt*MzbQFf2k!{iE05nNYiO&gr zw`}1J_1Bp4leY1Ox(+q!wvP`Y)15<*A{z!7m9z^w1?Z)BK^tf-C~TF7^TJ_z~wW^MBuqws~4)nQ`@ z*2I}V3?I)hB*hhrb)*a+iF1VakBZivhMKGGw^#4Xx0c}bk+Kv03u$^E@@}Sa`gIyf zMotnsF3?I7&hu)dkyyfDfhGuIsA(=%+4@$A3ThsNmx(Qqp`qqtSzME}lIgt%ZT~pI zFY{4M(h)D}M%Oi4aG{b`jN3=WXDo*(WIFRC=UxYQ@O!T5gL6;&wrWZ5lvaDS+DmE> zXtkG`&QoShK|^t)tiH!stG!z7jTf=dzOB9oENb5ti=OY@w^i0LOsV_?!8sUfO|ceP zv1cC3^&f4aW0>R^B@)IZ#VC2mF5SpV)LUjBx%yWm7O7(nRGT~c!#li#&W|~uk=HpWAUP?Rq^iTRhk`7y+|aj zvEg`F$u3q$m6zUVVNnE8i^B1;>q;kpy!)_@(Q#*`i?1Wl=6{UBKe14N$lIOcRixff z<~8M!xYIk8%cjugInbh-!$EtIcxRJYj>%#VBxQ?NFuP|29!te$B!(NsNUzV2K~C}h zA^1F7nT<7gMR)TNI9C|nG8aL`X)Pt0lRo-ei|0?V=39J-d05-m_b0#YZ3bM>jCE%G#Ud4+2IFwL#eb_eBW2m`%^fA-4WhE2_xU0Wxy}j4oqUCCQ01-oub_N; zRw@+Sd;t#(2uTv@G0a2ACQ)pZN1VHsoMtVZ8!b_Z4-{a}sdtC_6yrCp>v1%SJ0(ir zZu?ls^qjyUZl+AuRd3V zksHElPm`G(k>dsfQrBP~FR)+~I|xYe$c}}xS?^e+9&2QU4J=+#tNd?<`Gf(l>V&zh zeKIA7m)KmZBL6BgT0S=>=cJ_b^3x?4LRRdqOlH^IVi>@ukbOE16-(5v z3rSE8gNno+5>15UXZ_W#EB|5yN(+wNoa9AZGI3Qn61n0=S41=qpZnE(@Gok^eBb3-Beq+(5P$2`y0Nz`kur;~&;_EQ7K z!x^ixDxrq?T>~yliYU=F`B&eERm+*?LuTlWup=obCBbk(4#M`VZm|70j0yOOE!G8$ z+j04zD#m?iX<^2`nU*t+M1>T*01rPigwL$-{QV*fW9`8PZu?m3?;PVR{5RV61XgeS zb++-*@{&9!=)O@X`b!I)4}jv!ihz1e*V&quUjbtajV2x&veXQaddQV!QuZ)S`!PZn zWh;p&Ci4suL{ZcJH<7B>UaPJq@DWH&BQ`dTXu~Fu%BZmk1k@<7u~9&)2%1fhth)p^ z?4TkLL2|)fR-_R2vZfH4LeN87iK#1e4r(Jpo^@bD8xj5(ZPc?3&kxjW)D%=xiH%Jq zGDJzDPq;Q>fsz54Kx!m7?U3Lncsf>V-mR%20fDp;_XblGO^^8I*X6Gpw)oMzB)9UrZ4??j(KEZTtA zVvk%YG&nE{hdK)91=8V%q-4AZY6(H}Lkr{Q1!5PGeGBbZPmYs=l56f#ow$3xIS$XU zxTQ>gOXP#3Q9qF(< zAoI(6!NfKC?kl?e0P}eRZpm!aTV^lQ(`CNb5PKV5{9 zx8xFw+yh0ZCLMp_wa{URA%fvgEWtlrXiPpEPo)2oRDyRG;QAzc>8XDdYCmPbuHHw8 zgXyU54&cO~m+;9$MVf>)?DxVHv=#N^c+0m!alUmD2fq(qlJW68j=l4z$*Sw^aK>!I zb*l?bFyE^8vE$caB41;nL83v^W5t+Ip+(ALO~s1FY{*lXy^KNenLQHZ?B(kVttR$& z5Y7o_lPwL;SQcHX)JB%4^>G7+Yi`ST>S$NlusI26+W5MG>qxTwHu!gZdpJz&$ItlM zaK>qXNvf3XmPp-2ge7U^r_`ECpP0$bPXj!q&Q5VCxEJm&z^hMb2uPbBGT^FkL#1X6 zH|lgciHFW3zPxA8NLEAAX(DqcMPRHXRo;#D9H{nS{>kQ=h-9KKnTWkDcWI$%ZA)-2 z@(5|evn7C9t9gQW9+8X|%pa9tDO~m*5hxou+TWFOwVy0PW7Xb@D2`dfukQ-Q+kZuR zI}lhRFJ)mhd6vLxycIXrZ=i;jl|U{c$@>9XFZK%5ib(iCZ?DNYike0m5TYG)*hDF*9dwsEJvrvx92 z8+O*)C~;DcinD8S2PX<^3FwN`eOcQ82+|*Oy|3_ z!vC!Pc17&}MF~FJE%x&PuieN8wj(Z5EI2RMeJ0b9tP71tPP4-d1i7_Rcg#l&xH{rX z>O>gVtqGSZ!<#!{dk7q-=2rIIZ5bU~?4WLB4%c3tAMDlHcoI=4X=_D1-3uBR9!BPc zNRe+FMSea@&TT<{{y!tQr54}>)eTfrxW;WNrq zW4(+XG47iscrb@jtdr4prVhzLM%b8#I_icvawvPaizKA7(zi4PkSG9M7%J6E6d)$s zUm@3#LUNE_MPwTcvsxHMal&>+2=a61z=+p!U9`JSUdAX%$C@z=*!qb9dt~^NXn<^; ztgy$G!(pF!e$O>>mBh+0bsYI-@pyayYlwssfi&bDMfgKT@Prcr`Ck?T5zkQzQgniF zFp6e~HO{i*g*7{=dCAGPSEmeAUC<=ilAbmROu+$W zg7rlA>lg<{wK%LOEx@h+GGKp(_9p-;*Ylp&sRkJPUZw%IAN^+00xwUh88SytX<)d` zwL~tR${ zoH)5a1c_FY1X9`V!PW^BRc=Scv2}8tiWS%N^c9;$ytoaDcuF+tEH{CfFg1iRHQXe) z1I`pSNczM|T*q{=-^21TIPZP$_nuK0owwatw=qksnA!y^!XJchZ&e(~+6C(db{Fmr z?Shrn7POPZV?ZOfH`BSBC-tIe@8JKTpCk)&5H!S%i)g;GxgR0!+ zFosc(EzhYo$v5UV(7K=2{jgwr$}FHW2O4Zzy3ZW=Y5|4_b0sd`M+$IfLP{bInJ~Hr z%b$6ky+ZsiJE;#w7Ce2-8+ZK55&9FlXi_mbitg9ng%@YPQ21%YA8R}YiC$k`y`Oq; z(u0ax@`*|VD#sJaNoHDu?nZ+yXbpPZY0$sK;~r;8{;6U$UIMBMu}U=|`+kyF|I>Ce zqVdSG&!{gu1=Y*G;g|h8!%%Dn^J>-k5zzWd5q@80_;aiTDvhZiaUaZMcPN-YLY=TJ zkC&dIESAIbUj~j6gF8EI;sJC@)t?D8Rxmk@YxZWJ9-f%BOAIUXWYi9eQT`HESVs5w zEQ)!0wmG&c&UTV+?%FDBg?PRZhDZi0Q^uV}`R!vcde@RotN(UBww|Luht?!@kRc+c?qI^r^xPwNnD`6b%6^^&q z3geY<3Od>fu}Kd{xF#volu`Z%jIVD}#-VmbX9#P}z{T?V#}QkQJ^ZBU*mtCDGVL|& z&EkAQ`=;$<(zcZElu#j)YW3oNFd0g#) z3j(P{fNdVeVt7i(%RlfOnO-o}zINKVk?xHn;} zMItN}n&9<*7&#A16ky(ErFy8f&zZHCTv9M8!H-gOoTN=&9!VlfouV{RhYM6dv3g2W zjxuY65qqT>qw(QeX6oC-r)5T4Y(2ILt{H+qnFv zycNlsH|L|las-N~7ETP66?5e8AIIdfr3HU!K}~lHVKtZ1T#B2qG?(fF+t*x*5NB%g z)JYT_lPESNm-_Qz%B8SOgff>xSk0vd$)&V`K(=pmHW2h;Xjhfs_};LW)%S+ItoMfA z8|%Y(Hpsp4z$6U$^Nm@>gWoBr-Wh}384nvU5> zIc6Y5E)Yeu9LBFuH= z!KX465y*RqZRxA1Kt_@f74TL(*E^~cv4MFXCJTro13yuK8#A=QUKgYz;XExSZ=29c zC6PgENm@(lit16LN>61vX-kw$`%3yqrwP)R5_`0kwCS{@4ABik)=Tq_T~||E2&5L* z1}Uyx2nH!s)sgRJ2FsF#4D5!hwvYr;FXXyh$Y&?eUV*1Lx{jJJGKAHOImpF481Bln z^$5AD@IG|hvyrTf<_0WCH|yCo+~@r*boUB8tH)V%?HaLw$&gK#jF>Kv&$VFxX*as&SthnQ&u z5)d9M+6HbRAYE1t(~mqtzESpqjlvI7$EckyUx{v&_YK3hl6k=!d+iWGI}?wu7vR=D zqb5!y?*Dz^jz2Xt$Kgk3BvGSZ`>i6*NXmgTPa(%Qbuu|m@HO|t`C$#J4m;Ay2Qd%B z#j$?c?^{b1(A)#(#rjO|aVr-FR2H1dK0C1YlYb(`FY96X zQ_<{WT*_;^o&ChSrloYltk-oM%U~uvImLGv;nu-QT(L}ij${0n;abIZ-Eix4(Liq< z1w0zq*6C)U^wz=3mV|^`<3ivhm(*gBv2}hj1Vdr9gxHCjeADn>zIiC9`8>Kix^1*7 z^%XWW>rrDSpYLVvH`A`bY0SX$C(eSRAJo-Y1Ol4BMrTwv4Xk;H?Vz|ABlaRKpER9c z(CG9Pur9$UoqCJZRqLp6p^*mbt_?fQxki)N4?a|YJxK+OC+&&Z%?>9N4si^I8!^9V zz;#`DmZIi3jJ`UFNY4o;5#DO&9~Z|h^2$l!IUAT0d_A2coUxx8FdoiWl^rc@nBO(v zvgE`?*W_P)U!xYV7+x|%Z-gD;1hoglnK%gBvz}x7aTpWbPHeF*V6p=rc2$h~(9*(; zee+3@^cyKhDR==Mer5=dAKQnrPbo@4<@HZ?yY)8{c`fVx8zVP*|E})-ZNuA7*q$11 zM?lKkyJ?_#yRW9pYucb`13CK(Ws-Hw+q>HOnzyIV57DwY8d*?MmxNY+kOmiW6GE$& z&2ydM*?Rk55Lw(&Jg5)>O+4Pcs|K34_no&7OfkE++qKoiJCk_#wm=z@_q(x5tKawo zM=j)yK$_2yy82x;(U#*nCKXff8#l-EUuKq9vm8H-@rhl|{4)mJl#WkG_y~EHI2~ad zvnNJ}&`i`**pTLGRNCHX-qTE`Ic0cvz^Lt4X)$`WGT0nC&++d~AriH`Kyk+-WNwc* z*47N-%?YQjHdYRu*K_&32Aox`+RbJQ1GF$y%&%4_JC?Cc0GqeNc|xJ9qmeY0xK2-X riy5)g##@wLXdy$%8%O#nPe7p_Opfy7T2VY4heC64a)<_?>@fZx-H8n$ literal 26562 zcmeHQU5F%C6{e=Ur)SP&-A->pHWk@jE2x{wZ0%-42m}L8b}%tN%bMA!IJTAQ?mIn| zsjlj+s$QpkRPg7)7atS@KKS4d2)-l;21Eja;Dac65H%}M zT8jEIkh?=A)bE34G6vW{6KZSjq}9MSvF|<0aSqn^xP*>&?teED2g;p5)*uvxV(MbzwXK9p2odrycc8K>{ptcdcdK}tzK{BS1)ew*KGaP(9~ayoOsF=UffF(HAXb>P z>dTc}p9En!A)MORA>*qz3ho zJ!0+E{CucVtT}aNXB@BPLw^P8TVuC}^5z9Ndj(BFu1s+;v6%vsKj(H!r?sSh1Tx)N z+}EaW>GukYFrCl(smwIYZoXTGWiz3b{*Lw;@ou6$jrMA-cTa* z6>t4WfrkqVsgSzDG+pH$jt)}Z5xY-KT`cF6Yl{B`XgKU9bJ`cESc}LDz-NwQj{-Z$ z0bktm`>hTKvYn!$}RV_#x)6*wtCZUg!4bpz(#WPLinMG0~%_$I?K`q8ivvbB^HAh&^- zvUcqQV2V?dYsWW;ILLhZ8zcqDZ6LDPZqFG9xL5^kGP1HVtL^40Na81)C`Cn?#=y_u|Y(G*p@sh^Td5)yq`Lb4!@R7Z@#r=-P zx)oZH2eL2}I3a8_1vjFf$PDE2zvQ4SRZv{WN)Od_DA+gC4Wv4S_F(?a3WVrrOFfx? zP~c;E!aason7HLd?M`_yDR9u=Lmha?EVq50@P-Dblsv|*qPgPnOm+G{HCP<7zKyKc zX{_h8lKFQ9^M6r?S`hZD_o#$qM?%T=d1L!|sQ3FG-y^QvPdcaQm*F1tMe+SV({r5( zmOwXGYSDK+&&hd@_$8L%__=BMH2ff;#E-;J6bg~UPr!yW{2-ykkHk+NKkqC+-P?A0 zG_93WYDcgrj*BhuzZxv{S5D(DXg@in@d9cqRd{gt*wkj1aQV!7|(Bh77N{(qk)XPRaMJ`)74%Y;D<& zLvw{hq;g8k+m!ee`upvn9ij%j4yR);R;mZ%4r{tOQK?bqHxYCWoGu+W5vc@@1djg4 z2Grbeo2DQmp#;smf#wGaC@zYc?`|f0xaDaTW)Am6%9e11z#K!|9lIS8#waKBn}^aFOR_qT#T4M@*IoD zT9nW*HS$>GTj=YJBO+wtC}Xyv0`7 z5*rkcpopzILr_b`#3vbU6Jy@2L*2LB9h!52Q%dK;p690ocy*m`H-+0?pCGReJeMxO zvTK>%h$s&qf!e6Y_5A&3Df-cQ@ItB6Q}LE4WPghXns9~=tzDXsjcKLgHgAgC?-x@@ z{Av-tsbqoDu^Lyte$mFo+H$fWNnD{jt5bIoQaoJ!NToX+46%N_0bfqS)sIx!5xasj z27|qyK2jI(ZGNo4<#=4DMyz5SvGFJ2{+T6O%LV0mN?n>+kTa)La7qMdr;}}T5gV|E zaw9t2pnmOm4TOlQ$q&R8&lwM0?bM7hLfJXf8z}^;O^i_B0@aog3j8Fq7#+B$<0@mLkQI00W?ua;z8v;ZSN%^mO82wsnPDc)KT+#d^{Rb zM>XbgAa1RW8jOczqaSIdK$QYj3e+j{d>-Y9H2N{Y6*4Y8N+V3qL+YsSEJGvMwzr6< zjv~@yw<-82G%?kX?e!^s=~H-Y+h?UsL}_zNn>(4fSr#)sjio$0v^;wdfQNdSH!WwJ zKLC&Z&EKp5;Et2o+qT>Rt4?Vp!V@!ksV>f&x_BS~eGyh7+>p0N@5=%eb8#V3&c~^v z4!&C?eX9dQZdQd<-zw%NtZy@`Pm2%Xlv04tn*jfC9GqDhW{K-MheBxC4h;&NQbOS_ zg~GovUB;H}2Smd)B9&m6H!#c$RNy%@91A&5%Avt2CFAc3#{UZwbMtt=%6!qno+NlYl`}hMOaC*d3Gn&(=SJ;eHJJji*k>p2W@C)3$BRFmZj_h zNq%6`2Nm=kSm^S!D;B8b2;wL!w#bS3Bzz!?rsYpC^g#H3G_@31`2uEfT=NIKK;h^W zJ)WI=nRxn3?3ri;CGy!E zC=nIj4IQvqg1%z6Ps1{PfF%B?M)8S}W#PmJ`yU97%Q6xKS9oxJ|Ub)molZMvi|Q@36#H-i6!=5HQ=?2GIj{@%3=p&k-xBjvhf`Pqo-nVN!hwq?RN@v`;y-(Qni&XI`JP z9Me9o?7#RhWDUb1XK~$+$*r3ct2gdj-9YV%0()d8nkM#KF1?oGYce|8qZEEuV4z}q zIYs?N0ez-XBeSv#F6C0{x))GOqY;pT4Fe0Lfl`{FzUo-6Gs{FBvn|t`9djC`;*{%< z5`I4jo8w<{Sv3m-NRu1X)KE1B@??hfGHG~Ybe;`Rhak;(R%(6|2(b2FRzf>wV*AXLsrS3E8X>z(woJzD^VoieEOsVM97i$e2 zT>+(LgNa$>qDIsB^_soh_=u32&OE^t2_=0Qno6L**y_ae31Lu+7VMIsM2%@MlF*En ze4(~F64X|UBVkYXB=%{N?S=Z|AY4+`ol;RVAEe=YXd7snPr&^N zoeM*lLBA%kqitKPZR@-U^;y`~*|4K?8vW2V#VFN_=#C?!?qU76L!`~|$<*RapHS1Djn;;Nxm0X>%Y9P2 zQ);7IZgkA4iIGA=+bVlH{?Uyocbv?bbsL=^bII2-aIx*&-c>2^%ziisZ*@_y5bRDU z6xDM+1<&1*Hc*}b>x+)IwZkX%YXzQY+KJdTLD}*2p=DHIw+tz6+aVCR!|1?F zTlQm=SVbcvAAspp0n(mJeKfc2uqirKW!JT}_#@I5AycJp%`s)D5hIAq!aYN%?V8os zF=I=wGTR@A(NLWnc~Rn-iK6(eT0IBc>(+#@-P;_8M`DKFbupSOUD6F5L7lLCyiwQ+nT4}lZ3B_oIvN_iggcF> zB>!lu)g9MkN52Qzr2Y5;D;4x&?3s=z@fvWNanXE8CU_H6okSSY^gN-OD zt^uw3^l}yYBq*M6DlWrdKFNQ(6NWenLlx$C_Y?!E+FM`0@zxhBm|+X)aTy-i`wGal zlQ8NBZG#C`aPwU{8$OF-UTH;zQo*G#rA~sJJW^DJpA|?u<|2_m0L&U0sU}h3Exd+i z$@*N%+O8L|RUEX{5dRbETLe3xX5|#YR;5{W9lP;{!eq-j9AbGAtxGOmKpkscwpFFp zg={wlA!|8Rt3qUD3#qlw(?Fw~9U1sZ%WUaI#VYE&sT91aqA`=%;I~K%4BmM{{J%hS zW4dD6CS^&OQE{=dD`oBK+XFDo#ssaVHJcm}2}aYSYsD`D`sybN99We?)LGagt352p zU?nV|o+s!)t%_)Mba~v+vL-BwbAtG^4e4nz7g3jHc2x({+eJ!n7t9W{@VzS$1|mjGDJ!Za_~N430v z=Y6K=#u>ekf&sjoDFOJIWg?~elLANDL(UvUET@l~zIlZG5)C{aB0S78(X~zUfAKqW z&CV~UOmK-hznwm+;}G+S?XxtUr@;2@%W0`Po@5xvVAVuPd>2ypELNNga|qO+aR#r! zx^yKuM03lcOh6&NuL({Wti^f9gQdfj485UVF)N8A%dPpnzXt_Jq#qGrWC$Y$4_ R!+}kZa%%ZO?#M=!e*kUb?>hhh literal 5446 zcmdT|PjlNu6i1H#WL}zyD?05Un9vbSDZaFPHZB8_?R-ZTS4g5}==f+^ya?jFM0&Kkhx@{lt3!tsoHmSrFLo5D5GX z?6qL6AE~zGtwWv3p=#GXfacR@=6TKgsRrvo5Q;EC;tq{CMY~A27Yp8QdizjUJUVP! z&PPCsjso&*SbNGRNQxoc6_a-3s^wjRM#PVKRBnA4>W7klU2eRN@t%Yjx$_!a$Y(PY ziCcO@QV)k8%LI|zu$d!!aU8kjSHyk-HFjcOqf8V#(Q}?o%uVag#hiI0W6XnO@}-5V z+BB)6Y>z^jVk>FoLo;>uTNF;5W9J&oM#rNl9H~&bi%s&gZ2IlDDa>Z2$lRZ%i)de` zQ0wJhg;{3;jaegCVb+;LW7bGA^B2%Ei;a3g+U^;c%#Rs@!a~as1d@4i+@Too6Y97# zFq!{zX!b%Oke;+*QY@9-{`Ly2?`oM2#n67UG7%BADAYeT3W|Dz!hu@7AgK?h%Hezr zw1JRN-eYK(DMzu}D{FPS63Xu}#r+TU8XlnPc60T0w~MhXqP@#`%9e%r56k2lHvVS8 zy$2$U#X*tkP_iTL@34g3(@&)$q__;Z^6#4;GoFsFIb9^X1Eq>P$Ko#g)7gPiFpIs+ zqJE_~)DqCi3n117EI|SXUyl6rYPCwa@nJpgVXw!0fYjCH>4x5ZL00#w;qRGLO}ND3 zPfk?>_g?aTwV)-^ibQY@xL5oP?Jh0I-Z`cIStaptIauOiTAe!8z!PG)SIMG3tzk_k)E|5ey-)7wAy*-Wlkl){lS9U zxy8jDk{l!xT}S;7nEHzKBHk(GaGvd5$Azsqs5{@_{QJ#P@bG$6=e2j_^3SH%(qv^W8ySwu$;@)|*T6=!dYuqA18dvuPWu@CCUeoTgNsXwzh{WO7_y zWA&>~K6-gq^7@ZbFJ67{(afuuaW-=g#PU8h8{}!h?8yuVF?%vJwFBpuCh9Ry^7L7H zrY!*7ziPnt$D@ds%%;ggELQPI`R}9C-AylLI=OO1p;}O`?$nb8nNIEP7^}M9ZLghm z0q1$u4FZAe)#SByo(-kJX(c)KMSzzqF4FT`(|qT zpHKIvT^`YIgr19WKN=@2A^Lng7aX%F9N-6}bHR5OYy|-mBE~-O0H&(05$C|pBX~W} nOjF$RHpandas.core.groupby.indexing.GroupByNthSelector.groupby_object +&pandas.core.groupby.indexing._GroupByTX +(pandas.core.groupby.groupby.GroupBy[Any] +Any"#pandas.core.groupby.groupby.GroupBy"#pandas.core.groupby.groupby.GroupBy* +__annotations__,pandas.core.groupby.indexing.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.groupby.ops.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.groupby.ops.protobuf index 49e95eda60987c2ac1de0babb5a2ab6f7b86913c..3b72bd8ef131b9095b8667634ecdda1d257e3869 100644 GIT binary patch literal 12626 zcmeHN%ZnUE7`Nw#6gG5llgMtUm&65y3h=@lIf;Ydae$Q(wab|WBW-qf{{Z)0< z_p0CbfCn0eT{k?f=D1W_ahSAL`mp_U>d)73T8@=e>* zoa$?|=BwZ2U<+T>v{yX&34t|&O)zqDRf2=@f|lv|J%MsZ$6IR%f35E3z} zZJ8~oOHlBrwOo>v7eR<8B1HS8BlpIiX}AtD+;6@rsbA!v=$$tjRDP_}iBL{y_G_G! zd?3NTrDlU3wM@e+$IJR_4T~m^rtMcMr3qx#&R!(SPMD0};~bKGnu_1?<;nJNo4Vg@ zpe(dSw)x@m>?;X2>$>SvSJ&lP5w=CtWIt>V_dSo(4c~FgN9|@snSeb0mWpJ$<+XaM zpIV@PD?!n|K%1VJxH&25DWKu9{`Ue*u27#dpK(v#FT(!x400_8&$ckRyu>v(96e#6 zmRBtrNjB27({nGl#wuN^RFt12&~9x`DX$QSgd2S!mUc9t_z=0v)~}Wd$`RO+IW4uR zYu2=IU*z^*M*E6%axgMg--bfn@C|fq8*)r_1`5U{)5Gug)aX5u`o08H-0SPiR&VIA2UuBKaN)zdjoNvtyVR&Vw$)sa z&_(}QgbCBGn>FgmkBjUgBqpB~z>U2p&iBi$8om@eaeHmG(bVvwc3q>%e9~+%QpYK@ z9Q+@tq|S+O>ldh|FV+mpaM?n7&8gs@ke*-8!{Puwj!cNe@RcJA_*NCcmD8O%}aKEl*ZOF7kkud?>+ztiGlv<84nbA#$i< zD6P%22Od&Xl+)Shu?t;%$B|vVR~;57JBF!0v$zGpx1gPKQZfs2mTlQkE4lp!su>;6 zb5lZSXue71nKaWmd^r9KU;pjg)=9{SM{5XQD z9?+7H5NE|Q>j+r`RFej(OsZn2^Dx}sd3tOF@jtC-Dp8gZfl7Z%Fll=Fs$)C8W1BTG zsFa>T5NyW0t~!pDvT*h|99MJT`$6YF0DDX=euh)AH7`==sYcA`yD2Z!=7}WD!%CN`qa+w!R^&tlEq>1 zh!`}9vN&u8>2vHd0@vSP1t_sPL~tvIQQ#pFTW+02uIJ&E7`QRX~i@|q~A!rl25AE-S-+X~ zsj0eO=Alr-jn` zW~?*0J)BR*m>KO@lSV<4 zrjDx7y?r8mN{x|jjC5RdL7PHf*tH2Rv)9lSj=L~MpbNu2mn7}G-eei+g<1RF$jdzw zg7U7-KbbW-D(~6)sbZ_ew5}UA7F7)v@p{r5GpUH!bFZ-V@Qc9{8^q%NPis% aQ@!r^lpxh41mqBM8|3VUT;#RuJ<@;3S*QH~ literal 9763 zcmeHN&2QXP5XbwGq(joAt_Wg5r82anrZrLd5Fd=Z7|u`uI+_x z{{?PELP$u61L6P@M-X3UE^y()lz1ld9#E*gJ3hJa6VVznL-I z?b~j{4z0QuFl#ID+J3ELd48z>u>^OXu|syA-(!LPK!%{D2pRLWw$q9nH?+LkJFFg= zpOs;zT6J6}s#f)r1Qk|K+L(dTMbBjmQ|2Wog{;+F&?+whX&V$F^K~fM*PIZwUQBCs z+y=YGLaT;vZ(ZOQ8>?<-voZ}u{JT&#j;QZ3C~bbO!2w}P$KB%kKh)sysN>_6wa%`# znOkQYs*0Z3#a|X!!sIBuS$P>AqzD=`srkN5m?j$53nJX&5tx%lSM$7=SR5`PPfPw|%%vnN(!cQKekdp>rk@&SbBqbq)#F&<2W;HX;8AJ3mJ>$%a=6KX z@h#*NGt1h_A^E0$;2|zVowqb|9m?U`w$Jnv6w3)w6U`q7b(Ycr$I4kqf%4!3 z5*WBgeMm~sT#_kaq%R;~d|HIE?fb0`&B26d-bZo}G@c{n!QbXb^t{L?PMwAN!|IXu zvTZ-0WAfp`2{4&A3Q(?l4OBqFH6dzTg<}#$L^4Qa9ht#4|3m6hlJnkU{Wk@eYO!}& zE7VPjSz}q_0}W26?V>IoBvCOc>^3#qSIc3RbP)-O-Xug5XUxiyKO+u@&UL0QsrJnB zaV}}>4p!zv%AbWPv3H_##j=T&%&#?=b;9b7=X#OnI(1s&R96^dh;2^!^jwc#J8sj{ zEy`hvm&e+w=_v;IMFS8(Bz~YNO5}}y&!=;;%NH65=BKClgkM2&oIRvF<+pR17Ht05RXqk_j6rJoeP2+zk=fZqY8}>$T zML2-BT6PVIwtD|G%r>#bid_-5<3}C*X$)V%Vs*ks+@jiu>s6De<{8P&vdf{wbaBpB z;OaZslgXy4$#P0dCWoWQqS+t!H)I|e?~~T>eoPL#zTLYq&n2aPc1@c27Q#_qrT;Xew2_>sh@%^mt;?Z0!=ahN|tAB zaIIIclK_jC_TzPao0>GFx}w6R;^~`}WWSqz(6EON^JkjyQo?i?-_2piX8vsVa?BC* zhX`20$pn>b1-8O8MvQ0^=##vJ{D{qjk5ce?QaXz2dvuhdeo{92(G1M;ImWu*aw242 z`p{`BZzro#gR}78iVFM8bY4}*F#h?P*l;`xp3`!}zu4#xUHwg%6Vp?v{#cg! zlo(BW2{a!7 diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.groupby.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.groupby.protobuf index 850d3a661627855f3f87e048368f0956303a1fb6..f3c94646569669b5613f0edc7999fd6b085de5a9 100644 GIT binary patch literal 407036 zcmeIbeUv0ubtmY^%KEz9EtRSzS%ietgk-6e6scCzv`o)3p6)I+Y9zH9xG>_<#S|n zhGFbw%vuK4hrRDbych4ih|Gx0%Brr9t3T8gkuM@%ym;@v`|-QK3kO%-pzgM-i_Ml- zU2Ziys|)MXzw+Y=n3{D%_e{%O@m|Z$o?4%t$!J<#_5!cfSge|@ojWsIM-QmRx2(M9 zPM8c^ZqQz8wpON(XI|3f0abaOa{_KvuUulCPCDfD`myqX+o0U`{G}<&e)2Z>d+L4S z(dhb$7vsjYaDBBAELTsh&&}JvdMiw)&rg-@AKCDU(KiN-W^i$#)9}Ma(5|+_){Hz@ zSP#ASOx+E=uz~$&f9OZ-baI9r)jdCSXM)bk>N;=F&K*A%pO6jkO!AOs(@%~XL6{sY z`At_jTx_na`rg{i-1@3_(r>u!i&5vzV|nXs_%h-{_>F~jHEc)!;25<-cV)F*ofChG znO!p*@&S$-@;~S2lktiN2v21_W))XOvtB*V|Iu6EsC%s|u3tSH{}GR@9LbE&lJyAo zfrs)YVF$nT#goDM{5&p$+hD)!34T*YJF*YKb@Ep}V;$qzz8wx|li1M@?YrRy?RWMX zPWqI67^Y=AIhUP`bM{>@Wv&4yb%s4RY9()W{FswI#rmJTAubn3Kh(wtzmzgQc%+RF zUs1~V@MG3ndH;A0IjJ-Drw_n0C3CHr$MQaVcI{1#+usNHP>E!dnf_s0I4E_WM0>TzVFb0;lxqm>T^s+>vw1)CAK><$H)* zIq6fH&Y9B5D>p#dZ7sLa$P@!m`BVwUykNNzcvB_&<0Uv{Y5M>ZCHw0ZyxbhPG}NsEAu~!;l+h5Os*$Fhg{Kk{f0Yy_j8H#JJ^? z8-{C;0^Ca&+%1cK9l)O=5qvS=wmBL z@ED07m{1JI@+6z)aUDe2BJ-KdXM~Fh|FjzJWB3{~PSmxb8K5K-1B0pwXMzSjBNT&- zm8D`}WIk_LqLcYdD25o996^DHFWb@LQqiS@=p8$9mR=JSLw|Pezr6>>8uhgmcdgIh zZ*&n^uVlTF^-9*OnukIde3`$%{zy`H#OdUWRQQLR%rpEQJPUY1!Cwmgn)ZL%tS9T0 ztk>AQSlEQDsvT(;Q1Dl{3j6R6Qt)>#1b<(cL{R%$qm3?uZ%)D=$EjNk8{I1zITK%= zMzy2kVICdL=H2?b8n0)lZ{;T9a!u>Pjj>ug*PQj1+>XzliZAs17(A6q$=gt8lwS0O z&yNOzBeOm{3h(SP%HqY;4J;#9U?`)C!}DYbUbCUmKvm;e3y$_b68P|;CMmEHF|r%* zlmh%>N4JRi5=I#RlQ`=+9LRq6-WrIPWDLaVrr%i!9Kli{s2125C20@#XDqlcnK5Fz ziraDB)Le%+N9u4_k*4?o6M~5doTT4O5=>3lSd6TNT|!Ph za_W&&kDPks)FY>!9#B_9yh&>19&&o3f<#m;91uWMEkxDAiWCr9FRG9sum?odLR2lO z{O0cNH!~A@S5me7{y2;yqiSQ(V}QM9$Kju+@NF@=>4Jw0DZ!#bq01ayGv=>Rr3U7k zT=rT~X$l477X6BKYg#RLo&74(Ch#`i#pqYDTx+}$`cE%=)mr3AXHcQqViVnKe53mh zqwsW$d^5Wt)uC(JNgUF1@Y0@r)51{LSp#Esy>T&OpYAkH#lxlzxjh5Z=`SG}W1R!q zk51|-?;3#%a}u&Sw6BIvO~eR3G_3o{_pv`=!KJ=KkbmF8BtqN z>$rN77|1S%`;F+>!)o+Glmrh11FT5_fo2bsZsm7SGuRd5l67UHX_@Z(!gQzsbP)-cx#84h9b+~{M ziMmKkSXrM-A0K}e&|vn6zo^A zpbD&$Z;qvy$X}K^!D85G2Ds(q!Ci(~4jaiw?t^_Rji83+bfZ~k`CBU3 zCKY)Zkgep;Z-KHJh^XxM}Xr!YziC&d^eD$H!yc zS!-DNKmrk`d}PW;rhH`0p++j&@Kv-zkq7(J2jH0!bGr7bAgQX-31W5+5nwV9@Am;d zREqXQbG-Ka_~7OK#X`JFv)MKPAooq z60z&UT}9eYjT9iE>2JFH212cTcfHwRGx2E)W-@!PCBEW8((|{#A*1K1w%BWRS)|>+ zy?<3F_itNJUO;>`_Vtq%+;1!!_GEKQkn5H8I^PpLWQJ&5=NDjn!Ck!U1x!GtUD~R6 zQOBXT@W3hRBd0gNXa0oFem%S!**GkE!v=C5*I}w_sw-R-HvNbgFaucBm5thtr;!rQBtQZ|k+LxPJ9){D)nIgL0N8ftDl# zCjoTuU;AUztbEOa(PntbYvK0!zguuJ3P`KA=@O&rOe|6n6H6!jMCF+Q) z%~@~B?fAU9sAWGt22Z65YA5#@pdU&v2DqAQ8y_BpcXkW?bf?*2-)pRwS+WS)rW*mL#a%&5a%MVd}cD)KLKY3fT^%D>DX zWsz>a8?Y;-3_vIj0tM?xc#LyBA2aj*vO+=ijxw~9SMF=6XRld)HjlxIn|K8eV21cOy6*QwGk{=PotmN^IgUy_9*8e!`U-P8u7bc z4f|@fWiNEYuvM!~|E#*R=en(xE1joqgOj~3j?#-`PH?762u(wvm`|OE?0TMUUl$Lbz)I{mwWZ7IB_QYKS2Fl7T98Ld*GH@B)Zmmg&V z8)LUavVrd{Y~fXY`8Jzqq122zG6XUEC@l&S!(Av_WC)TW7{Pxqa!??jloDnrVTKZB zC}D;YX87*vOxNR7->OXUwNXY!S-;}9QwWVxC*xvg><_n5ir1|NCZ5p{PC+{qE>5Qr!WNB zU*?Rs%=yl3a3&6pvSMX!*lb;lh(E+2#lK=0QFtmi$jJae&ClEKy$xP9(4|NuLUBu8 zyJ8Ok)5%;VbCt~1Eyz??7)hk7h~k!W!mCDc%Y}Ag@lf0{j%Fiht~WA{_#M>oA#*jI zB9lHtNi&o*!vRP;BW|fcwzEt=3E9s4Q4swKtCAv{)rgBoVnHafDReMR>!8SHlDkI4 zQG+NJ6xpQ6CPg+WvPqFmifs0P{%^JtF2X87-CJW?a2%X0v^zOuDw3(VgG|N#_!W=} zaDTiymKuTUpSO7%{Cva@ce)vK-YYwUk<`v$Hi%6p=`M^2!`?nIj- zIoK=$;jFNX2(W7qhE*&u+^kp6^MCXfDL}$SBg1#A-y~sTF-vl!&34-ZDEoRrEb-S?ErNvWJhI-;(fDXs?-f{JKKWB>}Ug|=n@8wSxkb|lXH znjm=J2<4?tu!v(mOj@JL4anoyT5cn)k0^^+$*Kj1X10jJHm`UstW;Qkvt@s5L$>k; zSPUy4xDCo}&tJmfpd44qacwZ*Sv%6XC=y&H3wijw%!PdI_NNcPGo`s48dRzG;de?b z)V&1QCkvS@WU`QZ?O29xO%i?h5`9P79ux^i{f>2)k#ank_dQuRs<(e2$wDRzc@ruZk%dfHX~IeqR+_NVgq2oY8(VFAkcCVZGLHv|VTe)!`7|U8 zdAr4skN)YyFzGHYx4dQK%$q*mA7WcvXaB!19l~7*y-nzCLT{VwM*76S-WKIlC|q*)Mig*NgMeTl&gGD>ZnPqM&MqZ z>eVng?~lgeUw8RxJLy&M^L(KMuQR{S;IDu~^HmFeF8as=-v+xi%pCrl>Jm2WQx=P( z9o%j#gpkFdm4rPVNc&P4F{?L`KgSt-#zfcZRQo=9(7>_rCdh;sI^9T7L;UIq3f&lVD+9Ju6|{Z(h5EZ$Mr2)!K+MFZ5m8IHuGaAVf*c>MvGl((JQ@7!ffgPQF3 zxz5Uh`!MflG8a@dkNVs7c!+EJO zQQ5(WbZ>hkdx;ru=9mu!+ayb$$qAu8MhiRYEzs!Di+*04h-0GGCYnESY!XUqNCB{| zS$nw6eIMXMC3B;Uj-_hKOhtLHhh!7#2hUBwPf~`d9E-g%FgQz|7=s_grtIE&d7J`j zSv~yVdd+8IP1eR|&v*o5?e#3xlF+p?C6tiz9uvo=sX6Zul-9k4Ej%hJNJRyU1d^0E z1Q~){qgH}N{FtS?2wQ@q>Ky&hz8h}PerKsNPWqI67^Y=AnNH(moU;)U6#2MC`{T!) z)EV~NsFl1KHcOwPbREpZWJ7fP*oKghWC->~if+mHkRj-YE)`p#Vhhsvr(z3KY{5u5 zAw$qK@Af!R#s_Y&-**FitBZFz3A>WFdDZvU5DgVOl>|~E@wrDKCgW$^k1e7~_tI{r zWZa}}Nr8?zG)4GOsX#w5KBV80eoKK4^th0I8wrUNN^7Wrjsl=S`;Bmi{21BWUmKIA%;Y)NXqjX`>_1%_z240pW_BBAbli!4>s#1P21IoB(pnBOnWp))dGkN!yZ=;gB zO|k{a79?A6lf8;WorLO?(C^JfbyDP(taY>+7Z6Azat)%Q z!I59?a5sJ2bWS9*^qN@fuY-wpXMq{FZQMXlz|AQpPKH~XpPJ0ea7S{-_l&^UV$<)e z1bC|-Bll`H(U#!@5P3isytj6|U@`3@P>7SC&L9-+|8@v&`kW*b?fY_kw<3t{#EsGQ z#fscV^2dt1I4==1OL$2bDbFMBg6AiEocJ-2K67HJ8HDY|+dS-Y2ktQv&!Xk4!ki>O z^&!RZ;ms6J2|vyWb4vPC?8nPtq}2?u2e~)J#uX?pw;FY9owJW&+apkN*RbW?aDDV< zjBZmfY>&eT9!`yFL-Gd}j4w5o;}Lnzf+O(+?O;Y)LP%>23_nb`yM4H8u0Z>#k^C1f z&_W%_->_iJch{R8Hkwac5EG9Zy+JcAajM}#((|{#p}e-(YnA^iZSwX0RqgEzj3GgK z%VVD?|6_{Q>xEihK!2LMc-afsOqqpSjG4`N>cm7)JDf)HsU0p%O>4hz!~Q%mJu4r$ z4a#lLU&8mGWC{Y%5P(LLKj{UlZX)E8OUq|zA; zcEnqpa%<+BPpZd=9CB3_96(>}HFn5-XTuJ;{}Jv@oXD|u!9jj)UeT!<6?S43oj4Df z@ZX{HQIx~$(pnaKl79PiL-GR3D1_mAj~Tm^qMWhE9xI@o^c!y5tcJu~zw&0>K{O-i zojI+ve#9bo$r%~Piy4f?g*$@MI1>!5r4j2b&~-$0r8r|XpBL=g6P(iu$Ez(iI|y!_ezoeX%dHBp zUTXi*p`qQ&S%7=gj_6)PsrR8?H{V;)BQK#GtX#fS*^<1385sy!miT<89Zz0D96l;K z=!U6qSRph9c?ro&NM1sXPuT=hWr|%HZc@_5$V*6GLaEj;1&F+aSYMg2f~cTynbLff*>bb9W3P!X;U8{0Uqa>V z&^!r@T53D{5srTN4cNiU-qq>*RTn@mqJdpvfAQXduXRqqt?C1pS}q1dXWh^}!~Sx5 z{YZIBQoo?QrD`tpGD}k@F9LZH{E)%)Fiw!~(zFSYKn*t*pFI^{==m{tDiu`NP-m20L<1%IA}z~a1Hs{fA0CBw zb{XZqZnnX$;P5mqZ#3P(x@0Vqat7)eN-u>Q#aP9UdW7}6 zQk+r!BZmifU=jsWlz%W>)*`w8P;!+(8fZBEWVyuygldIY1YB;#)(It7;qVb4iU3jS zq8L6H5x2YV1AM5IZEZ+lhT31UaQ6^B9B%Rih@#{wO0JTUfRd}?8u78l&J9;0V&@n! zbE`^|+);8>=xTw;T?vRHS7rlAVqHHejn~T=xk3NoJgRWy%H(e5ERQ4`dBY<~uFN$Zw~W85@EK~2^PafGnk*6z#^hI$oCfKokFLkzgUHda|o5JpTzFn)vJ4=mBO;hf>%ZceqY@~<5%@wr#tuXFlWfm^!j`_ zMIx5c%KtV3qqVs5Cw;=aufHunVMSKEF7=*ZC^bJ?f^if^OtfG)hgJg%g;nKhzybO_ zfbm)_@UGTs)54LSBhRANBmi^e^R`?)KN^8@ZP8~qk-r>?qMH|ciB5GNo5wXoLUShy zO{a|hCa-c>iq4$9x$?9kI4u&Kfi5^JUn`^7bldgDVpvpcMy;L4;SQ-qvC9*^n5lfM z&{6MAEh%i2SPbkwq}j+}EuuSbOWFL52~jkwwJs-{t{Zro&m zVy4r!FhJvt`0v65_wk~01SQcCxKV_InBx~u@``tfsK4I$xiSqSsI#LwCMx2gDv#%U zFVM~*b=FU{cq1IOt4WZx`7#m`wO&Hn)eIMca<8JtE=QL{l z6AQJyrH1F%+Xbh3+}eH%9Ln(eshUc@53lEVv_5RX{^)6puhVPy&SOtD1^znGC0L?& zb9BEE0mYccz3dJYA7B4Kgpnd`o%Ac_oA`wZNy zUn_(*USEg=B)-pU;GljVF6HqiIc(DL<)`5${qlH2z#9~y$u5WZ{?5%pM&l7n6g;=e zMYm&SP4Tk~iXitD@yEtWQ=fsCi5{rCgtjd?`AzI|Ae5~rVGf0~QA3=&jfE?~xm|l| zsfi9?7Rq^Z4LGSYOkPH< z(mW!3?D)OMGjkaZiL^6XmTvRG28AD>5n3@|06RDnXRb6}ptqMfqHEWl%mB<#QQ1Nqy`;DN|~?fY_cCJi-LiH~v~Uz5xr zN&E}3LH>9ns5h^ohvh*&NC-vvt_2685vyIk%7?RLf8BzYn*)~|v%l)Ih+|Vm=N|1D5y(MCq7B8ohR=sh zF)!WUqVA7d9t&cjSc-XVW$>P2UJThlF|UPoRoj**=GDL%Oyb@@x%zR6B5gv`%(wNr_jMZDsqD2)l zB4n8%kgptp@t_kl-rDhcC#C5zkoXd30q%({7VesEBLf4XRHL@Z_@S)T2@_Jn*Ad)u z>DyE&EvOlY6el$RKxsiS#F|1RqDZI`CdVbF;Z`Xvh$pI{g+OUR>3l*;3+j>Im}^;4 zT2Pfk40%S6O=&@mX1#hIRiS2`(t>p4C8Y)Naz6=BWS6BTWSZC%BEb|8D)U5To+vE{ z8NSdkN!%z~5cCuwB-G-l%oC*rQCd(E1VWp~NeD`r3a{brQ(n3P4h0I4L>%_W(U4CX zPy}Q3(K39{(oiAzSqx@@YXU2w5Xr6&k@OdGc;XS5sC(_jR%5}NKB|TVdXkh?#WhY+ zkea)>ms(gjq&n+{?iu!%EJ&U8BLxYN8H|DiNrk$!kR_ddlq8Ee>-)ke2 z!uyd#D$>wJ?vW^%CHufXd(0w*pK1>7$Z47{RUEVaR>Bg6{7>IL0OO5d(eKn5KiF3f zz>9H`U^cIp?5N*phZpAzN?J9x5fgLo05En2g%MSeF7rZ=CM6gsCWGn?=S% zephDtkNP`{s8LbKO)gVPx(Mkaq>HSuAxKjZ60nPaU2eOoQJbZSZ;KX%?7`@h_$~;x zPq2NV&1Xlhh}(y_ePqBX$KD|AjwL2<*K;;j( z!baRa#O;#}^27q=QgNg52mO#wCjf8Zcc=0P)j8pup_1RME|C}wtyVl5Kve!9+L+TJ zV=8}eo5FpxX8_RxR~*#6wX=vrj*<6;b|>d1;hYko=0(?cTSGG-h}*~WLv%SOvfTiF z?3r1b?fl$K*#3XK2}ZBDe#gTh|G#d6KOKos7beu*JeDdQ3fM$X*{wBo=95>Hs#pqN zrvg>nR?A&Cy>KVl$rxLViSF!(xwU5)BMoXZ>h(I%B}G|dP$JF5V(C$LbrmanUyKhQ za@&{O1>c)_V{kcWUJVj>3>6zomwL(g#HdG6u`wz(M#aW>3Dhi8!`P=u+a@MWmBD4G z#m2r=g2zlXMBOt7*mF_9f5U>=G|;sFd*Mnj3YK@jhxD#!Hmx@TQIibg_oLj{6wF%;DP9CXXkrnpFP(MJXR@p;C#t}FPwlf zd-&8CzQ_xcP~lsbzR7SlmDbTwYjI;-47JVwk#Zr`=Ob z!}DYbUbCUmz_)qUf}?#+ect(D&w6&#smb2-(rMX+vz~7y_Ph7iKnVFOG8InZK%8#+ zot3~jDArUM)%9dQC34UHj0N{4Ge%5IaZTnr#5q!jyNWc$515Gm2q&m7YRS=?`J<=3c=P^jCd%k$EH#8825mL;WcEChQQKzaB>Y#!4f^#u!i^im6p14Q{6k!_UCB9UB@scyLVkTCcC#I)@EXDCf4QzF)_60?H*=r?vdO>DLs_ZqiKC;a~b7| zNT;Jp9G#f|ky3g>FKDC4m}TY*>2yP2o|+)EOo(qgE33fBcw}K9v_W(YD2OC`1LwQ%a9PguzChDsgPViWWFq)Z(aI zHo5n<`XyqV;S8u<^0^t zl%C%oXAm01iC`5D%YJqo{&@;oho&PYic~LnZ|!)&qIXg1>e$hFkxn9ijg(II4$EGP zGcl=1!RS{Np&F~Q%s!1#2m-)V<6u`DlgnPU7A?6sY*kxqA`X!6a{plzo{mGe+q086 zr03wJJ^R*M!Il74F}?`9y3@R0#*o`HFr7ZFK!mg((@%NV2wY%;9f3!p#zXjO7;Z;+ z;zPr_pL`$t6BfKGx+@QA7oSP?MK~N?m_O~N%FJ4dTE|csfu!zoxKHVmXc`Zr^Rn)b zJvYk{*p39h#b1055ltN1=(Q@}ND#hXnS|%NU{8~87#ZCHu_xCsDoC3KizRTc9A+je zHw>9ZX+q#$0{61bI1k*rb0NJ4VeIl%x3%1!8j<3?@}(0{ZeRAU_5=T9?VX|IuMj+e z;0c;8pVH8Yag-QGcaS4N@4-q_JL$E4> zC*Yo+09y9a+C%p)aUc-~5^*3A2NEM`yf%O{f+r9>f#3_6QUpoSitDZc`ywhrSRu|T*uVw$9T0f6%MaAp_3_TY- ze`((SKktJ+Sbf+v2*mkb6&}m%P()#aXth?uYscLZT@nzV3-?RTm)N;`YJHCCdgJ^u zQz?fNzF^Q7k+WA7e>SVzHvvCFaafAO1`N1M7?C&}Ab@x1KcO^nN)x9v z@dO~2rc2iVr|7*kIMCHJ`fTD4io;SImg2CxBM$4_TiDlr*mCa4Y@Ci1RK9f|rgbrY zzC}R*ZK+7X+zt1uj&O{s&hX`>;KK60Of^<=lZpR7-`TMhWMRbrPyGMhni+)al^Mh# z3&j7wmD2`yD@w+qWGsg9)o3rBm&LoXrt@h{kPYTetxl$yk((rOzsx3euYd zatN<7g%fx0QZg1LV^J~|C1X)CmH}mv3ZTl@DOosUOz=<((w~8R>!64M@zFAT(8@6( zu8GcMzfgkkT0Ge>$M;OAiUVp=3iBp%#r72hIAWc+LFy!{ttOhm;rd&w%C9^K6M>KX zZpe&3eN=U0%anpF1by*p9=cQHOGAxHiE$9nb>XNq|VqMorEu^XrI-! zxpP8HRM5Abh5jd0KcV^w)laDYVWRq}ps((jOrb4y<_?oX2Vy@iMFMFMNQ2it&a@Pz9jU}$vp_7AsfjeIl&MLXnos8CrKFVO(bivx!|=WbVKQj1xW3Qu zD6dpK_BnVIaS;Jh2$155l14F3!mNUnDWTKO7s@b=9lZod=~dQg%VAz9)G5Q1GE7CZ zj_urKRKGp@4BV^-9Yml8;|_(8XB50ZC7$beKB&nvXx3D zoUufdFdm6DL|EFqb}$qDQr@sXh&o)14*^m{3{VMa>2^*mfaN}w1Gr$SEwP3WYY4H1 z5Nimrh7fB=>`;sd@Z#vW=3-+T3rA86wgV9$g#an&iX}iwyNW&<9ENwCfU!n>ZKV-R zA1RJTiLP*FL2wxHB7bdO12ry%%Kh63v8X7un{HTnu_{^Fsmf}zCBYp;upWe7>x%1B zsDwf#6e`IKfk?L|Raw+0vg<=7 z-33EF=U~Pd z*`KlCzGR+==_p!q)-H4P;moMRT}7JWXFCD6_PCkT^G7>%rIY~})SQ8__T|QE;NpZs zG^1Qs8Du6(2-IEcHw5agQ3zBzL^fQ`F#e=Dk&M)aBEK$5O{y{NQb`IqA^L&qQb~#) zSpiC}&(>6KN4ZT50K@|4(1YbOx;!xK;1obxrIT+SRujWG=>L1e#}XovGKW4E18Of&C;jx z>_aVwIptiS5a`yfJ<1lF69hg)UyN`qxwf^~InI(N#^49Bw^hnn<{yv;9KVqi8e(~_ z`VqTzaz;K#co?MU+0gc@d9jq#$-y&R&~oa@x}ZrcJ_rioI)Pe>fLeM`xSHRsJB6#+ za=5XuUj=21yS1jPY7nkBBROkN;ZNbBX5*Sz7q}{ugUF>LEsvOX zC>6(4M}FtjKTk{~!5NgCNsOi}JEt#~8C7qk>aFThGt>KsEEDO>dZv!szdo9Qijz|5 zT7V}|CH$KaiHf_HUCH&D5LsrGYYq_)`)Rm|0mBl*Azpr%Lh8Wv@vozw|_6X#~J zDa5XcbE~uXm*?DQoabkmJ6~)tyhnwC~Z!qR!?;oe2?8ZaX~C~g2k}W z45D&5FO=X?U-^j}cpkp!P_r6YSB$JiJf&#fcr^GEABH<}25@SEd0XW75d-UFoH`_= z4tj1_hW%-b33H**1b&Wx|4UCq|X6hPVq>vS-BIYUz)pw(i6$fhCZ-z>S zDiCV~l(A=KD^bX5YqN$joyvW|k235PsT@Me>FcVX2x8@$rC$A`U zE2{5SouiCBUfZnAUEA5QJj&RU+X+ev!_}u6%mhLh#GybTD+*a{a%DO6Yj4!;wIgR~ zcD!;kGxmlavf8u&#d#>#>&>MhhCIH01b({FuB|kKX4niGi?v3u*z(*q#$KjRswQ~v zFi4kMI365UZ=%<8lRFf5kmd1aI3m@GM`g4-QNcG1k6ly;nqnttkqk?a`xG{Y6 zlh&TwLN(JAY-l%>K6zA__^*)H&8 zdCRqjUh(e(e5e#f9~pRsQW2F@MAYIa-G|bBDBVXhm8swx6?_|P2cmSJ-Jb4q#5$2A zajdqQXxWDAZ?P(=utMG2a9AO^1%(wtubtSoI@K^!1{2kfIjxc-O3A>%NuXt!%CzR3 z(OYDDW<(p6E~yJrRWyxUH*rp7b7`sVh3)Dox9vT~|2DIh((c5KBRH^%nedYE0de%h zylC8pW7Ea#I!ejtVWLq=hT);dbzSAME)%mgpv|OR78nb z#HfgpAG*V>;vntsSbTBmrMl|Kbr+-WgnXy40)-WP5!fOYv8_#qqOby`WJI|bl#-En z7gTP!Tzt^R4f^5p+3u_)yB!I3M~V~1azjOwsE863QEGVY*S4CS)l=);!V16fcc6T! z(GL5mD#F?mMU%7+C?3!Q8>rzhWA{A816V|f;sLS4VMsn^jK+nRTb&M7L{v8P?`ay8Bm&m8Be!=^;Vb`dwXnhom!upD%(G@;S-|<7Y|DK z1TnEam{lkqP*n)1>mCMNRPRa_O-v@#qAy*}m=+n>88M|y-U%tI zbt~W?d)<3f436^Y1Mp1AjJ=u1atBe9zgK`QzoW`HqMeK#^49B0kpSP zO|BwO@cb_iT0W#u3xAB z>fEb(j(YM7Rh}Gy(!x4Q%^#QGTz2+iY}Y;HwlA?-9y9Ur1@EmLFIe<08oy&zj~P)R z;^`8cGPO9Pd4b#Ee)c&F9*BC^_vQF*Sn1Tb%rQ^ckHew3P1hGIavynPaTm$1REuxV zLz0iU3!ZPQB{Ggc$z8*~-VN7BFN$@vA*dP85X6g%lj}LTYN@!&*aTgwFA{X1+P^06g<*;{U#`{ zwVEMz;dNkVcA@xF)$wC*xV~N9aD6l0@DD5)UurDJAMiN~jzq&Z$L(49;f(Ld50e$? z!(Bz%PmL5%1oEea`hkAig7N~EM#nGzNek{bK0R{+nCnlz68?y8{XE*fbMVrhchCUW zDa9wXaB&4 zR3+l26l)#Fk5NgTt<53HjFI-G%Vn5q(lm>#%`A11O$>_HhOWJ{(Eb#!C0aN)%oG|! zThT)IM6U|b!VxVT(Zb2?G{bw}+ih9EO-u1wiq}%SHa`lx6XLbq^0$6;AB=T^21aD3 zj}#9HL|0HufMNm^6Of#3><@*rjUBQ8yZoJL!OHLKFfRbV;VrzFQARNViV09mKnQd6 z(i<=o%Hg6MF3RDe94={XGXRe~*d7UKo9amyem9BC(2OFA35ZaZqTX@!k8-%CMtZAf$@ zLf=1rY@0+%$W$d$b>mfE$y7zUC^A*aR3%e2@@F}c$U$h+LET#;QUzZVwMFIz zsti> zbk<3oDC6erIX4^r7EoJw)C^L&Hg5*8>V^8@~ zBXIrm*3o~z3X|^ga?4vrXXf-P3;W`$@*?|}es-g`a8AIj>XVmRF6!5_Zs?w2e>uH= zth`u-a@+HlP#vIXLbHWjxXj{>B;2k)%Z5%g z)z*A-$)qhX>w#>B@GrLhHaOtDi|-Ka57GV* z?T@*CQZ#|03EVBJrMm0N7v)k447IFq;oOiqWgmuVc~U~Gos4r-3ZPmX&M$^E3%)+o znj#`HZUza4QoMqq2^3Axg=*N2CR%0+6vC;fbbGWhZ-zln(S)uf=ccsl?ol;c+C5?v zW|Cj`yQW%FF6BnbCs8itj?AU(r*!-8jzD>-6D*Nlj`)=8hraUt0dSA^taBFaNX2d11lxx9P^2aXNcDFg;9wb>HK&JPML%K2;+8g{p7phN1C6>KFh18&*LC})`AD3LC$WN zeO44-e*kXEY%n#MGgJd#C~JkMvgjXg1oh_CMzH)KA0#Zy{ap(VL?c#}b>C z8%3ym&%vESljEMcbQFYs@~`qr;oM@&>#mago@SNv{?_>1@{ zvo!V%N>~aC?)sqMr;?!HGb8XOGrkcW=Y-9YnV1R&M!^&Gu24*H12MrQ2!!Ds3JCI= zCTX}&5-F1&mN?{PM9L^2I5nCX5Ip*{2m7zMe#fgVHakJso<6R6qI$CZRn_b4e|B^@ zH*yx>9<>W?q%y%|xeNTCB)*N?;e2nshN6#gRxq(wM|euj&8u6TDVHpzByy2Eh_O)2 z{X^{4I{HfL`H4cs!vI@D(unFBr6f{HqVVG~O{AH!W^2Xu8*lS)`#b?Rr;^Ax*dMdVa%vx7Os9gxg3VTl_sMU2A95hJ z7rmg4%d*e~2cf)xA`RP)!wBMer$+IKGcZF8041R-oh(+*=?}!VR4H z{HlW#E}?LVh7qT53A4=dBunoYWd5=%=0&AqpS|2-TV6sJg+GN$C|p9}5@zDeqN(FC z76mOSg2~Q}F`=D-mt{GawQY%#wK%Fi!Z%Q|R*>L>C|nY8hz$UJp>RoBlo5mDGbPi@ zZ65FWZ~)^Wpm2%D)040gv78SgoP=sKg-a+|i;}hE%AjPeI0uTtB_cDH!X;*+;Py!= z%+A!at8h@R=mhK|!v;!4JN|1w431}q7B1P5!IJY<>w^}IU@5EVSE#X$-gzn5-2R0j zQa@&}K~Demr$=D?wXJ4n_0;;bV1waAZnAIe$A$H3+{n?gTFgd_2QqG0`Em*N)oROL z=!RjdR-3*r^Ud|USCtDK5wEKJd&~Zo1^+{V>jf2^h+ChV<%PZG=Is!ETDW0iAuWDG z)TL1tY}pGiO=qzhx6sRi_4Q+s5v|;=Io}y*dB0qTcvSgL8AjdJReyb23zV5-ACG&L zH+8Pb`&M4CWR0}l{Kb9~Uo$48ea3=UMxKU#a!pzBq^)Ch&C0yY;@YhI_i-q%cy2H) z$g_J%f+}lC^NfSIqjBm-Y!s3V7-Gku5R*lj$Mm5cE<+d*tK>o$8NeZ zXXTqCFovZo8o2B=O15tMOVpMY{x)0q8DI8e6EM>5tW5V**@W7F4e6V1vu|2?1x&6q zf+(jQrGHOGU4(U!>_>e$;hZ4Z&uQcZzj}s*cxM^PtF30en8L?el8o5dG9qIVux$dR zOtEbO8`2cm*;9bF309nswh4n=sK++JC4{?HP(rwCBq2yb2(Bxo49(su)U&6Y2>$?m z)Ju(4J1pj-=1oaT>})BKp-M7)!gp~N6mlT5mNW@=-6Z(45|o>l{KaCEfVFgt0Nhf` zUGb{3Zs_vxogRQQe%vE5r;Nq+z1v};?zI6+VINJ^}M##R{?1WCGWYvJ@qE>>S*Y(=WnHeft26H-bgKQ)g+YUp)XXT2U8M>8NP(C|JhK(wS<2Jucp|1M0ZN3MRh(z!e#P zX&-#Uk}>z)G&YoRM;Ujb%&7PMtuF@h%8107srp9Q;n z-X+VLjed<$KaO!27t7_ZgD9fuIh<|DZoot?5)7(Qn^Xt(Izgervclx9wz<6*H#cuh zY;Hf^4}WUTsNE#0rPe^ZQFRBX9Vp|dSSJ`|-f^6S+49&y!HSZS(O$7de7UmJm1gVOK`% zcF761GW18Or#S50>D;q1+#p+TXI^MAT!=ZZFuwTzfkq9LjmwqLrMT zTSV7lSL>OU_tuUVEUp(PJE%McBbS<2vGcQVOUBEeYX%-m+30D>Yo_btuy3j1`?VD> zywt1@@y4%*QNOX$U}S;mzA}R4tiIxT#qEJdT3^pY`Enx|W+xwqQZv9FJ_@%+qZxmi zhuroh<}jC?bU=8w#ZS`REly}%{jvpPi+;21)zPoAW8nnoxBrrb-_c$0{2l%t|MwV_ z-L*y=U*q{Pcq*mjno=n{ERi~kQ*<7s-G;8_+UJKyr5kcXH``!Wa4kGpg4b-Q3n-hP zwcu#9pi(2oe2p`yvwR%!;R8oTvMyvdMP5@?7~&~iz@((|Nt`6yda&QUw+7-R#`eSp z;&jvRtOU-%jGs_8{8brXu^C)pkw+AxCHp^@p%Z=f0Vh!Q25x2vjZjpoMOChGtHVk8ol$r;wSN|ViInJP z^Lg_|8&~T8QihM{jvY;--v)C62X%8we(wSKF|ep}4v9G%MzsT&;NcETuk{$0FZO>P zgFhI2ri)ct6@P5~a>d#I-^=hj{my>T;cM6POJVHfrQkGV-r?S8QEH;kjlpjhmKxio_c-IeT83ZGkrdmcx4or<*~w%!=1raAjyT4@ zoSIZl`V>h3MFQ{-!?k)v0%*GZ5daQvtzGuknX4wh%t#hJOa=t`#am&#)%1NN(4KyI zEJ=DIkmJVApILB9ZGROVkj<;r_~+^yqI>4WJ+D!yM5AHq+4H>;@pu|JM52K}8S>N! zydxHPa<{|%FKYvlzvEsfg4miBkq&~0W_+6Atnt>oR=diG$GCgRYsn3xr-P~wnWWw) zwI?eT6mmLVG@yZgeW5~keMhNecWt4qe~d;j8i|N=oKXUh@`LDB42fuZvfXQ zdLo!Bf_&BFt7bJZ@_p5RWW}Mr&mlphvHTU8u86621n%U*`XbgNOI*#pS8`G=yw}YV zw$j^G^&;9Q)JJRb<}b=JtZ3Q)=^A?5zeV2mxO^E-o`GFZTYq6vz$Mnp&$3PNitC@| z!D?ocYZLAxCC0fHLj&G7ct8wCiAn4MB7^)&6!lx~%9N^$@Tnkg=3>WpS*+_(J|wtR zqY63M_Iz(Kj)48R1n08d7x8!tw7^V!d?CVsco&V|akQl7@N@}Iu`i>da*XB$Zij=9 zvhRVYcYR-uU!VvE;&C_>-@5CI6}gWDSBSgFYKh`waIyRd116~RHN*1zcT+IwtuYzP zY`>m3FmA=2TCd9H&VRGuj4GaE8%j2)J}B(NVipf~j~! z8o95hilw7;x`kI*B^K=ekBkZO^XEzegiESpq|?WS7%;q5TuT`fpkiw&K>wcuQq zI&pP{DH7=ZK_HduKia&4s>xXV1;SLJH zs%8uNNffh%9SLePVKUDNI7H77?BiI&#b3ST4qeP_T5M+q#@zZZcG@h}Bqw--rrdon zi73cs%c}+K9rG`sXpB;KI|Hdnwx441aJLj?4&-GH{80%;*=EW@yq_t-TMR7;rB}S; zBK=vb<*u{%%M6dfsETJB^Txe)^#cDV3elu6Ins&RQ&!rqhMS{H%?HXjjr>DU>%=WF z>Z?U?(w$1K6e$)wFr+msj3-hRLb9Oyv7k$2L2oCHzOv)KKnxP&(53DXW#Lk{cB?|5`>qEvGZd?=Zhoo^Xi7b91}Khlmx?l z#1Xr5;iU^a2-|E4>X~SHWK*W1#^5i_+gOB1m`J&;vG(RJt`q4LDe`yNaxyEU_V^f; z&m+S!hR2ss&7;v4v$f!8n{xBS4HB=2^^FiB8LpqV-eOhWGYJ!K?YNx%w-~#!XiXw@ zGeznT%V50~C;nfS;eR$!#*rI%&cJl2qK>aBG;TP-Ah#+b14nJ6SrDrI6PqT|YKp*; z`QGN|N8s`nb_yMyiSeht*l=GSzrnCEdBd^!1~)n-(Y)~Op>2GU8Oo0|E_>+Yx*rap zTgGdxHY2JwXvJ?3fB-UCl4 zK2LVk-NN20!6)=@x^2X|Gq@9e_FVsF#z*|}2uv(?Ru-F`AS||{h}QHW3zcFoqHZxq z^+rGByRb}l%MC6UD{#SDl1i|dDnUg7)8@(Jem_4e!5X-=<|;>`=F9tgVPti&SjgmG zq89Hm?j*}bm*Z)}S&L#NM63QQ0`&enAYNE zuElRm%1Ql|NqD|X(s?omqggMem()oZJiQwpQdt%QT&*$1i07uJp1G`u+^p;8poB4= zC&i6P3Q_h9QSRLRr*Z>|wbpVQ9hT!Tf@a~=Xr*9|{3j1!a#?4k-B~GSyG3njm!e%t zq$bfWH3T+L)Qu^vnbMkBcq=EZc~9=457HwG$A!3E7w322z~GD!SWK`<&! z(FodAHY@_wA!NetwToW@z{@cqBU6VZ;|d=xZai;*v33W+@@sf{NKAtn!O9OZt%8 z@7K@D9(#PD)kNIe{D%0L0+*LD)Qc}BZqAR1j0SW1rTJ9pQ^WhTR zy#j0Xc&om<$UI=V2~3r5U>xbH*I2$3vJ3?*Sp9R6&SM6Citxt>X1*hEW7g%;AD1Gi z9uf_V8sqpFz<$ihsW(?@SUW9bgYh1K7rG$TWypzrOEVs&dNMenPMlc!;9BSfZ6q}3 z$%9=ucQ7&)apOdtsn$5_gc~+n)z^A~*J6L^EfyM~(g@3nc4@Z~vRhW)z+dtLdq*`2 zHUa-GRYq;Myd{QJ{_z<6iJ2F?v%eiq(4HH<{iPB-Hsq;^1BvT@Hd^r;o95X4^Kf^u zd&n9|oH?TVlG*^VRNAl+3BL9jcvbn=_nZ-9HW`*dHoPSJ+;DY!$sXL^l0xea87 zRV;%Q0ikX{X*=NP=a6E=4c3cMj9^3ipN;f)f#d0_kU?SW( zAQet_$UPPrOXtr{tN~hjrylOoy zE_Bi$@7kCbEH|*WsAYdVqmr12YRl2(q3`Uo+&#j|xP4Yu63cFweO7o^h8iU5FFx)F zvR;8Di|TA(w$+1tkZ{DlYr%nN#A=tX@?2WW{<;M(H!auXnEh3sZ7hay%{DedZ-+yX zQQEy3evn7u#;o7*`U5a2Z#%W$xhvKkM7L|Q-{(3j3+}_bqls~pYA>5duNk$+mmLD_ zQ%X{Bef>B4UHW@TyjE!aYU0KS^7g>D(E8aFw4EyE8#y}70=ICV6u&cDUZ_?iWPnj<66)aSU4Q(v% z-q!`Rw-0@9-!#MQef@r065g4@d$13bp?QB0Sz6nTw|T`NZ>**LBIDKX>k{%DCq+}T zt3nj>9DfJ#iG7azUs&+EG(N$I5sEDFbSOBT^1guuX>SG7_D+kQW;(miTdg<4gxjuh zGWudP*rIh_;J+33>!p_4T=+$AF|7Q)1rxOzLi$>@T93{px2THNj_Tb`d4(#EAn>qImx?qp z*Z+Cz=uUOG$%E>U=0BKXeVT?1&4|FTq2Sn?lvc2o`^u!Yc9&igdK!)_qbj* zL|EstiseMA7d}-^`VF^zQR|&}yzw$PiVe84Kua7k2ZUB7ZYJTm;zaK-nRBBNU3r9k z3;W-U!Us|a)c6}*yFtZ~`Nw5=GM*yWx;r@hAF<#_zumB354RX&EU6{{;8W z6;#NXE7h5NWzPnSO-5Q0dXlPC}u_L!;4+H;kn4|Fj13yN`YybcN delta 886 zcmezKTB6ftf*9kW?aOVMTv-`+Y=7&-^p=@XYx-?BCXMMQ9GUpH3%D~0G4d%eYF%dG zVvkQOPRUFznQrLMq`p1WgJ}{E(-Q9KU6O1LjG@!_NwJyfXt8rKC+8FkFlupdu_P9y z7YndxadEL_mxI~NT5FlOIO5|o^D;}~<3YxVPZuy?#deuxW*Gu@tA~ zqzN!iPgG~~anlmwV$M#j6kwDB+TfU1DZmPJlL!}UPHI_d4yvdy7fV`EY9Xqi2GBVb znUe+Qs7#-%%BsWe%f*yfA*43FP?}AdS1+*w4ATt>ZUtrvax8YaS0}sX6BS+<`wIu=Hz4+6lWGIVG0#R zO<$?WW~@)F@(76MrhgP+gSg5BW-ya5|4(Tpandas.core.indexes.accessors.DatetimeProperties.to_pydatetime"9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray* -self -pandas.core.indexes.accessors.DatetimeProperties[pandas.core.indexes.accessors._DTFieldOpsReturnType,pandas.core.indexes.accessors._DTBoolOpsReturnType,pandas.core.indexes.accessors._DTRoundingMethodReturnType,pandas.core.indexes.accessors._DTOtherOpsDateReturnType,pandas.core.indexes.accessors._DTOtherOpsTimeReturnType,pandas.core.indexes.accessors._DTFreqReturnType,pandas.core.indexes.accessors._DTNormalizeReturnType,pandas.core.indexes.accessors._DTStrKindReturnType,pandas.core.indexes.accessors._DTToPeriodReturnType]l +Any" numpy.ndarray* +self +pandas.core.indexes.accessors.DatetimeProperties[pandas.core.indexes.accessors._DTFieldOpsReturnType,pandas.core.indexes.accessors._DTBoolOpsReturnType,pandas.core.indexes.accessors._DTTimestampTimedeltaReturnType,pandas.core.indexes.accessors._DTOtherOpsDateReturnType,pandas.core.indexes.accessors._DTOtherOpsTimeReturnType,pandas.core.indexes.accessors._DTFreqReturnType,pandas.core.indexes.accessors._DTNormalizeReturnType,pandas.core.indexes.accessors._DTStrKindReturnType,pandas.core.indexes.accessors._DTToPeriodReturnType]l 3pandas.core.indexes.accessors._DTFieldOpsReturnType" builtins.object"builtins.object"builtins.objectk 2pandas.core.indexes.accessors._DTBoolOpsReturnType" -builtins.object"builtins.object"builtins.objectr -9pandas.core.indexes.accessors._DTRoundingMethodReturnType" +builtins.object"builtins.object"builtins.objectv +=pandas.core.indexes.accessors._DTTimestampTimedeltaReturnType" builtins.object"builtins.object"builtins.objectp 7pandas.core.indexes.accessors._DTOtherOpsDateReturnType" builtins.object"builtins.object"builtins.objectp @@ -502,16 +506,16 @@ month_nameApandas.core.indexes.accessors._DatetimeLikeNoTZMethods.month_name"k 2pandas.core.indexes.accessors._DTStrKindReturnType" builtins.object"builtins.object"builtins.objectl 3pandas.core.indexes.accessors._DTToPeriodReturnType" -builtins.object"builtins.object"builtins.object"0pandas.core.indexes.accessors.DatetimeProperties* +builtins.object"builtins.object"builtins.object"0pandas.core.indexes.accessors.DatetimeProperties* isocalendar +rename%pandas.core.indexes.base.Index.rename) +rename%pandas.core.indexes.base.Index.rename" +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -6193,18 +5892,58 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +self +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +name +Any*I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool 0:typing.overloadX +rename%pandas.core.indexes.base.Index.rename" +None* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -6231,35 +5970,22 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(*  -Union[builtins.slice,TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],typing.Sequence[builtins.int],pandas.core.indexes.base.Index[Any],pandas.core.series.Series[builtins.bool],typing.Sequence[builtins.bool],TypeAlias[Unknown]] -builtins.slice"builtins.slice -^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] -STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] -Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] -Any -5numpy.dtype[numpy._typing._array_like._ScalarType_co][ -(numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray" pandas._typing.np_ndarray_anyintN -typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.SequenceN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Indexe -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.SeriesQ -typing.Sequence[builtins.bool] - builtins.bool" builtins.bool"typing.Sequence8 -TypeAlias[Unknown]"pandas._typing.np_ndarray_bool0:typing.overloadX4 - __getitem__*pandas.core.indexes.base.Index.__getitem__" -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* +name +Any*G +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool0:typing.overloadX2_ + __getitem__*pandas.core.indexes.base.Index.__getitem__2 + __getitem__*pandas.core.indexes.base.Index.__getitem__" +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -6286,17 +6012,15 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype* -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -6323,38 +6047,32 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* -Union[builtins.int,builtins.tuple[TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]]]] - builtins.int" builtins.int -nbuiltins.tuple[TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]]] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(*  +Union[builtins.slice,TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],typing.Sequence[builtins.int],pandas.core.indexes.base.Index[Any],pandas.core.series.Series[builtins.bool],typing.Sequence[builtins.bool],TypeAlias[Unknown]] +builtins.slice"builtins.slice ^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] Any 5numpy.dtype[numpy._typing._array_like._ScalarType_co][ (numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray" pandas._typing.np_ndarray_anyint"builtins.tuple0:typing.overloadX24 -__mul__&pandas.core.indexes.base.Index.__mul__ -__mul__&pandas.core.indexes.base.Index.__mul__"^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex* -bUnion[pandas.core.indexes.base.Index[builtins.int],pandas.core.indexes.base.Index[builtins.float]]l -,pandas.core.indexes.base.Index[builtins.int] - builtins.int" builtins.int"pandas.core.indexes.base.Indexr -.pandas.core.indexes.base.Index[builtins.float] -builtins.float"builtins.float"pandas.core.indexes.base.Index**( -datetime.timedelta"datetime.timedelta0:typing.overloadX/ -__mul__&pandas.core.indexes.base.Index.__mul__" -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray" pandas._typing.np_ndarray_anyintN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.SequenceN +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Indexe +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.SeriesQ +typing.Sequence[builtins.bool] + builtins.bool" builtins.bool"typing.Sequence8 +TypeAlias[Unknown]"pandas._typing.np_ndarray_bool0:typing.overloadX- + __getitem__*pandas.core.indexes.base.Index.__getitem__" +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -6381,18 +6099,14 @@ bUnion[pandas.core.indexes.base.Index[builtins.int],pandas.core.indexes.base.Ind builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset* +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -6419,30 +6133,35 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(*  -Any0:typing.overloadX23 - __truediv__*pandas.core.indexes.base.Index.__truediv__ - __truediv__*pandas.core.indexes.base.Index.__truediv__" -NoReturn -* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* +Union[builtins.int,builtins.tuple[TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]]]] + builtins.int" builtins.int +nbuiltins.tuple[TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]]] +^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray" pandas._typing.np_ndarray_anyint"builtins.tuple0:typing.overloadX2- +__mul__&pandas.core.indexes.base.Index.__mul__ +__mul__&pandas.core.indexes.base.Index.__mul__"^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex* bUnion[pandas.core.indexes.base.Index[builtins.int],pandas.core.indexes.base.Index[builtins.float]]l ,pandas.core.indexes.base.Index[builtins.int] builtins.int" builtins.int"pandas.core.indexes.base.Indexr .pandas.core.indexes.base.Index[builtins.float] builtins.float"builtins.float"pandas.core.indexes.base.Index**( -datetime.timedelta"datetime.timedelta0:typing.overloadX/ - __truediv__*pandas.core.indexes.base.Index.__truediv__" -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +datetime.timedelta"datetime.timedelta0:typing.overloadX( +__mul__&pandas.core.indexes.base.Index.__mul__" +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -6469,18 +6188,15 @@ bUnion[pandas.core.indexes.base.Index[builtins.int],pandas.core.indexes.base.Ind builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -6507,14 +6223,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(*  +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(*  Any0:typing.overloadXPr= __hash__'pandas.core.indexes.base.Index.__hash__ NonerW @@ -6523,13 +6236,13 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand notnull&pandas.core.indexes.base.Index.notnull& builtins.ellipsis"builtins.ellipsisr[ __bool__'pandas.core.indexes.base.Index.__bool__& -builtins.ellipsis"builtins.ellipsis -CategoricalIndex-pandas.core.indexes.category.CategoricalIndex",pandas.core.indexes.extension.ExtensionIndex"#pandas.core.accessor.PandasDelegate*I -__new__5pandas.core.indexes.category.CategoricalIndex.__new__" -2pandas.core.indexes.category.CategoricalIndex.Self -@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.ellipsis"builtins.ellipsis +CategoricalIndex-pandas.core.indexes.category.CategoricalIndex",pandas.core.indexes.extension.ExtensionIndex"#pandas.core.accessor.PandasDelegate*> +__new__5pandas.core.indexes.category.CategoricalIndex.__new__" +2pandas.core.indexes.category.CategoricalIndex.Self +@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -6556,20 +6269,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"-pandas.core.indexes.category.CategoricalIndex"-pandas.core.indexes.category.CategoricalIndex(* -cls -8Type[pandas.core.indexes.category.CategoricalIndex.Self] -2pandas.core.indexes.category.CategoricalIndex.Self -@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"-pandas.core.indexes.category.CategoricalIndex"-pandas.core.indexes.category.CategoricalIndex(* +cls +8Type[pandas.core.indexes.category.CategoricalIndex.Self] +2pandas.core.indexes.category.CategoricalIndex.Self +@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -6596,18 +6306,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"-pandas.core.indexes.category.CategoricalIndex"-pandas.core.indexes.category.CategoricalIndex("type* -data -"typing.Iterable[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"-pandas.core.indexes.category.CategoricalIndex"-pandas.core.indexes.category.CategoricalIndex("type* +data +"typing.Iterable[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -6634,14 +6341,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"typing.Iterable * +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Iterable * categories Any * @@ -6655,13 +6359,13 @@ categories Any *S equals4pandas.core.indexes.category.CategoricalIndex.equals* self* -other* +other* inferred_type;pandas.core.indexes.category.CategoricalIndex.inferred_type" - builtins.str" builtins.str* -self -@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.str" builtins.str* +self +@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -6688,21 +6392,18 @@ categories builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"-pandas.core.indexes.category.CategoricalIndex0:builtins.property`*_ +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"-pandas.core.indexes.category.CategoricalIndex0:builtins.property`*_ values4pandas.core.indexes.category.CategoricalIndex.values* -self0:builtins.property`* +self0:builtins.property`* __contains__:pandas.core.indexes.category.CategoricalIndex.__contains__" - builtins.bool" builtins.bool* -@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -6729,23 +6430,20 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"-pandas.core.indexes.category.CategoricalIndex*  -Any* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"-pandas.core.indexes.category.CategoricalIndex*  +Any* __array__7pandas.core.indexes.category.CategoricalIndex.__array__"9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray* -self -@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray* +self +@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -6772,23 +6470,20 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"-pandas.core.indexes.category.CategoricalIndex* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"-pandas.core.indexes.category.CategoricalIndex* dtype -Any *& +Any *# astype4pandas.core.indexes.category.CategoricalIndex.astype"N #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index* -self -@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any"pandas.core.indexes.base.Index* +self +@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -6815,14 +6510,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"-pandas.core.indexes.category.CategoricalIndex* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"-pandas.core.indexes.category.CategoricalIndex* dtype TypeAlias[Union[TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],typing.Mapping[Any,Unknown]]] Union[TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],typing.Mapping[Any,Unknown]] @@ -6849,13 +6541,13 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand fillna4pandas.core.indexes.category.CategoricalIndex.fillna* self* value * -downcast * +downcast * is_unique7pandas.core.indexes.category.CategoricalIndex.is_unique" - builtins.bool" builtins.bool* -self -@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +self +@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -6882,20 +6574,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"-pandas.core.indexes.category.CategoricalIndex0:builtins.property`* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"-pandas.core.indexes.category.CategoricalIndex0:builtins.property`* is_monotonic_increasingEpandas.core.indexes.category.CategoricalIndex.is_monotonic_increasing" - builtins.bool" builtins.bool* -self -@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +self +@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -6922,20 +6611,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"-pandas.core.indexes.category.CategoricalIndex0:builtins.property`* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"-pandas.core.indexes.category.CategoricalIndex0:builtins.property`* is_monotonic_decreasingEpandas.core.indexes.category.CategoricalIndex.is_monotonic_decreasing" - builtins.bool" builtins.bool* -self -@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +self +@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -6962,24 +6648,21 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"-pandas.core.indexes.category.CategoricalIndex0:builtins.property`*U +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"-pandas.core.indexes.category.CategoricalIndex0:builtins.property`*U unique4pandas.core.indexes.category.CategoricalIndex.unique* self* -level * +level * duplicated8pandas.core.indexes.category.CategoricalIndex.duplicated" -Any* -self -@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any* +self +@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -7006,14 +6689,11 @@ duplicated8pandas.core.indexes.category.CategoricalIndex.duplicated" builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"-pandas.core.indexes.category.CategoricalIndex* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"-pandas.core.indexes.category.CategoricalIndex* keep IUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.bool]]7 Literal[builtins.str]  @@ -7021,14 +6701,7 @@ IUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.bool]]7 Literal[builtins.str]  builtins.str" builtins.str: Literal[builtins.bool]  - builtins.bool" builtins.bool *S -get_loc5pandas.core.indexes.category.CategoricalIndex.get_loc* -self* -key*l - get_value7pandas.core.indexes.category.CategoricalIndex.get_value* -self* -seriesArrayLike* -key*] + builtins.bool" builtins.bool *] where3pandas.core.indexes.category.CategoricalIndex.where* self* cond* @@ -7051,16 +6724,7 @@ IUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.bool]]7 get_indexer_non_uniqueDpandas.core.indexes.category.CategoricalIndex.get_indexer_non_unique* self* -target*` -take_nd5pandas.core.indexes.category.CategoricalIndex.take_nd* -self* -args* - -kwargs*N -map1pandas.core.indexes.category.CategoricalIndex.map* -self* - -mapper*Q +target*Q delete4pandas.core.indexes.category.CategoricalIndex.delete* self* loc*[ @@ -7075,8 +6739,8 @@ IUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.bool]]7 categories8pandas.core.indexes.category.CategoricalIndex.categoriesN #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.IndexA - DatetimeIndex+pandas.core.indexes.datetimes.DatetimeIndex"7pandas.core.indexes.datetimelike.DatetimeTimedeltaMixin"5pandas.core.indexes.accessors.DatetimeIndexProperties* +Any"pandas.core.indexes.base.Index> + DatetimeIndex+pandas.core.indexes.datetimes.DatetimeIndex"7pandas.core.indexes.datetimelike.DatetimeTimedeltaMixin"5pandas.core.indexes.accessors.DatetimeIndexProperties* __init__4pandas.core.indexes.datetimes.DatetimeIndex.__init__" None*d selfZ @@ -7105,10 +6769,6 @@ kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[A freq Any * tz -Any */ - normalize - builtins.bool" builtins.bool * -closed Any *- ambiguous builtins.str" builtins.str *. @@ -7132,13 +6792,11 @@ kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[A Any *N __reduce__6pandas.core.indexes.datetimes.DatetimeIndex.__reduce__* -self* +self* to_series5pandas.core.indexes.datetimes.DatetimeIndex.to_series"H "pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries*d selfZ -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* -keep_tz -Any * ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* index Any * name @@ -7148,16 +6806,7 @@ __reduce__6pandas.core.indexes.datetimes.DatetimeIndex.__reduce__* selfZ +pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex*( freq - builtins.str" builtins.str *a - get_value5pandas.core.indexes.datetimes.DatetimeIndex.get_value* -self* - -series* -key*b -get_loc3pandas.core.indexes.datetimes.DatetimeIndex.get_loc* -self* -key* - tolerance *x + builtins.str" builtins.str *x slice_indexer9pandas.core.indexes.datetimes.DatetimeIndex.slice_indexer* self* start * @@ -7173,13 +6822,7 @@ __reduce__6pandas.core.indexes.datetimes.DatetimeIndex.__reduce__* side builtins.str" builtins.str * sorter -Any * -is_type_compatible>pandas.core.indexes.datetimes.DatetimeIndex.is_type_compatible" - builtins.bool" builtins.bool*d -selfZ -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* -typ -Any* +Any * inferred_type9pandas.core.indexes.datetimes.DatetimeIndex.inferred_type" builtins.str" builtins.str*d selfZ @@ -7208,13 +6851,7 @@ start_time include_start builtins.bool" builtins.bool *1 include_end - builtins.bool" builtins.bool * -to_perioddelta:pandas.core.indexes.datetimes.DatetimeIndex.to_perioddelta"^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex*d -selfZ -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* -freq -Any* + builtins.bool" builtins.bool * to_julian_date:pandas.core.indexes.datetimes.DatetimeIndex.to_julian_date"r .pandas.core.indexes.base.Index[builtins.float] builtins.float"builtins.float"pandas.core.indexes.base.Index*d @@ -7236,35 +6873,40 @@ AUnion[numpy.dtype[Any],pandas.core.dtypes.dtypes.DatetimeTZDtype]( Any" numpy.dtypeV )pandas.core.dtypes.dtypes.DatetimeTZDtype")pandas.core.dtypes.dtypes.DatetimeTZDtype*d selfZ -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex0:builtins.property`2 ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex0:builtins.property`2 __add__3pandas.core.indexes.datetimes.DatetimeIndex.__add__ __add__3pandas.core.indexes.datetimes.DatetimeIndex.__add__"H "pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries*\Z +pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex*JH -"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries0:typing.overloadX +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries0:typing.overloadX __add__3pandas.core.indexes.datetimes.DatetimeIndex.__add__"Z +pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex*\Z -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* -]Union[pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.indexes.timedeltas.TimedeltaIndex]T ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* +Union[datetime.timedelta,pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.indexes.timedeltas.TimedeltaIndex,pandas._libs.tslibs.offsets.BaseOffset]( +datetime.timedelta"datetime.timedeltaT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex0:typing.overloadX2 +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndexP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset0:typing.overloadX2 __sub__3pandas.core.indexes.datetimes.DatetimeIndex.__sub__ __sub__3pandas.core.indexes.datetimes.DatetimeIndex.__sub__"H "pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries*\Z +pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex*JH -"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries0:typing.overloadX +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries0:typing.overloadX __sub__3pandas.core.indexes.datetimes.DatetimeIndex.__sub__"Z +pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex*\Z -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* -]Union[pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.indexes.timedeltas.TimedeltaIndex]T ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* +Union[datetime.timedelta,pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.indexes.timedeltas.TimedeltaIndex,pandas._libs.tslibs.offsets.BaseOffset]( +datetime.timedelta"datetime.timedeltaT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex0:typing.overloadX +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndexP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset0:typing.overloadX __sub__3pandas.core.indexes.datetimes.DatetimeIndex.__sub__"^ -pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex*\Z -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* -[Union[pandas._libs.tslibs.timestamps.Timestamp,pandas.core.indexes.datetimes.DatetimeIndex]T ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* +mUnion[datetime.datetime,pandas._libs.tslibs.timestamps.Timestamp,pandas.core.indexes.datetimes.DatetimeIndex]& +datetime.datetime"datetime.datetimeT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampZ -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex0:typing.overloadX ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex0:typing.overloadX IntervalIndex*pandas.core.indexes.interval.IntervalIndex",pandas.core.indexes.extension.ExtensionIndex"#pandas._libs.interval.IntervalMixin* __new__2pandas.core.indexes.interval.IntervalIndex.__new__" Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] @@ -7480,27 +7122,6 @@ Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] pandas._typing.IntervalTN #pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex0:builtins.property`* - get_value4pandas.core.indexes.interval.IntervalIndex.get_value" -Any* -self -Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] -pandas._typing.IntervalTN -#pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* -series -/TypeAlias[Type[pandas.core.series.Series[Any]]]t -$Type[pandas.core.series.Series[Any]]D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series"type"$pandas.core.dtypes.generic.ABCSeries* -key -Any* - is_all_dates7pandas.core.indexes.interval.IntervalIndex.is_all_dates" - builtins.bool" builtins.bool* -self -Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] -pandas._typing.IntervalTN -#pandas._libs.interval.Interval[Any] Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex0:builtins.property`2Z from_breaks6pandas.core.indexes.interval.IntervalIndex.from_breaks from_breaks6pandas.core.indexes.interval.IntervalIndex.from_breaks" @@ -8347,7 +7968,7 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"!pandas._typing.IntervalClosedTypeئ + builtins.str" builtins.str"!pandas._typing.IntervalClosedType MultiIndex$pandas.core.indexes.multi.MultiIndex"pandas.core.indexes.base.Index* __new__,pandas.core.indexes.multi.MultiIndex.__new__" @@ -8571,10 +8192,6 @@ $pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex*S builtins.bool" builtins.bool * __len__,pandas.core.indexes.multi.MultiIndex.__len__" builtins.int" builtins.int*NL -$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex* - inferred_type2pandas.core.indexes.multi.MultiIndex.inferred_type" - builtins.str" builtins.str*V -selfL $pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex*V values+pandas.core.indexes.multi.MultiIndex.values* self0:builtins.property`* @@ -8618,12 +8235,7 @@ $pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex"$pan Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str *Z - get_value.pandas.core.indexes.multi.MultiIndex.get_value* -self* - -series* -key* + builtins.str" builtins.str * get_level_values5pandas.core.indexes.multi.MultiIndex.get_level_values"N #pandas.core.indexes.base.Index[Any] Any"pandas.core.indexes.base.Index*V @@ -8649,11 +8261,7 @@ $pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex*+ allow_duplicates builtins.bool" builtins.bool *M to_flat_index2pandas.core.indexes.multi.MultiIndex.to_flat_index* -self* - is_all_dates1pandas.core.indexes.multi.MultiIndex.is_all_dates" - builtins.bool" builtins.bool*V -selfL -$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex0:builtins.property`*[ +self*[ remove_unused_levels9pandas.core.indexes.multi.MultiIndex.remove_unused_levels* self* nlevels,pandas.core.indexes.multi.MultiIndex.nlevels" @@ -8771,10 +8379,7 @@ slice_locs/pandas.core.indexes.multi.MultiIndex.slice_locs* start * end * -step *J -get_loc,pandas.core.indexes.multi.MultiIndex.get_loc* -self* -key* +step * get_loc_level2pandas.core.indexes.multi.MultiIndex.get_loc_level" Any*V selfL @@ -8806,13 +8411,18 @@ $pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex* self* other* -sort * +sort * intersection1pandas.core.indexes.multi.MultiIndex.intersection" -Any*V -selfL -$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex* -other -Any** +Any* +self +)pandas.core.indexes.multi.MultiIndex.SelfL +$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex(* +other +CUnion[builtins.list[Any],pandas.core.indexes.multi.MultiIndex.Self], +builtins.list[Any] +Any" builtins.list +)pandas.core.indexes.multi.MultiIndex.SelfL +$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex(** sort builtins.bool" builtins.bool *^ @@ -8899,7 +8509,7 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.tuple[Any] Any"builtins.tuple*NL $pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex* - builtins.int" builtins.int0:typing.overloadXA + builtins.int" builtins.int0:typing.overloadX= PeriodIndex&pandas.core.indexes.period.PeriodIndex"6pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin"1pandas.core.indexes.accessors.PeriodIndexFieldOps* __new__.pandas.core.indexes.period.PeriodIndex.__new__" Any* @@ -8972,12 +8582,7 @@ $pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex* inferred_type4pandas.core.indexes.period.PeriodIndex.inferred_type" builtins.str" builtins.str*Z selfP -&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex0:builtins.property`*\ - get_value0pandas.core.indexes.period.PeriodIndex.get_value* -self* - -series* -key* +&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex0:builtins.property`* get_indexer2pandas.core.indexes.period.PeriodIndex.get_indexer* self* @@ -8988,11 +8593,7 @@ $pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex* get_indexer_non_unique=pandas.core.indexes.period.PeriodIndex.get_indexer_non_unique* self* -target*] -get_loc.pandas.core.indexes.period.PeriodIndex.get_loc* -self* -key* - tolerance *T +target*T insert-pandas.core.indexes.period.PeriodIndex.insert* self* loc* @@ -9010,14 +8611,6 @@ $pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex* return_indexers builtins.bool" builtins.bool ** sort - builtins.bool" builtins.bool * - intersection3pandas.core.indexes.period.PeriodIndex.intersection" -Any*Z -selfP -&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex* -other -Any** -sort builtins.bool" builtins.bool *` difference1pandas.core.indexes.period.PeriodIndex.difference* @@ -9092,36 +8685,19 @@ difference1pandas.core.indexes.period.PeriodIndex.difference* __rsub__/pandas.core.indexes.period.PeriodIndex.__rsub__"J #pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType*RP &pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex*LJ -#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType0:typing.overloadXI +#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType0:typing.overloadXC -RangeIndex$pandas.core.indexes.range.RangeIndex"pandas.core.indexes.base.Index* +RangeIndex$pandas.core.indexes.range.RangeIndex"pandas.core.indexes.base.Index* __new__,pandas.core.indexes.range.RangeIndex.__new__" Any* cls *Type[pandas.core.indexes.range.RangeIndex]L -$pandas.core.indexes.range.RangeIndex"$pandas.core.indexes.range.RangeIndex"type* -start -8Union[builtins.int,pandas.core.indexes.range.RangeIndex] - builtins.int" builtins.intL -$pandas.core.indexes.range.RangeIndex"$pandas.core.indexes.range.RangeIndex *( -stop - builtins.int" builtins.int *( -step - builtins.int" builtins.int * -dtype -Any ** -copy - builtins.bool" builtins.bool * -name -Any * -__init__-pandas.core.indexes.range.RangeIndex.__init__" -None*V -selfL -$pandas.core.indexes.range.RangeIndex"$pandas.core.indexes.range.RangeIndex* -start -8Union[builtins.int,pandas.core.indexes.range.RangeIndex] +$pandas.core.indexes.range.RangeIndex"$pandas.core.indexes.range.RangeIndex"type* +start +GUnion[builtins.int,pandas.core.indexes.range.RangeIndex,builtins.range] builtins.int" builtins.intL -$pandas.core.indexes.range.RangeIndex"$pandas.core.indexes.range.RangeIndex *( +$pandas.core.indexes.range.RangeIndex"$pandas.core.indexes.range.RangeIndex +builtins.range"builtins.range *( stop builtins.int" builtins.int *( step @@ -9185,11 +8761,7 @@ $pandas.core.indexes.range.RangeIndex"$pandas.core.indexes.range.RangeIndex*xv &Union[builtins.int,numpy.integer[Any]] builtins.int" builtins.int, numpy.integer[Any] -Any" numpy.integer*[ -get_loc,pandas.core.indexes.range.RangeIndex.get_loc* -self* -key* - tolerance * +Any" numpy.integer* get_indexer0pandas.core.indexes.range.RangeIndex.get_indexer* self* @@ -9257,15 +8829,7 @@ $pandas.core.indexes.range.RangeIndex"$pandas.core.indexes.range.RangeIndex** builtins.bool" builtins.bool *J equals+pandas.core.indexes.range.RangeIndex.equals* self* -other* - intersection1pandas.core.indexes.range.RangeIndex.intersection" -Any*V -selfL -$pandas.core.indexes.range.RangeIndex"$pandas.core.indexes.range.RangeIndex* -other -Any** -sort - builtins.bool" builtins.bool * +other* join)pandas.core.indexes.range.RangeIndex.join" Any*V selfL @@ -9340,8 +8904,8 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] __getitem__0pandas.core.indexes.range.RangeIndex.__getitem__" builtins.int" builtins.int*NL $pandas.core.indexes.range.RangeIndex"$pandas.core.indexes.range.RangeIndex* - builtins.int" builtins.int0:typing.overloadXA -TimedeltaIndex-pandas.core.indexes.timedeltas.TimedeltaIndex"7pandas.core.indexes.datetimelike.DatetimeTimedeltaMixin"6pandas.core.indexes.accessors.TimedeltaIndexProperties* + builtins.int" builtins.int0:typing.overloadXT +TimedeltaIndex-pandas.core.indexes.timedeltas.TimedeltaIndex"7pandas.core.indexes.datetimelike.DatetimeTimedeltaMixin"6pandas.core.indexes.accessors.TimedeltaIndexProperties* __new__5pandas.core.indexes.timedeltas.TimedeltaIndex.__new__" 2pandas.core.indexes.timedeltas.TimedeltaIndex.Self^ -pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex(* @@ -9367,23 +8931,7 @@ cUnion[datetime.timedelta,pandas._libs.tslibs.timedeltas.Timedelta,numpy.timedel datetime.timedelta"datetime.timedeltaT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta& numpy.timedelta64"numpy.timedelta64 -builtins.float"builtins.float"typing.Sequence * -unit -Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str * +builtins.float"builtins.float"typing.Sequence * freq :Union[builtins.str,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.strP @@ -9396,19 +8944,21 @@ cUnion[datetime.timedelta,pandas._libs.tslibs.timedeltas.Timedelta,numpy.timedel copy builtins.bool" builtins.bool *( name - builtins.str" builtins.str * + builtins.str" builtins.str * __radd__6pandas.core.indexes.timedeltas.TimedeltaIndex.__radd__"Z +pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex*`^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex* -[Union[pandas._libs.tslibs.timestamps.Timestamp,pandas.core.indexes.datetimes.DatetimeIndex]T +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex* +mUnion[datetime.datetime,pandas._libs.tslibs.timestamps.Timestamp,pandas.core.indexes.datetimes.DatetimeIndex]& +datetime.datetime"datetime.datetimeT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampZ -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* __sub__5pandas.core.indexes.timedeltas.TimedeltaIndex.__sub__" 2pandas.core.indexes.timedeltas.TimedeltaIndex.Self^ -pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex(* 2pandas.core.indexes.timedeltas.TimedeltaIndex.Self^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex(* -bUnion[pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.indexes.timedeltas.TimedeltaIndex.Self]T +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex(* +uUnion[datetime.timedelta,pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.indexes.timedeltas.TimedeltaIndex.Self]( +datetime.timedelta"datetime.timedeltaT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta 2pandas.core.indexes.timedeltas.TimedeltaIndex.Self^ -pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex(* @@ -9417,13 +8967,23 @@ bUnion[pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.indexes.timedeltas.T -pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex(* 2pandas.core.indexes.timedeltas.TimedeltaIndex.Self^ -pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex(*&$ -builtins.complex"builtins.complex* - __truediv__9pandas.core.indexes.timedeltas.TimedeltaIndex.__truediv__" -2pandas.core.indexes.timedeltas.TimedeltaIndex.Self^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex(* -2pandas.core.indexes.timedeltas.TimedeltaIndex.Self^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex(*&$ -builtins.complex"builtins.complex* +builtins.complex"builtins.complex* + __rtruediv__:pandas.core.indexes.timedeltas.TimedeltaIndex.__rtruediv__"r +.pandas.core.indexes.base.Index[builtins.float] +builtins.float"builtins.float"pandas.core.indexes.base.Index*`^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex* +=Union[datetime.timedelta,typing.Sequence[datetime.timedelta]]( +datetime.timedelta"datetime.timedelta` +#typing.Sequence[datetime.timedelta]( +datetime.timedelta"datetime.timedelta"typing.Sequence* + __rfloordiv__;pandas.core.indexes.timedeltas.TimedeltaIndex.__rfloordiv__"l +,pandas.core.indexes.base.Index[builtins.int] + builtins.int" builtins.int"pandas.core.indexes.base.Index*`^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex* +=Union[datetime.timedelta,typing.Sequence[datetime.timedelta]]( +datetime.timedelta"datetime.timedelta` +#typing.Sequence[datetime.timedelta]( +datetime.timedelta"datetime.timedelta"typing.Sequence* astype4pandas.core.indexes.timedeltas.TimedeltaIndex.astype" Any*h self^ @@ -9431,16 +8991,7 @@ bUnion[pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.indexes.timedeltas.T dtype Any** copy - builtins.bool" builtins.bool *c - get_value7pandas.core.indexes.timedeltas.TimedeltaIndex.get_value* -self* - -series* -key*d -get_loc5pandas.core.indexes.timedeltas.TimedeltaIndex.get_loc* -self* -key* - tolerance * + builtins.bool" builtins.bool * searchsorted:pandas.core.indexes.timedeltas.TimedeltaIndex.searchsorted" Any*h self^ @@ -9466,7 +9017,7 @@ bUnion[pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.indexes.timedeltas.T index Any * name -Any 2 +Any 2 __add__5pandas.core.indexes.timedeltas.TimedeltaIndex.__add__ __add__5pandas.core.indexes.timedeltas.TimedeltaIndex.__add__"P &pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex*`^ @@ -9475,16 +9026,55 @@ bUnion[pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.indexes.timedeltas.T __add__5pandas.core.indexes.timedeltas.TimedeltaIndex.__add__"Z +pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex*`^ -pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex*\Z -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex0:typing.overloadX ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex0:typing.overloadX __add__5pandas.core.indexes.timedeltas.TimedeltaIndex.__add__" 2pandas.core.indexes.timedeltas.TimedeltaIndex.Self^ -pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex(* 2pandas.core.indexes.timedeltas.TimedeltaIndex.Self^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex(* -bUnion[pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.indexes.timedeltas.TimedeltaIndex.Self]T +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex(* +uUnion[datetime.timedelta,pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.indexes.timedeltas.TimedeltaIndex.Self]( +datetime.timedelta"datetime.timedeltaT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta 2pandas.core.indexes.timedeltas.TimedeltaIndex.Self^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex(0:typing.overloadX +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex(0:typing.overloadX2 + + __truediv__9pandas.core.indexes.timedeltas.TimedeltaIndex.__truediv__ + __truediv__9pandas.core.indexes.timedeltas.TimedeltaIndex.__truediv__" +2pandas.core.indexes.timedeltas.TimedeltaIndex.Self^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex(* +2pandas.core.indexes.timedeltas.TimedeltaIndex.Self^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex(* +7Union[builtins.complex,typing.Sequence[builtins.float]]$ +builtins.complex"builtins.complexT +typing.Sequence[builtins.float] +builtins.float"builtins.float"typing.Sequence0:typing.overloadX + __truediv__9pandas.core.indexes.timedeltas.TimedeltaIndex.__truediv__"r +.pandas.core.indexes.base.Index[builtins.float] +builtins.float"builtins.float"pandas.core.indexes.base.Index*`^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex* +=Union[datetime.timedelta,typing.Sequence[datetime.timedelta]]( +datetime.timedelta"datetime.timedelta` +#typing.Sequence[datetime.timedelta]( +datetime.timedelta"datetime.timedelta"typing.Sequence0:typing.overloadX2 + + __floordiv__:pandas.core.indexes.timedeltas.TimedeltaIndex.__floordiv__ + __floordiv__:pandas.core.indexes.timedeltas.TimedeltaIndex.__floordiv__" +2pandas.core.indexes.timedeltas.TimedeltaIndex.Self^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex(* +2pandas.core.indexes.timedeltas.TimedeltaIndex.Self^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex(* +7Union[builtins.complex,typing.Sequence[builtins.float]]$ +builtins.complex"builtins.complexT +typing.Sequence[builtins.float] +builtins.float"builtins.float"typing.Sequence0:typing.overloadX + __floordiv__:pandas.core.indexes.timedeltas.TimedeltaIndex.__floordiv__"l +,pandas.core.indexes.base.Index[builtins.int] + builtins.int" builtins.int"pandas.core.indexes.base.Index*`^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex* +=Union[datetime.timedelta,typing.Sequence[datetime.timedelta]]( +datetime.timedelta"datetime.timedelta` +#typing.Sequence[datetime.timedelta]( +datetime.timedelta"datetime.timedelta"typing.Sequence0:typing.overloadX get_objs_combined_axis.pandas.core.indexes.api.get_objs_combined_axis"N #pandas.core.indexes.base.Index[Any] Any"pandas.core.indexes.base.Index* diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.indexes.base.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.indexes.base.protobuf index f75ccda37..77fc74214 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.indexes.base.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.indexes.base.protobuf @@ -1,13 +1,13 @@ pandas.core.indexes.baseS -InvalidIndexError*pandas.core.indexes.base.InvalidIndexError"builtins.Exceptionف -Indexpandas.core.indexes.base.Index"pandas.core.base.IndexOpsMixin*1 -str"pandas.core.indexes.base.Index.str" -kpandas.core.strings.StringMethods[pandas.core.indexes.base.Index.Self,pandas.core.indexes.multi.MultiIndex] -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +InvalidIndexError*pandas.core.indexes.base.InvalidIndexError"builtins.Exception +Indexpandas.core.indexes.base.Index"pandas.core.base.IndexOpsMixin*/ +str"pandas.core.indexes.base.Index.str" +pandas.core.strings.StringMethods[pandas.core.indexes.base.Index.Self,pandas.core.indexes.multi.MultiIndex,TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]]] +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -34,66 +34,24 @@ kpandas.core.strings.StringMethods[pandas.core.indexes.base.Index.Self,pandas.co builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(L -$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex"!pandas.core.strings.StringMethods* -self -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(0:builtins.property`* -asi8#pandas.core.indexes.base.Index.asi8" +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(L +$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex ^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] Any 5numpy.dtype[numpy._typing._array_like._ScalarType_co][ (numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_int64* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_bool"!pandas.core.strings.StringMethods* +self +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -120,20 +78,17 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index0:builtins.property`* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(0:builtins.property`* is_"pandas.core.indexes.base.Index.is_" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -160,21 +115,18 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* other -Any* +Any* __len__&pandas.core.indexes.base.Index.__len__" - builtins.int" builtins.int* -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int* +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -201,22 +153,19 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* __array__(pandas.core.indexes.base.Index.__array__"9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -243,31 +192,28 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* dtype Any *d __array_wrap__-pandas.core.indexes.base.Index.__array_wrap__* self* result* -context * +context * dtype$pandas.core.indexes.base.Index.dtype" STypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]] HUnion[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]I numpy.dtype[numpy.generic] numpy.generic" numpy.generic" numpy.dtypeP -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype"pandas._typing.DtypeObj* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype"pandas._typing.DtypeObj* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -294,20 +240,17 @@ HUnion[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]I builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index0:builtins.property`* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index0:builtins.property`* ravel$pandas.core.indexes.base.Index.ravel" -Any* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -334,26 +277,23 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index*) +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index*) order builtins.str" builtins.str *@ view#pandas.core.indexes.base.Index.view* self* -cls *& +cls *" astype%pandas.core.indexes.base.Index.astype"N #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any"pandas.core.indexes.base.Index* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -380,14 +320,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* dtype TypeAlias[Union[TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],typing.Mapping[Any,Unknown]]] Union[TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],typing.Mapping[Any,Unknown]] @@ -410,13 +347,13 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand typing.Mapping[Any,Unknown] Any"typing.Mapping"pandas._typing.DtypeArg** copy - builtins.bool" builtins.bool * + builtins.bool" builtins.bool * take#pandas.core.indexes.base.Index.take" -Any* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -443,14 +380,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* indices Any*( axis @@ -467,12 +401,12 @@ fill_value self* repeats* -axis *0 -copy#pandas.core.indexes.base.Index.copy" -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +axis *( +copy#pandas.core.indexes.base.Index.copy" +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -499,19 +433,16 @@ fill_value builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* -self -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +self +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -538,14 +469,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* name Any ** deep @@ -557,14 +485,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand __deepcopy__+pandas.core.indexes.base.Index.__deepcopy__* self* -memo * +memo * format%pandas.core.indexes.base.Index.format"J builtins.list[builtins.str] - builtins.str" builtins.str" builtins.list* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.str" builtins.str" builtins.list* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -591,14 +519,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index** +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index** name builtins.bool" builtins.bool * formatter @@ -607,21 +532,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.function"builtins.function None ** na_rep - builtins.str" builtins.str *e -to_native_types.pandas.core.indexes.base.Index.to_native_types* -self* -slicer * - -kwargs*G + builtins.str" builtins.str *G to_flat_index,pandas.core.indexes.base.Index.to_flat_index* -self* +self* to_series(pandas.core.indexes.base.Index.to_series"D pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any"pandas.core.series.Series* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -648,24 +568,21 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* index Any * name -Any * +Any * to_frame'pandas.core.indexes.base.Index.to_frame": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -692,24 +609,21 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index*+ +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index*+ index builtins.bool" builtins.bool * name -Any * +Any * set_names(pandas.core.indexes.base.Index.set_names" -Any* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -736,70 +650,23 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* names Any* level Any *- inplace - builtins.bool" builtins.bool * -rename%pandas.core.indexes.base.Index.rename" -Any* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* -name -Any*- -inplace - builtins.bool" builtins.bool * + builtins.bool" builtins.bool * nlevels&pandas.core.indexes.base.Index.nlevels" - builtins.int" builtins.int* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -826,20 +693,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index0:builtins.property`* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index0:builtins.property`* sortlevel(pandas.core.indexes.base.Index.sortlevel" -Any* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -866,27 +730,24 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* level Any */ ascending builtins.bool" builtins.bool * sort_remaining -Any * +Any * get_level_values/pandas.core.indexes.base.Index.get_level_values"N #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any"pandas.core.indexes.base.Index* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -913,24 +774,21 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index*k +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index*k level` Union[builtins.int,builtins.str] builtins.int" builtins.int - builtins.str" builtins.str* + builtins.str" builtins.str* droplevel(pandas.core.indexes.base.Index.droplevel" -Any* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -957,27 +815,24 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* level LUnion[TypeAlias[Union[typing.Hashable,builtins.int]],builtins.list[Unknown]] .TypeAlias[Union[typing.Hashable,builtins.int]]i #Union[typing.Hashable,builtins.int]" typing.Hashable"typing.Hashable builtins.int" builtins.int"pandas._typing.Level) -builtins.list[Unknown]" builtins.list * +builtins.list[Unknown]" builtins.list * is_monotonic_increasing6pandas.core.indexes.base.Index.is_monotonic_increasing" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1004,20 +859,17 @@ LUnion[TypeAlias[Union[typing.Hashable,builtins.int]],builtins.list[Unknown]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index0:builtins.property`* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index0:builtins.property`* is_monotonic_decreasing6pandas.core.indexes.base.Index.is_monotonic_decreasing" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1044,20 +896,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index0:builtins.property`* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index0:builtins.property`* is_unique(pandas.core.indexes.base.Index.is_unique" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1084,20 +933,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index0:builtins.property`* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index0:builtins.property`* has_duplicates-pandas.core.indexes.base.Index.has_duplicates" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1124,21 +970,18 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index0:builtins.property`* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index0:builtins.property`* is_boolean)pandas.core.indexes.base.Index.is_boolean" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1165,21 +1008,18 @@ is_boolean)pandas.core.indexes.base.Index.is_boolean" builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* is_integer)pandas.core.indexes.base.Index.is_integer" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1206,20 +1046,17 @@ is_integer)pandas.core.indexes.base.Index.is_integer" builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* is_floating*pandas.core.indexes.base.Index.is_floating" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1246,21 +1083,18 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* is_numeric)pandas.core.indexes.base.Index.is_numeric" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1287,20 +1121,17 @@ is_numeric)pandas.core.indexes.base.Index.is_numeric" builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* is_object(pandas.core.indexes.base.Index.is_object" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1327,20 +1158,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* is_categorical-pandas.core.indexes.base.Index.is_categorical" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1367,20 +1195,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* is_interval*pandas.core.indexes.base.Index.is_interval" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1407,20 +1232,19 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* -is_mixed'pandas.core.indexes.base.Index.is_mixed" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index*G + holds_integer,pandas.core.indexes.base.Index.holds_integer* +self* + inferred_type,pandas.core.indexes.base.Index.inferred_type" + builtins.str" builtins.str* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1447,27 +1271,20 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index*G - holds_integer,pandas.core.indexes.base.Index.holds_integer* -self*^ - inferred_type,pandas.core.indexes.base.Index.inferred_type* -self0:builtins.property`*A +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index0:builtins.property`*A __reduce__)pandas.core.indexes.base.Index.__reduce__* -self* +self* hasnans&pandas.core.indexes.base.Index.hasnans" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1494,14 +1311,11 @@ __reduce__)pandas.core.indexes.base.Index.__reduce__* builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index0:builtins.property`*5 +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index0:builtins.property`*5 isna#pandas.core.indexes.base.Index.isna* self*7 notna$pandas.core.indexes.base.Index.notna* @@ -1509,12 +1323,12 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand fillna%pandas.core.indexes.base.Index.fillna* self* value * -downcast *0 -dropna%pandas.core.indexes.base.Index.dropna" -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +downcast *) +dropna%pandas.core.indexes.base.Index.dropna" +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1541,19 +1355,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* -self -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +self +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1580,25 +1391,22 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* how 2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str */ -unique%pandas.core.indexes.base.Index.unique" -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.str" builtins.str *( +unique%pandas.core.indexes.base.Index.unique" +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1625,19 +1433,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* -self -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +self +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1664,21 +1469,18 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* level -Any *3 -drop_duplicates.pandas.core.indexes.base.Index.drop_duplicates" -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any *+ +drop_duplicates.pandas.core.indexes.base.Index.drop_duplicates" +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1705,19 +1507,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* -self -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +self +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1744,14 +1543,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* keep [Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],Literal[builtins.bool]] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] @@ -1761,7 +1557,7 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand Literal[builtins.str]  builtins.str" builtins.str"pandas._typing.NaPosition: Literal[builtins.bool]  - builtins.bool" builtins.bool * + builtins.bool" builtins.bool * duplicated)pandas.core.indexes.base.Index.duplicated" ^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] @@ -1770,11 +1566,11 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] Any 5numpy.dtype[numpy._typing._array_like._ScalarType_co][ (numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1801,14 +1597,11 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* keep IUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.bool]]7 Literal[builtins.str]  @@ -1816,13 +1609,13 @@ IUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.bool]]7 Literal[builtins.str]  builtins.str" builtins.str: Literal[builtins.bool]  - builtins.bool" builtins.bool * + builtins.bool" builtins.bool * __and__&pandas.core.indexes.base.Index.__and__" NoReturn -* -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +* +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1849,22 +1642,19 @@ IUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.bool]]7 builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* NoReturn -* +* __rand__'pandas.core.indexes.base.Index.__rand__" NoReturn -* -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +* +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1891,22 +1681,19 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* NoReturn -* +* __or__%pandas.core.indexes.base.Index.__or__" NoReturn -* -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +* +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1933,22 +1720,19 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* NoReturn -* +* __ror__&pandas.core.indexes.base.Index.__ror__" NoReturn -* -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +* +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1975,22 +1759,19 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* NoReturn -* +* __xor__&pandas.core.indexes.base.Index.__xor__" NoReturn -* -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +* +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2017,22 +1798,19 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* NoReturn -* +* __rxor__'pandas.core.indexes.base.Index.__rxor__" NoReturn -* -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +* +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2059,21 +1837,18 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* NoReturn -*/ -__neg__&pandas.core.indexes.base.Index.__neg__" -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +*( +__neg__&pandas.core.indexes.base.Index.__neg__" +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2100,18 +1875,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2138,20 +1910,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* __nonzero__*pandas.core.indexes.base.Index.__nonzero__" -None* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +None* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2178,21 +1947,18 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* union$pandas.core.indexes.base.Index.union"N #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any"pandas.core.indexes.base.Index* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2219,14 +1985,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* other RUnion[builtins.list[pandas._typing.HashableT],pandas.core.indexes.base.Index[Any]] 'builtins.list[pandas._typing.HashableT]Q @@ -2235,12 +1998,12 @@ RUnion[builtins.list[pandas._typing.HashableT],pandas.core.indexes.base.Index[An #pandas.core.indexes.base.Index[Any] Any"pandas.core.indexes.base.Index* sort -Any *^ - intersection+pandas.core.indexes.base.Index.intersection" -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any *P + intersection+pandas.core.indexes.base.Index.intersection" +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2267,19 +2030,16 @@ RUnion[builtins.list[pandas._typing.HashableT],pandas.core.indexes.base.Index[An builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* -self -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +self +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2306,19 +2066,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(*. -other. -KUnion[builtins.list[pandas._typing.S1],pandas.core.indexes.base.Index.Self] - builtins.list[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(*' +other' +KUnion[builtins.list[pandas._typing.S1],pandas.core.indexes.base.Index.Self] + builtins.list[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2345,18 +2102,15 @@ KUnion[builtins.list[pandas._typing.S1],pandas.core.indexes.base.Index.Self] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype" builtins.list -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset" builtins.list +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2383,22 +2137,19 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(** +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(** sort - builtins.bool" builtins.bool *1 + builtins.bool" builtins.bool ** -difference)pandas.core.indexes.base.Index.difference" -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +difference)pandas.core.indexes.base.Index.difference" +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2425,19 +2176,16 @@ difference)pandas.core.indexes.base.Index.difference" builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* -self -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +self +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2464,14 +2212,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* other =Union[builtins.list[Any],pandas.core.indexes.base.Index[Any]], builtins.list[Any] @@ -2481,12 +2226,12 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand sortG Union[builtins.bool,None] builtins.bool" builtins.bool -None *_ -symmetric_difference3pandas.core.indexes.base.Index.symmetric_difference" -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +None *P +symmetric_difference3pandas.core.indexes.base.Index.symmetric_difference" +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2513,19 +2258,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* -self -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +self +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2552,19 +2294,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(*. -other. -KUnion[builtins.list[pandas._typing.S1],pandas.core.indexes.base.Index.Self] - builtins.list[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(*' +other' +KUnion[builtins.list[pandas._typing.S1],pandas.core.indexes.base.Index.Self] + builtins.list[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2591,18 +2330,15 @@ KUnion[builtins.list[pandas._typing.S1],pandas.core.indexes.base.Index.Self] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype" builtins.list -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset" builtins.list +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2629,24 +2365,30 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* result_name Any * sort -Any * -get_loc&pandas.core.indexes.base.Index.get_loc" -Any* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any * +get_loc&pandas.core.indexes.base.Index.get_loc" +Union[builtins.int,builtins.slice,TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]]] + builtins.int" builtins.int +builtins.slice"builtins.slice +^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2673,14 +2415,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* key &TypeAlias[Union[typing.Hashable,None]]M Union[typing.Hashable,None]" @@ -2717,13 +2456,13 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st method * level * limit * - tolerance * + tolerance * join#pandas.core.indexes.base.Index.join" -Any* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2750,14 +2489,11 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* other Any*' how @@ -2767,15 +2503,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand return_indexers builtins.bool" builtins.bool ** sort - builtins.bool" builtins.bool * + builtins.bool" builtins.bool * values%pandas.core.indexes.base.Index.values"9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2802,20 +2538,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index0:builtins.property`* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index0:builtins.property`* array$pandas.core.indexes.base.Index.array"P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2842,20 +2575,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index0:builtins.property`* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index0:builtins.property`* memory_usage+pandas.core.indexes.base.Index.memory_usage" -Any* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2882,67 +2612,22 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index** +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index** deep builtins.bool" builtins.bool *N where$pandas.core.indexes.base.Index.where* self* cond* -other * -is_type_compatible1pandas.core.indexes.base.Index.is_type_compatible" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* -kind -Any* +other * __contains__+pandas.core.indexes.base.Index.__contains__" - builtins.bool" builtins.bool* -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2969,20 +2654,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index*  -Any* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index*  +Any* __setitem__*pandas.core.indexes.base.Index.__setitem__" -None* -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +None* +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -3009,14 +2691,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index*  +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index*  Any*  Any*D append%pandas.core.indexes.base.Index.append* @@ -3025,13 +2704,13 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand putmask&pandas.core.indexes.base.Index.putmask* self* mask* -value* +value* equals%pandas.core.indexes.base.Index.equals" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -3058,22 +2737,19 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* other -Any* +Any* identical(pandas.core.indexes.base.Index.identical" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -3100,14 +2776,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* other Any*@ asof#pandas.core.indexes.base.Index.asof* @@ -3116,13 +2789,13 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand asof_locs(pandas.core.indexes.base.Index.asof_locs* self* where* -mask* +mask* sort_values*pandas.core.indexes.base.Index.sort_values" -Any* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -3149,24 +2822,21 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index*4 +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index*4 return_indexer builtins.bool" builtins.bool */ ascending - builtins.bool" builtins.bool * + builtins.bool" builtins.bool * sort#pandas.core.indexes.base.Index.sort" -None* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +None* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -3193,24 +2863,21 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* args Any* kwargs -Any* +Any* shift$pandas.core.indexes.base.Index.shift" -None* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +None* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -3237,14 +2904,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index*+ +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index*+ periods builtins.int" builtins.int * freq @@ -3253,58 +2917,7 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand self* args* -kwargs*T - get_value(pandas.core.indexes.base.Index.get_value* -self* - -series* -key* - set_value(pandas.core.indexes.base.Index.set_value" -None* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* -arr -Any* -key -Any* -value -Any*e +kwargs*e get_indexer_non_unique5pandas.core.indexes.base.Index.get_indexer_non_unique* self* @@ -3314,17 +2927,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand target* -kwargs* +kwargs* groupby&pandas.core.indexes.base.Index.groupby" 5builtins.dict[typing.Hashable,numpy.ndarray[Any,Any]]" typing.Hashable"typing.Hashable9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray" builtins.dict* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray" builtins.dict* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -3351,23 +2964,20 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* values -Any* +Any0: typing.finalP* map"pandas.core.indexes.base.Index.map"N #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any"pandas.core.indexes.base.Index* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -3394,18 +3004,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* mapper Any* na_action -Any * +Any * isin#pandas.core.indexes.base.Index.isin" ^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] @@ -3413,11 +3020,11 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] Any 5numpy.dtype[numpy._typing._array_like._ScalarType_co][ (numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -3444,14 +3051,11 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* values Any* level @@ -3479,12 +3083,12 @@ slice_locs)pandas.core.indexes.base.Index.slice_locs* insert%pandas.core.indexes.base.Index.insert* self* loc* -item*0 -drop#pandas.core.indexes.base.Index.drop" -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +item*( +drop#pandas.core.indexes.base.Index.drop" +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -3511,19 +3115,16 @@ slice_locs)pandas.core.indexes.base.Index.slice_locs* builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* -self -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +self +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -3550,25 +3151,22 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* labels Any** errors - builtins.str" builtins.str * + builtins.str" builtins.str * shape$pandas.core.indexes.base.Index.shape"L builtins.tuple[builtins.int] - builtins.int" builtins.int"builtins.tuple* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"builtins.tuple* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -3595,14 +3193,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index0:builtins.property`* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index0:builtins.property`* __eq__%pandas.core.indexes.base.Index.__eq__" ^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] @@ -3610,10 +3205,10 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] Any 5numpy.dtype[numpy._typing._array_like._ScalarType_co][ (numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_bool* -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_bool* +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -3640,19 +3235,16 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index*$" -builtins.object"builtins.object*. -__iter__'pandas.core.indexes.base.Index.__iter__" -"typing.Iterator[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index*$" +builtins.object"builtins.object*& +__iter__'pandas.core.indexes.base.Index.__iter__" +"typing.Iterator[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -3679,17 +3271,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"typing.Iterator* -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Iterator* +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -3716,14 +3305,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* __ne__%pandas.core.indexes.base.Index.__ne__" ^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] @@ -3731,10 +3317,10 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] Any 5numpy.dtype[numpy._typing._array_like._ScalarType_co][ (numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_bool* -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_bool* +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -3761,15 +3347,12 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index*$" -builtins.object"builtins.object*J +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index*$" +builtins.object"builtins.object*? __le__%pandas.core.indexes.base.Index.__le__" ^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] @@ -3777,11 +3360,11 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] Any 5numpy.dtype[numpy._typing._array_like._ScalarType_co][ (numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_bool* -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_bool* +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -3808,19 +3391,16 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(*.. - +rename%pandas.core.indexes.base.Index.rename) +rename%pandas.core.indexes.base.Index.rename" +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -6194,18 +5893,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +self +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -6232,35 +5929,22 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(*  -Union[builtins.slice,TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],typing.Sequence[builtins.int],pandas.core.indexes.base.Index[Any],pandas.core.series.Series[builtins.bool],typing.Sequence[builtins.bool],TypeAlias[Unknown]] -builtins.slice"builtins.slice -^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] -STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] -Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] -Any -5numpy.dtype[numpy._typing._array_like._ScalarType_co][ -(numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray" pandas._typing.np_ndarray_anyintN -typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.SequenceN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Indexe -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.SeriesQ -typing.Sequence[builtins.bool] - builtins.bool" builtins.bool"typing.Sequence8 -TypeAlias[Unknown]"pandas._typing.np_ndarray_bool0:typing.overloadX4 - __getitem__*pandas.core.indexes.base.Index.__getitem__" -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +name +Any*I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool 0:typing.overloadX +rename%pandas.core.indexes.base.Index.rename" +None* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -6287,17 +5971,22 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype* -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* +name +Any*G +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool0:typing.overloadX2_ + __getitem__*pandas.core.indexes.base.Index.__getitem__2 + __getitem__*pandas.core.indexes.base.Index.__getitem__" +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -6324,38 +6013,67 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* -Union[builtins.int,builtins.tuple[TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]]]] - builtins.int" builtins.int -nbuiltins.tuple[TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]]] +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(*  +Union[builtins.slice,TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],typing.Sequence[builtins.int],pandas.core.indexes.base.Index[Any],pandas.core.series.Series[builtins.bool],typing.Sequence[builtins.bool],TypeAlias[Unknown]] +builtins.slice"builtins.slice ^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] Any 5numpy.dtype[numpy._typing._array_like._ScalarType_co][ (numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray" pandas._typing.np_ndarray_anyint"builtins.tuple0:typing.overloadX24 -__mul__&pandas.core.indexes.base.Index.__mul__ -__mul__&pandas.core.indexes.base.Index.__mul__"^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex* -bUnion[pandas.core.indexes.base.Index[builtins.int],pandas.core.indexes.base.Index[builtins.float]]l -,pandas.core.indexes.base.Index[builtins.int] - builtins.int" builtins.int"pandas.core.indexes.base.Indexr -.pandas.core.indexes.base.Index[builtins.float] -builtins.float"builtins.float"pandas.core.indexes.base.Index**( -datetime.timedelta"datetime.timedelta0:typing.overloadX/ -__mul__&pandas.core.indexes.base.Index.__mul__" -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray" pandas._typing.np_ndarray_anyintN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.SequenceN +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Indexe +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.SeriesQ +typing.Sequence[builtins.bool] + builtins.bool" builtins.bool"typing.Sequence8 +TypeAlias[Unknown]"pandas._typing.np_ndarray_bool0:typing.overloadX- + __getitem__*pandas.core.indexes.base.Index.__getitem__" +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -6382,18 +6100,14 @@ bUnion[pandas.core.indexes.base.Index[builtins.int],pandas.core.indexes.base.Ind builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset* +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -6420,30 +6134,35 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(*  -Any0:typing.overloadX23 - __truediv__*pandas.core.indexes.base.Index.__truediv__ - __truediv__*pandas.core.indexes.base.Index.__truediv__" -NoReturn -* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* +Union[builtins.int,builtins.tuple[TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]]]] + builtins.int" builtins.int +nbuiltins.tuple[TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]]] +^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray" pandas._typing.np_ndarray_anyint"builtins.tuple0:typing.overloadX2- +__mul__&pandas.core.indexes.base.Index.__mul__ +__mul__&pandas.core.indexes.base.Index.__mul__"^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex* bUnion[pandas.core.indexes.base.Index[builtins.int],pandas.core.indexes.base.Index[builtins.float]]l ,pandas.core.indexes.base.Index[builtins.int] builtins.int" builtins.int"pandas.core.indexes.base.Indexr .pandas.core.indexes.base.Index[builtins.float] builtins.float"builtins.float"pandas.core.indexes.base.Index**( -datetime.timedelta"datetime.timedelta0:typing.overloadX/ - __truediv__*pandas.core.indexes.base.Index.__truediv__" -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +datetime.timedelta"datetime.timedelta0:typing.overloadX( +__mul__&pandas.core.indexes.base.Index.__mul__" +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -6470,18 +6189,15 @@ bUnion[pandas.core.indexes.base.Index[builtins.int],pandas.core.indexes.base.Ind builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -6508,14 +6224,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(*  +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(*  Any0:typing.overloadXPr= __hash__'pandas.core.indexes.base.Index.__hash__ NonerW diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.indexes.category.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.indexes.category.protobuf index 4990e0d96..406444b80 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.indexes.category.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.indexes.category.protobuf @@ -1,11 +1,11 @@ -pandas.core.indexes.category -CategoricalIndex-pandas.core.indexes.category.CategoricalIndex",pandas.core.indexes.extension.ExtensionIndex"#pandas.core.accessor.PandasDelegate*I -__new__5pandas.core.indexes.category.CategoricalIndex.__new__" -2pandas.core.indexes.category.CategoricalIndex.Self -@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +pandas.core.indexes.category +CategoricalIndex-pandas.core.indexes.category.CategoricalIndex",pandas.core.indexes.extension.ExtensionIndex"#pandas.core.accessor.PandasDelegate*> +__new__5pandas.core.indexes.category.CategoricalIndex.__new__" +2pandas.core.indexes.category.CategoricalIndex.Self +@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -32,20 +32,17 @@ builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"-pandas.core.indexes.category.CategoricalIndex"-pandas.core.indexes.category.CategoricalIndex(* -cls -8Type[pandas.core.indexes.category.CategoricalIndex.Self] -2pandas.core.indexes.category.CategoricalIndex.Self -@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"-pandas.core.indexes.category.CategoricalIndex"-pandas.core.indexes.category.CategoricalIndex(* +cls +8Type[pandas.core.indexes.category.CategoricalIndex.Self] +2pandas.core.indexes.category.CategoricalIndex.Self +@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -72,18 +69,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"-pandas.core.indexes.category.CategoricalIndex"-pandas.core.indexes.category.CategoricalIndex("type* -data -"typing.Iterable[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"-pandas.core.indexes.category.CategoricalIndex"-pandas.core.indexes.category.CategoricalIndex("type* +data +"typing.Iterable[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -110,14 +104,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"typing.Iterable * +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Iterable * categories Any * @@ -131,13 +122,13 @@ categories Any *S equals4pandas.core.indexes.category.CategoricalIndex.equals* self* -other* +other* inferred_type;pandas.core.indexes.category.CategoricalIndex.inferred_type" - builtins.str" builtins.str* -self -@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.str" builtins.str* +self +@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -164,21 +155,18 @@ categories builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"-pandas.core.indexes.category.CategoricalIndex0:builtins.property`*_ +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"-pandas.core.indexes.category.CategoricalIndex0:builtins.property`*_ values4pandas.core.indexes.category.CategoricalIndex.values* -self0:builtins.property`* +self0:builtins.property`* __contains__:pandas.core.indexes.category.CategoricalIndex.__contains__" - builtins.bool" builtins.bool* -@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -205,23 +193,20 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"-pandas.core.indexes.category.CategoricalIndex*  -Any* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"-pandas.core.indexes.category.CategoricalIndex*  +Any* __array__7pandas.core.indexes.category.CategoricalIndex.__array__"9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray* -self -@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray* +self +@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -248,23 +233,20 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"-pandas.core.indexes.category.CategoricalIndex* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"-pandas.core.indexes.category.CategoricalIndex* dtype -Any *& +Any *# astype4pandas.core.indexes.category.CategoricalIndex.astype"N #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index* -self -@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any"pandas.core.indexes.base.Index* +self +@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -291,14 +273,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"-pandas.core.indexes.category.CategoricalIndex* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"-pandas.core.indexes.category.CategoricalIndex* dtype TypeAlias[Union[TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],typing.Mapping[Any,Unknown]]] Union[TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],typing.Mapping[Any,Unknown]] @@ -325,13 +304,13 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand fillna4pandas.core.indexes.category.CategoricalIndex.fillna* self* value * -downcast * +downcast * is_unique7pandas.core.indexes.category.CategoricalIndex.is_unique" - builtins.bool" builtins.bool* -self -@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +self +@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -358,20 +337,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"-pandas.core.indexes.category.CategoricalIndex0:builtins.property`* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"-pandas.core.indexes.category.CategoricalIndex0:builtins.property`* is_monotonic_increasingEpandas.core.indexes.category.CategoricalIndex.is_monotonic_increasing" - builtins.bool" builtins.bool* -self -@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +self +@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -398,20 +374,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"-pandas.core.indexes.category.CategoricalIndex0:builtins.property`* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"-pandas.core.indexes.category.CategoricalIndex0:builtins.property`* is_monotonic_decreasingEpandas.core.indexes.category.CategoricalIndex.is_monotonic_decreasing" - builtins.bool" builtins.bool* -self -@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +self +@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -438,24 +411,21 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"-pandas.core.indexes.category.CategoricalIndex0:builtins.property`*U +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"-pandas.core.indexes.category.CategoricalIndex0:builtins.property`*U unique4pandas.core.indexes.category.CategoricalIndex.unique* self* -level * +level * duplicated8pandas.core.indexes.category.CategoricalIndex.duplicated" -Any* -self -@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any* +self +@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -482,14 +452,11 @@ duplicated8pandas.core.indexes.category.CategoricalIndex.duplicated" builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"-pandas.core.indexes.category.CategoricalIndex* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"-pandas.core.indexes.category.CategoricalIndex* keep IUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.bool]]7 Literal[builtins.str]  @@ -497,14 +464,7 @@ IUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.bool]]7 Literal[builtins.str]  builtins.str" builtins.str: Literal[builtins.bool]  - builtins.bool" builtins.bool *S -get_loc5pandas.core.indexes.category.CategoricalIndex.get_loc* -self* -key*l - get_value7pandas.core.indexes.category.CategoricalIndex.get_value* -self* -seriesArrayLike* -key*] + builtins.bool" builtins.bool *] where3pandas.core.indexes.category.CategoricalIndex.where* self* cond* @@ -527,16 +487,7 @@ IUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.bool]]7 get_indexer_non_uniqueDpandas.core.indexes.category.CategoricalIndex.get_indexer_non_unique* self* -target*` -take_nd5pandas.core.indexes.category.CategoricalIndex.take_nd* -self* -args* - -kwargs*N -map1pandas.core.indexes.category.CategoricalIndex.map* -self* - -mapper*Q +target*Q delete4pandas.core.indexes.category.CategoricalIndex.delete* self* loc*[ diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.indexes.datetimelike.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.indexes.datetimelike.protobuf index d2f3ad9ee..92481c901 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.indexes.datetimelike.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.indexes.datetimelike.protobuf @@ -1,14 +1,14 @@ - pandas.core.indexes.datetimelike -DatetimeIndexOpsMixin6pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin",pandas.core.indexes.extension.ExtensionIndex* + pandas.core.indexes.datetimelike +DatetimeIndexOpsMixin6pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin",pandas.core.indexes.extension.ExtensionIndex* freq;pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin.freq" 2Union[pandas._libs.tslibs.offsets.BaseOffset,None]P &pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset -None* -self -Ipandas.core.indexes.datetimelike.DatetimeIndexOpsMixin[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +None* +self +Ipandas.core.indexes.datetimelike.DatetimeIndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -35,22 +35,19 @@ Ipandas.core.indexes.datetimelike.DatetimeIndexOpsMixin[pandas._typing.S1] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"6pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin0:builtins.property`* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"6pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin0:builtins.property`* freqstr>pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin.freqstr"D Union[builtins.str,None] builtins.str" builtins.str -None* -self -Ipandas.core.indexes.datetimelike.DatetimeIndexOpsMixin[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +None* +self +Ipandas.core.indexes.datetimelike.DatetimeIndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -77,20 +74,17 @@ Ipandas.core.indexes.datetimelike.DatetimeIndexOpsMixin[pandas._typing.S1] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"6pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin0:builtins.property`* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"6pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin0:builtins.property`* is_all_datesCpandas.core.indexes.datetimelike.DatetimeIndexOpsMixin.is_all_dates" - builtins.bool" builtins.bool* -self -Ipandas.core.indexes.datetimelike.DatetimeIndexOpsMixin[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +self +Ipandas.core.indexes.datetimelike.DatetimeIndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -117,20 +111,17 @@ Ipandas.core.indexes.datetimelike.DatetimeIndexOpsMixin[pandas._typing.S1] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"6pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin0:builtins.property`* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"6pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin0:builtins.property`* min:pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin.min" -Any* -self -Ipandas.core.indexes.datetimelike.DatetimeIndexOpsMixin[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any* +self +Ipandas.core.indexes.datetimelike.DatetimeIndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -157,14 +148,11 @@ Ipandas.core.indexes.datetimelike.DatetimeIndexOpsMixin[pandas._typing.S1] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"6pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"6pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin* axis Any *, skipna @@ -172,13 +160,13 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand args Any* kwargs -Any* +Any* argmin=pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin.argmin" -Any* -self -Ipandas.core.indexes.datetimelike.DatetimeIndexOpsMixin[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any* +self +Ipandas.core.indexes.datetimelike.DatetimeIndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -205,14 +193,11 @@ Ipandas.core.indexes.datetimelike.DatetimeIndexOpsMixin[pandas._typing.S1] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"6pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"6pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin* axis Any *, skipna @@ -220,13 +205,13 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand args Any* kwargs -Any* +Any* max:pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin.max" -Any* -self -Ipandas.core.indexes.datetimelike.DatetimeIndexOpsMixin[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any* +self +Ipandas.core.indexes.datetimelike.DatetimeIndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -253,14 +238,11 @@ Ipandas.core.indexes.datetimelike.DatetimeIndexOpsMixin[pandas._typing.S1] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"6pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"6pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin* axis Any *, skipna @@ -268,13 +250,13 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand args Any* kwargs -Any* +Any* argmax=pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin.argmax" -Any* -self -Ipandas.core.indexes.datetimelike.DatetimeIndexOpsMixin[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any* +self +Ipandas.core.indexes.datetimelike.DatetimeIndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -301,14 +283,11 @@ Ipandas.core.indexes.datetimelike.DatetimeIndexOpsMixin[pandas._typing.S1] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"6pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"6pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin* axis Any *, skipna @@ -316,12 +295,12 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand args Any* kwargs -Any* +Any* __rsub__?pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin.__rsub__"^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex* -Ipandas.core.indexes.datetimelike.DatetimeIndexOpsMixin[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex* +Ipandas.core.indexes.datetimelike.DatetimeIndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -348,17 +327,143 @@ Ipandas.core.indexes.datetimelike.DatetimeIndexOpsMixin[pandas._typing.S1] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"6pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin*~ +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"6pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin*~ ;pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin[Any] -Any"6pandas.core.indexes.datetimelike.DatetimeIndexOpsMixinP -DatetimeTimedeltaMixin7pandas.core.indexes.datetimelike.DatetimeTimedeltaMixin"6pandas.core.indexes.datetimelike.DatetimeIndexOpsMixinP* +Any"6pandas.core.indexes.datetimelike.DatetimeIndexOpsMixinPG +DatetimeTimedeltaMixin7pandas.core.indexes.datetimelike.DatetimeTimedeltaMixin"6pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin* +unit + DatetimeIndex+pandas.core.indexes.datetimes.DatetimeIndex"7pandas.core.indexes.datetimelike.DatetimeTimedeltaMixin"5pandas.core.indexes.accessors.DatetimeIndexProperties* __init__4pandas.core.indexes.datetimes.DatetimeIndex.__init__" None*d selfZ @@ -29,10 +29,6 @@ kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[A freq Any * tz -Any */ - normalize - builtins.bool" builtins.bool * -closed Any *- ambiguous builtins.str" builtins.str *. @@ -56,13 +52,11 @@ kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[A Any *N __reduce__6pandas.core.indexes.datetimes.DatetimeIndex.__reduce__* -self* +self* to_series5pandas.core.indexes.datetimes.DatetimeIndex.to_series"H "pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries*d selfZ -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* -keep_tz -Any * ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* index Any * name @@ -72,16 +66,7 @@ __reduce__6pandas.core.indexes.datetimes.DatetimeIndex.__reduce__* selfZ +pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex*( freq - builtins.str" builtins.str *a - get_value5pandas.core.indexes.datetimes.DatetimeIndex.get_value* -self* - -series* -key*b -get_loc3pandas.core.indexes.datetimes.DatetimeIndex.get_loc* -self* -key* - tolerance *x + builtins.str" builtins.str *x slice_indexer9pandas.core.indexes.datetimes.DatetimeIndex.slice_indexer* self* start * @@ -97,13 +82,7 @@ __reduce__6pandas.core.indexes.datetimes.DatetimeIndex.__reduce__* side builtins.str" builtins.str * sorter -Any * -is_type_compatible>pandas.core.indexes.datetimes.DatetimeIndex.is_type_compatible" - builtins.bool" builtins.bool*d -selfZ -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* -typ -Any* +Any * inferred_type9pandas.core.indexes.datetimes.DatetimeIndex.inferred_type" builtins.str" builtins.str*d selfZ @@ -132,13 +111,7 @@ start_time include_start builtins.bool" builtins.bool *1 include_end - builtins.bool" builtins.bool * -to_perioddelta:pandas.core.indexes.datetimes.DatetimeIndex.to_perioddelta"^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex*d -selfZ -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* -freq -Any* + builtins.bool" builtins.bool * to_julian_date:pandas.core.indexes.datetimes.DatetimeIndex.to_julian_date"r .pandas.core.indexes.base.Index[builtins.float] builtins.float"builtins.float"pandas.core.indexes.base.Index*d @@ -160,35 +133,40 @@ AUnion[numpy.dtype[Any],pandas.core.dtypes.dtypes.DatetimeTZDtype]( Any" numpy.dtypeV )pandas.core.dtypes.dtypes.DatetimeTZDtype")pandas.core.dtypes.dtypes.DatetimeTZDtype*d selfZ -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex0:builtins.property`2 ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex0:builtins.property`2 __add__3pandas.core.indexes.datetimes.DatetimeIndex.__add__ __add__3pandas.core.indexes.datetimes.DatetimeIndex.__add__"H "pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries*\Z +pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex*JH -"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries0:typing.overloadX +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries0:typing.overloadX __add__3pandas.core.indexes.datetimes.DatetimeIndex.__add__"Z +pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex*\Z -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* -]Union[pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.indexes.timedeltas.TimedeltaIndex]T ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* +Union[datetime.timedelta,pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.indexes.timedeltas.TimedeltaIndex,pandas._libs.tslibs.offsets.BaseOffset]( +datetime.timedelta"datetime.timedeltaT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex0:typing.overloadX2 +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndexP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset0:typing.overloadX2 __sub__3pandas.core.indexes.datetimes.DatetimeIndex.__sub__ __sub__3pandas.core.indexes.datetimes.DatetimeIndex.__sub__"H "pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries*\Z +pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex*JH -"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries0:typing.overloadX +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries0:typing.overloadX __sub__3pandas.core.indexes.datetimes.DatetimeIndex.__sub__"Z +pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex*\Z -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* -]Union[pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.indexes.timedeltas.TimedeltaIndex]T ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* +Union[datetime.timedelta,pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.indexes.timedeltas.TimedeltaIndex,pandas._libs.tslibs.offsets.BaseOffset]( +datetime.timedelta"datetime.timedeltaT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex0:typing.overloadX +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndexP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset0:typing.overloadX __sub__3pandas.core.indexes.datetimes.DatetimeIndex.__sub__"^ -pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex*\Z -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* -[Union[pandas._libs.tslibs.timestamps.Timestamp,pandas.core.indexes.datetimes.DatetimeIndex]T ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* +mUnion[datetime.datetime,pandas._libs.tslibs.timestamps.Timestamp,pandas.core.indexes.datetimes.DatetimeIndex]& +datetime.datetime"datetime.datetimeT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampZ -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex0:typing.overloadX ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex0:typing.overloadX date_range(pandas.core.indexes.datetimes.date_range"Z +pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* @@ -246,9 +224,11 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"!pandas._typing.IntervalClosedType * -unit -cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]7 + builtins.str" builtins.str"!pandas._typing.IntervalClosedType * +unit +uUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -256,7 +236,7 @@ cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str + builtins.str" builtins.str"pandas._typing.TimeUnit None "< bdate_range)pandas.core.indexes.datetimes.bdate_range bdate_range)pandas.core.indexes.datetimes.bdate_range"Z diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.indexes.interval.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.indexes.interval.protobuf index 083103192..f976147ed 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.indexes.interval.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.indexes.interval.protobuf @@ -709,7 +709,7 @@ aUnion[Tuple[TypeAlias[Any],builtins.int],Unknown,builtins.list[Any],TypeAlias[T Any" numpy.dtype None*\ selfR -'pandas.core.dtypes.dtypes.IntervalDtype"'pandas.core.dtypes.dtypes.IntervalDtype0:builtins.property` +'pandas.core.dtypes.dtypes.IntervalDtype"'pandas.core.dtypes.dtypes.IntervalDtype0:builtins.property` IntervalIndex*pandas.core.indexes.interval.IntervalIndex",pandas.core.indexes.extension.ExtensionIndex"#pandas._libs.interval.IntervalMixin* __new__2pandas.core.indexes.interval.IntervalIndex.__new__" Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] @@ -925,27 +925,6 @@ Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] pandas._typing.IntervalTN #pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex0:builtins.property`* - get_value4pandas.core.indexes.interval.IntervalIndex.get_value" -Any* -self -Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] -pandas._typing.IntervalTN -#pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* -series -/TypeAlias[Type[pandas.core.series.Series[Any]]]t -$Type[pandas.core.series.Series[Any]]D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series"type"$pandas.core.dtypes.generic.ABCSeries* -key -Any* - is_all_dates7pandas.core.indexes.interval.IntervalIndex.is_all_dates" - builtins.bool" builtins.bool* -self -Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] -pandas._typing.IntervalTN -#pandas._libs.interval.Interval[Any] Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex0:builtins.property`2Z from_breaks6pandas.core.indexes.interval.IntervalIndex.from_breaks from_breaks6pandas.core.indexes.interval.IntervalIndex.from_breaks" diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.indexes.multi.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.indexes.multi.protobuf index 5a7ef5e38..497b7a143 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.indexes.multi.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.indexes.multi.protobuf @@ -1,5 +1,5 @@ -pandas.core.indexes.multiئ +pandas.core.indexes.multi MultiIndex$pandas.core.indexes.multi.MultiIndex"pandas.core.indexes.base.Index* __new__,pandas.core.indexes.multi.MultiIndex.__new__" @@ -223,10 +223,6 @@ $pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex*S builtins.bool" builtins.bool * __len__,pandas.core.indexes.multi.MultiIndex.__len__" builtins.int" builtins.int*NL -$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex* - inferred_type2pandas.core.indexes.multi.MultiIndex.inferred_type" - builtins.str" builtins.str*V -selfL $pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex*V values+pandas.core.indexes.multi.MultiIndex.values* self0:builtins.property`* @@ -270,12 +266,7 @@ $pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex"$pan Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str *Z - get_value.pandas.core.indexes.multi.MultiIndex.get_value* -self* - -series* -key* + builtins.str" builtins.str * get_level_values5pandas.core.indexes.multi.MultiIndex.get_level_values"N #pandas.core.indexes.base.Index[Any] Any"pandas.core.indexes.base.Index*V @@ -301,11 +292,7 @@ $pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex*+ allow_duplicates builtins.bool" builtins.bool *M to_flat_index2pandas.core.indexes.multi.MultiIndex.to_flat_index* -self* - is_all_dates1pandas.core.indexes.multi.MultiIndex.is_all_dates" - builtins.bool" builtins.bool*V -selfL -$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex0:builtins.property`*[ +self*[ remove_unused_levels9pandas.core.indexes.multi.MultiIndex.remove_unused_levels* self* nlevels,pandas.core.indexes.multi.MultiIndex.nlevels" @@ -423,10 +410,7 @@ slice_locs/pandas.core.indexes.multi.MultiIndex.slice_locs* start * end * -step *J -get_loc,pandas.core.indexes.multi.MultiIndex.get_loc* -self* -key* +step * get_loc_level2pandas.core.indexes.multi.MultiIndex.get_loc_level" Any*V selfL @@ -458,13 +442,18 @@ $pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex* self* other* -sort * +sort * intersection1pandas.core.indexes.multi.MultiIndex.intersection" -Any*V -selfL -$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex* -other -Any** +Any* +self +)pandas.core.indexes.multi.MultiIndex.SelfL +$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex(* +other +CUnion[builtins.list[Any],pandas.core.indexes.multi.MultiIndex.Self], +builtins.list[Any] +Any" builtins.list +)pandas.core.indexes.multi.MultiIndex.SelfL +$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex(** sort builtins.bool" builtins.bool *^ diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.indexes.period.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.indexes.period.protobuf index 53fc513eb..5c4b5c89f 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.indexes.period.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.indexes.period.protobuf @@ -1,363 +1,5 @@ -pandas.core.indexes.period -DatetimeIndexOpsMixin6pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin",pandas.core.indexes.extension.ExtensionIndex* -freq;pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin.freq" -2Union[pandas._libs.tslibs.offsets.BaseOffset,None]P -&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset -None* -self -Ipandas.core.indexes.datetimelike.DatetimeIndexOpsMixin[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"6pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin0:builtins.property`* -freqstr>pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin.freqstr"D -Union[builtins.str,None] - builtins.str" builtins.str -None* -self -Ipandas.core.indexes.datetimelike.DatetimeIndexOpsMixin[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"6pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin0:builtins.property`* - is_all_datesCpandas.core.indexes.datetimelike.DatetimeIndexOpsMixin.is_all_dates" - builtins.bool" builtins.bool* -self -Ipandas.core.indexes.datetimelike.DatetimeIndexOpsMixin[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"6pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin0:builtins.property`* -min:pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin.min" -Any* -self -Ipandas.core.indexes.datetimelike.DatetimeIndexOpsMixin[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"6pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin* -axis -Any *, -skipna - builtins.bool" builtins.bool * -args -Any* -kwargs -Any* -argmin=pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin.argmin" -Any* -self -Ipandas.core.indexes.datetimelike.DatetimeIndexOpsMixin[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"6pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin* -axis -Any *, -skipna - builtins.bool" builtins.bool * -args -Any* -kwargs -Any* -max:pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin.max" -Any* -self -Ipandas.core.indexes.datetimelike.DatetimeIndexOpsMixin[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"6pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin* -axis -Any *, -skipna - builtins.bool" builtins.bool * -args -Any* -kwargs -Any* -argmax=pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin.argmax" -Any* -self -Ipandas.core.indexes.datetimelike.DatetimeIndexOpsMixin[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"6pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin* -axis -Any *, -skipna - builtins.bool" builtins.bool * -args -Any* -kwargs -Any* -__rsub__?pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin.__rsub__"^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex* -Ipandas.core.indexes.datetimelike.DatetimeIndexOpsMixin[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"6pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin*~ -;pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin[Any] -Any"6pandas.core.indexes.datetimelike.DatetimeIndexOpsMixinPA +pandas.core.indexes.period= PeriodIndex&pandas.core.indexes.period.PeriodIndex"6pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin"1pandas.core.indexes.accessors.PeriodIndexFieldOps* __new__.pandas.core.indexes.period.PeriodIndex.__new__" Any* @@ -430,12 +72,7 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand inferred_type4pandas.core.indexes.period.PeriodIndex.inferred_type" builtins.str" builtins.str*Z selfP -&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex0:builtins.property`*\ - get_value0pandas.core.indexes.period.PeriodIndex.get_value* -self* - -series* -key* +&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex0:builtins.property`* get_indexer2pandas.core.indexes.period.PeriodIndex.get_indexer* self* @@ -446,11 +83,7 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand get_indexer_non_unique=pandas.core.indexes.period.PeriodIndex.get_indexer_non_unique* self* -target*] -get_loc.pandas.core.indexes.period.PeriodIndex.get_loc* -self* -key* - tolerance *T +target*T insert-pandas.core.indexes.period.PeriodIndex.insert* self* loc* @@ -468,14 +101,6 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand return_indexers builtins.bool" builtins.bool ** sort - builtins.bool" builtins.bool * - intersection3pandas.core.indexes.period.PeriodIndex.intersection" -Any*Z -selfP -&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex* -other -Any** -sort builtins.bool" builtins.bool *` difference1pandas.core.indexes.period.PeriodIndex.difference* diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.indexes.range.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.indexes.range.protobuf index 61332bfd4291909f51ceb516d4812b15dab67557..82b55fbfef11a48d8e4d221cafbe799e66ea0367 100644 GIT binary patch delta 124 zcmdnwJ>PYL4AU*=iE_c5PguCvOT<()Y zna%lil1ejkN;30`^@ F0|0=SE0O>J delta 260 zcmbR5y2*Qj4AWcBiE_a_n_0NngXMI{1^ zQY#p_EG7ptnori_R+_w<(RZ>I(>lKY%v>Dt@tJvpandas.core.resample.Resampler[pandas.core.series.Series[Any]]D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series"pandas.core.resample.Resampler* -func -ZUnion[CallableType[builtins.function],Tuple[CallableType[builtins.function],builtins.str]]K -CallableType[builtins.function]& -builtins.function"builtins.function -3Tuple[CallableType[builtins.function],builtins.str]K -CallableType[builtins.function]& -builtins.function"builtins.function - builtins.str" builtins.str* +pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.resample.Resampler*( +ddof + builtins.int" builtins.int *2 + numeric_only + builtins.bool" builtins.bool * args Any* kwargs -Any0:typing.overloadX -pipe#pandas.core.resample.Resampler.pipe" -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar* -self ->pandas.core.resample.Resampler[pandas.core.series.Series[Any]]D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series"pandas.core.resample.Resampler* -func -ZUnion[CallableType[builtins.function],Tuple[CallableType[builtins.function],builtins.str]]K -CallableType[builtins.function]& -builtins.function"builtins.function -3Tuple[CallableType[builtins.function],builtins.str]K -CallableType[builtins.function]& -builtins.function"builtins.function - builtins.str" builtins.str* +Any* +ohlc#pandas.core.resample.Resampler.ohlc": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +self +7pandas.core.resample.Resampler[pandas._typing.NDFrameT]t +pandas._typing.NDFrameT: +pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.resample.Resampler* args Any* kwargs -Any0:typing.overloadX -pipe#pandas.core.resample.Resampler.pipe": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -self ->pandas.core.resample.Resampler[pandas.core.series.Series[Any]]D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series"pandas.core.resample.Resampler* -func -ZUnion[CallableType[builtins.function],Tuple[CallableType[builtins.function],builtins.str]]K -CallableType[builtins.function]& -builtins.function"builtins.function -3Tuple[CallableType[builtins.function],builtins.str]K -CallableType[builtins.function]& -builtins.function"builtins.function - builtins.str" builtins.str* -args -Any* +Any* +size#pandas.core.resample.Resampler.size"b +'pandas.core.series.Series[builtins.int] + builtins.int" builtins.int"pandas.core.series.Series* +self +7pandas.core.resample.Resampler[pandas._typing.NDFrameT]t +pandas._typing.NDFrameT: +pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.resample.Resampler* +quantile'pandas.core.resample.Resampler.quantile"t +pandas._typing.NDFrameT: +pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame* +self +7pandas.core.resample.Resampler[pandas._typing.NDFrameT]t +pandas._typing.NDFrameT: +pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.resample.Resampler* +q +Union[builtins.float,builtins.list[builtins.float],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],pandas.core.series.Series[builtins.float]] +builtins.float"builtins.floatP +builtins.list[builtins.float] +builtins.float"builtins.float" builtins.list +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArrayh +)pandas.core.series.Series[builtins.float] +builtins.float"builtins.float"pandas.core.series.Series * kwargs -Any0:typing.overloadX2' - aggregate(pandas.core.resample.Resampler.aggregate - aggregate(pandas.core.resample.Resampler.aggregate" -AUnion[pandas.core.series.Series[Any],pandas.core.frame.DataFrame]D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series: +Any2& + aggregate(pandas.core.resample.Resampler.aggregate + aggregate(pandas.core.resample.Resampler.aggregate": pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* self ;pandas.core.resample.Resampler[pandas.core.frame.DataFrame]: @@ -533,8 +338,67 @@ RUnion[CallableType[builtins.function],CallableType[builtins.function],numpy.ufu args Any* kwargs -Any0:typing.overloadX2= - interpolate*pandas.core.resample.Resampler.interpolate +Any0:typing.overloadX2 + transform(pandas.core.resample.Resampler.transform + transform(pandas.core.resample.Resampler.transform" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +>pandas.core.resample.Resampler[pandas.core.series.Series[Any]]D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series"pandas.core.resample.Resampler*T +argK +CallableType[builtins.function]& +builtins.function"builtins.function* +args +Any* +kwargs +Any0:typing.overloadX + transform(pandas.core.resample.Resampler.transform": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +self +;pandas.core.resample.Resampler[pandas.core.frame.DataFrame]: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame"pandas.core.resample.Resampler*T +argK +CallableType[builtins.function]& +builtins.function"builtins.function* +args +Any* +kwargs +Any0:typing.overloadX2A + interpolate*pandas.core.resample.Resampler.interpolate interpolate*pandas.core.resample.Resampler.interpolate" None* self @@ -617,14 +481,17 @@ limit_area builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str -None *x -downcasth -!Union[Literal[builtins.str],None]7 +None * +downcast +QUnion[Literal[builtins.str],None,TypeAlias[Literal[pandas._libs.lib._NoDefault]]]7 Literal[builtins.str]  builtins.str" builtins.str -None * +None +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault * kwargs -Any0:typing.overloadX +Any0:typing.overloadX interpolate*pandas.core.resample.Resampler.interpolate"t pandas._typing.NDFrameT: pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame* @@ -708,20 +575,184 @@ limit_area builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str -None *x -downcasth -!Union[Literal[builtins.str],None]7 +None * +downcast +QUnion[Literal[builtins.str],None,TypeAlias[Literal[pandas._libs.lib._NoDefault]]]7 Literal[builtins.str]  builtins.str" builtins.str -None * +None +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault * +kwargs +Any0:typing.overloadX2 +nunique&pandas.core.resample.Resampler.nunique +nunique&pandas.core.resample.Resampler.nunique"b +'pandas.core.series.Series[builtins.int] + builtins.int" builtins.int"pandas.core.series.Series* +self +>pandas.core.resample.Resampler[pandas.core.series.Series[Any]]D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series"pandas.core.resample.Resampler* +args +Any* kwargs -Any0:typing.overloadXPr +Any0:typing.overloadX +nunique&pandas.core.resample.Resampler.nunique": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +self +;pandas.core.resample.Resampler[pandas.core.frame.DataFrame]: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame"pandas.core.resample.Resampler* +args +Any* +kwargs +Any0:typing.overloadX2 +count$pandas.core.resample.Resampler.count +count$pandas.core.resample.Resampler.count"b +'pandas.core.series.Series[builtins.int] + builtins.int" builtins.int"pandas.core.series.Series* +self +>pandas.core.resample.Resampler[pandas.core.series.Series[Any]]D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series"pandas.core.resample.Resampler0:typing.overloadX +count$pandas.core.resample.Resampler.count": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +self +;pandas.core.resample.Resampler[pandas.core.frame.DataFrame]: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame"pandas.core.resample.Resampler0:typing.overloadXPr{ +grouper&pandas.core.resample.Resampler.grouperH +"pandas.core.groupby.ops.BinGrouper""pandas.core.groupby.ops.BinGrouperr +binner%pandas.core.resample.Resampler.binner +Union[pandas.core.indexes.datetimes.DatetimeIndex,pandas.core.indexes.timedeltas.TimedeltaIndex,pandas.core.indexes.period.PeriodIndex]Z ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndexP +&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndexr + +exclusions)pandas.core.resample.Resampler.exclusions] +#builtins.frozenset[typing.Hashable]" +typing.Hashable"typing.Hashable"builtins.frozensetrw +ax!pandas.core.resample.Resampler.axN +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Indexr agg"pandas.core.resample.Resampler.agg^ CallableType[builtins.function]& builtins.function"builtins.function"builtins.functionr apply$pandas.core.resample.Resampler.apply^ CallableType[builtins.function]& -builtins.function"builtins.function"builtins.function* +builtins.function"builtins.function"builtins.function + _GroupByMixin"pandas.core.resample._GroupByMixin"pandas.core.resample.Resampler* + __getitem__.pandas.core.resample._GroupByMixin.__getitem__" +'pandas.core.resample._GroupByMixin.Self +;pandas.core.resample._GroupByMixin[pandas._typing.NDFrameT]t +pandas._typing.NDFrameT: +pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame""pandas.core.resample._GroupByMixin""pandas.core.resample._GroupByMixin(* +'pandas.core.resample._GroupByMixin.Self +;pandas.core.resample._GroupByMixin[pandas._typing.NDFrameT]t +pandas._typing.NDFrameT: +pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame""pandas.core.resample._GroupByMixin""pandas.core.resample._GroupByMixin(*  +AnyPr +key&pandas.core.resample._GroupByMixin.key +4Union[builtins.str,builtins.list[builtins.str],None] + builtins.str" builtins.strJ +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list +Noneg +DatetimeIndexResampler+pandas.core.resample.DatetimeIndexResampler"pandas.core.resample.ResamplerP +DatetimeIndexResamplerGroupby2pandas.core.resample.DatetimeIndexResamplerGroupby""pandas.core.resample._GroupByMixin"+pandas.core.resample.DatetimeIndexResampler* + __getattr__>pandas.core.resample.DatetimeIndexResamplerGroupby.__getattr__" +7pandas.core.resample.DatetimeIndexResamplerGroupby.Self +Kpandas.core.resample.DatetimeIndexResamplerGroupby[pandas._typing.NDFrameT]t +pandas._typing.NDFrameT: +pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"2pandas.core.resample.DatetimeIndexResamplerGroupby"2pandas.core.resample.DatetimeIndexResamplerGroupby(* +7pandas.core.resample.DatetimeIndexResamplerGroupby.Self +Kpandas.core.resample.DatetimeIndexResamplerGroupby[pandas._typing.NDFrameT]t +pandas._typing.NDFrameT: +pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"2pandas.core.resample.DatetimeIndexResamplerGroupby"2pandas.core.resample.DatetimeIndexResamplerGroupby(* + builtins.str" builtins.strPp +PeriodIndexResampler)pandas.core.resample.PeriodIndexResampler"+pandas.core.resample.DatetimeIndexResamplerP +PeriodIndexResamplerGroupby0pandas.core.resample.PeriodIndexResamplerGroupby""pandas.core.resample._GroupByMixin")pandas.core.resample.PeriodIndexResampler* + __getattr__ - __getitem__0pandas.core.series._LocIndexerSeries.__getitem__" -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series +None0:typing.overloadXPц +_LocIndexerSeries$pandas.core.series._LocIndexerSeries" pandas.core.indexing._LocIndexer2 + __getitem__0pandas.core.series._LocIndexerSeries.__getitem__7 + __getitem__0pandas.core.series._LocIndexerSeries.__getitem__" +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -422,17 +397,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype* -7pandas.core.series._LocIndexerSeries[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset* +7pandas.core.series._LocIndexerSeries[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -459,14 +431,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"$pandas.core.series._LocIndexerSeries* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"$pandas.core.series._LocIndexerSeries* Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],builtins.tuple[Unknown]] TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] @@ -486,11 +455,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ builtins.complex"builtins.complex"pandas._typing.Scalar+ -builtins.tuple[Unknown]"builtins.tuple0:typing.overloadXe - __getitem__0pandas.core.series._LocIndexerSeries.__getitem__" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.tuple[Unknown]"builtins.tuple0:typing.overloadX^ + __getitem__0pandas.core.series._LocIndexerSeries.__getitem__" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -517,17 +486,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -7pandas.core.series._LocIndexerSeries[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +7pandas.core.series._LocIndexerSeries[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -554,15 +520,12 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"$pandas.core.series._LocIndexerSeries*66 -Union[TypeAlias[Union[pandas.core.series.Series[builtins.bool],TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],builtins.list[builtins.bool]]],pandas.core.indexes.base.Index[Any],typing.Sequence[builtins.float],builtins.list[builtins.str],builtins.slice,TypeAlias[builtins.tuple[Union[pandas.core.indexes.base.Index[Any],Unknown,TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],builtins.list[pandas._typing.ScalarT],builtins.slice,builtins.tuple[Unknown]]]],CallableType[builtins.function]] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"$pandas.core.series._LocIndexerSeries*77 +Union[TypeAlias[Union[pandas.core.series.Series[builtins.bool],TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],builtins.list[builtins.bool]]],pandas.core.indexes.base.Index[Any],typing.Sequence[builtins.float],builtins.list[builtins.str],builtins.slice,TypeAlias[builtins.tuple[Union[pandas.core.indexes.base.Index[Any],Unknown,TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],builtins.list[pandas._typing.ScalarT],builtins.slice,builtins.tuple[Unknown]]]],typing.Sequence[Unknown],CallableType[builtins.function]] TypeAlias[Union[pandas.core.series.Series[builtins.bool],TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],builtins.list[builtins.bool]]] Union[pandas.core.series.Series[builtins.bool],TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],builtins.list[builtins.bool]]e (pandas.core.series.Series[builtins.bool] @@ -626,15 +589,16 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ builtins.complex"builtins.complex" builtins.list builtins.slice"builtins.slice+ -builtins.tuple[Unknown]"builtins.tuple"builtins.tuple"%pandas.core.indexing._IndexSliceTupleK +builtins.tuple[Unknown]"builtins.tuple"builtins.tuple"%pandas.core.indexing._IndexSliceTuple- +typing.Sequence[Unknown]"typing.SequenceK CallableType[builtins.function]& -builtins.function"builtins.function0:typing.overloadX2 - __setitem__0pandas.core.series._LocIndexerSeries.__setitem__S +builtins.function"builtins.function0:typing.overloadX2 + __setitem__0pandas.core.series._LocIndexerSeries.__setitem__I __setitem__0pandas.core.series._LocIndexerSeries.__setitem__" -None* -7pandas.core.series._LocIndexerSeries[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +None* +7pandas.core.series._LocIndexerSeries[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -661,14 +625,11 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"$pandas.core.series._LocIndexerSeries*  +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"$pandas.core.series._LocIndexerSeries*  Union[pandas.core.indexes.base.Index[Any],TypeAlias[Union[pandas.core.series.Series[builtins.bool],TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],builtins.list[builtins.bool]]]]N #pandas.core.indexes.base.Index[Any] Any"pandas.core.indexes.base.Index @@ -684,10 +645,10 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] (numpy._typing._array_like._ScalarType_co numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_boolM builtins.list[builtins.bool] - builtins.bool" builtins.bool" builtins.list"pandas._typing.MaskType*11 -Union[pandas._typing.S1,TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],pandas.core.series.Series[pandas._typing.S1],None] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool" builtins.list"pandas._typing.MaskType*)) +Union[pandas._typing.S1,TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],pandas.core.series.Series[pandas._typing.S1],None] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -714,23 +675,20 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray"pandas._typing.ArrayLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray"pandas._typing.ArrayLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -757,20 +715,17 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series -None0:typing.overloadX. +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series +None0:typing.overloadX' __setitem__0pandas.core.series._LocIndexerSeries.__setitem__" -None* -7pandas.core.series._LocIndexerSeries[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +None* +7pandas.core.series._LocIndexerSeries[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -797,18 +752,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"$pandas.core.series._LocIndexerSeries* - builtins.str" builtins.str* -Union[pandas._typing.S1,None] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"$pandas.core.series._LocIndexerSeries* + builtins.str" builtins.str* +Union[pandas._typing.S1,None] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -835,20 +787,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype -None0:typing.overloadXL +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset +None0:typing.overloadX~ __setitem__0pandas.core.series._LocIndexerSeries.__setitem__" -None* -7pandas.core.series._LocIndexerSeries[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +None* +7pandas.core.series._LocIndexerSeries[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -875,26 +824,97 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"$pandas.core.series._LocIndexerSeries*@@ +Union[TypeAlias[Union[pandas.core.series.Series[builtins.bool],TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],builtins.list[builtins.bool]]],TypeAlias[Union[builtins.str,numpy.str_]],TypeAlias[builtins.tuple[Union[pandas.core.indexes.base.Index[Any],Unknown,TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],builtins.list[pandas._typing.ScalarT],builtins.slice,builtins.tuple[Unknown]]]],builtins.list[pandas._typing.ScalarT]] +TypeAlias[Union[pandas.core.series.Series[builtins.bool],TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],builtins.list[builtins.bool]]] +Union[pandas.core.series.Series[builtins.bool],TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],builtins.list[builtins.bool]]e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series +^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_boolM +builtins.list[builtins.bool] + builtins.bool" builtins.bool" builtins.list"pandas._typing.MaskType +)TypeAlias[Union[builtins.str,numpy.str_]]Z +Union[builtins.str,numpy.str_] + builtins.str" builtins.str + +numpy.str_" +numpy.str_"pandas._typing.StrLike$ +TypeAlias[builtins.tuple[Union[pandas.core.indexes.base.Index[Any],Unknown,TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],builtins.list[pandas._typing.ScalarT],builtins.slice,builtins.tuple[Unknown]]]]! +builtins.tuple[Union[pandas.core.indexes.base.Index[Any],Unknown,TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],builtins.list[pandas._typing.ScalarT],builtins.slice,builtins.tuple[Unknown]]] +Union[pandas.core.indexes.base.Index[Any],Unknown,TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],builtins.list[pandas._typing.ScalarT],builtins.slice,builtins.tuple[Unknown]]N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"$pandas.core.series._LocIndexerSeries* -nUnion[builtins.list[builtins.int],builtins.list[builtins.str],builtins.list[Union[builtins.str,builtins.int]]]J -builtins.list[builtins.int] - builtins.int" builtins.int" builtins.listJ -builtins.list[builtins.str] - builtins.str" builtins.str" builtins.list -/builtins.list[Union[builtins.str,builtins.int]]` - Union[builtins.str,builtins.int] - builtins.str" builtins.str - builtins.int" builtins.int" builtins.list*11 -Union[pandas._typing.S1,TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],pandas.core.series.Series[pandas._typing.S1],None] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar +%builtins.list[pandas._typing.ScalarT] +pandas._typing.ScalarT + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.floatT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex" builtins.list +builtins.slice"builtins.slice+ +builtins.tuple[Unknown]"builtins.tuple"builtins.tuple"%pandas.core.indexing._IndexSliceTuple +%builtins.list[pandas._typing.ScalarT] +pandas._typing.ScalarT + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.floatT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex" builtins.list*)) +Union[pandas._typing.S1,TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],pandas.core.series.Series[pandas._typing.S1],None] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -921,23 +941,20 @@ nUnion[builtins.list[builtins.int],builtins.list[builtins.str],builtins.list[Uni builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray"pandas._typing.ArrayLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray"pandas._typing.ArrayLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -964,22 +981,19 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series -None0:typing.overloadXPt -Seriespandas.core.series.Series"pandas.core.base.IndexOpsMixin"pandas.core.generic.NDFrame* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series +None0:typing.overloadXPv +Seriespandas.core.series.Series"pandas.core.base.IndexOpsMixin"pandas.core.generic.NDFrame* hasnans!pandas.core.series.Series.hasnans" - builtins.bool" builtins.bool* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1006,21 +1020,18 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series0:builtins.property`*? +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series0:builtins.property`*] divpandas.core.series.Series.div"h )pandas.core.series.Series[builtins.float] -builtins.float"builtins.float"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.float"builtins.float"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1047,19 +1058,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*" -other" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*D +otherD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 @@ -1070,16 +1078,10 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.str" builtins.str9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1106,20 +1108,85 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level None *\ fill_valueJ @@ -1132,11 +1199,11 @@ fill_valueJ Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *Z -rdivpandas.core.series.Series.rdiv" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex *O +rdivpandas.core.series.Series.rdiv" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1163,18 +1230,15 @@ fill_valueJ builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1201,19 +1265,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*' -other& -Union[pandas.core.series.Series[pandas._typing.S1],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]]] -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*# +other# +Union[pandas.core.series.Series[pandas._typing.S1],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]]] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1240,14 +1301,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] @@ -1284,17 +1342,17 @@ fill_valueJ Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex * + builtins.int" builtins.int"pandas._typing.AxisIndex * dtypepandas.core.series.Series.dtype" STypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]] HUnion[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]I numpy.dtype[numpy.generic] numpy.generic" numpy.generic" numpy.dtypeP -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype"pandas._typing.DtypeObj* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype"pandas._typing.DtypeObj* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1321,24 +1379,21 @@ HUnion[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]I builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series0:builtins.property`* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series0:builtins.property`* dtypes pandas.core.series.Series.dtypes" STypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]] HUnion[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]I numpy.dtype[numpy.generic] numpy.generic" numpy.generic" numpy.dtypeP -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype"pandas._typing.DtypeObj* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype"pandas._typing.DtypeObj* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1365,25 +1420,22 @@ HUnion[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]I builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series0:builtins.property`* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series0:builtins.property`* values pandas.core.series.Series.values" OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray"pandas._typing.ArrayLike* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray"pandas._typing.ArrayLike* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1410,20 +1462,17 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series0:builtins.property`* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series0:builtins.property`* arraypandas.core.series.Series.array"P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1450,22 +1499,19 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series0:builtins.property`* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series0:builtins.property`* ravelpandas.core.series.Series.ravel"9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1492,21 +1538,18 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*) +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*) order - builtins.str" builtins.str * + builtins.str" builtins.str * __len__!pandas.core.series.Series.__len__" - builtins.int" builtins.int* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1533,18 +1576,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*. -viewpandas.core.series.Series.view" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*' +viewpandas.core.series.Series.view" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1571,18 +1611,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1609,22 +1646,19 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* dtype -Any * +Any * __array_ufunc__)pandas.core.series.Series.__array_ufunc__" -Any* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1651,14 +1685,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*V +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*V ufuncK CallableType[builtins.function]& builtins.function"builtins.function*( @@ -1667,15 +1698,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand inputs Any* kwargs -Any* +Any* __array__#pandas.core.series.Series.__array__"9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1702,23 +1733,20 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* dtype -Any * +Any * axespandas.core.series.Series.axes", builtins.list[Any] -Any" builtins.list* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" builtins.list* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1745,18 +1773,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series0:builtins.property`*1 -takepandas.core.series.Series.take" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series0:builtins.property`*) +takepandas.core.series.Series.take" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1783,18 +1808,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1821,14 +1843,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*= +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*= indices0 typing.Sequence[Any] Any"typing.Sequence* @@ -1838,16 +1857,12 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *V -is_copyG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None * + builtins.int" builtins.int"pandas._typing.AxisIndex * kwargs -Any*- - __getattr__%pandas.core.series.Series.__getattr__" -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any*& + __getattr__%pandas.core.series.Series.__getattr__" +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1874,17 +1889,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1911,20 +1923,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* - builtins.str" builtins.str* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* + builtins.str" builtins.str* __setitem__%pandas.core.series.Series.__setitem__" -None* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +None* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1951,20 +1960,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*  +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*  Any*  -Any*2 -repeat pandas.core.series.Series.repeat" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any*+ +repeat pandas.core.series.Series.repeat" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1991,18 +1997,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2029,14 +2032,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* repeats /Union[builtins.int,builtins.list[builtins.int]] builtins.int" builtins.intJ @@ -2050,13 +2050,13 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.str" builtins.str7 Literal[builtins.int]  builtins.int" builtins.int"pandas._typing.AxisIndex -None * +None * to_xarray#pandas.core.series.Series.to_xarray" -Any* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2083,20 +2083,17 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*. -itemspandas.core.series.Series.items" -9typing.Iterable[Tuple[typing.Hashable,pandas._typing.S1]] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*' +itemspandas.core.series.Series.items" +9typing.Iterable[Tuple[typing.Hashable,pandas._typing.S1]] (Tuple[typing.Hashable,pandas._typing.S1]" -typing.Hashable"typing.Hashable -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +typing.Hashable"typing.Hashable +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2123,18 +2120,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"typing.Iterable* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Iterable* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2161,21 +2155,18 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* keyspandas.core.series.Series.keys", builtins.list[Any] -Any" builtins.list* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" builtins.list* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2202,20 +2193,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* to_frame"pandas.core.series.Series.to_frame": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2242,22 +2230,19 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*Y +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*Y nameM Union[builtins.object,None]" builtins.object"builtins.object -None *. -modepandas.core.series.Series.mode" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +None *' +modepandas.core.series.Series.mode" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2284,18 +2269,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2322,24 +2304,21 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* dropna -Any * +Any * unique pandas.core.series.Series.unique"9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2366,22 +2345,19 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* duplicated$pandas.core.series.Series.duplicated"e (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2408,14 +2384,11 @@ duplicated$pandas.core.series.Series.duplicated"e builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* keep [Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],Literal[builtins.bool]] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] @@ -2425,15 +2398,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand Literal[builtins.str]  builtins.str" builtins.str"pandas._typing.NaPosition: Literal[builtins.bool]  - builtins.bool" builtins.bool * + builtins.bool" builtins.bool * idxmax pandas.core.series.Series.idxmax"` Union[builtins.int,builtins.str] builtins.int" builtins.int - builtins.str" builtins.str* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.str" builtins.str* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2460,14 +2433,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* axis =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 @@ -2480,15 +2450,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand args Any* kwargs -Any* +Any* idxmin pandas.core.series.Series.idxmin"` Union[builtins.int,builtins.str] builtins.int" builtins.int - builtins.str" builtins.str* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.str" builtins.str* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2515,14 +2485,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* axis =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 @@ -2535,11 +2502,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand args Any* kwargs -Any*. -roundpandas.core.series.Series.round" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any*' +roundpandas.core.series.Series.round" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2566,18 +2533,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2604,26 +2568,23 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*, +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*, decimals builtins.int" builtins.int * args Any* kwargs -Any*0 +Any*) corrpandas.core.series.Series.corr" -builtins.float"builtins.float* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.float"builtins.float* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2650,18 +2611,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -other -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +other +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2688,14 +2646,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* method HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  @@ -2705,13 +2660,13 @@ HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str */ min_periods - builtins.int" builtins.int */ + builtins.int" builtins.int *( covpandas.core.series.Series.cov" -builtins.float"builtins.float* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.float"builtins.float* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2738,18 +2693,15 @@ HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -other -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +other +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2776,104 +2728,23 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*W +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*W min_periodsD Union[builtins.int,None] builtins.int" builtins.int None *( ddof - builtins.int" builtins.int *. -diffpandas.core.series.Series.diff" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*+ -periods - builtins.int" builtins.int * + builtins.int" builtins.int * autocorr"pandas.core.series.Series.autocorr" -builtins.float"builtins.float* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.float"builtins.float* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2900,23 +2771,20 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*' +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*' lag builtins.int" builtins.int *6 __matmul__$pandas.core.series.Series.__matmul__***8 - __rmatmul__%pandas.core.series.Series.__rmatmul__***U -combine!pandas.core.series.Series.combine" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + __rmatmul__%pandas.core.series.Series.__rmatmul__***K +combine!pandas.core.series.Series.combine" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2943,18 +2811,15 @@ __matmul__$pandas.core.series.Series.__matmul__***8 builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -2981,18 +2846,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -other -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +other +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -3019,14 +2881,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*U +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*U funcK CallableType[builtins.function]& builtins.function"builtins.function* @@ -3051,11 +2910,11 @@ fill_value (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ builtins.complex"builtins.complex"pandas._typing.Scalar -None *E - combine_first'pandas.core.series.Series.combine_first" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +None *: + combine_first'pandas.core.series.Series.combine_first" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -3082,18 +2941,15 @@ fill_value builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -3120,18 +2976,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -other -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +other +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -3158,20 +3011,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*N update pandas.core.series.Series.update" -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +None* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -3198,19 +3048,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*E -otherE -Union[pandas.core.series.Series[pandas._typing.S1],typing.Sequence[pandas._typing.S1],typing.Mapping[builtins.int,pandas._typing.S1]] -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*; +other: +Union[pandas.core.series.Series[pandas._typing.S1],typing.Sequence[pandas._typing.S1],typing.Mapping[builtins.int,pandas._typing.S1]] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -3237,17 +3084,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series -"typing.Sequence[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -3274,18 +3118,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"typing.Sequence +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence .typing.Mapping[builtins.int,pandas._typing.S1] - builtins.int" builtins.int -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -3312,21 +3153,18 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"typing.Mapping* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Mapping* argsort!pandas.core.series.Series.argsort"b 'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -3353,14 +3191,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* axis =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 @@ -3380,11 +3215,11 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str"pandas._typing.SortKind * order -None *1 -nlargest"pandas.core.series.Series.nlargest" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +None ** +nlargest"pandas.core.series.Series.nlargest" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -3411,18 +3246,15 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -3449,14 +3281,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*% +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*% n builtins.int" builtins.int * keep @@ -3468,11 +3297,11 @@ ZUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],Literal[bui Literal[builtins.str]  builtins.str" builtins.str"pandas._typing.NaPosition7 Literal[builtins.str]  - builtins.str" builtins.str *1 - nsmallest#pandas.core.series.Series.nsmallest" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.str" builtins.str ** + nsmallest#pandas.core.series.Series.nsmallest" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -3499,18 +3328,15 @@ ZUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],Literal[bui builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -3537,14 +3363,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*% +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*% n builtins.int" builtins.int * keep @@ -3556,11 +3379,11 @@ ZUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],Literal[bui Literal[builtins.str]  builtins.str" builtins.str"pandas._typing.NaPosition7 Literal[builtins.str]  - builtins.str" builtins.str *1 - swaplevel#pandas.core.series.Series.swaplevel" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.str" builtins.str ** + swaplevel#pandas.core.series.Series.swaplevel" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -3587,18 +3410,15 @@ ZUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],Literal[bui builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -3625,14 +3445,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* i .TypeAlias[Union[typing.Hashable,builtins.int]]i #Union[typing.Hashable,builtins.int]" @@ -3644,11 +3461,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand typing.Hashable"typing.Hashable builtins.int" builtins.int"pandas._typing.Level ** copy - builtins.bool" builtins.bool *. -reorder_levels(pandas.core.series.Series.reorder_levels" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool *' +reorder_levels(pandas.core.series.Series.reorder_levels" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -3675,18 +3492,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -3713,21 +3527,18 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*7 +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*7 order, builtins.list[Any] -Any" builtins.list*. -explode!pandas.core.series.Series.explode" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" builtins.list*' +explode!pandas.core.series.Series.explode" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -3754,18 +3565,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -3792,20 +3600,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* unstack!pandas.core.series.Series.unstack": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -3832,14 +3637,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* level .TypeAlias[Union[typing.Hashable,builtins.int]]i #Union[typing.Hashable,builtins.int]" @@ -3853,100 +3655,17 @@ fill_value builtins.dict[Any,Any] Any Any" builtins.dict -None */ -mappandas.core.series.Series.map" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -arg -Any*y - na_actionh -!Union[Literal[builtins.str],None]7 -Literal[builtins.str]  - builtins.str" builtins.str -None *3 +None *0 alignpandas.core.series.Series.align" DTuple[pandas.core.series.Series[Any],pandas.core.series.Series[Any]]D pandas.core.series.Series[Any] Any"pandas.core.series.SeriesD pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -3973,14 +3692,11 @@ DTuple[pandas.core.series.Series[Any],pandas.core.series.Series[Any]]D builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* other AUnion[pandas.core.frame.DataFrame,pandas.core.series.Series[Any]]: pandas.core.frame.DataFrame"pandas.core.frame.DataFrameD @@ -4058,14 +3774,12 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.str" builtins.str7 Literal[builtins.int]  builtins.int" builtins.int"pandas._typing.AxisIndex -None *6 - reindex_like&pandas.core.series.Series.reindex_like"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +None *C + reindex_like&pandas.core.series.Series.reindex_like" +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -4092,18 +3806,16 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -other -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(* +self +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -4130,14 +3842,46 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(* +other +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* method Union[builtins.str,TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],Literal[builtins.str],None] builtins.str" builtins.str @@ -4163,11 +3907,11 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st toleranceJ Union[builtins.float,None] builtins.float"builtins.float -None *1 -shiftpandas.core.series.Series.shift" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +None ** +shiftpandas.core.series.Series.shift" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -4194,18 +3938,15 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -4232,14 +3973,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*+ +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*+ periods builtins.int" builtins.int * freq @@ -4255,13 +3993,13 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand fill_valueM Union[builtins.object,None]" builtins.object"builtins.object -None * +None * memory_usage&pandas.core.series.Series.memory_usage" - builtins.int" builtins.int* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -4288,25 +4026,22 @@ fill_valueM builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*+ +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*+ index builtins.bool" builtins.bool ** deep - builtins.bool" builtins.bool *0 + builtins.bool" builtins.bool *) isinpandas.core.series.Series.isin"e (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -4333,21 +4068,18 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -values +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +values _Union[typing.Iterable[Any],pandas.core.series.Series[pandas._typing.S1],builtins.dict[Any,Any]]0 typing.Iterable[Any] -Any"typing.Iterable -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any"typing.Iterable +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -4374,24 +4106,21 @@ _Union[typing.Iterable[Any],pandas.core.series.Series[pandas._typing.S1],builtin builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series9 +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series9 builtins.dict[Any,Any] Any -Any" builtins.dict*E +Any" builtins.dict*A between!pandas.core.series.Series.between"e (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -4418,14 +4147,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* left Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],TypeAlias[Union[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]]] TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] @@ -4497,14 +4223,14 @@ uUnion[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str * + builtins.str" builtins.str * isnapandas.core.series.Series.isna"e (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -4531,21 +4257,18 @@ uUnion[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* isnull pandas.core.series.Series.isnull"e (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -4572,21 +4295,18 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* notnapandas.core.series.Series.notna"e (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -4613,21 +4333,18 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* notnull!pandas.core.series.Series.notnull"e (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -4654,18 +4371,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*2 - to_timestamp&pandas.core.series.Series.to_timestamp" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*+ + to_timestamp&pandas.core.series.Series.to_timestamp" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -4692,18 +4406,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -4730,14 +4441,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* freq Any * how @@ -4752,13 +4460,13 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str""pandas._typing.TimestampConvention ** copy - builtins.bool" builtins.bool * + builtins.bool" builtins.bool * to_period#pandas.core.series.Series.to_period": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -4785,29 +4493,28 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*P +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*P freqD Union[builtins.str,None] builtins.str" builtins.str None ** copy - builtins.bool" builtins.bool * -strpandas.core.series.Series.str" -]pandas.core.strings.StringMethods[pandas.core.series.Series[Any],pandas.core.frame.DataFrame]D + builtins.bool" builtins.bool * +strpandas.core.series.Series.str" +pandas.core.strings.StringMethods[pandas.core.series.Series[Any],pandas.core.frame.DataFrame,pandas.core.series.Series[builtins.bool]]D pandas.core.series.Series[Any] Any"pandas.core.series.Series: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame"!pandas.core.strings.StringMethods* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +pandas.core.frame.DataFrame"pandas.core.frame.DataFramee +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series"!pandas.core.strings.StringMethods* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -4834,20 +4541,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series0:builtins.property`* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series0:builtins.property`* dtpandas.core.series.Series.dt"| - + interpolate%pandas.core.series.Series.interpolate" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -6385,18 +6071,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -6423,14 +6106,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* method TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 @@ -6508,8 +6188,8 @@ limit_area builtins.str" builtins.str None * kwargs -Any*P -asofpandas.core.series.Series.asof"& +Any*I +asofpandas.core.series.Series.asof"# Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1]] TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] @@ -6528,10 +6208,10 @@ limit_area builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.complex"builtins.complex"pandas._typing.Scalar +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -6558,18 +6238,15 @@ limit_area builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -6596,14 +6273,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* where Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],typing.Sequence[Unknown]] TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] @@ -6630,11 +6304,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.str" builtins.strN typing.Sequence[builtins.str] builtins.str" builtins.str"typing.Sequence -None *; -clippandas.core.series.Series.clip" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +None *4 +clippandas.core.series.Series.clip" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -6661,18 +6335,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -6699,14 +6370,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* lower Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.float,None] kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] @@ -6745,11 +6413,11 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] inplace builtins.bool" builtins.bool * kwargs -Any*E -asfreq pandas.core.series.Series.asfreq" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any*= +asfreq pandas.core.series.Series.asfreq" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -6776,18 +6444,15 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -6814,14 +6479,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* freq Any* method @@ -6867,11 +6529,11 @@ fill_value (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ builtins.complex"builtins.complex"pandas._typing.Scalar -None *2 -at_time!pandas.core.series.Series.at_time" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +None *+ +at_time!pandas.core.series.Series.at_time" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -6898,18 +6560,15 @@ fill_value builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -6936,14 +6595,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*m +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*m timec !Union[builtins.str,datetime.time] builtins.str" builtins.str @@ -6958,11 +6614,11 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.str" builtins.str7 Literal[builtins.int]  builtins.int" builtins.int"pandas._typing.AxisIndex -None *2 - between_time&pandas.core.series.Series.between_time" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +None *+ + between_time&pandas.core.series.Series.between_time" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -6989,18 +6645,15 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -7027,14 +6680,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*s +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*s start_timec !Union[builtins.str,datetime.time] @@ -7052,15 +6702,11 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.str" builtins.str7 Literal[builtins.int]  builtins.int" builtins.int"pandas._typing.AxisIndex -None ** -resample"pandas.core.series.Series.resample" ->pandas.core.resample.Resampler[pandas.core.series.Series[Any]]D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series"pandas.core.resample.Resampler* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +None *' +firstpandas.core.series.Series.first" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -7087,130 +6733,20 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -rule -Any* -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *R -closedD -Union[builtins.str,None] - builtins.str" builtins.str -None *Q -labelD -Union[builtins.str,None] - builtins.str" builtins.str -None * - -convention -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str""pandas._typing.TimestampConvention * -kind -7Union[Literal[builtins.str],Literal[builtins.str],None]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str -None * -loffset -Any *( -base - builtins.int" builtins.int *N -onD -Union[builtins.str,None] - builtins.str" builtins.str -None * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None * -origin -Union[pandas._libs.tslibs.timestamps.Timestamp,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]T -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str * -offset -AUnion[pandas._libs.tslibs.timedeltas.Timedelta,builtins.str,None]T -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta - builtins.str" builtins.str -None *. -firstpandas.core.series.Series.first" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.float$ builtins.complex"builtins.complex @@ -7232,20 +6768,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* offset -Any*. -lastpandas.core.series.Series.last" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any*' +lastpandas.core.series.Series.last" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -7272,18 +6805,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -7310,23 +6840,20 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* offset -Any* -rankpandas.core.series.Series.rank"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any* +rankpandas.core.series.Series.rank"h +)pandas.core.series.Series[builtins.float] +builtins.float"builtins.float"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -7353,14 +6880,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* axis =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 @@ -7393,11 +6917,11 @@ HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 ascending builtins.bool" builtins.bool *) pct - builtins.bool" builtins.bool *N -wherepandas.core.series.Series.where" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool *C +wherepandas.core.series.Series.where" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -7424,18 +6948,15 @@ HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -7462,19 +6983,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -cond -Union[pandas.core.series.Series[pandas._typing.S1],pandas.core.series.Series[builtins.bool],numpy.ndarray[Any,Any],CallableType[builtins.function],CallableType[builtins.function]] -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +cond +Union[pandas.core.series.Series[pandas._typing.S1],pandas.core.series.Series[builtins.bool],numpy.ndarray[Any,Any],CallableType[builtins.function],CallableType[builtins.function]] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -7501,14 +7019,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Seriese +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Seriese (pandas.core.series.Series[builtins.bool] builtins.bool" builtins.bool"pandas.core.series.Series9 numpy.ndarray[Any,Any] @@ -7537,13 +7052,11 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] #Union[typing.Hashable,builtins.int]" typing.Hashable"typing.Hashable builtins.int" builtins.int"pandas._typing.Level -None *. -try_cast - builtins.bool" builtins.bool *e -maskpandas.core.series.Series.mask" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +None *i +maskpandas.core.series.Series.mask" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -7570,18 +7083,15 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -7608,29 +7118,57 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +cond +Union[pandas.core.series.Series[pandas._typing.S1],pandas.core.series.Series[builtins.bool],numpy.ndarray[Any,Any],CallableType[builtins.function],CallableType[builtins.function]] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -cond -TypeAlias[Union[pandas.core.series.Series[builtins.bool],TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],builtins.list[builtins.bool]]] -Union[pandas.core.series.Series[builtins.bool],TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],builtins.list[builtins.bool]]e +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Seriese (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series -^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] -STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] -Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] -Any -5numpy.dtype[numpy._typing._array_like._ScalarType_co][ -(numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_boolM -builtins.list[builtins.bool] - builtins.bool" builtins.bool" builtins.list"pandas._typing.MaskType*) -other) + builtins.bool" builtins.bool"pandas.core.series.Series9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarrayK +CallableType[builtins.function]& +builtins.function"builtins.functionK +CallableType[builtins.function]& +builtins.function"builtins.function*% +other% Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1],pandas.core.frame.DataFrame,CallableType[builtins.function],pandas._libs.missing.NAType,None] TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] @@ -7649,10 +7187,10 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.complex"builtins.complex"pandas._typing.Scalar +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -7679,14 +7217,11 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series: +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series: pandas.core.frame.DataFrame"pandas.core.frame.DataFrameK CallableType[builtins.function]& builtins.function"builtins.function: @@ -7709,13 +7244,14 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] #Union[typing.Hashable,builtins.int]" typing.Hashable"typing.Hashable builtins.int" builtins.int"pandas._typing.Level -None *. -try_cast - builtins.bool" builtins.bool *0 - slice_shift%pandas.core.series.Series.slice_shift" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +None *6 + case_when#pandas.core.series.Series.case_when"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -7742,18 +7278,57 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*" +caselist" +builtins.list[Tuple[Union[typing.Sequence[builtins.bool],pandas.core.series.Series[builtins.bool],CallableType[builtins.function]],Union[TypeAlias[Union[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],CallableType[builtins.function]]]] +Tuple[Union[typing.Sequence[builtins.bool],pandas.core.series.Series[builtins.bool],CallableType[builtins.function]],Union[TypeAlias[Union[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],CallableType[builtins.function]]] +nUnion[typing.Sequence[builtins.bool],pandas.core.series.Series[builtins.bool],CallableType[builtins.function]]Q +typing.Sequence[builtins.bool] + builtins.bool" builtins.bool"typing.Sequencee +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.SeriesK +CallableType[builtins.function]& +builtins.function"builtins.function +Union[TypeAlias[Union[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],CallableType[builtins.function]] +TypeAlias[Union[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]] +uUnion[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]0 +typing.Sequence[Any] +Any"typing.Sequence9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarrayD +pandas.core.series.Series[Any] +Any"pandas.core.series.SeriesN +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index"pandas._typing.ListLikeU +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.ScalarK +CallableType[builtins.function]& +builtins.function"builtins.function" builtins.list*, +truncate"pandas.core.series.Series.truncate" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -7780,27 +7355,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*+ -periods - builtins.int" builtins.int * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *0 -tshift pandas.core.series.Series.tshift" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -7827,18 +7390,39 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +before +3Union[datetime.date,builtins.str,builtins.int,None] + datetime.date" datetime.date + builtins.str" builtins.str + builtins.int" builtins.int +None * +after +3Union[datetime.date,builtins.str,builtins.int,None] + datetime.date" datetime.date + builtins.str" builtins.str + builtins.int" builtins.int +None * +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None ** +copy + builtins.bool" builtins.bool *+ + +tz_convert$pandas.core.series.Series.tz_convert" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -7865,29 +7449,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*+ -periods - builtins.int" builtins.int * -freq -Any * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *4 -truncate"pandas.core.series.Series.truncate" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -7914,152 +7484,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -before -3Union[datetime.date,builtins.str,builtins.int,None] - datetime.date" datetime.date - builtins.str" builtins.str - builtins.int" builtins.int -None * -after -3Union[datetime.date,builtins.str,builtins.int,None] - datetime.date" datetime.date - builtins.str" builtins.str - builtins.int" builtins.int -None * -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None ** -copy - builtins.bool" builtins.bool *2 - -tz_convert$pandas.core.series.Series.tz_convert" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* tz Any* axis @@ -8077,11 +7506,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.int" builtins.int"pandas._typing.Level None ** copy - builtins.bool" builtins.bool *3 - tz_localize%pandas.core.series.Series.tz_localize" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool *, + tz_localize%pandas.core.series.Series.tz_localize" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -8108,18 +7537,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -8146,14 +7572,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* tz Any* axis @@ -8175,11 +7598,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand ambiguous Any */ nonexistent - builtins.str" builtins.str *. -abspandas.core.series.Series.abs" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.str" builtins.str *& +abspandas.core.series.Series.abs" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -8206,18 +7629,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -8244,18 +7664,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*u -describe"pandas.core.series.Series.describe" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*c +describe"pandas.core.series.Series.describe" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -8282,18 +7699,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -8320,26 +7734,23 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* percentiles )Union[builtins.list[builtins.float],None]P builtins.list[builtins.float] builtins.float"builtins.float" builtins.list -None * -include +None * +include BUnion[Literal[builtins.str],builtins.list[pandas._typing.S1],None]7 Literal[builtins.str]  - builtins.str" builtins.str - builtins.list[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.str" builtins.str + builtins.list[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -8366,19 +7777,16 @@ BUnion[Literal[builtins.str],builtins.list[pandas._typing.S1],None]7 builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype" builtins.list -None *- -exclude- ->Union[pandas._typing.S1,builtins.list[pandas._typing.S1],None] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset" builtins.list +None *& +exclude& +>Union[pandas._typing.S1,builtins.list[pandas._typing.S1],None] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -8405,17 +7813,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype - builtins.list[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset + builtins.list[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -8442,24 +7847,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype" builtins.list -None *b -datetime_is_numericG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None */ +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset" builtins.list +None *( -pct_change$pandas.core.series.Series.pct_change" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +pct_change$pandas.core.series.Series.pct_change" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -8486,18 +7884,15 @@ pct_change$pandas.core.series.Series.pct_change" builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -8524,14 +7919,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*+ +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*+ periods builtins.int" builtins.int */ fill_method @@ -8543,7 +7935,7 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand freq Any * kwargs -Any*$ +Any*! first_valid_index+pandas.core.series.Series.first_valid_index" TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] @@ -8562,11 +7954,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.complex"builtins.complex"pandas._typing.Scalar* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -8593,14 +7985,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*$ +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*! last_valid_index*pandas.core.series.Series.last_valid_index" TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] @@ -8619,11 +8008,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.complex"builtins.complex"pandas._typing.Scalar* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -8650,21 +8039,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* - value_counts&pandas.core.series.Series.value_counts"b -'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*' + transpose#pandas.core.series.Series.transpose" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -8691,30 +8074,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*/ - normalize - builtins.bool" builtins.bool ** -sort - builtins.bool" builtins.bool */ - ascending - builtins.bool" builtins.bool *P -binsD -Union[builtins.int,None] - builtins.int" builtins.int -None *, -dropna - builtins.bool" builtins.bool *. - transpose#pandas.core.series.Series.transpose" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -8741,18 +8109,20 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +args +Any* +kwargs +Any*( +Tpandas.core.series.Series.T" +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -8779,22 +8149,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -args -Any* -kwargs -Any*. -Tpandas.core.series.Series.T" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(* +self +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -8821,18 +8185,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(0:builtins.property`*k +__div__!pandas.core.series.Series.__div__" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -8859,18 +8220,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series0:builtins.property`*P -__div__!pandas.core.series.Series.__div__" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -8897,18 +8255,30 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*D +otherD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -8935,39 +8305,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*" -other" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -8994,20 +8339,14 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -__eq__ pandas.core.series.Series.__eq__"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -9034,21 +8373,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*$" -builtins.object"builtins.object*: - __floordiv__&pandas.core.series.Series.__floordiv__"b -'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +__eq__ pandas.core.series.Series.__eq__"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -9075,38 +8410,18 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*"" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*$" +builtins.object"builtins.object*X + __floordiv__&pandas.core.series.Series.__floordiv__"b +'pandas.core.series.Series[builtins.int] + builtins.int" builtins.int"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -9133,20 +8448,29 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*Q -__ge__ pandas.core.series.Series.__ge__"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*DD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -9173,17 +8497,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*99 -Union[pandas._typing.S1,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1],datetime.datetime,datetime.timedelta] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -9210,36 +8531,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -9266,22 +8565,17 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta*Q -__gt__ pandas.core.series.Series.__gt__"e +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*l +__ge__ pandas.core.series.Series.__ge__"e (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -9308,17 +8602,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*99 -Union[pandas._typing.S1,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1],datetime.datetime,datetime.timedelta] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*WW +Union[pandas._typing.S1,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1],datetime.datetime,datetime.timedelta,datetime.date] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -9345,16 +8636,13 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 @@ -9365,16 +8653,10 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.str" builtins.str9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -9401,22 +8683,14 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta*Q -__le__ pandas.core.series.Series.__le__"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -9443,17 +8717,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*99 -Union[pandas._typing.S1,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1],datetime.datetime,datetime.timedelta] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -9480,36 +8751,20 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta + datetime.date" datetime.date*l +__gt__ pandas.core.series.Series.__gt__"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -9536,22 +8791,14 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta*Q -__lt__ pandas.core.series.Series.__lt__"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*WW +Union[pandas._typing.S1,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1],datetime.datetime,datetime.timedelta,datetime.date] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -9578,17 +8825,27 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*99 -Union[pandas._typing.S1,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1],datetime.datetime,datetime.timedelta] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -9615,36 +8872,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -9671,20 +8906,54 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series& +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta*P -__mod__!pandas.core.series.Series.__mod__" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta + datetime.date" datetime.date*l +__le__ pandas.core.series.Series.__le__"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -9711,17 +8980,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*WW +Union[pandas._typing.S1,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1],datetime.datetime,datetime.timedelta,datetime.date] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -9748,18 +9014,13 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*"" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 @@ -9770,16 +9031,10 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.str" builtins.str9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -9806,20 +9061,14 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -__ne__ pandas.core.series.Series.__ne__"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -9846,19 +9095,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*$" -builtins.object"builtins.object*P -__pow__!pandas.core.series.Series.__pow__" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -9885,17 +9129,20 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta + datetime.date" datetime.date*l +__lt__ pandas.core.series.Series.__lt__"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -9922,38 +9169,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*"" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*WW +Union[pandas._typing.S1,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1],datetime.datetime,datetime.timedelta,datetime.date] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -9980,18 +9203,27 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*P -__radd__"pandas.core.series.Series.__radd__" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -10018,17 +9250,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -10055,39 +9284,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*"" -Union[builtins.complex,builtins.str,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex - builtins.str" builtins.str -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -10114,18 +9318,18 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*P -__rdiv__"pandas.core.series.Series.__rdiv__" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta + datetime.date" datetime.date*k +__mod__!pandas.core.series.Series.__mod__" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -10152,17 +9356,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -10189,18 +9390,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*"" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*DD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 @@ -10211,16 +9409,10 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.str" builtins.str9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -10247,18 +9439,14 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*P - __rdivmod__%pandas.core.series.Series.__rdivmod__" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -10285,18 +9473,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -10323,39 +9507,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*" -other" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +__ne__ pandas.core.series.Series.__ne__"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -10382,18 +9544,16 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*P - __rfloordiv__'pandas.core.series.Series.__rfloordiv__" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*$" +builtins.object"builtins.object*k +__pow__!pandas.core.series.Series.__pow__" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -10420,17 +9580,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -10457,18 +9614,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*"" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*DD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 @@ -10479,16 +9633,10 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.str" builtins.str9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -10515,18 +9663,14 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*P -__rmod__"pandas.core.series.Series.__rmod__" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -10553,17 +9697,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -10590,43 +9731,20 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*"" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*k +__rdiv__"pandas.core.series.Series.__rdiv__" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.float$ builtins.complex"builtins.complex @@ -10648,20 +9766,14 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*# -__rmul__"pandas.core.series.Series.__rmul__"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -10688,18 +9800,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*  -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[Any]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*DD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 @@ -10710,19 +9819,10 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.str" builtins.str9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLikeD -pandas.core.series.Series[Any] -Any"pandas.core.series.Series*P - __rnatmul__%pandas.core.series.Series.__rnatmul__" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -10749,18 +9849,14 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -10787,39 +9883,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*" -other" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -10846,18 +9917,15 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*P -__rpow__"pandas.core.series.Series.__rpow__" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*k + __rdivmod__%pandas.core.series.Series.__rdivmod__" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -10884,17 +9952,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -10921,18 +9987,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*"" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*D +otherD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 @@ -10943,16 +10007,10 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.str" builtins.str9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -10979,20 +10037,14 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*: -__rsub__"pandas.core.series.Series.__rsub__"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -11019,38 +10071,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*"" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -11077,20 +10105,15 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*: - __truediv__%pandas.core.series.Series.__truediv__"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*k + __rfloordiv__'pandas.core.series.Series.__rfloordiv__" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -11117,38 +10140,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*"" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -11175,21 +10174,29 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* - -__invert__$pandas.core.series.Series.__invert__"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*DD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -11216,20 +10223,14 @@ __invert__$pandas.core.series.Series.__invert__"e builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -atpandas.core.series.Series.at"B -pandas.core.indexing._AtIndexer"pandas.core.indexing._AtIndexer* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -11256,20 +10257,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series0:builtins.property`* -catpandas.core.series.Series.cat"h -2pandas.core.arrays.categorical.CategoricalAccessor"2pandas.core.arrays.categorical.CategoricalAccessor* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -11296,20 +10291,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series0:builtins.property`* -iatpandas.core.series.Series.iat"D - pandas.core.indexing._iAtIndexer" pandas.core.indexing._iAtIndexer* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*k +__rmod__"pandas.core.series.Series.__rmod__" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -11336,18 +10326,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series0:builtins.property`*. -ilocpandas.core.series.Series.iloc" -8pandas.core.series._iLocIndexerSeries[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -11374,18 +10360,29 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"%pandas.core.series._iLocIndexerSeries* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*DD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -11412,18 +10409,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series0:builtins.property`*. -locpandas.core.series.Series.loc" -7pandas.core.series._LocIndexerSeries[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -11450,18 +10443,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"$pandas.core.series._LocIndexerSeries* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -11488,18 +10477,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series0:builtins.property`*X -addpandas.core.series.Series.add" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*k + __rnatmul__%pandas.core.series.Series.__rnatmul__" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -11526,18 +10512,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -11564,19 +10547,30 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*' -other& -Union[pandas.core.series.Series[pandas._typing.S1],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]]] -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*D +otherD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -11603,52 +10597,48 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 + datetime.date" datetime.date + datetime.time" datetime.time builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar* -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *\ - -fill_valueJ -Union[builtins.float,None] -builtins.float"builtins.float -None *( -axis - builtins.int" builtins.int * -allpandas.core.series.Series.all" - builtins.bool" builtins.bool* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -11675,35 +10665,15 @@ fill_valueJ builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *X - bool_onlyG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None *, -skipna - builtins.bool" builtins.bool * -kwargs -Any* -anypandas.core.series.Series.any" - builtins.bool" builtins.bool* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*k +__rpow__"pandas.core.series.Series.__rpow__" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -11730,33 +10700,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *X - bool_onlyG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None *, -skipna - builtins.bool" builtins.bool * -kwargs -Any*1 -cummax pandas.core.series.Series.cummax" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -11783,18 +10734,29 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*DD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -11821,33 +10783,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *, -skipna - builtins.bool" builtins.bool * -args -Any* -kwargs -Any*1 -cummin pandas.core.series.Series.cummin" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -11874,18 +10817,14 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -11912,33 +10851,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *, -skipna - builtins.bool" builtins.bool * -args -Any* -kwargs -Any*1 -cumprod!pandas.core.series.Series.cumprod" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*X +__rsub__"pandas.core.series.Series.__rsub__"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -11965,18 +10888,29 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*DD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12003,33 +10937,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *, -skipna - builtins.bool" builtins.bool * -args -Any* -kwargs -Any*1 -cumsum pandas.core.series.Series.cumsum" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12056,18 +10971,14 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12094,36 +11005,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *, -skipna - builtins.bool" builtins.bool * -args -Any* -kwargs -Any*? -divide pandas.core.series.Series.divide"h -)pandas.core.series.Series[builtins.float] -builtins.float"builtins.float"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*X + __rtruediv__&pandas.core.series.Series.__rtruediv__"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12150,19 +11042,15 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*" -other" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*DD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 @@ -12173,16 +11061,10 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.str" builtins.str9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12209,37 +11091,14 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *\ - -fill_valueJ -Union[builtins.float,None] -builtins.float"builtins.float -None * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *U -divmod pandas.core.series.Series.divmod" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12266,18 +11125,14 @@ fill_valueJ builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12304,19 +11159,52 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*X + __truediv__%pandas.core.series.Series.__truediv__"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*" -other" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*DD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 @@ -12327,16 +11215,10 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.str" builtins.str9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12363,40 +11245,14 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *\ - -fill_valueJ -Union[builtins.float,None] -builtins.float"builtins.float -None * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *D -eqpandas.core.series.Series.eq"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12423,37 +11279,14 @@ fill_valueJ builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*' -other& -Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1]] -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12480,41 +11313,18 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *\ +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* -fill_valueJ -Union[builtins.float,None] -builtins.float"builtins.float -None * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex * -ewmpandas.core.series.Series.ewm" -Npandas.core.window.ewm.ExponentialMovingWindow[pandas.core.series.Series[Any]]D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series".pandas.core.window.ewm.ExponentialMovingWindow* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +__invert__$pandas.core.series.Series.__invert__"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12541,51 +11351,17 @@ Npandas.core.window.ewm.ExponentialMovingWindow[pandas.core.series.Series[Any]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*U -comJ -Union[builtins.float,None] -builtins.float"builtins.float -None *V -spanJ -Union[builtins.float,None] -builtins.float"builtins.float -None *Z -halflifeJ -Union[builtins.float,None] -builtins.float"builtins.float -None *W -alphaJ -Union[builtins.float,None] -builtins.float"builtins.float -None */ - min_periods - builtins.int" builtins.int *, -adjust - builtins.bool" builtins.bool */ - ignore_na - builtins.bool" builtins.bool * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex * - expanding#pandas.core.series.Series.expanding" -Fpandas.core.window.expanding.Expanding[pandas.core.series.Series[Any]]D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series"&pandas.core.window.expanding.Expanding* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +atpandas.core.series.Series.at"B +pandas.core.indexing._AtIndexer"pandas.core.indexing._AtIndexer* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12612,37 +11388,17 @@ Fpandas.core.window.expanding.Expanding[pandas.core.series.Series[Any]]D builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*/ - min_periods - builtins.int" builtins.int * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex * -method -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.CalculationMethod *@ -floordiv"pandas.core.series.Series.floordiv"b -'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series0:builtins.property`* +catpandas.core.series.Series.cat"h +2pandas.core.arrays.categorical.CategoricalAccessor"2pandas.core.arrays.categorical.CategoricalAccessor* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12669,39 +11425,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*" -other" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series0:builtins.property`* +iatpandas.core.series.Series.iat"D + pandas.core.indexing._iAtIndexer" pandas.core.indexing._iAtIndexer* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12728,42 +11462,15 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *\ - -fill_valueJ -Union[builtins.float,None] -builtins.float"builtins.float -None * -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *D -gepandas.core.series.Series.ge"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series0:builtins.property`*' +ilocpandas.core.series.Series.iloc" +8pandas.core.series._iLocIndexerSeries[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12790,37 +11497,15 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*' -other& -Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1]] -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"%pandas.core.series._iLocIndexerSeries* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12847,40 +11532,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *\ - -fill_valueJ -Union[builtins.float,None] -builtins.float"builtins.float -None * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *D -gtpandas.core.series.Series.gt"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series0:builtins.property`*' +locpandas.core.series.Series.loc" +7pandas.core.series._LocIndexerSeries[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12907,37 +11567,50 @@ fill_valueJ builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*' -other& -Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1]] -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"$pandas.core.series._LocIndexerSeries* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 + datetime.date" datetime.date + datetime.time" datetime.time builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series0:builtins.property`*M +addpandas.core.series.Series.add" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12964,36 +11637,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *\ - -fill_valueJ -Union[builtins.float,None] -builtins.float"builtins.float -None * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *- -itempandas.core.series.Series.item" -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13020,18 +11672,16 @@ fill_valueJ builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*# +other# +Union[pandas.core.series.Series[pandas._typing.S1],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]]] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13058,15 +11708,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*( -kurtpandas.core.series.Series.kurt" +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] @@ -13084,11 +11730,27 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.complex"builtins.complex"pandas._typing.Scalar* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None *( +axis + builtins.int" builtins.int * +allpandas.core.series.Series.all" + builtins.bool" builtins.bool* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13115,54 +11777,32 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex + builtins.int" builtins.int"pandas._typing.AxisIndex *X + bool_onlyG +Union[builtins.bool,None] + builtins.bool" builtins.bool None *, skipna - builtins.bool" builtins.bool * -level -None *2 - numeric_only builtins.bool" builtins.bool * kwargs -Any*( -kurtosis"pandas.core.series.Series.kurtosis" -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any* +anypandas.core.series.Series.any" + builtins.bool" builtins.bool* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13189,38 +11829,30 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex + builtins.int" builtins.int"pandas._typing.AxisIndex *X + bool_onlyG +Union[builtins.bool,None] + builtins.bool" builtins.bool None *, -skipna - builtins.bool" builtins.bool * -level -None *2 - numeric_only +skipna builtins.bool" builtins.bool * kwargs -Any*D -lepandas.core.series.Series.le"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any** +cummax pandas.core.series.Series.cummax" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13247,37 +11879,15 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*' -other& -Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1]] -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13304,40 +11914,30 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *\ - -fill_valueJ -Union[builtins.float,None] -builtins.float"builtins.float -None * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *D -ltpandas.core.series.Series.lt"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex +None *, +skipna + builtins.bool" builtins.bool * +args +Any* +kwargs +Any** +cummin pandas.core.series.Series.cummin" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13364,37 +11964,15 @@ fill_valueJ builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*' -other& -Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1]] -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13421,36 +11999,30 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *\ - -fill_valueJ -Union[builtins.float,None] -builtins.float"builtins.float -None * -axis +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *1 -maxpandas.core.series.Series.max" -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex +None *, +skipna + builtins.bool" builtins.bool * +args +Any* +kwargs +Any** +cumprod!pandas.core.series.Series.cumprod" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13477,18 +12049,15 @@ fill_valueJ builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13515,14 +12084,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* axis IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] @@ -13533,19 +12099,15 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.int" builtins.int"pandas._typing.AxisIndex None *, skipna - builtins.bool" builtins.bool * -level -None *2 - numeric_only - builtins.bool" builtins.bool * + builtins.bool" builtins.bool * +args +Any* kwargs -Any* -meanpandas.core.series.Series.mean" -builtins.float"builtins.float* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any** +cumsum pandas.core.series.Series.cumsum" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13572,37 +12134,15 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *, -skipna - builtins.bool" builtins.bool * -level -None *2 - numeric_only - builtins.bool" builtins.bool * -kwargs -Any* -median pandas.core.series.Series.median" -builtins.float"builtins.float* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13629,14 +12169,11 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* axis IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] @@ -13647,54 +12184,18 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.int" builtins.int"pandas._typing.AxisIndex None *, skipna - builtins.bool" builtins.bool * -level -None *2 - numeric_only - builtins.bool" builtins.bool * + builtins.bool" builtins.bool * +args +Any* kwargs -Any*1 -minpandas.core.series.Series.min" -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any*] +divide pandas.core.series.Series.divide"h +)pandas.core.series.Series[builtins.float] +builtins.float"builtins.float"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13721,35 +12222,30 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *, -skipna - builtins.bool" builtins.bool * -level -None *2 - numeric_only - builtins.bool" builtins.bool * -kwargs -Any*V -modpandas.core.series.Series.mod" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*D +otherD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13776,18 +12272,14 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13814,39 +12306,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*" -other" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13873,14 +12340,11 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* level :Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] .TypeAlias[Union[typing.Hashable,builtins.int]]i @@ -13892,20 +12356,18 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand fill_valueJ Union[builtins.float,None] builtins.float"builtins.float -None * -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +None * +axis =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *V -mulpandas.core.series.Series.mul" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex *p +divmod pandas.core.series.Series.divmod" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13932,18 +12394,15 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13970,19 +12429,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*" -other" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*D +otherD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 @@ -13993,16 +12449,10 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.str" builtins.str9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14029,77 +12479,14 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *\ - -fill_valueJ -Union[builtins.float,None] -builtins.float"builtins.float -None * -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *V -multiply"pandas.core.series.Series.multiply" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14126,39 +12513,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*" -other" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14185,14 +12547,11 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* level :Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] .TypeAlias[Union[typing.Hashable,builtins.int]]i @@ -14204,23 +12563,21 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand fill_valueJ Union[builtins.float,None] builtins.float"builtins.float -None * -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +None * +axis =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *D -nepandas.core.series.Series.ne"e + builtins.int" builtins.int"pandas._typing.AxisIndex *= +eqpandas.core.series.Series.eq"e (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14247,15 +12604,12 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*' -other& +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*# +other# Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1]] TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] @@ -14274,10 +12628,10 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.complex"builtins.complex"pandas._typing.Scalar +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14304,14 +12658,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* level :Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] .TypeAlias[Union[typing.Hashable,builtins.int]]i @@ -14330,13 +12681,15 @@ fill_valueJ Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex * -nunique!pandas.core.series.Series.nunique" - builtins.int" builtins.int* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex * +ewmpandas.core.series.Series.ewm" +Npandas.core.window.ewm.ExponentialMovingWindow[pandas.core.series.Series[Any]]D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series".pandas.core.window.ewm.ExponentialMovingWindow* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14363,20 +12716,41 @@ fill_valueJ builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*, -dropna - builtins.bool" builtins.bool *V -powpandas.core.series.Series.pow" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*U +comJ +Union[builtins.float,None] +builtins.float"builtins.float +None *V +spanJ +Union[builtins.float,None] +builtins.float"builtins.float +None *Z +halflifeJ +Union[builtins.float,None] +builtins.float"builtins.float +None *W +alphaJ +Union[builtins.float,None] +builtins.float"builtins.float +None */ + min_periods + builtins.int" builtins.int *, +adjust + builtins.bool" builtins.bool */ + ignore_na + builtins.bool" builtins.bool * + expanding#pandas.core.series.Series.expanding" +Fpandas.core.window.expanding.Expanding[pandas.core.series.Series[Any]]D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series"&pandas.core.window.expanding.Expanding* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14403,18 +12777,27 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*/ + min_periods + builtins.int" builtins.int * +method +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.CalculationMethod *^ +floordiv"pandas.core.series.Series.floordiv"b +'pandas.core.series.Series[builtins.int] + builtins.int" builtins.int"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14441,19 +12824,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*" -other" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*D +otherD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 @@ -14464,16 +12844,10 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.str" builtins.str9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14500,14 +12874,79 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* level :Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] .TypeAlias[Union[typing.Hashable,builtins.int]]i @@ -14528,30 +12967,14 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.str" builtins.str7 Literal[builtins.int]  builtins.int" builtins.int"pandas._typing.AxisIndex -None *) -prodpandas.core.series.Series.prod" -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +None *= +gepandas.core.series.Series.ge"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14578,36 +13001,13 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *U -skipnaG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None * -level -None *2 - numeric_only - builtins.bool" builtins.bool *- - min_count - builtins.int" builtins.int * -kwargs -Any*) -product!pandas.core.series.Series.product" +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*# +other# +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1]] TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] @@ -14625,11 +13025,10 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.complex"builtins.complex"pandas._typing.Scalar +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14656,39 +13055,37 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *U -skipnaG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None * -level -None *2 - numeric_only - builtins.bool" builtins.bool *- - min_count - builtins.int" builtins.int * -kwargs -Any*Z -raddpandas.core.series.Series.radd" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex *= +gtpandas.core.series.Series.gt"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14715,18 +13112,34 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*# +other# +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1]] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14753,19 +13166,33 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*' -other& -Union[pandas.core.series.Series[pandas._typing.S1],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]]] -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex *& +itempandas.core.series.Series.item" +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14792,14 +13219,47 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*% +kurtpandas.core.series.Series.kurt" TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] @@ -14817,30 +13277,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar* -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *\ - -fill_valueJ -Union[builtins.float,None] -builtins.float"builtins.float -None * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *Z -rdivmod!pandas.core.series.Series.rdivmod" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.complex"builtins.complex"pandas._typing.Scalar* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14867,18 +13308,51 @@ fill_valueJ builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *, +skipna + builtins.bool" builtins.bool * +level +None *2 + numeric_only + builtins.bool" builtins.bool * +kwargs +Any*% +kurtosis"pandas.core.series.Series.kurtosis" +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14905,19 +13379,35 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*' -other& -Union[pandas.core.series.Series[pandas._typing.S1],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]]] -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *, +skipna + builtins.bool" builtins.bool * +level +None *2 + numeric_only + builtins.bool" builtins.bool * +kwargs +Any*= +lepandas.core.series.Series.le"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14944,14 +13434,13 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*# +other# +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1]] TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] @@ -14969,7 +13458,41 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar* +builtins.complex"builtins.complex"pandas._typing.Scalar +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* level :Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] .TypeAlias[Union[typing.Hashable,builtins.int]]i @@ -14988,11 +13511,14 @@ fill_valueJ Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *3 - rfloordiv#pandas.core.series.Series.rfloordiv" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex *= +ltpandas.core.series.Series.lt"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -15019,18 +13545,34 @@ fill_valueJ builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*# +other# +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1]] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -15057,16 +13599,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -other -Any* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* level :Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] .TypeAlias[Union[typing.Hashable,builtins.int]]i @@ -15085,11 +13622,10 @@ fill_valueJ Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *Z -rmodpandas.core.series.Series.rmod" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex ** +maxpandas.core.series.Series.max" +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -15116,18 +13652,15 @@ fill_valueJ builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -15154,19 +13687,34 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*' -other& -Union[pandas.core.series.Series[pandas._typing.S1],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]]] -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *, +skipna + builtins.bool" builtins.bool * +level +None *2 + numeric_only + builtins.bool" builtins.bool * +kwargs +Any* +meanpandas.core.series.Series.mean" +builtins.float"builtins.float* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -15193,55 +13741,34 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar* -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *\ - -fill_valueJ -Union[builtins.float,None] -builtins.float"builtins.float -None * -axis +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *Z -rmulpandas.core.series.Series.rmul" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex +None *, +skipna + builtins.bool" builtins.bool * +level +None *2 + numeric_only + builtins.bool" builtins.bool * +kwargs +Any* +median pandas.core.series.Series.median" +builtins.float"builtins.float* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -15268,18 +13795,31 @@ fill_valueJ builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *, +skipna + builtins.bool" builtins.bool * +level +None *2 + numeric_only + builtins.bool" builtins.bool * +kwargs +Any** +minpandas.core.series.Series.min" +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -15306,19 +13846,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*' -other& -Union[pandas.core.series.Series[pandas._typing.S1],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]]] -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -15345,55 +13881,32 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar* -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *\ - -fill_valueJ -Union[builtins.float,None] -builtins.float"builtins.float -None * -axis +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *Z -rpowpandas.core.series.Series.rpow" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex +None *, +skipna + builtins.bool" builtins.bool * +level +None *2 + numeric_only + builtins.bool" builtins.bool * +kwargs +Any*q +modpandas.core.series.Series.mod" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -15420,18 +13933,15 @@ fill_valueJ builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -15458,19 +13968,30 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*' -other& -Union[pandas.core.series.Series[pandas._typing.S1],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]]] -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*D +otherD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -15497,55 +14018,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar* -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *\ - -fill_valueJ -Union[builtins.float,None] -builtins.float"builtins.float -None * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *Z -rsubpandas.core.series.Series.rsub" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -15572,57 +14052,14 @@ fill_valueJ builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*' -other& -Union[pandas.core.series.Series[pandas._typing.S1],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]]] -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -15649,32 +14086,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* level :Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] .TypeAlias[Union[typing.Hashable,builtins.int]]i @@ -15686,18 +14102,20 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand fill_valueJ Union[builtins.float,None] builtins.float"builtins.float -None * -axis +None * +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *3 -rtruediv"pandas.core.series.Series.rtruediv" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex +None *q +multiply"pandas.core.series.Series.multiply" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -15724,18 +14142,15 @@ fill_valueJ builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -15762,58 +14177,30 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -other -Any* -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *\ - -fill_valueJ -Union[builtins.float,None] -builtins.float"builtins.float -None * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *) -sempandas.core.series.Series.sem" -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*D +otherD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -15840,58 +14227,14 @@ fill_valueJ builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *U -skipnaG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None * -level -None *( -ddof - builtins.int" builtins.int *2 - numeric_only - builtins.bool" builtins.bool * -kwargs -Any*( -skewpandas.core.series.Series.skew" -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -15918,39 +14261,14 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *U -skipnaG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None * -level -None *2 - numeric_only - builtins.bool" builtins.bool * -kwargs -Any* -stdpandas.core.series.Series.std" -builtins.float"builtins.float* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -15977,14 +14295,23 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * axis IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] @@ -15993,23 +14320,14 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.str" builtins.str7 Literal[builtins.int]  builtins.int" builtins.int"pandas._typing.AxisIndex -None *U -skipnaG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None * -level -None *( -ddof - builtins.int" builtins.int *2 - numeric_only - builtins.bool" builtins.bool * -kwargs -Any*V -subpandas.core.series.Series.sub" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +None *= +nepandas.core.series.Series.ne"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -16036,18 +14354,34 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*# +other# +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1]] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -16074,39 +14408,36 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*" -other" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex * +nunique!pandas.core.series.Series.nunique" + builtins.int" builtins.int* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -16133,39 +14464,17 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *\ - -fill_valueJ -Union[builtins.float,None] -builtins.float"builtins.float -None * -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *V -subtract"pandas.core.series.Series.subtract" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*, +dropna + builtins.bool" builtins.bool *q +powpandas.core.series.Series.pow" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -16192,18 +14501,15 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -16230,19 +14536,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*" -other" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*D +otherD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 @@ -16253,16 +14556,10 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.str" builtins.str9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -16289,39 +14586,14 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *\ - -fill_valueJ -Union[builtins.float,None] -builtins.float"builtins.float -None * -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *- -to_list!pandas.core.series.Series.to_list" - builtins.list[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -16348,18 +14620,14 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype" builtins.list* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -16386,22 +14654,55 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *% +prodpandas.core.series.Series.prod" +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*2 -to_numpy"pandas.core.series.Series.to_numpy"9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -16428,41 +14729,33 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -dtype -Union[TypeAlias[Union[numpy.dtype[Any],None,builtins.type,numpy._typing._dtype_like._SupportsDType[numpy.dtype[Any]],builtins.str,TypeAlias[Union[Tuple[TypeAlias[Any],builtins.int],Unknown,builtins.list[Any],TypeAlias[TypedDict],Unknown]]]],None] - -TypeAlias[Union[numpy.dtype[Any],None,builtins.type,numpy._typing._dtype_like._SupportsDType[numpy.dtype[Any]],builtins.str,TypeAlias[Union[Tuple[TypeAlias[Any],builtins.int],Unknown,builtins.list[Any],TypeAlias[TypedDict],Unknown]]]] -Union[numpy.dtype[Any],None,builtins.type,numpy._typing._dtype_like._SupportsDType[numpy.dtype[Any]],builtins.str,TypeAlias[Union[Tuple[TypeAlias[Any],builtins.int],Unknown,builtins.list[Any],TypeAlias[TypedDict],Unknown]]]( -numpy.dtype[Any] -Any" numpy.dtype -None - builtins.type" builtins.type -:numpy._typing._dtype_like._SupportsDType[numpy.dtype[Any]]( -numpy.dtype[Any] -Any" numpy.dtype"(numpy._typing._dtype_like._SupportsDType - builtins.str" builtins.str -lTypeAlias[Union[Tuple[TypeAlias[Any],builtins.int],Unknown,builtins.list[Any],TypeAlias[TypedDict],Unknown]] -aUnion[Tuple[TypeAlias[Any],builtins.int],Unknown,builtins.list[Any],TypeAlias[TypedDict],Unknown] -"Tuple[TypeAlias[Any],builtins.int]G -TypeAlias[Any] -Any"*numpy._typing._dtype_like._DTypeLikeNested - builtins.int" builtins.int, -builtins.list[Any] -Any" builtins.listM -TypeAlias[TypedDict] - TypedDict "$numpy._typing._dtype_like._DTypeDict"(numpy._typing._dtype_like._VoidDTypeLike"#numpy._typing._dtype_like.DTypeLike -None ** -copy - builtins.bool" builtins.bool * -na_value +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *U +skipnaG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None * +level +None *2 + numeric_only + builtins.bool" builtins.bool *- + min_count + builtins.int" builtins.int * +kwargs +Any*% +product!pandas.core.series.Series.product" TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] @@ -16480,13 +14773,11 @@ aUnion[Tuple[TypeAlias[Any],builtins.int],Unknown,builtins.list[Any],TypeAlias[T builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar * -kwargs -Any*- -tolist pandas.core.series.Series.tolist" - builtins.list[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.complex"builtins.complex"pandas._typing.Scalar* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -16513,18 +14804,36 @@ aUnion[Tuple[TypeAlias[Any],builtins.int],Unknown,builtins.list[Any],TypeAlias[T builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype" builtins.list* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *U +skipnaG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None * +level +None *2 + numeric_only + builtins.bool" builtins.bool *- + min_count + builtins.int" builtins.int * +kwargs +Any*O +raddpandas.core.series.Series.radd" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -16551,21 +14860,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -truediv!pandas.core.series.Series.truediv"h -)pandas.core.series.Series[builtins.float] -builtins.float"builtins.float"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -16592,16 +14895,65 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*# +other# +Union[pandas.core.series.Series[pandas._typing.S1],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]]] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -other -Any* +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar* level :Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] .TypeAlias[Union[typing.Hashable,builtins.int]]i @@ -16620,30 +14972,82 @@ fill_valueJ Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *) -varpandas.core.series.Series.var" -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.int" builtins.int"pandas._typing.AxisIndex *O +rdivmod!pandas.core.series.Series.rdivmod" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes - datetime.date" datetime.date& + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*# +other# +Union[pandas.core.series.Series[pandas._typing.S1],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]]] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -16670,39 +15074,52 @@ fill_valueJ builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *U -skipnaG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None * -level -None *( -ddof - builtins.int" builtins.int *2 - numeric_only - builtins.bool" builtins.bool * -kwargs -Any*5 -set_axis"pandas.core.series.Series.set_axis" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex *, + rfloordiv#pandas.core.series.Series.rfloordiv" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -16729,18 +15146,15 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -16767,37 +15181,36 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -labels -Any* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +other +Any* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis ** -copy - builtins.bool" builtins.bool *- -__iter__"pandas.core.series.Series.__iter__" -"typing.Iterator[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex *O +rmodpandas.core.series.Series.rmod" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -16824,17 +15237,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"typing.Iterator* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -16861,22 +15272,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series2 -__new__!pandas.core.series.Series.__new__O -__new__!pandas.core.series.Series.__new__"H -"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries* -cls -2Type[pandas.core.series.Series[pandas._typing.S1]] -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*# +other# +Union[pandas.core.series.Series[pandas._typing.S1],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]]] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -16903,158 +15308,52 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series"type* -data -Union[pandas.core.indexes.datetimes.DatetimeIndex,typing.Sequence[Union[pandas._libs.tslibs.timestamps.Timestamp,numpy.datetime64,datetime.datetime]]]Z -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex -ctyping.Sequence[Union[pandas._libs.tslibs.timestamps.Timestamp,numpy.datetime64,datetime.datetime]] -RUnion[pandas._libs.tslibs.timestamps.Timestamp,numpy.datetime64,datetime.datetime]T -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp$ -numpy.datetime64"numpy.datetime64& -datetime.datetime"datetime.datetime"typing.Sequence* - -index +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ -Union[TypeAlias[Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]]],None] -TypeAlias[Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]]] -Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]] -kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] -`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.IndexD -pandas.core.series.Series[Any] -Any"pandas.core.series.Series9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.AnyArrayLike, -builtins.list[Any] -Any" builtins.list9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -builtins.range"builtins.range. -builtins.tuple[Any] -Any"builtins.tuple"pandas._typing.Axes -None *& -dtype& -TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.TimestampDtypeArg *Y -nameM -Union[typing.Hashable,None]" -typing.Hashable"typing.Hashable -None ** -copy - builtins.bool" builtins.bool 0:typing.overloadXS -__new__!pandas.core.series.Series.__new__"H -"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries* -cls -2Type[pandas.core.series.Series[pandas._typing.S1]] -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex *O +rpowpandas.core.series.Series.rpow" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -17081,170 +15380,4221 @@ kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[A builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*# +other# +Union[pandas.core.series.Series[pandas._typing.S1],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]]] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series"type* -data -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike* - -index +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ -Union[TypeAlias[Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]]],None] -TypeAlias[Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]]] -Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]] -kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] -`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.IndexD -pandas.core.series.Series[Any] -Any"pandas.core.series.Series9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.AnyArrayLike, -builtins.list[Any] -Any" builtins.list9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -builtins.range"builtins.range. -builtins.tuple[Any] -Any"builtins.tuple"pandas._typing.Axes -None *& -dtype& -TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex *O +rsubpandas.core.series.Series.rsub" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*# +other# +Union[pandas.core.series.Series[pandas._typing.S1],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]]] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.floatT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex *, +rtruediv"pandas.core.series.Series.rtruediv" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +other +Any* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex *% +sempandas.core.series.Series.sem" +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.floatT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *U +skipnaG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None * +level +None *( +ddof + builtins.int" builtins.int *2 + numeric_only + builtins.bool" builtins.bool * +kwargs +Any*% +skewpandas.core.series.Series.skew" +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.floatT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *U +skipnaG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None * +level +None *2 + numeric_only + builtins.bool" builtins.bool * +kwargs +Any* +stdpandas.core.series.Series.std" +builtins.float"builtins.float* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.TimestampDtypeArg*Y -nameM -Union[typing.Hashable,None]" -typing.Hashable"typing.Hashable +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *U +skipnaG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None * +level +None *( +ddof + builtins.int" builtins.int *2 + numeric_only + builtins.bool" builtins.bool * +kwargs +Any*q +subpandas.core.series.Series.sub" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*D +otherD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *q +subtract"pandas.core.series.Series.subtract" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*D +otherD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *& +to_list!pandas.core.series.Series.to_list" + builtins.list[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset" builtins.list* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*. +to_numpy"pandas.core.series.Series.to_numpy"9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +dtype +Union[TypeAlias[Union[numpy.dtype[Any],None,builtins.type,numpy._typing._dtype_like._SupportsDType[numpy.dtype[Any]],builtins.str,TypeAlias[Union[Tuple[TypeAlias[Any],builtins.int],Unknown,builtins.list[Any],TypeAlias[TypedDict],Unknown]]]],None] + +TypeAlias[Union[numpy.dtype[Any],None,builtins.type,numpy._typing._dtype_like._SupportsDType[numpy.dtype[Any]],builtins.str,TypeAlias[Union[Tuple[TypeAlias[Any],builtins.int],Unknown,builtins.list[Any],TypeAlias[TypedDict],Unknown]]]] +Union[numpy.dtype[Any],None,builtins.type,numpy._typing._dtype_like._SupportsDType[numpy.dtype[Any]],builtins.str,TypeAlias[Union[Tuple[TypeAlias[Any],builtins.int],Unknown,builtins.list[Any],TypeAlias[TypedDict],Unknown]]]( +numpy.dtype[Any] +Any" numpy.dtype +None + builtins.type" builtins.type +:numpy._typing._dtype_like._SupportsDType[numpy.dtype[Any]]( +numpy.dtype[Any] +Any" numpy.dtype"(numpy._typing._dtype_like._SupportsDType + builtins.str" builtins.str +lTypeAlias[Union[Tuple[TypeAlias[Any],builtins.int],Unknown,builtins.list[Any],TypeAlias[TypedDict],Unknown]] +aUnion[Tuple[TypeAlias[Any],builtins.int],Unknown,builtins.list[Any],TypeAlias[TypedDict],Unknown] +"Tuple[TypeAlias[Any],builtins.int]G +TypeAlias[Any] +Any"*numpy._typing._dtype_like._DTypeLikeNested + builtins.int" builtins.int, +builtins.list[Any] +Any" builtins.listM +TypeAlias[TypedDict] + TypedDict "$numpy._typing._dtype_like._DTypeDict"(numpy._typing._dtype_like._VoidDTypeLike"#numpy._typing._dtype_like.DTypeLike +None ** +copy + builtins.bool" builtins.bool * +na_value +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.floatT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar * +kwargs +Any*& +tolist pandas.core.series.Series.tolist" + builtins.list[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset" builtins.list* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +truediv!pandas.core.series.Series.truediv"h +)pandas.core.series.Series[builtins.float] +builtins.float"builtins.float"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +other +Any* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex *% +varpandas.core.series.Series.var" +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.floatT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *U +skipnaG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None * +level +None *( +ddof + builtins.int" builtins.int *2 + numeric_only + builtins.bool" builtins.bool * +kwargs +Any*/ +set_axis"pandas.core.series.Series.set_axis" +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(* +self +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(* +labels +Any* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis ** +copy + builtins.bool" builtins.bool *& +__iter__"pandas.core.series.Series.__iter__" +"typing.Iterator[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Iterator* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*- +xspandas.core.series.Series.xs" +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(* +self +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(*+ +key" +typing.Hashable"typing.Hashable* +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex * +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *0 + +drop_level + builtins.bool" builtins.bool 2 +__new__!pandas.core.series.Series.__new__, +__new__!pandas.core.series.Series.__new__"h +)pandas.core.series.Series[builtins.float] +builtins.float"builtins.float"pandas.core.series.Series* +cls +2Type[pandas.core.series.Series[pandas._typing.S1]] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"type* +data +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray* + +index + +Union[TypeAlias[Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]]],None] +TypeAlias[Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]]] +Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]] +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.AnyArrayLike, +builtins.list[Any] +Any" builtins.list9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +builtins.range"builtins.range. +builtins.tuple[Any] +Any"builtins.tuple"pandas._typing.Axes +None * +dtype +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype *. +name" +typing.Hashable"typing.Hashable ** +copy + builtins.bool" builtins.bool 0:typing.overloadXO +__new__!pandas.core.series.Series.__new__"H +"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries* +cls +2Type[pandas.core.series.Series[pandas._typing.S1]] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"type* +data +Union[pandas.core.indexes.datetimes.DatetimeIndex,typing.Sequence[Union[numpy.datetime64,datetime.datetime,datetime.date]],builtins.dict[pandas._typing.HashableT1,Union[numpy.datetime64,datetime.datetime,datetime.date]],numpy.datetime64,datetime.datetime,datetime.date]Z ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex +Htyping.Sequence[Union[numpy.datetime64,datetime.datetime,datetime.date]] +7Union[numpy.datetime64,datetime.datetime,datetime.date]$ +numpy.datetime64"numpy.datetime64& +datetime.datetime"datetime.datetime + datetime.date" datetime.date"typing.Sequence +`builtins.dict[pandas._typing.HashableT1,Union[numpy.datetime64,datetime.datetime,datetime.date]]R +pandas._typing.HashableT1" +typing.Hashable"typing.Hashable"typing.Hashable +7Union[numpy.datetime64,datetime.datetime,datetime.date]$ +numpy.datetime64"numpy.datetime64& +datetime.datetime"datetime.datetime + datetime.date" datetime.date" builtins.dict$ +numpy.datetime64"numpy.datetime64& +datetime.datetime"datetime.datetime + datetime.date" datetime.date* + +index + +Union[TypeAlias[Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]]],None] +TypeAlias[Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]]] +Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]] +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.AnyArrayLike, +builtins.list[Any] +Any" builtins.list9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +builtins.range"builtins.range. +builtins.tuple[Any] +Any"builtins.tuple"pandas._typing.Axes +None *& +dtype& +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimestampDtypeArg *. +name" +typing.Hashable"typing.Hashable ** +copy + builtins.bool" builtins.bool 0:typing.overloadXt +__new__!pandas.core.series.Series.__new__"H +"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries* +cls +2Type[pandas.core.series.Series[pandas._typing.S1]] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"type*. +data. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike* + +index + +Union[TypeAlias[Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]]],None] +TypeAlias[Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]]] +Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]] +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.AnyArrayLike, +builtins.list[Any] +Any" builtins.list9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +builtins.range"builtins.range. +builtins.tuple[Any] +Any"builtins.tuple"pandas._typing.Axes +None *& +dtype& +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimestampDtypeArg*. +name" +typing.Hashable"typing.Hashable ** +copy + builtins.bool" builtins.bool 0:typing.overloadX# +__new__!pandas.core.series.Series.__new__"B +pandas.core.series.PeriodSeries"pandas.core.series.PeriodSeries* +cls +2Type[pandas.core.series.Series[pandas._typing.S1]] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"type* +data +`Union[pandas.core.indexes.period.PeriodIndex,typing.Sequence[pandas._libs.tslibs.period.Period]]P +&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex +2typing.Sequence[pandas._libs.tslibs.period.Period]F +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period"typing.Sequence* + +index + +Union[TypeAlias[Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]]],None] +TypeAlias[Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]]] +Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]] +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.AnyArrayLike, +builtins.list[Any] +Any" builtins.list9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +builtins.range"builtins.range. +builtins.tuple[Any] +Any"builtins.tuple"pandas._typing.Axes +None *[ +dtypeN +%pandas.core.dtypes.dtypes.PeriodDtype"%pandas.core.dtypes.dtypes.PeriodDtype *. +name" +typing.Hashable"typing.Hashable ** +copy + builtins.bool" builtins.bool 0:typing.overloadXL +__new__!pandas.core.series.Series.__new__"H +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* +cls +2Type[pandas.core.series.Series[pandas._typing.S1]] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"type* +data +Union[pandas.core.indexes.timedeltas.TimedeltaIndex,typing.Sequence[Union[numpy.timedelta64,datetime.timedelta]],builtins.dict[pandas._typing.HashableT1,Union[numpy.timedelta64,datetime.timedelta]],numpy.timedelta64,datetime.timedelta]^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex + - sort_values%pandas.core.series.Series.sort_values" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -21932,18 +24129,35 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +func +JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] +?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K +CallableType[builtins.function]& +builtins.function"builtins.function + builtins.str" builtins.str + numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase* +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex * +args +Any* +kwargs +Any0:typing.overloadX + transform#pandas.core.series.Series.transform": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -21970,67 +24184,45 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +func +Union[builtins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]],TypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]]] +Ybuiltins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]] +JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] +?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K +CallableType[builtins.function]& +builtins.function"builtins.function + builtins.str" builtins.str + numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase" builtins.list +YTypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]] +Ntyping.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.HashableV +%Union[Unknown,builtins.list[Unknown]]) +builtins.list[Unknown]" builtins.list"typing.Mapping"#pandas._typing.AggFuncTypeDictFrame* +axis =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * - ascending -3Union[builtins.bool,typing.Sequence[builtins.bool]] - builtins.bool" builtins.boolQ -typing.Sequence[builtins.bool] - builtins.bool" builtins.bool"typing.Sequence * -kind -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.SortKind * - na_position -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.NaPosition *2 - ignore_index - builtins.bool" builtins.bool *I -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool * -key -+Union[CallableType[builtins.function],None]K -CallableType[builtins.function]& -builtins.function"builtins.function -None 0:typing.overloadX? - sort_values%pandas.core.series.Series.sort_values" -8Union[pandas.core.series.Series[pandas._typing.S1],None] -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex * +args +Any* +kwargs +Any0:typing.overloadX2, +applypandas.core.series.Series.apply +applypandas.core.series.Series.apply"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -22057,19 +24249,27 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*U +funcK +CallableType[builtins.function]& +builtins.function"builtins.function*2 + convertDType + builtins.bool" builtins.bool *: +args. +builtins.tuple[Any] +Any"builtins.tuple * +kwds +Any0:typing.overloadX +applypandas.core.series.Series.apply": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -22096,72 +24296,28 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * - ascending -3Union[builtins.bool,typing.Sequence[builtins.bool]] - builtins.bool" builtins.boolQ -typing.Sequence[builtins.bool] - builtins.bool" builtins.bool"typing.Sequence *V -inplaceG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None * -kind -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.SortKind * - na_position -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.NaPosition *2 - ignore_index - builtins.bool" builtins.bool * -key -+Union[CallableType[builtins.function],None]K +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*U +funcK CallableType[builtins.function]& -builtins.function"builtins.function -None 0:typing.overloadX2 - -sort_index$pandas.core.series.Series.sort_index* - -sort_index$pandas.core.series.Series.sort_index" -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.function"builtins.function*2 + convertDType + builtins.bool" builtins.bool *: +args. +builtins.tuple[Any] +Any"builtins.tuple * +kwds +Any0:typing.overloadX2 +rename pandas.core.series.Series.rename' +rename pandas.core.series.Series.rename" +None* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -22188,15 +24344,27 @@ sort_index$pandas.core.series.Series.sort_index" builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +index +Union[TypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]],typing.Hashable,None] +lTypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]] +aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]] +:typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]] +Any +&TypeAlias[Union[typing.Hashable,None]]M +Union[typing.Hashable,None]" +typing.Hashable"typing.Hashable +None"pandas._typing.Label"typing.MappingK +CallableType[builtins.function]& +builtins.function"builtins.function"pandas._typing.Renamer" +typing.Hashable"typing.Hashable +None * +axis +Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] @@ -22210,57 +24378,32 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis +None ** +copy + builtins.bool" builtins.bool *G +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool* level :Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] .TypeAlias[Union[typing.Hashable,builtins.int]]i #Union[typing.Hashable,builtins.int]" typing.Hashable"typing.Hashable builtins.int" builtins.int"pandas._typing.Level -None * - ascending -3Union[builtins.bool,typing.Sequence[builtins.bool]] - builtins.bool" builtins.boolQ -typing.Sequence[builtins.bool] - builtins.bool" builtins.bool"typing.Sequence * -kind -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.SortKind * - na_position +None * +errors =TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] 2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.NaPosition *4 -sort_remaining - builtins.bool" builtins.bool *2 - ignore_index - builtins.bool" builtins.bool *G -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool* -key -+Union[CallableType[builtins.function],None]K -CallableType[builtins.function]& -builtins.function"builtins.function -None 0:typing.overloadX, - -sort_index$pandas.core.series.Series.sort_index"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX: +rename pandas.core.series.Series.rename" +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -22287,85 +24430,16 @@ sort_index$pandas.core.series.Series.sort_index"D builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -level -rUnion[TypeAlias[Union[typing.Hashable,builtins.int]],builtins.list[builtins.int],builtins.list[builtins.str],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.LevelJ -builtins.list[builtins.int] - builtins.int" builtins.int" builtins.listJ -builtins.list[builtins.str] - builtins.str" builtins.str" builtins.list -None * - ascending -3Union[builtins.bool,typing.Sequence[builtins.bool]] - builtins.bool" builtins.boolQ -typing.Sequence[builtins.bool] - builtins.bool" builtins.bool"typing.Sequence * -kind -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.SortKind * - na_position -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.NaPosition *4 -sort_remaining - builtins.bool" builtins.bool *2 - ignore_index - builtins.bool" builtins.bool *I -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool * -key -+Union[CallableType[builtins.function],None]K -CallableType[builtins.function]& -builtins.function"builtins.function -None 0:typing.overloadX- - -sort_index$pandas.core.series.Series.sort_index"~ -*Union[pandas.core.series.Series[Any],None]D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(* +self +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -22392,15 +24466,26 @@ sort_index$pandas.core.series.Series.sort_index"~ builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(* +index +xUnion[TypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]],None] +lTypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]] +aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]] +:typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]] +Any +&TypeAlias[Union[typing.Hashable,None]]M +Union[typing.Hashable,None]" +typing.Hashable"typing.Hashable +None"pandas._typing.Label"typing.MappingK +CallableType[builtins.function]& +builtins.function"builtins.function"pandas._typing.Renamer +None * +axis +Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] @@ -22414,96 +24499,32 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -level -rUnion[TypeAlias[Union[typing.Hashable,builtins.int]],builtins.list[builtins.int],builtins.list[builtins.str],None] + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis +None ** +copy + builtins.bool" builtins.bool *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool * +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] .TypeAlias[Union[typing.Hashable,builtins.int]]i #Union[typing.Hashable,builtins.int]" typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.LevelJ -builtins.list[builtins.int] - builtins.int" builtins.int" builtins.listJ -builtins.list[builtins.str] - builtins.str" builtins.str" builtins.list -None * - ascending -3Union[builtins.bool,typing.Sequence[builtins.bool]] - builtins.bool" builtins.boolQ -typing.Sequence[builtins.bool] - builtins.bool" builtins.bool"typing.Sequence *V -inplaceG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None * -kind -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.SortKind * - na_position -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.NaPosition *4 -sort_remaining - builtins.bool" builtins.bool *2 - ignore_index - builtins.bool" builtins.bool * -key -+Union[CallableType[builtins.function],None]K -CallableType[builtins.function]& -builtins.function"builtins.function -None 0:typing.overloadX2l - aggregate#pandas.core.series.Series.aggregate2 - aggregate#pandas.core.series.Series.aggregate" -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.Level +None * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX6 +rename pandas.core.series.Series.rename" +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -22530,36 +24551,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -func -JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] -?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K -CallableType[builtins.function]& -builtins.function"builtins.function - builtins.str" builtins.str - numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase* -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex * -args -Any* -kwargs -Any0:typing.overloadX9 - aggregate#pandas.core.series.Series.aggregate" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(* +self +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -22586,18 +24587,60 @@ JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(*Z +indexM +Union[typing.Hashable,None]" +typing.Hashable"typing.Hashable +None * +axis +Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis +None ** +copy + builtins.bool" builtins.bool *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool * +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX' +rename pandas.core.series.Series.rename"~ +*Union[pandas.core.series.Series[Any],None]D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series +None* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -22624,44 +24667,67 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -func -TypeAlias[Union[builtins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]],TypeAlias[typing.Mapping[pandas._typing.HashableT,Unknown]]]] -Union[builtins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]],TypeAlias[typing.Mapping[pandas._typing.HashableT,Unknown]]] -Ybuiltins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]] -JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] -?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +index +Union[TypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]],typing.Hashable,None] +lTypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]] +aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]] +:typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]] +Any +&TypeAlias[Union[typing.Hashable,None]]M +Union[typing.Hashable,None]" +typing.Hashable"typing.Hashable +None"pandas._typing.Label"typing.MappingK CallableType[builtins.function]& -builtins.function"builtins.function - builtins.str" builtins.str - numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase" builtins.list -;TypeAlias[typing.Mapping[pandas._typing.HashableT,Unknown]] -0typing.Mapping[pandas._typing.HashableT,Unknown]Q -pandas._typing.HashableT" -typing.Hashable"typing.Hashable"typing.Hashable"typing.Mapping"$pandas._typing.AggFuncTypeDictSeries"'pandas._typing.AggFuncTypeSeriesToFrame * -axis +builtins.function"builtins.function"pandas._typing.Renamer" +typing.Hashable"typing.Hashable +None * +axis +Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex * -args -Any* -kwargs -Any0:typing.overloadX2V - transform#pandas.core.series.Series.transform3 - transform#pandas.core.series.Series.transform" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis +None ** +copy + builtins.bool" builtins.bool *- +inplace + builtins.bool" builtins.bool * +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX2 +fillna pandas.core.series.Series.fillna> +fillna pandas.core.series.Series.fillna" +None* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -22688,18 +24754,38 @@ JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*% +value% +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],pandas.core.frame.DataFrame,None] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar: +pandas._libs.missing.NAType"pandas._libs.missing.NAType9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -22726,38 +24812,37 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -func -JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] -?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K -CallableType[builtins.function]& -builtins.function"builtins.function - builtins.str" builtins.str - numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase* -axis +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame +None * +axis =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex * -args -Any* -kwargs -Any0:typing.overloadX" - transform#pandas.core.series.Series.transform": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None *{ +downcastk +"Union[builtins.dict[Any,Any],None]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +None *G +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool0:typing.overloadXQ +fillna pandas.core.series.Series.fillna" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -22784,48 +24869,15 @@ JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -func -Union[builtins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]],TypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]]] -Ybuiltins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]] -JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] -?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K -CallableType[builtins.function]& -builtins.function"builtins.function - builtins.str" builtins.str - numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase" builtins.list -YTypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]] -Ntyping.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]Q -pandas._typing.HashableT" -typing.Hashable"typing.Hashable"typing.HashableV -%Union[Unknown,builtins.list[Unknown]]) -builtins.list[Unknown]" builtins.list"typing.Mapping"#pandas._typing.AggFuncTypeDictFrame* -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex * -args -Any* -kwargs -Any0:typing.overloadX23 -applypandas.core.series.Series.apply -applypandas.core.series.Series.apply"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -22852,30 +24904,38 @@ Ntyping.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*% +value% +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],pandas.core.frame.DataFrame,None] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*U -funcK -CallableType[builtins.function]& -builtins.function"builtins.function*2 - convertDType - builtins.bool" builtins.bool *: -args. -builtins.tuple[Any] -Any"builtins.tuple * -kwds -Any0:typing.overloadX -applypandas.core.series.Series.apply": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar: +pandas._libs.missing.NAType"pandas._libs.missing.NAType9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -22902,31 +24962,38 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*U -funcK -CallableType[builtins.function]& -builtins.function"builtins.function*2 - convertDType - builtins.bool" builtins.bool *: -args. -builtins.tuple[Any] -Any"builtins.tuple * -kwds -Any0:typing.overloadX2 -rename pandas.core.series.Series.rename* -rename pandas.core.series.Series.rename" -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame +None * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None *{ +downcastk +"Union[builtins.dict[Any,Any],None]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +None *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool 0:typing.overloadXQ +fillna pandas.core.series.Series.fillna" +8Union[pandas.core.series.Series[pandas._typing.S1],None] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -22953,71 +25020,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -index -Union[TypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]],typing.Hashable,None] -lTypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]] -aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]] -:typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]] -Any -&TypeAlias[Union[typing.Hashable,None]]M -Union[typing.Hashable,None]" -typing.Hashable"typing.Hashable -None"pandas._typing.Label"typing.MappingK -CallableType[builtins.function]& -builtins.function"builtins.function"pandas._typing.Renamer" -typing.Hashable"typing.Hashable -None * -axis -Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis -None ** -copy - builtins.bool" builtins.bool *G -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool* -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX* -rename pandas.core.series.Series.rename"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series +None* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23044,70 +25056,38 @@ aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[b builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*% +value% +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],pandas.core.frame.DataFrame,None] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -index -xUnion[TypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]],None] -lTypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]] -aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]] -:typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]] -Any -&TypeAlias[Union[typing.Hashable,None]]M -Union[typing.Hashable,None]" -typing.Hashable"typing.Hashable -None"pandas._typing.Label"typing.MappingK -CallableType[builtins.function]& -builtins.function"builtins.function"pandas._typing.Renamer -None * -axis -Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis -None ** -copy - builtins.bool" builtins.bool *I -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX% -rename pandas.core.series.Series.rename"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar: +pandas._libs.missing.NAType"pandas._libs.missing.NAType9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23134,63 +25114,72 @@ aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[b builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*Z -indexM -Union[typing.Hashable,None]" -typing.Hashable"typing.Hashable -None * -axis -Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame +None * +axis =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis -None ** -copy - builtins.bool" builtins.bool *I -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX+ -rename pandas.core.series.Series.rename"~ -*Union[pandas.core.series.Series[Any],None]D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex *- +inplace + builtins.bool" builtins.bool *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None *{ +downcastk +"Union[builtins.dict[Any,Any],None]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +None 0:typing.overloadX2 +replace!pandas.core.series.Series.replaceS +replace!pandas.core.series.Series.replace" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23217,70 +25206,23 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -index -Union[TypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]],typing.Hashable,None] -lTypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]] -aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]] -:typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]] -Any -&TypeAlias[Union[typing.Hashable,None]]M -Union[typing.Hashable,None]" -typing.Hashable"typing.Hashable -None"pandas._typing.Label"typing.MappingK -CallableType[builtins.function]& -builtins.function"builtins.function"pandas._typing.Renamer" -typing.Hashable"typing.Hashable -None * -axis -Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis -None ** -copy - builtins.bool" builtins.bool *- -inplace - builtins.bool" builtins.bool * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX2 -droppandas.core.series.Series.drop+ -droppandas.core.series.Series.drop" -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* + +to_replace +~Union[builtins.str,builtins.list[Any],builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],builtins.float,None] + builtins.str" builtins.str, +builtins.list[Any] +Any" builtins.list9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23307,77 +25249,65 @@ aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[b builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series +builtins.float"builtins.float +None * +value +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],builtins.list[Any],builtins.str,None] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -labels -cUnion[typing.Hashable,builtins.list[pandas._typing.HashableT1],pandas.core.indexes.base.Index[Any]]" -typing.Hashable"typing.Hashable -(builtins.list[pandas._typing.HashableT1]R -pandas._typing.HashableT1" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.listN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index * -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -index -cUnion[typing.Hashable,builtins.list[pandas._typing.HashableT2],pandas.core.indexes.base.Index[Any]]" -typing.Hashable"typing.Hashable -(builtins.list[pandas._typing.HashableT2]R -pandas._typing.HashableT2" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.listN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index * -columns -cUnion[typing.Hashable,builtins.list[pandas._typing.HashableT3],pandas.core.indexes.base.Index[Any]]" -typing.Hashable"typing.Hashable -(builtins.list[pandas._typing.HashableT3]R -pandas._typing.HashableT3" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.listN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *G +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar: +pandas._libs.missing.NAType"pandas._libs.missing.NAType9 +builtins.dict[Any,Any] +Any +Any" builtins.dict, +builtins.list[Any] +Any" builtins.list + builtins.str" builtins.str +None *I inplace: Literal[builtins.bool]  - builtins.bool" builtins.bool* -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 + builtins.bool" builtins.bool *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None * +regex +Any * +method +STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX, -droppandas.core.series.Series.drop"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ReplaceMethod 0:typing.overloadX@ +replace!pandas.core.series.Series.replace" +None* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23404,79 +25334,107 @@ cUnion[typing.Hashable,builtins.list[pandas._typing.HashableT3],pandas.core.inde builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* + +to_replace +~Union[builtins.str,builtins.list[Any],builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],builtins.float,None] + builtins.str" builtins.str, +builtins.list[Any] +Any" builtins.list9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series +builtins.float"builtins.float +None * +value +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],builtins.list[Any],builtins.str,None] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -labels -cUnion[typing.Hashable,builtins.list[pandas._typing.HashableT1],pandas.core.indexes.base.Index[Any]]" -typing.Hashable"typing.Hashable -(builtins.list[pandas._typing.HashableT1]R -pandas._typing.HashableT1" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.listN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index * -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar: +pandas._libs.missing.NAType"pandas._libs.missing.NAType9 +builtins.dict[Any,Any] +Any +Any" builtins.dict, +builtins.list[Any] +Any" builtins.list + builtins.str" builtins.str +None *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None * +regex +Any * +method +STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -index -cUnion[typing.Hashable,builtins.list[pandas._typing.HashableT2],pandas.core.indexes.base.Index[Any]]" -typing.Hashable"typing.Hashable -(builtins.list[pandas._typing.HashableT2]R -pandas._typing.HashableT2" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.listN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index * -columns -cUnion[typing.Hashable,builtins.list[pandas._typing.HashableT3],pandas.core.indexes.base.Index[Any]]" -typing.Hashable"typing.Hashable -(builtins.list[pandas._typing.HashableT3]R -pandas._typing.HashableT3" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.listN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *I -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX, -droppandas.core.series.Series.drop"~ -*Union[pandas.core.series.Series[Any],None]D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.str" builtins.str"pandas._typing.ReplaceMethod *G +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool0:typing.overloadXT +replace!pandas.core.series.Series.replace" +8Union[pandas.core.series.Series[pandas._typing.S1],None] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23503,76 +25461,16 @@ cUnion[typing.Hashable,builtins.list[pandas._typing.HashableT3],pandas.core.inde builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -labels -cUnion[typing.Hashable,builtins.list[pandas._typing.HashableT1],pandas.core.indexes.base.Index[Any]]" -typing.Hashable"typing.Hashable -(builtins.list[pandas._typing.HashableT1]R -pandas._typing.HashableT1" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.listN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index * -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -index -cUnion[typing.Hashable,builtins.list[pandas._typing.HashableT2],pandas.core.indexes.base.Index[Any]]" -typing.Hashable"typing.Hashable -(builtins.list[pandas._typing.HashableT2]R -pandas._typing.HashableT2" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.listN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index * -columns -cUnion[typing.Hashable,builtins.list[pandas._typing.HashableT3],pandas.core.indexes.base.Index[Any]]" -typing.Hashable"typing.Hashable -(builtins.list[pandas._typing.HashableT3]R -pandas._typing.HashableT3" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.listN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *- -inplace - builtins.bool" builtins.bool * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX2 -fillna pandas.core.series.Series.fillnaI -fillna pandas.core.series.Series.fillna" -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series +None* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23599,16 +25497,58 @@ cUnion[typing.Hashable,builtins.list[pandas._typing.HashableT3],pandas.core.inde builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* + +to_replace +~Union[builtins.str,builtins.list[Any],builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],builtins.float,None] + builtins.str" builtins.str, +builtins.list[Any] +Any" builtins.list9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*) -value) -Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],pandas.core.frame.DataFrame,None] +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series +builtins.float"builtins.float +None * +value +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],builtins.list[Any],builtins.str,None] TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] @@ -23630,10 +25570,35 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand pandas._libs.missing.NAType"pandas._libs.missing.NAType9 builtins.dict[Any,Any] Any -Any" builtins.dict -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" builtins.dict, +builtins.list[Any] +Any" builtins.list + builtins.str" builtins.str +None *- +inplace + builtins.bool" builtins.bool *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None * +regex +Any * +method +STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ReplaceMethod 0:typing.overloadX2o +dropna pandas.core.series.Series.dropna +dropna pandas.core.series.Series.dropna" +None* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23660,53 +25625,32 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame -None * -method -uUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.FillnaOptions -None * +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* axis =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None *{ -downcastk -"Union[builtins.dict[Any,Any],None]9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -None *G + builtins.int" builtins.int"pandas._typing.AxisIndex *G inplace: Literal[builtins.bool]  - builtins.bool" builtins.bool0:typing.overloadX` -fillna pandas.core.series.Series.fillna" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +how +7Union[Literal[builtins.str],Literal[builtins.str],None]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +None 0:typing.overloadX+ +dropna pandas.core.series.Series.dropna" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23733,18 +25677,15 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23771,41 +25712,69 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*) -value) -Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],pandas.core.frame.DataFrame,None] -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool * +how +7Union[Literal[builtins.str],Literal[builtins.str],None]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +None 0:typing.overloadX+ +dropna pandas.core.series.Series.dropna" +8Union[pandas.core.series.Series[pandas._typing.S1],None] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 + datetime.date" datetime.date + datetime.time" datetime.time builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar: -pandas._libs.missing.NAType"pandas._libs.missing.NAType9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series +None* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23832,54 +25801,35 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame -None * -method -uUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.FillnaOptions -None * +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* axis =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None *{ -downcastk -"Union[builtins.dict[Any,Any],None]9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -None *I -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool 0:typing.overloadXa -fillna pandas.core.series.Series.fillna" -8Union[pandas.core.series.Series[pandas._typing.S1],None] -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex *- +inplace + builtins.bool" builtins.bool * +how +7Union[Literal[builtins.str],Literal[builtins.str],None]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +None 0:typing.overloadX2 +astype pandas.core.series.Series.astype +astype pandas.core.series.Series.astype"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23906,19 +25856,49 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +dtype +TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]= +Type[builtins.bool] + builtins.bool" builtins.bool"type7 +Literal[builtins.str]  + builtins.str" builtins.strR +'pandas.core.arrays.boolean.BooleanDtype"'pandas.core.arrays.boolean.BooleanDtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Type[numpy.bool_] + numpy.bool_" numpy.bool_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.BooleanDtypeArg** +copy + builtins.bool" builtins.bool * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadXs +astype pandas.core.series.Series.astype"b +'pandas.core.series.Series[builtins.int] + builtins.int" builtins.int"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23945,41 +25925,187 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*) -value) -Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],pandas.core.frame.DataFrame,None] -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar: -pandas._libs.missing.NAType"pandas._libs.missing.NAType9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*[ +dtype[ +Union[TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]]]& +TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: +Type[builtins.int] + builtins.int" builtins.int"type7 +Literal[builtins.str]  + builtins.str" builtins.strL +$pandas.core.arrays.integer.Int8Dtype"$pandas.core.arrays.integer.Int8DtypeN +%pandas.core.arrays.integer.Int16Dtype"%pandas.core.arrays.integer.Int16DtypeN +%pandas.core.arrays.integer.Int32Dtype"%pandas.core.arrays.integer.Int32DtypeN +%pandas.core.arrays.integer.Int64Dtype"%pandas.core.arrays.integer.Int64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +)Type[numpy.signedinteger[TypeAlias[Any]]]v +#numpy.signedinteger[TypeAlias[Any]]: +TypeAlias[Any] +Any"numpy._typing._nbit._NBitByte"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IntDtypeArg$ +TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]N +%pandas.core.arrays.integer.UInt8Dtype"%pandas.core.arrays.integer.UInt8DtypeP +&pandas.core.arrays.integer.UInt16Dtype"&pandas.core.arrays.integer.UInt16DtypeP +&pandas.core.arrays.integer.UInt32Dtype"&pandas.core.arrays.integer.UInt32DtypeP +&pandas.core.arrays.integer.UInt64Dtype"&pandas.core.arrays.integer.UInt64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.UIntDtypeArg** +copy + builtins.bool" builtins.bool * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX +astype pandas.core.series.Series.astype"b +'pandas.core.series.Series[builtins.str] + builtins.str" builtins.str"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -24006,20 +26132,25 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame -None * -method -uUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +dtype +TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: +Type[builtins.str] + builtins.str" builtins.str"type7 +Literal[builtins.str]  + builtins.str" builtins.strP +&pandas.core.arrays.string_.StringDtype"&pandas.core.arrays.string_.StringDtype7 +Literal[builtins.str]  + builtins.str" builtins.str4 +Type[numpy.str_] + +numpy.str_" +numpy.str_"type7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -24027,32 +26158,27 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.FillnaOptions -None * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *- -inplace - builtins.bool" builtins.bool *Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None *{ -downcastk -"Union[builtins.dict[Any,Any],None]9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -None 0:typing.overloadX2 -replace!pandas.core.series.Series.replace^ -replace!pandas.core.series.Series.replace" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.StrDtypeArg** +copy + builtins.bool" builtins.bool * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX +astype pandas.core.series.Series.astype"h +)pandas.core.series.Series[builtins.bytes] +builtins.bytes"builtins.bytes"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -24079,18 +26205,46 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +dtype +TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ +Type[builtins.bytes] +builtins.bytes"builtins.bytes"type7 +Literal[builtins.str]  + builtins.str" builtins.str: +Type[numpy.bytes_] + numpy.bytes_" numpy.bytes_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.BytesDtypeArg** +copy + builtins.bool" builtins.bool * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX5 +astype pandas.core.series.Series.astype"h +)pandas.core.series.Series[builtins.float] +builtins.float"builtins.float"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -24117,26 +26271,98 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* - -to_replace -~Union[builtins.str,builtins.list[Any],builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],builtins.float,None] - builtins.str" builtins.str, -builtins.list[Any] -Any" builtins.list9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +dtype +TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ +Type[builtins.float] +builtins.float"builtins.float"type7 +Literal[builtins.str]  + builtins.str" builtins.strT +(pandas.core.arrays.floating.Float32Dtype"(pandas.core.arrays.floating.Float32DtypeT +(pandas.core.arrays.floating.Float64Dtype"(pandas.core.arrays.floating.Float64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +$Type[numpy.floating[TypeAlias[Any]]]l +numpy.floating[TypeAlias[Any]]: +TypeAlias[Any] +Any"numpy._typing._nbit._NBitHalf"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.FloatDtypeArg** +copy + builtins.bool" builtins.bool * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX, +astype pandas.core.series.Series.astype"n ++pandas.core.series.Series[builtins.complex]$ +builtins.complex"builtins.complex"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -24163,68 +26389,75 @@ to_replace builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series -builtins.float"builtins.float -None * -value -Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],builtins.list[Any],builtins.str,None] -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar: -pandas._libs.missing.NAType"pandas._libs.missing.NAType9 -builtins.dict[Any,Any] -Any -Any" builtins.dict, -builtins.list[Any] -Any" builtins.list - builtins.str" builtins.str -None *I -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool *Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None * -regex -Any * -method -STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +dtype +TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[TypeAlias[Any],Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[TypeAlias[Any],Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]F +Type[builtins.complex]$ +builtins.complex"builtins.complex"type7 +Literal[builtins.str]  + builtins.str" builtins.str +3Type[numpy.complexfloating[TypeAlias[Any],Unknown]] +-numpy.complexfloating[TypeAlias[Any],Unknown]< +TypeAlias[Any] +Any"numpy._typing._nbit._NBitSingle"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.ReplaceMethod 0:typing.overloadXG -replace!pandas.core.series.Series.replace" -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.str" builtins.str"pandas._typing.ComplexDtypeArg** +copy + builtins.bool" builtins.bool * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX; +astype pandas.core.series.Series.astype"H +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -24251,26 +26484,121 @@ HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* - -to_replace -~Union[builtins.str,builtins.list[Any],builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],builtins.float,None] - builtins.str" builtins.str, -builtins.list[Any] -Any" builtins.list9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*$ +dtype$ +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimedeltaDtypeArg** +copy + builtins.bool" builtins.bool * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX= +astype pandas.core.series.Series.astype"H +"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -24297,67 +26625,126 @@ to_replace builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series -builtins.float"builtins.float -None * -value -Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],builtins.list[Any],builtins.str,None] -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar: -pandas._libs.missing.NAType"pandas._libs.missing.NAType9 -builtins.dict[Any,Any] -Any -Any" builtins.dict, -builtins.list[Any] -Any" builtins.list - builtins.str" builtins.str -None *Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None * -regex -Any * -method -STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*& +dtype& +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.ReplaceMethod *G -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool0:typing.overloadX^ -replace!pandas.core.series.Series.replace" -8Union[pandas.core.series.Series[pandas._typing.S1],None] -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimestampDtypeArg** +copy + builtins.bool" builtins.bool * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX +astype pandas.core.series.Series.astype" +Epandas.core.series.Series[pandas.core.dtypes.dtypes.CategoricalDtype]X +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -24384,19 +26771,33 @@ HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +dtype +RTypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]] +GUnion[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]X +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.CategoryDtypeArg** +copy + builtins.bool" builtins.bool * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX$ +astype pandas.core.series.Series.astype"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -24423,26 +26824,57 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +dtype +Union[TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]] +gTypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]] +\Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]C +Type[builtins.object]" +builtins.object"builtins.object"type7 +Literal[builtins.str]  + builtins.str" builtins.str= +Type[numpy.object_] + numpy.object_" numpy.object_"type7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ObjectDtypeArg +dTypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +YUnion[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]4 +Type[numpy.void] -to_replace -~Union[builtins.str,builtins.list[Any],builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],builtins.float,None] - builtins.str" builtins.str, -builtins.list[Any] -Any" builtins.list9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +numpy.void" +numpy.void"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.VoidDtypeArgP +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +STypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]] +HUnion[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]I +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtypeP +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype"pandas._typing.DtypeObj** +copy + builtins.bool" builtins.bool * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX2E +ffillpandas.core.series.Series.ffill +ffillpandas.core.series.Series.ffill" +None* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -24469,68 +26901,37 @@ to_replace builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series -builtins.float"builtins.float -None * -value -Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],builtins.list[Any],builtins.str,None] -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar: -pandas._libs.missing.NAType"pandas._libs.missing.NAType9 -builtins.dict[Any,Any] -Any -Any" builtins.dict, -builtins.list[Any] -Any" builtins.list - builtins.str" builtins.str -None *- -inplace - builtins.bool" builtins.bool *Q +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *G +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool*Q limitD Union[builtins.int,None] builtins.int" builtins.int -None * -regex -Any * -method -STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.ReplaceMethod 0:typing.overloadX2 -dropna pandas.core.series.Series.dropna -dropna pandas.core.series.Series.dropna" -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +None *{ +downcastk +"Union[builtins.dict[Any,Any],None]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +None 0:typing.overloadX, +ffillpandas.core.series.Series.ffill" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -24557,35 +26958,15 @@ HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *G -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool* -how -7Union[Literal[builtins.str],Literal[builtins.str],None]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str -None 0:typing.overloadX2 -dropna pandas.core.series.Series.dropna" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -24612,18 +26993,40 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None *{ +downcastk +"Union[builtins.dict[Any,Any],None]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +None 0:typing.overloadX2ř +bfillpandas.core.series.Series.bfill +bfillpandas.core.series.Series.bfill" +None* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -24650,36 +27053,37 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *I + builtins.int" builtins.int"pandas._typing.AxisIndex +None *G inplace: Literal[builtins.bool]  - builtins.bool" builtins.bool * -how -7Union[Literal[builtins.str],Literal[builtins.str],None]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str -None 0:typing.overloadX2 -dropna pandas.core.series.Series.dropna" -8Union[pandas.core.series.Series[pandas._typing.S1],None] -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool*Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None *{ +downcastk +"Union[builtins.dict[Any,Any],None]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +None 0:typing.overloadX, +bfillpandas.core.series.Series.bfill" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -24705,20 +27109,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand Type[builtins.object]" builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -24745,38 +27145,38 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *- -inplace - builtins.bool" builtins.bool * -how -7Union[Literal[builtins.str],Literal[builtins.str],None]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str -None 0:typing.overloadX2֔ -astype pandas.core.series.Series.astype$ -astype pandas.core.series.Series.astype"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex +None *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None *{ +downcastk +"Union[builtins.dict[Any,Any],None]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +None 0:typing.overloadXS +bfillpandas.core.series.Series.bfill" +8Union[pandas.core.series.Series[pandas._typing.S1],None] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -24803,54 +27203,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -dtype -TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]= -Type[builtins.bool] - builtins.bool" builtins.bool"type7 -Literal[builtins.str]  - builtins.str" builtins.strR -'pandas.core.arrays.boolean.BooleanDtype"'pandas.core.arrays.boolean.BooleanDtype7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Type[numpy.bool_] - numpy.bool_" numpy.bool_"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.BooleanDtypeArg** -copy - builtins.bool" builtins.bool * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadXx -astype pandas.core.series.Series.astype"b -'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series +None* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -24869,202 +27231,23 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand numpy.generic" numpy.generic" numpy.dtype: Type[builtins.str] builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*] -dtype] -Union[TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]]]' -TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: -Type[builtins.int] - builtins.int" builtins.int"type7 -Literal[builtins.str]  - builtins.str" builtins.strL -$pandas.core.arrays.integer.Int8Dtype"$pandas.core.arrays.integer.Int8DtypeN -%pandas.core.arrays.integer.Int16Dtype"%pandas.core.arrays.integer.Int16DtypeN -%pandas.core.arrays.integer.Int32Dtype"%pandas.core.arrays.integer.Int32DtypeN -%pandas.core.arrays.integer.Int64Dtype"%pandas.core.arrays.integer.Int64Dtype7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str -)Type[numpy.signedinteger[TypeAlias[Any]]]v -#numpy.signedinteger[TypeAlias[Any]]: -TypeAlias[Any] -Any"numpy._typing._nbit._NBitByte"numpy.signedinteger"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.strc -"Type[numpy.signedinteger[Unknown]]5 -numpy.signedinteger[Unknown]"numpy.signedinteger"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.strc -"Type[numpy.signedinteger[Unknown]]5 -numpy.signedinteger[Unknown]"numpy.signedinteger"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.strc -"Type[numpy.signedinteger[Unknown]]5 -numpy.signedinteger[Unknown]"numpy.signedinteger"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.strc -"Type[numpy.signedinteger[Unknown]]5 -numpy.signedinteger[Unknown]"numpy.signedinteger"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.strc -"Type[numpy.signedinteger[Unknown]]5 -numpy.signedinteger[Unknown]"numpy.signedinteger"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IntDtypeArg% -TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]N -%pandas.core.arrays.integer.UInt8Dtype"%pandas.core.arrays.integer.UInt8DtypeP -&pandas.core.arrays.integer.UInt16Dtype"&pandas.core.arrays.integer.UInt16DtypeP -&pandas.core.arrays.integer.UInt32Dtype"&pandas.core.arrays.integer.UInt32DtypeP -&pandas.core.arrays.integer.UInt64Dtype"&pandas.core.arrays.integer.UInt64Dtype7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.stri -$Type[numpy.unsignedinteger[Unknown]]9 -numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.stri -$Type[numpy.unsignedinteger[Unknown]]9 -numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.stri -$Type[numpy.unsignedinteger[Unknown]]9 -numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.stri -$Type[numpy.unsignedinteger[Unknown]]9 -numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.stri -$Type[numpy.unsignedinteger[Unknown]]9 -numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.stri -$Type[numpy.unsignedinteger[Unknown]]9 -numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.UIntDtypeArg** -copy - builtins.bool" builtins.bool * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX$ -astype pandas.core.series.Series.astype"b -'pandas.core.series.Series[builtins.str] - builtins.str" builtins.str"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*' +value' +xUnion[pandas._typing.S1,builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],pandas.core.frame.DataFrame] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -25091,56 +27274,76 @@ $Type[numpy.unsignedinteger[Unknown]]9 builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -dtype -TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: Type[builtins.str] - builtins.str" builtins.str"type7 -Literal[builtins.str]  - builtins.str" builtins.strP -&pandas.core.arrays.string_.StringDtype"&pandas.core.arrays.string_.StringDtype7 -Literal[builtins.str]  - builtins.str" builtins.str4 -Type[numpy.str_] - -numpy.str_" -numpy.str_"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.StrDtypeArg** -copy - builtins.bool" builtins.bool * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX" -astype pandas.core.series.Series.astype"h -)pandas.core.series.Series[builtins.bytes] -builtins.bytes"builtins.bytes"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex *- +inplace + builtins.bool" builtins.bool *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None *{ +downcastk +"Union[builtins.dict[Any,Any],None]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +None 0:typing.overloadX2. + value_counts&pandas.core.series.Series.value_counts + value_counts&pandas.core.series.Series.value_counts"b +'pandas.core.series.Series[builtins.int] + builtins.int" builtins.int"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -25167,51 +27370,31 @@ numpy.str_"type7 builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -dtype -TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ -Type[builtins.bytes] -builtins.bytes"builtins.bytes"type7 -Literal[builtins.str]  - builtins.str" builtins.str: -Type[numpy.bytes_] - numpy.bytes_" numpy.bytes_"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.BytesDtypeArg** -copy - builtins.bool" builtins.bool * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX9 -astype pandas.core.series.Series.astype"h +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*K + normalize: +Literal[builtins.bool]  + builtins.bool" builtins.bool ** +sort + builtins.bool" builtins.bool */ + ascending + builtins.bool" builtins.bool *P +binsD +Union[builtins.int,None] + builtins.int" builtins.int +None *, +dropna + builtins.bool" builtins.bool 0:typing.overloadX + value_counts&pandas.core.series.Series.value_counts"h )pandas.core.series.Series[builtins.float] -builtins.float"builtins.float"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.float"builtins.float"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -25238,101 +27421,65 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*I + normalize: +Literal[builtins.bool]  + builtins.bool" builtins.bool** +sort + builtins.bool" builtins.bool */ + ascending + builtins.bool" builtins.bool *P +binsD +Union[builtins.int,None] + builtins.int" builtins.int +None *, +dropna + builtins.bool" builtins.bool 0:typing.overloadX2ϗ +__add__!pandas.core.series.Series.__add__O +__add__!pandas.core.series.Series.__add__" +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -dtype -TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ -Type[builtins.float] -builtins.float"builtins.float"type7 -Literal[builtins.str]  - builtins.str" builtins.strT -(pandas.core.arrays.floating.Float32Dtype"(pandas.core.arrays.floating.Float32DtypeT -(pandas.core.arrays.floating.Float64Dtype"(pandas.core.arrays.floating.Float64Dtype7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str -$Type[numpy.floating[TypeAlias[Any]]]l -numpy.floating[TypeAlias[Any]]: -TypeAlias[Any] -Any"numpy._typing._nbit._NBitHalf"numpy.floating"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.strT -Type[numpy.floating[Unknown]]+ -numpy.floating[Unknown]"numpy.floating"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.strT -Type[numpy.floating[Unknown]]+ -numpy.floating[Unknown]"numpy.floating"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.strT -Type[numpy.floating[Unknown]]+ -numpy.floating[Unknown]"numpy.floating"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.FloatDtypeArg** -copy - builtins.bool" builtins.bool * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX0 -astype pandas.core.series.Series.astype"n -+pandas.core.series.Series[builtins.complex]$ -builtins.complex"builtins.complex"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(* +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -25359,78 +27506,49 @@ $Type[numpy.floating[TypeAlias[Any]]]l builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(*'& +7Union[pandas._typing.S1,pandas.core.series.Series.Self] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -dtype -TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[TypeAlias[Any],Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[TypeAlias[Any],Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]F +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF Type[builtins.complex]$ -builtins.complex"builtins.complex"type7 -Literal[builtins.str]  - builtins.str" builtins.str -3Type[numpy.complexfloating[TypeAlias[Any],Unknown]] --numpy.complexfloating[TypeAlias[Any],Unknown]< -TypeAlias[Any] -Any"numpy._typing._nbit._NBitSingle"numpy.complexfloating"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str{ -,Type[numpy.complexfloating[Unknown,Unknown]]C -&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str{ -,Type[numpy.complexfloating[Unknown,Unknown]]C -&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.ComplexDtypeArg** -copy - builtins.bool" builtins.bool * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX? -astype pandas.core.series.Series.astype"H -"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -25457,124 +27575,103 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(0:typing.overloadXH +__add__!pandas.core.series.Series.__add__"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*$ -dtype$ -TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.TimedeltaDtypeArg** -copy - builtins.bool" builtins.bool * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadXA -astype pandas.core.series.Series.astype"H -"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*33 +Union[builtins.complex,builtins.str,datetime.timedelta,pandas._libs.tslibs.timedeltas.Timedelta,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[Any],numpy.timedelta64]$ +builtins.complex"builtins.complex + builtins.str" builtins.str( +datetime.timedelta"datetime.timedeltaT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -25601,129 +27698,21 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*& -dtype& -TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.TimestampDtypeArg** -copy - builtins.bool" builtins.bool * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX -astype pandas.core.series.Series.astype"D +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLikeD pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any"pandas.core.series.Series& +numpy.timedelta64"numpy.timedelta640:typing.overloadX28 +__and__!pandas.core.series.Series.__and__ +__and__!pandas.core.series.Series.__and__"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -25750,36 +27739,171 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +Union[builtins.bool,builtins.list[builtins.bool],builtins.list[builtins.int],TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.bool]] + builtins.bool" builtins.boolM +builtins.list[builtins.bool] + builtins.bool" builtins.bool" builtins.listJ +builtins.list[builtins.int] + builtins.int" builtins.int" builtins.list +^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_boole +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series0:typing.overloadX +__and__!pandas.core.series.Series.__and__"b +'pandas.core.series.Series[builtins.int] + builtins.int" builtins.int"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -dtype -RTypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]] -GUnion[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]X -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.CategoryDtypeArg** -copy - builtins.bool" builtins.bool * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX( -astype pandas.core.series.Series.astype"D +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +Union[builtins.int,TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.int]] + builtins.int" builtins.int +^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray" pandas._typing.np_ndarray_anyintb +'pandas.core.series.Series[builtins.int] + builtins.int" builtins.int"pandas.core.series.Series0:typing.overloadX2] +__mul__!pandas.core.series.Series.__mul__ +__mul__!pandas.core.series.Series.__mul__"H +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +wUnion[datetime.timedelta,pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.series.TimedeltaSeries,numpy.timedelta64]( +datetime.timedelta"datetime.timedeltaT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.TimedeltaH +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries& +numpy.timedelta64"numpy.timedelta640:typing.overloadXE +__mul__!pandas.core.series.Series.__mul__"D pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*11 +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[Any]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -25806,60 +27930,14 @@ GUnion[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]X builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -dtype -Union[TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]] -gTypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]] -\Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]C -Type[builtins.object]" -builtins.object"builtins.object"type7 -Literal[builtins.str]  - builtins.str" builtins.str= -Type[numpy.object_] - numpy.object_" numpy.object_"type7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.ObjectDtypeArg -dTypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -YUnion[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]4 -Type[numpy.void] - -numpy.void" -numpy.void"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.VoidDtypeArgP -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -STypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]] -HUnion[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]I -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtypeP -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype"pandas._typing.DtypeObj** -copy - builtins.bool" builtins.bool * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX2P -ffillpandas.core.series.Series.ffill -ffillpandas.core.series.Series.ffill" -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -25886,40 +27964,20 @@ HUnion[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]I builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *G -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool*Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None *{ -downcastk -"Union[builtins.dict[Any,Any],None]9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -None 0:typing.overloadX3 -ffillpandas.core.series.Series.ffill" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLikeD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series0:typing.overloadX28 +__or__ pandas.core.series.Series.__or__ +__or__ pandas.core.series.Series.__or__"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -25946,18 +28004,32 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +Union[builtins.bool,builtins.list[builtins.bool],builtins.list[builtins.int],TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.bool]] + builtins.bool" builtins.boolM +builtins.list[builtins.bool] + builtins.bool" builtins.bool" builtins.listJ +builtins.list[builtins.int] + builtins.int" builtins.int" builtins.list +^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_boole +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series0:typing.overloadX +__or__ pandas.core.series.Series.__or__"b +'pandas.core.series.Series[builtins.int] + builtins.int" builtins.int"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -25984,43 +28056,28 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *I -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool *Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None *{ -downcastk -"Union[builtins.dict[Any,Any],None]9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -None 0:typing.overloadX2IJ -bfillpandas.core.series.Series.bfill -bfillpandas.core.series.Series.bfill" -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +Union[builtins.int,TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.int]] + builtins.int" builtins.int +^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray" pandas._typing.np_ndarray_anyintb +'pandas.core.series.Series[builtins.int] + builtins.int" builtins.int"pandas.core.series.Series0:typing.overloadX2 +__radd__"pandas.core.series.Series.__radd__N +__radd__"pandas.core.series.Series.__radd__" +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -26047,40 +28104,15 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *G -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool*Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None *{ -downcastk -"Union[builtins.dict[Any,Any],None]9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -None 0:typing.overloadX3 -bfillpandas.core.series.Series.bfill" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(* +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -26107,18 +28139,14 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(*&& +EUnion[pandas._typing.S1,pandas.core.series.Series[pandas._typing.S1]] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -26145,41 +28173,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *I -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool *Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None *{ -downcastk -"Union[builtins.dict[Any,Any],None]9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -None 0:typing.overloadXb -bfillpandas.core.series.Series.bfill" -8Union[pandas.core.series.Series[pandas._typing.S1],None] -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -26206,19 +28207,17 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series0:typing.overloadXF +__radd__"pandas.core.series.Series.__radd__"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -26245,18 +28244,30 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*/ -value/ -xUnion[pandas._typing.S1,builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],pandas.core.frame.DataFrame] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*11 +Union[builtins.complex,builtins.str,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[Any]]$ +builtins.complex"builtins.complex + builtins.str" builtins.str. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -26280,23 +28291,17 @@ xUnion[pandas._typing.S1,builtins.dict[Any,Any],pandas.core.series.Series[pandas Type[builtins.bool] builtins.bool" builtins.bool"typeC Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -26323,40 +28328,20 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *- -inplace - builtins.bool" builtins.bool *Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None *{ -downcastk -"Union[builtins.dict[Any,Any],None]9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -None 0:typing.overloadX2φ -__add__!pandas.core.series.Series.__add__ -__add__!pandas.core.series.Series.__add__"H -"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLikeD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series0:typing.overloadX28 +__rand__"pandas.core.series.Series.__rand__ +__rand__"pandas.core.series.Series.__rand__"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -26383,20 +28368,32 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*JH -"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries0:typing.overloadX -__add__!pandas.core.series.Series.__add__"H -"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +Union[builtins.bool,builtins.list[builtins.bool],builtins.list[builtins.int],TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.bool]] + builtins.bool" builtins.boolM +builtins.list[builtins.bool] + builtins.bool" builtins.bool" builtins.listJ +builtins.list[builtins.int] + builtins.int" builtins.int" builtins.list +^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_boole +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series0:typing.overloadX +__rand__"pandas.core.series.Series.__rand__"b +'pandas.core.series.Series[builtins.int] + builtins.int" builtins.int"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -26423,20 +28420,28 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*\Z -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex0:typing.overloadX -__add__!pandas.core.series.Series.__add__"H -"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +Union[builtins.int,TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.int]] + builtins.int" builtins.int +^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray" pandas._typing.np_ndarray_anyintb +'pandas.core.series.Series[builtins.int] + builtins.int" builtins.int"pandas.core.series.Series0:typing.overloadX2] +__rmul__"pandas.core.series.Series.__rmul__ +__rmul__"pandas.core.series.Series.__rmul__"H +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -26463,21 +28468,22 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*VT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp0:typing.overloadX< -__add__!pandas.core.series.Series.__add__"D +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +wUnion[datetime.timedelta,pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.series.TimedeltaSeries,numpy.timedelta64]( +datetime.timedelta"datetime.timedeltaT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.TimedeltaH +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries& +numpy.timedelta64"numpy.timedelta640:typing.overloadXE +__rmul__"pandas.core.series.Series.__rmul__"D pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -26504,20 +28510,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*$$ -Union[builtins.complex,builtins.str,pandas._libs.tslibs.timedeltas.Timedelta,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1],numpy.timedelta64]$ -builtins.complex"builtins.complex - builtins.str" builtins.strT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*11 +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[Any]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 @@ -26528,16 +28529,10 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.str" builtins.str9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -26564,22 +28559,14 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series& -numpy.timedelta64"numpy.timedelta640:typing.overloadX2? -__and__!pandas.core.series.Series.__and__ -__and__!pandas.core.series.Series.__and__"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -26606,35 +28593,20 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -Union[builtins.bool,builtins.list[builtins.bool],builtins.list[builtins.int],TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.bool]] - builtins.bool" builtins.boolM -builtins.list[builtins.bool] - builtins.bool" builtins.bool" builtins.listJ -builtins.list[builtins.int] - builtins.int" builtins.int" builtins.list -^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] -STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] -Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] -Any -5numpy.dtype[numpy._typing._array_like._ScalarType_co][ -(numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_boole +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLikeD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series0:typing.overloadX28 +__ror__!pandas.core.series.Series.__ror__ +__ror__!pandas.core.series.Series.__ror__"e (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series0:typing.overloadX -__and__!pandas.core.series.Series.__and__"b -'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -26661,31 +28633,32 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -Union[builtins.int,TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.int]] - builtins.int" builtins.int +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +Union[builtins.bool,builtins.list[builtins.bool],builtins.list[builtins.int],TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.bool]] + builtins.bool" builtins.boolM +builtins.list[builtins.bool] + builtins.bool" builtins.bool" builtins.listJ +builtins.list[builtins.int] + builtins.int" builtins.int" builtins.list ^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] Any 5numpy.dtype[numpy._typing._array_like._ScalarType_co][ (numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray" pandas._typing.np_ndarray_anyintb + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_boole +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series0:typing.overloadX +__ror__!pandas.core.series.Series.__ror__"b 'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series0:typing.overloadX2> -__mul__!pandas.core.series.Series.__mul__ -__mul__!pandas.core.series.Series.__mul__"H -"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -26712,24 +28685,29 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -dUnion[pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.series.TimedeltaSeries,numpy.timedelta64]T -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.TimedeltaH -"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries& -numpy.timedelta64"numpy.timedelta640:typing.overloadX$ -__mul__!pandas.core.series.Series.__mul__"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +Union[builtins.int,TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.int]] + builtins.int" builtins.int +^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray" pandas._typing.np_ndarray_anyintb +'pandas.core.series.Series[builtins.int] + builtins.int" builtins.int"pandas.core.series.Series0:typing.overloadX28 +__rxor__"pandas.core.series.Series.__rxor__ +__rxor__"pandas.core.series.Series.__rxor__"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -26756,44 +28734,32 @@ dUnion[pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.series.TimedeltaSeri builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*  -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[Any]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLikeD -pandas.core.series.Series[Any] -Any"pandas.core.series.Series0:typing.overloadX2? -__or__ pandas.core.series.Series.__or__ -__or__ pandas.core.series.Series.__or__"e +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +Union[builtins.bool,builtins.list[builtins.bool],builtins.list[builtins.int],TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.bool]] + builtins.bool" builtins.boolM +builtins.list[builtins.bool] + builtins.bool" builtins.bool" builtins.listJ +builtins.list[builtins.int] + builtins.int" builtins.int" builtins.list +^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_boole (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool"pandas.core.series.Series0:typing.overloadX +__rxor__"pandas.core.series.Series.__rxor__"b +'pandas.core.series.Series[builtins.int] + builtins.int" builtins.int"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -26820,35 +28786,87 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -Union[builtins.bool,builtins.list[builtins.bool],builtins.list[builtins.int],TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.bool]] - builtins.bool" builtins.boolM -builtins.list[builtins.bool] - builtins.bool" builtins.bool" builtins.listJ -builtins.list[builtins.int] - builtins.int" builtins.int" builtins.list +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +Union[builtins.int,TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.int]] + builtins.int" builtins.int ^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] Any 5numpy.dtype[numpy._typing._array_like._ScalarType_co][ (numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_boole -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series0:typing.overloadX -__or__ pandas.core.series.Series.__or__"b + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray" pandas._typing.np_ndarray_anyintb 'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas.core.series.Series0:typing.overloadX2i +__sub__!pandas.core.series.Series.__sub__ +__sub__!pandas.core.series.Series.__sub__"H +"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries* +Cpandas.core.series.Series[pandas._libs.tslibs.timestamps.Timestamp]T +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"pandas.core.series.Series* +Union[pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.series.TimedeltaSeries,pandas.core.indexes.timedeltas.TimedeltaIndex,numpy.timedelta64]T +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.TimedeltaH +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex& +numpy.timedelta64"numpy.timedelta640:typing.overloadX +__sub__!pandas.core.series.Series.__sub__"H +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* +Cpandas.core.series.Series[pandas._libs.tslibs.timedeltas.Timedelta]T +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas.core.series.Series* +Union[pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.series.TimedeltaSeries,pandas.core.indexes.timedeltas.TimedeltaIndex,numpy.timedelta64]T +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.TimedeltaH +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex& +numpy.timedelta64"numpy.timedelta640:typing.overloadX +__sub__!pandas.core.series.Series.__sub__"H +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +dUnion[pandas._libs.tslibs.timestamps.Timestamp,datetime.datetime,pandas.core.series.TimestampSeries]T +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp& +datetime.datetime"datetime.datetimeH +"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries0:typing.overloadXE +__sub__!pandas.core.series.Series.__sub__"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -26875,32 +28893,29 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -Union[builtins.int,TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.int]] - builtins.int" builtins.int -^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] -STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] -Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] -Any -5numpy.dtype[numpy._typing._array_like._ScalarType_co][ -(numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray" pandas._typing.np_ndarray_anyintb -'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series0:typing.overloadX2? -__rand__"pandas.core.series.Series.__rand__ -__rand__"pandas.core.series.Series.__rand__"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*11 +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[Any]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -26927,35 +28942,14 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -Union[builtins.bool,builtins.list[builtins.bool],builtins.list[builtins.int],TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.bool]] - builtins.bool" builtins.boolM -builtins.list[builtins.bool] - builtins.bool" builtins.bool" builtins.listJ -builtins.list[builtins.int] - builtins.int" builtins.int" builtins.list -^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] -STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] -Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] -Any -5numpy.dtype[numpy._typing._array_like._ScalarType_co][ -(numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_boole -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series0:typing.overloadX -__rand__"pandas.core.series.Series.__rand__"b -'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -26982,32 +28976,20 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -Union[builtins.int,TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.int]] - builtins.int" builtins.int -^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] -STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] -Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] -Any -5numpy.dtype[numpy._typing._array_like._ScalarType_co][ -(numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray" pandas._typing.np_ndarray_anyintb -'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series0:typing.overloadX2? -__ror__!pandas.core.series.Series.__ror__ -__ror__!pandas.core.series.Series.__ror__"e +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLikeD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series0:typing.overloadX28 +__xor__!pandas.core.series.Series.__xor__ +__xor__!pandas.core.series.Series.__xor__"e (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -27034,14 +29016,11 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* Union[builtins.bool,builtins.list[builtins.bool],builtins.list[builtins.int],TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.bool]] builtins.bool" builtins.boolM builtins.list[builtins.bool] @@ -27056,13 +29035,13 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] (numpy._typing._array_like._ScalarType_co numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_boole (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series0:typing.overloadX -__ror__!pandas.core.series.Series.__ror__"b + builtins.bool" builtins.bool"pandas.core.series.Series0:typing.overloadX +__xor__!pandas.core.series.Series.__xor__"b 'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -27089,14 +29068,11 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* Union[builtins.int,TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.int]] builtins.int" builtins.int ^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] @@ -27107,14 +29083,14 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] (numpy._typing._array_like._ScalarType_co numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray" pandas._typing.np_ndarray_anyintb 'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series0:typing.overloadX2S - __rtruediv__&pandas.core.series.Series.__rtruediv__ - __rtruediv__&pandas.core.series.Series.__rtruediv__"h -)pandas.core.series.Series[builtins.float] -builtins.float"builtins.float"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas.core.series.Series0:typing.overloadX2i +mulpandas.core.series.Series.mul +mulpandas.core.series.Series.mul"H +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -27141,21 +29117,45 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*JH -"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries0:typing.overloadX: - __rtruediv__&pandas.core.series.Series.__rtruediv__"D +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +other +wUnion[datetime.timedelta,pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.series.TimedeltaSeries,numpy.timedelta64]( +datetime.timedelta"datetime.timedeltaT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.TimedeltaH +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries& +numpy.timedelta64"numpy.timedelta64* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None 0:typing.overloadXK +mulpandas.core.series.Series.mul"D pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -27182,18 +29182,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*"" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*1 +other1 +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[Any]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 @@ -27204,57 +29202,10 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.str" builtins.str9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series0:typing.overloadX2? -__rxor__"pandas.core.series.Series.__rxor__ -__rxor__"pandas.core.series.Series.__rxor__"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -27281,35 +29232,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -Union[builtins.bool,builtins.list[builtins.bool],builtins.list[builtins.int],TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.bool]] - builtins.bool" builtins.boolM -builtins.list[builtins.bool] - builtins.bool" builtins.bool" builtins.listJ -builtins.list[builtins.int] - builtins.int" builtins.int" builtins.list -^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] -STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] -Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] -Any -5numpy.dtype[numpy._typing._array_like._ScalarType_co][ -(numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_boole -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series0:typing.overloadX -__rxor__"pandas.core.series.Series.__rxor__"b -'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -27336,49 +29266,41 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -Union[builtins.int,TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.int]] - builtins.int" builtins.int -^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] -STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] -Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] -Any -5numpy.dtype[numpy._typing._array_like._ScalarType_co][ -(numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray" pandas._typing.np_ndarray_anyintb -'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series0:typing.overloadX2K -__sub__!pandas.core.series.Series.__sub__ -__sub__!pandas.core.series.Series.__sub__"H -"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries* -Cpandas.core.series.Series[pandas._libs.tslibs.timestamps.Timestamp]T -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"pandas.core.series.Series* -Union[pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.series.TimedeltaSeries,pandas.core.indexes.timedeltas.TimedeltaIndex,numpy.timedelta64]T -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.TimedeltaH -"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex& -numpy.timedelta64"numpy.timedelta640:typing.overloadX -__sub__!pandas.core.series.Series.__sub__"H -"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* -Cpandas.core.series.Series[pandas._libs.tslibs.timedeltas.Timedelta]T -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas.core.series.Series* -Union[pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.series.TimedeltaSeries,pandas.core.indexes.timedeltas.TimedeltaIndex,numpy.timedelta64]T -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.TimedeltaH -"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex& -numpy.timedelta64"numpy.timedelta640:typing.overloadX -__sub__!pandas.core.series.Series.__sub__"H -"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLikeD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None 0:typing.overloadX2g +rmulpandas.core.series.Series.rmul +rmulpandas.core.series.Series.rmul"H +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -27405,24 +29327,43 @@ Cpandas.core.series.Series[pandas._libs.tslibs.timedeltas.Timedelta]T builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -dUnion[pandas._libs.tslibs.timestamps.Timestamp,datetime.datetime,pandas.core.series.TimestampSeries]T -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp& -datetime.datetime"datetime.datetimeH -"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries0:typing.overloadX$ -__sub__!pandas.core.series.Series.__sub__"D +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +other +wUnion[datetime.timedelta,pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.series.TimedeltaSeries,numpy.timedelta64]( +datetime.timedelta"datetime.timedeltaT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.TimedeltaH +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries& +numpy.timedelta64"numpy.timedelta64* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex 0:typing.overloadXJ +rmulpandas.core.series.Series.rmul"D pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -27449,18 +29390,16 @@ dUnion[pandas._libs.tslibs.timestamps.Timestamp,datetime.datetime,pandas.core.se builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*  -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[Any]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*1 +other1 +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[Any]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 @@ -27471,22 +29410,10 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.str" builtins.str9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLikeD -pandas.core.series.Series[Any] -Any"pandas.core.series.Series0:typing.overloadX2? -__xor__!pandas.core.series.Series.__xor__ -__xor__!pandas.core.series.Series.__xor__"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -27513,35 +29440,14 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -Union[builtins.bool,builtins.list[builtins.bool],builtins.list[builtins.int],TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.bool]] - builtins.bool" builtins.boolM -builtins.list[builtins.bool] - builtins.bool" builtins.bool" builtins.listJ -builtins.list[builtins.int] - builtins.int" builtins.int" builtins.list -^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] -STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] -Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] -Any -5numpy.dtype[numpy._typing._array_like._ScalarType_co][ -(numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_boole -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series0:typing.overloadX -__xor__!pandas.core.series.Series.__xor__"b -'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -27568,34 +29474,41 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -Union[builtins.int,TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.int]] - builtins.int" builtins.int -^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] -STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] -Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] -Any -5numpy.dtype[numpy._typing._array_like._ScalarType_co][ -(numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray" pandas._typing.np_ndarray_anyintb -'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series0:typing.overloadX2P -rolling!pandas.core.series.Series.rolling' +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLikeD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex 0:typing.overloadX2D +rolling!pandas.core.series.Series.rolling" rolling!pandas.core.series.Series.rolling" Apandas.core.window.rolling.Window[pandas.core.series.Series[Any]]D pandas.core.series.Series[Any] -Any"pandas.core.series.Series"!pandas.core.window.rolling.Window* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any"pandas.core.series.Series"!pandas.core.window.rolling.Window* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -27622,14 +29535,11 @@ Apandas.core.window.rolling.Window[pandas.core.series.Series[Any]]D builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* window {Union[builtins.int,builtins.str,datetime.timedelta,pandas._libs.tslibs.offsets.BaseOffset,pandas.core.indexers.BaseIndexer] builtins.int" builtins.int @@ -27646,14 +29556,7 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand onD Union[builtins.str,None] builtins.str" builtins.str -None * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex * +None * closed uUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] @@ -27679,15 +29582,15 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str" pandas._typing.CalculationMethod ** win_type - builtins.str" builtins.str0:typing.overloadX' + builtins.str" builtins.str0:typing.overloadX" rolling!pandas.core.series.Series.rolling" Bpandas.core.window.rolling.Rolling[pandas.core.series.Series[Any]]D pandas.core.series.Series[Any] -Any"pandas.core.series.Series""pandas.core.window.rolling.Rolling* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any"pandas.core.series.Series""pandas.core.window.rolling.Rolling* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -27714,14 +29617,11 @@ Bpandas.core.window.rolling.Rolling[pandas.core.series.Series[Any]]D builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* window {Union[builtins.int,builtins.str,datetime.timedelta,pandas._libs.tslibs.offsets.BaseOffset,pandas.core.indexers.BaseIndexer] builtins.int" builtins.int @@ -27738,14 +29638,7 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand onD Union[builtins.str,None] builtins.str" builtins.str -None * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex * +None * closed uUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] @@ -27771,7 +29664,7 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str" pandas._typing.CalculationMethod * win_type -None 0:typing.overloadX2> +None 0:typing.overloadX27 sumpandas.core.series.Series.sum sumpandas.core.series.Series.sum" Any*X @@ -27825,10 +29718,10 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] min_count builtins.int" builtins.int * kwargs -Any0:typing.overloadX2 -sumpandas.core.series.Series.sum" -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any0:typing.overloadX+ +sumpandas.core.series.Series.sum" +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -27855,18 +29748,15 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -27893,14 +29783,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* axis IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] @@ -27921,14 +29808,14 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] min_count builtins.int" builtins.int * kwargs -Any0:typing.overloadX2΢ - rename_axis%pandas.core.series.Series.rename_axisP +Any0:typing.overloadX2 + rename_axis%pandas.core.series.Series.rename_axisM rename_axis%pandas.core.series.Series.rename_axis" -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +None* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -27955,14 +29842,11 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* mapper Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._typing.ListLike] TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] @@ -28054,14 +29938,12 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.bool" builtins.bool *G inplace: Literal[builtins.bool]  - builtins.bool" builtins.bool0:typing.overloadXQ - rename_axis%pandas.core.series.Series.rename_axis"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool0:typing.overloadXa + rename_axis%pandas.core.series.Series.rename_axis" +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28088,14 +29970,47 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(* +self +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(* mapper Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._typing.ListLike] TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] @@ -28194,19 +30109,20 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] CallableType[builtins.function]& builtins.function"builtins.function"builtins.functionrR sparse pandas.core.series.Series.sparse& -builtins.ellipsis"builtins.ellipsis/ +builtins.ellipsis"builtins.ellipsis3 TimestampSeries"pandas.core.series.TimestampSeries"pandas.core.series.Series* dt%pandas.core.series.TimestampSeries.dt"f 1pandas.core.indexes.accessors.TimestampProperties"1pandas.core.indexes.accessors.TimestampProperties*R selfH -"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries0:builtins.property`* +"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries0:builtins.property`* __add__*pandas.core.series.TimestampSeries.__add__"H "pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries*JH -"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries* -NUnion[pandas.core.series.TimedeltaSeries,numpy.timedelta64,datetime.timedelta]H +"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries* +uUnion[pandas.core.series.TimedeltaSeries,numpy.timedelta64,datetime.timedelta,pandas._libs.tslibs.offsets.BaseOffset]H "pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries& numpy.timedelta64"numpy.timedelta64( -datetime.timedelta"datetime.timedelta* +datetime.timedelta"datetime.timedeltaP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset* __radd__+pandas.core.series.TimestampSeries.__radd__"H "pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries*JH "pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries* @@ -28302,7 +30218,14 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] numeric_only builtins.bool" builtins.bool * kwargs -Any2 +Any* +diff'pandas.core.series.TimestampSeries.diff"H +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries*R +selfH +"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries*+ +periods + builtins.int" builtins.int 2 + __sub__*pandas.core.series.TimestampSeries.__sub__ __sub__*pandas.core.series.TimestampSeries.__sub__"H "pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries*JH @@ -28310,20 +30233,22 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] dUnion[pandas._libs.tslibs.timestamps.Timestamp,datetime.datetime,pandas.core.series.TimestampSeries]T (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp& datetime.datetime"datetime.datetimeH -"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries0:typing.overloadX +"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries0:typing.overloadX __sub__*pandas.core.series.TimestampSeries.__sub__"H "pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries*JH -"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries* -|Union[datetime.timedelta,pandas.core.series.TimedeltaSeries,pandas.core.indexes.timedeltas.TimedeltaIndex,numpy.timedelta64]( +"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries* +Union[datetime.timedelta,pandas.core.series.TimedeltaSeries,pandas.core.indexes.timedeltas.TimedeltaIndex,numpy.timedelta64,pandas._libs.tslibs.offsets.BaseOffset]( datetime.timedelta"datetime.timedeltaH "pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries^ -pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex& -numpy.timedelta64"numpy.timedelta640:typing.overloadX9 -TimedeltaSeries"pandas.core.series.TimedeltaSeries"pandas.core.series.Series* +numpy.timedelta64"numpy.timedelta64P +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset0:typing.overloadXS +TimedeltaSeries"pandas.core.series.TimedeltaSeries"pandas.core.series.Series* __radd__+pandas.core.series.TimedeltaSeries.__radd__"H "pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries*JH -"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* -RUnion[pandas._libs.tslibs.timestamps.Timestamp,pandas.core.series.TimestampSeries]T +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* +dUnion[datetime.datetime,pandas._libs.tslibs.timestamps.Timestamp,pandas.core.series.TimestampSeries]& +datetime.datetime"datetime.datetimeT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampH "pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries* __mul__*pandas.core.series.TimedeltaSeries.__mul__"H @@ -28336,24 +30261,38 @@ RUnion[pandas._libs.tslibs.timestamps.Timestamp,pandas.core.series.TimestampSeri 'pandas.core.series.Series[builtins.int] builtins.int" builtins.int"pandas.core.series.Seriesh )pandas.core.series.Series[builtins.float] -builtins.float"builtins.float"pandas.core.series.Series* +builtins.float"builtins.float"pandas.core.series.Series* __sub__*pandas.core.series.TimedeltaSeries.__sub__"H "pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries*JH -"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* -Union[pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.series.TimedeltaSeries,pandas.core.indexes.timedeltas.TimedeltaIndex,numpy.timedelta64]T +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* +Union[datetime.timedelta,pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.series.TimedeltaSeries,pandas.core.indexes.timedeltas.TimedeltaIndex,numpy.timedelta64]( +datetime.timedelta"datetime.timedeltaT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.TimedeltaH "pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries^ -pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex& -numpy.timedelta64"numpy.timedelta64* - __truediv__.pandas.core.series.TimedeltaSeries.__truediv__"h +numpy.timedelta64"numpy.timedelta64* + __rtruediv__/pandas.core.series.TimedeltaSeries.__rtruediv__"h )pandas.core.series.Series[builtins.float] builtins.float"builtins.float"pandas.core.series.Series*JH -"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* -Union[pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.series.TimedeltaSeries,numpy.timedelta64,pandas.core.indexes.timedeltas.TimedeltaIndex]T -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.TimedeltaH +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* +Union[datetime.timedelta,pandas.core.series.TimedeltaSeries,numpy.timedelta64,pandas.core.indexes.timedeltas.TimedeltaIndex,typing.Sequence[datetime.timedelta]]( +datetime.timedelta"datetime.timedeltaH +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries& +numpy.timedelta64"numpy.timedelta64^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex` +#typing.Sequence[datetime.timedelta]( +datetime.timedelta"datetime.timedelta"typing.Sequence* + __rfloordiv__0pandas.core.series.TimedeltaSeries.__rfloordiv__"b +'pandas.core.series.Series[builtins.int] + builtins.int" builtins.int"pandas.core.series.Series*JH +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* +Union[datetime.timedelta,pandas.core.series.TimedeltaSeries,numpy.timedelta64,pandas.core.indexes.timedeltas.TimedeltaIndex,typing.Sequence[datetime.timedelta]]( +datetime.timedelta"datetime.timedeltaH "pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries& numpy.timedelta64"numpy.timedelta64^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex* +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex` +#typing.Sequence[datetime.timedelta]( +datetime.timedelta"datetime.timedelta"typing.Sequence* dt%pandas.core.series.TimedeltaSeries.dt"f 1pandas.core.indexes.accessors.TimedeltaProperties"1pandas.core.indexes.accessors.TimedeltaProperties*R selfH @@ -28424,50 +30363,75 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] numeric_only builtins.bool" builtins.bool * kwargs -Any* -xs%pandas.core.series.TimedeltaSeries.xs"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series*R +Any* +diff'pandas.core.series.TimedeltaSeries.diff"H +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries*R selfH "pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries*+ -key" -typing.Hashable"typing.Hashable* -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *0 - -drop_level - builtins.bool" builtins.bool 2 - +periods + builtins.int" builtins.int 2 __add__*pandas.core.series.TimedeltaSeries.__add__ __add__*pandas.core.series.TimedeltaSeries.__add__"B pandas.core.series.PeriodSeries"pandas.core.series.PeriodSeries*JH "pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:typing.overloadX +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:typing.overloadX __add__*pandas.core.series.TimedeltaSeries.__add__"H "pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries*JH -"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* -~Union[pandas._libs.tslibs.timestamps.Timestamp,pandas.core.series.TimestampSeries,pandas.core.indexes.datetimes.DatetimeIndex]T +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* +Union[datetime.datetime,pandas._libs.tslibs.timestamps.Timestamp,pandas.core.series.TimestampSeries,pandas.core.indexes.datetimes.DatetimeIndex]& +datetime.datetime"datetime.datetimeT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampH "pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeriesZ -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex0:typing.overloadX ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex0:typing.overloadX __add__*pandas.core.series.TimedeltaSeries.__add__"H "pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries*JH -"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* -AUnion[pandas._libs.tslibs.timedeltas.Timedelta,numpy.timedelta64]T +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* +TUnion[datetime.timedelta,pandas._libs.tslibs.timedeltas.Timedelta,numpy.timedelta64]( +datetime.timedelta"datetime.timedeltaT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta& -numpy.timedelta64"numpy.timedelta640:typing.overloadX +numpy.timedelta64"numpy.timedelta640:typing.overloadX2 + __truediv__.pandas.core.series.TimedeltaSeries.__truediv__ + __truediv__.pandas.core.series.TimedeltaSeries.__truediv__" +'pandas.core.series.TimedeltaSeries.SelfH +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries(* +'pandas.core.series.TimedeltaSeries.SelfH +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries(* +5Union[builtins.float,typing.Sequence[builtins.float]] +builtins.float"builtins.floatT +typing.Sequence[builtins.float] +builtins.float"builtins.float"typing.Sequence0:typing.overloadX + __truediv__.pandas.core.series.TimedeltaSeries.__truediv__"h +)pandas.core.series.Series[builtins.float] +builtins.float"builtins.float"pandas.core.series.Series*JH +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* +Union[datetime.timedelta,pandas.core.series.TimedeltaSeries,numpy.timedelta64,pandas.core.indexes.timedeltas.TimedeltaIndex,typing.Sequence[datetime.timedelta]]( +datetime.timedelta"datetime.timedeltaH +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries& +numpy.timedelta64"numpy.timedelta64^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex` +#typing.Sequence[datetime.timedelta]( +datetime.timedelta"datetime.timedelta"typing.Sequence0:typing.overloadX2 + __floordiv__/pandas.core.series.TimedeltaSeries.__floordiv__ + __floordiv__/pandas.core.series.TimedeltaSeries.__floordiv__" +'pandas.core.series.TimedeltaSeries.SelfH +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries(* +'pandas.core.series.TimedeltaSeries.SelfH +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries(* +5Union[builtins.float,typing.Sequence[builtins.float]] +builtins.float"builtins.floatT +typing.Sequence[builtins.float] +builtins.float"builtins.float"typing.Sequence0:typing.overloadX + __floordiv__/pandas.core.series.TimedeltaSeries.__floordiv__"b +'pandas.core.series.Series[builtins.int] + builtins.int" builtins.int"pandas.core.series.Series*JH +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* +Union[datetime.timedelta,pandas.core.series.TimedeltaSeries,numpy.timedelta64,pandas.core.indexes.timedeltas.TimedeltaIndex,typing.Sequence[datetime.timedelta]]( +datetime.timedelta"datetime.timedeltaH +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries& +numpy.timedelta64"numpy.timedelta64^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex` +#typing.Sequence[datetime.timedelta]( +datetime.timedelta"datetime.timedelta"typing.Sequence0:typing.overloadX PeriodSeriespandas.core.series.PeriodSeries"pandas.core.series.Series* dt"pandas.core.series.PeriodSeries.dt"` .pandas.core.indexes.accessors.PeriodProperties".pandas.core.indexes.accessors.PeriodProperties*L @@ -28476,7 +30440,13 @@ AUnion[pandas._libs.tslibs.timedeltas.Timedelta,numpy.timedelta64]T __sub__'pandas.core.series.PeriodSeries.__sub__"B pandas.core.series.OffsetSeries"pandas.core.series.OffsetSeries*DB pandas.core.series.PeriodSeries"pandas.core.series.PeriodSeries*DB -pandas.core.series.PeriodSeries"pandas.core.series.PeriodSeries +pandas.core.series.PeriodSeries"pandas.core.series.PeriodSeries* +diff$pandas.core.series.PeriodSeries.diff"B +pandas.core.series.OffsetSeries"pandas.core.series.OffsetSeries*L +selfB +pandas.core.series.PeriodSeries"pandas.core.series.PeriodSeries*+ +periods + builtins.int" builtins.int  OffsetSeriespandas.core.series.OffsetSeries"pandas.core.series.Series2 __radd__(pandas.core.series.OffsetSeries.__radd__ __radd__(pandas.core.series.OffsetSeries.__radd__"B @@ -28486,7 +30456,8 @@ AUnion[pandas._libs.tslibs.timedeltas.Timedelta,numpy.timedelta64]T __radd__(pandas.core.series.OffsetSeries.__radd__"B pandas.core.series.OffsetSeries"pandas.core.series.OffsetSeries*DB pandas.core.series.OffsetSeries"pandas.core.series.OffsetSeries*RP -&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset0:typing.overloadX +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset0:typing.overloadX + IntervalSeries!pandas.core.series.IntervalSeries"pandas.core.series.Series* array'pandas.core.series.IntervalSeries.array"V )pandas.core.arrays.interval.IntervalArray")pandas.core.arrays.interval.IntervalArray* @@ -28497,7 +30468,20 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"!pandas.core.series.IntervalSeries0:builtins.property`P* +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"!pandas.core.series.IntervalSeries0:builtins.property`* +diff&pandas.core.series.IntervalSeries.diff" +NoReturn +* +self +Dpandas.core.series.IntervalSeries[pandas._libs.interval._OrderableT] +!pandas._libs.interval._OrderableT +tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.int" builtins.int +builtins.float"builtins.floatT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"!pandas.core.series.IntervalSeries*+ +periods + builtins.int" builtins.int P* __annotations__"pandas.core.series.__annotations__W builtins.dict[builtins.str,Any] builtins.str" builtins.str diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.strings.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.strings.protobuf index b0de02fe9..98c86027a 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.strings.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.strings.protobuf @@ -1,69 +1,85 @@ -pandas.core.strings - StringMethods!pandas.core.strings.StringMethods"%pandas.core.base.NoNewAttributesMixin* +pandas.core.strings + StringMethods!pandas.core.strings.StringMethods"%pandas.core.base.NoNewAttributesMixin* __init__*pandas.core.strings.StringMethods.__init__" -None* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +None* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*S dataI pandas._typing.T" -builtins.object"builtins.object"builtins.object* +builtins.object"builtins.object"builtins.object* __getitem__-pandas.core.strings.StringMethods.__getitem__"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*hf "Union[builtins.slice,builtins.int] builtins.slice"builtins.slice - builtins.int" builtins.int* + builtins.int" builtins.int* __iter__*pandas.core.strings.StringMethods.__iter__"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" -builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods* +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" +builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods* get%pandas.core.strings.StringMethods.get"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*# i - builtins.int" builtins.int* + builtins.int" builtins.int* join&pandas.core.strings.StringMethods.join"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*% sep - builtins.str" builtins.str* + builtins.str" builtins.str* contains*pandas.core.strings.StringMethods.contains"e (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I + builtins.bool" builtins.bool"pandas.core.series.Series* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" -builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*% -pat - builtins.str" builtins.str** +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" +builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*v +patm +#Union[builtins.str,re.Pattern[Any]] + builtins.str" builtins.str& +re.Pattern[Any] +Any" +re.Pattern** case builtins.bool" builtins.bool *) flags @@ -71,15 +87,17 @@ Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I na Any *+ regex - builtins.bool" builtins.bool * -match'pandas.core.strings.StringMethods.match"I -pandas._typing.T" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I + builtins.bool" builtins.bool * +match'pandas.core.strings.StringMethods.match"P +pandas.core.strings._TM" +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*% pat builtins.str" builtins.str** @@ -88,15 +106,17 @@ Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I flags builtins.int" builtins.int * na -Any * +Any * replace)pandas.core.strings.StringMethods.replace"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*% pat builtins.str" builtins.str* @@ -114,29 +134,33 @@ Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I flags builtins.int" builtins.int *+ regex - builtins.bool" builtins.bool * + builtins.bool" builtins.bool * repeat(pandas.core.strings.StringMethods.repeat"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods* repeats 1Union[builtins.int,typing.Sequence[builtins.int]] builtins.int" builtins.intN typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.Sequence* + builtins.int" builtins.int"typing.Sequence* pad%pandas.core.strings.StringMethods.pad"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*' width builtins.int" builtins.int* @@ -149,65 +173,75 @@ HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str *, fillchar - builtins.str" builtins.str * + builtins.str" builtins.str * center(pandas.core.strings.StringMethods.center"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*' width builtins.int" builtins.int*, fillchar - builtins.str" builtins.str * + builtins.str" builtins.str * ljust'pandas.core.strings.StringMethods.ljust"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*' width builtins.int" builtins.int*, fillchar - builtins.str" builtins.str * + builtins.str" builtins.str * rjust'pandas.core.strings.StringMethods.rjust"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*' width builtins.int" builtins.int*, fillchar - builtins.str" builtins.str * + builtins.str" builtins.str * zfill'pandas.core.strings.StringMethods.zfill"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*' width - builtins.int" builtins.int* + builtins.int" builtins.int* slice'pandas.core.strings.StringMethods.slice"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*Q startD Union[builtins.int,None] @@ -220,15 +254,17 @@ Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I stepD Union[builtins.int,None] builtins.int" builtins.int -None * +None * slice_replace/pandas.core.strings.StringMethods.slice_replace"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*Q startD Union[builtins.int,None] @@ -241,80 +277,92 @@ Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I replD Union[builtins.str,None] builtins.str" builtins.str -None * +None * decode(pandas.core.strings.StringMethods.decode"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods** encoding builtins.str" builtins.str** errors - builtins.str" builtins.str * + builtins.str" builtins.str * encode(pandas.core.strings.StringMethods.encode"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods** encoding builtins.str" builtins.str** errors - builtins.str" builtins.str * + builtins.str" builtins.str * strip'pandas.core.strings.StringMethods.strip"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*T to_stripD Union[builtins.str,None] builtins.str" builtins.str -None * +None * lstrip(pandas.core.strings.StringMethods.lstrip"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*T to_stripD Union[builtins.str,None] builtins.str" builtins.str -None * +None * rstrip(pandas.core.strings.StringMethods.rstrip"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*T to_stripD Union[builtins.str,None] builtins.str" builtins.str -None * +None * wrap&pandas.core.strings.StringMethods.wrap"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*' width builtins.int" builtins.int*Z @@ -337,25 +385,29 @@ Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I break_on_hyphensG Union[builtins.bool,None] builtins.bool" builtins.bool -None * +None * get_dummies-pandas.core.strings.StringMethods.get_dummies": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*' sep - builtins.str" builtins.str * + builtins.str" builtins.str * translate+pandas.core.strings.StringMethods.translate"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods* table MUnion[builtins.dict[builtins.int,Union[builtins.int,builtins.str,None]],None] @@ -365,29 +417,33 @@ Abuiltins.dict[builtins.int,Union[builtins.int,builtins.str,None]] builtins.int" builtins.int builtins.str" builtins.str None" builtins.dict -None* +None* count'pandas.core.strings.StringMethods.count"b 'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I + builtins.int" builtins.int"pandas.core.series.Series* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*% pat builtins.str" builtins.str*) flags - builtins.int" builtins.int * + builtins.int" builtins.int * startswith,pandas.core.strings.StringMethods.startswith"e (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I + builtins.bool" builtins.bool"pandas.core.series.Series* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods* pat 0Union[builtins.str,builtins.tuple[builtins.str]] @@ -395,15 +451,17 @@ Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I builtins.tuple[builtins.str] builtins.str" builtins.str"builtins.tuple* na -Any * +Any * endswith*pandas.core.strings.StringMethods.endswith"e (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I + builtins.bool" builtins.bool"pandas.core.series.Series* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods* pat 0Union[builtins.str,builtins.tuple[builtins.str]] @@ -411,41 +469,47 @@ Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I builtins.tuple[builtins.str] builtins.str" builtins.str"builtins.tuple* na -Any * +Any * findall)pandas.core.strings.StringMethods.findall"D pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +Any"pandas.core.series.Series* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*% pat builtins.str" builtins.str*) flags - builtins.int" builtins.int * + builtins.int" builtins.int * extractall,pandas.core.strings.StringMethods.extractall": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*% pat builtins.str" builtins.str*) flags - builtins.int" builtins.int * + builtins.int" builtins.int * find&pandas.core.strings.StringMethods.find"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*% sub builtins.str" builtins.str*) @@ -454,15 +518,17 @@ Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I endD Union[builtins.int,None] builtins.int" builtins.int -None * +None * rfind'pandas.core.strings.StringMethods.rfind"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*% sub builtins.str" builtins.str*) @@ -471,15 +537,17 @@ Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I endD Union[builtins.int,None] builtins.int" builtins.int -None * +None * normalize+pandas.core.strings.StringMethods.normalize"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods* form ^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 @@ -490,15 +558,17 @@ Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str* + builtins.str" builtins.str* index'pandas.core.strings.StringMethods.index"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*% sub builtins.str" builtins.str*) @@ -507,15 +577,17 @@ Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I endD Union[builtins.int,None] builtins.int" builtins.int -None * +None * rindex(pandas.core.strings.StringMethods.rindex"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*% sub builtins.str" builtins.str*) @@ -524,160 +596,194 @@ Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I endD Union[builtins.int,None] builtins.int" builtins.int -None * +None * len%pandas.core.strings.StringMethods.len"b 'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I + builtins.int" builtins.int"pandas.core.series.Series* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" -builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods* +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" +builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods* lower'pandas.core.strings.StringMethods.lower"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" -builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods* +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" +builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods* upper'pandas.core.strings.StringMethods.upper"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" -builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods* +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" +builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods* title'pandas.core.strings.StringMethods.title"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" -builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods* +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" +builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods* capitalize,pandas.core.strings.StringMethods.capitalize"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" -builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods* +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" +builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods* swapcase*pandas.core.strings.StringMethods.swapcase"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" -builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods* +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" +builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods* casefold*pandas.core.strings.StringMethods.casefold"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" -builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods* +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" +builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods* isalnum)pandas.core.strings.StringMethods.isalnum"e (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I + builtins.bool" builtins.bool"pandas.core.series.Series* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" -builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods* +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" +builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods* isalpha)pandas.core.strings.StringMethods.isalpha"e (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I + builtins.bool" builtins.bool"pandas.core.series.Series* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" -builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods* +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" +builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods* isdigit)pandas.core.strings.StringMethods.isdigit"e (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I + builtins.bool" builtins.bool"pandas.core.series.Series* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" -builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods* +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" +builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods* isspace)pandas.core.strings.StringMethods.isspace"e (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I + builtins.bool" builtins.bool"pandas.core.series.Series* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" -builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods* +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" +builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods* islower)pandas.core.strings.StringMethods.islower"e (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I + builtins.bool" builtins.bool"pandas.core.series.Series* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" -builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods* +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" +builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods* isupper)pandas.core.strings.StringMethods.isupper"e (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I + builtins.bool" builtins.bool"pandas.core.series.Series* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" -builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods* +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" +builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods* istitle)pandas.core.strings.StringMethods.istitle"e (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I + builtins.bool" builtins.bool"pandas.core.series.Series* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" -builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods* +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" +builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods* isnumeric+pandas.core.strings.StringMethods.isnumeric"e (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I + builtins.bool" builtins.bool"pandas.core.series.Series* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" -builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods* +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" +builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods* isdecimal+pandas.core.strings.StringMethods.isdecimal"e (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I + builtins.bool" builtins.bool"pandas.core.series.Series* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" -builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods* +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" +builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods* fullmatch+pandas.core.strings.StringMethods.fullmatch"e (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I + builtins.bool" builtins.bool"pandas.core.series.Series* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*% pat builtins.str" builtins.str** @@ -686,37 +792,43 @@ Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I flags builtins.int" builtins.int * na -Any * +Any * removeprefix.pandas.core.strings.StringMethods.removeprefix"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*( prefix - builtins.str" builtins.str* + builtins.str" builtins.str* removesuffix.pandas.core.strings.StringMethods.removesuffix"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*( suffix - builtins.str" builtins.str2 -cat%pandas.core.strings.StringMethods.cat + builtins.str" builtins.str2 +cat%pandas.core.strings.StringMethods.cat cat%pandas.core.strings.StringMethods.cat" - builtins.str" builtins.str* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I + builtins.str" builtins.str* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*% sep builtins.str" builtins.str*R @@ -734,14 +846,16 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.JoinHow 0:typing.overloadX + builtins.str" builtins.str"pandas._typing.JoinHow 0:typing.overloadX cat%pandas.core.strings.StringMethods.cat" - builtins.str" builtins.str* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I + builtins.str" builtins.str* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods* others None *% @@ -761,15 +875,17 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.JoinHow 0:typing.overloadX + builtins.str" builtins.str"pandas._typing.JoinHow 0:typing.overloadX cat%pandas.core.strings.StringMethods.cat"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods* others Union[pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],pandas.core.frame.DataFrame,numpy.ndarray[Any,Any],builtins.list[Any]]D @@ -799,17 +915,18 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.JoinHow 0:typing.overloadX2 - -split'pandas.core.strings.StringMethods.split + builtins.str" builtins.str"pandas._typing.JoinHow 0:typing.overloadX2 +split'pandas.core.strings.StringMethods.split split'pandas.core.strings.StringMethods.split"P pandas.core.strings._TS" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*' pat builtins.str" builtins.str *% @@ -819,15 +936,17 @@ Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I Literal[builtins.bool]  builtins.bool" builtins.bool*+ regex - builtins.bool" builtins.bool 0:typing.overloadX + builtins.bool" builtins.bool 0:typing.overloadX split'pandas.core.strings.StringMethods.split"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*' pat builtins.str" builtins.str *% @@ -836,17 +955,18 @@ Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I expand builtins.bool" builtins.bool *+ regex - builtins.bool" builtins.bool 0:typing.overloadX2 - -rsplit(pandas.core.strings.StringMethods.rsplit + builtins.bool" builtins.bool 0:typing.overloadX2 +rsplit(pandas.core.strings.StringMethods.rsplit rsplit(pandas.core.strings.StringMethods.rsplit"P pandas.core.strings._TS" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*' pat builtins.str" builtins.str *% @@ -856,15 +976,17 @@ Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I Literal[builtins.bool]  builtins.bool" builtins.bool*+ regex - builtins.bool" builtins.bool 0:typing.overloadX + builtins.bool" builtins.bool 0:typing.overloadX rsplit(pandas.core.strings.StringMethods.rsplit"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*' pat builtins.str" builtins.str *% @@ -873,143 +995,165 @@ Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I expand builtins.bool" builtins.bool *+ regex - builtins.bool" builtins.bool 0:typing.overloadX2 - partition+pandas.core.strings.StringMethods.partition + builtins.bool" builtins.bool 0:typing.overloadX2 + partition+pandas.core.strings.StringMethods.partition partition+pandas.core.strings.StringMethods.partition": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*' sep - builtins.str" builtins.str 0:typing.overloadX + builtins.str" builtins.str 0:typing.overloadX partition+pandas.core.strings.StringMethods.partition": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*F expand: Literal[builtins.bool]  - builtins.bool" builtins.bool0:typing.overloadX + builtins.bool" builtins.bool0:typing.overloadX partition+pandas.core.strings.StringMethods.partition": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*% sep builtins.str" builtins.str*F expand: Literal[builtins.bool]  - builtins.bool" builtins.bool0:typing.overloadX + builtins.bool" builtins.bool0:typing.overloadX partition+pandas.core.strings.StringMethods.partition"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*% sep builtins.str" builtins.str*F expand: Literal[builtins.bool]  - builtins.bool" builtins.bool0:typing.overloadX + builtins.bool" builtins.bool0:typing.overloadX partition+pandas.core.strings.StringMethods.partition"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*F expand: Literal[builtins.bool]  - builtins.bool" builtins.bool0:typing.overloadX2 + builtins.bool" builtins.bool0:typing.overloadX2 -rpartition,pandas.core.strings.StringMethods.rpartition +rpartition,pandas.core.strings.StringMethods.rpartition rpartition,pandas.core.strings.StringMethods.rpartition": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*' sep - builtins.str" builtins.str 0:typing.overloadX + builtins.str" builtins.str 0:typing.overloadX rpartition,pandas.core.strings.StringMethods.rpartition": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*F expand: Literal[builtins.bool]  - builtins.bool" builtins.bool0:typing.overloadX + builtins.bool" builtins.bool0:typing.overloadX rpartition,pandas.core.strings.StringMethods.rpartition": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*% sep builtins.str" builtins.str*F expand: Literal[builtins.bool]  - builtins.bool" builtins.bool0:typing.overloadX + builtins.bool" builtins.bool0:typing.overloadX rpartition,pandas.core.strings.StringMethods.rpartition"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*% sep builtins.str" builtins.str*F expand: Literal[builtins.bool]  - builtins.bool" builtins.bool0:typing.overloadX + builtins.bool" builtins.bool0:typing.overloadX rpartition,pandas.core.strings.StringMethods.rpartition"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*F expand: Literal[builtins.bool]  - builtins.bool" builtins.bool0:typing.overloadX2 -extract)pandas.core.strings.StringMethods.extract + builtins.bool" builtins.bool0:typing.overloadX2 +extract)pandas.core.strings.StringMethods.extract extract)pandas.core.strings.StringMethods.extract": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*% pat builtins.str" builtins.str*) @@ -1017,15 +1161,17 @@ Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I builtins.int" builtins.int *H expand: Literal[builtins.bool]  - builtins.bool" builtins.bool 0:typing.overloadX + builtins.bool" builtins.bool 0:typing.overloadX extract)pandas.core.strings.StringMethods.extract"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*% pat builtins.str" builtins.str*' @@ -1033,15 +1179,17 @@ Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I builtins.int" builtins.int*F expand: Literal[builtins.bool]  - builtins.bool" builtins.bool0:typing.overloadX + builtins.bool" builtins.bool0:typing.overloadX extract)pandas.core.strings.StringMethods.extract"I pandas._typing.T" -builtins.object"builtins.object"builtins.object* -self -Kpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS]I +builtins.object"builtins.object"builtins.object* +self +cpandas.core.strings.StringMethods[pandas._typing.T,pandas.core.strings._TS,pandas.core.strings._TM]I pandas._typing.T" builtins.object"builtins.object"builtins.objectP pandas.core.strings._TS" +builtins.object"builtins.object"builtins.objectP +pandas.core.strings._TM" builtins.object"builtins.object"builtins.object"!pandas.core.strings.StringMethods*% pat builtins.str" builtins.str*) diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.tools.datetimes.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.tools.datetimes.protobuf index f4d27f343..3d144f420 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.tools.datetimes.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.tools.datetimes.protobuf @@ -1,5 +1,5 @@ -pandas.core.tools.datetimes"\ +pandas.core.tools.datetimes"Z to_datetime'pandas.core.tools.datetimes.to_datetime to_datetime'pandas.core.tools.datetimes.to_datetime"T (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp* @@ -110,7 +110,7 @@ eUnion[TypeAlias[Union[builtins.float,builtins.str]],datetime.datetime,numpy.dat builtins.float"builtins.float builtins.str" builtins.str"(pandas._typing.TimestampConvertibleTypes *+ cache - builtins.bool" builtins.bool 0:typing.overloadX + builtins.bool" builtins.bool 0:typing.overloadX to_datetime'pandas.core.tools.datetimes.to_datetime"H "pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries* arg @@ -121,16 +121,14 @@ BTypeAlias[Union[TypeAlias[TypedDict],pandas.core.frame.DataFrame]] 7Union[TypeAlias[TypedDict],pandas.core.frame.DataFrame]H TypeAlias[TypedDict] TypedDict "pandas._typing.FulldatetimeDict: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame"pandas._typing.DictConvertible* -errors -STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame"pandas._typing.DictConvertible* +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.IgnoreRaiseCoerce *. + builtins.str" builtins.str"pandas._typing.RaiseCoerce *. dayfirst builtins.bool" builtins.bool */ yearfirst @@ -167,22 +165,24 @@ HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 builtins.float"builtins.float builtins.str" builtins.str"(pandas._typing.TimestampConvertibleTypes *+ cache - builtins.bool" builtins.bool 0:typing.overloadX + builtins.bool" builtins.bool 0:typing.overloadX to_datetime'pandas.core.tools.datetimes.to_datetime"Z -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* -arg -Union[typing.Sequence[Union[builtins.float,datetime.datetime]],builtins.list[builtins.str],builtins.tuple[Union[builtins.float,builtins.str,datetime.datetime]],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],Unknown,Unknown,pandas.core.indexes.base.Index[Any],pandas.core.arrays.base.ExtensionArray] -8typing.Sequence[Union[builtins.float,datetime.datetime]]u -'Union[builtins.float,datetime.datetime] -builtins.float"builtins.float& -datetime.datetime"datetime.datetime"typing.SequenceJ ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* + +arg + +Union[typing.Sequence[Union[builtins.float,datetime.date]],builtins.list[builtins.str],builtins.tuple[Union[builtins.float,builtins.str,datetime.date]],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],Unknown,Unknown,pandas.core.indexes.base.Index[Any],pandas.core.arrays.base.ExtensionArray] +4typing.Sequence[Union[builtins.float,datetime.date]]i +#Union[builtins.float,datetime.date] +builtins.float"builtins.float + datetime.date" datetime.date"typing.SequenceJ builtins.list[builtins.str] - builtins.str" builtins.str" builtins.list -Dbuiltins.tuple[Union[builtins.float,builtins.str,datetime.datetime]] -4Union[builtins.float,builtins.str,datetime.datetime] + builtins.str" builtins.str" builtins.list +@builtins.tuple[Union[builtins.float,builtins.str,datetime.date]] +0Union[builtins.float,builtins.str,datetime.date] builtins.float"builtins.float - builtins.str" builtins.str& -datetime.datetime"datetime.datetime"builtins.tuple + builtins.str" builtins.str + datetime.date" datetime.date"builtins.tuple STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] Any @@ -191,16 +191,14 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArrayN #pandas.core.indexes.base.Index[Any] Any"pandas.core.indexes.base.IndexP -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray* -errors -STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray* +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.IgnoreRaiseCoerce *. + builtins.str" builtins.str"pandas._typing.RaiseCoerce *. dayfirst builtins.bool" builtins.bool */ yearfirst diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.tools.numeric.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.tools.numeric.protobuf index b2a8376b7..287e80cd6 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.tools.numeric.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.tools.numeric.protobuf @@ -1,5 +1,5 @@ -pandas.core.tools.numeric"\ +pandas.core.tools.numeric"5 to_numeric$pandas.core.tools.numeric.to_numeric @@ -52,72 +52,7 @@ tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],TypeAlias[L builtins.str" builtins.str"pandas._typing.DtypeBackend /TypeAlias[Literal[pandas._libs.lib._NoDefault]]d $Literal[pandas._libs.lib._NoDefault] : -pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadX$ - -to_numeric$pandas.core.tools.numeric.to_numeric" -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar* -arg -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar*C -errors7 -Literal[builtins.str]  - builtins.str" builtins.str* -downcast -nTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]] -cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str -None"#pandas.core.tools.numeric._Downcast * - dtype_backend -tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Literal[pandas._libs.lib._NoDefault]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.DtypeBackend -/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d -$Literal[pandas._libs.lib._NoDefault] : -pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadX +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadX to_numeric$pandas.core.tools.numeric.to_numeric" STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] @@ -134,16 +69,14 @@ DUnion[builtins.list[Any],builtins.tuple[Any],numpy.ndarray[Any,Any]], Any"builtins.tuple9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray* -errors -STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 +Any" numpy.ndarray* +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.IgnoreRaiseCoerce * + builtins.str" builtins.str"pandas._typing.RaiseCoerce * downcast nTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]] cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]7 @@ -166,23 +99,21 @@ tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],TypeAlias[L builtins.str" builtins.str"pandas._typing.DtypeBackend /TypeAlias[Literal[pandas._libs.lib._NoDefault]]d $Literal[pandas._libs.lib._NoDefault] : -pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadX +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadX to_numeric$pandas.core.tools.numeric.to_numeric"D pandas.core.series.Series[Any] Any"pandas.core.series.Series*M argD pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -errors -STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 +Any"pandas.core.series.Series* +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.IgnoreRaiseCoerce * + builtins.str" builtins.str"pandas._typing.RaiseCoerce * downcast nTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]] cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]7 diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.tools.timedeltas.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.tools.timedeltas.protobuf index 8199bc1c6..b63656a36 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.tools.timedeltas.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.tools.timedeltas.protobuf @@ -1,37 +1,17 @@ -pandas.core.tools.timedeltas"ϝ - to_timedelta)pandas.core.tools.timedeltas.to_timedelta1 +pandas.core.tools.timedeltas"| + to_timedelta)pandas.core.tools.timedeltas.to_timedelta& to_timedelta)pandas.core.tools.timedeltas.to_timedelta"T (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta* arg 5Union[builtins.str,builtins.float,datetime.timedelta] builtins.str" builtins.str builtins.float"builtins.float( -datetime.timedelta"datetime.timedelta*+ -unit+ -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None]# -TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 +datetime.timedelta"datetime.timedelta*! +unit! +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -100,45 +80,23 @@ builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str"3pandas._libs.tslibs.timedeltas.TimeDeltaUnitChoices -None * -errors -STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +None * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.IgnoreRaiseCoerce 0:typing.overloadX0 + builtins.str" builtins.str"pandas._typing.RaiseCoerce 0:typing.overloadX% to_timedelta)pandas.core.tools.timedeltas.to_timedelta"H "pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries*M argD pandas.core.series.Series[Any] -Any"pandas.core.series.Series*+ -unit+ -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None]# -TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 +Any"pandas.core.series.Series*! +unit! +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -207,29 +165,26 @@ HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str"3pandas._libs.tslibs.timedeltas.TimeDeltaUnitChoices -None * -errors -STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 +None * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.IgnoreRaiseCoerce 0:typing.overloadX; + builtins.str" builtins.str"pandas._typing.RaiseCoerce 0:typing.overloadX/ to_timedelta)pandas.core.tools.timedeltas.to_timedelta"^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex* -arg -Union[typing.Sequence[Union[builtins.float,datetime.timedelta]],builtins.list[Union[builtins.str,builtins.float,datetime.timedelta]],builtins.tuple[Union[builtins.str,builtins.float,datetime.timedelta]],builtins.range,TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],pandas.core.indexes.base.Index[Any]] +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex* + +arg + +Union[pandas._typing.SequenceNotStr[Any],typing.Sequence[Union[builtins.float,datetime.timedelta]],builtins.tuple[Union[builtins.str,builtins.float,datetime.timedelta]],builtins.range,TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],pandas.core.indexes.base.Index[Any]]L +"pandas._typing.SequenceNotStr[Any] +Any"pandas._typing.SequenceNotStr 9typing.Sequence[Union[builtins.float,datetime.timedelta]]x (Union[builtins.float,datetime.timedelta] builtins.float"builtins.float( -datetime.timedelta"datetime.timedelta"typing.Sequence -Dbuiltins.list[Union[builtins.str,builtins.float,datetime.timedelta]] -5Union[builtins.str,builtins.float,datetime.timedelta] - builtins.str" builtins.str -builtins.float"builtins.float( -datetime.timedelta"datetime.timedelta" builtins.list +datetime.timedelta"datetime.timedelta"typing.Sequence Ebuiltins.tuple[Union[builtins.str,builtins.float,datetime.timedelta]] 5Union[builtins.str,builtins.float,datetime.timedelta] builtins.str" builtins.str @@ -243,31 +198,11 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P Any Any" numpy.ndarray"pandas._typing.ArrayLikeN #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index*+ -unit+ -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None]# -TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 +Any"pandas.core.indexes.base.Index*! +unit! +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -336,16 +271,14 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str"3pandas._libs.tslibs.timedeltas.TimeDeltaUnitChoices -None * -errors -STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 +None * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.IgnoreRaiseCoerce 0:typing.overloadX* + builtins.str" builtins.str"pandas._typing.RaiseCoerce 0:typing.overloadX* __annotations__,pandas.core.tools.timedeltas.__annotations__W builtins.dict[builtins.str,Any] builtins.str" builtins.str diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.window.ewm.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.window.ewm.protobuf index 8922c6543..f5896de85 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.window.ewm.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.window.ewm.protobuf @@ -1,80 +1,28 @@ -pandas.core.window.ewm_ -ExponentialMovingWindow.pandas.core.window.ewm.ExponentialMovingWindow"%pandas.core.window.rolling.BaseWindow* -__init__7pandas.core.window.ewm.ExponentialMovingWindow.__init__" -None* +pandas.core.window.ewm. +ExponentialMovingWindow.pandas.core.window.ewm.ExponentialMovingWindow"%pandas.core.window.rolling.BaseWindow* +online5pandas.core.window.ewm.ExponentialMovingWindow.online" +Mpandas.core.window.ewm.OnlineExponentialMovingWindow[pandas._typing.NDFrameT]t +pandas._typing.NDFrameT: +pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"4pandas.core.window.ewm.OnlineExponentialMovingWindow* self Gpandas.core.window.ewm.ExponentialMovingWindow[pandas._typing.NDFrameT]t pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame".pandas.core.window.ewm.ExponentialMovingWindow*} -objt -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame*U -comJ -Union[builtins.float,None] -builtins.float"builtins.float -None *V -spanJ -Union[builtins.float,None] -builtins.float"builtins.float -None * -halflife -Union[TypeAlias[Union[pandas._libs.tslibs.timedeltas.Timedelta,datetime.timedelta,numpy.timedelta64,TypeAlias[numpy.signedinteger[numpy._typing._64Bit]],builtins.float,builtins.str]],None] -TypeAlias[Union[pandas._libs.tslibs.timedeltas.Timedelta,datetime.timedelta,numpy.timedelta64,TypeAlias[numpy.signedinteger[numpy._typing._64Bit]],builtins.float,builtins.str]] -Union[pandas._libs.tslibs.timedeltas.Timedelta,datetime.timedelta,numpy.timedelta64,TypeAlias[numpy.signedinteger[numpy._typing._64Bit]],builtins.float,builtins.str]T -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta( -datetime.timedelta"datetime.timedelta& -numpy.timedelta64"numpy.timedelta64 -4TypeAlias[numpy.signedinteger[numpy._typing._64Bit]]n -)numpy.signedinteger[numpy._typing._64Bit], -numpy._typing._64Bit"numpy._typing._64Bit"numpy.signedinteger" numpy.int64 -builtins.float"builtins.float - builtins.str" builtins.str"(pandas._typing.TimedeltaConvertibleTypes -None *W -alphaJ -Union[builtins.float,None] -builtins.float"builtins.float -None *W - min_periodsD -Union[builtins.int,None] - builtins.int" builtins.int -None *, -adjust - builtins.bool" builtins.bool */ - ignore_na - builtins.bool" builtins.bool * -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -times -`Union[builtins.str,numpy.ndarray[Any,Any],pandas.core.series.Series[Any],None,numpy.timedelta64] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarrayD -pandas.core.series.Series[Any] -Any"pandas.core.series.Series -None& -numpy.timedelta64"numpy.timedelta64 * -method -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 +pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame".pandas.core.window.ewm.ExponentialMovingWindow* +engine +BTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],None]] +7Union[Literal[builtins.str],Literal[builtins.str],None]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.CalculationMethod * + builtins.str" builtins.str +None"pandas._typing.WindowingEngine * + engine_kwargs ++TypeAlias[Union[TypeAlias[TypedDict],None]]} + Union[TypeAlias[TypedDict],None]M +TypeAlias[TypedDict] + TypedDict "$pandas._typing._WindowingNumbaKwargs +None"$pandas._typing.WindowingEngineKwargs * mean3pandas.core.window.ewm.ExponentialMovingWindow.mean"t pandas._typing.NDFrameT: pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame* @@ -84,7 +32,7 @@ Gpandas.core.window.ewm.ExponentialMovingWindow[pandas._typing.NDFrameT]t pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame".pandas.core.window.ewm.ExponentialMovingWindow*2 numeric_only builtins.bool" builtins.bool * -engine +engine BTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],None]] 7Union[Literal[builtins.str],Literal[builtins.str],None]7 Literal[builtins.str]  @@ -92,7 +40,7 @@ BTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],None]] Literal[builtins.str]  builtins.str" builtins.str None"pandas._typing.WindowingEngine * - engine_kwargs + engine_kwargs +TypeAlias[Union[TypeAlias[TypedDict],None]]} Union[TypeAlias[TypedDict],None]M TypeAlias[TypedDict] @@ -107,7 +55,7 @@ Gpandas.core.window.ewm.ExponentialMovingWindow[pandas._typing.NDFrameT]t pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame".pandas.core.window.ewm.ExponentialMovingWindow*2 numeric_only builtins.bool" builtins.bool * -engine +engine BTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],None]] 7Union[Literal[builtins.str],Literal[builtins.str],None]7 Literal[builtins.str]  @@ -115,7 +63,7 @@ BTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],None]] Literal[builtins.str]  builtins.str" builtins.str None"pandas._typing.WindowingEngine * - engine_kwargs + engine_kwargs +TypeAlias[Union[TypeAlias[TypedDict],None]]} Union[TypeAlias[TypedDict],None]M TypeAlias[TypedDict] @@ -182,77 +130,100 @@ FUnion[pandas.core.frame.DataFrame,pandas.core.series.Series[Any],None]: builtins.bool" builtins.bool None *2 numeric_only - builtins.bool" builtins.bool 2 - aggregate8pandas.core.window.ewm.ExponentialMovingWindow.aggregate - aggregate8pandas.core.window.ewm.ExponentialMovingWindow.aggregate"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -self -Npandas.core.window.ewm.ExponentialMovingWindow[pandas.core.series.Series[Any]]D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series".pandas.core.window.ewm.ExponentialMovingWindow* -func -JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] -?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K -CallableType[builtins.function]& -builtins.function"builtins.function - builtins.str" builtins.str - numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase* + builtins.bool" builtins.bool P +ExponentialMovingWindowGroupby5pandas.core.window.ewm.ExponentialMovingWindowGroupby",pandas.core.window.rolling.BaseWindowGroupby".pandas.core.window.ewm.ExponentialMovingWindowP +OnlineExponentialMovingWindow4pandas.core.window.ewm.OnlineExponentialMovingWindow".pandas.core.window.ewm.ExponentialMovingWindow* +reset:pandas.core.window.ewm.OnlineExponentialMovingWindow.reset" +None* +self +Mpandas.core.window.ewm.OnlineExponentialMovingWindow[pandas._typing.NDFrameT]t +pandas._typing.NDFrameT: +pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"4pandas.core.window.ewm.OnlineExponentialMovingWindow*u + aggregate>pandas.core.window.ewm.OnlineExponentialMovingWindow.aggregate* +self* +func* +args* + +kwargs* +std8pandas.core.window.ewm.OnlineExponentialMovingWindow.std" +Any* +self +Mpandas.core.window.ewm.OnlineExponentialMovingWindow[pandas._typing.NDFrameT]t +pandas._typing.NDFrameT: +pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"4pandas.core.window.ewm.OnlineExponentialMovingWindow** +bias + builtins.bool" builtins.bool * args Any* kwargs -Any0:typing.overloadX - aggregate8pandas.core.window.ewm.ExponentialMovingWindow.aggregate": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -self -Npandas.core.window.ewm.ExponentialMovingWindow[pandas.core.series.Series[Any]]D +Any* +corr9pandas.core.window.ewm.OnlineExponentialMovingWindow.corr" +Any* +self +Mpandas.core.window.ewm.OnlineExponentialMovingWindow[pandas._typing.NDFrameT]t +pandas._typing.NDFrameT: +pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"4pandas.core.window.ewm.OnlineExponentialMovingWindow* +other +FUnion[pandas.core.frame.DataFrame,pandas.core.series.Series[Any],None]: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrameD pandas.core.series.Series[Any] -Any"pandas.core.series.Series".pandas.core.window.ewm.ExponentialMovingWindow* -func -TypeAlias[Union[builtins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]],TypeAlias[typing.Mapping[pandas._typing.HashableT,Unknown]]]] -Union[builtins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]],TypeAlias[typing.Mapping[pandas._typing.HashableT,Unknown]]] -Ybuiltins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]] -JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] -?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K -CallableType[builtins.function]& -builtins.function"builtins.function - builtins.str" builtins.str - numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase" builtins.list -;TypeAlias[typing.Mapping[pandas._typing.HashableT,Unknown]] -0typing.Mapping[pandas._typing.HashableT,Unknown]Q -pandas._typing.HashableT" -typing.Hashable"typing.Hashable"typing.Hashable"typing.Mapping"$pandas._typing.AggFuncTypeDictSeries"'pandas._typing.AggFuncTypeSeriesToFrame* -args -Any* -kwargs -Any0:typing.overloadX - aggregate8pandas.core.window.ewm.ExponentialMovingWindow.aggregate": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -self -Kpandas.core.window.ewm.ExponentialMovingWindow[pandas.core.frame.DataFrame]: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame".pandas.core.window.ewm.ExponentialMovingWindow* -func -TypeAlias[Union[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]],builtins.list[Unknown],TypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]]]] -Union[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]],builtins.list[Unknown],TypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]]] -JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] -?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K -CallableType[builtins.function]& -builtins.function"builtins.function - builtins.str" builtins.str - numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase) -builtins.list[Unknown]" builtins.list -YTypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]] -Ntyping.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]Q -pandas._typing.HashableT" -typing.Hashable"typing.Hashable"typing.HashableV -%Union[Unknown,builtins.list[Unknown]]) -builtins.list[Unknown]" builtins.list"typing.Mapping"#pandas._typing.AggFuncTypeDictFrame"pandas._typing.AggFuncTypeFrame* +Any"pandas.core.series.Series +None *W +pairwiseG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None *2 + numeric_only + builtins.bool" builtins.bool * +cov8pandas.core.window.ewm.OnlineExponentialMovingWindow.cov" +Any* +self +Mpandas.core.window.ewm.OnlineExponentialMovingWindow[pandas._typing.NDFrameT]t +pandas._typing.NDFrameT: +pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"4pandas.core.window.ewm.OnlineExponentialMovingWindow* +other +FUnion[pandas.core.frame.DataFrame,pandas.core.series.Series[Any],None]: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrameD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series +None *W +pairwiseG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None ** +bias + builtins.bool" builtins.bool *2 + numeric_only + builtins.bool" builtins.bool * +var8pandas.core.window.ewm.OnlineExponentialMovingWindow.var" +Any* +self +Mpandas.core.window.ewm.OnlineExponentialMovingWindow[pandas._typing.NDFrameT]t +pandas._typing.NDFrameT: +pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"4pandas.core.window.ewm.OnlineExponentialMovingWindow** +bias + builtins.bool" builtins.bool *2 + numeric_only + builtins.bool" builtins.bool * +mean9pandas.core.window.ewm.OnlineExponentialMovingWindow.mean"t +pandas._typing.NDFrameT: +pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame* +self +Mpandas.core.window.ewm.OnlineExponentialMovingWindow[pandas._typing.NDFrameT]t +pandas._typing.NDFrameT: +pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"4pandas.core.window.ewm.OnlineExponentialMovingWindow* args -Any* +Any* +update +#Union[pandas._typing.NDFrameT,None]t +pandas._typing.NDFrameT: +pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame +None * + update_times +None * kwargs -Any0:typing.overloadXP* +AnyP* __annotations__&pandas.core.window.ewm.__annotations__W builtins.dict[builtins.str,Any] builtins.str" builtins.str -Any" builtins.dict* -npnumpy  \ No newline at end of file +Any" builtins.dict \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.window.expanding.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.window.expanding.protobuf index 74546a18d..d8464cef6 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.window.expanding.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.window.expanding.protobuf @@ -1,402 +1,7 @@ -pandas.core.window.expanding - Expanding&pandas.core.window.expanding.Expanding"3pandas.core.window.rolling.RollingAndExpandingMixin* -count,pandas.core.window.expanding.Expanding.count"t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame* -self -?pandas.core.window.expanding.Expanding[pandas._typing.NDFrameT]t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"&pandas.core.window.expanding.Expanding* - -apply,pandas.core.window.expanding.Expanding.apply"t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame* -self -?pandas.core.window.expanding.Expanding[pandas._typing.NDFrameT]t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"&pandas.core.window.expanding.Expanding*U -funcK -CallableType[builtins.function]& -builtins.function"builtins.function*) -raw - builtins.bool" builtins.bool * -engine -BTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],None]] -7Union[Literal[builtins.str],Literal[builtins.str],None]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str -None"pandas._typing.WindowingEngine * - engine_kwargs -+TypeAlias[Union[TypeAlias[TypedDict],None]]} - Union[TypeAlias[TypedDict],None]M -TypeAlias[TypedDict] - TypedDict "$pandas._typing._WindowingNumbaKwargs -None"$pandas._typing.WindowingEngineKwargs *i -args] -Union[builtins.tuple[Any],None]. -builtins.tuple[Any] -Any"builtins.tuple -None * -kwargs -+Union[builtins.dict[builtins.str,Any],None]W -builtins.dict[builtins.str,Any] - builtins.str" builtins.str -Any" builtins.dict -None * -sum*pandas.core.window.expanding.Expanding.sum"t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame* -self -?pandas.core.window.expanding.Expanding[pandas._typing.NDFrameT]t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"&pandas.core.window.expanding.Expanding*2 - numeric_only - builtins.bool" builtins.bool * -engine -BTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],None]] -7Union[Literal[builtins.str],Literal[builtins.str],None]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str -None"pandas._typing.WindowingEngine * - engine_kwargs -+TypeAlias[Union[TypeAlias[TypedDict],None]]} - Union[TypeAlias[TypedDict],None]M -TypeAlias[TypedDict] - TypedDict "$pandas._typing._WindowingNumbaKwargs -None"$pandas._typing.WindowingEngineKwargs * -max*pandas.core.window.expanding.Expanding.max"t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame* -self -?pandas.core.window.expanding.Expanding[pandas._typing.NDFrameT]t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"&pandas.core.window.expanding.Expanding*2 - numeric_only - builtins.bool" builtins.bool * -engine -BTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],None]] -7Union[Literal[builtins.str],Literal[builtins.str],None]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str -None"pandas._typing.WindowingEngine * - engine_kwargs -+TypeAlias[Union[TypeAlias[TypedDict],None]]} - Union[TypeAlias[TypedDict],None]M -TypeAlias[TypedDict] - TypedDict "$pandas._typing._WindowingNumbaKwargs -None"$pandas._typing.WindowingEngineKwargs * -min*pandas.core.window.expanding.Expanding.min"t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame* -self -?pandas.core.window.expanding.Expanding[pandas._typing.NDFrameT]t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"&pandas.core.window.expanding.Expanding*2 - numeric_only - builtins.bool" builtins.bool * -engine -BTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],None]] -7Union[Literal[builtins.str],Literal[builtins.str],None]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str -None"pandas._typing.WindowingEngine * - engine_kwargs -+TypeAlias[Union[TypeAlias[TypedDict],None]]} - Union[TypeAlias[TypedDict],None]M -TypeAlias[TypedDict] - TypedDict "$pandas._typing._WindowingNumbaKwargs -None"$pandas._typing.WindowingEngineKwargs * -mean+pandas.core.window.expanding.Expanding.mean"t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame* -self -?pandas.core.window.expanding.Expanding[pandas._typing.NDFrameT]t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"&pandas.core.window.expanding.Expanding*2 - numeric_only - builtins.bool" builtins.bool * -engine -BTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],None]] -7Union[Literal[builtins.str],Literal[builtins.str],None]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str -None"pandas._typing.WindowingEngine * - engine_kwargs -+TypeAlias[Union[TypeAlias[TypedDict],None]]} - Union[TypeAlias[TypedDict],None]M -TypeAlias[TypedDict] - TypedDict "$pandas._typing._WindowingNumbaKwargs -None"$pandas._typing.WindowingEngineKwargs * -median-pandas.core.window.expanding.Expanding.median"t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame* -self -?pandas.core.window.expanding.Expanding[pandas._typing.NDFrameT]t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"&pandas.core.window.expanding.Expanding*2 - numeric_only - builtins.bool" builtins.bool * -engine -BTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],None]] -7Union[Literal[builtins.str],Literal[builtins.str],None]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str -None"pandas._typing.WindowingEngine * - engine_kwargs -+TypeAlias[Union[TypeAlias[TypedDict],None]]} - Union[TypeAlias[TypedDict],None]M -TypeAlias[TypedDict] - TypedDict "$pandas._typing._WindowingNumbaKwargs -None"$pandas._typing.WindowingEngineKwargs * -std*pandas.core.window.expanding.Expanding.std"t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame* -self -?pandas.core.window.expanding.Expanding[pandas._typing.NDFrameT]t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"&pandas.core.window.expanding.Expanding*( -ddof - builtins.int" builtins.int *2 - numeric_only - builtins.bool" builtins.bool * -engine -BTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],None]] -7Union[Literal[builtins.str],Literal[builtins.str],None]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str -None"pandas._typing.WindowingEngine * - engine_kwargs -+TypeAlias[Union[TypeAlias[TypedDict],None]]} - Union[TypeAlias[TypedDict],None]M -TypeAlias[TypedDict] - TypedDict "$pandas._typing._WindowingNumbaKwargs -None"$pandas._typing.WindowingEngineKwargs * -var*pandas.core.window.expanding.Expanding.var"t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame* -self -?pandas.core.window.expanding.Expanding[pandas._typing.NDFrameT]t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"&pandas.core.window.expanding.Expanding*( -ddof - builtins.int" builtins.int *2 - numeric_only - builtins.bool" builtins.bool * -engine -BTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],None]] -7Union[Literal[builtins.str],Literal[builtins.str],None]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str -None"pandas._typing.WindowingEngine * - engine_kwargs -+TypeAlias[Union[TypeAlias[TypedDict],None]]} - Union[TypeAlias[TypedDict],None]M -TypeAlias[TypedDict] - TypedDict "$pandas._typing._WindowingNumbaKwargs -None"$pandas._typing.WindowingEngineKwargs * -sem*pandas.core.window.expanding.Expanding.sem"t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame* -self -?pandas.core.window.expanding.Expanding[pandas._typing.NDFrameT]t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"&pandas.core.window.expanding.Expanding*( -ddof - builtins.int" builtins.int *2 - numeric_only - builtins.bool" builtins.bool * -skew+pandas.core.window.expanding.Expanding.skew"t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame* -self -?pandas.core.window.expanding.Expanding[pandas._typing.NDFrameT]t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"&pandas.core.window.expanding.Expanding*2 - numeric_only - builtins.bool" builtins.bool * -kurt+pandas.core.window.expanding.Expanding.kurt"t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame* -self -?pandas.core.window.expanding.Expanding[pandas._typing.NDFrameT]t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"&pandas.core.window.expanding.Expanding*2 - numeric_only - builtins.bool" builtins.bool * -quantile/pandas.core.window.expanding.Expanding.quantile"t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame* -self -?pandas.core.window.expanding.Expanding[pandas._typing.NDFrameT]t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"&pandas.core.window.expanding.Expanding*. -quantile -builtins.float"builtins.float* - interpolation -TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -tUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"$pandas._typing.QuantileInterpolation *2 - numeric_only - builtins.bool" builtins.bool * -rank+pandas.core.window.expanding.Expanding.rank"t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame* -self -?pandas.core.window.expanding.Expanding[pandas._typing.NDFrameT]t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"&pandas.core.window.expanding.Expanding* -method -STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.WindowingRankType */ - ascending - builtins.bool" builtins.bool *) -pct - builtins.bool" builtins.bool *2 - numeric_only - builtins.bool" builtins.bool * -cov*pandas.core.window.expanding.Expanding.cov"t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame* -self -?pandas.core.window.expanding.Expanding[pandas._typing.NDFrameT]t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"&pandas.core.window.expanding.Expanding* -other -FUnion[pandas.core.frame.DataFrame,pandas.core.series.Series[Any],None]: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrameD -pandas.core.series.Series[Any] -Any"pandas.core.series.Series -None *W -pairwiseG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None *( -ddof - builtins.int" builtins.int *2 - numeric_only - builtins.bool" builtins.bool * -corr+pandas.core.window.expanding.Expanding.corr"t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame* -self -?pandas.core.window.expanding.Expanding[pandas._typing.NDFrameT]t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"&pandas.core.window.expanding.Expanding* -other -FUnion[pandas.core.frame.DataFrame,pandas.core.series.Series[Any],None]: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrameD -pandas.core.series.Series[Any] -Any"pandas.core.series.Series -None *W -pairwiseG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None *( -ddof - builtins.int" builtins.int *2 - numeric_only - builtins.bool" builtins.bool 2 - aggregate0pandas.core.window.expanding.Expanding.aggregate - aggregate0pandas.core.window.expanding.Expanding.aggregate"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -self -Fpandas.core.window.expanding.Expanding[pandas.core.series.Series[Any]]D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series"&pandas.core.window.expanding.Expanding* -func -JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] -?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K -CallableType[builtins.function]& -builtins.function"builtins.function - builtins.str" builtins.str - numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase* -args -Any* -kwargs -Any0:typing.overloadX - aggregate0pandas.core.window.expanding.Expanding.aggregate": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -self -Fpandas.core.window.expanding.Expanding[pandas.core.series.Series[Any]]D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series"&pandas.core.window.expanding.Expanding* -func -TypeAlias[Union[builtins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]],TypeAlias[typing.Mapping[pandas._typing.HashableT,Unknown]]]] -Union[builtins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]],TypeAlias[typing.Mapping[pandas._typing.HashableT,Unknown]]] -Ybuiltins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]] -JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] -?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K -CallableType[builtins.function]& -builtins.function"builtins.function - builtins.str" builtins.str - numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase" builtins.list -;TypeAlias[typing.Mapping[pandas._typing.HashableT,Unknown]] -0typing.Mapping[pandas._typing.HashableT,Unknown]Q -pandas._typing.HashableT" -typing.Hashable"typing.Hashable"typing.Hashable"typing.Mapping"$pandas._typing.AggFuncTypeDictSeries"'pandas._typing.AggFuncTypeSeriesToFrame* -args -Any* -kwargs -Any0:typing.overloadX - aggregate0pandas.core.window.expanding.Expanding.aggregate": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -self -Cpandas.core.window.expanding.Expanding[pandas.core.frame.DataFrame]: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame"&pandas.core.window.expanding.Expanding* -func -TypeAlias[Union[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]],builtins.list[Unknown],TypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]]]] -Union[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]],builtins.list[Unknown],TypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]]] -JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] -?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K -CallableType[builtins.function]& -builtins.function"builtins.function - builtins.str" builtins.str - numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase) -builtins.list[Unknown]" builtins.list -YTypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]] -Ntyping.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]Q -pandas._typing.HashableT" -typing.Hashable"typing.Hashable"typing.HashableV -%Union[Unknown,builtins.list[Unknown]]) -builtins.list[Unknown]" builtins.list"typing.Mapping"#pandas._typing.AggFuncTypeDictFrame"pandas._typing.AggFuncTypeFrame* -args -Any* -kwargs -Any0:typing.overloadXP -ExpandingGroupby-pandas.core.window.expanding.ExpandingGroupby",pandas.core.window.rolling.BaseWindowGroupby"&pandas.core.window.expanding.Expanding* +pandas.core.window.expandingj + Expanding&pandas.core.window.expanding.Expanding"3pandas.core.window.rolling.RollingAndExpandingMixinP +ExpandingGroupby-pandas.core.window.expanding.ExpandingGroupby",pandas.core.window.rolling.BaseWindowGroupby"&pandas.core.window.expanding.ExpandingP* __annotations__,pandas.core.window.expanding.__annotations__W builtins.dict[builtins.str,Any] builtins.str" builtins.str diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.window.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.window.protobuf index d971dde6e..ebea70988 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.window.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.window.protobuf @@ -1,80 +1,28 @@ -pandas.core.window_ -ExponentialMovingWindow.pandas.core.window.ewm.ExponentialMovingWindow"%pandas.core.window.rolling.BaseWindow* -__init__7pandas.core.window.ewm.ExponentialMovingWindow.__init__" -None* +pandas.core.window. +ExponentialMovingWindow.pandas.core.window.ewm.ExponentialMovingWindow"%pandas.core.window.rolling.BaseWindow* +online5pandas.core.window.ewm.ExponentialMovingWindow.online" +Mpandas.core.window.ewm.OnlineExponentialMovingWindow[pandas._typing.NDFrameT]t +pandas._typing.NDFrameT: +pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"4pandas.core.window.ewm.OnlineExponentialMovingWindow* self Gpandas.core.window.ewm.ExponentialMovingWindow[pandas._typing.NDFrameT]t pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame".pandas.core.window.ewm.ExponentialMovingWindow*} -objt -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame*U -comJ -Union[builtins.float,None] -builtins.float"builtins.float -None *V -spanJ -Union[builtins.float,None] -builtins.float"builtins.float -None * -halflife -Union[TypeAlias[Union[pandas._libs.tslibs.timedeltas.Timedelta,datetime.timedelta,numpy.timedelta64,TypeAlias[numpy.signedinteger[numpy._typing._64Bit]],builtins.float,builtins.str]],None] -TypeAlias[Union[pandas._libs.tslibs.timedeltas.Timedelta,datetime.timedelta,numpy.timedelta64,TypeAlias[numpy.signedinteger[numpy._typing._64Bit]],builtins.float,builtins.str]] -Union[pandas._libs.tslibs.timedeltas.Timedelta,datetime.timedelta,numpy.timedelta64,TypeAlias[numpy.signedinteger[numpy._typing._64Bit]],builtins.float,builtins.str]T -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta( -datetime.timedelta"datetime.timedelta& -numpy.timedelta64"numpy.timedelta64 -4TypeAlias[numpy.signedinteger[numpy._typing._64Bit]]n -)numpy.signedinteger[numpy._typing._64Bit], -numpy._typing._64Bit"numpy._typing._64Bit"numpy.signedinteger" numpy.int64 -builtins.float"builtins.float - builtins.str" builtins.str"(pandas._typing.TimedeltaConvertibleTypes -None *W -alphaJ -Union[builtins.float,None] -builtins.float"builtins.float -None *W - min_periodsD -Union[builtins.int,None] - builtins.int" builtins.int -None *, -adjust - builtins.bool" builtins.bool */ - ignore_na - builtins.bool" builtins.bool * -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -times -`Union[builtins.str,numpy.ndarray[Any,Any],pandas.core.series.Series[Any],None,numpy.timedelta64] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarrayD -pandas.core.series.Series[Any] -Any"pandas.core.series.Series -None& -numpy.timedelta64"numpy.timedelta64 * -method -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 +pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame".pandas.core.window.ewm.ExponentialMovingWindow* +engine +BTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],None]] +7Union[Literal[builtins.str],Literal[builtins.str],None]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.CalculationMethod * + builtins.str" builtins.str +None"pandas._typing.WindowingEngine * + engine_kwargs ++TypeAlias[Union[TypeAlias[TypedDict],None]]} + Union[TypeAlias[TypedDict],None]M +TypeAlias[TypedDict] + TypedDict "$pandas._typing._WindowingNumbaKwargs +None"$pandas._typing.WindowingEngineKwargs * mean3pandas.core.window.ewm.ExponentialMovingWindow.mean"t pandas._typing.NDFrameT: pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame* @@ -84,7 +32,7 @@ Gpandas.core.window.ewm.ExponentialMovingWindow[pandas._typing.NDFrameT]t pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame".pandas.core.window.ewm.ExponentialMovingWindow*2 numeric_only builtins.bool" builtins.bool * -engine +engine BTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],None]] 7Union[Literal[builtins.str],Literal[builtins.str],None]7 Literal[builtins.str]  @@ -92,7 +40,7 @@ BTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],None]] Literal[builtins.str]  builtins.str" builtins.str None"pandas._typing.WindowingEngine * - engine_kwargs + engine_kwargs +TypeAlias[Union[TypeAlias[TypedDict],None]]} Union[TypeAlias[TypedDict],None]M TypeAlias[TypedDict] @@ -107,7 +55,7 @@ Gpandas.core.window.ewm.ExponentialMovingWindow[pandas._typing.NDFrameT]t pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame".pandas.core.window.ewm.ExponentialMovingWindow*2 numeric_only builtins.bool" builtins.bool * -engine +engine BTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],None]] 7Union[Literal[builtins.str],Literal[builtins.str],None]7 Literal[builtins.str]  @@ -115,7 +63,7 @@ BTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],None]] Literal[builtins.str]  builtins.str" builtins.str None"pandas._typing.WindowingEngine * - engine_kwargs + engine_kwargs +TypeAlias[Union[TypeAlias[TypedDict],None]]} Union[TypeAlias[TypedDict],None]M TypeAlias[TypedDict] @@ -182,581 +130,12 @@ FUnion[pandas.core.frame.DataFrame,pandas.core.series.Series[Any],None]: builtins.bool" builtins.bool None *2 numeric_only - builtins.bool" builtins.bool 2 - aggregate8pandas.core.window.ewm.ExponentialMovingWindow.aggregate - aggregate8pandas.core.window.ewm.ExponentialMovingWindow.aggregate"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -self -Npandas.core.window.ewm.ExponentialMovingWindow[pandas.core.series.Series[Any]]D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series".pandas.core.window.ewm.ExponentialMovingWindow* -func -JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] -?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K -CallableType[builtins.function]& -builtins.function"builtins.function - builtins.str" builtins.str - numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase* -args -Any* -kwargs -Any0:typing.overloadX - aggregate8pandas.core.window.ewm.ExponentialMovingWindow.aggregate": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -self -Npandas.core.window.ewm.ExponentialMovingWindow[pandas.core.series.Series[Any]]D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series".pandas.core.window.ewm.ExponentialMovingWindow* -func -TypeAlias[Union[builtins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]],TypeAlias[typing.Mapping[pandas._typing.HashableT,Unknown]]]] -Union[builtins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]],TypeAlias[typing.Mapping[pandas._typing.HashableT,Unknown]]] -Ybuiltins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]] -JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] -?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K -CallableType[builtins.function]& -builtins.function"builtins.function - builtins.str" builtins.str - numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase" builtins.list -;TypeAlias[typing.Mapping[pandas._typing.HashableT,Unknown]] -0typing.Mapping[pandas._typing.HashableT,Unknown]Q -pandas._typing.HashableT" -typing.Hashable"typing.Hashable"typing.Hashable"typing.Mapping"$pandas._typing.AggFuncTypeDictSeries"'pandas._typing.AggFuncTypeSeriesToFrame* -args -Any* -kwargs -Any0:typing.overloadX - aggregate8pandas.core.window.ewm.ExponentialMovingWindow.aggregate": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -self -Kpandas.core.window.ewm.ExponentialMovingWindow[pandas.core.frame.DataFrame]: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame".pandas.core.window.ewm.ExponentialMovingWindow* -func -TypeAlias[Union[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]],builtins.list[Unknown],TypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]]]] -Union[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]],builtins.list[Unknown],TypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]]] -JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] -?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K -CallableType[builtins.function]& -builtins.function"builtins.function - builtins.str" builtins.str - numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase) -builtins.list[Unknown]" builtins.list -YTypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]] -Ntyping.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]Q -pandas._typing.HashableT" -typing.Hashable"typing.Hashable"typing.HashableV -%Union[Unknown,builtins.list[Unknown]]) -builtins.list[Unknown]" builtins.list"typing.Mapping"#pandas._typing.AggFuncTypeDictFrame"pandas._typing.AggFuncTypeFrame* -args -Any* -kwargs -Any0:typing.overloadXP - Expanding&pandas.core.window.expanding.Expanding"3pandas.core.window.rolling.RollingAndExpandingMixin* -count,pandas.core.window.expanding.Expanding.count"t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame* -self -?pandas.core.window.expanding.Expanding[pandas._typing.NDFrameT]t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"&pandas.core.window.expanding.Expanding* - -apply,pandas.core.window.expanding.Expanding.apply"t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame* -self -?pandas.core.window.expanding.Expanding[pandas._typing.NDFrameT]t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"&pandas.core.window.expanding.Expanding*U -funcK -CallableType[builtins.function]& -builtins.function"builtins.function*) -raw - builtins.bool" builtins.bool * -engine -BTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],None]] -7Union[Literal[builtins.str],Literal[builtins.str],None]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str -None"pandas._typing.WindowingEngine * - engine_kwargs -+TypeAlias[Union[TypeAlias[TypedDict],None]]} - Union[TypeAlias[TypedDict],None]M -TypeAlias[TypedDict] - TypedDict "$pandas._typing._WindowingNumbaKwargs -None"$pandas._typing.WindowingEngineKwargs *i -args] -Union[builtins.tuple[Any],None]. -builtins.tuple[Any] -Any"builtins.tuple -None * -kwargs -+Union[builtins.dict[builtins.str,Any],None]W -builtins.dict[builtins.str,Any] - builtins.str" builtins.str -Any" builtins.dict -None * -sum*pandas.core.window.expanding.Expanding.sum"t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame* -self -?pandas.core.window.expanding.Expanding[pandas._typing.NDFrameT]t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"&pandas.core.window.expanding.Expanding*2 - numeric_only - builtins.bool" builtins.bool * -engine -BTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],None]] -7Union[Literal[builtins.str],Literal[builtins.str],None]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str -None"pandas._typing.WindowingEngine * - engine_kwargs -+TypeAlias[Union[TypeAlias[TypedDict],None]]} - Union[TypeAlias[TypedDict],None]M -TypeAlias[TypedDict] - TypedDict "$pandas._typing._WindowingNumbaKwargs -None"$pandas._typing.WindowingEngineKwargs * -max*pandas.core.window.expanding.Expanding.max"t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame* -self -?pandas.core.window.expanding.Expanding[pandas._typing.NDFrameT]t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"&pandas.core.window.expanding.Expanding*2 - numeric_only - builtins.bool" builtins.bool * -engine -BTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],None]] -7Union[Literal[builtins.str],Literal[builtins.str],None]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str -None"pandas._typing.WindowingEngine * - engine_kwargs -+TypeAlias[Union[TypeAlias[TypedDict],None]]} - Union[TypeAlias[TypedDict],None]M -TypeAlias[TypedDict] - TypedDict "$pandas._typing._WindowingNumbaKwargs -None"$pandas._typing.WindowingEngineKwargs * -min*pandas.core.window.expanding.Expanding.min"t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame* -self -?pandas.core.window.expanding.Expanding[pandas._typing.NDFrameT]t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"&pandas.core.window.expanding.Expanding*2 - numeric_only - builtins.bool" builtins.bool * -engine -BTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],None]] -7Union[Literal[builtins.str],Literal[builtins.str],None]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str -None"pandas._typing.WindowingEngine * - engine_kwargs -+TypeAlias[Union[TypeAlias[TypedDict],None]]} - Union[TypeAlias[TypedDict],None]M -TypeAlias[TypedDict] - TypedDict "$pandas._typing._WindowingNumbaKwargs -None"$pandas._typing.WindowingEngineKwargs * -mean+pandas.core.window.expanding.Expanding.mean"t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame* -self -?pandas.core.window.expanding.Expanding[pandas._typing.NDFrameT]t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"&pandas.core.window.expanding.Expanding*2 - numeric_only - builtins.bool" builtins.bool * -engine -BTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],None]] -7Union[Literal[builtins.str],Literal[builtins.str],None]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str -None"pandas._typing.WindowingEngine * - engine_kwargs -+TypeAlias[Union[TypeAlias[TypedDict],None]]} - Union[TypeAlias[TypedDict],None]M -TypeAlias[TypedDict] - TypedDict "$pandas._typing._WindowingNumbaKwargs -None"$pandas._typing.WindowingEngineKwargs * -median-pandas.core.window.expanding.Expanding.median"t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame* -self -?pandas.core.window.expanding.Expanding[pandas._typing.NDFrameT]t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"&pandas.core.window.expanding.Expanding*2 - numeric_only - builtins.bool" builtins.bool * -engine -BTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],None]] -7Union[Literal[builtins.str],Literal[builtins.str],None]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str -None"pandas._typing.WindowingEngine * - engine_kwargs -+TypeAlias[Union[TypeAlias[TypedDict],None]]} - Union[TypeAlias[TypedDict],None]M -TypeAlias[TypedDict] - TypedDict "$pandas._typing._WindowingNumbaKwargs -None"$pandas._typing.WindowingEngineKwargs * -std*pandas.core.window.expanding.Expanding.std"t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame* -self -?pandas.core.window.expanding.Expanding[pandas._typing.NDFrameT]t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"&pandas.core.window.expanding.Expanding*( -ddof - builtins.int" builtins.int *2 - numeric_only - builtins.bool" builtins.bool * -engine -BTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],None]] -7Union[Literal[builtins.str],Literal[builtins.str],None]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str -None"pandas._typing.WindowingEngine * - engine_kwargs -+TypeAlias[Union[TypeAlias[TypedDict],None]]} - Union[TypeAlias[TypedDict],None]M -TypeAlias[TypedDict] - TypedDict "$pandas._typing._WindowingNumbaKwargs -None"$pandas._typing.WindowingEngineKwargs * -var*pandas.core.window.expanding.Expanding.var"t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame* -self -?pandas.core.window.expanding.Expanding[pandas._typing.NDFrameT]t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"&pandas.core.window.expanding.Expanding*( -ddof - builtins.int" builtins.int *2 - numeric_only - builtins.bool" builtins.bool * -engine -BTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],None]] -7Union[Literal[builtins.str],Literal[builtins.str],None]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str -None"pandas._typing.WindowingEngine * - engine_kwargs -+TypeAlias[Union[TypeAlias[TypedDict],None]]} - Union[TypeAlias[TypedDict],None]M -TypeAlias[TypedDict] - TypedDict "$pandas._typing._WindowingNumbaKwargs -None"$pandas._typing.WindowingEngineKwargs * -sem*pandas.core.window.expanding.Expanding.sem"t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame* -self -?pandas.core.window.expanding.Expanding[pandas._typing.NDFrameT]t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"&pandas.core.window.expanding.Expanding*( -ddof - builtins.int" builtins.int *2 - numeric_only - builtins.bool" builtins.bool * -skew+pandas.core.window.expanding.Expanding.skew"t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame* -self -?pandas.core.window.expanding.Expanding[pandas._typing.NDFrameT]t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"&pandas.core.window.expanding.Expanding*2 - numeric_only - builtins.bool" builtins.bool * -kurt+pandas.core.window.expanding.Expanding.kurt"t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame* -self -?pandas.core.window.expanding.Expanding[pandas._typing.NDFrameT]t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"&pandas.core.window.expanding.Expanding*2 - numeric_only - builtins.bool" builtins.bool * -quantile/pandas.core.window.expanding.Expanding.quantile"t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame* -self -?pandas.core.window.expanding.Expanding[pandas._typing.NDFrameT]t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"&pandas.core.window.expanding.Expanding*. -quantile -builtins.float"builtins.float* - interpolation -TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -tUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"$pandas._typing.QuantileInterpolation *2 - numeric_only - builtins.bool" builtins.bool * -rank+pandas.core.window.expanding.Expanding.rank"t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame* -self -?pandas.core.window.expanding.Expanding[pandas._typing.NDFrameT]t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"&pandas.core.window.expanding.Expanding* -method -STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.WindowingRankType */ - ascending - builtins.bool" builtins.bool *) -pct - builtins.bool" builtins.bool *2 - numeric_only - builtins.bool" builtins.bool * -cov*pandas.core.window.expanding.Expanding.cov"t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame* -self -?pandas.core.window.expanding.Expanding[pandas._typing.NDFrameT]t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"&pandas.core.window.expanding.Expanding* -other -FUnion[pandas.core.frame.DataFrame,pandas.core.series.Series[Any],None]: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrameD -pandas.core.series.Series[Any] -Any"pandas.core.series.Series -None *W -pairwiseG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None *( -ddof - builtins.int" builtins.int *2 - numeric_only - builtins.bool" builtins.bool * -corr+pandas.core.window.expanding.Expanding.corr"t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame* -self -?pandas.core.window.expanding.Expanding[pandas._typing.NDFrameT]t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"&pandas.core.window.expanding.Expanding* -other -FUnion[pandas.core.frame.DataFrame,pandas.core.series.Series[Any],None]: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrameD -pandas.core.series.Series[Any] -Any"pandas.core.series.Series -None *W -pairwiseG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None *( -ddof - builtins.int" builtins.int *2 - numeric_only - builtins.bool" builtins.bool 2 - aggregate0pandas.core.window.expanding.Expanding.aggregate - aggregate0pandas.core.window.expanding.Expanding.aggregate"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -self -Fpandas.core.window.expanding.Expanding[pandas.core.series.Series[Any]]D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series"&pandas.core.window.expanding.Expanding* -func -JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] -?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K -CallableType[builtins.function]& -builtins.function"builtins.function - builtins.str" builtins.str - numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase* -args -Any* -kwargs -Any0:typing.overloadX - aggregate0pandas.core.window.expanding.Expanding.aggregate": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -self -Fpandas.core.window.expanding.Expanding[pandas.core.series.Series[Any]]D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series"&pandas.core.window.expanding.Expanding* -func -TypeAlias[Union[builtins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]],TypeAlias[typing.Mapping[pandas._typing.HashableT,Unknown]]]] -Union[builtins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]],TypeAlias[typing.Mapping[pandas._typing.HashableT,Unknown]]] -Ybuiltins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]] -JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] -?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K -CallableType[builtins.function]& -builtins.function"builtins.function - builtins.str" builtins.str - numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase" builtins.list -;TypeAlias[typing.Mapping[pandas._typing.HashableT,Unknown]] -0typing.Mapping[pandas._typing.HashableT,Unknown]Q -pandas._typing.HashableT" -typing.Hashable"typing.Hashable"typing.Hashable"typing.Mapping"$pandas._typing.AggFuncTypeDictSeries"'pandas._typing.AggFuncTypeSeriesToFrame* -args -Any* -kwargs -Any0:typing.overloadX - aggregate0pandas.core.window.expanding.Expanding.aggregate": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -self -Cpandas.core.window.expanding.Expanding[pandas.core.frame.DataFrame]: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame"&pandas.core.window.expanding.Expanding* -func -TypeAlias[Union[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]],builtins.list[Unknown],TypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]]]] -Union[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]],builtins.list[Unknown],TypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]]] -JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] -?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K -CallableType[builtins.function]& -builtins.function"builtins.function - builtins.str" builtins.str - numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase) -builtins.list[Unknown]" builtins.list -YTypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]] -Ntyping.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]Q -pandas._typing.HashableT" -typing.Hashable"typing.Hashable"typing.HashableV -%Union[Unknown,builtins.list[Unknown]]) -builtins.list[Unknown]" builtins.list"typing.Mapping"#pandas._typing.AggFuncTypeDictFrame"pandas._typing.AggFuncTypeFrame* -args -Any* -kwargs -Any0:typing.overloadXP -ExpandingGroupby-pandas.core.window.expanding.ExpandingGroupby",pandas.core.window.rolling.BaseWindowGroupby"&pandas.core.window.expanding.Expanding) -Rolling"pandas.core.window.rolling.Rolling"3pandas.core.window.rolling.RollingAndExpandingMixin* -apply(pandas.core.window.rolling.Rolling.apply"t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame* -self -;pandas.core.window.rolling.Rolling[pandas._typing.NDFrameT]t -pandas._typing.NDFrameT: -pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame""pandas.core.window.rolling.Rolling*U -funcK -CallableType[builtins.function]& -builtins.function"builtins.function*) -raw - builtins.bool" builtins.bool * -engine -BTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],None]] -7Union[Literal[builtins.str],Literal[builtins.str],None]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str -None"pandas._typing.WindowingEngine * - engine_kwargs -7Union[TypeAlias[Union[TypeAlias[TypedDict],None]],None] -+TypeAlias[Union[TypeAlias[TypedDict],None]]} - Union[TypeAlias[TypedDict],None]M -TypeAlias[TypedDict] - TypedDict "$pandas._typing._WindowingNumbaKwargs -None"$pandas._typing.WindowingEngineKwargs -None *i -args] -Union[builtins.tuple[Any],None]. -builtins.tuple[Any] -Any"builtins.tuple -None * -kwargs -+Union[builtins.dict[builtins.str,Any],None]W -builtins.dict[builtins.str,Any] - builtins.str" builtins.str -Any" builtins.dict -None 2 - aggregate,pandas.core.window.rolling.Rolling.aggregate - aggregate,pandas.core.window.rolling.Rolling.aggregate"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -self -Bpandas.core.window.rolling.Rolling[pandas.core.series.Series[Any]]D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series""pandas.core.window.rolling.Rolling* -func -JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] -?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K -CallableType[builtins.function]& -builtins.function"builtins.function - builtins.str" builtins.str - numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase* -args -Any* -kwargs -Any0:typing.overloadX - aggregate,pandas.core.window.rolling.Rolling.aggregate": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -self -Bpandas.core.window.rolling.Rolling[pandas.core.series.Series[Any]]D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series""pandas.core.window.rolling.Rolling* -func -TypeAlias[Union[builtins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]],TypeAlias[typing.Mapping[pandas._typing.HashableT,Unknown]]]] -Union[builtins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]],TypeAlias[typing.Mapping[pandas._typing.HashableT,Unknown]]] -Ybuiltins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]] -JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] -?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K -CallableType[builtins.function]& -builtins.function"builtins.function - builtins.str" builtins.str - numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase" builtins.list -;TypeAlias[typing.Mapping[pandas._typing.HashableT,Unknown]] -0typing.Mapping[pandas._typing.HashableT,Unknown]Q -pandas._typing.HashableT" -typing.Hashable"typing.Hashable"typing.Hashable"typing.Mapping"$pandas._typing.AggFuncTypeDictSeries"'pandas._typing.AggFuncTypeSeriesToFrame* -args -Any* -kwargs -Any0:typing.overloadX - aggregate,pandas.core.window.rolling.Rolling.aggregate": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -self -?pandas.core.window.rolling.Rolling[pandas.core.frame.DataFrame]: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame""pandas.core.window.rolling.Rolling* -func -TypeAlias[Union[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]],builtins.list[Unknown],TypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]]]] -Union[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]],builtins.list[Unknown],TypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]]] -JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] -?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K -CallableType[builtins.function]& -builtins.function"builtins.function - builtins.str" builtins.str - numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase) -builtins.list[Unknown]" builtins.list -YTypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]] -Ntyping.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]Q -pandas._typing.HashableT" -typing.Hashable"typing.Hashable"typing.HashableV -%Union[Unknown,builtins.list[Unknown]]) -builtins.list[Unknown]" builtins.list"typing.Mapping"#pandas._typing.AggFuncTypeDictFrame"pandas._typing.AggFuncTypeFrame* -args -Any* -kwargs -Any0:typing.overloadXP -RollingGroupby)pandas.core.window.rolling.RollingGroupby",pandas.core.window.rolling.BaseWindowGroupby""pandas.core.window.rolling.RollingP- + builtins.bool" builtins.bool P +ExponentialMovingWindowGroupby5pandas.core.window.ewm.ExponentialMovingWindowGroupby",pandas.core.window.rolling.BaseWindowGroupby".pandas.core.window.ewm.ExponentialMovingWindowPj + Expanding&pandas.core.window.expanding.Expanding"3pandas.core.window.rolling.RollingAndExpandingMixinP +ExpandingGroupby-pandas.core.window.expanding.ExpandingGroupby",pandas.core.window.rolling.BaseWindowGroupby"&pandas.core.window.expanding.ExpandingPd +Rolling"pandas.core.window.rolling.Rolling"3pandas.core.window.rolling.RollingAndExpandingMixinP +RollingGroupby)pandas.core.window.rolling.RollingGroupby",pandas.core.window.rolling.BaseWindowGroupby""pandas.core.window.rolling.RollingP Window!pandas.core.window.rolling.Window"%pandas.core.window.rolling.BaseWindow* sum%pandas.core.window.rolling.Window.sum"t pandas._typing.NDFrameT: @@ -779,7 +158,7 @@ Ntyping.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]] numeric_only builtins.bool" builtins.bool * kwargs -Any* +Any* var%pandas.core.window.rolling.Window.var"t pandas._typing.NDFrameT: pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame* @@ -790,11 +169,9 @@ Ntyping.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]] ddof builtins.int" builtins.int *2 numeric_only - builtins.bool" builtins.bool * -args -Any* + builtins.bool" builtins.bool * kwargs -Any* +Any* std%pandas.core.window.rolling.Window.std"t pandas._typing.NDFrameT: pandas.core.generic.NDFrame"pandas.core.generic.NDFrame"pandas.core.generic.NDFrame* @@ -805,79 +182,9 @@ Ntyping.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]] ddof builtins.int" builtins.int *2 numeric_only - builtins.bool" builtins.bool * -args -Any* -kwargs -Any2 - aggregate+pandas.core.window.rolling.Window.aggregate - aggregate+pandas.core.window.rolling.Window.aggregate"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -self -Apandas.core.window.rolling.Window[pandas.core.series.Series[Any]]D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series"!pandas.core.window.rolling.Window* -func -JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] -?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K -CallableType[builtins.function]& -builtins.function"builtins.function - builtins.str" builtins.str - numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase* -args -Any* -kwargs -Any0:typing.overloadX - aggregate+pandas.core.window.rolling.Window.aggregate": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -self -Apandas.core.window.rolling.Window[pandas.core.series.Series[Any]]D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series"!pandas.core.window.rolling.Window* -func -TypeAlias[Union[builtins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]],TypeAlias[typing.Mapping[pandas._typing.HashableT,Unknown]]]] -Union[builtins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]],TypeAlias[typing.Mapping[pandas._typing.HashableT,Unknown]]] -Ybuiltins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]] -JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] -?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K -CallableType[builtins.function]& -builtins.function"builtins.function - builtins.str" builtins.str - numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase" builtins.list -;TypeAlias[typing.Mapping[pandas._typing.HashableT,Unknown]] -0typing.Mapping[pandas._typing.HashableT,Unknown]Q -pandas._typing.HashableT" -typing.Hashable"typing.Hashable"typing.Hashable"typing.Mapping"$pandas._typing.AggFuncTypeDictSeries"'pandas._typing.AggFuncTypeSeriesToFrame* -args -Any* -kwargs -Any0:typing.overloadX - aggregate+pandas.core.window.rolling.Window.aggregate": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -self ->pandas.core.window.rolling.Window[pandas.core.frame.DataFrame]: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame"!pandas.core.window.rolling.Window* -func -TypeAlias[Union[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]],builtins.list[Unknown],TypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]]]] -Union[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]],builtins.list[Unknown],TypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]]] -JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] -?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K -CallableType[builtins.function]& -builtins.function"builtins.function - builtins.str" builtins.str - numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase) -builtins.list[Unknown]" builtins.list -YTypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]] -Ntyping.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]Q -pandas._typing.HashableT" -typing.Hashable"typing.Hashable"typing.HashableV -%Union[Unknown,builtins.list[Unknown]]) -builtins.list[Unknown]" builtins.list"typing.Mapping"#pandas._typing.AggFuncTypeDictFrame"pandas._typing.AggFuncTypeFrame* -args -Any* + builtins.bool" builtins.bool * kwargs -Any0:typing.overloadXP*s +AnyP*s __path__pandas.core.window.__path__J builtins.list[builtins.str] builtins.str" builtins.str" builtins.list* diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.window.rolling.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.core.window.rolling.protobuf index 8ef43f5b8200b77243c523ba576ed93d914bf622..73f2f747c7fbc0dc6b0a511b27c552214715bc2a 100644 GIT binary patch delta 1596 zcmb7DPiPcZ80XE*ZZ_YVWHPuSV-u5!ZPs;tK?y1~4ccf+4v7()2ud={W?tgR?94jz z)+DDWQZJ>F2EaGBK*0luztAVN(AD%K1rxWNw#pZD;}P@uKg}RiW%aktMCD0Psoyb z4?%AT6rTQuH1<64N#Pto5~VH*>WX}2?pv?cfw{BnDGaS?K@wn>|Y&j;GCO*y>KEeH=ahSh- zG(G4#WK>4H%k}0UbgUp`kv6UM{oZN}q%gf4_0C2hI&Ql@F`03srEo4DFInn+3G(bg z#~OD2^EB%kNjENbq}~z1V#e@f{phG%r(P3aj5U6}HRu{q&~~l8Tw1SCsHFFCOm1giolCzvT1TSG?C4pI7?dP@Es}-nN@k zlc2m?R;z)9lb#)d&ng7IzX@%Hew@#?chyktx7@C_=+XUFkxN~wSU-&*p0yl3M?A|l zePv6i_9U)?J~YGCRoP~_{z#~i@(3%|*jRs)cLG6-k2KU0DJ^FwuGlq-gsWAxHtesy zdhmuoGNvuRq_GGN@2ok~8uzXX5X};L#9fqr$x_b<@CDcR&XT@=MzEFZdkZ@>l4t)N zYHsc`?D4#9P`=dz#qb{&WVGs86GRUdwWzdnLe{bQj%d)L{38l4#o$Te5n{IziMp2} zh(0yhLSjRpt-Tb2tEC~NTxI_zr|Vyc5E*y#4rR@owgumAJcU@cw>yY!a_fS}W+!6v zI~6vE?*`v>zd}oqA9gH9e(8C=%x8XAZ**yt(%&g8MFs|>XygAeh#kut4z+Be^sxOK ny90LMG?F?29Sb%L?`c3LJDSM^9aEc;l9E9%sS>M*ybZkpZt5Wz delta 888 zcmZ2-g7Lx!#tE`aPn0IghccaEnrzMN$j#2h?3h<6z^e6taq=4G2TWRWlN+Ptn6zvr zi?UfUX)$bm#{Q9S@+tZMOt*A5pH}$J%+bxl#axzHBs6&;qs-(F3T&I-sO({!JVQ*K zS*x36^M17_V2*&%VOcKD#Psx{)bzxXR3Yujh3bk@dT;@$eXJPLlcP8S`L{E2u@tA~ zqzN!etzqPH1ZvZqyox)1vXX}K=3LG;M*jKSm>Si&-SKKP;3;I`U&@1B<0^!W^BKA9 zz&1t*22EC1Q{H@0kd>8HXht!Y#N47#fwPJU>9lS_(&iv`3JVB6fO zFUZJebQU>XOfFQAo$O%5E`gLX4kD)vm;!Lx*oko2Iz}!hkjogOCr{*%oP3{~b@D$B z52zb+INKR{7a^w;xG|uVLaZ_RJVh+LE09wSiZQ_C2}`L98M*Ai;S?Yk1$Dy(K{nRS I&y%zn0jx3+82|tP diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.io.api.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.io.api.protobuf index f127e7989..89c137a66 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.io.api.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.io.api.protobuf @@ -1,5 +1,5 @@ - pandas.io.api + pandas.io.api ExcelFilepandas.io.excel._base.ExcelFile"builtins.object* __init__(pandas.io.excel._base.ExcelFile.__init__" @@ -76,8 +76,8 @@ $pandas.io.excel._base.ExcelFile.SelfB None* __del__'pandas.io.excel._base.ExcelFile.__del__" None*DB -pandas.io.excel._base.ExcelFile"pandas.io.excel._base.ExcelFile2d -parse%pandas.io.excel._base.ExcelFile.parse3 +pandas.io.excel._base.ExcelFile"pandas.io.excel._base.ExcelFile2e +parse%pandas.io.excel._base.ExcelFile.parse3 parse%pandas.io.excel._base.ExcelFile.parse" Kbuiltins.dict[Union[builtins.int,builtins.str],pandas.core.frame.DataFrame]` Union[builtins.int,builtins.str] @@ -120,27 +120,24 @@ sheet_name builtins.int" builtins.intN typing.Sequence[builtins.int] builtins.int" builtins.int"typing.Sequence -None * - -usecols - -Union[builtins.str,TypeAlias[Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]]] - builtins.str" builtins.str -TypeAlias[Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]] -Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]\ -$typing.MutableSequence[builtins.str] - builtins.str" builtins.str"typing.MutableSequenceL -builtins.tuple[builtins.str] - builtins.str" builtins.str"builtins.tupleN -typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.SequenceD -pandas.core.series.Series[Any] -Any"pandas.core.series.SeriesN +None * +usecols +Union[builtins.str,TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]]] + builtins.str" builtins.str +TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]] +Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]s +.pandas._typing.SequenceNotStr[typing.Hashable]" +typing.Hashable"typing.Hashable"pandas._typing.SequenceNotStr +builtins.range"builtins.range +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index9 +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarrayK +Any" numpy.ndarray"pandas._typing.AnyArrayLikeK CallableType[builtins.function]& builtins.function"builtins.function None"pandas._typing.UsecolsArgType * @@ -225,7 +222,7 @@ skipfooter na_filter builtins.bool" builtins.bool * kwds -Any0:typing.overloadX0 +Any0:typing.overloadX1 parse%pandas.io.excel._base.ExcelFile.parse": pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*L selfB @@ -261,27 +258,24 @@ sheet_name` builtins.int" builtins.intN typing.Sequence[builtins.int] builtins.int" builtins.int"typing.Sequence -None * - -usecols - -Union[builtins.str,TypeAlias[Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]]] - builtins.str" builtins.str -TypeAlias[Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]] -Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]\ -$typing.MutableSequence[builtins.str] - builtins.str" builtins.str"typing.MutableSequenceL -builtins.tuple[builtins.str] - builtins.str" builtins.str"builtins.tupleN -typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.SequenceD -pandas.core.series.Series[Any] -Any"pandas.core.series.SeriesN +None * +usecols +Union[builtins.str,TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]]] + builtins.str" builtins.str +TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]] +Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]s +.pandas._typing.SequenceNotStr[typing.Hashable]" +typing.Hashable"typing.Hashable"pandas._typing.SequenceNotStr +builtins.range"builtins.range +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index9 +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarrayK +Any" numpy.ndarray"pandas._typing.AnyArrayLikeK CallableType[builtins.function]& builtins.function"builtins.function None"pandas._typing.UsecolsArgType * @@ -378,8 +372,8 @@ xUnion[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.R builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathh )pandas._typing.ReadBuffer[builtins.bytes] builtins.bytes"builtins.bytes"pandas._typing.ReadBuffer -builtins.bytes"builtins.bytes* - ExcelWriter!pandas.io.excel._base.ExcelWriter"builtins.object* +builtins.bytes"builtins.bytes- + ExcelWriter!pandas.io.excel._base.ExcelWriter"builtins.object* __init__*pandas.io.excel._base.ExcelWriter.__init__" None*P selfF @@ -392,15 +386,17 @@ xUnion[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.R os.PathLike[builtins.str] builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathB pandas._typing.WriteExcelBuffer"pandas._typing.WriteExcelBufferF -!pandas.io.excel._base.ExcelWriter"!pandas.io.excel._base.ExcelWriter* -engine -cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]7 +!pandas.io.excel._base.ExcelWriter"!pandas.io.excel._base.ExcelWriter* +engine +uUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],Literal[builtins.str],None] +STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str7 + builtins.str" builtins.str"pandas._typing.ExcelWriteEngine7 Literal[builtins.str]  builtins.str" builtins.str None *W @@ -446,15 +442,16 @@ cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal builtins.tuple[builtins.str] builtins.str" builtins.str"builtins.tuple*P selfF -!pandas.io.excel._base.ExcelWriter"!pandas.io.excel._base.ExcelWriter0:builtins.property`* -engine(pandas.io.excel._base.ExcelWriter.engine" +!pandas.io.excel._base.ExcelWriter"!pandas.io.excel._base.ExcelWriter0:builtins.property`* +engine(pandas.io.excel._base.ExcelWriter.engine" +STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str*P + builtins.str" builtins.str"pandas._typing.ExcelWriteEngine*P selfF !pandas.io.excel._base.ExcelWriter"!pandas.io.excel._base.ExcelWriter0:builtins.property`* sheets(pandas.io.excel._base.ExcelWriter.sheets"W @@ -1066,7 +1063,7 @@ MUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None] builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str -None + +None 0 read_htmlpandas.io.html.read_html"w *builtins.list[pandas.core.frame.DataFrame]: pandas.core.frame.DataFrame"pandas.core.frame.DataFrame" builtins.list* @@ -1084,10 +1081,18 @@ gUnion[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.R builtins.str" builtins.str& re.Pattern[Any] Any" -re.Pattern *R -flavorD -Union[builtins.str,None] - builtins.str" builtins.str +re.Pattern * +flavor +xUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],typing.Sequence[Unknown],None] +STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.HTMLFlavors- +typing.Sequence[Unknown]"typing.Sequence None * header 6Union[builtins.int,typing.Sequence[builtins.int],None] @@ -1196,7 +1201,14 @@ tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],TypeAlias[L builtins.str" builtins.str"pandas._typing.DtypeBackend /TypeAlias[Literal[pandas._libs.lib._NoDefault]]d $Literal[pandas._libs.lib._NoDefault] : -pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault  +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault * +storage_options +6TypeAlias[Union[builtins.dict[builtins.str,Any],None]] ++Union[builtins.dict[builtins.str,Any],None]W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict +None"pandas._typing.StorageOptions  read_orcpandas.io.orc.read_orc": pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* path @@ -1517,8 +1529,8 @@ tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],TypeAlias[L builtins.str" builtins.str"pandas._typing.DtypeBackend /TypeAlias[Literal[pandas._libs.lib._NoDefault]]d $Literal[pandas._libs.lib._NoDefault] : -pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault " -read_clipboard#pandas.io.clipboards.read_clipboardb +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault "Ȭ +read_clipboard#pandas.io.clipboards.read_clipboardd read_clipboard#pandas.io.clipboards.read_clipboard"T (pandas.io.parsers.readers.TextFileReader"(pandas.io.parsers.readers.TextFileReader*O sepD @@ -1573,23 +1585,22 @@ nUnion[builtins.int,builtins.str,typing.Sequence[Union[builtins.str,builtins.int builtins.int" builtins.int"typing.Sequence: Literal[builtins.bool]  builtins.bool" builtins.bool -None * -usecols -TypeAlias[Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]] -Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]\ -$typing.MutableSequence[builtins.str] - builtins.str" builtins.str"typing.MutableSequenceL -builtins.tuple[builtins.str] - builtins.str" builtins.str"builtins.tupleN -typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.SequenceD -pandas.core.series.Series[Any] -Any"pandas.core.series.SeriesN +None * +usecols +TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]] +Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]s +.pandas._typing.SequenceNotStr[typing.Hashable]" +typing.Hashable"typing.Hashable"pandas._typing.SequenceNotStr +builtins.range"builtins.range +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index9 +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarrayK +Any" numpy.ndarray"pandas._typing.AnyArrayLikeK CallableType[builtins.function]& builtins.function"builtins.function None"pandas._typing.UsecolsArgType * @@ -1741,8 +1752,9 @@ skipfooter builtins.str" builtins.str None *- quotechar - builtins.str" builtins.str * -quoting + builtins.str" builtins.str * +quoting +tTypeAlias[TypeAlias[Union[Literal[builtins.int],Literal[builtins.int],Literal[builtins.int],Literal[builtins.int]]]] iTypeAlias[Union[Literal[builtins.int],Literal[builtins.int],Literal[builtins.int],Literal[builtins.int]]] ^Union[Literal[builtins.int],Literal[builtins.int],Literal[builtins.int],Literal[builtins.int]]7 Literal[builtins.int]  @@ -1752,7 +1764,7 @@ iTypeAlias[Union[Literal[builtins.int],Literal[builtins.int],Literal[builtins.in Literal[builtins.int]  builtins.int" builtins.int7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.CSVQuoting *1 + builtins.int" builtins.int"pandas._typing.CSVQuotingCompat"pandas._typing.CSVQuoting *1 doublequote builtins.bool" builtins.bool *V @@ -1811,7 +1823,7 @@ BUnion[TypeAlias[Union[builtins.dict[builtins.str,Any],None]],None] builtins.str" builtins.str Any" builtins.dict None"pandas._typing.StorageOptions -None 0:typing.overloadXa +None 0:typing.overloadXc read_clipboard#pandas.io.clipboards.read_clipboard"T (pandas.io.parsers.readers.TextFileReader"(pandas.io.parsers.readers.TextFileReader*O sepD @@ -1866,23 +1878,22 @@ nUnion[builtins.int,builtins.str,typing.Sequence[Union[builtins.str,builtins.int builtins.int" builtins.int"typing.Sequence: Literal[builtins.bool]  builtins.bool" builtins.bool -None * -usecols -TypeAlias[Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]] -Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]\ -$typing.MutableSequence[builtins.str] - builtins.str" builtins.str"typing.MutableSequenceL -builtins.tuple[builtins.str] - builtins.str" builtins.str"builtins.tupleN -typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.SequenceD -pandas.core.series.Series[Any] -Any"pandas.core.series.SeriesN +None * +usecols +TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]] +Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]s +.pandas._typing.SequenceNotStr[typing.Hashable]" +typing.Hashable"typing.Hashable"pandas._typing.SequenceNotStr +builtins.range"builtins.range +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index9 +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarrayK +Any" numpy.ndarray"pandas._typing.AnyArrayLikeK CallableType[builtins.function]& builtins.function"builtins.function None"pandas._typing.UsecolsArgType * @@ -2031,8 +2042,9 @@ skipfooter builtins.str" builtins.str None *- quotechar - builtins.str" builtins.str * -quoting + builtins.str" builtins.str * +quoting +tTypeAlias[TypeAlias[Union[Literal[builtins.int],Literal[builtins.int],Literal[builtins.int],Literal[builtins.int]]]] iTypeAlias[Union[Literal[builtins.int],Literal[builtins.int],Literal[builtins.int],Literal[builtins.int]]] ^Union[Literal[builtins.int],Literal[builtins.int],Literal[builtins.int],Literal[builtins.int]]7 Literal[builtins.int]  @@ -2042,7 +2054,7 @@ iTypeAlias[Union[Literal[builtins.int],Literal[builtins.int],Literal[builtins.in Literal[builtins.int]  builtins.int" builtins.int7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.CSVQuoting *1 + builtins.int" builtins.int"pandas._typing.CSVQuotingCompat"pandas._typing.CSVQuoting *1 doublequote builtins.bool" builtins.bool *V @@ -2101,7 +2113,7 @@ BUnion[TypeAlias[Union[builtins.dict[builtins.str,Any],None]],None] builtins.str" builtins.str Any" builtins.dict None"pandas._typing.StorageOptions -None 0:typing.overloadXa +None 0:typing.overloadXc read_clipboard#pandas.io.clipboards.read_clipboard": pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*O sepD @@ -2156,23 +2168,22 @@ nUnion[builtins.int,builtins.str,typing.Sequence[Union[builtins.str,builtins.int builtins.int" builtins.int"typing.Sequence: Literal[builtins.bool]  builtins.bool" builtins.bool -None * -usecols -TypeAlias[Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]] -Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]\ -$typing.MutableSequence[builtins.str] - builtins.str" builtins.str"typing.MutableSequenceL -builtins.tuple[builtins.str] - builtins.str" builtins.str"builtins.tupleN -typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.SequenceD -pandas.core.series.Series[Any] -Any"pandas.core.series.SeriesN +None * +usecols +TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]] +Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]s +.pandas._typing.SequenceNotStr[typing.Hashable]" +typing.Hashable"typing.Hashable"pandas._typing.SequenceNotStr +builtins.range"builtins.range +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index9 +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarrayK +Any" numpy.ndarray"pandas._typing.AnyArrayLikeK CallableType[builtins.function]& builtins.function"builtins.function None"pandas._typing.UsecolsArgType * @@ -2322,8 +2333,9 @@ skipfooter builtins.str" builtins.str None *- quotechar - builtins.str" builtins.str * -quoting + builtins.str" builtins.str * +quoting +tTypeAlias[TypeAlias[Union[Literal[builtins.int],Literal[builtins.int],Literal[builtins.int],Literal[builtins.int]]]] iTypeAlias[Union[Literal[builtins.int],Literal[builtins.int],Literal[builtins.int],Literal[builtins.int]]] ^Union[Literal[builtins.int],Literal[builtins.int],Literal[builtins.int],Literal[builtins.int]]7 Literal[builtins.int]  @@ -2333,7 +2345,7 @@ iTypeAlias[Union[Literal[builtins.int],Literal[builtins.int],Literal[builtins.in Literal[builtins.int]  builtins.int" builtins.int7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.CSVQuoting *1 + builtins.int" builtins.int"pandas._typing.CSVQuotingCompat"pandas._typing.CSVQuoting *1 doublequote builtins.bool" builtins.bool *V @@ -2392,39 +2404,465 @@ BUnion[TypeAlias[Union[builtins.dict[builtins.str,Any],None]],None] builtins.str" builtins.str Any" builtins.dict None"pandas._typing.StorageOptions -None 0:typing.overloadX" +None 0:typing.overloadX" + +read_excel pandas.io.excel._base.read_excelR + +read_excel pandas.io.excel._base.read_excel" +Abuiltins.dict[pandas._typing.IntStrT,pandas.core.frame.DataFrame]O +pandas._typing.IntStrT" +builtins.object"builtins.object"builtins.object: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame" builtins.dict* +io +Union[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.ReadBuffer[builtins.bytes],pandas.io.excel._base.ExcelFile,Any,Any,Any,Any] +8TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]] +-Union[builtins.str,os.PathLike[builtins.str]] + builtins.str" builtins.strF +os.PathLike[builtins.str] + builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathh +)pandas._typing.ReadBuffer[builtins.bytes] +builtins.bytes"builtins.bytes"pandas._typing.ReadBufferB +pandas.io.excel._base.ExcelFile"pandas.io.excel._base.ExcelFile +Any +Any +Any +Any* + +sheet_name +%builtins.list[pandas._typing.IntStrT]O +pandas._typing.IntStrT" +builtins.object"builtins.object"builtins.object" builtins.list* +header +6Union[builtins.int,typing.Sequence[builtins.int],None] + builtins.int" builtins.intN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.Sequence +None * +names +Union[TypeAlias[Union[typing.MutableSequence[pandas._typing.HashableT],numpy.ndarray[Any,Any],builtins.tuple[pandas._typing.HashableT],builtins.range]],None] +TypeAlias[Union[typing.MutableSequence[pandas._typing.HashableT],numpy.ndarray[Any,Any],builtins.tuple[pandas._typing.HashableT],builtins.range]] +Union[typing.MutableSequence[pandas._typing.HashableT],numpy.ndarray[Any,Any],builtins.tuple[pandas._typing.HashableT],builtins.range] +0typing.MutableSequence[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable"typing.MutableSequence9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray +(builtins.tuple[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable"builtins.tuple +builtins.range"builtins.range"pandas._typing.ListLikeHashable +None * + index_col +CUnion[builtins.int,typing.Sequence[builtins.int],builtins.str,None] + builtins.int" builtins.intN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.Sequence + builtins.str" builtins.str +None * +usecols +Union[builtins.str,TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]]] + builtins.str" builtins.str +TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]] +Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]s +.pandas._typing.SequenceNotStr[typing.Hashable]" +typing.Hashable"typing.Hashable"pandas._typing.SequenceNotStr +builtins.range"builtins.range +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.AnyArrayLikeK +CallableType[builtins.function]& +builtins.function"builtins.function +None"pandas._typing.UsecolsArgType * +dtype +Union[builtins.str,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],typing.Mapping[builtins.str,Union[builtins.str,Unknown]],None] + builtins.str" builtins.str +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype +8typing.Mapping[builtins.str,Union[builtins.str,Unknown]] + builtins.str" builtins.str? +Union[builtins.str,Unknown] + builtins.str" builtins.str"typing.Mapping +None * +engine +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +tUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ExcelReadEngine +None * + +converters +\Union[typing.Mapping[Union[builtins.int,builtins.str],CallableType[builtins.function]],None] +Ptyping.Mapping[Union[builtins.int,builtins.str],CallableType[builtins.function]]` + Union[builtins.int,builtins.str] + builtins.int" builtins.int + builtins.str" builtins.strK +CallableType[builtins.function]& +builtins.function"builtins.function"typing.Mapping +None * + true_values +,Union[typing.Iterable[typing.Hashable],None]W + typing.Iterable[typing.Hashable]" +typing.Hashable"typing.Hashable"typing.Iterable +None * + false_values +,Union[typing.Iterable[typing.Hashable],None]W + typing.Iterable[typing.Hashable]" +typing.Hashable"typing.Hashable"typing.Iterable +None * +skiprows +VUnion[builtins.int,typing.Sequence[builtins.int],CallableType[builtins.function],None] + builtins.int" builtins.intN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.SequenceK +CallableType[builtins.function]& +builtins.function"builtins.function +None *Q +nrowsD +Union[builtins.int,None] + builtins.int" builtins.int +None * + na_values +rUnion[typing.Sequence[builtins.str],builtins.dict[Union[builtins.str,builtins.int],typing.Sequence[builtins.str]]]N +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.Sequence +Mbuiltins.dict[Union[builtins.str,builtins.int],typing.Sequence[builtins.str]]` + Union[builtins.str,builtins.int] + builtins.str" builtins.str + builtins.int" builtins.intN +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.Sequence" builtins.dict *5 +keep_default_na + builtins.bool" builtins.bool */ + na_filter + builtins.bool" builtins.bool *- +verbose + builtins.bool" builtins.bool * + parse_dates +Union[builtins.bool,typing.Sequence[builtins.int],typing.Sequence[Union[typing.Sequence[builtins.str],typing.Sequence[builtins.int]]],builtins.dict[builtins.str,Union[typing.Sequence[builtins.int],builtins.list[builtins.str]]]] + builtins.bool" builtins.boolN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.Sequence +Styping.Sequence[Union[typing.Sequence[builtins.str],typing.Sequence[builtins.int]]] +BUnion[typing.Sequence[builtins.str],typing.Sequence[builtins.int]]N +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.SequenceN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.Sequence"typing.Sequence +\builtins.dict[builtins.str,Union[typing.Sequence[builtins.int],builtins.list[builtins.str]]] + builtins.str" builtins.str +@Union[typing.Sequence[builtins.int],builtins.list[builtins.str]]N +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.SequenceJ +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list" builtins.dict * + date_format +DUnion[builtins.dict[typing.Hashable,builtins.str],builtins.str,None]~ ++builtins.dict[typing.Hashable,builtins.str]" +typing.Hashable"typing.Hashable + builtins.str" builtins.str" builtins.dict + builtins.str" builtins.str +None *U + thousandsD +Union[builtins.str,None] + builtins.str" builtins.str +None *+ +decimal + builtins.str" builtins.str *S +commentD +Union[builtins.str,None] + builtins.str" builtins.str +None *. + +skipfooter + builtins.int" builtins.int * +storage_options +6TypeAlias[Union[builtins.dict[builtins.str,Any],None]] ++Union[builtins.dict[builtins.str,Any],None]W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict +None"pandas._typing.StorageOptions * + dtype_backend +tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Literal[pandas._libs.lib._NoDefault]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.DtypeBackend +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadXQ + +read_excel pandas.io.excel._base.read_excel" +7builtins.dict[builtins.str,pandas.core.frame.DataFrame] + builtins.str" builtins.str: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame" builtins.dict* +io +Union[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.ReadBuffer[builtins.bytes],pandas.io.excel._base.ExcelFile,Any,Any,Any,Any] +8TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]] +-Union[builtins.str,os.PathLike[builtins.str]] + builtins.str" builtins.strF +os.PathLike[builtins.str] + builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathh +)pandas._typing.ReadBuffer[builtins.bytes] +builtins.bytes"builtins.bytes"pandas._typing.ReadBufferB +pandas.io.excel._base.ExcelFile"pandas.io.excel._base.ExcelFile +Any +Any +Any +Any* + +sheet_name +None* +header +6Union[builtins.int,typing.Sequence[builtins.int],None] + builtins.int" builtins.intN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.Sequence +None * +names +Union[TypeAlias[Union[typing.MutableSequence[pandas._typing.HashableT],numpy.ndarray[Any,Any],builtins.tuple[pandas._typing.HashableT],builtins.range]],None] +TypeAlias[Union[typing.MutableSequence[pandas._typing.HashableT],numpy.ndarray[Any,Any],builtins.tuple[pandas._typing.HashableT],builtins.range]] +Union[typing.MutableSequence[pandas._typing.HashableT],numpy.ndarray[Any,Any],builtins.tuple[pandas._typing.HashableT],builtins.range] +0typing.MutableSequence[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable"typing.MutableSequence9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray +(builtins.tuple[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable"builtins.tuple +builtins.range"builtins.range"pandas._typing.ListLikeHashable +None * + index_col +CUnion[builtins.int,typing.Sequence[builtins.int],builtins.str,None] + builtins.int" builtins.intN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.Sequence + builtins.str" builtins.str +None * +usecols +Union[builtins.str,TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]]] + builtins.str" builtins.str +TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]] +Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]s +.pandas._typing.SequenceNotStr[typing.Hashable]" +typing.Hashable"typing.Hashable"pandas._typing.SequenceNotStr +builtins.range"builtins.range +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.AnyArrayLikeK +CallableType[builtins.function]& +builtins.function"builtins.function +None"pandas._typing.UsecolsArgType * +dtype +Union[builtins.str,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],typing.Mapping[builtins.str,Union[builtins.str,Unknown]],None] + builtins.str" builtins.str +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype +8typing.Mapping[builtins.str,Union[builtins.str,Unknown]] + builtins.str" builtins.str? +Union[builtins.str,Unknown] + builtins.str" builtins.str"typing.Mapping +None * +engine +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +tUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ExcelReadEngine +None * + +converters +\Union[typing.Mapping[Union[builtins.int,builtins.str],CallableType[builtins.function]],None] +Ptyping.Mapping[Union[builtins.int,builtins.str],CallableType[builtins.function]]` + Union[builtins.int,builtins.str] + builtins.int" builtins.int + builtins.str" builtins.strK +CallableType[builtins.function]& +builtins.function"builtins.function"typing.Mapping +None * + true_values +,Union[typing.Iterable[typing.Hashable],None]W + typing.Iterable[typing.Hashable]" +typing.Hashable"typing.Hashable"typing.Iterable +None * + false_values +,Union[typing.Iterable[typing.Hashable],None]W + typing.Iterable[typing.Hashable]" +typing.Hashable"typing.Hashable"typing.Iterable +None * +skiprows +VUnion[builtins.int,typing.Sequence[builtins.int],CallableType[builtins.function],None] + builtins.int" builtins.intN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.SequenceK +CallableType[builtins.function]& +builtins.function"builtins.function +None *Q +nrowsD +Union[builtins.int,None] + builtins.int" builtins.int +None * + na_values +rUnion[typing.Sequence[builtins.str],builtins.dict[Union[builtins.str,builtins.int],typing.Sequence[builtins.str]]]N +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.Sequence +Mbuiltins.dict[Union[builtins.str,builtins.int],typing.Sequence[builtins.str]]` + Union[builtins.str,builtins.int] + builtins.str" builtins.str + builtins.int" builtins.intN +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.Sequence" builtins.dict *5 +keep_default_na + builtins.bool" builtins.bool */ + na_filter + builtins.bool" builtins.bool *- +verbose + builtins.bool" builtins.bool * + parse_dates +Union[builtins.bool,typing.Sequence[builtins.int],typing.Sequence[Union[typing.Sequence[builtins.str],typing.Sequence[builtins.int]]],builtins.dict[builtins.str,Union[typing.Sequence[builtins.int],builtins.list[builtins.str]]]] + builtins.bool" builtins.boolN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.Sequence +Styping.Sequence[Union[typing.Sequence[builtins.str],typing.Sequence[builtins.int]]] +BUnion[typing.Sequence[builtins.str],typing.Sequence[builtins.int]]N +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.SequenceN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.Sequence"typing.Sequence +\builtins.dict[builtins.str,Union[typing.Sequence[builtins.int],builtins.list[builtins.str]]] + builtins.str" builtins.str +@Union[typing.Sequence[builtins.int],builtins.list[builtins.str]]N +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.SequenceJ +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list" builtins.dict * + date_format +DUnion[builtins.dict[typing.Hashable,builtins.str],builtins.str,None]~ ++builtins.dict[typing.Hashable,builtins.str]" +typing.Hashable"typing.Hashable + builtins.str" builtins.str" builtins.dict + builtins.str" builtins.str +None *U + thousandsD +Union[builtins.str,None] + builtins.str" builtins.str +None *+ +decimal + builtins.str" builtins.str *S +commentD +Union[builtins.str,None] + builtins.str" builtins.str +None *. -read_excel pandas.io.excel._base.read_excelO +skipfooter + builtins.int" builtins.int * +storage_options +6TypeAlias[Union[builtins.dict[builtins.str,Any],None]] ++Union[builtins.dict[builtins.str,Any],None]W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict +None"pandas._typing.StorageOptions * + dtype_backend +tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Literal[pandas._libs.lib._NoDefault]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.DtypeBackend +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadXS read_excel pandas.io.excel._base.read_excel" Kbuiltins.dict[Union[builtins.int,builtins.str],pandas.core.frame.DataFrame]` Union[builtins.int,builtins.str] builtins.int" builtins.int builtins.str" builtins.str: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame" builtins.dict* -io -Union[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.ReadBuffer[builtins.bytes],builtins.bytes,pandas.io.excel._base.ExcelFile,Any,Any,Any,Any] +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame" builtins.dict* +io +Union[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.ReadBuffer[builtins.bytes],pandas.io.excel._base.ExcelFile,Any,Any,Any,Any] 8TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]] -Union[builtins.str,os.PathLike[builtins.str]] builtins.str" builtins.strF os.PathLike[builtins.str] builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathh )pandas._typing.ReadBuffer[builtins.bytes] -builtins.bytes"builtins.bytes"pandas._typing.ReadBuffer -builtins.bytes"builtins.bytesB +builtins.bytes"builtins.bytes"pandas._typing.ReadBufferB pandas.io.excel._base.ExcelFile"pandas.io.excel._base.ExcelFile Any Any Any -Any* +Any* -sheet_name -;Union[builtins.list[Union[builtins.int,builtins.str]],None] +sheet_name /builtins.list[Union[builtins.int,builtins.str]]` Union[builtins.int,builtins.str] builtins.int" builtins.int - builtins.str" builtins.str" builtins.list -None* + builtins.str" builtins.str" builtins.list* header 6Union[builtins.int,typing.Sequence[builtins.int],None] builtins.int" builtins.intN @@ -2445,33 +2883,31 @@ sheet_name pandas._typing.HashableT" typing.Hashable"typing.Hashable"typing.Hashable"builtins.tuple builtins.range"builtins.range"pandas._typing.ListLikeHashable -None * - index_col -6Union[builtins.int,typing.Sequence[builtins.int],None] +None * + index_col +CUnion[builtins.int,typing.Sequence[builtins.int],builtins.str,None] builtins.int" builtins.intN typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.Sequence -None * - -usecols - -Union[builtins.str,TypeAlias[Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]]] - builtins.str" builtins.str -TypeAlias[Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]] -Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]\ -$typing.MutableSequence[builtins.str] - builtins.str" builtins.str"typing.MutableSequenceL -builtins.tuple[builtins.str] - builtins.str" builtins.str"builtins.tupleN -typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.SequenceD -pandas.core.series.Series[Any] -Any"pandas.core.series.SeriesN + builtins.int" builtins.int"typing.Sequence + builtins.str" builtins.str +None * +usecols +Union[builtins.str,TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]]] + builtins.str" builtins.str +TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]] +Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]s +.pandas._typing.SequenceNotStr[typing.Hashable]" +typing.Hashable"typing.Hashable"pandas._typing.SequenceNotStr +builtins.range"builtins.range +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index9 +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarrayK +Any" numpy.ndarray"pandas._typing.AnyArrayLikeK CallableType[builtins.function]& builtins.function"builtins.function None"pandas._typing.UsecolsArgType * @@ -2498,9 +2934,11 @@ $typing.MutableSequence[builtins.str] builtins.str" builtins.str? Union[builtins.str,Unknown] builtins.str" builtins.str"typing.Mapping -None * -engine -cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]7 +None * +engine +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +tUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -2508,7 +2946,9 @@ cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ExcelReadEngine None * converters @@ -2613,20 +3053,19 @@ tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],TypeAlias[L builtins.str" builtins.str"pandas._typing.DtypeBackend /TypeAlias[Literal[pandas._libs.lib._NoDefault]]d $Literal[pandas._libs.lib._NoDefault] : -pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadXM +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadXQ read_excel pandas.io.excel._base.read_excel": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -io -Union[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.ReadBuffer[builtins.bytes],builtins.bytes,pandas.io.excel._base.ExcelFile,Any,Any,Any,Any] +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +io +Union[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.ReadBuffer[builtins.bytes],pandas.io.excel._base.ExcelFile,Any,Any,Any,Any] 8TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]] -Union[builtins.str,os.PathLike[builtins.str]] builtins.str" builtins.strF os.PathLike[builtins.str] builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathh )pandas._typing.ReadBuffer[builtins.bytes] -builtins.bytes"builtins.bytes"pandas._typing.ReadBuffer -builtins.bytes"builtins.bytesB +builtins.bytes"builtins.bytes"pandas._typing.ReadBufferB pandas.io.excel._base.ExcelFile"pandas.io.excel._base.ExcelFile Any Any @@ -2657,33 +3096,31 @@ sheet_name` pandas._typing.HashableT" typing.Hashable"typing.Hashable"typing.Hashable"builtins.tuple builtins.range"builtins.range"pandas._typing.ListLikeHashable -None * - index_col -6Union[builtins.int,typing.Sequence[builtins.int],None] +None * + index_col +CUnion[builtins.int,typing.Sequence[builtins.int],builtins.str,None] builtins.int" builtins.intN typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.Sequence -None * - -usecols - -Union[builtins.str,TypeAlias[Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]]] - builtins.str" builtins.str -TypeAlias[Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]] -Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]\ -$typing.MutableSequence[builtins.str] - builtins.str" builtins.str"typing.MutableSequenceL -builtins.tuple[builtins.str] - builtins.str" builtins.str"builtins.tupleN -typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.SequenceD -pandas.core.series.Series[Any] -Any"pandas.core.series.SeriesN + builtins.int" builtins.int"typing.Sequence + builtins.str" builtins.str +None * +usecols +Union[builtins.str,TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]]] + builtins.str" builtins.str +TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]] +Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]s +.pandas._typing.SequenceNotStr[typing.Hashable]" +typing.Hashable"typing.Hashable"pandas._typing.SequenceNotStr +builtins.range"builtins.range +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index9 +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarrayK +Any" numpy.ndarray"pandas._typing.AnyArrayLikeK CallableType[builtins.function]& builtins.function"builtins.function None"pandas._typing.UsecolsArgType * @@ -2710,9 +3147,11 @@ $typing.MutableSequence[builtins.str] builtins.str" builtins.str? Union[builtins.str,Unknown] builtins.str" builtins.str"typing.Mapping -None * -engine -cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]7 +None * +engine +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +tUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -2720,7 +3159,9 @@ cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ExcelReadEngine None * converters @@ -2825,8 +3266,8 @@ tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],TypeAlias[L builtins.str" builtins.str"pandas._typing.DtypeBackend /TypeAlias[Literal[pandas._libs.lib._NoDefault]]d $Literal[pandas._libs.lib._NoDefault] : -pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadX" - read_jsonpandas.io.json._json.read_json9 +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadX" + read_jsonpandas.io.json._json.read_json; read_jsonpandas.io.json._json.read_json" ?pandas.io.json._json.JsonReader[pandas.core.series.Series[Any]]D pandas.core.series.Series[Any] @@ -2897,9 +3338,11 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st keep_default_dates builtins.bool" builtins.bool *3 precise_float - builtins.bool" builtins.bool * - date_unit -cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]7 + builtins.bool" builtins.bool * + date_unit +uUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -2907,7 +3350,7 @@ cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str + builtins.str" builtins.str"pandas._typing.TimeUnit None *T encodingD Union[builtins.str,None] @@ -2972,7 +3415,7 @@ tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],TypeAlias[L builtins.str" builtins.str"pandas._typing.DtypeBackend /TypeAlias[Literal[pandas._libs.lib._NoDefault]]d $Literal[pandas._libs.lib._NoDefault] : -pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadX; +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadX= read_jsonpandas.io.json._json.read_json" dqEVV6VbE44$PT^&oTS>vFiu|J zAZ{LCQdy9hm#!C_T3DKzmz?UCUlLqW6b%*iNG#4sOv*`()k!MN%qhvtE7mJY%u7$z z0qT{ReAiZD@+MpP$?UdbjIonHaBF+^vvXZ#49&~T&xLvn=QpH?) zq!~T=9EYl$EM7g6?X8qprH(LjWuyCxKQ>l?U1}>6R|3RWlP}t;!2HY}3v`YjmoiXH zd2#`t)?@>FH)cyNvB`m%Vw3ONE6ONIquJ`1SLs+(lvwGLnLXLj&u_D@gO2ECUzG+{ znZGPt?1iQIzz|LcM$cOou9A?-f>g(x%*5j8$rp_kCuw+hn;ZlL5JH5TyVB delta 698 zcmcbyo@wJsrU}287cOI(oM&vxEVVLebDr@7PT{Q_T+#SGNYpWWCKOs$&YLmChxaZnY^4wZ1O{HE!I9ZuBVKXC$h;BRIA1& zz$g{Nr83#jLL8`=ck+8V`N@VH5&}M4GD)SGIVG8S#d;viCO?qVMW=P@j+|@*2G@5OmnL1%eN8zOoH=I#;ifyv%^vM9UsQ82c diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.io.excel._base.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.io.excel._base.protobuf index b2ed7db9c..e69fab89b 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.io.excel._base.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.io.excel._base.protobuf @@ -1,6 +1,6 @@ -pandas.io.excel._base* - ExcelWriter!pandas.io.excel._base.ExcelWriter"builtins.object* +pandas.io.excel._base- + ExcelWriter!pandas.io.excel._base.ExcelWriter"builtins.object* __init__*pandas.io.excel._base.ExcelWriter.__init__" None*P selfF @@ -13,15 +13,17 @@ os.PathLike[builtins.str] builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathB pandas._typing.WriteExcelBuffer"pandas._typing.WriteExcelBufferF -!pandas.io.excel._base.ExcelWriter"!pandas.io.excel._base.ExcelWriter* -engine -cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]7 +!pandas.io.excel._base.ExcelWriter"!pandas.io.excel._base.ExcelWriter* +engine +uUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],Literal[builtins.str],None] +STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str7 + builtins.str" builtins.str"pandas._typing.ExcelWriteEngine7 Literal[builtins.str]  builtins.str" builtins.str None *W @@ -67,15 +69,16 @@ cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal builtins.tuple[builtins.str] builtins.str" builtins.str"builtins.tuple*P selfF -!pandas.io.excel._base.ExcelWriter"!pandas.io.excel._base.ExcelWriter0:builtins.property`* -engine(pandas.io.excel._base.ExcelWriter.engine" +!pandas.io.excel._base.ExcelWriter"!pandas.io.excel._base.ExcelWriter0:builtins.property`* +engine(pandas.io.excel._base.ExcelWriter.engine" +STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str*P + builtins.str" builtins.str"pandas._typing.ExcelWriteEngine*P selfF !pandas.io.excel._base.ExcelWriter"!pandas.io.excel._base.ExcelWriter0:builtins.property`* sheets(pandas.io.excel._base.ExcelWriter.sheets"W @@ -136,7 +139,7 @@ __fspath__,pandas.io.excel._base.ExcelWriter.__fspath__" close'pandas.io.excel._base.ExcelWriter.close" None*P selfF -!pandas.io.excel._base.ExcelWriter"!pandas.io.excel._base.ExcelWriter +!pandas.io.excel._base.ExcelWriter"!pandas.io.excel._base.ExcelWriter ExcelFilepandas.io.excel._base.ExcelFile"builtins.object* __init__(pandas.io.excel._base.ExcelFile.__init__" @@ -213,8 +216,8 @@ $pandas.io.excel._base.ExcelFile.SelfB None* __del__'pandas.io.excel._base.ExcelFile.__del__" None*DB -pandas.io.excel._base.ExcelFile"pandas.io.excel._base.ExcelFile2d -parse%pandas.io.excel._base.ExcelFile.parse3 +pandas.io.excel._base.ExcelFile"pandas.io.excel._base.ExcelFile2e +parse%pandas.io.excel._base.ExcelFile.parse3 parse%pandas.io.excel._base.ExcelFile.parse" Kbuiltins.dict[Union[builtins.int,builtins.str],pandas.core.frame.DataFrame]` Union[builtins.int,builtins.str] @@ -257,27 +260,24 @@ sheet_name builtins.int" builtins.intN typing.Sequence[builtins.int] builtins.int" builtins.int"typing.Sequence -None * - -usecols - -Union[builtins.str,TypeAlias[Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]]] - builtins.str" builtins.str -TypeAlias[Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]] -Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]\ -$typing.MutableSequence[builtins.str] - builtins.str" builtins.str"typing.MutableSequenceL -builtins.tuple[builtins.str] - builtins.str" builtins.str"builtins.tupleN -typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.SequenceD -pandas.core.series.Series[Any] -Any"pandas.core.series.SeriesN +None * +usecols +Union[builtins.str,TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]]] + builtins.str" builtins.str +TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]] +Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]s +.pandas._typing.SequenceNotStr[typing.Hashable]" +typing.Hashable"typing.Hashable"pandas._typing.SequenceNotStr +builtins.range"builtins.range +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index9 +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarrayK +Any" numpy.ndarray"pandas._typing.AnyArrayLikeK CallableType[builtins.function]& builtins.function"builtins.function None"pandas._typing.UsecolsArgType * @@ -362,7 +362,7 @@ skipfooter na_filter builtins.bool" builtins.bool * kwds -Any0:typing.overloadX0 +Any0:typing.overloadX1 parse%pandas.io.excel._base.ExcelFile.parse": pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*L selfB @@ -398,27 +398,24 @@ sheet_name` builtins.int" builtins.intN typing.Sequence[builtins.int] builtins.int" builtins.int"typing.Sequence -None * - -usecols - -Union[builtins.str,TypeAlias[Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]]] - builtins.str" builtins.str -TypeAlias[Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]] -Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]\ -$typing.MutableSequence[builtins.str] - builtins.str" builtins.str"typing.MutableSequenceL -builtins.tuple[builtins.str] - builtins.str" builtins.str"builtins.tupleN -typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.SequenceD -pandas.core.series.Series[Any] -Any"pandas.core.series.SeriesN +None * +usecols +Union[builtins.str,TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]]] + builtins.str" builtins.str +TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]] +Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]s +.pandas._typing.SequenceNotStr[typing.Hashable]" +typing.Hashable"typing.Hashable"pandas._typing.SequenceNotStr +builtins.range"builtins.range +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index9 +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarrayK +Any" numpy.ndarray"pandas._typing.AnyArrayLikeK CallableType[builtins.function]& builtins.function"builtins.function None"pandas._typing.UsecolsArgType * @@ -515,39 +512,465 @@ xUnion[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.R builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathh )pandas._typing.ReadBuffer[builtins.bytes] builtins.bytes"builtins.bytes"pandas._typing.ReadBuffer -builtins.bytes"builtins.bytes" +builtins.bytes"builtins.bytes" -read_excel pandas.io.excel._base.read_excelO +read_excel pandas.io.excel._base.read_excelR + +read_excel pandas.io.excel._base.read_excel" +Abuiltins.dict[pandas._typing.IntStrT,pandas.core.frame.DataFrame]O +pandas._typing.IntStrT" +builtins.object"builtins.object"builtins.object: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame" builtins.dict* +io +Union[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.ReadBuffer[builtins.bytes],pandas.io.excel._base.ExcelFile,Any,Any,Any,Any] +8TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]] +-Union[builtins.str,os.PathLike[builtins.str]] + builtins.str" builtins.strF +os.PathLike[builtins.str] + builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathh +)pandas._typing.ReadBuffer[builtins.bytes] +builtins.bytes"builtins.bytes"pandas._typing.ReadBufferB +pandas.io.excel._base.ExcelFile"pandas.io.excel._base.ExcelFile +Any +Any +Any +Any* + +sheet_name +%builtins.list[pandas._typing.IntStrT]O +pandas._typing.IntStrT" +builtins.object"builtins.object"builtins.object" builtins.list* +header +6Union[builtins.int,typing.Sequence[builtins.int],None] + builtins.int" builtins.intN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.Sequence +None * +names +Union[TypeAlias[Union[typing.MutableSequence[pandas._typing.HashableT],numpy.ndarray[Any,Any],builtins.tuple[pandas._typing.HashableT],builtins.range]],None] +TypeAlias[Union[typing.MutableSequence[pandas._typing.HashableT],numpy.ndarray[Any,Any],builtins.tuple[pandas._typing.HashableT],builtins.range]] +Union[typing.MutableSequence[pandas._typing.HashableT],numpy.ndarray[Any,Any],builtins.tuple[pandas._typing.HashableT],builtins.range] +0typing.MutableSequence[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable"typing.MutableSequence9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray +(builtins.tuple[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable"builtins.tuple +builtins.range"builtins.range"pandas._typing.ListLikeHashable +None * + index_col +CUnion[builtins.int,typing.Sequence[builtins.int],builtins.str,None] + builtins.int" builtins.intN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.Sequence + builtins.str" builtins.str +None * +usecols +Union[builtins.str,TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]]] + builtins.str" builtins.str +TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]] +Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]s +.pandas._typing.SequenceNotStr[typing.Hashable]" +typing.Hashable"typing.Hashable"pandas._typing.SequenceNotStr +builtins.range"builtins.range +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.AnyArrayLikeK +CallableType[builtins.function]& +builtins.function"builtins.function +None"pandas._typing.UsecolsArgType * +dtype +Union[builtins.str,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],typing.Mapping[builtins.str,Union[builtins.str,Unknown]],None] + builtins.str" builtins.str +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype +8typing.Mapping[builtins.str,Union[builtins.str,Unknown]] + builtins.str" builtins.str? +Union[builtins.str,Unknown] + builtins.str" builtins.str"typing.Mapping +None * +engine +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +tUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ExcelReadEngine +None * + +converters +\Union[typing.Mapping[Union[builtins.int,builtins.str],CallableType[builtins.function]],None] +Ptyping.Mapping[Union[builtins.int,builtins.str],CallableType[builtins.function]]` + Union[builtins.int,builtins.str] + builtins.int" builtins.int + builtins.str" builtins.strK +CallableType[builtins.function]& +builtins.function"builtins.function"typing.Mapping +None * + true_values +,Union[typing.Iterable[typing.Hashable],None]W + typing.Iterable[typing.Hashable]" +typing.Hashable"typing.Hashable"typing.Iterable +None * + false_values +,Union[typing.Iterable[typing.Hashable],None]W + typing.Iterable[typing.Hashable]" +typing.Hashable"typing.Hashable"typing.Iterable +None * +skiprows +VUnion[builtins.int,typing.Sequence[builtins.int],CallableType[builtins.function],None] + builtins.int" builtins.intN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.SequenceK +CallableType[builtins.function]& +builtins.function"builtins.function +None *Q +nrowsD +Union[builtins.int,None] + builtins.int" builtins.int +None * + na_values +rUnion[typing.Sequence[builtins.str],builtins.dict[Union[builtins.str,builtins.int],typing.Sequence[builtins.str]]]N +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.Sequence +Mbuiltins.dict[Union[builtins.str,builtins.int],typing.Sequence[builtins.str]]` + Union[builtins.str,builtins.int] + builtins.str" builtins.str + builtins.int" builtins.intN +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.Sequence" builtins.dict *5 +keep_default_na + builtins.bool" builtins.bool */ + na_filter + builtins.bool" builtins.bool *- +verbose + builtins.bool" builtins.bool * + parse_dates +Union[builtins.bool,typing.Sequence[builtins.int],typing.Sequence[Union[typing.Sequence[builtins.str],typing.Sequence[builtins.int]]],builtins.dict[builtins.str,Union[typing.Sequence[builtins.int],builtins.list[builtins.str]]]] + builtins.bool" builtins.boolN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.Sequence +Styping.Sequence[Union[typing.Sequence[builtins.str],typing.Sequence[builtins.int]]] +BUnion[typing.Sequence[builtins.str],typing.Sequence[builtins.int]]N +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.SequenceN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.Sequence"typing.Sequence +\builtins.dict[builtins.str,Union[typing.Sequence[builtins.int],builtins.list[builtins.str]]] + builtins.str" builtins.str +@Union[typing.Sequence[builtins.int],builtins.list[builtins.str]]N +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.SequenceJ +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list" builtins.dict * + date_format +DUnion[builtins.dict[typing.Hashable,builtins.str],builtins.str,None]~ ++builtins.dict[typing.Hashable,builtins.str]" +typing.Hashable"typing.Hashable + builtins.str" builtins.str" builtins.dict + builtins.str" builtins.str +None *U + thousandsD +Union[builtins.str,None] + builtins.str" builtins.str +None *+ +decimal + builtins.str" builtins.str *S +commentD +Union[builtins.str,None] + builtins.str" builtins.str +None *. + +skipfooter + builtins.int" builtins.int * +storage_options +6TypeAlias[Union[builtins.dict[builtins.str,Any],None]] ++Union[builtins.dict[builtins.str,Any],None]W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict +None"pandas._typing.StorageOptions * + dtype_backend +tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Literal[pandas._libs.lib._NoDefault]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.DtypeBackend +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadXQ + +read_excel pandas.io.excel._base.read_excel" +7builtins.dict[builtins.str,pandas.core.frame.DataFrame] + builtins.str" builtins.str: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame" builtins.dict* +io +Union[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.ReadBuffer[builtins.bytes],pandas.io.excel._base.ExcelFile,Any,Any,Any,Any] +8TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]] +-Union[builtins.str,os.PathLike[builtins.str]] + builtins.str" builtins.strF +os.PathLike[builtins.str] + builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathh +)pandas._typing.ReadBuffer[builtins.bytes] +builtins.bytes"builtins.bytes"pandas._typing.ReadBufferB +pandas.io.excel._base.ExcelFile"pandas.io.excel._base.ExcelFile +Any +Any +Any +Any* + +sheet_name +None* +header +6Union[builtins.int,typing.Sequence[builtins.int],None] + builtins.int" builtins.intN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.Sequence +None * +names +Union[TypeAlias[Union[typing.MutableSequence[pandas._typing.HashableT],numpy.ndarray[Any,Any],builtins.tuple[pandas._typing.HashableT],builtins.range]],None] +TypeAlias[Union[typing.MutableSequence[pandas._typing.HashableT],numpy.ndarray[Any,Any],builtins.tuple[pandas._typing.HashableT],builtins.range]] +Union[typing.MutableSequence[pandas._typing.HashableT],numpy.ndarray[Any,Any],builtins.tuple[pandas._typing.HashableT],builtins.range] +0typing.MutableSequence[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable"typing.MutableSequence9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray +(builtins.tuple[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable"builtins.tuple +builtins.range"builtins.range"pandas._typing.ListLikeHashable +None * + index_col +CUnion[builtins.int,typing.Sequence[builtins.int],builtins.str,None] + builtins.int" builtins.intN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.Sequence + builtins.str" builtins.str +None * +usecols +Union[builtins.str,TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]]] + builtins.str" builtins.str +TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]] +Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]s +.pandas._typing.SequenceNotStr[typing.Hashable]" +typing.Hashable"typing.Hashable"pandas._typing.SequenceNotStr +builtins.range"builtins.range +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.AnyArrayLikeK +CallableType[builtins.function]& +builtins.function"builtins.function +None"pandas._typing.UsecolsArgType * +dtype +Union[builtins.str,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],typing.Mapping[builtins.str,Union[builtins.str,Unknown]],None] + builtins.str" builtins.str +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype +8typing.Mapping[builtins.str,Union[builtins.str,Unknown]] + builtins.str" builtins.str? +Union[builtins.str,Unknown] + builtins.str" builtins.str"typing.Mapping +None * +engine +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +tUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ExcelReadEngine +None * + +converters +\Union[typing.Mapping[Union[builtins.int,builtins.str],CallableType[builtins.function]],None] +Ptyping.Mapping[Union[builtins.int,builtins.str],CallableType[builtins.function]]` + Union[builtins.int,builtins.str] + builtins.int" builtins.int + builtins.str" builtins.strK +CallableType[builtins.function]& +builtins.function"builtins.function"typing.Mapping +None * + true_values +,Union[typing.Iterable[typing.Hashable],None]W + typing.Iterable[typing.Hashable]" +typing.Hashable"typing.Hashable"typing.Iterable +None * + false_values +,Union[typing.Iterable[typing.Hashable],None]W + typing.Iterable[typing.Hashable]" +typing.Hashable"typing.Hashable"typing.Iterable +None * +skiprows +VUnion[builtins.int,typing.Sequence[builtins.int],CallableType[builtins.function],None] + builtins.int" builtins.intN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.SequenceK +CallableType[builtins.function]& +builtins.function"builtins.function +None *Q +nrowsD +Union[builtins.int,None] + builtins.int" builtins.int +None * + na_values +rUnion[typing.Sequence[builtins.str],builtins.dict[Union[builtins.str,builtins.int],typing.Sequence[builtins.str]]]N +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.Sequence +Mbuiltins.dict[Union[builtins.str,builtins.int],typing.Sequence[builtins.str]]` + Union[builtins.str,builtins.int] + builtins.str" builtins.str + builtins.int" builtins.intN +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.Sequence" builtins.dict *5 +keep_default_na + builtins.bool" builtins.bool */ + na_filter + builtins.bool" builtins.bool *- +verbose + builtins.bool" builtins.bool * + parse_dates +Union[builtins.bool,typing.Sequence[builtins.int],typing.Sequence[Union[typing.Sequence[builtins.str],typing.Sequence[builtins.int]]],builtins.dict[builtins.str,Union[typing.Sequence[builtins.int],builtins.list[builtins.str]]]] + builtins.bool" builtins.boolN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.Sequence +Styping.Sequence[Union[typing.Sequence[builtins.str],typing.Sequence[builtins.int]]] +BUnion[typing.Sequence[builtins.str],typing.Sequence[builtins.int]]N +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.SequenceN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.Sequence"typing.Sequence +\builtins.dict[builtins.str,Union[typing.Sequence[builtins.int],builtins.list[builtins.str]]] + builtins.str" builtins.str +@Union[typing.Sequence[builtins.int],builtins.list[builtins.str]]N +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.SequenceJ +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list" builtins.dict * + date_format +DUnion[builtins.dict[typing.Hashable,builtins.str],builtins.str,None]~ ++builtins.dict[typing.Hashable,builtins.str]" +typing.Hashable"typing.Hashable + builtins.str" builtins.str" builtins.dict + builtins.str" builtins.str +None *U + thousandsD +Union[builtins.str,None] + builtins.str" builtins.str +None *+ +decimal + builtins.str" builtins.str *S +commentD +Union[builtins.str,None] + builtins.str" builtins.str +None *. + +skipfooter + builtins.int" builtins.int * +storage_options +6TypeAlias[Union[builtins.dict[builtins.str,Any],None]] ++Union[builtins.dict[builtins.str,Any],None]W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict +None"pandas._typing.StorageOptions * + dtype_backend +tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Literal[pandas._libs.lib._NoDefault]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.DtypeBackend +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadXS read_excel pandas.io.excel._base.read_excel" Kbuiltins.dict[Union[builtins.int,builtins.str],pandas.core.frame.DataFrame]` Union[builtins.int,builtins.str] builtins.int" builtins.int builtins.str" builtins.str: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame" builtins.dict* -io -Union[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.ReadBuffer[builtins.bytes],builtins.bytes,pandas.io.excel._base.ExcelFile,Any,Any,Any,Any] +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame" builtins.dict* +io +Union[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.ReadBuffer[builtins.bytes],pandas.io.excel._base.ExcelFile,Any,Any,Any,Any] 8TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]] -Union[builtins.str,os.PathLike[builtins.str]] builtins.str" builtins.strF os.PathLike[builtins.str] builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathh )pandas._typing.ReadBuffer[builtins.bytes] -builtins.bytes"builtins.bytes"pandas._typing.ReadBuffer -builtins.bytes"builtins.bytesB +builtins.bytes"builtins.bytes"pandas._typing.ReadBufferB pandas.io.excel._base.ExcelFile"pandas.io.excel._base.ExcelFile Any Any Any -Any* +Any* -sheet_name -;Union[builtins.list[Union[builtins.int,builtins.str]],None] +sheet_name /builtins.list[Union[builtins.int,builtins.str]]` Union[builtins.int,builtins.str] builtins.int" builtins.int - builtins.str" builtins.str" builtins.list -None* + builtins.str" builtins.str" builtins.list* header 6Union[builtins.int,typing.Sequence[builtins.int],None] builtins.int" builtins.intN @@ -568,33 +991,31 @@ sheet_name pandas._typing.HashableT" typing.Hashable"typing.Hashable"typing.Hashable"builtins.tuple builtins.range"builtins.range"pandas._typing.ListLikeHashable -None * - index_col -6Union[builtins.int,typing.Sequence[builtins.int],None] +None * + index_col +CUnion[builtins.int,typing.Sequence[builtins.int],builtins.str,None] builtins.int" builtins.intN typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.Sequence -None * - -usecols - -Union[builtins.str,TypeAlias[Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]]] - builtins.str" builtins.str -TypeAlias[Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]] -Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]\ -$typing.MutableSequence[builtins.str] - builtins.str" builtins.str"typing.MutableSequenceL -builtins.tuple[builtins.str] - builtins.str" builtins.str"builtins.tupleN -typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.SequenceD -pandas.core.series.Series[Any] -Any"pandas.core.series.SeriesN + builtins.int" builtins.int"typing.Sequence + builtins.str" builtins.str +None * +usecols +Union[builtins.str,TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]]] + builtins.str" builtins.str +TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]] +Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]s +.pandas._typing.SequenceNotStr[typing.Hashable]" +typing.Hashable"typing.Hashable"pandas._typing.SequenceNotStr +builtins.range"builtins.range +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index9 +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarrayK +Any" numpy.ndarray"pandas._typing.AnyArrayLikeK CallableType[builtins.function]& builtins.function"builtins.function None"pandas._typing.UsecolsArgType * @@ -621,9 +1042,11 @@ $typing.MutableSequence[builtins.str] builtins.str" builtins.str? Union[builtins.str,Unknown] builtins.str" builtins.str"typing.Mapping -None * -engine -cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]7 +None * +engine +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +tUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -631,7 +1054,9 @@ cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ExcelReadEngine None * converters @@ -736,20 +1161,19 @@ tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],TypeAlias[L builtins.str" builtins.str"pandas._typing.DtypeBackend /TypeAlias[Literal[pandas._libs.lib._NoDefault]]d $Literal[pandas._libs.lib._NoDefault] : -pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadXM +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadXQ read_excel pandas.io.excel._base.read_excel": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -io -Union[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.ReadBuffer[builtins.bytes],builtins.bytes,pandas.io.excel._base.ExcelFile,Any,Any,Any,Any] +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +io +Union[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.ReadBuffer[builtins.bytes],pandas.io.excel._base.ExcelFile,Any,Any,Any,Any] 8TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]] -Union[builtins.str,os.PathLike[builtins.str]] builtins.str" builtins.strF os.PathLike[builtins.str] builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathh )pandas._typing.ReadBuffer[builtins.bytes] -builtins.bytes"builtins.bytes"pandas._typing.ReadBuffer -builtins.bytes"builtins.bytesB +builtins.bytes"builtins.bytes"pandas._typing.ReadBufferB pandas.io.excel._base.ExcelFile"pandas.io.excel._base.ExcelFile Any Any @@ -780,33 +1204,31 @@ sheet_name` pandas._typing.HashableT" typing.Hashable"typing.Hashable"typing.Hashable"builtins.tuple builtins.range"builtins.range"pandas._typing.ListLikeHashable -None * - index_col -6Union[builtins.int,typing.Sequence[builtins.int],None] +None * + index_col +CUnion[builtins.int,typing.Sequence[builtins.int],builtins.str,None] builtins.int" builtins.intN typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.Sequence -None * - -usecols - -Union[builtins.str,TypeAlias[Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]]] - builtins.str" builtins.str -TypeAlias[Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]] -Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]\ -$typing.MutableSequence[builtins.str] - builtins.str" builtins.str"typing.MutableSequenceL -builtins.tuple[builtins.str] - builtins.str" builtins.str"builtins.tupleN -typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.SequenceD -pandas.core.series.Series[Any] -Any"pandas.core.series.SeriesN + builtins.int" builtins.int"typing.Sequence + builtins.str" builtins.str +None * +usecols +Union[builtins.str,TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]]] + builtins.str" builtins.str +TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]] +Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]s +.pandas._typing.SequenceNotStr[typing.Hashable]" +typing.Hashable"typing.Hashable"pandas._typing.SequenceNotStr +builtins.range"builtins.range +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index9 +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarrayK +Any" numpy.ndarray"pandas._typing.AnyArrayLikeK CallableType[builtins.function]& builtins.function"builtins.function None"pandas._typing.UsecolsArgType * @@ -833,9 +1255,11 @@ $typing.MutableSequence[builtins.str] builtins.str" builtins.str? Union[builtins.str,Unknown] builtins.str" builtins.str"typing.Mapping -None * -engine -cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]7 +None * +engine +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +tUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -843,7 +1267,9 @@ cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ExcelReadEngine None * converters diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.io.excel.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.io.excel.protobuf index e0db4ceeb..47550d45a 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.io.excel.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.io.excel.protobuf @@ -1,5 +1,5 @@ -pandas.io.excel +pandas.io.excel ExcelFilepandas.io.excel._base.ExcelFile"builtins.object* __init__(pandas.io.excel._base.ExcelFile.__init__" @@ -76,8 +76,8 @@ $pandas.io.excel._base.ExcelFile.SelfB None* __del__'pandas.io.excel._base.ExcelFile.__del__" None*DB -pandas.io.excel._base.ExcelFile"pandas.io.excel._base.ExcelFile2d -parse%pandas.io.excel._base.ExcelFile.parse3 +pandas.io.excel._base.ExcelFile"pandas.io.excel._base.ExcelFile2e +parse%pandas.io.excel._base.ExcelFile.parse3 parse%pandas.io.excel._base.ExcelFile.parse" Kbuiltins.dict[Union[builtins.int,builtins.str],pandas.core.frame.DataFrame]` Union[builtins.int,builtins.str] @@ -120,27 +120,24 @@ sheet_name builtins.int" builtins.intN typing.Sequence[builtins.int] builtins.int" builtins.int"typing.Sequence -None * - -usecols - -Union[builtins.str,TypeAlias[Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]]] - builtins.str" builtins.str -TypeAlias[Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]] -Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]\ -$typing.MutableSequence[builtins.str] - builtins.str" builtins.str"typing.MutableSequenceL -builtins.tuple[builtins.str] - builtins.str" builtins.str"builtins.tupleN -typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.SequenceD -pandas.core.series.Series[Any] -Any"pandas.core.series.SeriesN +None * +usecols +Union[builtins.str,TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]]] + builtins.str" builtins.str +TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]] +Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]s +.pandas._typing.SequenceNotStr[typing.Hashable]" +typing.Hashable"typing.Hashable"pandas._typing.SequenceNotStr +builtins.range"builtins.range +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index9 +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarrayK +Any" numpy.ndarray"pandas._typing.AnyArrayLikeK CallableType[builtins.function]& builtins.function"builtins.function None"pandas._typing.UsecolsArgType * @@ -225,7 +222,7 @@ skipfooter na_filter builtins.bool" builtins.bool * kwds -Any0:typing.overloadX0 +Any0:typing.overloadX1 parse%pandas.io.excel._base.ExcelFile.parse": pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*L selfB @@ -261,27 +258,24 @@ sheet_name` builtins.int" builtins.intN typing.Sequence[builtins.int] builtins.int" builtins.int"typing.Sequence -None * - -usecols - -Union[builtins.str,TypeAlias[Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]]] - builtins.str" builtins.str -TypeAlias[Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]] -Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]\ -$typing.MutableSequence[builtins.str] - builtins.str" builtins.str"typing.MutableSequenceL -builtins.tuple[builtins.str] - builtins.str" builtins.str"builtins.tupleN -typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.SequenceD -pandas.core.series.Series[Any] -Any"pandas.core.series.SeriesN +None * +usecols +Union[builtins.str,TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]]] + builtins.str" builtins.str +TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]] +Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]s +.pandas._typing.SequenceNotStr[typing.Hashable]" +typing.Hashable"typing.Hashable"pandas._typing.SequenceNotStr +builtins.range"builtins.range +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index9 +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarrayK +Any" numpy.ndarray"pandas._typing.AnyArrayLikeK CallableType[builtins.function]& builtins.function"builtins.function None"pandas._typing.UsecolsArgType * @@ -378,8 +372,8 @@ xUnion[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.R builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathh )pandas._typing.ReadBuffer[builtins.bytes] builtins.bytes"builtins.bytes"pandas._typing.ReadBuffer -builtins.bytes"builtins.bytes* - ExcelWriter!pandas.io.excel._base.ExcelWriter"builtins.object* +builtins.bytes"builtins.bytes- + ExcelWriter!pandas.io.excel._base.ExcelWriter"builtins.object* __init__*pandas.io.excel._base.ExcelWriter.__init__" None*P selfF @@ -392,15 +386,17 @@ xUnion[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.R os.PathLike[builtins.str] builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathB pandas._typing.WriteExcelBuffer"pandas._typing.WriteExcelBufferF -!pandas.io.excel._base.ExcelWriter"!pandas.io.excel._base.ExcelWriter* -engine -cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]7 +!pandas.io.excel._base.ExcelWriter"!pandas.io.excel._base.ExcelWriter* +engine +uUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],Literal[builtins.str],None] +STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str7 + builtins.str" builtins.str"pandas._typing.ExcelWriteEngine7 Literal[builtins.str]  builtins.str" builtins.str None *W @@ -446,15 +442,16 @@ cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal builtins.tuple[builtins.str] builtins.str" builtins.str"builtins.tuple*P selfF -!pandas.io.excel._base.ExcelWriter"!pandas.io.excel._base.ExcelWriter0:builtins.property`* -engine(pandas.io.excel._base.ExcelWriter.engine" +!pandas.io.excel._base.ExcelWriter"!pandas.io.excel._base.ExcelWriter0:builtins.property`* +engine(pandas.io.excel._base.ExcelWriter.engine" +STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str*P + builtins.str" builtins.str"pandas._typing.ExcelWriteEngine*P selfF !pandas.io.excel._base.ExcelWriter"!pandas.io.excel._base.ExcelWriter0:builtins.property`* sheets(pandas.io.excel._base.ExcelWriter.sheets"W @@ -515,39 +512,465 @@ __fspath__,pandas.io.excel._base.ExcelWriter.__fspath__" close'pandas.io.excel._base.ExcelWriter.close" None*P selfF -!pandas.io.excel._base.ExcelWriter"!pandas.io.excel._base.ExcelWriter" +!pandas.io.excel._base.ExcelWriter"!pandas.io.excel._base.ExcelWriter" -read_excel pandas.io.excel._base.read_excelO +read_excel pandas.io.excel._base.read_excelR + +read_excel pandas.io.excel._base.read_excel" +Abuiltins.dict[pandas._typing.IntStrT,pandas.core.frame.DataFrame]O +pandas._typing.IntStrT" +builtins.object"builtins.object"builtins.object: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame" builtins.dict* +io +Union[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.ReadBuffer[builtins.bytes],pandas.io.excel._base.ExcelFile,Any,Any,Any,Any] +8TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]] +-Union[builtins.str,os.PathLike[builtins.str]] + builtins.str" builtins.strF +os.PathLike[builtins.str] + builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathh +)pandas._typing.ReadBuffer[builtins.bytes] +builtins.bytes"builtins.bytes"pandas._typing.ReadBufferB +pandas.io.excel._base.ExcelFile"pandas.io.excel._base.ExcelFile +Any +Any +Any +Any* + +sheet_name +%builtins.list[pandas._typing.IntStrT]O +pandas._typing.IntStrT" +builtins.object"builtins.object"builtins.object" builtins.list* +header +6Union[builtins.int,typing.Sequence[builtins.int],None] + builtins.int" builtins.intN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.Sequence +None * +names +Union[TypeAlias[Union[typing.MutableSequence[pandas._typing.HashableT],numpy.ndarray[Any,Any],builtins.tuple[pandas._typing.HashableT],builtins.range]],None] +TypeAlias[Union[typing.MutableSequence[pandas._typing.HashableT],numpy.ndarray[Any,Any],builtins.tuple[pandas._typing.HashableT],builtins.range]] +Union[typing.MutableSequence[pandas._typing.HashableT],numpy.ndarray[Any,Any],builtins.tuple[pandas._typing.HashableT],builtins.range] +0typing.MutableSequence[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable"typing.MutableSequence9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray +(builtins.tuple[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable"builtins.tuple +builtins.range"builtins.range"pandas._typing.ListLikeHashable +None * + index_col +CUnion[builtins.int,typing.Sequence[builtins.int],builtins.str,None] + builtins.int" builtins.intN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.Sequence + builtins.str" builtins.str +None * +usecols +Union[builtins.str,TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]]] + builtins.str" builtins.str +TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]] +Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]s +.pandas._typing.SequenceNotStr[typing.Hashable]" +typing.Hashable"typing.Hashable"pandas._typing.SequenceNotStr +builtins.range"builtins.range +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.AnyArrayLikeK +CallableType[builtins.function]& +builtins.function"builtins.function +None"pandas._typing.UsecolsArgType * +dtype +Union[builtins.str,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],typing.Mapping[builtins.str,Union[builtins.str,Unknown]],None] + builtins.str" builtins.str +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype +8typing.Mapping[builtins.str,Union[builtins.str,Unknown]] + builtins.str" builtins.str? +Union[builtins.str,Unknown] + builtins.str" builtins.str"typing.Mapping +None * +engine +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +tUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ExcelReadEngine +None * + +converters +\Union[typing.Mapping[Union[builtins.int,builtins.str],CallableType[builtins.function]],None] +Ptyping.Mapping[Union[builtins.int,builtins.str],CallableType[builtins.function]]` + Union[builtins.int,builtins.str] + builtins.int" builtins.int + builtins.str" builtins.strK +CallableType[builtins.function]& +builtins.function"builtins.function"typing.Mapping +None * + true_values +,Union[typing.Iterable[typing.Hashable],None]W + typing.Iterable[typing.Hashable]" +typing.Hashable"typing.Hashable"typing.Iterable +None * + false_values +,Union[typing.Iterable[typing.Hashable],None]W + typing.Iterable[typing.Hashable]" +typing.Hashable"typing.Hashable"typing.Iterable +None * +skiprows +VUnion[builtins.int,typing.Sequence[builtins.int],CallableType[builtins.function],None] + builtins.int" builtins.intN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.SequenceK +CallableType[builtins.function]& +builtins.function"builtins.function +None *Q +nrowsD +Union[builtins.int,None] + builtins.int" builtins.int +None * + na_values +rUnion[typing.Sequence[builtins.str],builtins.dict[Union[builtins.str,builtins.int],typing.Sequence[builtins.str]]]N +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.Sequence +Mbuiltins.dict[Union[builtins.str,builtins.int],typing.Sequence[builtins.str]]` + Union[builtins.str,builtins.int] + builtins.str" builtins.str + builtins.int" builtins.intN +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.Sequence" builtins.dict *5 +keep_default_na + builtins.bool" builtins.bool */ + na_filter + builtins.bool" builtins.bool *- +verbose + builtins.bool" builtins.bool * + parse_dates +Union[builtins.bool,typing.Sequence[builtins.int],typing.Sequence[Union[typing.Sequence[builtins.str],typing.Sequence[builtins.int]]],builtins.dict[builtins.str,Union[typing.Sequence[builtins.int],builtins.list[builtins.str]]]] + builtins.bool" builtins.boolN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.Sequence +Styping.Sequence[Union[typing.Sequence[builtins.str],typing.Sequence[builtins.int]]] +BUnion[typing.Sequence[builtins.str],typing.Sequence[builtins.int]]N +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.SequenceN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.Sequence"typing.Sequence +\builtins.dict[builtins.str,Union[typing.Sequence[builtins.int],builtins.list[builtins.str]]] + builtins.str" builtins.str +@Union[typing.Sequence[builtins.int],builtins.list[builtins.str]]N +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.SequenceJ +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list" builtins.dict * + date_format +DUnion[builtins.dict[typing.Hashable,builtins.str],builtins.str,None]~ ++builtins.dict[typing.Hashable,builtins.str]" +typing.Hashable"typing.Hashable + builtins.str" builtins.str" builtins.dict + builtins.str" builtins.str +None *U + thousandsD +Union[builtins.str,None] + builtins.str" builtins.str +None *+ +decimal + builtins.str" builtins.str *S +commentD +Union[builtins.str,None] + builtins.str" builtins.str +None *. + +skipfooter + builtins.int" builtins.int * +storage_options +6TypeAlias[Union[builtins.dict[builtins.str,Any],None]] ++Union[builtins.dict[builtins.str,Any],None]W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict +None"pandas._typing.StorageOptions * + dtype_backend +tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Literal[pandas._libs.lib._NoDefault]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.DtypeBackend +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadXQ + +read_excel pandas.io.excel._base.read_excel" +7builtins.dict[builtins.str,pandas.core.frame.DataFrame] + builtins.str" builtins.str: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame" builtins.dict* +io +Union[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.ReadBuffer[builtins.bytes],pandas.io.excel._base.ExcelFile,Any,Any,Any,Any] +8TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]] +-Union[builtins.str,os.PathLike[builtins.str]] + builtins.str" builtins.strF +os.PathLike[builtins.str] + builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathh +)pandas._typing.ReadBuffer[builtins.bytes] +builtins.bytes"builtins.bytes"pandas._typing.ReadBufferB +pandas.io.excel._base.ExcelFile"pandas.io.excel._base.ExcelFile +Any +Any +Any +Any* + +sheet_name +None* +header +6Union[builtins.int,typing.Sequence[builtins.int],None] + builtins.int" builtins.intN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.Sequence +None * +names +Union[TypeAlias[Union[typing.MutableSequence[pandas._typing.HashableT],numpy.ndarray[Any,Any],builtins.tuple[pandas._typing.HashableT],builtins.range]],None] +TypeAlias[Union[typing.MutableSequence[pandas._typing.HashableT],numpy.ndarray[Any,Any],builtins.tuple[pandas._typing.HashableT],builtins.range]] +Union[typing.MutableSequence[pandas._typing.HashableT],numpy.ndarray[Any,Any],builtins.tuple[pandas._typing.HashableT],builtins.range] +0typing.MutableSequence[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable"typing.MutableSequence9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray +(builtins.tuple[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable"builtins.tuple +builtins.range"builtins.range"pandas._typing.ListLikeHashable +None * + index_col +CUnion[builtins.int,typing.Sequence[builtins.int],builtins.str,None] + builtins.int" builtins.intN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.Sequence + builtins.str" builtins.str +None * +usecols +Union[builtins.str,TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]]] + builtins.str" builtins.str +TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]] +Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]s +.pandas._typing.SequenceNotStr[typing.Hashable]" +typing.Hashable"typing.Hashable"pandas._typing.SequenceNotStr +builtins.range"builtins.range +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.AnyArrayLikeK +CallableType[builtins.function]& +builtins.function"builtins.function +None"pandas._typing.UsecolsArgType * +dtype +Union[builtins.str,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],typing.Mapping[builtins.str,Union[builtins.str,Unknown]],None] + builtins.str" builtins.str +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype +8typing.Mapping[builtins.str,Union[builtins.str,Unknown]] + builtins.str" builtins.str? +Union[builtins.str,Unknown] + builtins.str" builtins.str"typing.Mapping +None * +engine +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +tUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ExcelReadEngine +None * + +converters +\Union[typing.Mapping[Union[builtins.int,builtins.str],CallableType[builtins.function]],None] +Ptyping.Mapping[Union[builtins.int,builtins.str],CallableType[builtins.function]]` + Union[builtins.int,builtins.str] + builtins.int" builtins.int + builtins.str" builtins.strK +CallableType[builtins.function]& +builtins.function"builtins.function"typing.Mapping +None * + true_values +,Union[typing.Iterable[typing.Hashable],None]W + typing.Iterable[typing.Hashable]" +typing.Hashable"typing.Hashable"typing.Iterable +None * + false_values +,Union[typing.Iterable[typing.Hashable],None]W + typing.Iterable[typing.Hashable]" +typing.Hashable"typing.Hashable"typing.Iterable +None * +skiprows +VUnion[builtins.int,typing.Sequence[builtins.int],CallableType[builtins.function],None] + builtins.int" builtins.intN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.SequenceK +CallableType[builtins.function]& +builtins.function"builtins.function +None *Q +nrowsD +Union[builtins.int,None] + builtins.int" builtins.int +None * + na_values +rUnion[typing.Sequence[builtins.str],builtins.dict[Union[builtins.str,builtins.int],typing.Sequence[builtins.str]]]N +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.Sequence +Mbuiltins.dict[Union[builtins.str,builtins.int],typing.Sequence[builtins.str]]` + Union[builtins.str,builtins.int] + builtins.str" builtins.str + builtins.int" builtins.intN +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.Sequence" builtins.dict *5 +keep_default_na + builtins.bool" builtins.bool */ + na_filter + builtins.bool" builtins.bool *- +verbose + builtins.bool" builtins.bool * + parse_dates +Union[builtins.bool,typing.Sequence[builtins.int],typing.Sequence[Union[typing.Sequence[builtins.str],typing.Sequence[builtins.int]]],builtins.dict[builtins.str,Union[typing.Sequence[builtins.int],builtins.list[builtins.str]]]] + builtins.bool" builtins.boolN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.Sequence +Styping.Sequence[Union[typing.Sequence[builtins.str],typing.Sequence[builtins.int]]] +BUnion[typing.Sequence[builtins.str],typing.Sequence[builtins.int]]N +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.SequenceN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.Sequence"typing.Sequence +\builtins.dict[builtins.str,Union[typing.Sequence[builtins.int],builtins.list[builtins.str]]] + builtins.str" builtins.str +@Union[typing.Sequence[builtins.int],builtins.list[builtins.str]]N +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.SequenceJ +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list" builtins.dict * + date_format +DUnion[builtins.dict[typing.Hashable,builtins.str],builtins.str,None]~ ++builtins.dict[typing.Hashable,builtins.str]" +typing.Hashable"typing.Hashable + builtins.str" builtins.str" builtins.dict + builtins.str" builtins.str +None *U + thousandsD +Union[builtins.str,None] + builtins.str" builtins.str +None *+ +decimal + builtins.str" builtins.str *S +commentD +Union[builtins.str,None] + builtins.str" builtins.str +None *. + +skipfooter + builtins.int" builtins.int * +storage_options +6TypeAlias[Union[builtins.dict[builtins.str,Any],None]] ++Union[builtins.dict[builtins.str,Any],None]W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict +None"pandas._typing.StorageOptions * + dtype_backend +tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Literal[pandas._libs.lib._NoDefault]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.DtypeBackend +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadXS read_excel pandas.io.excel._base.read_excel" Kbuiltins.dict[Union[builtins.int,builtins.str],pandas.core.frame.DataFrame]` Union[builtins.int,builtins.str] builtins.int" builtins.int builtins.str" builtins.str: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame" builtins.dict* -io -Union[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.ReadBuffer[builtins.bytes],builtins.bytes,pandas.io.excel._base.ExcelFile,Any,Any,Any,Any] +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame" builtins.dict* +io +Union[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.ReadBuffer[builtins.bytes],pandas.io.excel._base.ExcelFile,Any,Any,Any,Any] 8TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]] -Union[builtins.str,os.PathLike[builtins.str]] builtins.str" builtins.strF os.PathLike[builtins.str] builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathh )pandas._typing.ReadBuffer[builtins.bytes] -builtins.bytes"builtins.bytes"pandas._typing.ReadBuffer -builtins.bytes"builtins.bytesB +builtins.bytes"builtins.bytes"pandas._typing.ReadBufferB pandas.io.excel._base.ExcelFile"pandas.io.excel._base.ExcelFile Any Any Any -Any* +Any* -sheet_name -;Union[builtins.list[Union[builtins.int,builtins.str]],None] +sheet_name /builtins.list[Union[builtins.int,builtins.str]]` Union[builtins.int,builtins.str] builtins.int" builtins.int - builtins.str" builtins.str" builtins.list -None* + builtins.str" builtins.str" builtins.list* header 6Union[builtins.int,typing.Sequence[builtins.int],None] builtins.int" builtins.intN @@ -568,33 +991,31 @@ sheet_name pandas._typing.HashableT" typing.Hashable"typing.Hashable"typing.Hashable"builtins.tuple builtins.range"builtins.range"pandas._typing.ListLikeHashable -None * - index_col -6Union[builtins.int,typing.Sequence[builtins.int],None] +None * + index_col +CUnion[builtins.int,typing.Sequence[builtins.int],builtins.str,None] builtins.int" builtins.intN typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.Sequence -None * - -usecols - -Union[builtins.str,TypeAlias[Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]]] - builtins.str" builtins.str -TypeAlias[Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]] -Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]\ -$typing.MutableSequence[builtins.str] - builtins.str" builtins.str"typing.MutableSequenceL -builtins.tuple[builtins.str] - builtins.str" builtins.str"builtins.tupleN -typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.SequenceD -pandas.core.series.Series[Any] -Any"pandas.core.series.SeriesN + builtins.int" builtins.int"typing.Sequence + builtins.str" builtins.str +None * +usecols +Union[builtins.str,TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]]] + builtins.str" builtins.str +TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]] +Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]s +.pandas._typing.SequenceNotStr[typing.Hashable]" +typing.Hashable"typing.Hashable"pandas._typing.SequenceNotStr +builtins.range"builtins.range +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index9 +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarrayK +Any" numpy.ndarray"pandas._typing.AnyArrayLikeK CallableType[builtins.function]& builtins.function"builtins.function None"pandas._typing.UsecolsArgType * @@ -621,9 +1042,11 @@ $typing.MutableSequence[builtins.str] builtins.str" builtins.str? Union[builtins.str,Unknown] builtins.str" builtins.str"typing.Mapping -None * -engine -cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]7 +None * +engine +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +tUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -631,7 +1054,9 @@ cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ExcelReadEngine None * converters @@ -736,20 +1161,19 @@ tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],TypeAlias[L builtins.str" builtins.str"pandas._typing.DtypeBackend /TypeAlias[Literal[pandas._libs.lib._NoDefault]]d $Literal[pandas._libs.lib._NoDefault] : -pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadXM +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadXQ read_excel pandas.io.excel._base.read_excel": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -io -Union[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.ReadBuffer[builtins.bytes],builtins.bytes,pandas.io.excel._base.ExcelFile,Any,Any,Any,Any] +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +io +Union[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.ReadBuffer[builtins.bytes],pandas.io.excel._base.ExcelFile,Any,Any,Any,Any] 8TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]] -Union[builtins.str,os.PathLike[builtins.str]] builtins.str" builtins.strF os.PathLike[builtins.str] builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathh )pandas._typing.ReadBuffer[builtins.bytes] -builtins.bytes"builtins.bytes"pandas._typing.ReadBuffer -builtins.bytes"builtins.bytesB +builtins.bytes"builtins.bytes"pandas._typing.ReadBufferB pandas.io.excel._base.ExcelFile"pandas.io.excel._base.ExcelFile Any Any @@ -780,33 +1204,31 @@ sheet_name` pandas._typing.HashableT" typing.Hashable"typing.Hashable"typing.Hashable"builtins.tuple builtins.range"builtins.range"pandas._typing.ListLikeHashable -None * - index_col -6Union[builtins.int,typing.Sequence[builtins.int],None] +None * + index_col +CUnion[builtins.int,typing.Sequence[builtins.int],builtins.str,None] builtins.int" builtins.intN typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.Sequence -None * - -usecols - -Union[builtins.str,TypeAlias[Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]]] - builtins.str" builtins.str -TypeAlias[Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]] -Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]\ -$typing.MutableSequence[builtins.str] - builtins.str" builtins.str"typing.MutableSequenceL -builtins.tuple[builtins.str] - builtins.str" builtins.str"builtins.tupleN -typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.SequenceD -pandas.core.series.Series[Any] -Any"pandas.core.series.SeriesN + builtins.int" builtins.int"typing.Sequence + builtins.str" builtins.str +None * +usecols +Union[builtins.str,TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]]] + builtins.str" builtins.str +TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]] +Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]s +.pandas._typing.SequenceNotStr[typing.Hashable]" +typing.Hashable"typing.Hashable"pandas._typing.SequenceNotStr +builtins.range"builtins.range +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index9 +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarrayK +Any" numpy.ndarray"pandas._typing.AnyArrayLikeK CallableType[builtins.function]& builtins.function"builtins.function None"pandas._typing.UsecolsArgType * @@ -833,9 +1255,11 @@ $typing.MutableSequence[builtins.str] builtins.str" builtins.str? Union[builtins.str,Unknown] builtins.str" builtins.str"typing.Mapping -None * -engine -cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]7 +None * +engine +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +tUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -843,7 +1267,9 @@ cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ExcelReadEngine None * converters diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.io.formats.style.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.io.formats.style.protobuf index c48491fca61d3f30f519fa01fe5281b2d0d7b770..d3e40545ee5bc6cf7e48d152f47dfe6e4b3c83b3 100644 GIT binary patch delta 704 zcmdnJjpf8nmJLeEf*+Z=xZ{IUi!xJ--AeP4g_I{7>Pl!Mi74?Wm1gFYWabs?lTzBi$Yl|lmzkdz4L2btv$!PMF|RUKXY$2P zIm1{1MkyUGAxvp0b}nY1G67a4UKGj6XFJ{4w0xwzxWMk@MY2~3Lqy9Bqs^HROB-Q zy|zVQpBTAV(tuG74EyJdTwYN30=59%Pl47^5I70QxiOw*UYD delta 153 zcmX@HlV$fdmJLeEOuOD~o~vQ5EPRifi!ZUDAg3}nu^>J(FD11?X!1iziOCm2I5=S9 zoAun5vGOe8;)07z7I>nF;9PX+pFGPad^3OQcjn3ay+t>#4*a=`sZnP7KT$?qW~p{T g5M$5gSw5?ox8D|IRAgZ~&IJ|%>Ds9FEd{+qa-&+>Zid*;TKGTTUfZ*(sB~Z@{0tRq?WR9RZQG3 zHu=4<_T+wHN!60dg3P>hz2MZs($u`<)acN>?7aN)yjUH-{Jhjy0Y<5}OkBZ}?+aT4 zRZH*+uuFYs9FEd{+qa-&+s#klX@Czo+ATGAFoW!#HqRGE_y*C@N1_@2> HmFNKgzUmR2 diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.io.json._json.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.io.json._json.protobuf index d7a6812a1a368c95f7ba50107b8b398dbc05912f..688f7e2b82401d9d1b34d3f52a0449a59b5875a8 100644 GIT binary patch delta 358 zcmdn}pK*6P(}q1)wpdJ$ diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.io.json.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.io.json.protobuf index ed278192a9c73fe0dede89a721172153447998fb..0684fec856e79503a21dc82734602c82b4c5aa04 100644 GIT binary patch delta 358 zcmbRCm2ui%#tk~Gj2|ZJvg$EfPu64A-rUZrBPh(m#hH>=k{Vx{msujfBz2XAt90^5 z9X@m-w7ELuK0Big*xa_5?NstU(A?dHw>bdUJb0P_ delta 214 zcmbRCmvP!x#tk~Gj4vkZvg$EfPS#`9-rUZrBPh(o#hH>=k{Vx{msujfBz2XED|vE2 zQrsk|HRtOZ!TnbUCr!suHPM OPK1+ydUluI<^TX6x%U#a@1p%x@f-1v71@wqZk)kL1Iy2Zm|HP)FUyj>&%-MOb%e= zPb$sKDap($)+;G3$VrW!Y?vWF`P~%t$sJWPljDszCtGFkZ5D7d;t)#XQpci}F?RC$ zCf&(~ewi#28M#a*KWKt$o1AE?FnL3h&gP!E5loZ+nCfok3(V$Xx@$JcQGfHQ=wD0& z?WWDYvf8+qzT{6XoS?)kwZH;MD{nqk8Z*FwwV7%2_0}0&Ol!u|H)Zph v+%_(zLs^q+rYJE>9XAEi%A0E{Vn}w76))3elg%|#WJ%V!h-vfUrIp+OBerG^ diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.plotting._core.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.plotting._core.protobuf index 95669ad74372cac8603ec19aa55c3af7e7ec147b..a88ada811c001814aaef257e2c49b106630976f5 100644 GIT binary patch delta 352 zcmcb6jCu1R<_$gkOxu2K?&IGU#B@n*^6qSXW~o<#K-ysPilkUZ?aBKOYqBUXYH3eC zuvc^Q#`0|T$pQ!GFl`puygQqV2~$3vee#pD#T-Uw)VP?F5{o7mtW)I%(o!!3;rz*q z%Mvj)LJVf#C<0fv`APjfMofhe8<>qiuAK~Z?PQ>9yRf*HodfLB$+%t0Y_x=P^8N+7 zOj27W?^~chdHK9p-v5kTOi7gjj8b11x$Gtj&bOW1n5;4R-@@L>j0aaU?ggqliAT+p Mqvf0V7W+E@0A+WLbN~PV delta 309 zcmdmdi23d@<_$gkOb`BT?&IGU#L=L^#gdbmmpb`Fhw9`B*({t=2ZT^WSSPPYik-Y- z+lI}|T`U|N-J%HD%@eZkGeV_e*txy9IEqV?3UcyGiYMFG*-Z{SuET8fOMUX}Qaz@9 zLX%IIcEgQf>J$a?^)^4LyG6)=293!wo%+l`X94M6gbCfEK)%6d%Si-GU@|%~*=~+L sZh|0DsVal>h($ diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.plotting.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.plotting.protobuf index 32175c8d0..db31fbd7e 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.plotting.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.plotting.protobuf @@ -1,5 +1,5 @@ -pandas.plotting +pandas.plotting PlotAccessor"pandas.plotting._core.PlotAccessor"builtins.object* __init__+pandas.plotting._core.PlotAccessor.__init__" None*R @@ -581,20 +581,16 @@ mark_right backend builtins.str" builtins.str * kwargs -Any0:typing.overloadX2( -line'pandas.plotting._core.PlotAccessor.line +Any0:typing.overloadX2& +line'pandas.plotting._core.PlotAccessor.line line'pandas.plotting._core.PlotAccessor.line" Any*R selfH -"pandas.plotting._core.PlotAccessor""pandas.plotting._core.PlotAccessor*V -xM -Union[typing.Hashable,None]" -typing.Hashable"typing.Hashable -None *V -yM -Union[typing.Hashable,None]" -typing.Hashable"typing.Hashable -None * +"pandas.plotting._core.PlotAccessor""pandas.plotting._core.PlotAccessor*+ +x" +typing.Hashable"typing.Hashable *+ +y" +typing.Hashable"typing.Hashable * color TypeAlias[Union[builtins.str,builtins.list[TypeAlias[Union[builtins.str,builtins.list[builtins.float],Tuple[builtins.float,builtins.float,builtins.float],Tuple[builtins.float,builtins.float,builtins.float,builtins.float]]]],builtins.dict[pandas._typing.HashableT,Unknown]]] Union[builtins.str,builtins.list[TypeAlias[Union[builtins.str,builtins.list[builtins.float],Tuple[builtins.float,builtins.float,builtins.float],Tuple[builtins.float,builtins.float,builtins.float,builtins.float]]]],builtins.dict[pandas._typing.HashableT,Unknown]] @@ -617,13 +613,13 @@ BTuple[builtins.float,builtins.float,builtins.float,builtins.float] /builtins.dict[pandas._typing.HashableT,Unknown]Q pandas._typing.HashableT" typing.Hashable"typing.Hashable"typing.Hashable" builtins.dict"(pandas.plotting._core._PlotAccessorColor *| -subplotsl +subplotsl "Union[Literal[builtins.bool],None]: Literal[builtins.bool]  builtins.bool" builtins.bool None * kwargs -Any0:typing.overloadX +Any0:typing.overloadX line'pandas.plotting._core.PlotAccessor.line" STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] @@ -632,15 +628,11 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] (numpy._typing._array_like._ScalarType_co numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray*R selfH -"pandas.plotting._core.PlotAccessor""pandas.plotting._core.PlotAccessor*V -xM -Union[typing.Hashable,None]" -typing.Hashable"typing.Hashable -None *V -yM -Union[typing.Hashable,None]" -typing.Hashable"typing.Hashable -None * +"pandas.plotting._core.PlotAccessor""pandas.plotting._core.PlotAccessor*+ +x" +typing.Hashable"typing.Hashable *+ +y" +typing.Hashable"typing.Hashable * color TypeAlias[Union[builtins.str,builtins.list[TypeAlias[Union[builtins.str,builtins.list[builtins.float],Tuple[builtins.float,builtins.float,builtins.float],Tuple[builtins.float,builtins.float,builtins.float,builtins.float]]]],builtins.dict[pandas._typing.HashableT,Unknown]]] Union[builtins.str,builtins.list[TypeAlias[Union[builtins.str,builtins.list[builtins.float],Tuple[builtins.float,builtins.float,builtins.float],Tuple[builtins.float,builtins.float,builtins.float,builtins.float]]]],builtins.dict[pandas._typing.HashableT,Unknown]] @@ -662,25 +654,21 @@ BTuple[builtins.float,builtins.float,builtins.float,builtins.float] builtins.float"builtins.float""pandas.plotting._core._SingleColor" builtins.list /builtins.dict[pandas._typing.HashableT,Unknown]Q pandas._typing.HashableT" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.dict"(pandas.plotting._core._PlotAccessorColor *J -subplots: +typing.Hashable"typing.Hashable"typing.Hashable" builtins.dict"(pandas.plotting._core._PlotAccessorColor *H +subplots: Literal[builtins.bool]  - builtins.bool" builtins.bool * + builtins.bool" builtins.bool* kwargs -Any0:typing.overloadX2' -bar&pandas.plotting._core.PlotAccessor.bar +Any0:typing.overloadX2& +bar&pandas.plotting._core.PlotAccessor.bar bar&pandas.plotting._core.PlotAccessor.bar" Any*R selfH -"pandas.plotting._core.PlotAccessor""pandas.plotting._core.PlotAccessor*V -xM -Union[typing.Hashable,None]" -typing.Hashable"typing.Hashable -None *V -yM -Union[typing.Hashable,None]" -typing.Hashable"typing.Hashable -None * +"pandas.plotting._core.PlotAccessor""pandas.plotting._core.PlotAccessor*+ +x" +typing.Hashable"typing.Hashable *+ +y" +typing.Hashable"typing.Hashable * color TypeAlias[Union[builtins.str,builtins.list[TypeAlias[Union[builtins.str,builtins.list[builtins.float],Tuple[builtins.float,builtins.float,builtins.float],Tuple[builtins.float,builtins.float,builtins.float,builtins.float]]]],builtins.dict[pandas._typing.HashableT,Unknown]]] Union[builtins.str,builtins.list[TypeAlias[Union[builtins.str,builtins.list[builtins.float],Tuple[builtins.float,builtins.float,builtins.float],Tuple[builtins.float,builtins.float,builtins.float,builtins.float]]]],builtins.dict[pandas._typing.HashableT,Unknown]] @@ -703,13 +691,13 @@ BTuple[builtins.float,builtins.float,builtins.float,builtins.float] /builtins.dict[pandas._typing.HashableT,Unknown]Q pandas._typing.HashableT" typing.Hashable"typing.Hashable"typing.Hashable" builtins.dict"(pandas.plotting._core._PlotAccessorColor *| -subplotsl +subplotsl "Union[Literal[builtins.bool],None]: Literal[builtins.bool]  builtins.bool" builtins.bool None * kwargs -Any0:typing.overloadX +Any0:typing.overloadX bar&pandas.plotting._core.PlotAccessor.bar" STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] @@ -718,15 +706,11 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] (numpy._typing._array_like._ScalarType_co numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray*R selfH -"pandas.plotting._core.PlotAccessor""pandas.plotting._core.PlotAccessor*V -xM -Union[typing.Hashable,None]" -typing.Hashable"typing.Hashable -None *V -yM -Union[typing.Hashable,None]" -typing.Hashable"typing.Hashable -None * +"pandas.plotting._core.PlotAccessor""pandas.plotting._core.PlotAccessor*+ +x" +typing.Hashable"typing.Hashable *+ +y" +typing.Hashable"typing.Hashable * color TypeAlias[Union[builtins.str,builtins.list[TypeAlias[Union[builtins.str,builtins.list[builtins.float],Tuple[builtins.float,builtins.float,builtins.float],Tuple[builtins.float,builtins.float,builtins.float,builtins.float]]]],builtins.dict[pandas._typing.HashableT,Unknown]]] Union[builtins.str,builtins.list[TypeAlias[Union[builtins.str,builtins.list[builtins.float],Tuple[builtins.float,builtins.float,builtins.float],Tuple[builtins.float,builtins.float,builtins.float,builtins.float]]]],builtins.dict[pandas._typing.HashableT,Unknown]] @@ -748,25 +732,21 @@ BTuple[builtins.float,builtins.float,builtins.float,builtins.float] builtins.float"builtins.float""pandas.plotting._core._SingleColor" builtins.list /builtins.dict[pandas._typing.HashableT,Unknown]Q pandas._typing.HashableT" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.dict"(pandas.plotting._core._PlotAccessorColor *J -subplots: +typing.Hashable"typing.Hashable"typing.Hashable" builtins.dict"(pandas.plotting._core._PlotAccessorColor *H +subplots: Literal[builtins.bool]  - builtins.bool" builtins.bool * + builtins.bool" builtins.bool* kwargs -Any0:typing.overloadX2( -barh'pandas.plotting._core.PlotAccessor.barh +Any0:typing.overloadX2& +barh'pandas.plotting._core.PlotAccessor.barh barh'pandas.plotting._core.PlotAccessor.barh" Any*R selfH -"pandas.plotting._core.PlotAccessor""pandas.plotting._core.PlotAccessor*V -xM -Union[typing.Hashable,None]" -typing.Hashable"typing.Hashable -None *V -yM -Union[typing.Hashable,None]" -typing.Hashable"typing.Hashable -None * +"pandas.plotting._core.PlotAccessor""pandas.plotting._core.PlotAccessor*+ +x" +typing.Hashable"typing.Hashable *+ +y" +typing.Hashable"typing.Hashable * color TypeAlias[Union[builtins.str,builtins.list[TypeAlias[Union[builtins.str,builtins.list[builtins.float],Tuple[builtins.float,builtins.float,builtins.float],Tuple[builtins.float,builtins.float,builtins.float,builtins.float]]]],builtins.dict[pandas._typing.HashableT,Unknown]]] Union[builtins.str,builtins.list[TypeAlias[Union[builtins.str,builtins.list[builtins.float],Tuple[builtins.float,builtins.float,builtins.float],Tuple[builtins.float,builtins.float,builtins.float,builtins.float]]]],builtins.dict[pandas._typing.HashableT,Unknown]] @@ -795,7 +775,7 @@ BTuple[builtins.float,builtins.float,builtins.float,builtins.float] builtins.bool" builtins.bool None * kwargs -Any0:typing.overloadX +Any0:typing.overloadX barh'pandas.plotting._core.PlotAccessor.barh" STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] @@ -804,15 +784,11 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] (numpy._typing._array_like._ScalarType_co numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray*R selfH -"pandas.plotting._core.PlotAccessor""pandas.plotting._core.PlotAccessor*V -xM -Union[typing.Hashable,None]" -typing.Hashable"typing.Hashable -None *V -yM -Union[typing.Hashable,None]" -typing.Hashable"typing.Hashable -None * +"pandas.plotting._core.PlotAccessor""pandas.plotting._core.PlotAccessor*+ +x" +typing.Hashable"typing.Hashable *+ +y" +typing.Hashable"typing.Hashable * color TypeAlias[Union[builtins.str,builtins.list[TypeAlias[Union[builtins.str,builtins.list[builtins.float],Tuple[builtins.float,builtins.float,builtins.float],Tuple[builtins.float,builtins.float,builtins.float,builtins.float]]]],builtins.dict[pandas._typing.HashableT,Unknown]]] Union[builtins.str,builtins.list[TypeAlias[Union[builtins.str,builtins.list[builtins.float],Tuple[builtins.float,builtins.float,builtins.float],Tuple[builtins.float,builtins.float,builtins.float,builtins.float]]]],builtins.dict[pandas._typing.HashableT,Unknown]] @@ -834,46 +810,44 @@ BTuple[builtins.float,builtins.float,builtins.float,builtins.float] builtins.float"builtins.float""pandas.plotting._core._SingleColor" builtins.list /builtins.dict[pandas._typing.HashableT,Unknown]Q pandas._typing.HashableT" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.dict"(pandas.plotting._core._PlotAccessorColor *J -subplots: +typing.Hashable"typing.Hashable"typing.Hashable" builtins.dict"(pandas.plotting._core._PlotAccessorColor *H +subplots: Literal[builtins.bool]  - builtins.bool" builtins.bool * + builtins.bool" builtins.bool* kwargs -Any0:typing.overloadX2 -box&pandas.plotting._core.PlotAccessor.box +Any0:typing.overloadX2 +box&pandas.plotting._core.PlotAccessor.box box&pandas.plotting._core.PlotAccessor.box" Any*R selfH -"pandas.plotting._core.PlotAccessor""pandas.plotting._core.PlotAccessor* -by -CUnion[typing.Hashable,builtins.list[pandas._typing.HashableT],None]" +"pandas.plotting._core.PlotAccessor""pandas.plotting._core.PlotAccessor* +by +>Union[typing.Hashable,builtins.list[pandas._typing.HashableT]]" typing.Hashable"typing.Hashable 'builtins.list[pandas._typing.HashableT]Q pandas._typing.HashableT" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.list -None *| -subplotsl +typing.Hashable"typing.Hashable"typing.Hashable" builtins.list *| +subplotsl "Union[Literal[builtins.bool],None]: Literal[builtins.bool]  builtins.bool" builtins.bool None * kwargs -Any0:typing.overloadX +Any0:typing.overloadX box&pandas.plotting._core.PlotAccessor.box"D pandas.core.series.Series[Any] Any"pandas.core.series.Series*R selfH -"pandas.plotting._core.PlotAccessor""pandas.plotting._core.PlotAccessor* -by -CUnion[typing.Hashable,builtins.list[pandas._typing.HashableT],None]" +"pandas.plotting._core.PlotAccessor""pandas.plotting._core.PlotAccessor* +by +>Union[typing.Hashable,builtins.list[pandas._typing.HashableT]]" typing.Hashable"typing.Hashable 'builtins.list[pandas._typing.HashableT]Q pandas._typing.HashableT" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.list -None *J -subplots: +typing.Hashable"typing.Hashable"typing.Hashable" builtins.list *H +subplots: Literal[builtins.bool]  - builtins.bool" builtins.bool * + builtins.bool" builtins.bool* kwargs Any0:typing.overloadX2 hist'pandas.plotting._core.PlotAccessor.hist diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.protobuf index f6a4e875d..1ef3b7495 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pandas.protobuf @@ -13,16 +13,18 @@ ArrowDtype)pandas.core.arrays.arrow.dtype.ArrowDtype"-pandas.core.dtypes.base.S selfV )pandas.core.arrays.arrow.dtype.ArrowDtype")pandas.core.arrays.arrow.dtype.ArrowDtype0:builtins.property`rQ pyarrow_dtype7pandas.core.arrays.arrow.dtype.ArrowDtype.pyarrow_dtype -Any - BooleanDtype'pandas.core.arrays.boolean.BooleanDtype"&pandas.core.dtypes.base.ExtensionDtype* +Any + BooleanDtype'pandas.core.arrays.boolean.BooleanDtype"&pandas.core.dtypes.base.ExtensionDtype* +na_value0pandas.core.arrays.boolean.BooleanDtype.na_value": +pandas._libs.missing.NAType"pandas._libs.missing.NAType*\ +selfR +'pandas.core.arrays.boolean.BooleanDtype"'pandas.core.arrays.boolean.BooleanDtype0:builtins.property`* construct_array_type +__new__5pandas.core.indexes.category.CategoricalIndex.__new__" +2pandas.core.indexes.category.CategoricalIndex.Self +@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -667,20 +499,17 @@ $TypeAlias[Union[builtins.bool,None]]G builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"-pandas.core.indexes.category.CategoricalIndex"-pandas.core.indexes.category.CategoricalIndex(* -cls -8Type[pandas.core.indexes.category.CategoricalIndex.Self] -2pandas.core.indexes.category.CategoricalIndex.Self -@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"-pandas.core.indexes.category.CategoricalIndex"-pandas.core.indexes.category.CategoricalIndex(* +cls +8Type[pandas.core.indexes.category.CategoricalIndex.Self] +2pandas.core.indexes.category.CategoricalIndex.Self +@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -707,18 +536,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"-pandas.core.indexes.category.CategoricalIndex"-pandas.core.indexes.category.CategoricalIndex("type* -data -"typing.Iterable[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"-pandas.core.indexes.category.CategoricalIndex"-pandas.core.indexes.category.CategoricalIndex("type* +data +"typing.Iterable[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -745,14 +571,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"typing.Iterable * +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Iterable * categories Any * @@ -766,13 +589,13 @@ categories Any *S equals4pandas.core.indexes.category.CategoricalIndex.equals* self* -other* +other* inferred_type;pandas.core.indexes.category.CategoricalIndex.inferred_type" - builtins.str" builtins.str* -self -@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.str" builtins.str* +self +@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -799,21 +622,18 @@ categories builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"-pandas.core.indexes.category.CategoricalIndex0:builtins.property`*_ +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"-pandas.core.indexes.category.CategoricalIndex0:builtins.property`*_ values4pandas.core.indexes.category.CategoricalIndex.values* -self0:builtins.property`* +self0:builtins.property`* __contains__:pandas.core.indexes.category.CategoricalIndex.__contains__" - builtins.bool" builtins.bool* -@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -840,23 +660,20 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"-pandas.core.indexes.category.CategoricalIndex*  -Any* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"-pandas.core.indexes.category.CategoricalIndex*  +Any* __array__7pandas.core.indexes.category.CategoricalIndex.__array__"9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray* -self -@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray* +self +@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -883,23 +700,20 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"-pandas.core.indexes.category.CategoricalIndex* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"-pandas.core.indexes.category.CategoricalIndex* dtype -Any *& +Any *# astype4pandas.core.indexes.category.CategoricalIndex.astype"N #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index* -self -@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any"pandas.core.indexes.base.Index* +self +@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -926,14 +740,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"-pandas.core.indexes.category.CategoricalIndex* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"-pandas.core.indexes.category.CategoricalIndex* dtype TypeAlias[Union[TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],typing.Mapping[Any,Unknown]]] Union[TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],typing.Mapping[Any,Unknown]] @@ -960,13 +771,13 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand fillna4pandas.core.indexes.category.CategoricalIndex.fillna* self* value * -downcast * +downcast * is_unique7pandas.core.indexes.category.CategoricalIndex.is_unique" - builtins.bool" builtins.bool* -self -@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +self +@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -993,20 +804,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"-pandas.core.indexes.category.CategoricalIndex0:builtins.property`* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"-pandas.core.indexes.category.CategoricalIndex0:builtins.property`* is_monotonic_increasingEpandas.core.indexes.category.CategoricalIndex.is_monotonic_increasing" - builtins.bool" builtins.bool* -self -@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +self +@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1033,20 +841,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"-pandas.core.indexes.category.CategoricalIndex0:builtins.property`* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"-pandas.core.indexes.category.CategoricalIndex0:builtins.property`* is_monotonic_decreasingEpandas.core.indexes.category.CategoricalIndex.is_monotonic_decreasing" - builtins.bool" builtins.bool* -self -@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +self +@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1073,24 +878,21 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"-pandas.core.indexes.category.CategoricalIndex0:builtins.property`*U +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"-pandas.core.indexes.category.CategoricalIndex0:builtins.property`*U unique4pandas.core.indexes.category.CategoricalIndex.unique* self* -level * +level * duplicated8pandas.core.indexes.category.CategoricalIndex.duplicated" -Any* -self -@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any* +self +@pandas.core.indexes.category.CategoricalIndex[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -1117,14 +919,11 @@ duplicated8pandas.core.indexes.category.CategoricalIndex.duplicated" builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"-pandas.core.indexes.category.CategoricalIndex* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"-pandas.core.indexes.category.CategoricalIndex* keep IUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.bool]]7 Literal[builtins.str]  @@ -1132,14 +931,7 @@ IUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.bool]]7 Literal[builtins.str]  builtins.str" builtins.str: Literal[builtins.bool]  - builtins.bool" builtins.bool *S -get_loc5pandas.core.indexes.category.CategoricalIndex.get_loc* -self* -key*l - get_value7pandas.core.indexes.category.CategoricalIndex.get_value* -self* -seriesArrayLike* -key*] + builtins.bool" builtins.bool *] where3pandas.core.indexes.category.CategoricalIndex.where* self* cond* @@ -1162,16 +954,7 @@ IUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.bool]]7 get_indexer_non_uniqueDpandas.core.indexes.category.CategoricalIndex.get_indexer_non_unique* self* -target*` -take_nd5pandas.core.indexes.category.CategoricalIndex.take_nd* -self* -args* - -kwargs*N -map1pandas.core.indexes.category.CategoricalIndex.map* -self* - -mapper*Q +target*Q delete4pandas.core.indexes.category.CategoricalIndex.delete* self* loc*[ @@ -1186,7 +969,7 @@ IUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.bool]]7 categories8pandas.core.indexes.category.CategoricalIndex.categoriesN #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index +Any"pandas.core.indexes.base.IndexD DataFramepandas.core.frame.DataFrame"pandas.core.generic.NDFrame"pandas.core.arraylike.OpsMixin* __dataframe__)pandas.core.frame.DataFrame.__dataframe__"l 4pandas.core.interchange.dataframe_protocol.DataFrame"4pandas.core.interchange.dataframe_protocol.DataFrame*D @@ -1196,7 +979,15 @@ categories8pandas.core.indexes.category.CategoricalIndex.categoriesN builtins.bool" builtins.bool *0 allow_copy - builtins.bool" builtins.bool * + builtins.bool" builtins.bool * +__arrow_c_stream__.pandas.core.frame.DataFrame.__arrow_c_stream__"" +builtins.object"builtins.object*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*e +requested_schemaM +Union[builtins.object,None]" +builtins.object"builtins.object +None * axes pandas.core.frame.DataFrame.axes" 2builtins.list[pandas.core.indexes.base.Index[Any]]N #pandas.core.indexes.base.Index[Any] @@ -1220,57 +1011,21 @@ Ftyping.Iterable[Tuple[typing.Hashable,pandas.core.series.Series[Any]]] pandas.core.series.Series[Any] Any"pandas.core.series.Series"typing.Iterable*D self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -iterrows$pandas.core.frame.DataFrame.iterrows" -]typing.Iterable[Tuple[TypeAlias[Union[typing.Hashable,None]],pandas.core.series.Series[Any]]] -LTuple[TypeAlias[Union[typing.Hashable,None]],pandas.core.series.Series[Any]] -&TypeAlias[Union[typing.Hashable,None]]M -Union[typing.Hashable,None]" -typing.Hashable"typing.Hashable -None"pandas._typing.LabelD +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +iterrows$pandas.core.frame.DataFrame.iterrows" +Ftyping.Iterable[Tuple[typing.Hashable,pandas.core.series.Series[Any]]] +5Tuple[typing.Hashable,pandas.core.series.Series[Any]]" +typing.Hashable"typing.HashableD pandas.core.series.Series[Any] Any"pandas.core.series.Series"typing.Iterable*D self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* - -itertuples&pandas.core.frame.DataFrame.itertuples" -Any*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*+ -index - builtins.bool" builtins.bool *P -nameD -Union[builtins.str,None] - builtins.str" builtins.str -None * +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* __len__#pandas.core.frame.DataFrame.__len__" builtins.int" builtins.int*<: pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*8 __matmul__&pandas.core.frame.DataFrame.__matmul__***: - __rmatmul__'pandas.core.frame.DataFrame.__rmatmul__*** - from_dict%pandas.core.frame.DataFrame.from_dict": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*p -clsg -!Type[pandas.core.frame.DataFrame]: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame"type*C -data9 -builtins.dict[Any,Any] -Any -Any" builtins.dict* -orient -HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str *) -dtype - builtins.str" builtins.str *Y -columnsJ -builtins.list[builtins.str] - builtins.str" builtins.str" builtins.list 0:builtins.classmethodp* + __rmatmul__'pandas.core.frame.DataFrame.__rmatmul__*** to_numpy$pandas.core.frame.DataFrame.to_numpy"9 numpy.ndarray[Any,Any] Any @@ -1592,21 +1347,32 @@ jUnion[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.W *pandas._typing.WriteBuffer[builtins.bytes] builtins.bytes"builtins.bytes"pandas._typing.WriteBuffer* kwargs -Any* +Any* info pandas.core.frame.DataFrame.info" None*D self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -verbose -Any * -buf -Any * -max_cols -Any * - memory_usage -Any * - null_counts -Any * +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*V +verboseG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None *o +bufd +(pandas._typing.WriteBuffer[builtins.str] + builtins.str" builtins.str"pandas._typing.WriteBuffer *T +max_colsD +Union[builtins.int,None] + builtins.int" builtins.int +None * + memory_usage +/Union[builtins.bool,Literal[builtins.str],None] + builtins.bool" builtins.bool7 +Literal[builtins.str]  + builtins.str" builtins.str +None *Z + show_countsG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None * memory_usage(pandas.core.frame.DataFrame.memory_usage"D pandas.core.series.Series[Any] Any"pandas.core.series.Series*D @@ -1684,23 +1450,7 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P inplace builtins.bool" builtins.bool * kwargs -Any* - select_dtypes)pandas.core.frame.DataFrame.select_dtypes": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -include -4Union[builtins.str,builtins.list[builtins.str],None] - builtins.str" builtins.strJ -builtins.list[builtins.str] - builtins.str" builtins.str" builtins.list -None * -exclude -4Union[builtins.str,builtins.list[builtins.str],None] - builtins.str" builtins.strJ -builtins.list[builtins.str] - builtins.str" builtins.str" builtins.list -None * +Any* insert"pandas.core.frame.DataFrame.insert" None*D self: @@ -1748,21 +1498,7 @@ uUnion[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any self: pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* kwargs -Any* -lookup"pandas.core.frame.DataFrame.lookup"9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*@ - -row_labels0 -typing.Sequence[Any] -Any"typing.Sequence*@ - -col_labels0 -typing.Sequence[Any] -Any"typing.Sequence*& +Any*& align!pandas.core.frame.DataFrame.align" :Tuple[pandas.core.frame.DataFrame,pandas._typing.NDFrameT]: pandas.core.frame.DataFrame"pandas.core.frame.DataFramet @@ -2049,13 +1785,17 @@ fill_valueM notnull#pandas.core.frame.DataFrame.notnull": pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* drop_duplicates+pandas.core.frame.DataFrame.drop_duplicates": pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -subset -Any * +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +subset +Union[typing.Hashable,builtins.list[pandas._typing.HashableT]]" -typing.Hashable"typing.Hashable -'builtins.list[pandas._typing.HashableT]Q -pandas._typing.HashableT" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.list 0:typing.overloadX - reset_index'pandas.core.frame.DataFrame.reset_index": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -level -NUnion[TypeAlias[Union[typing.Hashable,builtins.int]],typing.Sequence[Unknown]] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level- -typing.Sequence[Unknown]"typing.Sequence *q - col_level` - Union[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str *2 -col_fill" -typing.Hashable"typing.Hashable ** -drop - builtins.bool" builtins.bool *I -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool *6 -allow_duplicates - builtins.bool" builtins.bool * -names ->Union[typing.Hashable,builtins.list[pandas._typing.HashableT]]" -typing.Hashable"typing.Hashable -'builtins.list[pandas._typing.HashableT]Q -pandas._typing.HashableT" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.list 0:typing.overloadX - reset_index'pandas.core.frame.DataFrame.reset_index"q -'Union[pandas.core.frame.DataFrame,None]: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame -None*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -level -NUnion[TypeAlias[Union[typing.Hashable,builtins.int]],typing.Sequence[Unknown]] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level- -typing.Sequence[Unknown]"typing.Sequence ** -drop - builtins.bool" builtins.bool *V -inplaceG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None *q - col_level` - Union[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str *2 -col_fill" -typing.Hashable"typing.Hashable *6 -allow_duplicates - builtins.bool" builtins.bool * -names ->Union[typing.Hashable,builtins.list[pandas._typing.HashableT]]" -typing.Hashable"typing.Hashable -'builtins.list[pandas._typing.HashableT]Q -pandas._typing.HashableT" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.list 0:typing.overloadX2` -dropna"pandas.core.frame.DataFrame.dropna -dropna"pandas.core.frame.DataFrame.dropna" -None*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -how -2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str *R -threshD -Union[builtins.int,None] - builtins.int" builtins.int -None * -subset -Union[TypeAlias[Union[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],None] -TypeAlias[Union[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]] -uUnion[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]0 -typing.Sequence[Any] -Any"typing.Sequence9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarrayD -pandas.core.series.Series[Any] -Any"pandas.core.series.SeriesN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"pandas._typing.ListLikeU -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar -None *G -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool0:typing.overloadX -dropna"pandas.core.frame.DataFrame.dropna": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -how -2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str *R -threshD -Union[builtins.int,None] - builtins.int" builtins.int -None * -subset -Union[TypeAlias[Union[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],None] -TypeAlias[Union[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]] -uUnion[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]0 -typing.Sequence[Any] -Any"typing.Sequence9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarrayD -pandas.core.series.Series[Any] -Any"pandas.core.series.SeriesN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"pandas._typing.ListLikeU -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar -None *I -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool 0:typing.overloadX -dropna"pandas.core.frame.DataFrame.dropna"q -'Union[pandas.core.frame.DataFrame,None]: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame -None*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -how -2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str *R -threshD -Union[builtins.int,None] - builtins.int" builtins.int -None * -subset -Union[TypeAlias[Union[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],None] -TypeAlias[Union[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]] -uUnion[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]0 -typing.Sequence[Any] -Any"typing.Sequence9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarrayD -pandas.core.series.Series[Any] -Any"pandas.core.series.SeriesN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"pandas._typing.ListLikeU -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar -None *V -inplaceG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None 0:typing.overloadX2: - sort_values'pandas.core.frame.DataFrame.sort_values - sort_values'pandas.core.frame.DataFrame.sort_values" -None*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -by -1Union[builtins.str,typing.Sequence[builtins.str]] - builtins.str" builtins.strN -typing.Sequence[builtins.str] - builtins.str" builtins.str"typing.Sequence* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * - ascending -3Union[builtins.bool,typing.Sequence[builtins.bool]] - builtins.bool" builtins.boolQ -typing.Sequence[builtins.bool] - builtins.bool" builtins.bool"typing.Sequence * -kind -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -8527,56 +6478,15 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.SortKind * - na_position -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.NaPosition *2 - ignore_index - builtins.bool" builtins.bool *G -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool* -key -+Union[CallableType[builtins.function],None]K -CallableType[builtins.function]& -builtins.function"builtins.function -None 0:typing.overloadX - sort_values'pandas.core.frame.DataFrame.sort_values": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -by -1Union[builtins.str,typing.Sequence[builtins.str]] - builtins.str" builtins.strN -typing.Sequence[builtins.str] - builtins.str" builtins.str"typing.Sequence* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * - ascending -3Union[builtins.bool,typing.Sequence[builtins.bool]] - builtins.bool" builtins.boolQ -typing.Sequence[builtins.bool] - builtins.bool" builtins.bool"typing.Sequence * -kind -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -8584,62 +6494,19 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.SortKind * - na_position -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.NaPosition *2 - ignore_index - builtins.bool" builtins.bool *I -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool * -key -+Union[CallableType[builtins.function],None]K -CallableType[builtins.function]& -builtins.function"builtins.function -None 0:typing.overloadX - sort_values'pandas.core.frame.DataFrame.sort_values"q -'Union[pandas.core.frame.DataFrame,None]: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame -None*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -by -1Union[builtins.str,typing.Sequence[builtins.str]] - builtins.str" builtins.strN -typing.Sequence[builtins.str] - builtins.str" builtins.str"typing.Sequence* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimedeltaDtypeArg& +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * - ascending -3Union[builtins.bool,typing.Sequence[builtins.bool]] - builtins.bool" builtins.boolQ -typing.Sequence[builtins.bool] - builtins.bool" builtins.bool"typing.Sequence *V -inplaceG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None * -kind -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -8647,58 +6514,15 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.SortKind * - na_position -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.NaPosition *2 - ignore_index - builtins.bool" builtins.bool * -key -+Union[CallableType[builtins.function],None]K -CallableType[builtins.function]& -builtins.function"builtins.function -None 0:typing.overloadX2A - -sort_index&pandas.core.frame.DataFrame.sort_index - -sort_index&pandas.core.frame.DataFrame.sort_index" -None*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None * - ascending -3Union[builtins.bool,typing.Sequence[builtins.bool]] - builtins.bool" builtins.boolQ -typing.Sequence[builtins.bool] - builtins.bool" builtins.bool"typing.Sequence * -kind -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -8706,65 +6530,15 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.SortKind * - na_position -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.NaPosition *4 -sort_remaining - builtins.bool" builtins.bool *2 - ignore_index - builtins.bool" builtins.bool *G -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool* -key -+Union[CallableType[builtins.function],None]K -CallableType[builtins.function]& -builtins.function"builtins.function -None 0:typing.overloadX - -sort_index&pandas.core.frame.DataFrame.sort_index": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -level -rUnion[TypeAlias[Union[typing.Hashable,builtins.int]],builtins.list[builtins.int],builtins.list[builtins.str],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.LevelJ -builtins.list[builtins.int] - builtins.int" builtins.int" builtins.listJ -builtins.list[builtins.str] - builtins.str" builtins.str" builtins.list -None * - ascending -3Union[builtins.bool,typing.Sequence[builtins.bool]] - builtins.bool" builtins.boolQ -typing.Sequence[builtins.bool] - builtins.bool" builtins.bool"typing.Sequence * -kind -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -8772,71 +6546,15 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.SortKind * - na_position -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.NaPosition *4 -sort_remaining - builtins.bool" builtins.bool *2 - ignore_index - builtins.bool" builtins.bool *I -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool * -key -+Union[CallableType[builtins.function],None]K -CallableType[builtins.function]& -builtins.function"builtins.function -None 0:typing.overloadX - -sort_index&pandas.core.frame.DataFrame.sort_index"q -'Union[pandas.core.frame.DataFrame,None]: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame -None*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -level -rUnion[TypeAlias[Union[typing.Hashable,builtins.int]],builtins.list[builtins.int],builtins.list[builtins.str],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.LevelJ -builtins.list[builtins.int] - builtins.int" builtins.int" builtins.listJ -builtins.list[builtins.str] - builtins.str" builtins.str" builtins.list -None * - ascending -3Union[builtins.bool,typing.Sequence[builtins.bool]] - builtins.bool" builtins.boolQ -typing.Sequence[builtins.bool] - builtins.bool" builtins.bool"typing.Sequence *V -inplaceG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None * -kind -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -8844,1227 +6562,317 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.SortKind * - na_position -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.NaPosition *4 -sort_remaining - builtins.bool" builtins.bool *2 - ignore_index - builtins.bool" builtins.bool * -key -+Union[CallableType[builtins.function],None]K -CallableType[builtins.function]& -builtins.function"builtins.function -None 0:typing.overloadX2 -groupby#pandas.core.frame.DataFrame.groupby) -groupby#pandas.core.frame.DataFrame.groupby" -pandas.core.groupby.generic.DataFrameGroupBy[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]]] -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar",pandas.core.groupby.generic.DataFrameGroupBy*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -by -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *. -as_index - builtins.bool" builtins.bool ** -sort - builtins.bool" builtins.bool *0 - -group_keys - builtins.bool" builtins.bool *- -squeeze - builtins.bool" builtins.bool *. -observed - builtins.bool" builtins.bool *, -dropna - builtins.bool" builtins.bool 0:typing.overloadX -groupby#pandas.core.frame.DataFrame.groupby" -Vpandas.core.groupby.generic.DataFrameGroupBy[pandas._libs.tslibs.timestamps.Timestamp]T -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp",pandas.core.groupby.generic.DataFrameGroupBy*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*b -byZ -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *. -as_index - builtins.bool" builtins.bool ** -sort - builtins.bool" builtins.bool *0 - -group_keys - builtins.bool" builtins.bool *- -squeeze - builtins.bool" builtins.bool *. -observed - builtins.bool" builtins.bool *, -dropna - builtins.bool" builtins.bool 0:typing.overloadX -groupby#pandas.core.frame.DataFrame.groupby" -Vpandas.core.groupby.generic.DataFrameGroupBy[pandas._libs.tslibs.timedeltas.Timedelta]T -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta",pandas.core.groupby.generic.DataFrameGroupBy*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*f -by^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *. -as_index - builtins.bool" builtins.bool ** -sort - builtins.bool" builtins.bool *0 - -group_keys - builtins.bool" builtins.bool *- -squeeze - builtins.bool" builtins.bool *. -observed - builtins.bool" builtins.bool *, -dropna - builtins.bool" builtins.bool 0:typing.overloadX -groupby#pandas.core.frame.DataFrame.groupby" -Opandas.core.groupby.generic.DataFrameGroupBy[pandas._libs.tslibs.period.Period]F -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period",pandas.core.groupby.generic.DataFrameGroupBy*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*X -byP -&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *. -as_index - builtins.bool" builtins.bool ** -sort - builtins.bool" builtins.bool *0 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimestampDtypeArg +RTypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]] +GUnion[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]X +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.CategoryDtypeArg +gTypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]] +\Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]C +Type[builtins.object]" +builtins.object"builtins.object"type7 +Literal[builtins.str]  + builtins.str" builtins.str= +Type[numpy.object_] + numpy.object_" numpy.object_"type7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ObjectDtypeArg +dTypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +YUnion[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]4 +Type[numpy.void] -group_keys - builtins.bool" builtins.bool *- -squeeze - builtins.bool" builtins.bool *. -observed - builtins.bool" builtins.bool *, -dropna - builtins.bool" builtins.bool 0:typing.overloadX -groupby#pandas.core.frame.DataFrame.groupby" -Fpandas.core.groupby.generic.DataFrameGroupBy[pandas._typing.IntervalT] -pandas._typing.IntervalTN -#pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval",pandas.core.groupby.generic.DataFrameGroupBy*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -by -Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] -pandas._typing.IntervalTN -#pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +numpy.void" +numpy.void"type7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *. -as_index - builtins.bool" builtins.bool ** -sort - builtins.bool" builtins.bool *0 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.VoidDtypeArg +STypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]] +HUnion[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]I +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtypeP +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype"pandas._typing.DtypeObj"pandas._typing.AstypeArg +None * -group_keys - builtins.bool" builtins.bool *- -squeeze - builtins.bool" builtins.bool *. -observed - builtins.bool" builtins.bool *, -dropna - builtins.bool" builtins.bool 0:typing.overloadX& -groupby#pandas.core.frame.DataFrame.groupby" -Apandas.core.groupby.generic.DataFrameGroupBy[builtins.tuple[Any]]. -builtins.tuple[Any] -Any"builtins.tuple",pandas.core.groupby.generic.DataFrameGroupBy*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -by -Union[pandas.core.indexes.multi.MultiIndex,TypeAlias[Union[builtins.tuple[Any],builtins.list[pandas._typing._HashableTa],TypeAlias[Union[numpy.ufunc,CallableType[builtins.function]]],builtins.list[Unknown],builtins.list[pandas.core.series.Series[Any]],numpy.ndarray[Any,Any],builtins.list[numpy.ndarray[Any,Any]],typing.Mapping[TypeAlias[Union[typing.Hashable,None]],Any],builtins.list[typing.Mapping[Unknown,Any]],builtins.list[pandas.core.indexes.base.Index[Any]],pandas.core.groupby.grouper.Grouper,builtins.list[pandas.core.groupby.grouper.Grouper]]],None]L -$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex -TypeAlias[Union[builtins.tuple[Any],builtins.list[pandas._typing._HashableTa],TypeAlias[Union[numpy.ufunc,CallableType[builtins.function]]],builtins.list[Unknown],builtins.list[pandas.core.series.Series[Any]],numpy.ndarray[Any,Any],builtins.list[numpy.ndarray[Any,Any]],typing.Mapping[TypeAlias[Union[typing.Hashable,None]],Any],builtins.list[typing.Mapping[Unknown,Any]],builtins.list[pandas.core.indexes.base.Index[Any]],pandas.core.groupby.grouper.Grouper,builtins.list[pandas.core.groupby.grouper.Grouper]]] -Union[builtins.tuple[Any],builtins.list[pandas._typing._HashableTa],TypeAlias[Union[numpy.ufunc,CallableType[builtins.function]]],builtins.list[Unknown],builtins.list[pandas.core.series.Series[Any]],numpy.ndarray[Any,Any],builtins.list[numpy.ndarray[Any,Any]],typing.Mapping[TypeAlias[Union[typing.Hashable,None]],Any],builtins.list[typing.Mapping[Unknown,Any]],builtins.list[pandas.core.indexes.base.Index[Any]],pandas.core.groupby.grouper.Grouper,builtins.list[pandas.core.groupby.grouper.Grouper]]. -builtins.tuple[Any] -Any"builtins.tuple -)builtins.list[pandas._typing._HashableTa]S -pandas._typing._HashableTa" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.list -=TypeAlias[Union[numpy.ufunc,CallableType[builtins.function]]] -2Union[numpy.ufunc,CallableType[builtins.function]] - numpy.ufunc" numpy.ufuncK -CallableType[builtins.function]& -builtins.function"builtins.function"pandas._typing.Function) -builtins.list[Unknown]" builtins.list --builtins.list[pandas.core.series.Series[Any]]D +columns + +Union[TypeAlias[Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]]],None] +TypeAlias[Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]]] +Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]] +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.IndexD pandas.core.series.Series[Any] -Any"pandas.core.series.Series" builtins.list9 +Any"pandas.core.series.Series9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarrayq -%builtins.list[numpy.ndarray[Any,Any]]9 -numpy.ndarray[Any,Any] +Any" numpy.ndarray"pandas._typing.AnyArrayLike, +builtins.list[Any] +Any" builtins.list9 +builtins.dict[Any,Any] Any -Any" numpy.ndarray" builtins.list -:typing.Mapping[TypeAlias[Union[typing.Hashable,None]],Any] -&TypeAlias[Union[typing.Hashable,None]]M -Union[typing.Hashable,None]" -typing.Hashable"typing.Hashable -None"pandas._typing.Label -Any"typing.Mappingu -*builtins.list[typing.Mapping[Unknown,Any]]8 -typing.Mapping[Unknown,Any] -Any"typing.Mapping" builtins.list -2builtins.list[pandas.core.indexes.base.Index[Any]]N -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index" builtins.listJ -#pandas.core.groupby.grouper.Grouper"#pandas.core.groupby.grouper.Grouper -2builtins.list[pandas.core.groupby.grouper.Grouper]J -#pandas.core.groupby.grouper.Grouper"#pandas.core.groupby.grouper.Grouper" builtins.list"%pandas._typing.GroupByObjectNonScalar -None * -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +Any" builtins.dict +builtins.range"builtins.range. +builtins.tuple[Any] +Any"builtins.tuple"pandas._typing.Axes +None 0:typing.overload:builtins.classmethodXp + from_dict%pandas.core.frame.DataFrame.from_dict": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*p +clsg +!Type[pandas.core.frame.DataFrame]: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame"type*C +data9 +builtins.dict[Any,Any] +Any +Any" builtins.dict* +orient +2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str * +dtype +4Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],None] +4TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]] +4Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]] +TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]= +Type[builtins.bool] + builtins.bool" builtins.bool"type7 +Literal[builtins.str]  + builtins.str" builtins.strR +'pandas.core.arrays.boolean.BooleanDtype"'pandas.core.arrays.boolean.BooleanDtype7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *. -as_index - builtins.bool" builtins.bool ** -sort - builtins.bool" builtins.bool *0 - -group_keys - builtins.bool" builtins.bool *- -squeeze - builtins.bool" builtins.bool *. -observed - builtins.bool" builtins.bool *, -dropna - builtins.bool" builtins.bool 0:typing.overloadX! -groupby#pandas.core.frame.DataFrame.groupby" -Fpandas.core.groupby.generic.DataFrameGroupBy[pandas._typing.SeriesByT] - -pandas._typing.SeriesByT -Union[builtins.str,builtins.bytes,datetime.date,builtins.bool,builtins.int,builtins.float,builtins.complex,datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]]] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.Interval",pandas.core.groupby.generic.DataFrameGroupBy*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* - -by - -3pandas.core.series.Series[pandas._typing.SeriesByT] - -pandas._typing.SeriesByT -Union[builtins.str,builtins.bytes,datetime.date,builtins.bool,builtins.int,builtins.float,builtins.complex,datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]]] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.Interval"pandas.core.series.Series* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +Type[numpy.bool_] + numpy.bool_" numpy.bool_"type7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *. -as_index - builtins.bool" builtins.bool ** -sort - builtins.bool" builtins.bool *0 - -group_keys - builtins.bool" builtins.bool *- -squeeze - builtins.bool" builtins.bool *. -observed - builtins.bool" builtins.bool *, -dropna - builtins.bool" builtins.bool 0:typing.overloadX -groupby#pandas.core.frame.DataFrame.groupby"j -1pandas.core.groupby.generic.DataFrameGroupBy[Any] -Any",pandas.core.groupby.generic.DataFrameGroupBy*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -by -|Union[pandas.core.indexes.category.CategoricalIndex[Any],pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any]]l -2pandas.core.indexes.category.CategoricalIndex[Any] -Any"-pandas.core.indexes.category.CategoricalIndexN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.IndexD -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *. -as_index - builtins.bool" builtins.bool ** -sort - builtins.bool" builtins.bool *0 - -group_keys - builtins.bool" builtins.bool *- -squeeze - builtins.bool" builtins.bool *. -observed - builtins.bool" builtins.bool *, -dropna - builtins.bool" builtins.bool 0:typing.overloadX2 -aggpandas.core.frame.DataFrame.agg - -aggpandas.core.frame.DataFrame.agg"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -func -JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] -?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K -CallableType[builtins.function]& -builtins.function"builtins.function - builtins.str" builtins.str - numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.BooleanDtypeArg& +TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: +Type[builtins.int] + builtins.int" builtins.int"type7 +Literal[builtins.str]  + builtins.str" builtins.strL +$pandas.core.arrays.integer.Int8Dtype"$pandas.core.arrays.integer.Int8DtypeN +%pandas.core.arrays.integer.Int16Dtype"%pandas.core.arrays.integer.Int16DtypeN +%pandas.core.arrays.integer.Int32Dtype"%pandas.core.arrays.integer.Int32DtypeN +%pandas.core.arrays.integer.Int64Dtype"%pandas.core.arrays.integer.Int64Dtype7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -kwargs -Any0:typing.overloadX -aggpandas.core.frame.DataFrame.agg": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -func -Union[builtins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]],TypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]]] -Ybuiltins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]] -JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] -?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K -CallableType[builtins.function]& -builtins.function"builtins.function - builtins.str" builtins.str - numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase" builtins.list -YTypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]] -Ntyping.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]Q -pandas._typing.HashableT" -typing.Hashable"typing.Hashable"typing.HashableV -%Union[Unknown,builtins.list[Unknown]]) -builtins.list[Unknown]" builtins.list"typing.Mapping"#pandas._typing.AggFuncTypeDictFrame * -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str +)Type[numpy.signedinteger[TypeAlias[Any]]]v +#numpy.signedinteger[TypeAlias[Any]]: +TypeAlias[Any] +Any"numpy._typing._nbit._NBitByte"numpy.signedinteger"type7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -kwargs -Any0:typing.overloadX2 - aggregate%pandas.core.frame.DataFrame.aggregate - aggregate%pandas.core.frame.DataFrame.aggregate"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -func -JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] -?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K -CallableType[builtins.function]& -builtins.function"builtins.function - builtins.str" builtins.str - numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -kwargs -Any0:typing.overloadX - aggregate%pandas.core.frame.DataFrame.aggregate": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -func -Union[builtins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]],TypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]]] -Ybuiltins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]] -JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] -?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K -CallableType[builtins.function]& -builtins.function"builtins.function - builtins.str" builtins.str - numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase" builtins.list -YTypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]] -Ntyping.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]Q -pandas._typing.HashableT" -typing.Hashable"typing.Hashable"typing.HashableV -%Union[Unknown,builtins.list[Unknown]]) -builtins.list[Unknown]" builtins.list"typing.Mapping"#pandas._typing.AggFuncTypeDictFrame* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -kwargs -Any0:typing.overloadX2 -apply!pandas.core.frame.DataFrame.apply -apply!pandas.core.frame.DataFrame.apply": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R -fK -CallableType[builtins.function]& -builtins.function"builtins.function* -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *) -raw - builtins.bool" builtins.bool * - result_type -None * -args -Any * -kwargs -Any0:typing.overloadX -apply!pandas.core.frame.DataFrame.apply" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R -fK -CallableType[builtins.function]& -builtins.function"builtins.function* -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *) -raw - builtins.bool" builtins.bool * - result_type -None * -args -Any * -kwargs -Any0:typing.overloadX -apply!pandas.core.frame.DataFrame.apply"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R -fK -CallableType[builtins.function]& -builtins.function"builtins.function* -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *) -raw - builtins.bool" builtins.bool * - result_type -None * -args -Any * -kwargs -Any0:typing.overloadX! -apply!pandas.core.frame.DataFrame.apply" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R -fK -CallableType[builtins.function]& -builtins.function"builtins.function* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *) -raw - builtins.bool" builtins.bool * -args -Any * - result_type -2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str* -kwargs -Any0:typing.overloadX - -apply!pandas.core.frame.DataFrame.apply": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R -fK -CallableType[builtins.function]& -builtins.function"builtins.function* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *) -raw - builtins.bool" builtins.bool * -args -Any *H - result_type7 Literal[builtins.str]  - builtins.str" builtins.str* -kwargs -Any0:typing.overloadX - -apply!pandas.core.frame.DataFrame.apply"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R -fK -CallableType[builtins.function]& -builtins.function"builtins.function* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *) -raw - builtins.bool" builtins.bool * -args -Any *H - result_type7 Literal[builtins.str]  - builtins.str" builtins.str* -kwargs -Any0:typing.overloadX - -apply!pandas.core.frame.DataFrame.apply": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R -fK -CallableType[builtins.function]& -builtins.function"builtins.function* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *) -raw - builtins.bool" builtins.bool * -args -Any *H - result_type7 Literal[builtins.str]  - builtins.str" builtins.str* -kwargs -Any0:typing.overloadX -apply!pandas.core.frame.DataFrame.apply"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R -fK -CallableType[builtins.function]& -builtins.function"builtins.function* -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str"pandas._typing.IntDtypeArg$ +TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]N +%pandas.core.arrays.integer.UInt8Dtype"%pandas.core.arrays.integer.UInt8DtypeP +&pandas.core.arrays.integer.UInt16Dtype"&pandas.core.arrays.integer.UInt16DtypeP +&pandas.core.arrays.integer.UInt32Dtype"&pandas.core.arrays.integer.UInt32DtypeP +&pandas.core.arrays.integer.UInt64Dtype"&pandas.core.arrays.integer.UInt64Dtype7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *) -raw - builtins.bool" builtins.bool * -args -Any *H - result_type7 Literal[builtins.str]  - builtins.str" builtins.str* -kwargs -Any0:typing.overloadX -apply!pandas.core.frame.DataFrame.apply" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R -fK -CallableType[builtins.function]& -builtins.function"builtins.function*) -raw - builtins.bool" builtins.bool * - result_type -None * -args -Any * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn* -kwargs -Any0:typing.overloadX -apply!pandas.core.frame.DataFrame.apply"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R -fK -CallableType[builtins.function]& -builtins.function"builtins.function*) -raw - builtins.bool" builtins.bool * - result_type -None * -args -Any * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn* -kwargs -Any0:typing.overloadX -apply!pandas.core.frame.DataFrame.apply": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R -fK -CallableType[builtins.function]& -builtins.function"builtins.function*) -raw - builtins.bool" builtins.bool * - result_type -None * -args -Any * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn* -kwargs -Any0:typing.overloadX -apply!pandas.core.frame.DataFrame.apply": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R -fK -CallableType[builtins.function]& -builtins.function"builtins.function*) -raw - builtins.bool" builtins.bool * -args -Any * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn*H - result_type7 Literal[builtins.str]  - builtins.str" builtins.str* -kwargs -Any0:typing.overloadX2 -count!pandas.core.frame.DataFrame.count - -count!pandas.core.frame.DataFrame.count": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *2 - numeric_only - builtins.bool" builtins.bool * -level -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level0:typing.overloadX -count!pandas.core.frame.DataFrame.count"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -level -None *2 - numeric_only - builtins.bool" builtins.bool 0:typing.overloadX2 -mode pandas.core.frame.DataFrame.mode - -mode pandas.core.frame.DataFrame.mode": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *, -skipna - builtins.bool" builtins.bool *2 - numeric_only - builtins.bool" builtins.bool * -level -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level* -kwargs -Any0:typing.overloadX -mode pandas.core.frame.DataFrame.mode"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *, -skipna - builtins.bool" builtins.bool * -level -None *2 - numeric_only - builtins.bool" builtins.bool * -kwargs -Any0:typing.overloadX2! -quantile$pandas.core.frame.DataFrame.quantile -quantile$pandas.core.frame.DataFrame.quantile"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*) -q -builtins.float"builtins.float * -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *2 - numeric_only - builtins.bool" builtins.bool * - interpolation -TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -tUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"$pandas._typing.QuantileInterpolation * -method -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.CalculationMethod 0:typing.overloadX -quantile$pandas.core.frame.DataFrame.quantile": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -q -;Union[builtins.list[builtins.float],numpy.ndarray[Any,Any]]P -builtins.list[builtins.float] -builtins.float"builtins.float" builtins.list9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str"pandas._typing.UIntDtypeArg +TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: +Type[builtins.str] + builtins.str" builtins.str"type7 +Literal[builtins.str]  + builtins.str" builtins.strP +&pandas.core.arrays.string_.StringDtype"&pandas.core.arrays.string_.StringDtype7 +Literal[builtins.str]  + builtins.str" builtins.str4 +Type[numpy.str_] + +numpy.str_" +numpy.str_"type7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *2 - numeric_only - builtins.bool" builtins.bool * - interpolation -TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -tUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -10072,289 +6880,75 @@ tUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.StrDtypeArg +TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ +Type[builtins.bytes] +builtins.bytes"builtins.bytes"type7 +Literal[builtins.str]  + builtins.str" builtins.str: +Type[numpy.bytes_] + numpy.bytes_" numpy.bytes_"type7 +Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"$pandas._typing.QuantileInterpolation * -method -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.CalculationMethod 0:typing.overloadX2 - -columns#pandas.core.frame.DataFrame.columns -columns#pandas.core.frame.DataFrame.columns"l -,pandas.core.indexes.base.Index[builtins.str] - builtins.str" builtins.str"pandas.core.indexes.base.Index*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame0:builtins.propertyX` -columns#pandas.core.frame.DataFrame.columns" -None*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -cols -Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[pandas._typing.HashableT],builtins.tuple[pandas._typing.HashableT]] -kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] -`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.IndexD -pandas.core.series.Series[Any] -Any"pandas.core.series.Series9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.AnyArrayLike -'builtins.list[pandas._typing.HashableT]Q -pandas._typing.HashableT" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.list -(builtins.tuple[pandas._typing.HashableT]Q -pandas._typing.HashableT" -typing.Hashable"typing.Hashable"typing.Hashable"builtins.tuple0:.setter2 -index!pandas.core.frame.DataFrame.index -index!pandas.core.frame.DataFrame.index"N -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame0:builtins.propertyX` -index!pandas.core.frame.DataFrame.index" -None*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*W -idxN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index0:.setter2 -allpandas.core.frame.DataFrame.all -allpandas.core.frame.DataFrame.all" - builtins.bool" builtins.bool*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -axis -None*X - bool_onlyG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None *, -skipna - builtins.bool" builtins.bool * -kwargs -Any0:typing.overloadX -allpandas.core.frame.DataFrame.all"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.BytesDtypeArg +TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ +Type[builtins.float] +builtins.float"builtins.float"type7 +Literal[builtins.str]  + builtins.str" builtins.strT +(pandas.core.arrays.floating.Float32Dtype"(pandas.core.arrays.floating.Float32DtypeT +(pandas.core.arrays.floating.Float64Dtype"(pandas.core.arrays.floating.Float64Dtype7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *X - bool_onlyG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None *, -skipna - builtins.bool" builtins.bool * -kwargs -Any0:typing.overloadX2 -anypandas.core.frame.DataFrame.any -anypandas.core.frame.DataFrame.any" - builtins.bool" builtins.bool*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -axis -None*X - bool_onlyG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None *, -skipna - builtins.bool" builtins.bool * -kwargs -Any0:typing.overloadX -anypandas.core.frame.DataFrame.any"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *X - bool_onlyG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None *, -skipna - builtins.bool" builtins.bool * -kwargs -Any0:typing.overloadX2 -bfill!pandas.core.frame.DataFrame.bfill -bfill!pandas.core.frame.DataFrame.bfill" -None*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -axis -Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis -None *G -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool*Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None *{ -downcastk -"Union[builtins.dict[Any,Any],None]9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -None 0:typing.overloadX -bfill!pandas.core.frame.DataFrame.bfill": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -axis -Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis -None *I -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool *Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None *{ -downcastk -"Union[builtins.dict[Any,Any],None]9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -None 0:typing.overloadX2 -ffill!pandas.core.frame.DataFrame.ffill -ffill!pandas.core.frame.DataFrame.ffill" -None*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -axis -Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis -None *G -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool*Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None *{ -downcastk -"Union[builtins.dict[Any,Any],None]9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -None 0:typing.overloadX -ffill!pandas.core.frame.DataFrame.ffill": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -axis -Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis -None *I -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool *Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None *{ -downcastk -"Union[builtins.dict[Any,Any],None]9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -None 0:typing.overloadX2X - interpolate'pandas.core.frame.DataFrame.interpolate - interpolate'pandas.core.frame.DataFrame.interpolate" -None*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -method -TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -10372,6 +6966,16 @@ kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[A Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.FloatDtypeArg +TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]F +Type[builtins.complex]$ +builtins.complex"builtins.complex"type7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 @@ -10380,6 +6984,10 @@ kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[A Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 @@ -10390,59 +6998,29 @@ kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[A Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"!pandas._typing.InterpolateOptions * -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None * -limit_direction -HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str * - -limit_area -7Union[Literal[builtins.str],Literal[builtins.str],None]7 + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ComplexDtypeArg$ +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str -None *x -downcasth -!Union[Literal[builtins.str],None]7 + builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str -None *G -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool* -kwargs -Any0:typing.overloadX - interpolate'pandas.core.frame.DataFrame.interpolate": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -method -TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -10478,61 +7056,23 @@ limit_area Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"!pandas._typing.InterpolateOptions * -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None * -limit_direction -HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str * - -limit_area -7Union[Literal[builtins.str],Literal[builtins.str],None]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str -None *x -downcasth -!Union[Literal[builtins.str],None]7 + builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str -None *I -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool * -kwargs -Any0:typing.overloadX - interpolate'pandas.core.frame.DataFrame.interpolate"q -'Union[pandas.core.frame.DataFrame,None]: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame -None*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -method -TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -10566,226 +7106,41 @@ limit_area Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimedeltaDtypeArg& +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"!pandas._typing.InterpolateOptions * -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None *V -inplaceG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None * -limit_direction -HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str * - -limit_area -7Union[Literal[builtins.str],Literal[builtins.str],None]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str -None *x -downcasth -!Union[Literal[builtins.str],None]7 + builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str -None * -kwargs -Any0:typing.overloadX2, - rename_axis'pandas.core.frame.DataFrame.rename_axis - - rename_axis'pandas.core.frame.DataFrame.rename_axis" -None*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -mapper -Any * -axis -Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis -None ** -copy - builtins.bool" builtins.bool *G -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool0:typing.overloadX - - rename_axis'pandas.core.frame.DataFrame.rename_axis": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -mapper -Any * -axis -Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis -None ** -copy - builtins.bool" builtins.bool *I -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool 0:typing.overloadX - rename_axis'pandas.core.frame.DataFrame.rename_axis" -None*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -index -Union[builtins.str,typing.Sequence[builtins.str],builtins.dict[Union[builtins.str,builtins.int],builtins.str],CallableType[builtins.function],None] - builtins.str" builtins.strN -typing.Sequence[builtins.str] - builtins.str" builtins.str"typing.Sequence -pandas.core.window.rolling.Window[pandas.core.frame.DataFrame]: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame"!pandas.core.window.rolling.Window*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -window -{Union[builtins.int,builtins.str,datetime.timedelta,pandas._libs.tslibs.offsets.BaseOffset,pandas.core.indexers.BaseIndexer] - builtins.int" builtins.int - builtins.str" builtins.str( -datetime.timedelta"datetime.timedeltaP -&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffsetD - pandas.core.indexers.BaseIndexer" pandas.core.indexers.BaseIndexer*W - min_periodsD -Union[builtins.int,None] - builtins.int" builtins.int -None *, -center - builtins.bool" builtins.bool *W -onM -Union[typing.Hashable,None]" -typing.Hashable"typing.Hashable -None * -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -closed -uUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -10793,62 +7148,15 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"!pandas._typing.IntervalClosedType -None *P -stepD -Union[builtins.int,None] - builtins.int" builtins.int -None * -method -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.CalculationMethod ** -win_type - builtins.str" builtins.str0:typing.overloadX -rolling#pandas.core.frame.DataFrame.rolling" -?pandas.core.window.rolling.Rolling[pandas.core.frame.DataFrame]: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame""pandas.core.window.rolling.Rolling*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -window -{Union[builtins.int,builtins.str,datetime.timedelta,pandas._libs.tslibs.offsets.BaseOffset,pandas.core.indexers.BaseIndexer] - builtins.int" builtins.int - builtins.str" builtins.str( -datetime.timedelta"datetime.timedeltaP -&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffsetD - pandas.core.indexers.BaseIndexer" pandas.core.indexers.BaseIndexer*W - min_periodsD -Union[builtins.int,None] - builtins.int" builtins.int -None *, -center - builtins.bool" builtins.bool *W -onM -Union[typing.Hashable,None]" -typing.Hashable"typing.Hashable -None * -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -closed -uUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -10856,71 +7164,19 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"!pandas._typing.IntervalClosedType -None *P -stepD -Union[builtins.int,None] - builtins.int" builtins.int -None * -method -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.CalculationMethod * -win_type -None 0:typing.overloadX2[ -to_json#pandas.core.frame.DataFrame.to_json -to_json#pandas.core.frame.DataFrame.to_json" -None*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* - path_or_buf -hUnion[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.WriteBuffer[builtins.str]] -8TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]] --Union[builtins.str,os.PathLike[builtins.str]] - builtins.str" builtins.strF -os.PathLike[builtins.str] - builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathd -(pandas._typing.WriteBuffer[builtins.str] - builtins.str" builtins.str"pandas._typing.WriteBuffer*C -orient7 -Literal[builtins.str]  - builtins.str" builtins.str* - date_format -7Union[Literal[builtins.str],Literal[builtins.str],None]7 -Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str -None *4 -double_precision - builtins.int" builtins.int *1 - force_ascii - builtins.bool" builtins.bool * - date_unit -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str * -default_handler -+Union[CallableType[builtins.function],None]K -CallableType[builtins.function]& -builtins.function"builtins.function -None *E -lines: -Literal[builtins.bool]  - builtins.bool" builtins.bool* - compression -TypeAlias[Union[None,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],TypeAlias[builtins.dict[builtins.str,Any]]]] -Union[None,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],TypeAlias[builtins.dict[builtins.str,Any]]] -None7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -10932,42 +7188,15 @@ hUnion[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.W Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str -*TypeAlias[builtins.dict[builtins.str,Any]]W -builtins.dict[builtins.str,Any] - builtins.str" builtins.str -Any" builtins.dict"pandas._typing.CompressionDict"!pandas._typing.CompressionOptions *+ -index - builtins.bool" builtins.bool *R -indentD -Union[builtins.int,None] - builtins.int" builtins.int -None *A -mode7 + builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str0:typing.overloadX -to_json#pandas.core.frame.DataFrame.to_json" - builtins.str" builtins.str*D -self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* - path_or_buf -None *C -orient7 + builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str* - date_format -7Union[Literal[builtins.str],Literal[builtins.str],None]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str -None *4 -double_precision - builtins.int" builtins.int *1 - force_ascii - builtins.bool" builtins.bool * - date_unit -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -10975,58 +7204,89 @@ hUnion[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.W Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str * -default_handler -+Union[CallableType[builtins.function],None]K -CallableType[builtins.function]& -builtins.function"builtins.function -None *E -lines: -Literal[builtins.bool]  - builtins.bool" builtins.bool* - compression -TypeAlias[Union[None,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],TypeAlias[builtins.dict[builtins.str,Any]]]] -Union[None,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],TypeAlias[builtins.dict[builtins.str,Any]]] -None7 + builtins.str" builtins.str" pandas._typing.TimestampDtypeArg +RTypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]] +GUnion[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]X +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype7 Literal[builtins.str]  - builtins.str" builtins.str7 + builtins.str" builtins.str"pandas._typing.CategoryDtypeArg +gTypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]] +\Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]C +Type[builtins.object]" +builtins.object"builtins.object"type7 Literal[builtins.str]  - builtins.str" builtins.str7 + builtins.str" builtins.str= +Type[numpy.object_] + numpy.object_" numpy.object_"type7 Literal[builtins.str]  - builtins.str" builtins.str7 + builtins.str" builtins.str"pandas._typing.ObjectDtypeArg +dTypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +YUnion[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]4 +Type[numpy.void] + +numpy.void" +numpy.void"type7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str -*TypeAlias[builtins.dict[builtins.str,Any]]W -builtins.dict[builtins.str,Any] - builtins.str" builtins.str -Any" builtins.dict"pandas._typing.CompressionDict"!pandas._typing.CompressionOptions *+ -index - builtins.bool" builtins.bool *R -indentD -Union[builtins.int,None] - builtins.int" builtins.int -None *A -mode7 -Literal[builtins.str]  - builtins.str" builtins.str0:typing.overloadX -to_json#pandas.core.frame.DataFrame.to_json" - builtins.str" builtins.str*D + builtins.str" builtins.str"pandas._typing.VoidDtypeArg +STypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]] +HUnion[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]I +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtypeP +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype"pandas._typing.DtypeObj"pandas._typing.AstypeArg +None 0:typing.overload:builtins.classmethodXp20 +to_dict#pandas.core.frame.DataFrame.to_dict +to_dict#pandas.core.frame.DataFrame.to_dict" +9builtins.list[typing.MutableMapping[typing.Hashable,Any]]p +*typing.MutableMapping[typing.Hashable,Any]" +typing.Hashable"typing.Hashable +Any"typing.MutableMapping" builtins.list*D self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* - path_or_buf -None * -orient -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] -TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*C +orient7 Literal[builtins.str]  - builtins.str" builtins.str7 + builtins.str" builtins.str* +into +JUnion[typing.MutableMapping[Any,Any],Type[typing.MutableMapping[Any,Any]]]I +typing.MutableMapping[Any,Any] +Any +Any"typing.MutableMappingy +$Type[typing.MutableMapping[Any,Any]]I +typing.MutableMapping[Any,Any] +Any +Any"typing.MutableMapping"type*G +index: +Literal[builtins.bool]  + builtins.bool" builtins.bool 0:typing.overloadX +to_dict#pandas.core.frame.DataFrame.to_dict" +1builtins.list[builtins.dict[typing.Hashable,Any]]` +"builtins.dict[typing.Hashable,Any]" +typing.Hashable"typing.Hashable +Any" builtins.dict" builtins.list*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*C +orient7 Literal[builtins.str]  - builtins.str" builtins.str7 + builtins.str" builtins.str*m +intoa +Type[builtins.dict[Any,Any]]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict"type *G +index: +Literal[builtins.bool]  + builtins.bool" builtins.bool 0:typing.overloadX +to_dict#pandas.core.frame.DataFrame.to_dict"p +*typing.MutableMapping[typing.Hashable,Any]" +typing.Hashable"typing.Hashable +Any"typing.MutableMapping*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +orient +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -11034,20 +7294,49 @@ hUnion[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.W Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.JsonFrameOrient -None * - date_format -7Union[Literal[builtins.str],Literal[builtins.str],None]7 + builtins.str" builtins.str* +into +JUnion[typing.MutableMapping[Any,Any],Type[typing.MutableMapping[Any,Any]]]I +typing.MutableMapping[Any,Any] +Any +Any"typing.MutableMappingy +$Type[typing.MutableMapping[Any,Any]]I +typing.MutableMapping[Any,Any] +Any +Any"typing.MutableMapping"type*G +index: +Literal[builtins.bool]  + builtins.bool" builtins.bool 0:typing.overloadX +to_dict#pandas.core.frame.DataFrame.to_dict"p +*typing.MutableMapping[typing.Hashable,Any]" +typing.Hashable"typing.Hashable +Any"typing.MutableMapping*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +orient +2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str -None *4 -double_precision - builtins.int" builtins.int *1 - force_ascii - builtins.bool" builtins.bool * - date_unit + builtins.str" builtins.str* +into +JUnion[typing.MutableMapping[Any,Any],Type[typing.MutableMapping[Any,Any]]]I +typing.MutableMapping[Any,Any] +Any +Any"typing.MutableMappingy +$Type[typing.MutableMapping[Any,Any]]I +typing.MutableMapping[Any,Any] +Any +Any"typing.MutableMapping"type*+ +index + builtins.bool" builtins.bool 0:typing.overloadX +to_dict#pandas.core.frame.DataFrame.to_dict"p +*typing.MutableMapping[typing.Hashable,Any]" +typing.Hashable"typing.Hashable +Any"typing.MutableMapping*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +orient ^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 @@ -11056,22 +7345,50 @@ hUnion[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.W Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str * -default_handler -+Union[CallableType[builtins.function],None]K -CallableType[builtins.function]& -builtins.function"builtins.function -None *+ -lines - builtins.bool" builtins.bool * - compression -TypeAlias[Union[None,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],TypeAlias[builtins.dict[builtins.str,Any]]]] -Union[None,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],TypeAlias[builtins.dict[builtins.str,Any]]] -None7 + builtins.str" builtins.str * +into +JUnion[typing.MutableMapping[Any,Any],Type[typing.MutableMapping[Any,Any]]]I +typing.MutableMapping[Any,Any] +Any +Any"typing.MutableMappingy +$Type[typing.MutableMapping[Any,Any]]I +typing.MutableMapping[Any,Any] +Any +Any"typing.MutableMapping"type*G +index: +Literal[builtins.bool]  + builtins.bool" builtins.bool 0:typing.overloadX +to_dict#pandas.core.frame.DataFrame.to_dict"p +*typing.MutableMapping[typing.Hashable,Any]" +typing.Hashable"typing.Hashable +Any"typing.MutableMapping*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +orient +2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str7 + builtins.str" builtins.str * +into +JUnion[typing.MutableMapping[Any,Any],Type[typing.MutableMapping[Any,Any]]]I +typing.MutableMapping[Any,Any] +Any +Any"typing.MutableMappingy +$Type[typing.MutableMapping[Any,Any]]I +typing.MutableMapping[Any,Any] +Any +Any"typing.MutableMapping"type*+ +index + builtins.bool" builtins.bool 0:typing.overloadX +to_dict#pandas.core.frame.DataFrame.to_dict"` +"builtins.dict[typing.Hashable,Any]" +typing.Hashable"typing.Hashable +Any" builtins.dict*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +orient +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -11079,82 +7396,109 @@ hUnion[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.W Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str -*TypeAlias[builtins.dict[builtins.str,Any]]W -builtins.dict[builtins.str,Any] - builtins.str" builtins.str -Any" builtins.dict"pandas._typing.CompressionDict"!pandas._typing.CompressionOptions *+ -index - builtins.bool" builtins.bool *R -indentD -Union[builtins.int,None] - builtins.int" builtins.int -None *C -mode7 + builtins.str" builtins.str *m +intoa +Type[builtins.dict[Any,Any]]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict"type *G +index: +Literal[builtins.bool]  + builtins.bool" builtins.bool 0:typing.overloadX +to_dict#pandas.core.frame.DataFrame.to_dict"` +"builtins.dict[typing.Hashable,Any]" +typing.Hashable"typing.Hashable +Any" builtins.dict*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +orient +2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  - builtins.str" builtins.str 0:typing.overloadX -to_json#pandas.core.frame.DataFrame.to_json" + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str *m +intoa +Type[builtins.dict[Any,Any]]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict"type *+ +index + builtins.bool" builtins.bool 0:typing.overloadX2 + +to_parquet&pandas.core.frame.DataFrame.to_parquet + +to_parquet&pandas.core.frame.DataFrame.to_parquet" None*D self: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* - path_or_buf -hUnion[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.WriteBuffer[builtins.str]] +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +path +jUnion[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.WriteBuffer[builtins.bytes]] 8TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]] -Union[builtins.str,os.PathLike[builtins.str]] builtins.str" builtins.strF os.PathLike[builtins.str] - builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathd -(pandas._typing.WriteBuffer[builtins.str] - builtins.str" builtins.str"pandas._typing.WriteBuffer* -orient -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] -TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 + builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathj +*pandas._typing.WriteBuffer[builtins.bytes] +builtins.bytes"builtins.bytes"pandas._typing.WriteBuffer* +engine +STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str7 + builtins.str" builtins.str"pandas._typing.ParquetEngine * + compression +yUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.JsonFrameOrient -None * - date_format -7Union[Literal[builtins.str],Literal[builtins.str],None]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str -None *4 -double_precision - builtins.int" builtins.int *1 - force_ascii - builtins.bool" builtins.bool * - date_unit -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 +None *T +indexG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None * +partition_cols +3Union[builtins.list[pandas._typing.HashableT],None] +'builtins.list[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable" builtins.list +None * +storage_options +6TypeAlias[Union[builtins.dict[builtins.str,Any],None]] ++Union[builtins.dict[builtins.str,Any],None]W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict +None"pandas._typing.StorageOptions * +kwargs +Any0:typing.overloadX + +to_parquet&pandas.core.frame.DataFrame.to_parquet" +builtins.bytes"builtins.bytes*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +path +None * +engine +STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str * -default_handler -+Union[CallableType[builtins.function],None]K -CallableType[builtins.function]& -builtins.function"builtins.function -None *+ -lines - builtins.bool" builtins.bool * - compression -TypeAlias[Union[None,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],TypeAlias[builtins.dict[builtins.str,Any]]]] -Union[None,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],TypeAlias[builtins.dict[builtins.str,Any]]] -None7 + builtins.str" builtins.str"pandas._typing.ParquetEngine * + compression +yUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -11164,24 +7508,75 @@ hUnion[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.W Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str7 + builtins.str" builtins.str +None *T +indexG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None * +partition_cols +3Union[builtins.list[pandas._typing.HashableT],None] +'builtins.list[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable" builtins.list +None * +storage_options +6TypeAlias[Union[builtins.dict[builtins.str,Any],None]] ++Union[builtins.dict[builtins.str,Any],None]W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict +None"pandas._typing.StorageOptions * +kwargs +Any0:typing.overloadX2 +to_orc"pandas.core.frame.DataFrame.to_orc +to_orc"pandas.core.frame.DataFrame.to_orc" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +path +jUnion[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.WriteBuffer[builtins.bytes]] +8TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]] +-Union[builtins.str,os.PathLike[builtins.str]] + builtins.str" builtins.strF +os.PathLike[builtins.str] + builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathj +*pandas._typing.WriteBuffer[builtins.bytes] +builtins.bytes"builtins.bytes"pandas._typing.WriteBuffer*E +engine7 Literal[builtins.str]  - builtins.str" builtins.str -*TypeAlias[builtins.dict[builtins.str,Any]]W + builtins.str" builtins.str *T +indexG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None * + engine_kwargs ++Union[builtins.dict[builtins.str,Any],None]W builtins.dict[builtins.str,Any] builtins.str" builtins.str -Any" builtins.dict"pandas._typing.CompressionDict"!pandas._typing.CompressionOptions *+ -index - builtins.bool" builtins.bool *R -indentD -Union[builtins.int,None] - builtins.int" builtins.int -None *C -mode7 +Any" builtins.dict +None 0:typing.overloadX +to_orc"pandas.core.frame.DataFrame.to_orc" +builtins.bytes"builtins.bytes*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +path +None *E +engine7 Literal[builtins.str]  - builtins.str" builtins.str 0:typing.overloadX2; - to_string%pandas.core.frame.DataFrame.to_string - to_string%pandas.core.frame.DataFrame.to_string" + builtins.str" builtins.str *T +indexG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None * + engine_kwargs ++Union[builtins.dict[builtins.str,Any],None]W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict +None 0:typing.overloadX2I +to_html#pandas.core.frame.DataFrame.to_html& +to_html#pandas.core.frame.DataFrame.to_html" None*D self: pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* @@ -11193,55 +7588,52 @@ hUnion[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.W os.PathLike[builtins.str] builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathd (pandas._typing.WriteBuffer[builtins.str] - builtins.str" builtins.str"pandas._typing.WriteBuffer* -columns -wUnion[builtins.list[pandas._typing.HashableT1],pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],None] -(builtins.list[pandas._typing.HashableT1]R -pandas._typing.HashableT1" + builtins.str" builtins.str"pandas._typing.WriteBuffer* +columns +vUnion[builtins.list[pandas._typing.HashableT],pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],None] +'builtins.list[pandas._typing.HashableT]Q +pandas._typing.HashableT" typing.Hashable"typing.Hashable"typing.Hashable" builtins.listN #pandas.core.indexes.base.Index[Any] Any"pandas.core.indexes.base.IndexD pandas.core.series.Series[Any] Any"pandas.core.series.Series -None * - col_space -jUnion[builtins.int,builtins.list[builtins.int],builtins.dict[pandas._typing.HashableT2,builtins.int],None] - builtins.int" builtins.intJ -builtins.list[builtins.int] - builtins.int" builtins.int" builtins.list -5builtins.dict[pandas._typing.HashableT2,builtins.int]R -pandas._typing.HashableT2" -typing.Hashable"typing.Hashable"typing.Hashable - builtins.int" builtins.int" builtins.dict -None * -header -MUnion[builtins.bool,builtins.list[builtins.str],builtins.tuple[builtins.str]] - builtins.bool" builtins.boolJ -builtins.list[builtins.str] - builtins.str" builtins.str" builtins.listL -builtins.tuple[builtins.str] - builtins.str" builtins.str"builtins.tuple *+ +None * + col_space +Union[TypeAlias[Union[builtins.str,builtins.int,typing.Sequence[Union[builtins.int,builtins.str]],typing.Mapping[typing.Hashable,Union[builtins.str,builtins.int]]]],None] +TypeAlias[Union[builtins.str,builtins.int,typing.Sequence[Union[builtins.int,builtins.str]],typing.Mapping[typing.Hashable,Union[builtins.str,builtins.int]]]] +Union[builtins.str,builtins.int,typing.Sequence[Union[builtins.int,builtins.str]],typing.Mapping[typing.Hashable,Union[builtins.str,builtins.int]]] + builtins.str" builtins.str + builtins.int" builtins.int +1typing.Sequence[Union[builtins.int,builtins.str]]` + Union[builtins.int,builtins.str] + builtins.int" builtins.int + builtins.str" builtins.str"typing.Sequence +@typing.Mapping[typing.Hashable,Union[builtins.str,builtins.int]]" +typing.Hashable"typing.Hashable` + Union[builtins.str,builtins.int] + builtins.str" builtins.str + builtins.int" builtins.int"typing.Mapping"pandas._typing.ColspaceArgType +None *, +header + builtins.bool" builtins.bool *+ index builtins.bool" builtins.bool ** na_rep - builtins.str" builtins.str * + builtins.str" builtins.str * -formatters -Union[TypeAlias[Union[builtins.list[CallableType[builtins.function]],builtins.tuple[CallableType[builtins.function]],typing.Mapping[Union[builtins.str,builtins.int],CallableType[builtins.function]]]],None] -TypeAlias[Union[builtins.list[CallableType[builtins.function]],builtins.tuple[CallableType[builtins.function]],typing.Mapping[Union[builtins.str,builtins.int],CallableType[builtins.function]]]] -Union[builtins.list[CallableType[builtins.function]],builtins.tuple[CallableType[builtins.function]],typing.Mapping[Union[builtins.str,builtins.int],CallableType[builtins.function]]] +formatters +Union[builtins.list[CallableType[builtins.function]],builtins.tuple[CallableType[builtins.function]],typing.Mapping[typing.Hashable,CallableType[builtins.function]],None] .builtins.list[CallableType[builtins.function]]K CallableType[builtins.function]& builtins.function"builtins.function" builtins.list /builtins.tuple[CallableType[builtins.function]]K CallableType[builtins.function]& -builtins.function"builtins.function"builtins.tuple -Ptyping.Mapping[Union[builtins.str,builtins.int],CallableType[builtins.function]]` - Union[builtins.str,builtins.int] - builtins.str" builtins.str - builtins.int" builtins.intK +builtins.function"builtins.function"builtins.tuple +?typing.Mapping[typing.Hashable,CallableType[builtins.function]]" +typing.Hashable"typing.HashableK CallableType[builtins.function]& -builtins.function"builtins.function"typing.Mapping"pandas._typing.FormattersType +builtins.function"builtins.function"typing.Mapping None * float_format +Union[CallableType[builtins.function],None]K @@ -11253,9 +7645,30 @@ Ptyping.Mapping[Union[builtins.str,builtins.int],CallableType[builtins.function] builtins.bool" builtins.bool None *1 index_names - builtins.bool" builtins.bool *S -justifyD -Union[builtins.str,None] + builtins.bool" builtins.bool * +justify +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  builtins.str" builtins.str None *T max_rowsD @@ -11269,75 +7682,79 @@ Ptyping.Mapping[Union[builtins.str,builtins.int],CallableType[builtins.function] show_dimensions builtins.bool" builtins.bool *+ decimal - builtins.str" builtins.str *V - -line_widthD -Union[builtins.int,None] - builtins.int" builtins.int -None *T -min_rowsD -Union[builtins.int,None] - builtins.int" builtins.int -None *X - max_colwidthD + builtins.str" builtins.str */ + bold_rows + builtins.bool" builtins.bool * +classes +)Union[typing.Sequence[builtins.str],None]N +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.Sequence +None *, +escape + builtins.bool" builtins.bool *. +notebook + builtins.bool" builtins.bool *R +borderD Union[builtins.int,None] builtins.int" builtins.int None *T +table_idD +Union[builtins.str,None] + builtins.str" builtins.str +None *2 + render_links + builtins.bool" builtins.bool *T encodingD Union[builtins.str,None] builtins.str" builtins.str -None 0:typing.overloadX - to_string%pandas.core.frame.DataFrame.to_string" +None 0:typing.overloadX! +to_html#pandas.core.frame.DataFrame.to_html" builtins.str" builtins.str*D self: pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* buf -None * -columns -vUnion[builtins.list[pandas._typing.HashableT],pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],None] -'builtins.list[pandas._typing.HashableT]Q +None * +columns +5Union[typing.Sequence[pandas._typing.HashableT],None] +)typing.Sequence[pandas._typing.HashableT]Q pandas._typing.HashableT" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.listN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.IndexD -pandas.core.series.Series[Any] -Any"pandas.core.series.Series -None * - col_space -`Union[builtins.int,builtins.list[builtins.int],builtins.dict[typing.Hashable,builtins.int],None] - builtins.int" builtins.intJ -builtins.list[builtins.int] - builtins.int" builtins.int" builtins.list~ -+builtins.dict[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int" builtins.dict -None * -header -2Union[builtins.bool,typing.Sequence[builtins.str]] - builtins.bool" builtins.boolN -typing.Sequence[builtins.str] - builtins.str" builtins.str"typing.Sequence *+ +typing.Hashable"typing.Hashable"typing.Hashable"typing.Sequence +None * + col_space +Union[TypeAlias[Union[builtins.str,builtins.int,typing.Sequence[Union[builtins.int,builtins.str]],typing.Mapping[typing.Hashable,Union[builtins.str,builtins.int]]]],None] +TypeAlias[Union[builtins.str,builtins.int,typing.Sequence[Union[builtins.int,builtins.str]],typing.Mapping[typing.Hashable,Union[builtins.str,builtins.int]]]] +Union[builtins.str,builtins.int,typing.Sequence[Union[builtins.int,builtins.str]],typing.Mapping[typing.Hashable,Union[builtins.str,builtins.int]]] + builtins.str" builtins.str + builtins.int" builtins.int +1typing.Sequence[Union[builtins.int,builtins.str]]` + Union[builtins.int,builtins.str] + builtins.int" builtins.int + builtins.str" builtins.str"typing.Sequence +@typing.Mapping[typing.Hashable,Union[builtins.str,builtins.int]]" +typing.Hashable"typing.Hashable` + Union[builtins.str,builtins.int] + builtins.str" builtins.str + builtins.int" builtins.int"typing.Mapping"pandas._typing.ColspaceArgType +None *, +header + builtins.bool" builtins.bool *+ index builtins.bool" builtins.bool ** na_rep - builtins.str" builtins.str * + builtins.str" builtins.str * -formatters -Union[TypeAlias[Union[builtins.list[CallableType[builtins.function]],builtins.tuple[CallableType[builtins.function]],typing.Mapping[Union[builtins.str,builtins.int],CallableType[builtins.function]]]],None] -TypeAlias[Union[builtins.list[CallableType[builtins.function]],builtins.tuple[CallableType[builtins.function]],typing.Mapping[Union[builtins.str,builtins.int],CallableType[builtins.function]]]] -Union[builtins.list[CallableType[builtins.function]],builtins.tuple[CallableType[builtins.function]],typing.Mapping[Union[builtins.str,builtins.int],CallableType[builtins.function]]] +formatters +Union[builtins.list[CallableType[builtins.function]],builtins.tuple[CallableType[builtins.function]],typing.Mapping[typing.Hashable,CallableType[builtins.function]],None] .builtins.list[CallableType[builtins.function]]K CallableType[builtins.function]& builtins.function"builtins.function" builtins.list /builtins.tuple[CallableType[builtins.function]]K CallableType[builtins.function]& -builtins.function"builtins.function"builtins.tuple -Ptyping.Mapping[Union[builtins.str,builtins.int],CallableType[builtins.function]]` - Union[builtins.str,builtins.int] - builtins.str" builtins.str - builtins.int" builtins.intK +builtins.function"builtins.function"builtins.tuple +?typing.Mapping[typing.Hashable,CallableType[builtins.function]]" +typing.Hashable"typing.HashableK CallableType[builtins.function]& -builtins.function"builtins.function"typing.Mapping"pandas._typing.FormattersType +builtins.function"builtins.function"typing.Mapping None * float_format +Union[CallableType[builtins.function],None]K @@ -11349,9 +7766,30 @@ Ptyping.Mapping[Union[builtins.str,builtins.int],CallableType[builtins.function] builtins.bool" builtins.bool None *1 index_names - builtins.bool" builtins.bool *S -justifyD -Union[builtins.str,None] + builtins.bool" builtins.bool * +justify +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  builtins.str" builtins.str None *T max_rowsD @@ -11365,1100 +7803,9592 @@ Ptyping.Mapping[Union[builtins.str,builtins.int],CallableType[builtins.function] show_dimensions builtins.bool" builtins.bool *+ decimal - builtins.str" builtins.str *V - -line_widthD -Union[builtins.int,None] - builtins.int" builtins.int -None *T -min_rowsD -Union[builtins.int,None] - builtins.int" builtins.int -None *X - max_colwidthD + builtins.str" builtins.str */ + bold_rows + builtins.bool" builtins.bool * +classes +)Union[typing.Sequence[builtins.str],None]N +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.Sequence +None *, +escape + builtins.bool" builtins.bool *. +notebook + builtins.bool" builtins.bool *R +borderD Union[builtins.int,None] builtins.int" builtins.int None *T +table_idD +Union[builtins.str,None] + builtins.str" builtins.str +None *2 + render_links + builtins.bool" builtins.bool *T encodingD Union[builtins.str,None] builtins.str" builtins.str -None 0:typing.overloadXr: -__hash__$pandas.core.frame.DataFrame.__hash__ -NonerT -sparse"pandas.core.frame.DataFrame.sparse& -builtins.ellipsis"builtins.ellipsisrF -Name pandas.core.frame.DataFrame.Name - builtins.str" builtins.str - -DateOffset&pandas._libs.tslibs.offsets.DateOffset"/pandas._libs.tslibs.offsets.RelativeDeltaOffset* -__init__/pandas._libs.tslibs.offsets.DateOffset.__init__" -None*Z -selfP -&pandas._libs.tslibs.offsets.DateOffset"&pandas._libs.tslibs.offsets.DateOffset*% -n - builtins.int" builtins.int */ - normalize - builtins.bool" builtins.bool *) -years - builtins.int" builtins.int ** -months - builtins.int" builtins.int *) -weeks - builtins.int" builtins.int *( -days - builtins.int" builtins.int *) -hours - builtins.int" builtins.int *+ -minutes - builtins.int" builtins.int *+ -seconds - builtins.int" builtins.int *0 - milliseconds - builtins.int" builtins.int *0 - microseconds - builtins.int" builtins.int */ - nanoseconds - builtins.int" builtins.int *( -year - builtins.int" builtins.int *) -month - builtins.int" builtins.int *' -day - builtins.int" builtins.int *+ -weekday - builtins.int" builtins.int *( -hour - builtins.int" builtins.int ** -minute - builtins.int" builtins.int ** -second - builtins.int" builtins.int */ - microsecond - builtins.int" builtins.int *. - -nanosecond - builtins.int" builtins.int A - DatetimeIndex+pandas.core.indexes.datetimes.DatetimeIndex"7pandas.core.indexes.datetimelike.DatetimeTimedeltaMixin"5pandas.core.indexes.accessors.DatetimeIndexProperties* -__init__4pandas.core.indexes.datetimes.DatetimeIndex.__init__" -None*d -selfZ -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* -data -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.tuple[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] -`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.IndexD -pandas.core.series.Series[Any] -Any"pandas.core.series.Series9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.AnyArrayLike, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tuple* -freq -Any * -tz -Any */ - normalize - builtins.bool" builtins.bool * -closed -Any *- - ambiguous - builtins.str" builtins.str *. -dayfirst - builtins.bool" builtins.bool */ - yearfirst - builtins.bool" builtins.bool * -dtype -Any ** -copy - builtins.bool" builtins.bool * -name -Any * - __array__5pandas.core.indexes.datetimes.DatetimeIndex.__array__"9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray*d -selfZ -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* -dtype -Any *N - -__reduce__6pandas.core.indexes.datetimes.DatetimeIndex.__reduce__* -self* - to_series5pandas.core.indexes.datetimes.DatetimeIndex.to_series"H -"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries*d -selfZ -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* -keep_tz -Any * -index -Any * -name -Any * -snap0pandas.core.indexes.datetimes.DatetimeIndex.snap" -Any*d -selfZ -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex*( -freq - builtins.str" builtins.str *a - get_value5pandas.core.indexes.datetimes.DatetimeIndex.get_value* -self* - -series* -key*b -get_loc3pandas.core.indexes.datetimes.DatetimeIndex.get_loc* -self* -key* - tolerance *x - slice_indexer9pandas.core.indexes.datetimes.DatetimeIndex.slice_indexer* -self* -start * -end * +None 0:typing.overloadX2< +to_xml"pandas.core.frame.DataFrame.to_xml +to_xml"pandas.core.frame.DataFrame.to_xml" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +path_or_buffer +Union[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.WriteBuffer[builtins.bytes],pandas._typing.WriteBuffer[builtins.str]] +8TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]] +-Union[builtins.str,os.PathLike[builtins.str]] + builtins.str" builtins.strF +os.PathLike[builtins.str] + builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathj +*pandas._typing.WriteBuffer[builtins.bytes] +builtins.bytes"builtins.bytes"pandas._typing.WriteBufferd +(pandas._typing.WriteBuffer[builtins.str] + builtins.str" builtins.str"pandas._typing.WriteBuffer*+ +index + builtins.bool" builtins.bool *- + root_name + builtins.str" builtins.str *, +row_name + builtins.str" builtins.str *R +na_repD +Union[builtins.str,None] + builtins.str" builtins.str +None * + attr_cols +4Union[builtins.list[pandas._typing.HashableT1],None] +(builtins.list[pandas._typing.HashableT1]R +pandas._typing.HashableT1" +typing.Hashable"typing.Hashable"typing.Hashable" builtins.list +None * + elem_cols +4Union[builtins.list[pandas._typing.HashableT2],None] +(builtins.list[pandas._typing.HashableT2]R +pandas._typing.HashableT2" +typing.Hashable"typing.Hashable"typing.Hashable" builtins.list +None * -step * - searchsorted8pandas.core.indexes.datetimes.DatetimeIndex.searchsorted" -Any*d -selfZ -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* -value -Any*( -side - builtins.str" builtins.str * -sorter -Any * -is_type_compatible>pandas.core.indexes.datetimes.DatetimeIndex.is_type_compatible" - builtins.bool" builtins.bool*d -selfZ -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* -typ -Any* - inferred_type9pandas.core.indexes.datetimes.DatetimeIndex.inferred_type" - builtins.str" builtins.str*d -selfZ -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex0:builtins.property`*Y -insert2pandas.core.indexes.datetimes.DatetimeIndex.insert* -self* -loc* -item* -indexer_at_time;pandas.core.indexes.datetimes.DatetimeIndex.indexer_at_time" -Any*d -selfZ -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* -time -Any** -asof - builtins.bool" builtins.bool * -indexer_between_time@pandas.core.indexes.datetimes.DatetimeIndex.indexer_between_time" -Any*d -selfZ -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* +namespaces +@Union[builtins.dict[Union[builtins.str,None],builtins.str],None] +4builtins.dict[Union[builtins.str,None],builtins.str]D +Union[builtins.str,None] + builtins.str" builtins.str +None + builtins.str" builtins.str" builtins.dict +None *R +prefixD +Union[builtins.str,None] + builtins.str" builtins.str +None *, +encoding + builtins.str" builtins.str *5 +xml_declaration + builtins.bool" builtins.bool *2 + pretty_print + builtins.bool" builtins.bool * +parser +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.XMLParsers * -start_time -Any* -end_time -Any*3 - include_start - builtins.bool" builtins.bool *1 - include_end - builtins.bool" builtins.bool * -to_perioddelta:pandas.core.indexes.datetimes.DatetimeIndex.to_perioddelta"^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex*d -selfZ -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* -freq -Any* -to_julian_date:pandas.core.indexes.datetimes.DatetimeIndex.to_julian_date"r -.pandas.core.indexes.base.Index[builtins.float] -builtins.float"builtins.float"pandas.core.indexes.base.Index*d -selfZ -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* - isocalendar7pandas.core.indexes.datetimes.DatetimeIndex.isocalendar": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*d -selfZ -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* -tzinfo2pandas.core.indexes.datetimes.DatetimeIndex.tzinfo"M -Union[datetime.tzinfo,None]" -datetime.tzinfo"datetime.tzinfo -None*d -selfZ -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex0:builtins.property`* -dtype1pandas.core.indexes.datetimes.DatetimeIndex.dtype" -AUnion[numpy.dtype[Any],pandas.core.dtypes.dtypes.DatetimeTZDtype]( -numpy.dtype[Any] -Any" numpy.dtypeV -)pandas.core.dtypes.dtypes.DatetimeTZDtype")pandas.core.dtypes.dtypes.DatetimeTZDtype*d -selfZ -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex0:builtins.property`2 -__add__3pandas.core.indexes.datetimes.DatetimeIndex.__add__ -__add__3pandas.core.indexes.datetimes.DatetimeIndex.__add__"H -"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries*\Z -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex*JH -"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries0:typing.overloadX -__add__3pandas.core.indexes.datetimes.DatetimeIndex.__add__"Z -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex*\Z -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* -]Union[pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.indexes.timedeltas.TimedeltaIndex]T -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex0:typing.overloadX2 -__sub__3pandas.core.indexes.datetimes.DatetimeIndex.__sub__ -__sub__3pandas.core.indexes.datetimes.DatetimeIndex.__sub__"H -"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries*\Z -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex*JH -"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries0:typing.overloadX -__sub__3pandas.core.indexes.datetimes.DatetimeIndex.__sub__"Z -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex*\Z -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* -]Union[pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.indexes.timedeltas.TimedeltaIndex]T -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex0:typing.overloadX -__sub__3pandas.core.indexes.datetimes.DatetimeIndex.__sub__"^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex*\Z -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* -[Union[pandas._libs.tslibs.timestamps.Timestamp,pandas.core.indexes.datetimes.DatetimeIndex]T -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampZ -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex0:typing.overloadX -DatetimeTZDtype)pandas.core.dtypes.dtypes.DatetimeTZDtype".pandas.core.dtypes.dtypes.PandasExtensionDtype* -__init__2pandas.core.dtypes.dtypes.DatetimeTZDtype.__init__" -None*` -selfV -)pandas.core.dtypes.dtypes.DatetimeTZDtype")pandas.core.dtypes.dtypes.DatetimeTZDtype*C -unit7 +stylesheet +Union[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.ReadBuffer[builtins.str],pandas._typing.ReadBuffer[builtins.bytes],None] +8TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]] +-Union[builtins.str,os.PathLike[builtins.str]] + builtins.str" builtins.strF +os.PathLike[builtins.str] + builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathb +'pandas._typing.ReadBuffer[builtins.str] + builtins.str" builtins.str"pandas._typing.ReadBufferh +)pandas._typing.ReadBuffer[builtins.bytes] +builtins.bytes"builtins.bytes"pandas._typing.ReadBuffer +None * + compression +TypeAlias[Union[None,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],TypeAlias[builtins.dict[builtins.str,Any]]]] +Union[None,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],TypeAlias[builtins.dict[builtins.str,Any]]] +None7 Literal[builtins.str]  - builtins.str" builtins.str * -tz -5Union[builtins.str,builtins.int,datetime.tzinfo,None] - builtins.str" builtins.str - builtins.int" builtins.int" -datetime.tzinfo"datetime.tzinfo -None * -unit.pandas.core.dtypes.dtypes.DatetimeTZDtype.unit"7 + builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str*` -selfV -)pandas.core.dtypes.dtypes.DatetimeTZDtype")pandas.core.dtypes.dtypes.DatetimeTZDtype0:builtins.property`* -tz,pandas.core.dtypes.dtypes.DatetimeTZDtype.tz"" -datetime.tzinfo"datetime.tzinfo*` -selfV -)pandas.core.dtypes.dtypes.DatetimeTZDtype")pandas.core.dtypes.dtypes.DatetimeTZDtype0:builtins.property`* -na_value2pandas.core.dtypes.dtypes.DatetimeTZDtype.na_value"J -#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType*` -selfV -)pandas.core.dtypes.dtypes.DatetimeTZDtype")pandas.core.dtypes.dtypes.DatetimeTZDtype0:builtins.property`a - Float32Dtype(pandas.core.arrays.floating.Float32Dtype"'pandas.core.arrays.numeric.NumericDtypea - Float64Dtype(pandas.core.arrays.floating.Float64Dtype"'pandas.core.arrays.numeric.NumericDtype -Grouper#pandas.core.groupby.grouper.Grouper"builtins.object*U -__new__+pandas.core.groupby.grouper.Grouper.__new__* -cls* -args* + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +*TypeAlias[builtins.dict[builtins.str,Any]]W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict"pandas._typing.CompressionDict"!pandas._typing.CompressionOptions * +storage_options +6TypeAlias[Union[builtins.dict[builtins.str,Any],None]] ++Union[builtins.dict[builtins.str,Any],None]W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict +None"pandas._typing.StorageOptions 0:typing.overloadX +to_xml"pandas.core.frame.DataFrame.to_xml" + builtins.str" builtins.str*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +path_or_buffer +None *+ +index + builtins.bool" builtins.bool *U + root_nameD +Union[builtins.str,None] + builtins.str" builtins.str +None *T +row_nameD +Union[builtins.str,None] + builtins.str" builtins.str +None *R +na_repD +Union[builtins.str,None] + builtins.str" builtins.str +None * + attr_cols +4Union[builtins.list[pandas._typing.HashableT1],None] +(builtins.list[pandas._typing.HashableT1]R +pandas._typing.HashableT1" +typing.Hashable"typing.Hashable"typing.Hashable" builtins.list +None * + elem_cols +4Union[builtins.list[pandas._typing.HashableT2],None] +(builtins.list[pandas._typing.HashableT2]R +pandas._typing.HashableT2" +typing.Hashable"typing.Hashable"typing.Hashable" builtins.list +None * -kwargs* -__init__,pandas.core.groupby.grouper.Grouper.__init__" -None*T -selfJ -#pandas.core.groupby.grouper.Grouper"#pandas.core.groupby.grouper.Grouper* -key -Any * -level -Any * -freq -Any *( -axis - builtins.int" builtins.int ** -sort - builtins.bool" builtins.bool *M -ax&pandas.core.groupby.grouper.Grouper.ax* -self0:builtins.property`*U -groups*pandas.core.groupby.grouper.Grouper.groups* -self0:builtins.property`rV -key'pandas.core.groupby.grouper.Grouper.key& -builtins.ellipsis"builtins.ellipsisrZ -level)pandas.core.groupby.grouper.Grouper.level& -builtins.ellipsis"builtins.ellipsisrX -freq(pandas.core.groupby.grouper.Grouper.freq& -builtins.ellipsis"builtins.ellipsisrX -axis(pandas.core.groupby.grouper.Grouper.axis& -builtins.ellipsis"builtins.ellipsisrX -sort(pandas.core.groupby.grouper.Grouper.sort& -builtins.ellipsis"builtins.ellipsisr^ -grouper+pandas.core.groupby.grouper.Grouper.grouper& -builtins.ellipsis"builtins.ellipsisrV -obj'pandas.core.groupby.grouper.Grouper.obj& -builtins.ellipsis"builtins.ellipsisr^ -indexer+pandas.core.groupby.grouper.Grouper.indexer& -builtins.ellipsis"builtins.ellipsisr\ -binner*pandas.core.groupby.grouper.Grouper.binner& -builtins.ellipsis"builtins.ellipsisف -Indexpandas.core.indexes.base.Index"pandas.core.base.IndexOpsMixin*1 -str"pandas.core.indexes.base.Index.str" -kpandas.core.strings.StringMethods[pandas.core.indexes.base.Index.Self,pandas.core.indexes.multi.MultiIndex] -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(L -$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex"!pandas.core.strings.StringMethods* -self -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(0:builtins.property`* -asi8#pandas.core.indexes.base.Index.asi8" -^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] -STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] -Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] -Any -5numpy.dtype[numpy._typing._array_like._ScalarType_co][ -(numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_int64* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index0:builtins.property`* -is_"pandas.core.indexes.base.Index.is_" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* -other -Any* -__len__&pandas.core.indexes.base.Index.__len__" - builtins.int" builtins.int* -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* - __array__(pandas.core.indexes.base.Index.__array__"9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* -dtype -Any *d -__array_wrap__-pandas.core.indexes.base.Index.__array_wrap__* -self* +namespaces +@Union[builtins.dict[Union[builtins.str,None],builtins.str],None] +4builtins.dict[Union[builtins.str,None],builtins.str]D +Union[builtins.str,None] + builtins.str" builtins.str +None + builtins.str" builtins.str" builtins.dict +None *R +prefixD +Union[builtins.str,None] + builtins.str" builtins.str +None *, +encoding + builtins.str" builtins.str *^ +xml_declarationG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None *[ + pretty_printG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None *R +parserD +Union[builtins.str,None] + builtins.str" builtins.str +None * -result* -context * -dtype$pandas.core.indexes.base.Index.dtype" -STypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]] -HUnion[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]I -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtypeP -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype"pandas._typing.DtypeObj* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index0:builtins.property`* -ravel$pandas.core.indexes.base.Index.ravel" -Any* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index*) -order - builtins.str" builtins.str *@ -view#pandas.core.indexes.base.Index.view* -self* -cls *& -astype%pandas.core.indexes.base.Index.astype"N -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +stylesheet +Union[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.ReadBuffer[builtins.str],pandas._typing.ReadBuffer[builtins.bytes],None] +8TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]] +-Union[builtins.str,os.PathLike[builtins.str]] + builtins.str" builtins.strF +os.PathLike[builtins.str] + builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathb +'pandas._typing.ReadBuffer[builtins.str] + builtins.str" builtins.str"pandas._typing.ReadBufferh +)pandas._typing.ReadBuffer[builtins.bytes] +builtins.bytes"builtins.bytes"pandas._typing.ReadBuffer +None * + compression +TypeAlias[Union[None,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],TypeAlias[builtins.dict[builtins.str,Any]]]] +Union[None,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],TypeAlias[builtins.dict[builtins.str,Any]]] +None7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +*TypeAlias[builtins.dict[builtins.str,Any]]W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict"pandas._typing.CompressionDict"!pandas._typing.CompressionOptions * +storage_options +6TypeAlias[Union[builtins.dict[builtins.str,Any],None]] ++Union[builtins.dict[builtins.str,Any],None]W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict +None"pandas._typing.StorageOptions 0:typing.overloadX2 + __getitem__'pandas.core.frame.DataFrame.__getitem__ + __getitem__'pandas.core.frame.DataFrame.__getitem__"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series*<: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],builtins.tuple[typing.Hashable]] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] builtins.str" builtins.str builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& + datetime.date" datetime.date& datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* -dtype -TypeAlias[Union[TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],typing.Mapping[Any,Unknown]]] -Union[TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],typing.Mapping[Any,Unknown]] -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype8 -typing.Mapping[Any,Unknown] -Any"typing.Mapping"pandas._typing.DtypeArg** -copy - builtins.bool" builtins.bool * -take#pandas.core.indexes.base.Index.take" -Any* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* -indices -Any*( -axis - builtins.int" builtins.int *0 - -allow_fill - builtins.bool" builtins.bool * - -fill_value -Any * +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.ScalarU +builtins.tuple[typing.Hashable]" +typing.Hashable"typing.Hashable"builtins.tuple0:typing.overloadX + __getitem__'pandas.core.frame.DataFrame.__getitem__": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*<: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +6Union[typing.Iterable[typing.Hashable],builtins.slice]W + typing.Iterable[typing.Hashable]" +typing.Hashable"typing.Hashable"typing.Iterable +builtins.slice"builtins.slice0:typing.overloadX + __getitem__'pandas.core.frame.DataFrame.__getitem__"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series*<: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*$" +typing.Hashable"typing.Hashable0:typing.overloadX2 +query!pandas.core.frame.DataFrame.query +query!pandas.core.frame.DataFrame.query" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*& +expr + builtins.str" builtins.str*G +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool* kwargs -Any*R -repeat%pandas.core.indexes.base.Index.repeat* -self* -repeats* - -axis *0 -copy#pandas.core.indexes.base.Index.copy" -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: +Any0:typing.overloadX +query!pandas.core.frame.DataFrame.query": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*& +expr + builtins.str" builtins.str*I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool * +kwargs +Any0:typing.overloadX2 + select_dtypes)pandas.core.frame.DataFrame.select_dtypes + select_dtypes)pandas.core.frame.DataFrame.select_dtypes" +NoReturn +*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +include +TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* -self -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* -name -Any ** -deep - builtins.bool" builtins.bool *I -__copy__'pandas.core.indexes.base.Index.__copy__* -self* - -kwargs*Q - __deepcopy__+pandas.core.indexes.base.Index.__deepcopy__* -self* - -memo * -format%pandas.core.indexes.base.Index.format"J -builtins.list[builtins.str] - builtins.str" builtins.str" builtins.list* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index** -name - builtins.bool" builtins.bool * - formatter -+Union[CallableType[builtins.function],None]K -CallableType[builtins.function]& -builtins.function"builtins.function -None ** -na_rep - builtins.str" builtins.str *e -to_native_types.pandas.core.indexes.base.Index.to_native_types* -self* -slicer * + builtins.str" builtins.str"type7 +Literal[builtins.str]  + builtins.str" builtins.strP +&pandas.core.arrays.string_.StringDtype"&pandas.core.arrays.string_.StringDtype7 +Literal[builtins.str]  + builtins.str" builtins.str4 +Type[numpy.str_] -kwargs*G - to_flat_index,pandas.core.indexes.base.Index.to_flat_index* -self* - to_series(pandas.core.indexes.base.Index.to_series"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* -index -Any * -name -Any * -to_frame'pandas.core.indexes.base.Index.to_frame": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= +numpy.str_" +numpy.str_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.StrDtypeArg* +exclude +6Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],builtins.list[Unknown]]],None] +6TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],builtins.list[Unknown]]] +6Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],builtins.list[Unknown]] +5TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +5Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]] +4TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]] +4Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]] +TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]= Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index*+ -index - builtins.bool" builtins.bool * -name -Any * - set_names(pandas.core.indexes.base.Index.set_names" -Any* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: + builtins.bool" builtins.bool"type7 +Literal[builtins.str]  + builtins.str" builtins.strR +'pandas.core.arrays.boolean.BooleanDtype"'pandas.core.arrays.boolean.BooleanDtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Type[numpy.bool_] + numpy.bool_" numpy.bool_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.BooleanDtypeArg& +TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: +Type[builtins.int] + builtins.int" builtins.int"type7 +Literal[builtins.str]  + builtins.str" builtins.strL +$pandas.core.arrays.integer.Int8Dtype"$pandas.core.arrays.integer.Int8DtypeN +%pandas.core.arrays.integer.Int16Dtype"%pandas.core.arrays.integer.Int16DtypeN +%pandas.core.arrays.integer.Int32Dtype"%pandas.core.arrays.integer.Int32DtypeN +%pandas.core.arrays.integer.Int64Dtype"%pandas.core.arrays.integer.Int64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +)Type[numpy.signedinteger[TypeAlias[Any]]]v +#numpy.signedinteger[TypeAlias[Any]]: +TypeAlias[Any] +Any"numpy._typing._nbit._NBitByte"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IntDtypeArg$ +TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]N +%pandas.core.arrays.integer.UInt8Dtype"%pandas.core.arrays.integer.UInt8DtypeP +&pandas.core.arrays.integer.UInt16Dtype"&pandas.core.arrays.integer.UInt16DtypeP +&pandas.core.arrays.integer.UInt32Dtype"&pandas.core.arrays.integer.UInt32DtypeP +&pandas.core.arrays.integer.UInt64Dtype"&pandas.core.arrays.integer.UInt64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.UIntDtypeArg +TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: Type[builtins.str] - builtins.str" builtins.str"typeF + builtins.str" builtins.str"type7 +Literal[builtins.str]  + builtins.str" builtins.strP +&pandas.core.arrays.string_.StringDtype"&pandas.core.arrays.string_.StringDtype7 +Literal[builtins.str]  + builtins.str" builtins.str4 +Type[numpy.str_] + +numpy.str_" +numpy.str_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.StrDtypeArg +TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ +Type[builtins.bytes] +builtins.bytes"builtins.bytes"type7 +Literal[builtins.str]  + builtins.str" builtins.str: +Type[numpy.bytes_] + numpy.bytes_" numpy.bytes_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.BytesDtypeArg +TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ +Type[builtins.float] +builtins.float"builtins.float"type7 +Literal[builtins.str]  + builtins.str" builtins.strT +(pandas.core.arrays.floating.Float32Dtype"(pandas.core.arrays.floating.Float32DtypeT +(pandas.core.arrays.floating.Float64Dtype"(pandas.core.arrays.floating.Float64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.FloatDtypeArg +TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]F Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* -names -Any* -level -Any *- -inplace - builtins.bool" builtins.bool * -rename%pandas.core.indexes.base.Index.rename" -Any* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int +builtins.complex"builtins.complex"type7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ComplexDtypeArg$ +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimedeltaDtypeArg& +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimestampDtypeArg +RTypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]] +GUnion[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]X +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.CategoryDtypeArg +gTypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]] +\Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]C +Type[builtins.object]" +builtins.object"builtins.object"type7 +Literal[builtins.str]  + builtins.str" builtins.str= +Type[numpy.object_] + numpy.object_" numpy.object_"type7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ObjectDtypeArg +dTypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +YUnion[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]4 +Type[numpy.void] + +numpy.void" +numpy.void"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.VoidDtypeArg +STypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]] +HUnion[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]I +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtypeP +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype"pandas._typing.DtypeObj"pandas._typing.AstypeArg7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"(pandas.core.frame.DataFrame.AstypeArgExt) +builtins.list[Unknown]" builtins.list",pandas.core.frame.DataFrame.AstypeArgExtList +None 0:typing.overloadX + select_dtypes)pandas.core.frame.DataFrame.select_dtypes" +NoReturn +*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +include +6Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],builtins.list[Unknown]]],None] +6TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],builtins.list[Unknown]]] +6Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],builtins.list[Unknown]] +5TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +5Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]] +4TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]] +4Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]] +TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]= +Type[builtins.bool] + builtins.bool" builtins.bool"type7 +Literal[builtins.str]  + builtins.str" builtins.strR +'pandas.core.arrays.boolean.BooleanDtype"'pandas.core.arrays.boolean.BooleanDtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Type[numpy.bool_] + numpy.bool_" numpy.bool_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.BooleanDtypeArg& +TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: +Type[builtins.int] + builtins.int" builtins.int"type7 +Literal[builtins.str]  + builtins.str" builtins.strL +$pandas.core.arrays.integer.Int8Dtype"$pandas.core.arrays.integer.Int8DtypeN +%pandas.core.arrays.integer.Int16Dtype"%pandas.core.arrays.integer.Int16DtypeN +%pandas.core.arrays.integer.Int32Dtype"%pandas.core.arrays.integer.Int32DtypeN +%pandas.core.arrays.integer.Int64Dtype"%pandas.core.arrays.integer.Int64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +)Type[numpy.signedinteger[TypeAlias[Any]]]v +#numpy.signedinteger[TypeAlias[Any]]: +TypeAlias[Any] +Any"numpy._typing._nbit._NBitByte"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IntDtypeArg$ +TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]N +%pandas.core.arrays.integer.UInt8Dtype"%pandas.core.arrays.integer.UInt8DtypeP +&pandas.core.arrays.integer.UInt16Dtype"&pandas.core.arrays.integer.UInt16DtypeP +&pandas.core.arrays.integer.UInt32Dtype"&pandas.core.arrays.integer.UInt32DtypeP +&pandas.core.arrays.integer.UInt64Dtype"&pandas.core.arrays.integer.UInt64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.UIntDtypeArg +TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: +Type[builtins.str] + builtins.str" builtins.str"type7 +Literal[builtins.str]  + builtins.str" builtins.strP +&pandas.core.arrays.string_.StringDtype"&pandas.core.arrays.string_.StringDtype7 +Literal[builtins.str]  + builtins.str" builtins.str4 +Type[numpy.str_] + +numpy.str_" +numpy.str_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.StrDtypeArg +TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ +Type[builtins.bytes] +builtins.bytes"builtins.bytes"type7 +Literal[builtins.str]  + builtins.str" builtins.str: +Type[numpy.bytes_] + numpy.bytes_" numpy.bytes_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.BytesDtypeArg +TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ +Type[builtins.float] +builtins.float"builtins.float"type7 +Literal[builtins.str]  + builtins.str" builtins.strT +(pandas.core.arrays.floating.Float32Dtype"(pandas.core.arrays.floating.Float32DtypeT +(pandas.core.arrays.floating.Float64Dtype"(pandas.core.arrays.floating.Float64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.FloatDtypeArg +TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]F +Type[builtins.complex]$ +builtins.complex"builtins.complex"type7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ComplexDtypeArg$ +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimedeltaDtypeArg& +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimestampDtypeArg +RTypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]] +GUnion[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]X +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.CategoryDtypeArg +gTypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]] +\Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]C +Type[builtins.object]" +builtins.object"builtins.object"type7 +Literal[builtins.str]  + builtins.str" builtins.str= +Type[numpy.object_] + numpy.object_" numpy.object_"type7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ObjectDtypeArg +dTypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +YUnion[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]4 +Type[numpy.void] + +numpy.void" +numpy.void"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.VoidDtypeArg +STypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]] +HUnion[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]I +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtypeP +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype"pandas._typing.DtypeObj"pandas._typing.AstypeArg7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"(pandas.core.frame.DataFrame.AstypeArgExt) +builtins.list[Unknown]" builtins.list",pandas.core.frame.DataFrame.AstypeArgExtList +None* +exclude +TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: +Type[builtins.str] + builtins.str" builtins.str"type7 +Literal[builtins.str]  + builtins.str" builtins.strP +&pandas.core.arrays.string_.StringDtype"&pandas.core.arrays.string_.StringDtype7 +Literal[builtins.str]  + builtins.str" builtins.str4 +Type[numpy.str_] + +numpy.str_" +numpy.str_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.StrDtypeArg0:typing.overloadX + + select_dtypes)pandas.core.frame.DataFrame.select_dtypes" +NoReturn +*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +exclude +TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: +Type[builtins.str] + builtins.str" builtins.str"type7 +Literal[builtins.str]  + builtins.str" builtins.strP +&pandas.core.arrays.string_.StringDtype"&pandas.core.arrays.string_.StringDtype7 +Literal[builtins.str]  + builtins.str" builtins.str4 +Type[numpy.str_] + +numpy.str_" +numpy.str_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.StrDtypeArg0:typing.overloadX + select_dtypes)pandas.core.frame.DataFrame.select_dtypes" +NoReturn +*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*C +include6 +builtins.list[NoReturn] +NoReturn +" builtins.list*C +exclude6 +builtins.list[NoReturn] +NoReturn +" builtins.list0:typing.overloadX + select_dtypes)pandas.core.frame.DataFrame.select_dtypes": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*ŵ +include +6TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],builtins.list[Unknown]]] +6Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],builtins.list[Unknown]] +5TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +5Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]] +4TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]] +4Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]] +TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]= +Type[builtins.bool] + builtins.bool" builtins.bool"type7 +Literal[builtins.str]  + builtins.str" builtins.strR +'pandas.core.arrays.boolean.BooleanDtype"'pandas.core.arrays.boolean.BooleanDtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Type[numpy.bool_] + numpy.bool_" numpy.bool_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.BooleanDtypeArg& +TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: +Type[builtins.int] + builtins.int" builtins.int"type7 +Literal[builtins.str]  + builtins.str" builtins.strL +$pandas.core.arrays.integer.Int8Dtype"$pandas.core.arrays.integer.Int8DtypeN +%pandas.core.arrays.integer.Int16Dtype"%pandas.core.arrays.integer.Int16DtypeN +%pandas.core.arrays.integer.Int32Dtype"%pandas.core.arrays.integer.Int32DtypeN +%pandas.core.arrays.integer.Int64Dtype"%pandas.core.arrays.integer.Int64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +)Type[numpy.signedinteger[TypeAlias[Any]]]v +#numpy.signedinteger[TypeAlias[Any]]: +TypeAlias[Any] +Any"numpy._typing._nbit._NBitByte"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IntDtypeArg$ +TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]N +%pandas.core.arrays.integer.UInt8Dtype"%pandas.core.arrays.integer.UInt8DtypeP +&pandas.core.arrays.integer.UInt16Dtype"&pandas.core.arrays.integer.UInt16DtypeP +&pandas.core.arrays.integer.UInt32Dtype"&pandas.core.arrays.integer.UInt32DtypeP +&pandas.core.arrays.integer.UInt64Dtype"&pandas.core.arrays.integer.UInt64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.UIntDtypeArg +TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: +Type[builtins.str] + builtins.str" builtins.str"type7 +Literal[builtins.str]  + builtins.str" builtins.strP +&pandas.core.arrays.string_.StringDtype"&pandas.core.arrays.string_.StringDtype7 +Literal[builtins.str]  + builtins.str" builtins.str4 +Type[numpy.str_] + +numpy.str_" +numpy.str_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.StrDtypeArg +TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ +Type[builtins.bytes] +builtins.bytes"builtins.bytes"type7 +Literal[builtins.str]  + builtins.str" builtins.str: +Type[numpy.bytes_] + numpy.bytes_" numpy.bytes_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.BytesDtypeArg +TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ +Type[builtins.float] +builtins.float"builtins.float"type7 +Literal[builtins.str]  + builtins.str" builtins.strT +(pandas.core.arrays.floating.Float32Dtype"(pandas.core.arrays.floating.Float32DtypeT +(pandas.core.arrays.floating.Float64Dtype"(pandas.core.arrays.floating.Float64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.FloatDtypeArg +TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]F +Type[builtins.complex]$ +builtins.complex"builtins.complex"type7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ComplexDtypeArg$ +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimedeltaDtypeArg& +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimestampDtypeArg +RTypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]] +GUnion[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]X +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.CategoryDtypeArg +gTypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]] +\Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]C +Type[builtins.object]" +builtins.object"builtins.object"type7 +Literal[builtins.str]  + builtins.str" builtins.str= +Type[numpy.object_] + numpy.object_" numpy.object_"type7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ObjectDtypeArg +dTypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +YUnion[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]4 +Type[numpy.void] + +numpy.void" +numpy.void"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.VoidDtypeArg +STypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]] +HUnion[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]I +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtypeP +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype"pandas._typing.DtypeObj"pandas._typing.AstypeArg7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"(pandas.core.frame.DataFrame.AstypeArgExt) +builtins.list[Unknown]" builtins.list",pandas.core.frame.DataFrame.AstypeArgExtList* +exclude +6Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],builtins.list[Unknown]]],None] +6TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],builtins.list[Unknown]]] +6Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],builtins.list[Unknown]] +5TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +5Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]] +4TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]] +4Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]] +TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]= +Type[builtins.bool] + builtins.bool" builtins.bool"type7 +Literal[builtins.str]  + builtins.str" builtins.strR +'pandas.core.arrays.boolean.BooleanDtype"'pandas.core.arrays.boolean.BooleanDtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Type[numpy.bool_] + numpy.bool_" numpy.bool_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.BooleanDtypeArg& +TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: +Type[builtins.int] + builtins.int" builtins.int"type7 +Literal[builtins.str]  + builtins.str" builtins.strL +$pandas.core.arrays.integer.Int8Dtype"$pandas.core.arrays.integer.Int8DtypeN +%pandas.core.arrays.integer.Int16Dtype"%pandas.core.arrays.integer.Int16DtypeN +%pandas.core.arrays.integer.Int32Dtype"%pandas.core.arrays.integer.Int32DtypeN +%pandas.core.arrays.integer.Int64Dtype"%pandas.core.arrays.integer.Int64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +)Type[numpy.signedinteger[TypeAlias[Any]]]v +#numpy.signedinteger[TypeAlias[Any]]: +TypeAlias[Any] +Any"numpy._typing._nbit._NBitByte"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IntDtypeArg$ +TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]N +%pandas.core.arrays.integer.UInt8Dtype"%pandas.core.arrays.integer.UInt8DtypeP +&pandas.core.arrays.integer.UInt16Dtype"&pandas.core.arrays.integer.UInt16DtypeP +&pandas.core.arrays.integer.UInt32Dtype"&pandas.core.arrays.integer.UInt32DtypeP +&pandas.core.arrays.integer.UInt64Dtype"&pandas.core.arrays.integer.UInt64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.UIntDtypeArg +TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: +Type[builtins.str] + builtins.str" builtins.str"type7 +Literal[builtins.str]  + builtins.str" builtins.strP +&pandas.core.arrays.string_.StringDtype"&pandas.core.arrays.string_.StringDtype7 +Literal[builtins.str]  + builtins.str" builtins.str4 +Type[numpy.str_] + +numpy.str_" +numpy.str_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.StrDtypeArg +TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ +Type[builtins.bytes] +builtins.bytes"builtins.bytes"type7 +Literal[builtins.str]  + builtins.str" builtins.str: +Type[numpy.bytes_] + numpy.bytes_" numpy.bytes_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.BytesDtypeArg +TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ +Type[builtins.float] +builtins.float"builtins.float"type7 +Literal[builtins.str]  + builtins.str" builtins.strT +(pandas.core.arrays.floating.Float32Dtype"(pandas.core.arrays.floating.Float32DtypeT +(pandas.core.arrays.floating.Float64Dtype"(pandas.core.arrays.floating.Float64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.FloatDtypeArg +TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]F +Type[builtins.complex]$ +builtins.complex"builtins.complex"type7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ComplexDtypeArg$ +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimedeltaDtypeArg& +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimestampDtypeArg +RTypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]] +GUnion[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]X +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.CategoryDtypeArg +gTypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]] +\Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]C +Type[builtins.object]" +builtins.object"builtins.object"type7 +Literal[builtins.str]  + builtins.str" builtins.str= +Type[numpy.object_] + numpy.object_" numpy.object_"type7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ObjectDtypeArg +dTypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +YUnion[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]4 +Type[numpy.void] + +numpy.void" +numpy.void"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.VoidDtypeArg +STypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]] +HUnion[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]I +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtypeP +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype"pandas._typing.DtypeObj"pandas._typing.AstypeArg7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"(pandas.core.frame.DataFrame.AstypeArgExt) +builtins.list[Unknown]" builtins.list",pandas.core.frame.DataFrame.AstypeArgExtList +None 0:typing.overloadX + select_dtypes)pandas.core.frame.DataFrame.select_dtypes": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +include +6Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],builtins.list[Unknown]]],None] +6TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],builtins.list[Unknown]]] +6Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],builtins.list[Unknown]] +5TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +5Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]] +4TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]] +4Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]] +TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]= +Type[builtins.bool] + builtins.bool" builtins.bool"type7 +Literal[builtins.str]  + builtins.str" builtins.strR +'pandas.core.arrays.boolean.BooleanDtype"'pandas.core.arrays.boolean.BooleanDtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Type[numpy.bool_] + numpy.bool_" numpy.bool_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.BooleanDtypeArg& +TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: +Type[builtins.int] + builtins.int" builtins.int"type7 +Literal[builtins.str]  + builtins.str" builtins.strL +$pandas.core.arrays.integer.Int8Dtype"$pandas.core.arrays.integer.Int8DtypeN +%pandas.core.arrays.integer.Int16Dtype"%pandas.core.arrays.integer.Int16DtypeN +%pandas.core.arrays.integer.Int32Dtype"%pandas.core.arrays.integer.Int32DtypeN +%pandas.core.arrays.integer.Int64Dtype"%pandas.core.arrays.integer.Int64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +)Type[numpy.signedinteger[TypeAlias[Any]]]v +#numpy.signedinteger[TypeAlias[Any]]: +TypeAlias[Any] +Any"numpy._typing._nbit._NBitByte"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IntDtypeArg$ +TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]N +%pandas.core.arrays.integer.UInt8Dtype"%pandas.core.arrays.integer.UInt8DtypeP +&pandas.core.arrays.integer.UInt16Dtype"&pandas.core.arrays.integer.UInt16DtypeP +&pandas.core.arrays.integer.UInt32Dtype"&pandas.core.arrays.integer.UInt32DtypeP +&pandas.core.arrays.integer.UInt64Dtype"&pandas.core.arrays.integer.UInt64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.UIntDtypeArg +TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: +Type[builtins.str] + builtins.str" builtins.str"type7 +Literal[builtins.str]  + builtins.str" builtins.strP +&pandas.core.arrays.string_.StringDtype"&pandas.core.arrays.string_.StringDtype7 +Literal[builtins.str]  + builtins.str" builtins.str4 +Type[numpy.str_] + +numpy.str_" +numpy.str_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.StrDtypeArg +TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ +Type[builtins.bytes] +builtins.bytes"builtins.bytes"type7 +Literal[builtins.str]  + builtins.str" builtins.str: +Type[numpy.bytes_] + numpy.bytes_" numpy.bytes_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.BytesDtypeArg +TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ +Type[builtins.float] +builtins.float"builtins.float"type7 +Literal[builtins.str]  + builtins.str" builtins.strT +(pandas.core.arrays.floating.Float32Dtype"(pandas.core.arrays.floating.Float32DtypeT +(pandas.core.arrays.floating.Float64Dtype"(pandas.core.arrays.floating.Float64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.FloatDtypeArg +TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]F +Type[builtins.complex]$ +builtins.complex"builtins.complex"type7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ComplexDtypeArg$ +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimedeltaDtypeArg& +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimestampDtypeArg +RTypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]] +GUnion[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]X +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.CategoryDtypeArg +gTypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]] +\Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]C +Type[builtins.object]" +builtins.object"builtins.object"type7 +Literal[builtins.str]  + builtins.str" builtins.str= +Type[numpy.object_] + numpy.object_" numpy.object_"type7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ObjectDtypeArg +dTypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +YUnion[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]4 +Type[numpy.void] + +numpy.void" +numpy.void"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.VoidDtypeArg +STypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]] +HUnion[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]I +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtypeP +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype"pandas._typing.DtypeObj"pandas._typing.AstypeArg7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"(pandas.core.frame.DataFrame.AstypeArgExt) +builtins.list[Unknown]" builtins.list",pandas.core.frame.DataFrame.AstypeArgExtList +None*ŵ +exclude +6TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],builtins.list[Unknown]]] +6Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],builtins.list[Unknown]] +5TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +5Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]] +4TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]] +4Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]] +TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]= +Type[builtins.bool] + builtins.bool" builtins.bool"type7 +Literal[builtins.str]  + builtins.str" builtins.strR +'pandas.core.arrays.boolean.BooleanDtype"'pandas.core.arrays.boolean.BooleanDtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Type[numpy.bool_] + numpy.bool_" numpy.bool_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.BooleanDtypeArg& +TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: +Type[builtins.int] + builtins.int" builtins.int"type7 +Literal[builtins.str]  + builtins.str" builtins.strL +$pandas.core.arrays.integer.Int8Dtype"$pandas.core.arrays.integer.Int8DtypeN +%pandas.core.arrays.integer.Int16Dtype"%pandas.core.arrays.integer.Int16DtypeN +%pandas.core.arrays.integer.Int32Dtype"%pandas.core.arrays.integer.Int32DtypeN +%pandas.core.arrays.integer.Int64Dtype"%pandas.core.arrays.integer.Int64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +)Type[numpy.signedinteger[TypeAlias[Any]]]v +#numpy.signedinteger[TypeAlias[Any]]: +TypeAlias[Any] +Any"numpy._typing._nbit._NBitByte"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IntDtypeArg$ +TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]N +%pandas.core.arrays.integer.UInt8Dtype"%pandas.core.arrays.integer.UInt8DtypeP +&pandas.core.arrays.integer.UInt16Dtype"&pandas.core.arrays.integer.UInt16DtypeP +&pandas.core.arrays.integer.UInt32Dtype"&pandas.core.arrays.integer.UInt32DtypeP +&pandas.core.arrays.integer.UInt64Dtype"&pandas.core.arrays.integer.UInt64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.UIntDtypeArg +TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: +Type[builtins.str] + builtins.str" builtins.str"type7 +Literal[builtins.str]  + builtins.str" builtins.strP +&pandas.core.arrays.string_.StringDtype"&pandas.core.arrays.string_.StringDtype7 +Literal[builtins.str]  + builtins.str" builtins.str4 +Type[numpy.str_] + +numpy.str_" +numpy.str_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.StrDtypeArg +TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ +Type[builtins.bytes] +builtins.bytes"builtins.bytes"type7 +Literal[builtins.str]  + builtins.str" builtins.str: +Type[numpy.bytes_] + numpy.bytes_" numpy.bytes_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.BytesDtypeArg +TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ +Type[builtins.float] +builtins.float"builtins.float"type7 +Literal[builtins.str]  + builtins.str" builtins.strT +(pandas.core.arrays.floating.Float32Dtype"(pandas.core.arrays.floating.Float32DtypeT +(pandas.core.arrays.floating.Float64Dtype"(pandas.core.arrays.floating.Float64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.FloatDtypeArg +TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]F +Type[builtins.complex]$ +builtins.complex"builtins.complex"type7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ComplexDtypeArg$ +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimedeltaDtypeArg& +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimestampDtypeArg +RTypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]] +GUnion[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]X +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.CategoryDtypeArg +gTypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]] +\Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]C +Type[builtins.object]" +builtins.object"builtins.object"type7 +Literal[builtins.str]  + builtins.str" builtins.str= +Type[numpy.object_] + numpy.object_" numpy.object_"type7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ObjectDtypeArg +dTypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +YUnion[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]4 +Type[numpy.void] + +numpy.void" +numpy.void"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.VoidDtypeArg +STypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]] +HUnion[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]I +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtypeP +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype"pandas._typing.DtypeObj"pandas._typing.AstypeArg7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"(pandas.core.frame.DataFrame.AstypeArgExt) +builtins.list[Unknown]" builtins.list",pandas.core.frame.DataFrame.AstypeArgExtList0:typing.overloadX + select_dtypes)pandas.core.frame.DataFrame.select_dtypes": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*ŵ +exclude +6TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],builtins.list[Unknown]]] +6Union[TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],builtins.list[Unknown]] +5TypeAlias[Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +5Union[TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]] +4TypeAlias[Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]]] +4Union[TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]],TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]] +TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]= +Type[builtins.bool] + builtins.bool" builtins.bool"type7 +Literal[builtins.str]  + builtins.str" builtins.strR +'pandas.core.arrays.boolean.BooleanDtype"'pandas.core.arrays.boolean.BooleanDtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Type[numpy.bool_] + numpy.bool_" numpy.bool_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.BooleanDtypeArg& +TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: +Type[builtins.int] + builtins.int" builtins.int"type7 +Literal[builtins.str]  + builtins.str" builtins.strL +$pandas.core.arrays.integer.Int8Dtype"$pandas.core.arrays.integer.Int8DtypeN +%pandas.core.arrays.integer.Int16Dtype"%pandas.core.arrays.integer.Int16DtypeN +%pandas.core.arrays.integer.Int32Dtype"%pandas.core.arrays.integer.Int32DtypeN +%pandas.core.arrays.integer.Int64Dtype"%pandas.core.arrays.integer.Int64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +)Type[numpy.signedinteger[TypeAlias[Any]]]v +#numpy.signedinteger[TypeAlias[Any]]: +TypeAlias[Any] +Any"numpy._typing._nbit._NBitByte"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IntDtypeArg$ +TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]N +%pandas.core.arrays.integer.UInt8Dtype"%pandas.core.arrays.integer.UInt8DtypeP +&pandas.core.arrays.integer.UInt16Dtype"&pandas.core.arrays.integer.UInt16DtypeP +&pandas.core.arrays.integer.UInt32Dtype"&pandas.core.arrays.integer.UInt32DtypeP +&pandas.core.arrays.integer.UInt64Dtype"&pandas.core.arrays.integer.UInt64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.UIntDtypeArg +TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: +Type[builtins.str] + builtins.str" builtins.str"type7 +Literal[builtins.str]  + builtins.str" builtins.strP +&pandas.core.arrays.string_.StringDtype"&pandas.core.arrays.string_.StringDtype7 +Literal[builtins.str]  + builtins.str" builtins.str4 +Type[numpy.str_] + +numpy.str_" +numpy.str_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.StrDtypeArg +TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ +Type[builtins.bytes] +builtins.bytes"builtins.bytes"type7 +Literal[builtins.str]  + builtins.str" builtins.str: +Type[numpy.bytes_] + numpy.bytes_" numpy.bytes_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.BytesDtypeArg +TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ +Type[builtins.float] +builtins.float"builtins.float"type7 +Literal[builtins.str]  + builtins.str" builtins.strT +(pandas.core.arrays.floating.Float32Dtype"(pandas.core.arrays.floating.Float32DtypeT +(pandas.core.arrays.floating.Float64Dtype"(pandas.core.arrays.floating.Float64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.FloatDtypeArg +TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]F +Type[builtins.complex]$ +builtins.complex"builtins.complex"type7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ComplexDtypeArg$ +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimedeltaDtypeArg& +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimestampDtypeArg +RTypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]] +GUnion[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]X +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.CategoryDtypeArg +gTypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]] +\Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]C +Type[builtins.object]" +builtins.object"builtins.object"type7 +Literal[builtins.str]  + builtins.str" builtins.str= +Type[numpy.object_] + numpy.object_" numpy.object_"type7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ObjectDtypeArg +dTypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +YUnion[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]4 +Type[numpy.void] + +numpy.void" +numpy.void"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.VoidDtypeArg +STypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]] +HUnion[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]I +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtypeP +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype"pandas._typing.DtypeObj"pandas._typing.AstypeArg7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"(pandas.core.frame.DataFrame.AstypeArgExt) +builtins.list[Unknown]" builtins.list",pandas.core.frame.DataFrame.AstypeArgExtList0:typing.overloadX2^ +rename"pandas.core.frame.DataFrame.rename +rename"pandas.core.frame.DataFrame.rename" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +mapper +xUnion[TypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]],None] +lTypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]] +aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]] +:typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]] +Any +&TypeAlias[Union[typing.Hashable,None]]M +Union[typing.Hashable,None]" +typing.Hashable"typing.Hashable +None"pandas._typing.Label"typing.MappingK +CallableType[builtins.function]& +builtins.function"builtins.function"pandas._typing.Renamer +None * +index +xUnion[TypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]],None] +lTypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]] +aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]] +:typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]] +Any +&TypeAlias[Union[typing.Hashable,None]]M +Union[typing.Hashable,None]" +typing.Hashable"typing.Hashable +None"pandas._typing.Label"typing.MappingK +CallableType[builtins.function]& +builtins.function"builtins.function"pandas._typing.Renamer +None * +columns +xUnion[TypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]],None] +lTypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]] +aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]] +:typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]] +Any +&TypeAlias[Union[typing.Hashable,None]]M +Union[typing.Hashable,None]" +typing.Hashable"typing.Hashable +None"pandas._typing.Label"typing.MappingK +CallableType[builtins.function]& +builtins.function"builtins.function"pandas._typing.Renamer +None * +axis +Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis +None ** +copy + builtins.bool" builtins.bool *G +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX +rename"pandas.core.frame.DataFrame.rename": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +mapper +xUnion[TypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]],None] +lTypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]] +aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]] +:typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]] +Any +&TypeAlias[Union[typing.Hashable,None]]M +Union[typing.Hashable,None]" +typing.Hashable"typing.Hashable +None"pandas._typing.Label"typing.MappingK +CallableType[builtins.function]& +builtins.function"builtins.function"pandas._typing.Renamer +None * +index +xUnion[TypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]],None] +lTypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]] +aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]] +:typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]] +Any +&TypeAlias[Union[typing.Hashable,None]]M +Union[typing.Hashable,None]" +typing.Hashable"typing.Hashable +None"pandas._typing.Label"typing.MappingK +CallableType[builtins.function]& +builtins.function"builtins.function"pandas._typing.Renamer +None * +columns +xUnion[TypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]],None] +lTypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]] +aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]] +:typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]] +Any +&TypeAlias[Union[typing.Hashable,None]]M +Union[typing.Hashable,None]" +typing.Hashable"typing.Hashable +None"pandas._typing.Label"typing.MappingK +CallableType[builtins.function]& +builtins.function"builtins.function"pandas._typing.Renamer +None * +axis +Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis +None ** +copy + builtins.bool" builtins.bool *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool * +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX +rename"pandas.core.frame.DataFrame.rename"q +'Union[pandas.core.frame.DataFrame,None]: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +mapper +xUnion[TypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]],None] +lTypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]] +aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]] +:typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]] +Any +&TypeAlias[Union[typing.Hashable,None]]M +Union[typing.Hashable,None]" +typing.Hashable"typing.Hashable +None"pandas._typing.Label"typing.MappingK +CallableType[builtins.function]& +builtins.function"builtins.function"pandas._typing.Renamer +None * +index +xUnion[TypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]],None] +lTypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]] +aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]] +:typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]] +Any +&TypeAlias[Union[typing.Hashable,None]]M +Union[typing.Hashable,None]" +typing.Hashable"typing.Hashable +None"pandas._typing.Label"typing.MappingK +CallableType[builtins.function]& +builtins.function"builtins.function"pandas._typing.Renamer +None * +columns +xUnion[TypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]],None] +lTypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]] +aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]] +:typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]] +Any +&TypeAlias[Union[typing.Hashable,None]]M +Union[typing.Hashable,None]" +typing.Hashable"typing.Hashable +None"pandas._typing.Label"typing.MappingK +CallableType[builtins.function]& +builtins.function"builtins.function"pandas._typing.Renamer +None * +axis +Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis +None ** +copy + builtins.bool" builtins.bool *- +inplace + builtins.bool" builtins.bool * +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX2[ +fillna"pandas.core.frame.DataFrame.fillna +fillna"pandas.core.frame.DataFrame.fillna" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +value +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],pandas.core.series.Series[Any],pandas.core.frame.DataFrame,None] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.floatT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar: +pandas._libs.missing.NAType"pandas._libs.missing.NAType9 +builtins.dict[Any,Any] +Any +Any" builtins.dictD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame +None * +axis +Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis +None *) +limit + builtins.int" builtins.int *{ +downcastk +"Union[builtins.dict[Any,Any],None]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +None *G +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool0:typing.overloadX +fillna"pandas.core.frame.DataFrame.fillna": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +value +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],pandas.core.series.Series[Any],pandas.core.frame.DataFrame,None] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.floatT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar: +pandas._libs.missing.NAType"pandas._libs.missing.NAType9 +builtins.dict[Any,Any] +Any +Any" builtins.dictD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame +None * +axis +Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis +None *) +limit + builtins.int" builtins.int *{ +downcastk +"Union[builtins.dict[Any,Any],None]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +None *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool 0:typing.overloadX +fillna"pandas.core.frame.DataFrame.fillna"q +'Union[pandas.core.frame.DataFrame,None]: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +value +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],pandas.core.series.Series[Any],pandas.core.frame.DataFrame,None] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.floatT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar: +pandas._libs.missing.NAType"pandas._libs.missing.NAType9 +builtins.dict[Any,Any] +Any +Any" builtins.dictD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame +None * +axis +Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis +None *V +inplaceG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None *) +limit + builtins.int" builtins.int *{ +downcastk +"Union[builtins.dict[Any,Any],None]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +None 0:typing.overloadX2J +replace#pandas.core.frame.DataFrame.replace +replace#pandas.core.frame.DataFrame.replace" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* + +to_replace +Any * +value +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,typing.Sequence[Any],typing.Mapping[Any,Any],re.Pattern[Any],None] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.floatT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar: +pandas._libs.missing.NAType"pandas._libs.missing.NAType0 +typing.Sequence[Any] +Any"typing.Sequence; +typing.Mapping[Any,Any] +Any +Any"typing.Mapping& +re.Pattern[Any] +Any" +re.Pattern +None *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None * +regex +Any * +method +STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ReplaceMethod *G +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool0:typing.overloadX +replace#pandas.core.frame.DataFrame.replace": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* + +to_replace +Any * +value +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,typing.Sequence[Any],typing.Mapping[Any,Any],re.Pattern[Any],None] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.floatT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar: +pandas._libs.missing.NAType"pandas._libs.missing.NAType0 +typing.Sequence[Any] +Any"typing.Sequence; +typing.Mapping[Any,Any] +Any +Any"typing.Mapping& +re.Pattern[Any] +Any" +re.Pattern +None *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None * +regex +Any * +method +STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ReplaceMethod 0:typing.overloadX +replace#pandas.core.frame.DataFrame.replace"q +'Union[pandas.core.frame.DataFrame,None]: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* + +to_replace +Any * +value +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,typing.Sequence[Any],typing.Mapping[Any,Any],re.Pattern[Any],None] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.floatT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar: +pandas._libs.missing.NAType"pandas._libs.missing.NAType0 +typing.Sequence[Any] +Any"typing.Sequence; +typing.Mapping[Any,Any] +Any +Any"typing.Mapping& +re.Pattern[Any] +Any" +re.Pattern +None *V +inplaceG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None * +regex +Any * +method +STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ReplaceMethod 0:typing.overloadX2 + set_index%pandas.core.frame.DataFrame.set_index + set_index%pandas.core.frame.DataFrame.set_index" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +keys +Union[TypeAlias[Union[typing.Hashable,None]],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],typing.Iterator[pandas._typing.HashableT],builtins.list[pandas._typing.HashableT]] +&TypeAlias[Union[typing.Hashable,None]]M +Union[typing.Hashable,None]" +typing.Hashable"typing.Hashable +None"pandas._typing.LabelD +pandas.core.series.Series[Any] +Any"pandas.core.series.SeriesN +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray +)typing.Iterator[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable"typing.Iterator +'builtins.list[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable" builtins.list** +drop + builtins.bool" builtins.bool *, +append + builtins.bool" builtins.bool *6 +verify_integrity + builtins.bool" builtins.bool *G +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool0:typing.overloadX + + set_index%pandas.core.frame.DataFrame.set_index": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +keys +Union[TypeAlias[Union[typing.Hashable,None]],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],typing.Iterator[pandas._typing.HashableT],builtins.list[pandas._typing.HashableT]] +&TypeAlias[Union[typing.Hashable,None]]M +Union[typing.Hashable,None]" +typing.Hashable"typing.Hashable +None"pandas._typing.LabelD +pandas.core.series.Series[Any] +Any"pandas.core.series.SeriesN +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray +)typing.Iterator[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable"typing.Iterator +'builtins.list[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable" builtins.list** +drop + builtins.bool" builtins.bool *, +append + builtins.bool" builtins.bool *6 +verify_integrity + builtins.bool" builtins.bool *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool 0:typing.overloadX2 + reset_index'pandas.core.frame.DataFrame.reset_index + reset_index'pandas.core.frame.DataFrame.reset_index" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +level +NUnion[TypeAlias[Union[typing.Hashable,builtins.int]],typing.Sequence[Unknown]] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level- +typing.Sequence[Unknown]"typing.Sequence ** +drop + builtins.bool" builtins.bool *q + col_level` + Union[builtins.int,builtins.str] + builtins.int" builtins.int + builtins.str" builtins.str *2 +col_fill" +typing.Hashable"typing.Hashable *G +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool*6 +allow_duplicates + builtins.bool" builtins.bool * +names +>Union[typing.Hashable,builtins.list[pandas._typing.HashableT]]" +typing.Hashable"typing.Hashable +'builtins.list[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable" builtins.list 0:typing.overloadX + reset_index'pandas.core.frame.DataFrame.reset_index": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +level +NUnion[TypeAlias[Union[typing.Hashable,builtins.int]],typing.Sequence[Unknown]] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level- +typing.Sequence[Unknown]"typing.Sequence *q + col_level` + Union[builtins.int,builtins.str] + builtins.int" builtins.int + builtins.str" builtins.str *2 +col_fill" +typing.Hashable"typing.Hashable ** +drop + builtins.bool" builtins.bool *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool *6 +allow_duplicates + builtins.bool" builtins.bool * +names +>Union[typing.Hashable,builtins.list[pandas._typing.HashableT]]" +typing.Hashable"typing.Hashable +'builtins.list[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable" builtins.list 0:typing.overloadX + reset_index'pandas.core.frame.DataFrame.reset_index"q +'Union[pandas.core.frame.DataFrame,None]: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +level +NUnion[TypeAlias[Union[typing.Hashable,builtins.int]],typing.Sequence[Unknown]] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level- +typing.Sequence[Unknown]"typing.Sequence ** +drop + builtins.bool" builtins.bool *V +inplaceG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None *q + col_level` + Union[builtins.int,builtins.str] + builtins.int" builtins.int + builtins.str" builtins.str *2 +col_fill" +typing.Hashable"typing.Hashable *6 +allow_duplicates + builtins.bool" builtins.bool * +names +>Union[typing.Hashable,builtins.list[pandas._typing.HashableT]]" +typing.Hashable"typing.Hashable +'builtins.list[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable" builtins.list 0:typing.overloadX2` +dropna"pandas.core.frame.DataFrame.dropna +dropna"pandas.core.frame.DataFrame.dropna" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * +how +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str *R +threshD +Union[builtins.int,None] + builtins.int" builtins.int +None * +subset +Union[TypeAlias[Union[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],None] +TypeAlias[Union[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]] +uUnion[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]0 +typing.Sequence[Any] +Any"typing.Sequence9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarrayD +pandas.core.series.Series[Any] +Any"pandas.core.series.SeriesN +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index"pandas._typing.ListLikeU +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.floatT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar +None *G +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool0:typing.overloadX +dropna"pandas.core.frame.DataFrame.dropna": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * +how +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str *R +threshD +Union[builtins.int,None] + builtins.int" builtins.int +None * +subset +Union[TypeAlias[Union[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],None] +TypeAlias[Union[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]] +uUnion[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]0 +typing.Sequence[Any] +Any"typing.Sequence9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarrayD +pandas.core.series.Series[Any] +Any"pandas.core.series.SeriesN +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index"pandas._typing.ListLikeU +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.floatT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar +None *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool 0:typing.overloadX +dropna"pandas.core.frame.DataFrame.dropna"q +'Union[pandas.core.frame.DataFrame,None]: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * +how +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str *R +threshD +Union[builtins.int,None] + builtins.int" builtins.int +None * +subset +Union[TypeAlias[Union[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],None] +TypeAlias[Union[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]] +uUnion[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]0 +typing.Sequence[Any] +Any"typing.Sequence9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarrayD +pandas.core.series.Series[Any] +Any"pandas.core.series.SeriesN +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index"pandas._typing.ListLikeU +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.floatT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar +None *V +inplaceG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None 0:typing.overloadX2: + sort_values'pandas.core.frame.DataFrame.sort_values + sort_values'pandas.core.frame.DataFrame.sort_values" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +by +1Union[builtins.str,typing.Sequence[builtins.str]] + builtins.str" builtins.strN +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.Sequence* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * + ascending +3Union[builtins.bool,typing.Sequence[builtins.bool]] + builtins.bool" builtins.boolQ +typing.Sequence[builtins.bool] + builtins.bool" builtins.bool"typing.Sequence * +kind +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.SortKind * + na_position +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.NaPosition *2 + ignore_index + builtins.bool" builtins.bool *G +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool* +key ++Union[CallableType[builtins.function],None]K +CallableType[builtins.function]& +builtins.function"builtins.function +None 0:typing.overloadX + sort_values'pandas.core.frame.DataFrame.sort_values": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +by +1Union[builtins.str,typing.Sequence[builtins.str]] + builtins.str" builtins.strN +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.Sequence* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * + ascending +3Union[builtins.bool,typing.Sequence[builtins.bool]] + builtins.bool" builtins.boolQ +typing.Sequence[builtins.bool] + builtins.bool" builtins.bool"typing.Sequence * +kind +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.SortKind * + na_position +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.NaPosition *2 + ignore_index + builtins.bool" builtins.bool *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool * +key ++Union[CallableType[builtins.function],None]K +CallableType[builtins.function]& +builtins.function"builtins.function +None 0:typing.overloadX + sort_values'pandas.core.frame.DataFrame.sort_values"q +'Union[pandas.core.frame.DataFrame,None]: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +by +1Union[builtins.str,typing.Sequence[builtins.str]] + builtins.str" builtins.strN +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.Sequence* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * + ascending +3Union[builtins.bool,typing.Sequence[builtins.bool]] + builtins.bool" builtins.boolQ +typing.Sequence[builtins.bool] + builtins.bool" builtins.bool"typing.Sequence *V +inplaceG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None * +kind +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.SortKind * + na_position +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.NaPosition *2 + ignore_index + builtins.bool" builtins.bool * +key ++Union[CallableType[builtins.function],None]K +CallableType[builtins.function]& +builtins.function"builtins.function +None 0:typing.overloadX2A + +sort_index&pandas.core.frame.DataFrame.sort_index + +sort_index&pandas.core.frame.DataFrame.sort_index" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None * + ascending +3Union[builtins.bool,typing.Sequence[builtins.bool]] + builtins.bool" builtins.boolQ +typing.Sequence[builtins.bool] + builtins.bool" builtins.bool"typing.Sequence * +kind +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.SortKind * + na_position +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.NaPosition *4 +sort_remaining + builtins.bool" builtins.bool *2 + ignore_index + builtins.bool" builtins.bool *G +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool* +key ++Union[CallableType[builtins.function],None]K +CallableType[builtins.function]& +builtins.function"builtins.function +None 0:typing.overloadX + +sort_index&pandas.core.frame.DataFrame.sort_index": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * +level +rUnion[TypeAlias[Union[typing.Hashable,builtins.int]],builtins.list[builtins.int],builtins.list[builtins.str],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.LevelJ +builtins.list[builtins.int] + builtins.int" builtins.int" builtins.listJ +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list +None * + ascending +3Union[builtins.bool,typing.Sequence[builtins.bool]] + builtins.bool" builtins.boolQ +typing.Sequence[builtins.bool] + builtins.bool" builtins.bool"typing.Sequence * +kind +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.SortKind * + na_position +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.NaPosition *4 +sort_remaining + builtins.bool" builtins.bool *2 + ignore_index + builtins.bool" builtins.bool *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool * +key ++Union[CallableType[builtins.function],None]K +CallableType[builtins.function]& +builtins.function"builtins.function +None 0:typing.overloadX + +sort_index&pandas.core.frame.DataFrame.sort_index"q +'Union[pandas.core.frame.DataFrame,None]: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * +level +rUnion[TypeAlias[Union[typing.Hashable,builtins.int]],builtins.list[builtins.int],builtins.list[builtins.str],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.LevelJ +builtins.list[builtins.int] + builtins.int" builtins.int" builtins.listJ +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list +None * + ascending +3Union[builtins.bool,typing.Sequence[builtins.bool]] + builtins.bool" builtins.boolQ +typing.Sequence[builtins.bool] + builtins.bool" builtins.bool"typing.Sequence *V +inplaceG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None * +kind +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.SortKind * + na_position +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.NaPosition *4 +sort_remaining + builtins.bool" builtins.bool *2 + ignore_index + builtins.bool" builtins.bool * +key ++Union[CallableType[builtins.function],None]K +CallableType[builtins.function]& +builtins.function"builtins.function +None 0:typing.overloadX2 + + value_counts(pandas.core.frame.DataFrame.value_counts + value_counts(pandas.core.frame.DataFrame.value_counts"b +'pandas.core.series.Series[builtins.int] + builtins.int" builtins.int"pandas.core.series.Series*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +subset +,Union[typing.Sequence[typing.Hashable],None]W + typing.Sequence[typing.Hashable]" +typing.Hashable"typing.Hashable"typing.Sequence +None *K + normalize: +Literal[builtins.bool]  + builtins.bool" builtins.bool ** +sort + builtins.bool" builtins.bool */ + ascending + builtins.bool" builtins.bool *, +dropna + builtins.bool" builtins.bool 0:typing.overloadX + value_counts(pandas.core.frame.DataFrame.value_counts"h +)pandas.core.series.Series[builtins.float] +builtins.float"builtins.float"pandas.core.series.Series*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*I + normalize: +Literal[builtins.bool]  + builtins.bool" builtins.bool* +subset +,Union[typing.Sequence[typing.Hashable],None]W + typing.Sequence[typing.Hashable]" +typing.Hashable"typing.Hashable"typing.Sequence +None ** +sort + builtins.bool" builtins.bool */ + ascending + builtins.bool" builtins.bool *, +dropna + builtins.bool" builtins.bool 0:typing.overloadX2 +groupby#pandas.core.frame.DataFrame.groupby* +groupby#pandas.core.frame.DataFrame.groupby" +pandas.core.groupby.generic.DataFrameGroupBy[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]]] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.floatT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar",pandas.core.groupby.generic.DataFrameGroupBy*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +by +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.floatT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar* +axis +tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Literal[pandas._libs.lib._NoDefault]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault * +level +NUnion[TypeAlias[Union[typing.Hashable,typing.Sequence[typing.Hashable]]],None] +BTypeAlias[Union[typing.Hashable,typing.Sequence[typing.Hashable]]] +7Union[typing.Hashable,typing.Sequence[typing.Hashable]]" +typing.Hashable"typing.HashableW + typing.Sequence[typing.Hashable]" +typing.Hashable"typing.Hashable"typing.Sequence"pandas._typing.IndexLabel +None *. +as_index + builtins.bool" builtins.bool ** +sort + builtins.bool" builtins.bool *0 + +group_keys + builtins.bool" builtins.bool * +observed +DUnion[builtins.bool,TypeAlias[Literal[pandas._libs.lib._NoDefault]]] + builtins.bool" builtins.bool +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault *, +dropna + builtins.bool" builtins.bool 0:typing.overloadX +groupby#pandas.core.frame.DataFrame.groupby" +Vpandas.core.groupby.generic.DataFrameGroupBy[pandas._libs.tslibs.timestamps.Timestamp]T +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp",pandas.core.groupby.generic.DataFrameGroupBy*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*b +byZ ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* +axis +tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Literal[pandas._libs.lib._NoDefault]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault * +level +NUnion[TypeAlias[Union[typing.Hashable,typing.Sequence[typing.Hashable]]],None] +BTypeAlias[Union[typing.Hashable,typing.Sequence[typing.Hashable]]] +7Union[typing.Hashable,typing.Sequence[typing.Hashable]]" +typing.Hashable"typing.HashableW + typing.Sequence[typing.Hashable]" +typing.Hashable"typing.Hashable"typing.Sequence"pandas._typing.IndexLabel +None *. +as_index + builtins.bool" builtins.bool ** +sort + builtins.bool" builtins.bool *0 + +group_keys + builtins.bool" builtins.bool * +observed +DUnion[builtins.bool,TypeAlias[Literal[pandas._libs.lib._NoDefault]]] + builtins.bool" builtins.bool +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault *, +dropna + builtins.bool" builtins.bool 0:typing.overloadX +groupby#pandas.core.frame.DataFrame.groupby" +Vpandas.core.groupby.generic.DataFrameGroupBy[pandas._libs.tslibs.timedeltas.Timedelta]T +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta",pandas.core.groupby.generic.DataFrameGroupBy*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*f +by^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex* +axis +tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Literal[pandas._libs.lib._NoDefault]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault * +level +NUnion[TypeAlias[Union[typing.Hashable,typing.Sequence[typing.Hashable]]],None] +BTypeAlias[Union[typing.Hashable,typing.Sequence[typing.Hashable]]] +7Union[typing.Hashable,typing.Sequence[typing.Hashable]]" +typing.Hashable"typing.HashableW + typing.Sequence[typing.Hashable]" +typing.Hashable"typing.Hashable"typing.Sequence"pandas._typing.IndexLabel +None *. +as_index + builtins.bool" builtins.bool ** +sort + builtins.bool" builtins.bool *0 + +group_keys + builtins.bool" builtins.bool * +observed +DUnion[builtins.bool,TypeAlias[Literal[pandas._libs.lib._NoDefault]]] + builtins.bool" builtins.bool +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault *, +dropna + builtins.bool" builtins.bool 0:typing.overloadX +groupby#pandas.core.frame.DataFrame.groupby" +Opandas.core.groupby.generic.DataFrameGroupBy[pandas._libs.tslibs.period.Period]F +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period",pandas.core.groupby.generic.DataFrameGroupBy*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*X +byP +&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex* +axis +tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Literal[pandas._libs.lib._NoDefault]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault * +level +NUnion[TypeAlias[Union[typing.Hashable,typing.Sequence[typing.Hashable]]],None] +BTypeAlias[Union[typing.Hashable,typing.Sequence[typing.Hashable]]] +7Union[typing.Hashable,typing.Sequence[typing.Hashable]]" +typing.Hashable"typing.HashableW + typing.Sequence[typing.Hashable]" +typing.Hashable"typing.Hashable"typing.Sequence"pandas._typing.IndexLabel +None *. +as_index + builtins.bool" builtins.bool ** +sort + builtins.bool" builtins.bool *0 + +group_keys + builtins.bool" builtins.bool * +observed +DUnion[builtins.bool,TypeAlias[Literal[pandas._libs.lib._NoDefault]]] + builtins.bool" builtins.bool +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault *, +dropna + builtins.bool" builtins.bool 0:typing.overloadX +groupby#pandas.core.frame.DataFrame.groupby" +Fpandas.core.groupby.generic.DataFrameGroupBy[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval",pandas.core.groupby.generic.DataFrameGroupBy*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +by +Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] +pandas._typing.IntervalTN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* +axis +tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Literal[pandas._libs.lib._NoDefault]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault * +level +NUnion[TypeAlias[Union[typing.Hashable,typing.Sequence[typing.Hashable]]],None] +BTypeAlias[Union[typing.Hashable,typing.Sequence[typing.Hashable]]] +7Union[typing.Hashable,typing.Sequence[typing.Hashable]]" +typing.Hashable"typing.HashableW + typing.Sequence[typing.Hashable]" +typing.Hashable"typing.Hashable"typing.Sequence"pandas._typing.IndexLabel +None *. +as_index + builtins.bool" builtins.bool ** +sort + builtins.bool" builtins.bool *0 + +group_keys + builtins.bool" builtins.bool * +observed +DUnion[builtins.bool,TypeAlias[Literal[pandas._libs.lib._NoDefault]]] + builtins.bool" builtins.bool +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault *, +dropna + builtins.bool" builtins.bool 0:typing.overloadX' +groupby#pandas.core.frame.DataFrame.groupby" +Apandas.core.groupby.generic.DataFrameGroupBy[builtins.tuple[Any]]. +builtins.tuple[Any] +Any"builtins.tuple",pandas.core.groupby.generic.DataFrameGroupBy*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +by +Union[pandas.core.indexes.multi.MultiIndex,TypeAlias[Union[builtins.tuple[Any],builtins.list[pandas._typing._HashableTa],TypeAlias[Union[numpy.ufunc,CallableType[builtins.function]]],builtins.list[Unknown],builtins.list[pandas.core.series.Series[Any]],numpy.ndarray[Any,Any],builtins.list[numpy.ndarray[Any,Any]],typing.Mapping[TypeAlias[Union[typing.Hashable,None]],Any],builtins.list[typing.Mapping[Unknown,Any]],builtins.list[pandas.core.indexes.base.Index[Any]],pandas.core.groupby.grouper.Grouper,builtins.list[pandas.core.groupby.grouper.Grouper]]],None]L +$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex +TypeAlias[Union[builtins.tuple[Any],builtins.list[pandas._typing._HashableTa],TypeAlias[Union[numpy.ufunc,CallableType[builtins.function]]],builtins.list[Unknown],builtins.list[pandas.core.series.Series[Any]],numpy.ndarray[Any,Any],builtins.list[numpy.ndarray[Any,Any]],typing.Mapping[TypeAlias[Union[typing.Hashable,None]],Any],builtins.list[typing.Mapping[Unknown,Any]],builtins.list[pandas.core.indexes.base.Index[Any]],pandas.core.groupby.grouper.Grouper,builtins.list[pandas.core.groupby.grouper.Grouper]]] +Union[builtins.tuple[Any],builtins.list[pandas._typing._HashableTa],TypeAlias[Union[numpy.ufunc,CallableType[builtins.function]]],builtins.list[Unknown],builtins.list[pandas.core.series.Series[Any]],numpy.ndarray[Any,Any],builtins.list[numpy.ndarray[Any,Any]],typing.Mapping[TypeAlias[Union[typing.Hashable,None]],Any],builtins.list[typing.Mapping[Unknown,Any]],builtins.list[pandas.core.indexes.base.Index[Any]],pandas.core.groupby.grouper.Grouper,builtins.list[pandas.core.groupby.grouper.Grouper]]. +builtins.tuple[Any] +Any"builtins.tuple +)builtins.list[pandas._typing._HashableTa]S +pandas._typing._HashableTa" +typing.Hashable"typing.Hashable"typing.Hashable" builtins.list +=TypeAlias[Union[numpy.ufunc,CallableType[builtins.function]]] +2Union[numpy.ufunc,CallableType[builtins.function]] + numpy.ufunc" numpy.ufuncK +CallableType[builtins.function]& +builtins.function"builtins.function"pandas._typing.Function) +builtins.list[Unknown]" builtins.list +-builtins.list[pandas.core.series.Series[Any]]D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series" builtins.list9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarrayq +%builtins.list[numpy.ndarray[Any,Any]]9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.list +:typing.Mapping[TypeAlias[Union[typing.Hashable,None]],Any] +&TypeAlias[Union[typing.Hashable,None]]M +Union[typing.Hashable,None]" +typing.Hashable"typing.Hashable +None"pandas._typing.Label +Any"typing.Mappingu +*builtins.list[typing.Mapping[Unknown,Any]]8 +typing.Mapping[Unknown,Any] +Any"typing.Mapping" builtins.list +2builtins.list[pandas.core.indexes.base.Index[Any]]N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index" builtins.listJ +#pandas.core.groupby.grouper.Grouper"#pandas.core.groupby.grouper.Grouper +2builtins.list[pandas.core.groupby.grouper.Grouper]J +#pandas.core.groupby.grouper.Grouper"#pandas.core.groupby.grouper.Grouper" builtins.list"%pandas._typing.GroupByObjectNonScalar +None * +axis +tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Literal[pandas._libs.lib._NoDefault]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault * +level +NUnion[TypeAlias[Union[typing.Hashable,typing.Sequence[typing.Hashable]]],None] +BTypeAlias[Union[typing.Hashable,typing.Sequence[typing.Hashable]]] +7Union[typing.Hashable,typing.Sequence[typing.Hashable]]" +typing.Hashable"typing.HashableW + typing.Sequence[typing.Hashable]" +typing.Hashable"typing.Hashable"typing.Sequence"pandas._typing.IndexLabel +None *. +as_index + builtins.bool" builtins.bool ** +sort + builtins.bool" builtins.bool *0 + +group_keys + builtins.bool" builtins.bool * +observed +DUnion[builtins.bool,TypeAlias[Literal[pandas._libs.lib._NoDefault]]] + builtins.bool" builtins.bool +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault *, +dropna + builtins.bool" builtins.bool 0:typing.overloadX" +groupby#pandas.core.frame.DataFrame.groupby" +Fpandas.core.groupby.generic.DataFrameGroupBy[pandas._typing.SeriesByT] + +pandas._typing.SeriesByT +Union[builtins.str,builtins.bytes,datetime.date,builtins.bool,builtins.int,builtins.float,builtins.complex,datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]]] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period +pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.int" builtins.int +builtins.float"builtins.floatT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.Interval",pandas.core.groupby.generic.DataFrameGroupBy*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* + +by + +3pandas.core.series.Series[pandas._typing.SeriesByT] + +pandas._typing.SeriesByT +Union[builtins.str,builtins.bytes,datetime.date,builtins.bool,builtins.int,builtins.float,builtins.complex,datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]]] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period +pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.int" builtins.int +builtins.float"builtins.floatT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.Interval"pandas.core.series.Series* +axis +tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Literal[pandas._libs.lib._NoDefault]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault * +level +NUnion[TypeAlias[Union[typing.Hashable,typing.Sequence[typing.Hashable]]],None] +BTypeAlias[Union[typing.Hashable,typing.Sequence[typing.Hashable]]] +7Union[typing.Hashable,typing.Sequence[typing.Hashable]]" +typing.Hashable"typing.HashableW + typing.Sequence[typing.Hashable]" +typing.Hashable"typing.Hashable"typing.Sequence"pandas._typing.IndexLabel +None *. +as_index + builtins.bool" builtins.bool ** +sort + builtins.bool" builtins.bool *0 + +group_keys + builtins.bool" builtins.bool * +observed +DUnion[builtins.bool,TypeAlias[Literal[pandas._libs.lib._NoDefault]]] + builtins.bool" builtins.bool +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault *, +dropna + builtins.bool" builtins.bool 0:typing.overloadX +groupby#pandas.core.frame.DataFrame.groupby"j +1pandas.core.groupby.generic.DataFrameGroupBy[Any] +Any",pandas.core.groupby.generic.DataFrameGroupBy*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +by +|Union[pandas.core.indexes.category.CategoricalIndex[Any],pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any]]l +2pandas.core.indexes.category.CategoricalIndex[Any] +Any"-pandas.core.indexes.category.CategoricalIndexN +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series* +axis +tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Literal[pandas._libs.lib._NoDefault]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault * +level +NUnion[TypeAlias[Union[typing.Hashable,typing.Sequence[typing.Hashable]]],None] +BTypeAlias[Union[typing.Hashable,typing.Sequence[typing.Hashable]]] +7Union[typing.Hashable,typing.Sequence[typing.Hashable]]" +typing.Hashable"typing.HashableW + typing.Sequence[typing.Hashable]" +typing.Hashable"typing.Hashable"typing.Sequence"pandas._typing.IndexLabel +None *. +as_index + builtins.bool" builtins.bool ** +sort + builtins.bool" builtins.bool *0 + +group_keys + builtins.bool" builtins.bool * +observed +DUnion[builtins.bool,TypeAlias[Literal[pandas._libs.lib._NoDefault]]] + builtins.bool" builtins.bool +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault *, +dropna + builtins.bool" builtins.bool 0:typing.overloadX2 +stack!pandas.core.frame.DataFrame.stack +stack!pandas.core.frame.DataFrame.stack" +AUnion[pandas.core.frame.DataFrame,pandas.core.series.Series[Any]]: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrameD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +level +LUnion[TypeAlias[Union[typing.Hashable,builtins.int]],builtins.list[Unknown]] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level) +builtins.list[Unknown]" builtins.list *, +dropna + builtins.bool" builtins.bool ** +sort + builtins.bool" builtins.bool 0:typing.overloadX +stack!pandas.core.frame.DataFrame.stack" +AUnion[pandas.core.frame.DataFrame,pandas.core.series.Series[Any]]: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrameD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +level +LUnion[TypeAlias[Union[typing.Hashable,builtins.int]],builtins.list[Unknown]] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level) +builtins.list[Unknown]" builtins.list *2 + future_stack + builtins.bool" builtins.bool 0:typing.overloadX2 +aggpandas.core.frame.DataFrame.agg +aggpandas.core.frame.DataFrame.agg"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +func +Union[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]],TypeAlias[typing.Mapping[pandas._typing.HashableT,Unknown]]] +JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] +?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K +CallableType[builtins.function]& +builtins.function"builtins.function + builtins.str" builtins.str + numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase +;TypeAlias[typing.Mapping[pandas._typing.HashableT,Unknown]] +0typing.Mapping[pandas._typing.HashableT,Unknown]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable"typing.Mapping"$pandas._typing.AggFuncTypeDictSeries* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * +kwargs +Any0:typing.overloadX +aggpandas.core.frame.DataFrame.agg": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +func +Union[builtins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]],TypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]]] +Ybuiltins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]] +JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] +?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K +CallableType[builtins.function]& +builtins.function"builtins.function + builtins.str" builtins.str + numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase" builtins.list +YTypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]] +Ntyping.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.HashableV +%Union[Unknown,builtins.list[Unknown]]) +builtins.list[Unknown]" builtins.list"typing.Mapping"#pandas._typing.AggFuncTypeDictFrame * +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * +kwargs +Any0:typing.overloadX2 + aggregate%pandas.core.frame.DataFrame.aggregate + aggregate%pandas.core.frame.DataFrame.aggregate"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +func +Union[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]],TypeAlias[typing.Mapping[pandas._typing.HashableT,Unknown]]] +JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] +?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K +CallableType[builtins.function]& +builtins.function"builtins.function + builtins.str" builtins.str + numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase +;TypeAlias[typing.Mapping[pandas._typing.HashableT,Unknown]] +0typing.Mapping[pandas._typing.HashableT,Unknown]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable"typing.Mapping"$pandas._typing.AggFuncTypeDictSeries* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * +kwargs +Any0:typing.overloadX + aggregate%pandas.core.frame.DataFrame.aggregate": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +func +Union[builtins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]],TypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]]] +Ybuiltins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]] +JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] +?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K +CallableType[builtins.function]& +builtins.function"builtins.function + builtins.str" builtins.str + numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase" builtins.list +YTypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]] +Ntyping.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.HashableV +%Union[Unknown,builtins.list[Unknown]]) +builtins.list[Unknown]" builtins.list"typing.Mapping"#pandas._typing.AggFuncTypeDictFrame* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * +kwargs +Any0:typing.overloadX2 +apply!pandas.core.frame.DataFrame.apply +apply!pandas.core.frame.DataFrame.apply": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R +fK +CallableType[builtins.function]& +builtins.function"builtins.function* +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex *) +raw + builtins.bool" builtins.bool * + result_type +None * +args +Any * +kwargs +Any0:typing.overloadX +apply!pandas.core.frame.DataFrame.apply" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R +fK +CallableType[builtins.function]& +builtins.function"builtins.function* +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex *) +raw + builtins.bool" builtins.bool * + result_type +None * +args +Any * +kwargs +Any0:typing.overloadX +apply!pandas.core.frame.DataFrame.apply"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R +fK +CallableType[builtins.function]& +builtins.function"builtins.function* +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex *) +raw + builtins.bool" builtins.bool * + result_type +None * +args +Any * +kwargs +Any0:typing.overloadX +apply!pandas.core.frame.DataFrame.apply" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R +fK +CallableType[builtins.function]& +builtins.function"builtins.function* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *) +raw + builtins.bool" builtins.bool * +args +Any * + result_type +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str* +kwargs +Any0:typing.overloadX + +apply!pandas.core.frame.DataFrame.apply": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R +fK +CallableType[builtins.function]& +builtins.function"builtins.function* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *) +raw + builtins.bool" builtins.bool * +args +Any *H + result_type7 +Literal[builtins.str]  + builtins.str" builtins.str* +kwargs +Any0:typing.overloadX + +apply!pandas.core.frame.DataFrame.apply"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R +fK +CallableType[builtins.function]& +builtins.function"builtins.function* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *) +raw + builtins.bool" builtins.bool * +args +Any *H + result_type7 +Literal[builtins.str]  + builtins.str" builtins.str* +kwargs +Any0:typing.overloadX + +apply!pandas.core.frame.DataFrame.apply": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R +fK +CallableType[builtins.function]& +builtins.function"builtins.function* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *) +raw + builtins.bool" builtins.bool * +args +Any *H + result_type7 +Literal[builtins.str]  + builtins.str" builtins.str* +kwargs +Any0:typing.overloadX +apply!pandas.core.frame.DataFrame.apply"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R +fK +CallableType[builtins.function]& +builtins.function"builtins.function* +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex *) +raw + builtins.bool" builtins.bool * +args +Any *H + result_type7 +Literal[builtins.str]  + builtins.str" builtins.str* +kwargs +Any0:typing.overloadX +apply!pandas.core.frame.DataFrame.apply" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R +fK +CallableType[builtins.function]& +builtins.function"builtins.function*) +raw + builtins.bool" builtins.bool * + result_type +None * +args +Any * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn* +kwargs +Any0:typing.overloadX +apply!pandas.core.frame.DataFrame.apply"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R +fK +CallableType[builtins.function]& +builtins.function"builtins.function*) +raw + builtins.bool" builtins.bool * + result_type +None * +args +Any * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn* +kwargs +Any0:typing.overloadX +apply!pandas.core.frame.DataFrame.apply": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R +fK +CallableType[builtins.function]& +builtins.function"builtins.function*) +raw + builtins.bool" builtins.bool * + result_type +None * +args +Any * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn* +kwargs +Any0:typing.overloadX +apply!pandas.core.frame.DataFrame.apply": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*R +fK +CallableType[builtins.function]& +builtins.function"builtins.function*) +raw + builtins.bool" builtins.bool * +args +Any * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn*H + result_type7 +Literal[builtins.str]  + builtins.str" builtins.str* +kwargs +Any0:typing.overloadX2 +count!pandas.core.frame.DataFrame.count + +count!pandas.core.frame.DataFrame.count": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *2 + numeric_only + builtins.bool" builtins.bool * +level +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level0:typing.overloadX +count!pandas.core.frame.DataFrame.count"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * +level +None *2 + numeric_only + builtins.bool" builtins.bool 0:typing.overloadX2 +mode pandas.core.frame.DataFrame.mode + +mode pandas.core.frame.DataFrame.mode": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *, +skipna + builtins.bool" builtins.bool *2 + numeric_only + builtins.bool" builtins.bool * +level +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level* +kwargs +Any0:typing.overloadX +mode pandas.core.frame.DataFrame.mode"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *, +skipna + builtins.bool" builtins.bool * +level +None *2 + numeric_only + builtins.bool" builtins.bool * +kwargs +Any0:typing.overloadX2! +quantile$pandas.core.frame.DataFrame.quantile +quantile$pandas.core.frame.DataFrame.quantile"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*) +q +builtins.float"builtins.float * +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *2 + numeric_only + builtins.bool" builtins.bool * + interpolation +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +tUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"$pandas._typing.QuantileInterpolation * +method +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.CalculationMethod 0:typing.overloadX +quantile$pandas.core.frame.DataFrame.quantile": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +q +;Union[builtins.list[builtins.float],numpy.ndarray[Any,Any]]P +builtins.list[builtins.float] +builtins.float"builtins.float" builtins.list9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *2 + numeric_only + builtins.bool" builtins.bool * + interpolation +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +tUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"$pandas._typing.QuantileInterpolation * +method +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.CalculationMethod 0:typing.overloadX2 + +columns#pandas.core.frame.DataFrame.columns +columns#pandas.core.frame.DataFrame.columns"l +,pandas.core.indexes.base.Index[builtins.str] + builtins.str" builtins.str"pandas.core.indexes.base.Index*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame0:builtins.propertyX` +columns#pandas.core.frame.DataFrame.columns" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +cols +Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[pandas._typing.HashableT],builtins.tuple[pandas._typing.HashableT]] +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.AnyArrayLike +'builtins.list[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable" builtins.list +(builtins.tuple[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable"builtins.tuple0:.setter2 +index!pandas.core.frame.DataFrame.index +index!pandas.core.frame.DataFrame.index"N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame0:builtins.propertyX` +index!pandas.core.frame.DataFrame.index" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*W +idxN +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index0:.setter2 +allpandas.core.frame.DataFrame.all +allpandas.core.frame.DataFrame.all" + builtins.bool" builtins.bool*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +axis +None*X + bool_onlyG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None *, +skipna + builtins.bool" builtins.bool * +kwargs +Any0:typing.overloadX +allpandas.core.frame.DataFrame.all"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *X + bool_onlyG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None *, +skipna + builtins.bool" builtins.bool * +kwargs +Any0:typing.overloadX2 +anypandas.core.frame.DataFrame.any +anypandas.core.frame.DataFrame.any" + builtins.bool" builtins.bool*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +axis +None*X + bool_onlyG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None *, +skipna + builtins.bool" builtins.bool * +kwargs +Any0:typing.overloadX +anypandas.core.frame.DataFrame.any"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *X + bool_onlyG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None *, +skipna + builtins.bool" builtins.bool * +kwargs +Any0:typing.overloadX2 +bfill!pandas.core.frame.DataFrame.bfill +bfill!pandas.core.frame.DataFrame.bfill" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +axis +Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis +None *G +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool*Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None *{ +downcastk +"Union[builtins.dict[Any,Any],None]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +None 0:typing.overloadX +bfill!pandas.core.frame.DataFrame.bfill": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +axis +Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis +None *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None *{ +downcastk +"Union[builtins.dict[Any,Any],None]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +None 0:typing.overloadX2 +ffill!pandas.core.frame.DataFrame.ffill +ffill!pandas.core.frame.DataFrame.ffill" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +axis +Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis +None *G +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool*Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None *{ +downcastk +"Union[builtins.dict[Any,Any],None]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +None 0:typing.overloadX +ffill!pandas.core.frame.DataFrame.ffill": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +axis +Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis +None *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None *{ +downcastk +"Union[builtins.dict[Any,Any],None]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +None 0:typing.overloadX2 +getpandas.core.frame.DataFrame.get +getpandas.core.frame.DataFrame.get"~ +*Union[pandas.core.series.Series[Any],None]D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*+ +key" +typing.Hashable"typing.Hashable* +default +None 0:typing.overloadX +getpandas.core.frame.DataFrame.get" +6Union[pandas.core.series.Series[Any],pandas._typing.T]D +pandas.core.series.Series[Any] +Any"pandas.core.series.SeriesI +pandas._typing.T" +builtins.object"builtins.object"builtins.object*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*+ +key" +typing.Hashable"typing.Hashable*V +defaultI +pandas._typing.T" +builtins.object"builtins.object"builtins.object0:typing.overloadX +getpandas.core.frame.DataFrame.get"q +'Union[pandas.core.frame.DataFrame,None]: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*\ +keyS +builtins.list[typing.Hashable]" +typing.Hashable"typing.Hashable" builtins.list* +default +None 0:typing.overloadX +getpandas.core.frame.DataFrame.get" +3Union[pandas.core.frame.DataFrame,pandas._typing.T]: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrameI +pandas._typing.T" +builtins.object"builtins.object"builtins.object*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*\ +keyS +builtins.list[typing.Hashable]" +typing.Hashable"typing.Hashable" builtins.list*V +defaultI +pandas._typing.T" +builtins.object"builtins.object"builtins.object0:typing.overloadX2X + interpolate'pandas.core.frame.DataFrame.interpolate + interpolate'pandas.core.frame.DataFrame.interpolate" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +method +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"!pandas._typing.InterpolateOptions * +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None * +limit_direction +HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str * + +limit_area +7Union[Literal[builtins.str],Literal[builtins.str],None]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +None *x +downcasth +!Union[Literal[builtins.str],None]7 +Literal[builtins.str]  + builtins.str" builtins.str +None *G +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool* +kwargs +Any0:typing.overloadX + interpolate'pandas.core.frame.DataFrame.interpolate": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +method +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"!pandas._typing.InterpolateOptions * +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None * +limit_direction +HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str * + +limit_area +7Union[Literal[builtins.str],Literal[builtins.str],None]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +None *x +downcasth +!Union[Literal[builtins.str],None]7 +Literal[builtins.str]  + builtins.str" builtins.str +None *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool * +kwargs +Any0:typing.overloadX + interpolate'pandas.core.frame.DataFrame.interpolate"q +'Union[pandas.core.frame.DataFrame,None]: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +method +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"!pandas._typing.InterpolateOptions * +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None *V +inplaceG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None * +limit_direction +HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str * + +limit_area +7Union[Literal[builtins.str],Literal[builtins.str],None]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +None *x +downcasth +!Union[Literal[builtins.str],None]7 +Literal[builtins.str]  + builtins.str" builtins.str +None * +kwargs +Any0:typing.overloadX2, + rename_axis'pandas.core.frame.DataFrame.rename_axis + + rename_axis'pandas.core.frame.DataFrame.rename_axis" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +mapper +Any * +axis +Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis +None ** +copy + builtins.bool" builtins.bool *G +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool0:typing.overloadX + + rename_axis'pandas.core.frame.DataFrame.rename_axis": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +mapper +Any * +axis +Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis +None ** +copy + builtins.bool" builtins.bool *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool 0:typing.overloadX + rename_axis'pandas.core.frame.DataFrame.rename_axis" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +index +Union[builtins.str,typing.Sequence[builtins.str],builtins.dict[Union[builtins.str,builtins.int],builtins.str],CallableType[builtins.function],None] + builtins.str" builtins.strN +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.Sequence +pandas.core.window.rolling.Window[pandas.core.frame.DataFrame]: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame"!pandas.core.window.rolling.Window*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +window +{Union[builtins.int,builtins.str,datetime.timedelta,pandas._libs.tslibs.offsets.BaseOffset,pandas.core.indexers.BaseIndexer] + builtins.int" builtins.int + builtins.str" builtins.str( +datetime.timedelta"datetime.timedeltaP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffsetD + pandas.core.indexers.BaseIndexer" pandas.core.indexers.BaseIndexer*W + min_periodsD +Union[builtins.int,None] + builtins.int" builtins.int +None *, +center + builtins.bool" builtins.bool *W +onM +Union[typing.Hashable,None]" +typing.Hashable"typing.Hashable +None * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex * +closed +uUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"!pandas._typing.IntervalClosedType +None *P +stepD +Union[builtins.int,None] + builtins.int" builtins.int +None * +method +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.CalculationMethod ** +win_type + builtins.str" builtins.str0:typing.overloadX +rolling#pandas.core.frame.DataFrame.rolling" +?pandas.core.window.rolling.Rolling[pandas.core.frame.DataFrame]: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame""pandas.core.window.rolling.Rolling*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +window +{Union[builtins.int,builtins.str,datetime.timedelta,pandas._libs.tslibs.offsets.BaseOffset,pandas.core.indexers.BaseIndexer] + builtins.int" builtins.int + builtins.str" builtins.str( +datetime.timedelta"datetime.timedeltaP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffsetD + pandas.core.indexers.BaseIndexer" pandas.core.indexers.BaseIndexer*W + min_periodsD +Union[builtins.int,None] + builtins.int" builtins.int +None *, +center + builtins.bool" builtins.bool *W +onM +Union[typing.Hashable,None]" +typing.Hashable"typing.Hashable +None * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex * +closed +uUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"!pandas._typing.IntervalClosedType +None *P +stepD +Union[builtins.int,None] + builtins.int" builtins.int +None * +method +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.CalculationMethod * +win_type +None 0:typing.overloadX2` +to_json#pandas.core.frame.DataFrame.to_json +to_json#pandas.core.frame.DataFrame.to_json" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* + path_or_buf +hUnion[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.WriteBuffer[builtins.str]] +8TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]] +-Union[builtins.str,os.PathLike[builtins.str]] + builtins.str" builtins.strF +os.PathLike[builtins.str] + builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathd +(pandas._typing.WriteBuffer[builtins.str] + builtins.str" builtins.str"pandas._typing.WriteBuffer*C +orient7 +Literal[builtins.str]  + builtins.str" builtins.str* + date_format +7Union[Literal[builtins.str],Literal[builtins.str],None]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +None *4 +double_precision + builtins.int" builtins.int *1 + force_ascii + builtins.bool" builtins.bool * + date_unit +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.TimeUnit * +default_handler ++Union[CallableType[builtins.function],None]K +CallableType[builtins.function]& +builtins.function"builtins.function +None *E +lines: +Literal[builtins.bool]  + builtins.bool" builtins.bool* + compression +TypeAlias[Union[None,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],TypeAlias[builtins.dict[builtins.str,Any]]]] +Union[None,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],TypeAlias[builtins.dict[builtins.str,Any]]] +None7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +*TypeAlias[builtins.dict[builtins.str,Any]]W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict"pandas._typing.CompressionDict"!pandas._typing.CompressionOptions *+ +index + builtins.bool" builtins.bool *R +indentD +Union[builtins.int,None] + builtins.int" builtins.int +None *A +mode7 +Literal[builtins.str]  + builtins.str" builtins.str0:typing.overloadX +to_json#pandas.core.frame.DataFrame.to_json" + builtins.str" builtins.str*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* + path_or_buf +None *C +orient7 +Literal[builtins.str]  + builtins.str" builtins.str* + date_format +7Union[Literal[builtins.str],Literal[builtins.str],None]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +None *4 +double_precision + builtins.int" builtins.int *1 + force_ascii + builtins.bool" builtins.bool * + date_unit +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.TimeUnit * +default_handler ++Union[CallableType[builtins.function],None]K +CallableType[builtins.function]& +builtins.function"builtins.function +None *E +lines: +Literal[builtins.bool]  + builtins.bool" builtins.bool* + compression +TypeAlias[Union[None,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],TypeAlias[builtins.dict[builtins.str,Any]]]] +Union[None,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],TypeAlias[builtins.dict[builtins.str,Any]]] +None7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +*TypeAlias[builtins.dict[builtins.str,Any]]W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict"pandas._typing.CompressionDict"!pandas._typing.CompressionOptions *+ +index + builtins.bool" builtins.bool *R +indentD +Union[builtins.int,None] + builtins.int" builtins.int +None *A +mode7 +Literal[builtins.str]  + builtins.str" builtins.str0:typing.overloadX +to_json#pandas.core.frame.DataFrame.to_json" + builtins.str" builtins.str*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* + path_or_buf +None * +orient +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.JsonFrameOrient +None * + date_format +7Union[Literal[builtins.str],Literal[builtins.str],None]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +None *4 +double_precision + builtins.int" builtins.int *1 + force_ascii + builtins.bool" builtins.bool * + date_unit +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.TimeUnit * +default_handler ++Union[CallableType[builtins.function],None]K +CallableType[builtins.function]& +builtins.function"builtins.function +None *+ +lines + builtins.bool" builtins.bool * + compression +TypeAlias[Union[None,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],TypeAlias[builtins.dict[builtins.str,Any]]]] +Union[None,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],TypeAlias[builtins.dict[builtins.str,Any]]] +None7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +*TypeAlias[builtins.dict[builtins.str,Any]]W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict"pandas._typing.CompressionDict"!pandas._typing.CompressionOptions *+ +index + builtins.bool" builtins.bool *R +indentD +Union[builtins.int,None] + builtins.int" builtins.int +None *C +mode7 +Literal[builtins.str]  + builtins.str" builtins.str 0:typing.overloadX +to_json#pandas.core.frame.DataFrame.to_json" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* + path_or_buf +hUnion[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.WriteBuffer[builtins.str]] +8TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]] +-Union[builtins.str,os.PathLike[builtins.str]] + builtins.str" builtins.strF +os.PathLike[builtins.str] + builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathd +(pandas._typing.WriteBuffer[builtins.str] + builtins.str" builtins.str"pandas._typing.WriteBuffer* +orient +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.JsonFrameOrient +None * + date_format +7Union[Literal[builtins.str],Literal[builtins.str],None]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +None *4 +double_precision + builtins.int" builtins.int *1 + force_ascii + builtins.bool" builtins.bool * + date_unit +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.TimeUnit * +default_handler ++Union[CallableType[builtins.function],None]K +CallableType[builtins.function]& +builtins.function"builtins.function +None *+ +lines + builtins.bool" builtins.bool * + compression +TypeAlias[Union[None,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],TypeAlias[builtins.dict[builtins.str,Any]]]] +Union[None,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],TypeAlias[builtins.dict[builtins.str,Any]]] +None7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +*TypeAlias[builtins.dict[builtins.str,Any]]W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict"pandas._typing.CompressionDict"!pandas._typing.CompressionOptions *+ +index + builtins.bool" builtins.bool *R +indentD +Union[builtins.int,None] + builtins.int" builtins.int +None *C +mode7 +Literal[builtins.str]  + builtins.str" builtins.str 0:typing.overloadX2; + to_string%pandas.core.frame.DataFrame.to_string + to_string%pandas.core.frame.DataFrame.to_string" +None*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +buf +hUnion[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.WriteBuffer[builtins.str]] +8TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]] +-Union[builtins.str,os.PathLike[builtins.str]] + builtins.str" builtins.strF +os.PathLike[builtins.str] + builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathd +(pandas._typing.WriteBuffer[builtins.str] + builtins.str" builtins.str"pandas._typing.WriteBuffer* +columns +wUnion[builtins.list[pandas._typing.HashableT1],pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],None] +(builtins.list[pandas._typing.HashableT1]R +pandas._typing.HashableT1" +typing.Hashable"typing.Hashable"typing.Hashable" builtins.listN +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series +None * + col_space +jUnion[builtins.int,builtins.list[builtins.int],builtins.dict[pandas._typing.HashableT2,builtins.int],None] + builtins.int" builtins.intJ +builtins.list[builtins.int] + builtins.int" builtins.int" builtins.list +5builtins.dict[pandas._typing.HashableT2,builtins.int]R +pandas._typing.HashableT2" +typing.Hashable"typing.Hashable"typing.Hashable + builtins.int" builtins.int" builtins.dict +None * +header +MUnion[builtins.bool,builtins.list[builtins.str],builtins.tuple[builtins.str]] + builtins.bool" builtins.boolJ +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.listL +builtins.tuple[builtins.str] + builtins.str" builtins.str"builtins.tuple *+ +index + builtins.bool" builtins.bool ** +na_rep + builtins.str" builtins.str * + +formatters +Union[TypeAlias[Union[builtins.list[CallableType[builtins.function]],builtins.tuple[CallableType[builtins.function]],typing.Mapping[Union[builtins.str,builtins.int],CallableType[builtins.function]]]],None] +TypeAlias[Union[builtins.list[CallableType[builtins.function]],builtins.tuple[CallableType[builtins.function]],typing.Mapping[Union[builtins.str,builtins.int],CallableType[builtins.function]]]] +Union[builtins.list[CallableType[builtins.function]],builtins.tuple[CallableType[builtins.function]],typing.Mapping[Union[builtins.str,builtins.int],CallableType[builtins.function]]] +.builtins.list[CallableType[builtins.function]]K +CallableType[builtins.function]& +builtins.function"builtins.function" builtins.list +/builtins.tuple[CallableType[builtins.function]]K +CallableType[builtins.function]& +builtins.function"builtins.function"builtins.tuple +Ptyping.Mapping[Union[builtins.str,builtins.int],CallableType[builtins.function]]` + Union[builtins.str,builtins.int] + builtins.str" builtins.str + builtins.int" builtins.intK +CallableType[builtins.function]& +builtins.function"builtins.function"typing.Mapping"pandas._typing.FormattersType +None * + float_format ++Union[CallableType[builtins.function],None]K +CallableType[builtins.function]& +builtins.function"builtins.function +None *W +sparsifyG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None *1 + index_names + builtins.bool" builtins.bool *S +justifyD +Union[builtins.str,None] + builtins.str" builtins.str +None *T +max_rowsD +Union[builtins.int,None] + builtins.int" builtins.int +None *T +max_colsD +Union[builtins.int,None] + builtins.int" builtins.int +None *5 +show_dimensions + builtins.bool" builtins.bool *+ +decimal + builtins.str" builtins.str *V + +line_widthD +Union[builtins.int,None] + builtins.int" builtins.int +None *T +min_rowsD +Union[builtins.int,None] + builtins.int" builtins.int +None *X + max_colwidthD +Union[builtins.int,None] + builtins.int" builtins.int +None *T +encodingD +Union[builtins.str,None] + builtins.str" builtins.str +None 0:typing.overloadX + to_string%pandas.core.frame.DataFrame.to_string" + builtins.str" builtins.str*D +self: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +buf +None * +columns +vUnion[builtins.list[pandas._typing.HashableT],pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],None] +'builtins.list[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable" builtins.listN +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series +None * + col_space +`Union[builtins.int,builtins.list[builtins.int],builtins.dict[typing.Hashable,builtins.int],None] + builtins.int" builtins.intJ +builtins.list[builtins.int] + builtins.int" builtins.int" builtins.list~ ++builtins.dict[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int" builtins.dict +None * +header +2Union[builtins.bool,typing.Sequence[builtins.str]] + builtins.bool" builtins.boolN +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.Sequence *+ +index + builtins.bool" builtins.bool ** +na_rep + builtins.str" builtins.str * + +formatters +Union[TypeAlias[Union[builtins.list[CallableType[builtins.function]],builtins.tuple[CallableType[builtins.function]],typing.Mapping[Union[builtins.str,builtins.int],CallableType[builtins.function]]]],None] +TypeAlias[Union[builtins.list[CallableType[builtins.function]],builtins.tuple[CallableType[builtins.function]],typing.Mapping[Union[builtins.str,builtins.int],CallableType[builtins.function]]]] +Union[builtins.list[CallableType[builtins.function]],builtins.tuple[CallableType[builtins.function]],typing.Mapping[Union[builtins.str,builtins.int],CallableType[builtins.function]]] +.builtins.list[CallableType[builtins.function]]K +CallableType[builtins.function]& +builtins.function"builtins.function" builtins.list +/builtins.tuple[CallableType[builtins.function]]K +CallableType[builtins.function]& +builtins.function"builtins.function"builtins.tuple +Ptyping.Mapping[Union[builtins.str,builtins.int],CallableType[builtins.function]]` + Union[builtins.str,builtins.int] + builtins.str" builtins.str + builtins.int" builtins.intK +CallableType[builtins.function]& +builtins.function"builtins.function"typing.Mapping"pandas._typing.FormattersType +None * + float_format ++Union[CallableType[builtins.function],None]K +CallableType[builtins.function]& +builtins.function"builtins.function +None *W +sparsifyG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None *1 + index_names + builtins.bool" builtins.bool *S +justifyD +Union[builtins.str,None] + builtins.str" builtins.str +None *T +max_rowsD +Union[builtins.int,None] + builtins.int" builtins.int +None *T +max_colsD +Union[builtins.int,None] + builtins.int" builtins.int +None *5 +show_dimensions + builtins.bool" builtins.bool *+ +decimal + builtins.str" builtins.str *V + +line_widthD +Union[builtins.int,None] + builtins.int" builtins.int +None *T +min_rowsD +Union[builtins.int,None] + builtins.int" builtins.int +None *X + max_colwidthD +Union[builtins.int,None] + builtins.int" builtins.int +None *T +encodingD +Union[builtins.str,None] + builtins.str" builtins.str +None 0:typing.overloadXr: +__hash__$pandas.core.frame.DataFrame.__hash__ +NonerT +sparse"pandas.core.frame.DataFrame.sparse& +builtins.ellipsis"builtins.ellipsisrF +Name pandas.core.frame.DataFrame.Name + builtins.str" builtins.str + +DateOffset&pandas._libs.tslibs.offsets.DateOffset"/pandas._libs.tslibs.offsets.RelativeDeltaOffset* +__init__/pandas._libs.tslibs.offsets.DateOffset.__init__" +None*Z +selfP +&pandas._libs.tslibs.offsets.DateOffset"&pandas._libs.tslibs.offsets.DateOffset*% +n + builtins.int" builtins.int */ + normalize + builtins.bool" builtins.bool *) +years + builtins.int" builtins.int ** +months + builtins.int" builtins.int *) +weeks + builtins.int" builtins.int *( +days + builtins.int" builtins.int *) +hours + builtins.int" builtins.int *+ +minutes + builtins.int" builtins.int *+ +seconds + builtins.int" builtins.int *0 + milliseconds + builtins.int" builtins.int *0 + microseconds + builtins.int" builtins.int */ + nanoseconds + builtins.int" builtins.int *( +year + builtins.int" builtins.int *) +month + builtins.int" builtins.int *' +day + builtins.int" builtins.int *Q +weekdayB +Union[builtins.int,Any] + builtins.int" builtins.int +Any *( +hour + builtins.int" builtins.int ** +minute + builtins.int" builtins.int ** +second + builtins.int" builtins.int */ + microsecond + builtins.int" builtins.int *. + +nanosecond + builtins.int" builtins.int > + DatetimeIndex+pandas.core.indexes.datetimes.DatetimeIndex"7pandas.core.indexes.datetimelike.DatetimeTimedeltaMixin"5pandas.core.indexes.accessors.DatetimeIndexProperties* +__init__4pandas.core.indexes.datetimes.DatetimeIndex.__init__" +None*d +selfZ ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* +data +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.tuple[Any]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.AnyArrayLike, +builtins.list[Any] +Any" builtins.list. +builtins.tuple[Any] +Any"builtins.tuple* +freq +Any * +tz +Any *- + ambiguous + builtins.str" builtins.str *. +dayfirst + builtins.bool" builtins.bool */ + yearfirst + builtins.bool" builtins.bool * +dtype +Any ** +copy + builtins.bool" builtins.bool * +name +Any * + __array__5pandas.core.indexes.datetimes.DatetimeIndex.__array__"9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray*d +selfZ ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* +dtype +Any *N + +__reduce__6pandas.core.indexes.datetimes.DatetimeIndex.__reduce__* +self* + to_series5pandas.core.indexes.datetimes.DatetimeIndex.to_series"H +"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries*d +selfZ ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* +index +Any * +name +Any * +snap0pandas.core.indexes.datetimes.DatetimeIndex.snap" +Any*d +selfZ ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex*( +freq + builtins.str" builtins.str *x + slice_indexer9pandas.core.indexes.datetimes.DatetimeIndex.slice_indexer* +self* +start * +end * + +step * + searchsorted8pandas.core.indexes.datetimes.DatetimeIndex.searchsorted" +Any*d +selfZ ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* +value +Any*( +side + builtins.str" builtins.str * +sorter +Any * + inferred_type9pandas.core.indexes.datetimes.DatetimeIndex.inferred_type" + builtins.str" builtins.str*d +selfZ ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex0:builtins.property`*Y +insert2pandas.core.indexes.datetimes.DatetimeIndex.insert* +self* +loc* +item* +indexer_at_time;pandas.core.indexes.datetimes.DatetimeIndex.indexer_at_time" +Any*d +selfZ ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* +time +Any** +asof + builtins.bool" builtins.bool * +indexer_between_time@pandas.core.indexes.datetimes.DatetimeIndex.indexer_between_time" +Any*d +selfZ ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* + +start_time +Any* +end_time +Any*3 + include_start + builtins.bool" builtins.bool *1 + include_end + builtins.bool" builtins.bool * +to_julian_date:pandas.core.indexes.datetimes.DatetimeIndex.to_julian_date"r +.pandas.core.indexes.base.Index[builtins.float] +builtins.float"builtins.float"pandas.core.indexes.base.Index*d +selfZ ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* + isocalendar7pandas.core.indexes.datetimes.DatetimeIndex.isocalendar": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*d +selfZ ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* +tzinfo2pandas.core.indexes.datetimes.DatetimeIndex.tzinfo"M +Union[datetime.tzinfo,None]" +datetime.tzinfo"datetime.tzinfo +None*d +selfZ ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex0:builtins.property`* +dtype1pandas.core.indexes.datetimes.DatetimeIndex.dtype" +AUnion[numpy.dtype[Any],pandas.core.dtypes.dtypes.DatetimeTZDtype]( +numpy.dtype[Any] +Any" numpy.dtypeV +)pandas.core.dtypes.dtypes.DatetimeTZDtype")pandas.core.dtypes.dtypes.DatetimeTZDtype*d +selfZ ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex0:builtins.property`2 +__add__3pandas.core.indexes.datetimes.DatetimeIndex.__add__ +__add__3pandas.core.indexes.datetimes.DatetimeIndex.__add__"H +"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries*\Z ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex*JH +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries0:typing.overloadX +__add__3pandas.core.indexes.datetimes.DatetimeIndex.__add__"Z ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex*\Z ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* +Union[datetime.timedelta,pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.indexes.timedeltas.TimedeltaIndex,pandas._libs.tslibs.offsets.BaseOffset]( +datetime.timedelta"datetime.timedeltaT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndexP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset0:typing.overloadX2 +__sub__3pandas.core.indexes.datetimes.DatetimeIndex.__sub__ +__sub__3pandas.core.indexes.datetimes.DatetimeIndex.__sub__"H +"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries*\Z ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex*JH +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries0:typing.overloadX +__sub__3pandas.core.indexes.datetimes.DatetimeIndex.__sub__"Z ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex*\Z ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* +Union[datetime.timedelta,pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.indexes.timedeltas.TimedeltaIndex,pandas._libs.tslibs.offsets.BaseOffset]( +datetime.timedelta"datetime.timedeltaT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndexP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset0:typing.overloadX +__sub__3pandas.core.indexes.datetimes.DatetimeIndex.__sub__"^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex*\Z ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* +mUnion[datetime.datetime,pandas._libs.tslibs.timestamps.Timestamp,pandas.core.indexes.datetimes.DatetimeIndex]& +datetime.datetime"datetime.datetimeT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampZ ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex0:typing.overloadX +DatetimeTZDtype)pandas.core.dtypes.dtypes.DatetimeTZDtype".pandas.core.dtypes.dtypes.PandasExtensionDtype* +__init__2pandas.core.dtypes.dtypes.DatetimeTZDtype.__init__" +None*` +selfV +)pandas.core.dtypes.dtypes.DatetimeTZDtype")pandas.core.dtypes.dtypes.DatetimeTZDtype*C +unit7 +Literal[builtins.str]  + builtins.str" builtins.str * +tz +5Union[builtins.str,builtins.int,datetime.tzinfo,None] + builtins.str" builtins.str + builtins.int" builtins.int" +datetime.tzinfo"datetime.tzinfo +None * +unit.pandas.core.dtypes.dtypes.DatetimeTZDtype.unit"7 +Literal[builtins.str]  + builtins.str" builtins.str*` +selfV +)pandas.core.dtypes.dtypes.DatetimeTZDtype")pandas.core.dtypes.dtypes.DatetimeTZDtype0:builtins.property`* +tz,pandas.core.dtypes.dtypes.DatetimeTZDtype.tz"" +datetime.tzinfo"datetime.tzinfo*` +selfV +)pandas.core.dtypes.dtypes.DatetimeTZDtype")pandas.core.dtypes.dtypes.DatetimeTZDtype0:builtins.property`* +na_value2pandas.core.dtypes.dtypes.DatetimeTZDtype.na_value"J +#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType*` +selfV +)pandas.core.dtypes.dtypes.DatetimeTZDtype")pandas.core.dtypes.dtypes.DatetimeTZDtype0:builtins.property`a + Float32Dtype(pandas.core.arrays.floating.Float32Dtype"'pandas.core.arrays.numeric.NumericDtypea + Float64Dtype(pandas.core.arrays.floating.Float64Dtype"'pandas.core.arrays.numeric.NumericDtype5 +Grouper#pandas.core.groupby.grouper.Grouper"builtins.object* +__repr__,pandas.core.groupby.grouper.Grouper.__repr__" + builtins.str" builtins.str*LJ +#pandas.core.groupby.grouper.Grouper"#pandas.core.groupby.grouper.Grouper0: typing.finalP2 +__new__+pandas.core.groupby.grouper.Grouper.__new__ +__new__+pandas.core.groupby.grouper.Grouper.__new__" +(pandas.core.groupby.grouper.Grouper.SelfJ +#pandas.core.groupby.grouper.Grouper"#pandas.core.groupby.grouper.Grouper"#pandas.core.groupby.grouper.Grouper(* +cls +.Type[pandas.core.groupby.grouper.Grouper.Self] +(pandas.core.groupby.grouper.Grouper.SelfJ +#pandas.core.groupby.grouper.Grouper"#pandas.core.groupby.grouper.Grouper"#pandas.core.groupby.grouper.Grouper("type*l +keya +Union[TypeAlias[Any],None]7 +TypeAlias[Any] +Any"pandas._typing.KeysArgType +None * +level +Union[TypeAlias[Union[typing.Hashable,builtins.int]],TypeAlias[Union[typing.MutableSequence[pandas._typing.HashableT],numpy.ndarray[Any,Any],builtins.tuple[pandas._typing.HashableT],builtins.range]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +TypeAlias[Union[typing.MutableSequence[pandas._typing.HashableT],numpy.ndarray[Any,Any],builtins.tuple[pandas._typing.HashableT],builtins.range]] +Union[typing.MutableSequence[pandas._typing.HashableT],numpy.ndarray[Any,Any],builtins.tuple[pandas._typing.HashableT],builtins.range] +0typing.MutableSequence[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable"typing.MutableSequence9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray +(builtins.tuple[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable"builtins.tuple +builtins.range"builtins.range"pandas._typing.ListLikeHashable +None * +axis +Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],TypeAlias[Literal[pandas._libs.lib._NoDefault]]] +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault ** +sort + builtins.bool" builtins.bool *, +dropna + builtins.bool" builtins.bool 0:typing.overloadX +__new__+pandas.core.groupby.grouper.Grouper.__new__"D + pandas.core.resample.TimeGrouper" pandas.core.resample.TimeGrouper* +cls +)Type[pandas.core.groupby.grouper.Grouper]J +#pandas.core.groupby.grouper.Grouper"#pandas.core.groupby.grouper.Grouper"type* +args +Any* +freq +ETypeAlias[Union[builtins.str,pandas._libs.tslibs.offsets.BaseOffset]] +:Union[builtins.str,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.strP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas._typing.Frequency* +kwargs +Any0:typing.overloadXr +key'pandas.core.groupby.grouper.Grouper.keya +Union[TypeAlias[Any],None]7 +TypeAlias[Any] +Any"pandas._typing.KeysArgType +Noner +level)pandas.core.groupby.grouper.Grouper.level +Union[TypeAlias[Union[typing.Hashable,builtins.int]],TypeAlias[Union[typing.MutableSequence[pandas._typing.HashableT],numpy.ndarray[Any,Any],builtins.tuple[pandas._typing.HashableT],builtins.range]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +TypeAlias[Union[typing.MutableSequence[pandas._typing.HashableT],numpy.ndarray[Any,Any],builtins.tuple[pandas._typing.HashableT],builtins.range]] +Union[typing.MutableSequence[pandas._typing.HashableT],numpy.ndarray[Any,Any],builtins.tuple[pandas._typing.HashableT],builtins.range] +0typing.MutableSequence[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable"typing.MutableSequence9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray +(builtins.tuple[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable"builtins.tuple +builtins.range"builtins.range"pandas._typing.ListLikeHashable +Noner +freq(pandas.core.groupby.grouper.Grouper.freq +QUnion[TypeAlias[Union[builtins.str,pandas._libs.tslibs.offsets.BaseOffset]],None] +ETypeAlias[Union[builtins.str,pandas._libs.tslibs.offsets.BaseOffset]] +:Union[builtins.str,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.strP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas._typing.Frequency +Noner +axis(pandas.core.groupby.grouper.Grouper.axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.AxisrP +sort(pandas.core.groupby.grouper.Grouper.sort + builtins.bool" builtins.boolrT +dropna*pandas.core.groupby.grouper.Grouper.dropna + builtins.bool" builtins.boolrl +binner*pandas.core.groupby.grouper.Grouper.binner6 +TypeAlias[Any] +Any"pandas._typing.Incomplete +Indexpandas.core.indexes.base.Index"pandas.core.base.IndexOpsMixin*/ +str"pandas.core.indexes.base.Index.str" +pandas.core.strings.StringMethods[pandas.core.indexes.base.Index.Self,pandas.core.indexes.multi.MultiIndex,TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]]] +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(L +$pandas.core.indexes.multi.MultiIndex"$pandas.core.indexes.multi.MultiIndex +^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_bool"!pandas.core.strings.StringMethods* +self +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(0:builtins.property`* +is_"pandas.core.indexes.base.Index.is_" + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* +other +Any* +__len__&pandas.core.indexes.base.Index.__len__" + builtins.int" builtins.int* +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* + __array__(pandas.core.indexes.base.Index.__array__"9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* +dtype +Any *d +__array_wrap__-pandas.core.indexes.base.Index.__array_wrap__* +self* + +result* +context * +dtype$pandas.core.indexes.base.Index.dtype" +STypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]] +HUnion[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]I +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtypeP +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype"pandas._typing.DtypeObj* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index0:builtins.property`* +ravel$pandas.core.indexes.base.Index.ravel" +Any* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index*) +order + builtins.str" builtins.str *@ +view#pandas.core.indexes.base.Index.view* +self* +cls *" +astype%pandas.core.indexes.base.Index.astype"N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* +dtype +TypeAlias[Union[TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],typing.Mapping[Any,Unknown]]] +Union[TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],typing.Mapping[Any,Unknown]] +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype8 +typing.Mapping[Any,Unknown] +Any"typing.Mapping"pandas._typing.DtypeArg** +copy + builtins.bool" builtins.bool * +take#pandas.core.indexes.base.Index.take" +Any* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* +indices +Any*( +axis + builtins.int" builtins.int *0 + +allow_fill + builtins.bool" builtins.bool * + +fill_value +Any * +kwargs +Any*R +repeat%pandas.core.indexes.base.Index.repeat* +self* +repeats* + +axis *( +copy#pandas.core.indexes.base.Index.copy" +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +self +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +name +Any ** +deep + builtins.bool" builtins.bool *I +__copy__'pandas.core.indexes.base.Index.__copy__* +self* + +kwargs*Q + __deepcopy__+pandas.core.indexes.base.Index.__deepcopy__* +self* + +memo * +format%pandas.core.indexes.base.Index.format"J +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index** +name + builtins.bool" builtins.bool * + formatter ++Union[CallableType[builtins.function],None]K +CallableType[builtins.function]& +builtins.function"builtins.function +None ** +na_rep + builtins.str" builtins.str *G + to_flat_index,pandas.core.indexes.base.Index.to_flat_index* +self* + to_series(pandas.core.indexes.base.Index.to_series"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* +index +Any * +name +Any * +to_frame'pandas.core.indexes.base.Index.to_frame": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index*+ +index + builtins.bool" builtins.bool * +name +Any * + set_names(pandas.core.indexes.base.Index.set_names" +Any* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* +names +Any* +level +Any *- +inplace + builtins.bool" builtins.bool * +nlevels&pandas.core.indexes.base.Index.nlevels" + builtins.int" builtins.int* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index0:builtins.property`* + sortlevel(pandas.core.indexes.base.Index.sortlevel" +Any* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* +level +Any */ + ascending + builtins.bool" builtins.bool * +sort_remaining +Any * +get_level_values/pandas.core.indexes.base.Index.get_level_values"N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int builtins.float"builtins.float$ builtins.complex"builtins.complex TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] @@ -12479,24 +17409,639 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index*k +level` + Union[builtins.int,builtins.str] + builtins.int" builtins.int + builtins.str" builtins.str* + droplevel(pandas.core.indexes.base.Index.droplevel" +Any* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* -name -Any*- -inplace - builtins.bool" builtins.bool * -nlevels&pandas.core.indexes.base.Index.nlevels" - builtins.int" builtins.int* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* +level +LUnion[TypeAlias[Union[typing.Hashable,builtins.int]],builtins.list[Unknown]] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level) +builtins.list[Unknown]" builtins.list * +is_monotonic_increasing6pandas.core.indexes.base.Index.is_monotonic_increasing" + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index0:builtins.property`* +is_monotonic_decreasing6pandas.core.indexes.base.Index.is_monotonic_decreasing" + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index0:builtins.property`* + is_unique(pandas.core.indexes.base.Index.is_unique" + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index0:builtins.property`* +has_duplicates-pandas.core.indexes.base.Index.has_duplicates" + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index0:builtins.property`* + +is_boolean)pandas.core.indexes.base.Index.is_boolean" + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* + +is_integer)pandas.core.indexes.base.Index.is_integer" + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* + is_floating*pandas.core.indexes.base.Index.is_floating" + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* + +is_numeric)pandas.core.indexes.base.Index.is_numeric" + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* + is_object(pandas.core.indexes.base.Index.is_object" + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* +is_categorical-pandas.core.indexes.base.Index.is_categorical" + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* + is_interval*pandas.core.indexes.base.Index.is_interval" + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index*G + holds_integer,pandas.core.indexes.base.Index.holds_integer* +self* + inferred_type,pandas.core.indexes.base.Index.inferred_type" + builtins.str" builtins.str* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index0:builtins.property`*A + +__reduce__)pandas.core.indexes.base.Index.__reduce__* +self* +hasnans&pandas.core.indexes.base.Index.hasnans" + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index0:builtins.property`*5 +isna#pandas.core.indexes.base.Index.isna* +self*7 +notna$pandas.core.indexes.base.Index.notna* +self*V +fillna%pandas.core.indexes.base.Index.fillna* +self* +value * +downcast *) +dropna%pandas.core.indexes.base.Index.dropna" +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +self +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +how +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str *( +unique%pandas.core.indexes.base.Index.unique" +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12523,20 +18068,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index0:builtins.property`* - sortlevel(pandas.core.indexes.base.Index.sortlevel" -Any* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +self +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12563,27 +18104,18 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* level -Any */ - ascending - builtins.bool" builtins.bool * -sort_remaining -Any * -get_level_values/pandas.core.indexes.base.Index.get_level_values"N -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any *+ +drop_duplicates.pandas.core.indexes.base.Index.drop_duplicates" +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12610,24 +18142,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index*k -level` - Union[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str* - droplevel(pandas.core.indexes.base.Index.droplevel" -Any* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +self +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12654,27 +18178,34 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* -level -LUnion[TypeAlias[Union[typing.Hashable,builtins.int]],builtins.list[Unknown]] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level) -builtins.list[Unknown]" builtins.list * -is_monotonic_increasing6pandas.core.indexes.base.Index.is_monotonic_increasing" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +keep +[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],Literal[builtins.bool]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.NaPosition: +Literal[builtins.bool]  + builtins.bool" builtins.bool * + +duplicated)pandas.core.indexes.base.Index.duplicated" +^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12701,20 +18232,25 @@ LUnion[TypeAlias[Union[typing.Hashable,builtins.int]],builtins.list[Unknown]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index0:builtins.property`* -is_monotonic_decreasing6pandas.core.indexes.base.Index.is_monotonic_decreasing" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* +keep +IUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.bool]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str: +Literal[builtins.bool]  + builtins.bool" builtins.bool * +__and__&pandas.core.indexes.base.Index.__and__" +NoReturn +* +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12741,20 +18277,19 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index0:builtins.property`* - is_unique(pandas.core.indexes.base.Index.is_unique" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* +NoReturn +* +__rand__'pandas.core.indexes.base.Index.__rand__" +NoReturn +* +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12781,20 +18316,19 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index0:builtins.property`* -has_duplicates-pandas.core.indexes.base.Index.has_duplicates" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* +NoReturn +* +__or__%pandas.core.indexes.base.Index.__or__" +NoReturn +* +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12821,21 +18355,19 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index0:builtins.property`* - -is_boolean)pandas.core.indexes.base.Index.is_boolean" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* +NoReturn +* +__ror__&pandas.core.indexes.base.Index.__ror__" +NoReturn +* +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12862,21 +18394,19 @@ is_boolean)pandas.core.indexes.base.Index.is_boolean" builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* - -is_integer)pandas.core.indexes.base.Index.is_integer" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* +NoReturn +* +__xor__&pandas.core.indexes.base.Index.__xor__" +NoReturn +* +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12903,20 +18433,19 @@ is_integer)pandas.core.indexes.base.Index.is_integer" builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* - is_floating*pandas.core.indexes.base.Index.is_floating" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* +NoReturn +* +__rxor__'pandas.core.indexes.base.Index.__rxor__" +NoReturn +* +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12943,21 +18472,18 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* - -is_numeric)pandas.core.indexes.base.Index.is_numeric" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* +NoReturn +*( +__neg__&pandas.core.indexes.base.Index.__neg__" +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -12984,20 +18510,15 @@ is_numeric)pandas.core.indexes.base.Index.is_numeric" builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* - is_object(pandas.core.indexes.base.Index.is_object" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13024,20 +18545,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* -is_categorical-pandas.core.indexes.base.Index.is_categorical" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* + __nonzero__*pandas.core.indexes.base.Index.__nonzero__" +None* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13064,20 +18582,63 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* +union$pandas.core.indexes.base.Index.union"N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* - is_interval*pandas.core.indexes.base.Index.is_interval" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* +other +RUnion[builtins.list[pandas._typing.HashableT],pandas.core.indexes.base.Index[Any]] +'builtins.list[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable" builtins.listN +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index* +sort +Any *P + intersection+pandas.core.indexes.base.Index.intersection" +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13104,20 +18665,52 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +self +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* -is_mixed'pandas.core.indexes.base.Index.is_mixed" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(*' +other' +KUnion[builtins.list[pandas._typing.S1],pandas.core.indexes.base.Index.Self] + builtins.list[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13144,27 +18737,54 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset" builtins.list +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index*G - holds_integer,pandas.core.indexes.base.Index.holds_integer* -self*^ - inferred_type,pandas.core.indexes.base.Index.inferred_type* -self0:builtins.property`*A +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(** +sort + builtins.bool" builtins.bool ** -__reduce__)pandas.core.indexes.base.Index.__reduce__* -self* -hasnans&pandas.core.indexes.base.Index.hasnans" - builtins.bool" builtins.bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +difference)pandas.core.indexes.base.Index.difference" +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13191,27 +18811,16 @@ __reduce__)pandas.core.indexes.base.Index.__reduce__* builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index0:builtins.property`*5 -isna#pandas.core.indexes.base.Index.isna* -self*7 -notna$pandas.core.indexes.base.Index.notna* -self*V -fillna%pandas.core.indexes.base.Index.fillna* -self* -value * -downcast *0 -dropna%pandas.core.indexes.base.Index.dropna" -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +self +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13238,19 +18847,26 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* -self -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +other +=Union[builtins.list[Any],pandas.core.indexes.base.Index[Any]], +builtins.list[Any] +Any" builtins.listN +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index*S +sortG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None *P +symmetric_difference3pandas.core.indexes.base.Index.symmetric_difference" +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13277,25 +18893,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* -how -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str */ -unique%pandas.core.indexes.base.Index.unique" -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +self +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13322,19 +18929,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* -self -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(*' +other' +KUnion[builtins.list[pandas._typing.S1],pandas.core.indexes.base.Index.Self] + builtins.list[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13361,21 +18965,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* -level -Any *3 -drop_duplicates.pandas.core.indexes.base.Index.drop_duplicates" -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset" builtins.list +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13402,19 +19000,30 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* + result_name +Any * +sort +Any * +get_loc&pandas.core.indexes.base.Index.get_loc" +Union[builtins.int,builtins.slice,TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]]] builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* -self -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.slice"builtins.slice +^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13441,37 +19050,54 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* -keep -[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],Literal[builtins.bool]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* +key +&TypeAlias[Union[typing.Hashable,None]]M +Union[typing.Hashable,None]" +typing.Hashable"typing.Hashable +None"pandas._typing.Label* +method +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],Literal[builtins.str],None] +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.NaPosition: -Literal[builtins.bool]  - builtins.bool" builtins.bool * + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.FillnaOptions7 +Literal[builtins.str]  + builtins.str" builtins.str +None * + tolerance +Any *{ + get_indexer*pandas.core.indexes.base.Index.get_indexer* +self* -duplicated)pandas.core.indexes.base.Index.duplicated" -^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] -STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] -Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] -Any -5numpy.dtype[numpy._typing._array_like._ScalarType_co][ -(numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_bool* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +target* +method * +limit * + tolerance * +reindex&pandas.core.indexes.base.Index.reindex* +self* + +target* +method * +level * +limit * + tolerance * +join#pandas.core.indexes.base.Index.join" +Any* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13498,28 +19124,29 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* -keep -IUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.bool]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str: -Literal[builtins.bool]  - builtins.bool" builtins.bool * -__and__&pandas.core.indexes.base.Index.__and__" -NoReturn -* -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* +other +Any*' +how + builtins.str" builtins.str * +level +Any *5 +return_indexers + builtins.bool" builtins.bool ** +sort + builtins.bool" builtins.bool * +values%pandas.core.indexes.base.Index.values"9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13546,22 +19173,17 @@ IUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.bool]]7 builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* -NoReturn -* -__rand__'pandas.core.indexes.base.Index.__rand__" -NoReturn -* -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index0:builtins.property`* +array$pandas.core.indexes.base.Index.array"P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13588,22 +19210,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* -NoReturn -* -__or__%pandas.core.indexes.base.Index.__or__" -NoReturn -* -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index0:builtins.property`* + memory_usage+pandas.core.indexes.base.Index.memory_usage" +Any* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13630,22 +19247,22 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* -NoReturn -* -__ror__&pandas.core.indexes.base.Index.__ror__" -NoReturn -* -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index** +deep + builtins.bool" builtins.bool *N +where$pandas.core.indexes.base.Index.where* +self* +cond* +other * + __contains__+pandas.core.indexes.base.Index.__contains__" + builtins.bool" builtins.bool* +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13672,22 +19289,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* -NoReturn -* -__xor__&pandas.core.indexes.base.Index.__xor__" -NoReturn -* -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index*  +Any* + __setitem__*pandas.core.indexes.base.Index.__setitem__" +None* +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13714,22 +19326,26 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* -NoReturn -* -__rxor__'pandas.core.indexes.base.Index.__rxor__" -NoReturn -* -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index*  +Any*  +Any*D +append%pandas.core.indexes.base.Index.append* +self* +other*P +putmask&pandas.core.indexes.base.Index.putmask* +self* +mask* +value* +equals%pandas.core.indexes.base.Index.equals" + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13756,21 +19372,19 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* -NoReturn -*/ -__neg__&pandas.core.indexes.base.Index.__neg__" -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* +other +Any* + identical(pandas.core.indexes.base.Index.identical" + builtins.bool" builtins.bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13797,18 +19411,26 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* +other +Any*@ +asof#pandas.core.indexes.base.Index.asof* +self* +label*T + asof_locs(pandas.core.indexes.base.Index.asof_locs* +self* +where* +mask* + sort_values*pandas.core.indexes.base.Index.sort_values" +Any* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13835,20 +19457,21 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* - __nonzero__*pandas.core.indexes.base.Index.__nonzero__" -None* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index*4 +return_indexer + builtins.bool" builtins.bool */ + ascending + builtins.bool" builtins.bool * +sort#pandas.core.indexes.base.Index.sort" +None* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13875,21 +19498,21 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* -union$pandas.core.indexes.base.Index.union"N -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* +args +Any* +kwargs +Any* +shift$pandas.core.indexes.base.Index.shift" +None* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13916,28 +19539,40 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* -other -RUnion[builtins.list[pandas._typing.HashableT],pandas.core.indexes.base.Index[Any]] -'builtins.list[pandas._typing.HashableT]Q -pandas._typing.HashableT" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.listN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index* -sort -Any *^ - intersection+pandas.core.indexes.base.Index.intersection" -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index*+ +periods + builtins.int" builtins.int * +freq +Any *Q +argsort&pandas.core.indexes.base.Index.argsort* +self* +args* + +kwargs*e +get_indexer_non_unique5pandas.core.indexes.base.Index.get_indexer_non_unique* +self* + +target*c +get_indexer_for.pandas.core.indexes.base.Index.get_indexer_for* +self* + +target* + +kwargs* +groupby&pandas.core.indexes.base.Index.groupby" +5builtins.dict[typing.Hashable,numpy.ndarray[Any,Any]]" +typing.Hashable"typing.Hashable9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -13964,19 +19599,20 @@ RUnion[builtins.list[pandas._typing.HashableT],pandas.core.indexes.base.Index[An builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* -self -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* +values +Any0: typing.finalP* +map"pandas.core.indexes.base.Index.map"N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14003,19 +19639,27 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(*. -other. -KUnion[builtins.list[pandas._typing.S1],pandas.core.indexes.base.Index.Self] - builtins.list[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* +mapper +Any* + na_action +Any * +isin#pandas.core.indexes.base.Index.isin" +^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_bool* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14042,18 +19686,44 @@ KUnion[builtins.list[pandas._typing.S1],pandas.core.indexes.base.Index.Self] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype" builtins.list -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* +values +Any* +level +Any *k + slice_indexer,pandas.core.indexes.base.Index.slice_indexer* +self* +start * +end * + +step *` +get_slice_bound.pandas.core.indexes.base.Index.get_slice_bound* +self* +label* +side*e + +slice_locs)pandas.core.indexes.base.Index.slice_locs* +self* +start * +end * + +step *B +delete%pandas.core.indexes.base.Index.delete* +self* +loc*L +insert%pandas.core.indexes.base.Index.insert* +self* +loc* +item*( +drop#pandas.core.indexes.base.Index.drop" +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14080,22 +19750,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(** -sort - builtins.bool" builtins.bool *1 - -difference)pandas.core.indexes.base.Index.difference" -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +self +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14122,19 +19786,22 @@ difference)pandas.core.indexes.base.Index.difference" builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* -self -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +labels +Any** +errors + builtins.str" builtins.str * +shape$pandas.core.indexes.base.Index.shape"L +builtins.tuple[builtins.int] + builtins.int" builtins.int"builtins.tuple* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14161,29 +19828,22 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* -other -=Union[builtins.list[Any],pandas.core.indexes.base.Index[Any]], -builtins.list[Any] -Any" builtins.listN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index*S -sortG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None *_ -symmetric_difference3pandas.core.indexes.base.Index.symmetric_difference" -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index0:builtins.property`* +__eq__%pandas.core.indexes.base.Index.__eq__" +^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_bool* +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14210,19 +19870,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* -self -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index*$" +builtins.object"builtins.object*& +__iter__'pandas.core.indexes.base.Index.__iter__" +"typing.Iterator[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14249,19 +19906,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(*. -other. -KUnion[builtins.list[pandas._typing.S1],pandas.core.indexes.base.Index.Self] - builtins.list[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Iterator* +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14288,18 +19940,22 @@ KUnion[builtins.list[pandas._typing.S1],pandas.core.indexes.base.Index.Self] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype" builtins.list -#pandas.core.indexes.base.Index.Self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index* +__ne__%pandas.core.indexes.base.Index.__ne__" +^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_bool* +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14326,24 +19982,24 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* - result_name -Any * -sort -Any * -get_loc&pandas.core.indexes.base.Index.get_loc" -Any* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index*$" +builtins.object"builtins.object*? +__le__%pandas.core.indexes.base.Index.__le__" +^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_bool* +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -14370,57 +20026,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index* -key -&TypeAlias[Union[typing.Hashable,None]]M -Union[typing.Hashable,None]" -typing.Hashable"typing.Hashable -None"pandas._typing.Label* -method -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],Literal[builtins.str],None] -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.FillnaOptions7 -Literal[builtins.str]  - builtins.str" builtins.str -None * - tolerance -Any *{ - get_indexer*pandas.core.indexes.base.Index.get_indexer* -self* - -target* -method * -limit * - tolerance * -reindex&pandas.core.indexes.base.Index.reindex* -self* - -target* -method * -level * -limit * - tolerance * -join#pandas.core.indexes.base.Index.join" -Any* -self -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(*'' + +rename%pandas.core.indexes.base.Index.rename) +rename%pandas.core.indexes.base.Index.rename" +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -16797,37 +22528,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"type* -data -{Union[typing.Sequence[pandas._libs.tslibs.period.Period],pandas.core.base.IndexOpsMixin[pandas._libs.tslibs.period.Period]] -2typing.Sequence[pandas._libs.tslibs.period.Period]F -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period"typing.Sequence -Apandas.core.base.IndexOpsMixin[pandas._libs.tslibs.period.Period]F -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period"pandas.core.base.IndexOpsMixin*[ -dtypeN -%pandas.core.dtypes.dtypes.PeriodDtype"%pandas.core.dtypes.dtypes.PeriodDtype ** -copy - builtins.bool" builtins.bool * -name -Any *3 - tupleize_cols - builtins.bool" builtins.bool * -kwargs -Any0:typing.overloadX -__new__&pandas.core.indexes.base.Index.__new__"P -&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex* -cls -7Type[pandas.core.indexes.base.Index[pandas._typing.S1]] -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +self +#pandas.core.indexes.base.Index.Self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -16854,34 +22564,22 @@ Apandas.core.base.IndexOpsMixin[pandas._libs.tslibs.period.Period]F builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"type*: -data0 -typing.Iterable[Any] -Any"typing.Iterable*Y -dtypeN -%pandas.core.dtypes.dtypes.PeriodDtype"%pandas.core.dtypes.dtypes.PeriodDtype** -copy - builtins.bool" builtins.bool * -name -Any *3 - tupleize_cols - builtins.bool" builtins.bool * -kwargs -Any0:typing.overloadXB -__new__&pandas.core.indexes.base.Index.__new__"^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex* -cls -7Type[pandas.core.indexes.base.Index[pandas._typing.S1]] -1pandas.core.indexes.base.Index[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.indexes.base.Index"pandas.core.indexes.base.Index(* +name +Any*I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool 0:typing.overloadX +rename%pandas.core.indexes.base.Index.rename" +None* +self +1pandas.core.indexes.base.Index[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -16908,132 +22606,22 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.indexes.base.Index"type* -data -vUnion[typing.Sequence[Union[numpy.timedelta64,datetime.timedelta]],pandas.core.base.IndexOpsMixin[datetime.timedelta]] -TypeAlias[Union[builtins.str,CallableType[builtins.function]]] +3Union[builtins.str,CallableType[builtins.function]] + builtins.str" builtins.strK +CallableType[builtins.function]& +builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalar* +_self +(pandas.core.groupby.generic.NamedAgg._NT +RTuple[builtins.str,TypeAlias[Union[builtins.str,CallableType[builtins.function]]]] + builtins.str" builtins.str +>TypeAlias[Union[builtins.str,CallableType[builtins.function]]] +3Union[builtins.str,CallableType[builtins.function]] + builtins.str" builtins.strK +CallableType[builtins.function]& +builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalar** +column + builtins.str" builtins.str * +aggfunc +>TypeAlias[Union[builtins.str,CallableType[builtins.function]]] +3Union[builtins.str,CallableType[builtins.function]] + builtins.str" builtins.strK +CallableType[builtins.function]& +builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalar * + +__new__,pandas.core.groupby.generic.NamedAgg.__new__" +(pandas.core.groupby.generic.NamedAgg._NT +RTuple[builtins.str,TypeAlias[Union[builtins.str,CallableType[builtins.function]]]] + builtins.str" builtins.str +>TypeAlias[Union[builtins.str,CallableType[builtins.function]]] +3Union[builtins.str,CallableType[builtins.function]] + builtins.str" builtins.strK +CallableType[builtins.function]& +builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalar* +_cls +.Type[pandas.core.groupby.generic.NamedAgg._NT] +(pandas.core.groupby.generic.NamedAgg._NT +RTuple[builtins.str,TypeAlias[Union[builtins.str,CallableType[builtins.function]]]] + builtins.str" builtins.str +>TypeAlias[Union[builtins.str,CallableType[builtins.function]]] +3Union[builtins.str,CallableType[builtins.function]] + builtins.str" builtins.strK +CallableType[builtins.function]& +builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalar"type*( +column + builtins.str" builtins.str* +aggfunc +>TypeAlias[Union[builtins.str,CallableType[builtins.function]]] +3Union[builtins.str,CallableType[builtins.function]] + builtins.str" builtins.strK +CallableType[builtins.function]& +builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalar* +_asdict,pandas.core.groupby.generic.NamedAgg._asdict"W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict* +_self +(pandas.core.groupby.generic.NamedAgg._NT +RTuple[builtins.str,TypeAlias[Union[builtins.str,CallableType[builtins.function]]]] + builtins.str" builtins.str +>TypeAlias[Union[builtins.str,CallableType[builtins.function]]] +3Union[builtins.str,CallableType[builtins.function]] + builtins.str" builtins.strK +CallableType[builtins.function]& +builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalar* +_make*pandas.core.groupby.generic.NamedAgg._make" +(pandas.core.groupby.generic.NamedAgg._NT +RTuple[builtins.str,TypeAlias[Union[builtins.str,CallableType[builtins.function]]]] + builtins.str" builtins.str +>TypeAlias[Union[builtins.str,CallableType[builtins.function]]] +3Union[builtins.str,CallableType[builtins.function]] + builtins.str" builtins.strK +CallableType[builtins.function]& +builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalar* +_cls +.Type[pandas.core.groupby.generic.NamedAgg._NT] +(pandas.core.groupby.generic.NamedAgg._NT +RTuple[builtins.str,TypeAlias[Union[builtins.str,CallableType[builtins.function]]]] + builtins.str" builtins.str +>TypeAlias[Union[builtins.str,CallableType[builtins.function]]] +3Union[builtins.str,CallableType[builtins.function]] + builtins.str" builtins.strK +CallableType[builtins.function]& +builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalar"type*> +iterable0 +typing.Iterable[Any] +Any"typing.Iterable* +new +Any * +len +Any 0:prS +column+pandas.core.groupby.generic.NamedAgg.column + builtins.str" builtins.strr +aggfunc,pandas.core.groupby.generic.NamedAgg.aggfunc +>TypeAlias[Union[builtins.str,CallableType[builtins.function]]] +3Union[builtins.str,CallableType[builtins.function]] + builtins.str" builtins.strK +CallableType[builtins.function]& +builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalarrS +column+pandas.core.groupby.generic.NamedAgg.column + builtins.str" builtins.strr +aggfunc,pandas.core.groupby.generic.NamedAgg.aggfunc +>TypeAlias[Union[builtins.str,CallableType[builtins.function]]] +3Union[builtins.str,CallableType[builtins.function]] + builtins.str" builtins.strK +CallableType[builtins.function]& +builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalarr +_fields,pandas.core.groupby.generic.NamedAgg._fields` + Tuple[builtins.str,builtins.str] + builtins.str" builtins.str + builtins.str" builtins.strr + _field_types1pandas.core.groupby.generic.NamedAgg._field_typesW +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dictr +_field_defaults4pandas.core.groupby.generic.NamedAgg._field_defaultsW +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dictrU +_source,pandas.core.groupby.generic.NamedAgg._source + builtins.str" builtins.strr +__annotations__4pandas.core.groupby.generic.NamedAgg.__annotations__W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict +Period!pandas._libs.tslibs.period.Period"&pandas._libs.tslibs.period.PeriodMixin* +__init__*pandas._libs.tslibs.period.Period.__init__" +None*P +selfF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period* +value +Union[pandas._libs.tslibs.period.Period,builtins.str,datetime.datetime,datetime.date,pandas._libs.tslibs.timestamps.Timestamp,None]F +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period + builtins.str" builtins.str& +datetime.datetime"datetime.datetime + datetime.date" datetime.dateT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp +None * +freq +?Union[builtins.str,pandas._libs.tslibs.offsets.BaseOffset,None] + builtins.str" builtins.strP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset +None *S +ordinalD +Union[builtins.int,None] + builtins.int" builtins.int +None *P +yearD +Union[builtins.int,None] + builtins.int" builtins.int None *Q -limitD +monthD Union[builtins.int,None] builtins.int" builtins.int -None * - tolerance -Any * -get_indexer_non_uniqueApandas.core.indexes.interval.IntervalIndex.get_indexer_non_unique"* -self -Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] -pandas._typing.IntervalTN -#pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex*Z -targetN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index* -left/pandas.core.indexes.interval.IntervalIndex.left"N -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index* -self -Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] -pandas._typing.IntervalTN -#pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex0:builtins.property`* -right0pandas.core.indexes.interval.IntervalIndex.right"N -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index* -self -Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] -pandas._typing.IntervalTN -#pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex0:builtins.property`* -mid.pandas.core.indexes.interval.IntervalIndex.mid"N -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index* -self -Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] -pandas._typing.IntervalTN -#pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex0:builtins.property`* -length1pandas.core.indexes.interval.IntervalIndex.length"N -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index* -self -Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] -pandas._typing.IntervalTN -#pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex0:builtins.property`* - get_value4pandas.core.indexes.interval.IntervalIndex.get_value" -Any* -self -Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] -pandas._typing.IntervalTN -#pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* -series -/TypeAlias[Type[pandas.core.series.Series[Any]]]t -$Type[pandas.core.series.Series[Any]]D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series"type"$pandas.core.dtypes.generic.ABCSeries* -key -Any* - is_all_dates7pandas.core.indexes.interval.IntervalIndex.is_all_dates" - builtins.bool" builtins.bool* -self -Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] -pandas._typing.IntervalTN -#pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex0:builtins.property`2Z - from_breaks6pandas.core.indexes.interval.IntervalIndex.from_breaks - from_breaks6pandas.core.indexes.interval.IntervalIndex.from_breaks" -Xpandas.core.indexes.interval.IntervalIndex[pandas._libs.interval.Interval[builtins.int]]l -,pandas._libs.interval.Interval[builtins.int] - builtins.int" builtins.int"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* -cls -JType[pandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT]] -Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] -pandas._typing.IntervalTN -#pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex"type* -breaks -TypeAlias[Union[typing.Sequence[builtins.int],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],Unknown,Unknown,pandas.core.series.Series[builtins.int],pandas.core.indexes.base.Index[builtins.int]]] -Union[typing.Sequence[builtins.int],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],Unknown,Unknown,pandas.core.series.Series[builtins.int],pandas.core.indexes.base.Index[builtins.int]]N -typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.Sequence -STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] -Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] -Any -5numpy.dtype[numpy._typing._array_like._ScalarType_co][ -(numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArrayb -'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Seriesl -,pandas.core.indexes.base.Index[builtins.int] - builtins.int" builtins.int"pandas.core.indexes.base.Index"&pandas.core.indexes.interval._EdgesInt* -closed +None *S +quarterD +Union[builtins.int,None] + builtins.int" builtins.int +None *O +dayD +Union[builtins.int,None] + builtins.int" builtins.int +None *P +hourD +Union[builtins.int,None] + builtins.int" builtins.int +None *R +minuteD +Union[builtins.int,None] + builtins.int" builtins.int +None *R +secondD +Union[builtins.int,None] + builtins.int" builtins.int +None * +day%pandas._libs.tslibs.period.Period.day" + builtins.int" builtins.int*P +selfF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* + dayofweek+pandas._libs.tslibs.period.Period.dayofweek" + builtins.int" builtins.int*P +selfF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* + dayofyear+pandas._libs.tslibs.period.Period.dayofyear" + builtins.int" builtins.int*P +selfF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* + daysinmonth-pandas._libs.tslibs.period.Period.daysinmonth" + builtins.int" builtins.int*P +selfF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* + days_in_month/pandas._libs.tslibs.period.Period.days_in_month" + builtins.int" builtins.int*P +selfF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* +end_time*pandas._libs.tslibs.period.Period.end_time"T +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp*P +selfF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* +freq&pandas._libs.tslibs.period.Period.freq"P +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset*P +selfF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* +freqstr)pandas._libs.tslibs.period.Period.freqstr" + builtins.str" builtins.str*P +selfF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* +hour&pandas._libs.tslibs.period.Period.hour" + builtins.int" builtins.int*P +selfF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* +minute(pandas._libs.tslibs.period.Period.minute" + builtins.int" builtins.int*P +selfF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* +month'pandas._libs.tslibs.period.Period.month" + builtins.int" builtins.int*P +selfF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* +quarter)pandas._libs.tslibs.period.Period.quarter" + builtins.int" builtins.int*P +selfF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* +qyear'pandas._libs.tslibs.period.Period.qyear" + builtins.int" builtins.int*P +selfF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* +second(pandas._libs.tslibs.period.Period.second" + builtins.int" builtins.int*P +selfF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* +ordinal)pandas._libs.tslibs.period.Period.ordinal" + builtins.int" builtins.int*P +selfF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* + is_leap_year.pandas._libs.tslibs.period.Period.is_leap_year" + builtins.bool" builtins.bool*P +selfF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* + +start_time,pandas._libs.tslibs.period.Period.start_time"T +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp*P +selfF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* +week&pandas._libs.tslibs.period.Period.week" + builtins.int" builtins.int*P +selfF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* +weekday)pandas._libs.tslibs.period.Period.weekday" + builtins.int" builtins.int*P +selfF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* + +weekofyear,pandas._libs.tslibs.period.Period.weekofyear" + builtins.int" builtins.int*P +selfF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* +year&pandas._libs.tslibs.period.Period.year" + builtins.int" builtins.int*P +selfF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* + day_of_year-pandas._libs.tslibs.period.Period.day_of_year" + builtins.int" builtins.int*P +selfF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* + day_of_week-pandas._libs.tslibs.period.Period.day_of_week" + builtins.int" builtins.int*P +selfF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* +asfreq(pandas._libs.tslibs.period.Period.asfreq"F +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*P +selfF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period* +freq +:Union[builtins.str,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.strP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset* +how iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] ^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  @@ -19212,41 +25484,34 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"!pandas._typing.IntervalClosedType *. -name" -typing.Hashable"typing.Hashable ** -copy - builtins.bool" builtins.bool * -dtype -3Union[pandas.core.dtypes.dtypes.IntervalDtype,None]R -'pandas.core.dtypes.dtypes.IntervalDtype"'pandas.core.dtypes.dtypes.IntervalDtype -None 0:typing.overload:builtins.classmethodXp - from_breaks6pandas.core.indexes.interval.IntervalIndex.from_breaks" -Zpandas.core.indexes.interval.IntervalIndex[pandas._libs.interval.Interval[builtins.float]]r -.pandas._libs.interval.Interval[builtins.float] -builtins.float"builtins.float"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* -cls -JType[pandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT]] -Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] -pandas._typing.IntervalTN -#pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex"type* -breaks -TypeAlias[Union[typing.Sequence[builtins.float],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],pandas.core.series.Series[builtins.float],pandas.core.indexes.base.Index[builtins.float]]] -Union[typing.Sequence[builtins.float],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],pandas.core.series.Series[builtins.float],pandas.core.indexes.base.Index[builtins.float]]T -typing.Sequence[builtins.float] -builtins.float"builtins.float"typing.Sequence -STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] -Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] -Any -5numpy.dtype[numpy._typing._array_like._ScalarType_co][ -(numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArrayh -)pandas.core.series.Series[builtins.float] -builtins.float"builtins.float"pandas.core.series.Seriesr -.pandas.core.indexes.base.Index[builtins.float] -builtins.float"builtins.float"pandas.core.indexes.base.Index"(pandas.core.indexes.interval._EdgesFloat* -closed + builtins.str" builtins.str")pandas._libs.tslibs.period._PeriodFreqHow * +now%pandas._libs.tslibs.period.Period.now"F +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period* +clsy +'Type[pandas._libs.tslibs.period.Period]F +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period"type* +freq +:Union[builtins.str,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.strP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset 0:builtins.classmethodp* +strftime*pandas._libs.tslibs.period.Period.strftime" + builtins.str" builtins.str*P +selfF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*% +fmt + builtins.str" builtins.str* + to_timestamp.pandas._libs.tslibs.period.Period.to_timestamp"T +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp*P +selfF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period* +freq +?Union[builtins.str,pandas._libs.tslibs.offsets.BaseOffset,None] + builtins.str" builtins.strP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset +None * +how +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]] iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] ^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  @@ -19256,46 +25521,7 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"!pandas._typing.IntervalClosedType *. -name" -typing.Hashable"typing.Hashable ** -copy - builtins.bool" builtins.bool * -dtype -3Union[pandas.core.dtypes.dtypes.IntervalDtype,None]R -'pandas.core.dtypes.dtypes.IntervalDtype"'pandas.core.dtypes.dtypes.IntervalDtype -None 0:typing.overload:builtins.classmethodXp - from_breaks6pandas.core.indexes.interval.IntervalIndex.from_breaks" -tpandas.core.indexes.interval.IntervalIndex[pandas._libs.interval.Interval[pandas._libs.tslibs.timestamps.Timestamp]] -Hpandas._libs.interval.Interval[pandas._libs.tslibs.timestamps.Timestamp]T -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* -cls -JType[pandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT]] -Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] -pandas._typing.IntervalTN -#pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex"type* -breaks -TypeAlias[Union[typing.Sequence[TypeAlias[Union[datetime.datetime,numpy.datetime64,pandas._libs.tslibs.timestamps.Timestamp]]],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],pandas.core.series.TimestampSeries,pandas.core.indexes.datetimes.DatetimeIndex]] - -Union[typing.Sequence[TypeAlias[Union[datetime.datetime,numpy.datetime64,pandas._libs.tslibs.timestamps.Timestamp]]],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],pandas.core.series.TimestampSeries,pandas.core.indexes.datetimes.DatetimeIndex] -ntyping.Sequence[TypeAlias[Union[datetime.datetime,numpy.datetime64,pandas._libs.tslibs.timestamps.Timestamp]]] -]TypeAlias[Union[datetime.datetime,numpy.datetime64,pandas._libs.tslibs.timestamps.Timestamp]] -RUnion[datetime.datetime,numpy.datetime64,pandas._libs.tslibs.timestamps.Timestamp]& -datetime.datetime"datetime.datetime$ -numpy.datetime64"numpy.datetime64T -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"pandas._typing.DatetimeLike"typing.Sequence -STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] -Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] -Any -5numpy.dtype[numpy._typing._array_like._ScalarType_co][ -(numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArrayH -"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeriesZ -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex",pandas.core.indexes.interval._EdgesTimestamp* -closed -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 + builtins.str" builtins.str")pandas._libs.tslibs.period._PeriodFreqHow7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -19303,41 +25529,7 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"!pandas._typing.IntervalClosedType *. -name" -typing.Hashable"typing.Hashable ** -copy - builtins.bool" builtins.bool * -dtype -3Union[pandas.core.dtypes.dtypes.IntervalDtype,None]R -'pandas.core.dtypes.dtypes.IntervalDtype"'pandas.core.dtypes.dtypes.IntervalDtype -None 0:typing.overload:builtins.classmethodXp - from_breaks6pandas.core.indexes.interval.IntervalIndex.from_breaks" -tpandas.core.indexes.interval.IntervalIndex[pandas._libs.interval.Interval[pandas._libs.tslibs.timedeltas.Timedelta]] -Hpandas._libs.interval.Interval[pandas._libs.tslibs.timedeltas.Timedelta]T -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* -cls -JType[pandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT]] -Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] -pandas._typing.IntervalTN -#pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex"type* -breaks -TypeAlias[Union[typing.Sequence[pandas._libs.tslibs.timedeltas.Timedelta],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],pandas.core.series.TimedeltaSeries,pandas.core.indexes.timedeltas.TimedeltaIndex]] -Union[typing.Sequence[pandas._libs.tslibs.timedeltas.Timedelta],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],pandas.core.series.TimedeltaSeries,pandas.core.indexes.timedeltas.TimedeltaIndex] -9typing.Sequence[pandas._libs.tslibs.timedeltas.Timedelta]T -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"typing.Sequence -STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] -Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] -Any -5numpy.dtype[numpy._typing._array_like._ScalarType_co][ -(numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArrayH -"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex",pandas.core.indexes.interval._EdgesTimedelta* -closed -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -19345,848 +25537,2477 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"!pandas._typing.IntervalClosedType *. -name" -typing.Hashable"typing.Hashable ** -copy - builtins.bool" builtins.bool * -dtype -3Union[pandas.core.dtypes.dtypes.IntervalDtype,None]R -'pandas.core.dtypes.dtypes.IntervalDtype"'pandas.core.dtypes.dtypes.IntervalDtype -None 0:typing.overload:builtins.classmethodXp2 - from_arrays6pandas.core.indexes.interval.IntervalIndex.from_arrays - from_arrays6pandas.core.indexes.interval.IntervalIndex.from_arrays" -Xpandas.core.indexes.interval.IntervalIndex[pandas._libs.interval.Interval[builtins.int]]l -,pandas._libs.interval.Interval[builtins.int] - builtins.int" builtins.int"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* -cls -JType[pandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT]] -Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] -pandas._typing.IntervalTN -#pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex"type* -left -TypeAlias[Union[typing.Sequence[builtins.int],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],Unknown,Unknown,pandas.core.series.Series[builtins.int],pandas.core.indexes.base.Index[builtins.int]]] -Union[typing.Sequence[builtins.int],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],Unknown,Unknown,pandas.core.series.Series[builtins.int],pandas.core.indexes.base.Index[builtins.int]]N -typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.Sequence + builtins.str" builtins.str"0pandas._libs.tslibs.period._PeriodToTimestampHow 2 +__sub__)pandas._libs.tslibs.period.Period.__sub__ +__sub__)pandas._libs.tslibs.period.Period.__sub__"F +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period* +TypeAlias[Union[pandas._libs.tslibs.timedeltas.Timedelta,datetime.timedelta,numpy.timedelta64,TypeAlias[numpy.signedinteger[numpy._typing._64Bit]],builtins.int,pandas._libs.tslibs.offsets.BaseOffset]] +Union[pandas._libs.tslibs.timedeltas.Timedelta,datetime.timedelta,numpy.timedelta64,TypeAlias[numpy.signedinteger[numpy._typing._64Bit]],builtins.int,pandas._libs.tslibs.offsets.BaseOffset]T +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta( +datetime.timedelta"datetime.timedelta& +numpy.timedelta64"numpy.timedelta64 +4TypeAlias[numpy.signedinteger[numpy._typing._64Bit]]n +)numpy.signedinteger[numpy._typing._64Bit], +numpy._typing._64Bit"numpy._typing._64Bit"numpy.signedinteger" numpy.int64 + builtins.int" builtins.intP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"(pandas._libs.tslibs.period._PeriodAddSub0:typing.overloadX +__sub__)pandas._libs.tslibs.period.Period.__sub__"P +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:typing.overloadX +__sub__)pandas._libs.tslibs.period.Period.__sub__"J +#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*LJ +#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType0:typing.overloadX +__sub__)pandas._libs.tslibs.period.Period.__sub__"N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*RP +&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex0:typing.overloadX +__sub__)pandas._libs.tslibs.period.Period.__sub__"B +pandas.core.series.PeriodSeries"pandas.core.series.PeriodSeries*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*JH +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries0:typing.overloadX +__sub__)pandas._libs.tslibs.period.Period.__sub__"P +&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*`^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex0:typing.overloadX2 +__add__)pandas._libs.tslibs.period.Period.__add__ +__add__)pandas._libs.tslibs.period.Period.__add__"F +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period* +TypeAlias[Union[pandas._libs.tslibs.timedeltas.Timedelta,datetime.timedelta,numpy.timedelta64,TypeAlias[numpy.signedinteger[numpy._typing._64Bit]],builtins.int,pandas._libs.tslibs.offsets.BaseOffset]] +Union[pandas._libs.tslibs.timedeltas.Timedelta,datetime.timedelta,numpy.timedelta64,TypeAlias[numpy.signedinteger[numpy._typing._64Bit]],builtins.int,pandas._libs.tslibs.offsets.BaseOffset]T +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta( +datetime.timedelta"datetime.timedelta& +numpy.timedelta64"numpy.timedelta64 +4TypeAlias[numpy.signedinteger[numpy._typing._64Bit]]n +)numpy.signedinteger[numpy._typing._64Bit], +numpy._typing._64Bit"numpy._typing._64Bit"numpy.signedinteger" numpy.int64 + builtins.int" builtins.intP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"(pandas._libs.tslibs.period._PeriodAddSub0:typing.overloadX +__add__)pandas._libs.tslibs.period.Period.__add__"J +#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*LJ +#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType0:typing.overloadX +__add__)pandas._libs.tslibs.period.Period.__add__"P +&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*PN +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index0:typing.overloadX +__add__)pandas._libs.tslibs.period.Period.__add__"B +pandas.core.series.PeriodSeries"pandas.core.series.PeriodSeries*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period* +IUnion[pandas.core.series.OffsetSeries,pandas.core.series.TimedeltaSeries]B +pandas.core.series.OffsetSeries"pandas.core.series.OffsetSeriesH +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries0:typing.overloadX2 +__eq__(pandas._libs.tslibs.period.Period.__eq__ +__eq__(pandas._libs.tslibs.period.Period.__eq__" + builtins.bool" builtins.bool*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:typing.overloadX +__eq__(pandas._libs.tslibs.period.Period.__eq__" STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] Any 5numpy.dtype[numpy._typing._array_like._ScalarType_co][ (numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArrayb -'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Seriesl -,pandas.core.indexes.base.Index[builtins.int] - builtins.int" builtins.int"pandas.core.indexes.base.Index"&pandas.core.indexes.interval._EdgesInt* -right -TypeAlias[Union[typing.Sequence[builtins.int],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],Unknown,Unknown,pandas.core.series.Series[builtins.int],pandas.core.indexes.base.Index[builtins.int]]] -Union[typing.Sequence[builtins.int],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],Unknown,Unknown,pandas.core.series.Series[builtins.int],pandas.core.indexes.base.Index[builtins.int]]N -typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.Sequence + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*RP +&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex0:typing.overloadX +__eq__(pandas._libs.tslibs.period.Period.__eq__"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*DB +pandas.core.series.PeriodSeries"pandas.core.series.PeriodSeries0:typing.overloadX +__eq__(pandas._libs.tslibs.period.Period.__eq__": +Literal[builtins.bool]  + builtins.bool" builtins.bool*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*$" +builtins.object"builtins.object0:typing.overloadX2 +__ge__(pandas._libs.tslibs.period.Period.__ge__ +__ge__(pandas._libs.tslibs.period.Period.__ge__" + builtins.bool" builtins.bool*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:typing.overloadX +__ge__(pandas._libs.tslibs.period.Period.__ge__" STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] Any 5numpy.dtype[numpy._typing._array_like._ScalarType_co][ (numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArrayb -'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Seriesl -,pandas.core.indexes.base.Index[builtins.int] - builtins.int" builtins.int"pandas.core.indexes.base.Index"&pandas.core.indexes.interval._EdgesInt* -closed -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"!pandas._typing.IntervalClosedType *. -name" -typing.Hashable"typing.Hashable ** -copy - builtins.bool" builtins.bool * -dtype -3Union[pandas.core.dtypes.dtypes.IntervalDtype,None]R -'pandas.core.dtypes.dtypes.IntervalDtype"'pandas.core.dtypes.dtypes.IntervalDtype -None 0:typing.overload:builtins.classmethodXp - from_arrays6pandas.core.indexes.interval.IntervalIndex.from_arrays" -Zpandas.core.indexes.interval.IntervalIndex[pandas._libs.interval.Interval[builtins.float]]r -.pandas._libs.interval.Interval[builtins.float] -builtins.float"builtins.float"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* -cls -JType[pandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT]] -Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] -pandas._typing.IntervalTN -#pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex"type* -left -TypeAlias[Union[typing.Sequence[builtins.float],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],pandas.core.series.Series[builtins.float],pandas.core.indexes.base.Index[builtins.float]]] -Union[typing.Sequence[builtins.float],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],pandas.core.series.Series[builtins.float],pandas.core.indexes.base.Index[builtins.float]]T -typing.Sequence[builtins.float] -builtins.float"builtins.float"typing.Sequence + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*RP +&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex0:typing.overloadX +__ge__(pandas._libs.tslibs.period.Period.__ge__"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*DB +pandas.core.series.PeriodSeries"pandas.core.series.PeriodSeries0:typing.overloadX2 +__gt__(pandas._libs.tslibs.period.Period.__gt__ +__gt__(pandas._libs.tslibs.period.Period.__gt__" + builtins.bool" builtins.bool*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:typing.overloadX +__gt__(pandas._libs.tslibs.period.Period.__gt__" STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] Any 5numpy.dtype[numpy._typing._array_like._ScalarType_co][ (numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArrayh -)pandas.core.series.Series[builtins.float] -builtins.float"builtins.float"pandas.core.series.Seriesr -.pandas.core.indexes.base.Index[builtins.float] -builtins.float"builtins.float"pandas.core.indexes.base.Index"(pandas.core.indexes.interval._EdgesFloat* -right -TypeAlias[Union[typing.Sequence[builtins.float],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],pandas.core.series.Series[builtins.float],pandas.core.indexes.base.Index[builtins.float]]] -Union[typing.Sequence[builtins.float],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],pandas.core.series.Series[builtins.float],pandas.core.indexes.base.Index[builtins.float]]T -typing.Sequence[builtins.float] -builtins.float"builtins.float"typing.Sequence + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*RP +&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex0:typing.overloadX +__gt__(pandas._libs.tslibs.period.Period.__gt__"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*DB +pandas.core.series.PeriodSeries"pandas.core.series.PeriodSeries0:typing.overloadX2 +__le__(pandas._libs.tslibs.period.Period.__le__ +__le__(pandas._libs.tslibs.period.Period.__le__" + builtins.bool" builtins.bool*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:typing.overloadX +__le__(pandas._libs.tslibs.period.Period.__le__" STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] Any 5numpy.dtype[numpy._typing._array_like._ScalarType_co][ (numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArrayh -)pandas.core.series.Series[builtins.float] -builtins.float"builtins.float"pandas.core.series.Seriesr -.pandas.core.indexes.base.Index[builtins.float] -builtins.float"builtins.float"pandas.core.indexes.base.Index"(pandas.core.indexes.interval._EdgesFloat* -closed -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"!pandas._typing.IntervalClosedType *. -name" -typing.Hashable"typing.Hashable ** -copy - builtins.bool" builtins.bool * -dtype -3Union[pandas.core.dtypes.dtypes.IntervalDtype,None]R -'pandas.core.dtypes.dtypes.IntervalDtype"'pandas.core.dtypes.dtypes.IntervalDtype -None 0:typing.overload:builtins.classmethodXp' - from_arrays6pandas.core.indexes.interval.IntervalIndex.from_arrays" -tpandas.core.indexes.interval.IntervalIndex[pandas._libs.interval.Interval[pandas._libs.tslibs.timestamps.Timestamp]] -Hpandas._libs.interval.Interval[pandas._libs.tslibs.timestamps.Timestamp]T -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* -cls -JType[pandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT]] -Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] -pandas._typing.IntervalTN -#pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex"type* -left -TypeAlias[Union[typing.Sequence[TypeAlias[Union[datetime.datetime,numpy.datetime64,pandas._libs.tslibs.timestamps.Timestamp]]],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],pandas.core.series.TimestampSeries,pandas.core.indexes.datetimes.DatetimeIndex]] - -Union[typing.Sequence[TypeAlias[Union[datetime.datetime,numpy.datetime64,pandas._libs.tslibs.timestamps.Timestamp]]],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],pandas.core.series.TimestampSeries,pandas.core.indexes.datetimes.DatetimeIndex] -ntyping.Sequence[TypeAlias[Union[datetime.datetime,numpy.datetime64,pandas._libs.tslibs.timestamps.Timestamp]]] -]TypeAlias[Union[datetime.datetime,numpy.datetime64,pandas._libs.tslibs.timestamps.Timestamp]] -RUnion[datetime.datetime,numpy.datetime64,pandas._libs.tslibs.timestamps.Timestamp]& -datetime.datetime"datetime.datetime$ -numpy.datetime64"numpy.datetime64T -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"pandas._typing.DatetimeLike"typing.Sequence + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*RP +&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex0:typing.overloadX +__le__(pandas._libs.tslibs.period.Period.__le__"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*DB +pandas.core.series.PeriodSeries"pandas.core.series.PeriodSeries0:typing.overloadX2 +__lt__(pandas._libs.tslibs.period.Period.__lt__ +__lt__(pandas._libs.tslibs.period.Period.__lt__" + builtins.bool" builtins.bool*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:typing.overloadX +__lt__(pandas._libs.tslibs.period.Period.__lt__" STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] Any 5numpy.dtype[numpy._typing._array_like._ScalarType_co][ (numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArrayH -"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeriesZ -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex",pandas.core.indexes.interval._EdgesTimestamp* -right -TypeAlias[Union[typing.Sequence[TypeAlias[Union[datetime.datetime,numpy.datetime64,pandas._libs.tslibs.timestamps.Timestamp]]],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],pandas.core.series.TimestampSeries,pandas.core.indexes.datetimes.DatetimeIndex]] - -Union[typing.Sequence[TypeAlias[Union[datetime.datetime,numpy.datetime64,pandas._libs.tslibs.timestamps.Timestamp]]],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],pandas.core.series.TimestampSeries,pandas.core.indexes.datetimes.DatetimeIndex] -ntyping.Sequence[TypeAlias[Union[datetime.datetime,numpy.datetime64,pandas._libs.tslibs.timestamps.Timestamp]]] -]TypeAlias[Union[datetime.datetime,numpy.datetime64,pandas._libs.tslibs.timestamps.Timestamp]] -RUnion[datetime.datetime,numpy.datetime64,pandas._libs.tslibs.timestamps.Timestamp]& -datetime.datetime"datetime.datetime$ -numpy.datetime64"numpy.datetime64T -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"pandas._typing.DatetimeLike"typing.Sequence + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*RP +&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex0:typing.overloadX +__lt__(pandas._libs.tslibs.period.Period.__lt__"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*DB +pandas.core.series.PeriodSeries"pandas.core.series.PeriodSeries0:typing.overloadX2 +__ne__(pandas._libs.tslibs.period.Period.__ne__ +__ne__(pandas._libs.tslibs.period.Period.__ne__" + builtins.bool" builtins.bool*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:typing.overloadX +__ne__(pandas._libs.tslibs.period.Period.__ne__" STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] Any 5numpy.dtype[numpy._typing._array_like._ScalarType_co][ (numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArrayH -"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeriesZ -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex",pandas.core.indexes.interval._EdgesTimestamp* -closed -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"!pandas._typing.IntervalClosedType *. -name" -typing.Hashable"typing.Hashable ** + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*RP +&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex0:typing.overloadX +__ne__(pandas._libs.tslibs.period.Period.__ne__"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*DB +pandas.core.series.PeriodSeries"pandas.core.series.PeriodSeries0:typing.overloadX +__ne__(pandas._libs.tslibs.period.Period.__ne__": +Literal[builtins.bool]  + builtins.bool" builtins.bool*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*$" +builtins.object"builtins.object0:typing.overloadX2 +__radd__*pandas._libs.tslibs.period.Period.__radd__ +__radd__*pandas._libs.tslibs.period.Period.__radd__"F +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period* +TypeAlias[Union[pandas._libs.tslibs.timedeltas.Timedelta,datetime.timedelta,numpy.timedelta64,TypeAlias[numpy.signedinteger[numpy._typing._64Bit]],builtins.int,pandas._libs.tslibs.offsets.BaseOffset]] +Union[pandas._libs.tslibs.timedeltas.Timedelta,datetime.timedelta,numpy.timedelta64,TypeAlias[numpy.signedinteger[numpy._typing._64Bit]],builtins.int,pandas._libs.tslibs.offsets.BaseOffset]T +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta( +datetime.timedelta"datetime.timedelta& +numpy.timedelta64"numpy.timedelta64 +4TypeAlias[numpy.signedinteger[numpy._typing._64Bit]]n +)numpy.signedinteger[numpy._typing._64Bit], +numpy._typing._64Bit"numpy._typing._64Bit"numpy.signedinteger" numpy.int64 + builtins.int" builtins.intP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"(pandas._libs.tslibs.period._PeriodAddSub0:typing.overloadX +__radd__*pandas._libs.tslibs.period.Period.__radd__"N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*PN +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index0:typing.overloadX +__radd__*pandas._libs.tslibs.period.Period.__radd__"B +pandas.core.series.PeriodSeries"pandas.core.series.PeriodSeries*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*JH +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries0:typing.overloadX +__radd__*pandas._libs.tslibs.period.Period.__radd__"J +#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*LJ +#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType0:typing.overloadX + PeriodDtype%pandas.core.dtypes.dtypes.PeriodDtype".pandas.core.dtypes.dtypes.PandasExtensionDtype* +__init__.pandas.core.dtypes.dtypes.PeriodDtype.__init__" +None*X +selfN +%pandas.core.dtypes.dtypes.PeriodDtype"%pandas.core.dtypes.dtypes.PeriodDtype* +freq +wUnion[builtins.str,pandas._libs.tslibs.offsets.SingleConstructorOffset,pandas._libs.tslibs.offsets.RelativeDeltaOffset] + builtins.str" builtins.strj +3pandas._libs.tslibs.offsets.SingleConstructorOffset"3pandas._libs.tslibs.offsets.SingleConstructorOffsetb +/pandas._libs.tslibs.offsets.RelativeDeltaOffset"/pandas._libs.tslibs.offsets.RelativeDeltaOffset * +freq*pandas.core.dtypes.dtypes.PeriodDtype.freq"P +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset*X +selfN +%pandas.core.dtypes.dtypes.PeriodDtype"%pandas.core.dtypes.dtypes.PeriodDtype0:builtins.property`* +na_value.pandas.core.dtypes.dtypes.PeriodDtype.na_value"J +#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType*X +selfN +%pandas.core.dtypes.dtypes.PeriodDtype"%pandas.core.dtypes.dtypes.PeriodDtype0:builtins.property`= + PeriodIndex&pandas.core.indexes.period.PeriodIndex"6pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin"1pandas.core.indexes.accessors.PeriodIndexFieldOps* +__new__.pandas.core.indexes.period.PeriodIndex.__new__" +Any* +cls +,Type[pandas.core.indexes.period.PeriodIndex]P +&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex"type* +data +Any * +ordinal +Any * +freq +Any * +tz +Any * +dtype +Any ** copy - builtins.bool" builtins.bool * -dtype -3Union[pandas.core.dtypes.dtypes.IntervalDtype,None]R -'pandas.core.dtypes.dtypes.IntervalDtype"'pandas.core.dtypes.dtypes.IntervalDtype -None 0:typing.overload:builtins.classmethodXp - from_arrays6pandas.core.indexes.interval.IntervalIndex.from_arrays" -tpandas.core.indexes.interval.IntervalIndex[pandas._libs.interval.Interval[pandas._libs.tslibs.timedeltas.Timedelta]] -Hpandas._libs.interval.Interval[pandas._libs.tslibs.timedeltas.Timedelta]T -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex* -cls -JType[pandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT]] -Dpandas.core.indexes.interval.IntervalIndex[pandas._typing.IntervalT] -pandas._typing.IntervalTN -#pandas._libs.interval.Interval[Any] -Any"pandas._libs.interval.Interval"pandas._libs.interval.Interval"*pandas.core.indexes.interval.IntervalIndex"type* -left -TypeAlias[Union[typing.Sequence[pandas._libs.tslibs.timedeltas.Timedelta],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],pandas.core.series.TimedeltaSeries,pandas.core.indexes.timedeltas.TimedeltaIndex]] -Union[typing.Sequence[pandas._libs.tslibs.timedeltas.Timedelta],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],pandas.core.series.TimedeltaSeries,pandas.core.indexes.timedeltas.TimedeltaIndex] -9typing.Sequence[pandas._libs.tslibs.timedeltas.Timedelta]T -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"typing.Sequence + builtins.bool" builtins.bool * +name +Any * +fields +Any*X +values-pandas.core.indexes.period.PeriodIndex.values* +self0:builtins.property`* + __contains__3pandas.core.indexes.period.PeriodIndex.__contains__" + builtins.bool" builtins.bool*RP +&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex*  +Any* + __array__0pandas.core.indexes.period.PeriodIndex.__array__"9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray*Z +selfP +&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex* +dtype +Any *l +__array_wrap__5pandas.core.indexes.period.PeriodIndex.__array_wrap__* +self* + +result* +context *\ + asof_locs0pandas.core.indexes.period.PeriodIndex.asof_locs* +self* +where* +mask* +astype-pandas.core.indexes.period.PeriodIndex.astype" +Any*Z +selfP +&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex* +dtype +Any** +copy + builtins.bool" builtins.bool *' +how + builtins.str" builtins.str * + searchsorted3pandas.core.indexes.period.PeriodIndex.searchsorted" +Any*Z +selfP +&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex* +value +Any*( +side + builtins.str" builtins.str * +sorter +Any * +is_full.pandas.core.indexes.period.PeriodIndex.is_full" + builtins.bool" builtins.bool*Z +selfP +&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex0:builtins.property`* + inferred_type4pandas.core.indexes.period.PeriodIndex.inferred_type" + builtins.str" builtins.str*Z +selfP +&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex0:builtins.property`* + get_indexer2pandas.core.indexes.period.PeriodIndex.get_indexer* +self* + +target* +method * +limit * + tolerance *m +get_indexer_non_unique=pandas.core.indexes.period.PeriodIndex.get_indexer_non_unique* +self* + +target*T +insert-pandas.core.indexes.period.PeriodIndex.insert* +self* +loc* +item* +join+pandas.core.indexes.period.PeriodIndex.join" +Any*Z +selfP +&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex* +other +Any*' +how + builtins.str" builtins.str * +level +Any *5 +return_indexers + builtins.bool" builtins.bool ** +sort + builtins.bool" builtins.bool *` + +difference1pandas.core.indexes.period.PeriodIndex.difference* +self* +other* + +sort * + memory_usage3pandas.core.indexes.period.PeriodIndex.memory_usage" +Any*Z +selfP +&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex** +deep + builtins.bool" builtins.bool * +freqstr.pandas.core.indexes.period.PeriodIndex.freqstr" + builtins.str" builtins.str*Z +selfP +&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex0:builtins.property`2 +__sub__.pandas.core.indexes.period.PeriodIndex.__sub__ +__sub__.pandas.core.indexes.period.PeriodIndex.__sub__"N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index*RP +&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:typing.overloadX +__sub__.pandas.core.indexes.period.PeriodIndex.__sub__"N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index* ++pandas.core.indexes.period.PeriodIndex.SelfP +&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex(* ++pandas.core.indexes.period.PeriodIndex.SelfP +&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex(0:typing.overloadX + +__sub__.pandas.core.indexes.period.PeriodIndex.__sub__" ++pandas.core.indexes.period.PeriodIndex.SelfP +&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex(* ++pandas.core.indexes.period.PeriodIndex.SelfP +&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex(* +TypeAlias[Union[pandas._libs.tslibs.timedeltas.Timedelta,datetime.timedelta,numpy.timedelta64,TypeAlias[numpy.signedinteger[numpy._typing._64Bit]],builtins.int,pandas._libs.tslibs.offsets.BaseOffset]] +Union[pandas._libs.tslibs.timedeltas.Timedelta,datetime.timedelta,numpy.timedelta64,TypeAlias[numpy.signedinteger[numpy._typing._64Bit]],builtins.int,pandas._libs.tslibs.offsets.BaseOffset]T +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta( +datetime.timedelta"datetime.timedelta& +numpy.timedelta64"numpy.timedelta64 +4TypeAlias[numpy.signedinteger[numpy._typing._64Bit]]n +)numpy.signedinteger[numpy._typing._64Bit], +numpy._typing._64Bit"numpy._typing._64Bit"numpy.signedinteger" numpy.int64 + builtins.int" builtins.intP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"(pandas._libs.tslibs.period._PeriodAddSub0:typing.overloadX +__sub__.pandas.core.indexes.period.PeriodIndex.__sub__"J +#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType*RP +&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex*LJ +#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType0:typing.overloadX +__sub__.pandas.core.indexes.period.PeriodIndex.__sub__" ++pandas.core.indexes.period.PeriodIndex.SelfP +&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex(* ++pandas.core.indexes.period.PeriodIndex.SelfP +&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex(* +]Union[pandas.core.indexes.timedeltas.TimedeltaIndex,pandas._libs.tslibs.timedeltas.Timedelta]^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndexT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta0:typing.overloadX2 +__rsub__/pandas.core.indexes.period.PeriodIndex.__rsub__ +__rsub__/pandas.core.indexes.period.PeriodIndex.__rsub__"N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index*RP +&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex*HF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:typing.overloadX +__rsub__/pandas.core.indexes.period.PeriodIndex.__rsub__"N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index* ++pandas.core.indexes.period.PeriodIndex.SelfP +&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex(* ++pandas.core.indexes.period.PeriodIndex.SelfP +&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex(0:typing.overloadX +__rsub__/pandas.core.indexes.period.PeriodIndex.__rsub__"J +#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType*RP +&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex*LJ +#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType0:typing.overloadXC + +RangeIndex$pandas.core.indexes.range.RangeIndex"pandas.core.indexes.base.Index* +__new__,pandas.core.indexes.range.RangeIndex.__new__" +Any* +cls +*Type[pandas.core.indexes.range.RangeIndex]L +$pandas.core.indexes.range.RangeIndex"$pandas.core.indexes.range.RangeIndex"type* +start +GUnion[builtins.int,pandas.core.indexes.range.RangeIndex,builtins.range] + builtins.int" builtins.intL +$pandas.core.indexes.range.RangeIndex"$pandas.core.indexes.range.RangeIndex +builtins.range"builtins.range *( +stop + builtins.int" builtins.int *( +step + builtins.int" builtins.int * +dtype +Any ** +copy + builtins.bool" builtins.bool * +name +Any * + +from_range/pandas.core.indexes.range.RangeIndex.from_range* +cls* +data* + +name * +dtype 0:builtins.classmethodp*G + +__reduce__/pandas.core.indexes.range.RangeIndex.__reduce__* +self*= +start*pandas.core.indexes.range.RangeIndex.start* +self*; +stop)pandas.core.indexes.range.RangeIndex.stop* +self*; +step)pandas.core.indexes.range.RangeIndex.step* +self* +nbytes+pandas.core.indexes.range.RangeIndex.nbytes" + builtins.int" builtins.int*V +selfL +$pandas.core.indexes.range.RangeIndex"$pandas.core.indexes.range.RangeIndex0:builtins.property`* + memory_usage1pandas.core.indexes.range.RangeIndex.memory_usage" + builtins.int" builtins.int*V +selfL +$pandas.core.indexes.range.RangeIndex"$pandas.core.indexes.range.RangeIndex** +deep + builtins.bool" builtins.bool * +dtype*pandas.core.indexes.range.RangeIndex.dtype"( +numpy.dtype[Any] +Any" numpy.dtype*V +selfL +$pandas.core.indexes.range.RangeIndex"$pandas.core.indexes.range.RangeIndex0:builtins.property`* + is_unique.pandas.core.indexes.range.RangeIndex.is_unique" + builtins.bool" builtins.bool*V +selfL +$pandas.core.indexes.range.RangeIndex"$pandas.core.indexes.range.RangeIndex0:builtins.property`* +is_monotonic_increasingTypeAlias[Union[builtins.str,CallableType[builtins.function]]] -3Union[builtins.str,CallableType[builtins.function]] - builtins.str" builtins.strK -CallableType[builtins.function]& -builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalar* -_self -(pandas.core.groupby.generic.NamedAgg._NT -RTuple[builtins.str,TypeAlias[Union[builtins.str,CallableType[builtins.function]]]] - builtins.str" builtins.str ->TypeAlias[Union[builtins.str,CallableType[builtins.function]]] -3Union[builtins.str,CallableType[builtins.function]] - builtins.str" builtins.strK -CallableType[builtins.function]& -builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalar** -column - builtins.str" builtins.str * -aggfunc ->TypeAlias[Union[builtins.str,CallableType[builtins.function]]] -3Union[builtins.str,CallableType[builtins.function]] - builtins.str" builtins.strK -CallableType[builtins.function]& -builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalar * - -__new__,pandas.core.groupby.generic.NamedAgg.__new__" -(pandas.core.groupby.generic.NamedAgg._NT -RTuple[builtins.str,TypeAlias[Union[builtins.str,CallableType[builtins.function]]]] - builtins.str" builtins.str ->TypeAlias[Union[builtins.str,CallableType[builtins.function]]] -3Union[builtins.str,CallableType[builtins.function]] - builtins.str" builtins.strK -CallableType[builtins.function]& -builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalar* -_cls -.Type[pandas.core.groupby.generic.NamedAgg._NT] -(pandas.core.groupby.generic.NamedAgg._NT -RTuple[builtins.str,TypeAlias[Union[builtins.str,CallableType[builtins.function]]]] - builtins.str" builtins.str ->TypeAlias[Union[builtins.str,CallableType[builtins.function]]] -3Union[builtins.str,CallableType[builtins.function]] - builtins.str" builtins.strK -CallableType[builtins.function]& -builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalar"type** -column - builtins.str" builtins.str * -aggfunc ->TypeAlias[Union[builtins.str,CallableType[builtins.function]]] -3Union[builtins.str,CallableType[builtins.function]] - builtins.str" builtins.strK -CallableType[builtins.function]& -builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalar * -_asdict,pandas.core.groupby.generic.NamedAgg._asdict"W -builtins.dict[builtins.str,Any] - builtins.str" builtins.str -Any" builtins.dict* -_self -(pandas.core.groupby.generic.NamedAgg._NT -RTuple[builtins.str,TypeAlias[Union[builtins.str,CallableType[builtins.function]]]] - builtins.str" builtins.str ->TypeAlias[Union[builtins.str,CallableType[builtins.function]]] -3Union[builtins.str,CallableType[builtins.function]] - builtins.str" builtins.strK -CallableType[builtins.function]& -builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalar* -_make*pandas.core.groupby.generic.NamedAgg._make" -(pandas.core.groupby.generic.NamedAgg._NT -RTuple[builtins.str,TypeAlias[Union[builtins.str,CallableType[builtins.function]]]] - builtins.str" builtins.str ->TypeAlias[Union[builtins.str,CallableType[builtins.function]]] -3Union[builtins.str,CallableType[builtins.function]] - builtins.str" builtins.strK -CallableType[builtins.function]& -builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalar* -_cls -.Type[pandas.core.groupby.generic.NamedAgg._NT] -(pandas.core.groupby.generic.NamedAgg._NT -RTuple[builtins.str,TypeAlias[Union[builtins.str,CallableType[builtins.function]]]] - builtins.str" builtins.str ->TypeAlias[Union[builtins.str,CallableType[builtins.function]]] -3Union[builtins.str,CallableType[builtins.function]] - builtins.str" builtins.strK -CallableType[builtins.function]& -builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalar"type*> -iterable0 -typing.Iterable[Any] -Any"typing.Iterable* -new -Any * -len -Any 0:prS -column+pandas.core.groupby.generic.NamedAgg.column - builtins.str" builtins.strr -aggfunc,pandas.core.groupby.generic.NamedAgg.aggfunc ->TypeAlias[Union[builtins.str,CallableType[builtins.function]]] -3Union[builtins.str,CallableType[builtins.function]] - builtins.str" builtins.strK -CallableType[builtins.function]& -builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalarrS -column+pandas.core.groupby.generic.NamedAgg.column - builtins.str" builtins.strr -aggfunc,pandas.core.groupby.generic.NamedAgg.aggfunc ->TypeAlias[Union[builtins.str,CallableType[builtins.function]]] -3Union[builtins.str,CallableType[builtins.function]] - builtins.str" builtins.strK -CallableType[builtins.function]& -builtins.function"builtins.function"%pandas.core.groupby.generic.AggScalarr -_fields,pandas.core.groupby.generic.NamedAgg._fields` - Tuple[builtins.str,builtins.str] - builtins.str" builtins.str - builtins.str" builtins.strr - _field_types1pandas.core.groupby.generic.NamedAgg._field_typesW -builtins.dict[builtins.str,Any] - builtins.str" builtins.str -Any" builtins.dictr -_field_defaults4pandas.core.groupby.generic.NamedAgg._field_defaultsW -builtins.dict[builtins.str,Any] - builtins.str" builtins.str -Any" builtins.dictrU -_source,pandas.core.groupby.generic.NamedAgg._source - builtins.str" builtins.strr -__annotations__4pandas.core.groupby.generic.NamedAgg.__annotations__W -builtins.dict[builtins.str,Any] - builtins.str" builtins.str -Any" builtins.dict -Period!pandas._libs.tslibs.period.Period"&pandas._libs.tslibs.period.PeriodMixin* -__init__*pandas._libs.tslibs.period.Period.__init__" -None*P -selfF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period* -value -Union[pandas._libs.tslibs.period.Period,builtins.str,datetime.datetime,datetime.date,pandas._libs.tslibs.timestamps.Timestamp,None]F -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period - builtins.str" builtins.str& -datetime.datetime"datetime.datetime - datetime.date" datetime.dateT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp -None * -freq -?Union[builtins.str,pandas._libs.tslibs.offsets.BaseOffset,None] - builtins.str" builtins.strP -&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset -None *S -ordinalD -Union[builtins.int,None] - builtins.int" builtins.int -None *P -yearD -Union[builtins.int,None] - builtins.int" builtins.int -None *Q -monthD -Union[builtins.int,None] - builtins.int" builtins.int -None *S -quarterD -Union[builtins.int,None] - builtins.int" builtins.int -None *O -dayD -Union[builtins.int,None] - builtins.int" builtins.int -None *P -hourD -Union[builtins.int,None] - builtins.int" builtins.int -None *R -minuteD -Union[builtins.int,None] - builtins.int" builtins.int -None *R -secondD -Union[builtins.int,None] - builtins.int" builtins.int -None * -day%pandas._libs.tslibs.period.Period.day" - builtins.int" builtins.int*P -selfF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* - dayofweek+pandas._libs.tslibs.period.Period.dayofweek" - builtins.int" builtins.int*P -selfF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* - dayofyear+pandas._libs.tslibs.period.Period.dayofyear" - builtins.int" builtins.int*P -selfF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* - daysinmonth-pandas._libs.tslibs.period.Period.daysinmonth" - builtins.int" builtins.int*P -selfF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* - days_in_month/pandas._libs.tslibs.period.Period.days_in_month" - builtins.int" builtins.int*P -selfF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* -end_time*pandas._libs.tslibs.period.Period.end_time"T -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp*P -selfF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* -freq&pandas._libs.tslibs.period.Period.freq"P -&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset*P -selfF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* -freqstr)pandas._libs.tslibs.period.Period.freqstr" - builtins.str" builtins.str*P -selfF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* -hour&pandas._libs.tslibs.period.Period.hour" - builtins.int" builtins.int*P -selfF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* -minute(pandas._libs.tslibs.period.Period.minute" - builtins.int" builtins.int*P -selfF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* -month'pandas._libs.tslibs.period.Period.month" - builtins.int" builtins.int*P -selfF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* -quarter)pandas._libs.tslibs.period.Period.quarter" - builtins.int" builtins.int*P -selfF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* -qyear'pandas._libs.tslibs.period.Period.qyear" - builtins.int" builtins.int*P -selfF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* -second(pandas._libs.tslibs.period.Period.second" - builtins.int" builtins.int*P -selfF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* -ordinal)pandas._libs.tslibs.period.Period.ordinal" - builtins.int" builtins.int*P -selfF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* - is_leap_year.pandas._libs.tslibs.period.Period.is_leap_year" - builtins.bool" builtins.bool*P -selfF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* - -start_time,pandas._libs.tslibs.period.Period.start_time"T -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp*P -selfF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* -week&pandas._libs.tslibs.period.Period.week" - builtins.int" builtins.int*P -selfF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* -weekday)pandas._libs.tslibs.period.Period.weekday" - builtins.int" builtins.int*P -selfF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* - -weekofyear,pandas._libs.tslibs.period.Period.weekofyear" - builtins.int" builtins.int*P -selfF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* -year&pandas._libs.tslibs.period.Period.year" - builtins.int" builtins.int*P -selfF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* - day_of_year-pandas._libs.tslibs.period.Period.day_of_year" - builtins.int" builtins.int*P -selfF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* - day_of_week-pandas._libs.tslibs.period.Period.day_of_week" - builtins.int" builtins.int*P -selfF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:builtins.property`* -asfreq(pandas._libs.tslibs.period.Period.asfreq"F -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*P -selfF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period* -freq -:Union[builtins.str,pandas._libs.tslibs.offsets.BaseOffset] - builtins.str" builtins.strP -&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset* -how -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Mapping* +argsort!pandas.core.series.Series.argsort"b +'pandas.core.series.Series[builtins.int] + builtins.int" builtins.int"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str")pandas._libs.tslibs.period._PeriodFreqHow * -now%pandas._libs.tslibs.period.Period.now"F -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period* -clsy -'Type[pandas._libs.tslibs.period.Period]F -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period"type* -freq -:Union[builtins.str,pandas._libs.tslibs.offsets.BaseOffset] - builtins.str" builtins.strP -&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset 0:builtins.classmethodp* -strftime*pandas._libs.tslibs.period.Period.strftime" - builtins.str" builtins.str*P -selfF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*% -fmt - builtins.str" builtins.str* - to_timestamp.pandas._libs.tslibs.period.Period.to_timestamp"T -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp*P -selfF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period* -freq -?Union[builtins.str,pandas._libs.tslibs.offsets.BaseOffset,None] - builtins.str" builtins.strP -&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset -None * -how -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]] +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex * +kind iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] ^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  @@ -20902,704 +28393,609 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str")pandas._libs.tslibs.period._PeriodFreqHow7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 + builtins.str" builtins.str"pandas._typing.SortKind * +order +None ** +nlargest"pandas.core.series.Series.nlargest" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*% +n + builtins.int" builtins.int * +keep +ZUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],Literal[builtins.str]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str7 + builtins.str" builtins.str"pandas._typing.NaPosition7 Literal[builtins.str]  - builtins.str" builtins.str7 + builtins.str" builtins.str ** + nsmallest#pandas.core.series.Series.nsmallest" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*% +n + builtins.int" builtins.int * +keep +ZUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],Literal[builtins.str]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str7 + builtins.str" builtins.str"pandas._typing.NaPosition7 Literal[builtins.str]  - builtins.str" builtins.str"0pandas._libs.tslibs.period._PeriodToTimestampHow 2 -__sub__)pandas._libs.tslibs.period.Period.__sub__ -__sub__)pandas._libs.tslibs.period.Period.__sub__"F -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period* -TypeAlias[Union[pandas._libs.tslibs.timedeltas.Timedelta,datetime.timedelta,numpy.timedelta64,TypeAlias[numpy.signedinteger[numpy._typing._64Bit]],builtins.int,pandas._libs.tslibs.offsets.BaseOffset]] -Union[pandas._libs.tslibs.timedeltas.Timedelta,datetime.timedelta,numpy.timedelta64,TypeAlias[numpy.signedinteger[numpy._typing._64Bit]],builtins.int,pandas._libs.tslibs.offsets.BaseOffset]T -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta( -datetime.timedelta"datetime.timedelta& -numpy.timedelta64"numpy.timedelta64 -4TypeAlias[numpy.signedinteger[numpy._typing._64Bit]]n -)numpy.signedinteger[numpy._typing._64Bit], -numpy._typing._64Bit"numpy._typing._64Bit"numpy.signedinteger" numpy.int64 - builtins.int" builtins.intP -&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"(pandas._libs.tslibs.period._PeriodAddSub0:typing.overloadX -__sub__)pandas._libs.tslibs.period.Period.__sub__"P -&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:typing.overloadX -__sub__)pandas._libs.tslibs.period.Period.__sub__"J -#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*LJ -#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType0:typing.overloadX -__sub__)pandas._libs.tslibs.period.Period.__sub__"N -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*RP -&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex0:typing.overloadX -__sub__)pandas._libs.tslibs.period.Period.__sub__"B -pandas.core.series.PeriodSeries"pandas.core.series.PeriodSeries*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*JH -"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries0:typing.overloadX -__sub__)pandas._libs.tslibs.period.Period.__sub__"P -&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*`^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex0:typing.overloadX2 -__add__)pandas._libs.tslibs.period.Period.__add__ -__add__)pandas._libs.tslibs.period.Period.__add__"F -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period* -TypeAlias[Union[pandas._libs.tslibs.timedeltas.Timedelta,datetime.timedelta,numpy.timedelta64,TypeAlias[numpy.signedinteger[numpy._typing._64Bit]],builtins.int,pandas._libs.tslibs.offsets.BaseOffset]] -Union[pandas._libs.tslibs.timedeltas.Timedelta,datetime.timedelta,numpy.timedelta64,TypeAlias[numpy.signedinteger[numpy._typing._64Bit]],builtins.int,pandas._libs.tslibs.offsets.BaseOffset]T -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta( -datetime.timedelta"datetime.timedelta& -numpy.timedelta64"numpy.timedelta64 -4TypeAlias[numpy.signedinteger[numpy._typing._64Bit]]n -)numpy.signedinteger[numpy._typing._64Bit], -numpy._typing._64Bit"numpy._typing._64Bit"numpy.signedinteger" numpy.int64 - builtins.int" builtins.intP -&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"(pandas._libs.tslibs.period._PeriodAddSub0:typing.overloadX -__add__)pandas._libs.tslibs.period.Period.__add__"J -#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*LJ -#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType0:typing.overloadX -__add__)pandas._libs.tslibs.period.Period.__add__"P -&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*PN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index0:typing.overloadX -__add__)pandas._libs.tslibs.period.Period.__add__"B -pandas.core.series.PeriodSeries"pandas.core.series.PeriodSeries*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period* -IUnion[pandas.core.series.OffsetSeries,pandas.core.series.TimedeltaSeries]B -pandas.core.series.OffsetSeries"pandas.core.series.OffsetSeriesH -"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries0:typing.overloadX2 -__eq__(pandas._libs.tslibs.period.Period.__eq__ -__eq__(pandas._libs.tslibs.period.Period.__eq__" - builtins.bool" builtins.bool*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:typing.overloadX -__eq__(pandas._libs.tslibs.period.Period.__eq__" -STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] -Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] -Any -5numpy.dtype[numpy._typing._array_like._ScalarType_co][ -(numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*RP -&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex0:typing.overloadX -__eq__(pandas._libs.tslibs.period.Period.__eq__"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*DB -pandas.core.series.PeriodSeries"pandas.core.series.PeriodSeries0:typing.overloadX -__eq__(pandas._libs.tslibs.period.Period.__eq__": -Literal[builtins.bool]  - builtins.bool" builtins.bool*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*$" -builtins.object"builtins.object0:typing.overloadX2 -__ge__(pandas._libs.tslibs.period.Period.__ge__ -__ge__(pandas._libs.tslibs.period.Period.__ge__" - builtins.bool" builtins.bool*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:typing.overloadX -__ge__(pandas._libs.tslibs.period.Period.__ge__" -STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] -Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] -Any -5numpy.dtype[numpy._typing._array_like._ScalarType_co][ -(numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*RP -&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex0:typing.overloadX -__ge__(pandas._libs.tslibs.period.Period.__ge__"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*DB -pandas.core.series.PeriodSeries"pandas.core.series.PeriodSeries0:typing.overloadX2 -__gt__(pandas._libs.tslibs.period.Period.__gt__ -__gt__(pandas._libs.tslibs.period.Period.__gt__" - builtins.bool" builtins.bool*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:typing.overloadX -__gt__(pandas._libs.tslibs.period.Period.__gt__" -STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] -Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] -Any -5numpy.dtype[numpy._typing._array_like._ScalarType_co][ -(numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*RP -&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex0:typing.overloadX -__gt__(pandas._libs.tslibs.period.Period.__gt__"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*DB -pandas.core.series.PeriodSeries"pandas.core.series.PeriodSeries0:typing.overloadX2 -__le__(pandas._libs.tslibs.period.Period.__le__ -__le__(pandas._libs.tslibs.period.Period.__le__" - builtins.bool" builtins.bool*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:typing.overloadX -__le__(pandas._libs.tslibs.period.Period.__le__" -STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] -Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] -Any -5numpy.dtype[numpy._typing._array_like._ScalarType_co][ -(numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*RP -&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex0:typing.overloadX -__le__(pandas._libs.tslibs.period.Period.__le__"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*DB -pandas.core.series.PeriodSeries"pandas.core.series.PeriodSeries0:typing.overloadX2 -__lt__(pandas._libs.tslibs.period.Period.__lt__ -__lt__(pandas._libs.tslibs.period.Period.__lt__" - builtins.bool" builtins.bool*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:typing.overloadX -__lt__(pandas._libs.tslibs.period.Period.__lt__" -STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] -Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] -Any -5numpy.dtype[numpy._typing._array_like._ScalarType_co][ -(numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*RP -&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex0:typing.overloadX -__lt__(pandas._libs.tslibs.period.Period.__lt__"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*DB -pandas.core.series.PeriodSeries"pandas.core.series.PeriodSeries0:typing.overloadX2 -__ne__(pandas._libs.tslibs.period.Period.__ne__ -__ne__(pandas._libs.tslibs.period.Period.__ne__" - builtins.bool" builtins.bool*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:typing.overloadX -__ne__(pandas._libs.tslibs.period.Period.__ne__" -STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] -Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] -Any -5numpy.dtype[numpy._typing._array_like._ScalarType_co][ -(numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*RP -&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex0:typing.overloadX -__ne__(pandas._libs.tslibs.period.Period.__ne__"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*DB -pandas.core.series.PeriodSeries"pandas.core.series.PeriodSeries0:typing.overloadX -__ne__(pandas._libs.tslibs.period.Period.__ne__": -Literal[builtins.bool]  - builtins.bool" builtins.bool*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*$" -builtins.object"builtins.object0:typing.overloadX2 -__radd__*pandas._libs.tslibs.period.Period.__radd__ -__radd__*pandas._libs.tslibs.period.Period.__radd__"F -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period* -TypeAlias[Union[pandas._libs.tslibs.timedeltas.Timedelta,datetime.timedelta,numpy.timedelta64,TypeAlias[numpy.signedinteger[numpy._typing._64Bit]],builtins.int,pandas._libs.tslibs.offsets.BaseOffset]] -Union[pandas._libs.tslibs.timedeltas.Timedelta,datetime.timedelta,numpy.timedelta64,TypeAlias[numpy.signedinteger[numpy._typing._64Bit]],builtins.int,pandas._libs.tslibs.offsets.BaseOffset]T -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta( -datetime.timedelta"datetime.timedelta& -numpy.timedelta64"numpy.timedelta64 -4TypeAlias[numpy.signedinteger[numpy._typing._64Bit]]n -)numpy.signedinteger[numpy._typing._64Bit], -numpy._typing._64Bit"numpy._typing._64Bit"numpy.signedinteger" numpy.int64 - builtins.int" builtins.intP -&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"(pandas._libs.tslibs.period._PeriodAddSub0:typing.overloadX -__radd__*pandas._libs.tslibs.period.Period.__radd__"N -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*PN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index0:typing.overloadX -__radd__*pandas._libs.tslibs.period.Period.__radd__"B -pandas.core.series.PeriodSeries"pandas.core.series.PeriodSeries*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*JH -"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries0:typing.overloadX -__radd__*pandas._libs.tslibs.period.Period.__radd__"J -#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period*LJ -#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType0:typing.overloadX - PeriodDtype%pandas.core.dtypes.dtypes.PeriodDtype".pandas.core.dtypes.dtypes.PandasExtensionDtype* -__init__.pandas.core.dtypes.dtypes.PeriodDtype.__init__" -None*X -selfN -%pandas.core.dtypes.dtypes.PeriodDtype"%pandas.core.dtypes.dtypes.PeriodDtype* -freq -:Union[builtins.str,pandas._libs.tslibs.offsets.BaseOffset] - builtins.str" builtins.strP -&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset * -freq*pandas.core.dtypes.dtypes.PeriodDtype.freq"P -&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset*X -selfN -%pandas.core.dtypes.dtypes.PeriodDtype"%pandas.core.dtypes.dtypes.PeriodDtype0:builtins.property`* -na_value.pandas.core.dtypes.dtypes.PeriodDtype.na_value"J -#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType*X -selfN -%pandas.core.dtypes.dtypes.PeriodDtype"%pandas.core.dtypes.dtypes.PeriodDtype0:builtins.property`A - PeriodIndex&pandas.core.indexes.period.PeriodIndex"6pandas.core.indexes.datetimelike.DatetimeIndexOpsMixin"1pandas.core.indexes.accessors.PeriodIndexFieldOps* -__new__.pandas.core.indexes.period.PeriodIndex.__new__" -Any* -cls -,Type[pandas.core.indexes.period.PeriodIndex]P -&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex"type* -data -Any * -ordinal -Any * -freq -Any * -tz -Any * -dtype -Any ** -copy - builtins.bool" builtins.bool * -name -Any * -fields -Any*X -values-pandas.core.indexes.period.PeriodIndex.values* -self0:builtins.property`* - __contains__3pandas.core.indexes.period.PeriodIndex.__contains__" - builtins.bool" builtins.bool*RP -&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex*  -Any* - __array__0pandas.core.indexes.period.PeriodIndex.__array__"9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray*Z -selfP -&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex* -dtype -Any *l -__array_wrap__5pandas.core.indexes.period.PeriodIndex.__array_wrap__* -self* - -result* -context *\ - asof_locs0pandas.core.indexes.period.PeriodIndex.asof_locs* -self* -where* -mask* -astype-pandas.core.indexes.period.PeriodIndex.astype" -Any*Z -selfP -&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex* -dtype -Any** -copy - builtins.bool" builtins.bool *' -how - builtins.str" builtins.str * - searchsorted3pandas.core.indexes.period.PeriodIndex.searchsorted" -Any*Z -selfP -&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex* -value -Any*( -side - builtins.str" builtins.str * -sorter -Any * -is_full.pandas.core.indexes.period.PeriodIndex.is_full" - builtins.bool" builtins.bool*Z -selfP -&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex0:builtins.property`* - inferred_type4pandas.core.indexes.period.PeriodIndex.inferred_type" - builtins.str" builtins.str*Z -selfP -&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex0:builtins.property`*\ - get_value0pandas.core.indexes.period.PeriodIndex.get_value* -self* - -series* -key* - get_indexer2pandas.core.indexes.period.PeriodIndex.get_indexer* -self* - -target* -method * -limit * - tolerance *m -get_indexer_non_unique=pandas.core.indexes.period.PeriodIndex.get_indexer_non_unique* -self* - -target*] -get_loc.pandas.core.indexes.period.PeriodIndex.get_loc* -self* -key* - tolerance *T -insert-pandas.core.indexes.period.PeriodIndex.insert* -self* -loc* -item* -join+pandas.core.indexes.period.PeriodIndex.join" -Any*Z -selfP -&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex* -other -Any*' -how - builtins.str" builtins.str * -level -Any *5 -return_indexers - builtins.bool" builtins.bool ** -sort - builtins.bool" builtins.bool * - intersection3pandas.core.indexes.period.PeriodIndex.intersection" -Any*Z -selfP -&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex* -other -Any** -sort - builtins.bool" builtins.bool *` - -difference1pandas.core.indexes.period.PeriodIndex.difference* -self* -other* - -sort * - memory_usage3pandas.core.indexes.period.PeriodIndex.memory_usage" -Any*Z -selfP -&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex** -deep - builtins.bool" builtins.bool * -freqstr.pandas.core.indexes.period.PeriodIndex.freqstr" - builtins.str" builtins.str*Z -selfP -&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex0:builtins.property`2 -__sub__.pandas.core.indexes.period.PeriodIndex.__sub__ -__sub__.pandas.core.indexes.period.PeriodIndex.__sub__"N -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index*RP -&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:typing.overloadX -__sub__.pandas.core.indexes.period.PeriodIndex.__sub__"N -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index* -+pandas.core.indexes.period.PeriodIndex.SelfP -&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex(* -+pandas.core.indexes.period.PeriodIndex.SelfP -&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex(0:typing.overloadX - -__sub__.pandas.core.indexes.period.PeriodIndex.__sub__" -+pandas.core.indexes.period.PeriodIndex.SelfP -&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex(* -+pandas.core.indexes.period.PeriodIndex.SelfP -&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex(* -TypeAlias[Union[pandas._libs.tslibs.timedeltas.Timedelta,datetime.timedelta,numpy.timedelta64,TypeAlias[numpy.signedinteger[numpy._typing._64Bit]],builtins.int,pandas._libs.tslibs.offsets.BaseOffset]] -Union[pandas._libs.tslibs.timedeltas.Timedelta,datetime.timedelta,numpy.timedelta64,TypeAlias[numpy.signedinteger[numpy._typing._64Bit]],builtins.int,pandas._libs.tslibs.offsets.BaseOffset]T -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta( -datetime.timedelta"datetime.timedelta& -numpy.timedelta64"numpy.timedelta64 -4TypeAlias[numpy.signedinteger[numpy._typing._64Bit]]n -)numpy.signedinteger[numpy._typing._64Bit], -numpy._typing._64Bit"numpy._typing._64Bit"numpy.signedinteger" numpy.int64 - builtins.int" builtins.intP -&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"(pandas._libs.tslibs.period._PeriodAddSub0:typing.overloadX -__sub__.pandas.core.indexes.period.PeriodIndex.__sub__"J -#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType*RP -&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex*LJ -#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType0:typing.overloadX -__sub__.pandas.core.indexes.period.PeriodIndex.__sub__" -+pandas.core.indexes.period.PeriodIndex.SelfP -&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex(* -+pandas.core.indexes.period.PeriodIndex.SelfP -&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex(* -]Union[pandas.core.indexes.timedeltas.TimedeltaIndex,pandas._libs.tslibs.timedeltas.Timedelta]^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndexT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta0:typing.overloadX2 -__rsub__/pandas.core.indexes.period.PeriodIndex.__rsub__ -__rsub__/pandas.core.indexes.period.PeriodIndex.__rsub__"N -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index*RP -&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex*HF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period0:typing.overloadX -__rsub__/pandas.core.indexes.period.PeriodIndex.__rsub__"N -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index* -+pandas.core.indexes.period.PeriodIndex.SelfP -&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex(* -+pandas.core.indexes.period.PeriodIndex.SelfP -&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex(0:typing.overloadX -__rsub__/pandas.core.indexes.period.PeriodIndex.__rsub__"J -#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType*RP -&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex*LJ -#pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType0:typing.overloadXI - -RangeIndex$pandas.core.indexes.range.RangeIndex"pandas.core.indexes.base.Index* -__new__,pandas.core.indexes.range.RangeIndex.__new__" -Any* -cls -*Type[pandas.core.indexes.range.RangeIndex]L -$pandas.core.indexes.range.RangeIndex"$pandas.core.indexes.range.RangeIndex"type* -start -8Union[builtins.int,pandas.core.indexes.range.RangeIndex] - builtins.int" builtins.intL -$pandas.core.indexes.range.RangeIndex"$pandas.core.indexes.range.RangeIndex *( -stop - builtins.int" builtins.int *( -step - builtins.int" builtins.int * -dtype -Any ** -copy - builtins.bool" builtins.bool * -name -Any * -__init__-pandas.core.indexes.range.RangeIndex.__init__" -None*V -selfL -$pandas.core.indexes.range.RangeIndex"$pandas.core.indexes.range.RangeIndex* -start -8Union[builtins.int,pandas.core.indexes.range.RangeIndex] - builtins.int" builtins.intL -$pandas.core.indexes.range.RangeIndex"$pandas.core.indexes.range.RangeIndex *( -stop - builtins.int" builtins.int *( -step - builtins.int" builtins.int * -dtype -Any ** + builtins.str" builtins.str ** + swaplevel#pandas.core.series.Series.swaplevel" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +i +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level * +j +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level ** copy - builtins.bool" builtins.bool * -name -Any * - -from_range/pandas.core.indexes.range.RangeIndex.from_range* -cls* -data* - -name * -dtype 0:builtins.classmethodp*G - -__reduce__/pandas.core.indexes.range.RangeIndex.__reduce__* -self*= -start*pandas.core.indexes.range.RangeIndex.start* -self*; -stop)pandas.core.indexes.range.RangeIndex.stop* -self*; -step)pandas.core.indexes.range.RangeIndex.step* -self* -nbytes+pandas.core.indexes.range.RangeIndex.nbytes" - builtins.int" builtins.int*V -selfL -$pandas.core.indexes.range.RangeIndex"$pandas.core.indexes.range.RangeIndex0:builtins.property`* - memory_usage1pandas.core.indexes.range.RangeIndex.memory_usage" - builtins.int" builtins.int*V -selfL -$pandas.core.indexes.range.RangeIndex"$pandas.core.indexes.range.RangeIndex** -deep - builtins.bool" builtins.bool * -dtype*pandas.core.indexes.range.RangeIndex.dtype"( -numpy.dtype[Any] -Any" numpy.dtype*V -selfL -$pandas.core.indexes.range.RangeIndex"$pandas.core.indexes.range.RangeIndex0:builtins.property`* - is_unique.pandas.core.indexes.range.RangeIndex.is_unique" - builtins.bool" builtins.bool*V -selfL -$pandas.core.indexes.range.RangeIndex"$pandas.core.indexes.range.RangeIndex0:builtins.property`* -is_monotonic_increasing + interpolate%pandas.core.series.Series.interpolate" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23358,18 +31251,15 @@ HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -other -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23396,24 +31286,112 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +method +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"!pandas._typing.InterpolateOptions * +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None *- +inplace + builtins.bool" builtins.bool * +limit_direction +MUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +None * + +limit_area +7Union[Literal[builtins.str],Literal[builtins.str],None]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +None *x +downcasth +!Union[Literal[builtins.str],None]7 +Literal[builtins.str]  + builtins.str" builtins.str +None * +kwargs +Any*I +asofpandas.core.series.Series.asof"# +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1]] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*W - min_periodsD -Union[builtins.int,None] - builtins.int" builtins.int -None *( -ddof - builtins.int" builtins.int *. -diffpandas.core.series.Series.diff" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23440,18 +31418,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23478,22 +31453,42 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +where +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],typing.Sequence[Unknown]] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*+ -periods - builtins.int" builtins.int * -autocorr"pandas.core.series.Series.autocorr" -builtins.float"builtins.float* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar- +typing.Sequence[Unknown]"typing.Sequence* +subset +6Union[builtins.str,typing.Sequence[builtins.str],None] + builtins.str" builtins.strN +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.Sequence +None *4 +clippandas.core.series.Series.clip" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23520,23 +31515,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*' -lag - builtins.int" builtins.int *6 - -__matmul__$pandas.core.series.Series.__matmul__***8 - __rmatmul__%pandas.core.series.Series.__rmatmul__***U -combine!pandas.core.series.Series.combine" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23563,18 +31550,54 @@ __matmul__$pandas.core.series.Series.__matmul__***8 builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +lower +Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.float,None] +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.AnyArrayLike +builtins.float"builtins.float +None * +upper +Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.float,None] +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.AnyArrayLike +builtins.float"builtins.float +None * +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *- +inplace + builtins.bool" builtins.bool * +kwargs +Any*= +asfreq pandas.core.series.Series.asfreq" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23601,18 +31624,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -other -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23639,17 +31659,35 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*U -funcK -CallableType[builtins.function]& -builtins.function"builtins.function* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +freq +Any* +method +uUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.FillnaOptions +None * +how +7Union[Literal[builtins.str],Literal[builtins.str],None]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +None */ + normalize + builtins.bool" builtins.bool * fill_value Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],None] @@ -23671,11 +31709,11 @@ fill_value (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ builtins.complex"builtins.complex"pandas._typing.Scalar -None *E - combine_first'pandas.core.series.Series.combine_first" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +None *+ +at_time!pandas.core.series.Series.at_time" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23702,18 +31740,15 @@ fill_value builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23740,18 +31775,30 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -other -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*m +timec +!Union[builtins.str,datetime.time] + builtins.str" builtins.str + datetime.time" datetime.time** +asof + builtins.bool" builtins.bool * +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *+ + between_time&pandas.core.series.Series.between_time" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23778,20 +31825,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*] -update pandas.core.series.Series.update" -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23818,19 +31860,33 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*E -otherE -Union[pandas.core.series.Series[pandas._typing.S1],typing.Sequence[pandas._typing.S1],typing.Mapping[builtins.int,pandas._typing.S1]] -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*s + +start_timec +!Union[builtins.str,datetime.time] + builtins.str" builtins.str + datetime.time" datetime.time*q +end_timec +!Union[builtins.str,datetime.time] + builtins.str" builtins.str + datetime.time" datetime.time* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *' +firstpandas.core.series.Series.first" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23857,17 +31913,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series -"typing.Sequence[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23894,18 +31948,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"typing.Sequence -.typing.Mapping[builtins.int,pandas._typing.S1] - builtins.int" builtins.int -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +offset +Any*' +lastpandas.core.series.Series.last" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23932,21 +31985,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"typing.Mapping* -argsort!pandas.core.series.Series.argsort"b -'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -23973,24 +32020,60 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +offset +Any* +rankpandas.core.series.Series.rank"h +)pandas.core.series.Series[builtins.float] +builtins.float"builtins.float"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* axis =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex * -kind -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 + builtins.int" builtins.int"pandas._typing.AxisIndex * +method +tUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -23998,13 +32081,27 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.SortKind * -order -None *1 -nlargest"pandas.core.series.Series.nlargest" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str *2 + numeric_only + builtins.bool" builtins.bool * + na_option +HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str */ + ascending + builtins.bool" builtins.bool *) +pct + builtins.bool" builtins.bool *C +wherepandas.core.series.Series.where" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -24031,18 +32128,15 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -24069,30 +32163,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*% -n - builtins.int" builtins.int * -keep -ZUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],Literal[builtins.str]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.NaPosition7 -Literal[builtins.str]  - builtins.str" builtins.str *1 - nsmallest#pandas.core.series.Series.nsmallest" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +cond +Union[pandas.core.series.Series[pandas._typing.S1],pandas.core.series.Series[builtins.bool],numpy.ndarray[Any,Any],CallableType[builtins.function],CallableType[builtins.function]] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -24119,18 +32199,44 @@ ZUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],Literal[bui builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Seriese +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarrayK +CallableType[builtins.function]& +builtins.function"builtins.functionK +CallableType[builtins.function]& +builtins.function"builtins.function* +other +Any *- +inplace + builtins.bool" builtins.bool * +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None * +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *i +maskpandas.core.series.Series.mask" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -24157,30 +32263,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*% -n - builtins.int" builtins.int * -keep -ZUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],Literal[builtins.str]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.NaPosition7 -Literal[builtins.str]  - builtins.str" builtins.str *1 - swaplevel#pandas.core.series.Series.swaplevel" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -24207,18 +32298,16 @@ ZUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],Literal[bui builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +cond +Union[pandas.core.series.Series[pandas._typing.S1],pandas.core.series.Series[builtins.bool],numpy.ndarray[Any,Any],CallableType[builtins.function],CallableType[builtins.function]] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -24245,30 +32334,43 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Seriese +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarrayK +CallableType[builtins.function]& +builtins.function"builtins.functionK +CallableType[builtins.function]& +builtins.function"builtins.function*% +other% +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1],pandas.core.frame.DataFrame,CallableType[builtins.function],pandas._libs.missing.NAType,None] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -i -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level * -j -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level ** -copy - builtins.bool" builtins.bool *. -reorder_levels(pandas.core.series.Series.reorder_levels" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -24295,18 +32397,41 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrameK +CallableType[builtins.function]& +builtins.function"builtins.function: +pandas._libs.missing.NAType"pandas._libs.missing.NAType +None *- +inplace + builtins.bool" builtins.bool * +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None * +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *6 + case_when#pandas.core.series.Series.case_when"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -24333,21 +32458,57 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*" +caselist" +builtins.list[Tuple[Union[typing.Sequence[builtins.bool],pandas.core.series.Series[builtins.bool],CallableType[builtins.function]],Union[TypeAlias[Union[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],CallableType[builtins.function]]]] +Tuple[Union[typing.Sequence[builtins.bool],pandas.core.series.Series[builtins.bool],CallableType[builtins.function]],Union[TypeAlias[Union[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],CallableType[builtins.function]]] +nUnion[typing.Sequence[builtins.bool],pandas.core.series.Series[builtins.bool],CallableType[builtins.function]]Q +typing.Sequence[builtins.bool] + builtins.bool" builtins.bool"typing.Sequencee +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.SeriesK +CallableType[builtins.function]& +builtins.function"builtins.function +Union[TypeAlias[Union[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],CallableType[builtins.function]] +TypeAlias[Union[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]] +uUnion[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]0 +typing.Sequence[Any] +Any"typing.Sequence9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarrayD +pandas.core.series.Series[Any] +Any"pandas.core.series.SeriesN +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.Index"pandas._typing.ListLikeU +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*7 -order, -builtins.list[Any] -Any" builtins.list*. -explode!pandas.core.series.Series.explode" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.ScalarK +CallableType[builtins.function]& +builtins.function"builtins.function" builtins.list*, +truncate"pandas.core.series.Series.truncate" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -24374,18 +32535,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -24412,20 +32570,39 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -unstack!pandas.core.series.Series.unstack": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +before +3Union[datetime.date,builtins.str,builtins.int,None] + datetime.date" datetime.date + builtins.str" builtins.str + builtins.int" builtins.int +None * +after +3Union[datetime.date,builtins.str,builtins.int,None] + datetime.date" datetime.date + builtins.str" builtins.str + builtins.int" builtins.int +None * +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None ** +copy + builtins.bool" builtins.bool *+ + +tz_convert$pandas.core.series.Series.tz_convert" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -24452,32 +32629,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -level -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level * - -fill_value -Union[pandas._typing.S1,builtins.list[pandas._typing.S1],None] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -24953,21 +32993,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -values -_Union[typing.Iterable[Any],pandas.core.series.Series[pandas._typing.S1],builtins.dict[Any,Any]]0 -typing.Iterable[Any] -Any"typing.Iterable -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset + builtins.list[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -24994,24 +33027,17 @@ _Union[typing.Iterable[Any],pandas.core.series.Series[pandas._typing.S1],builtin builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series9 -builtins.dict[Any,Any] -Any -Any" builtins.dict*E -between!pandas.core.series.Series.between"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset" builtins.list +None *( + +pct_change$pandas.core.series.Series.pct_change" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -25038,47 +33064,59 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -left -Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],TypeAlias[Union[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]]] -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 + datetime.date" datetime.date + datetime.time" datetime.time builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar -TypeAlias[Union[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]] -uUnion[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]0 -typing.Sequence[Any] -Any"typing.Sequence9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarrayD -pandas.core.series.Series[Any] -Any"pandas.core.series.SeriesN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"pandas._typing.ListLikeU* -right -Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],TypeAlias[Union[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]]] +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*+ +periods + builtins.int" builtins.int */ + fill_method + builtins.str" builtins.str *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None * +freq +Any * +kwargs +Any*! +first_valid_index+pandas.core.series.Series.first_valid_index" TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] @@ -25096,35 +33134,11 @@ uUnion[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar -TypeAlias[Union[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]] -uUnion[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any]]0 -typing.Sequence[Any] -Any"typing.Sequence9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarrayD -pandas.core.series.Series[Any] -Any"pandas.core.series.SeriesN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"pandas._typing.ListLikeU* - inclusive -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str * -isnapandas.core.series.Series.isna"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.complex"builtins.complex"pandas._typing.Scalar* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -25151,21 +33165,34 @@ uUnion[typing.Sequence[Any],numpy.ndarray[Any,Any],pandas.core.series.Series[Any builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*! +last_valid_index*pandas.core.series.Series.last_valid_index" +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -isnull pandas.core.series.Series.isnull"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -25192,21 +33219,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -notnapandas.core.series.Series.notna"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*' + transpose#pandas.core.series.Series.transpose" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -25233,21 +33254,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -notnull!pandas.core.series.Series.notnull"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -25274,18 +33289,20 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*2 - to_timestamp&pandas.core.series.Series.to_timestamp" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +args +Any* +kwargs +Any*( +Tpandas.core.series.Series.T" +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -25312,18 +33329,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(* +self +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -25350,35 +33365,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -freq -Any * -how -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str""pandas._typing.TimestampConvention ** -copy - builtins.bool" builtins.bool * - to_period#pandas.core.series.Series.to_period": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(0:builtins.property`*k +__div__!pandas.core.series.Series.__div__" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -25405,29 +33400,15 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*P -freqD -Union[builtins.str,None] - builtins.str" builtins.str -None ** -copy - builtins.bool" builtins.bool * -strpandas.core.series.Series.str" -]pandas.core.strings.StringMethods[pandas.core.series.Series[Any],pandas.core.frame.DataFrame]D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame"!pandas.core.strings.StringMethods* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -25454,20 +33435,30 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series0:builtins.property`* -dtpandas.core.series.Series.dt"| -pandas.core.resample.Resampler[pandas.core.series.Series[Any]]D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series"pandas.core.resample.Resampler* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -27707,87 +35285,15 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -rule -Any* -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *R -closedD -Union[builtins.str,None] - builtins.str" builtins.str -None *Q -labelD -Union[builtins.str,None] - builtins.str" builtins.str -None * - -convention -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str""pandas._typing.TimestampConvention * -kind -7Union[Literal[builtins.str],Literal[builtins.str],None]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str -None * -loffset -Any *( -base - builtins.int" builtins.int *N -onD -Union[builtins.str,None] - builtins.str" builtins.str -None * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None * -origin -Union[pandas._libs.tslibs.timestamps.Timestamp,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]T -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str * -offset -AUnion[pandas._libs.tslibs.timedeltas.Timedelta,builtins.str,None]T -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta - builtins.str" builtins.str -None *. -firstpandas.core.series.Series.first" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*k + __rfloordiv__'pandas.core.series.Series.__rfloordiv__" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -27814,18 +35320,14 @@ AUnion[pandas._libs.tslibs.timedeltas.Timedelta,builtins.str,None]T builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -27852,20 +35354,29 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -offset -Any*. -lastpandas.core.series.Series.last" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*DD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -27892,18 +35403,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -27930,23 +35437,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -offset -Any* -rankpandas.core.series.Series.rank"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -27973,51 +35471,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex * -method -tUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str *2 - numeric_only - builtins.bool" builtins.bool * - na_option -HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str */ - ascending - builtins.bool" builtins.bool *) -pct - builtins.bool" builtins.bool *N -wherepandas.core.series.Series.where" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*k +__rmod__"pandas.core.series.Series.__rmod__" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28044,18 +35506,14 @@ HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28082,19 +35540,29 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -cond -Union[pandas.core.series.Series[pandas._typing.S1],pandas.core.series.Series[builtins.bool],numpy.ndarray[Any,Any],CallableType[builtins.function],CallableType[builtins.function]] -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*DD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28121,49 +35589,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Seriese -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarrayK -CallableType[builtins.function]& -builtins.function"builtins.functionK -CallableType[builtins.function]& -builtins.function"builtins.function* -other -Any *- -inplace - builtins.bool" builtins.bool * -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *. -try_cast - builtins.bool" builtins.bool *e -maskpandas.core.series.Series.mask" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28190,18 +35623,14 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28228,51 +35657,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -cond -TypeAlias[Union[pandas.core.series.Series[builtins.bool],TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],builtins.list[builtins.bool]]] -Union[pandas.core.series.Series[builtins.bool],TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],builtins.list[builtins.bool]]e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series -^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] -STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] -Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] -Any -5numpy.dtype[numpy._typing._array_like._ScalarType_co][ -(numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_boolM -builtins.list[builtins.bool] - builtins.bool" builtins.bool" builtins.list"pandas._typing.MaskType*) -other) -Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1],pandas.core.frame.DataFrame,CallableType[builtins.function],pandas._libs.missing.NAType,None] -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*k + __rnatmul__%pandas.core.series.Series.__rnatmul__" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28299,43 +35692,15 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrameK -CallableType[builtins.function]& -builtins.function"builtins.function: -pandas._libs.missing.NAType"pandas._libs.missing.NAType -None *- -inplace - builtins.bool" builtins.bool * -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *. -try_cast - builtins.bool" builtins.bool *0 - slice_shift%pandas.core.series.Series.slice_shift" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28362,18 +35727,30 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*D +otherD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28400,27 +35777,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*+ -periods - builtins.int" builtins.int * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *0 -tshift pandas.core.series.Series.tshift" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28447,18 +35811,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28485,29 +35845,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*+ -periods - builtins.int" builtins.int * -freq -Any * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *4 -truncate"pandas.core.series.Series.truncate" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*k +__rpow__"pandas.core.series.Series.__rpow__" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28534,18 +35880,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28572,42 +35914,29 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -before -3Union[datetime.date,builtins.str,builtins.int,None] - datetime.date" datetime.date - builtins.str" builtins.str - builtins.int" builtins.int -None * -after -3Union[datetime.date,builtins.str,builtins.int,None] - datetime.date" datetime.date - builtins.str" builtins.str - builtins.int" builtins.int -None * -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None ** -copy - builtins.bool" builtins.bool *2 - -tz_convert$pandas.core.series.Series.tz_convert" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*DD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28634,18 +35963,14 @@ tz_convert$pandas.core.series.Series.tz_convert" builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28672,36 +35997,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -tz -Any* -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None ** -copy - builtins.bool" builtins.bool *3 - tz_localize%pandas.core.series.Series.tz_localize" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28728,18 +36031,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*X +__rsub__"pandas.core.series.Series.__rsub__"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28766,40 +36068,29 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -tz -Any* -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None ** -copy - builtins.bool" builtins.bool * - ambiguous -Any */ - nonexistent - builtins.str" builtins.str *. -abspandas.core.series.Series.abs" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*DD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28826,18 +36117,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28864,18 +36151,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*u -describe"pandas.core.series.Series.describe" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28902,18 +36185,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*X + __rtruediv__&pandas.core.series.Series.__rtruediv__"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28940,26 +36222,29 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* - percentiles -)Union[builtins.list[builtins.float],None]P -builtins.list[builtins.float] -builtins.float"builtins.float" builtins.list -None * -include -BUnion[Literal[builtins.str],builtins.list[pandas._typing.S1],None]7 -Literal[builtins.str]  - builtins.str" builtins.str - builtins.list[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*DD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -28986,19 +36271,14 @@ BUnion[Literal[builtins.str],builtins.list[pandas._typing.S1],None]7 builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype" builtins.list -None *- -exclude- ->Union[pandas._typing.S1,builtins.list[pandas._typing.S1],None] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29025,17 +36305,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype - builtins.list[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29062,24 +36339,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype" builtins.list -None *b -datetime_is_numericG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None */ - -pct_change$pandas.core.series.Series.pct_change" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*X + __truediv__%pandas.core.series.Series.__truediv__"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29106,18 +36376,29 @@ pct_change$pandas.core.series.Series.pct_change" builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*DD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29144,49 +36425,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*+ -periods - builtins.int" builtins.int */ - fill_method - builtins.str" builtins.str *Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None * -freq -Any * -kwargs -Any*$ -first_valid_index+pandas.core.series.Series.first_valid_index" -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29213,37 +36459,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*$ -last_valid_index*pandas.core.series.Series.last_valid_index" -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29270,21 +36493,18 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* - value_counts&pandas.core.series.Series.value_counts"b -'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* + +__invert__$pandas.core.series.Series.__invert__"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29311,30 +36531,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*/ - normalize - builtins.bool" builtins.bool ** -sort - builtins.bool" builtins.bool */ - ascending - builtins.bool" builtins.bool *P -binsD -Union[builtins.int,None] - builtins.int" builtins.int -None *, -dropna - builtins.bool" builtins.bool *. - transpose#pandas.core.series.Series.transpose" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +atpandas.core.series.Series.at"B +pandas.core.indexing._AtIndexer"pandas.core.indexing._AtIndexer* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29361,18 +36568,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series0:builtins.property`* +catpandas.core.series.Series.cat"h +2pandas.core.arrays.categorical.CategoricalAccessor"2pandas.core.arrays.categorical.CategoricalAccessor* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29399,22 +36605,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -args -Any* -kwargs -Any*. -Tpandas.core.series.Series.T" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series0:builtins.property`* +iatpandas.core.series.Series.iat"D + pandas.core.indexing._iAtIndexer" pandas.core.indexing._iAtIndexer* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29441,18 +36642,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series0:builtins.property`*' +ilocpandas.core.series.Series.iloc" +8pandas.core.series._iLocIndexerSeries[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29479,18 +36677,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series0:builtins.property`*P -__div__!pandas.core.series.Series.__div__" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"%pandas.core.series._iLocIndexerSeries* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29517,18 +36712,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series0:builtins.property`*' +locpandas.core.series.Series.loc" +7pandas.core.series._LocIndexerSeries[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29555,39 +36747,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*" -other" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"$pandas.core.series._LocIndexerSeries* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29614,20 +36782,15 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -__eq__ pandas.core.series.Series.__eq__"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series0:builtins.property`*M +addpandas.core.series.Series.add" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29654,21 +36817,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*$" -builtins.object"builtins.object*: - __floordiv__&pandas.core.series.Series.__floordiv__"b -'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29695,38 +36852,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*"" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*# +other# +Union[pandas.core.series.Series[pandas._typing.S1],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]]] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29753,20 +36888,49 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*Q -__ge__ pandas.core.series.Series.__ge__"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None *( +axis + builtins.int" builtins.int * +allpandas.core.series.Series.all" + builtins.bool" builtins.bool* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29793,17 +36957,32 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*99 -Union[pandas._typing.S1,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1],datetime.datetime,datetime.timedelta] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex *X + bool_onlyG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None *, +skipna + builtins.bool" builtins.bool * +kwargs +Any* +anypandas.core.series.Series.any" + builtins.bool" builtins.bool* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29830,36 +37009,30 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex *X + bool_onlyG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None *, +skipna + builtins.bool" builtins.bool * +kwargs +Any** +cummax pandas.core.series.Series.cummax" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29886,22 +37059,15 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta*Q -__gt__ pandas.core.series.Series.__gt__"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29928,17 +37094,30 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*99 -Union[pandas._typing.S1,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1],datetime.datetime,datetime.timedelta] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *, +skipna + builtins.bool" builtins.bool * +args +Any* +kwargs +Any** +cummin pandas.core.series.Series.cummin" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -29965,36 +37144,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30020,23 +37178,31 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P Type[builtins.object]" builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta*Q -__le__ pandas.core.series.Series.__le__"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *, +skipna + builtins.bool" builtins.bool * +args +Any* +kwargs +Any** +cumprod!pandas.core.series.Series.cumprod" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30063,17 +37229,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*99 -Union[pandas._typing.S1,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1],datetime.datetime,datetime.timedelta] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30100,36 +37264,30 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *, +skipna + builtins.bool" builtins.bool * +args +Any* +kwargs +Any** +cumsum pandas.core.series.Series.cumsum" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30156,22 +37314,15 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta*Q -__lt__ pandas.core.series.Series.__lt__"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30198,17 +37349,33 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*99 -Union[pandas._typing.S1,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1],datetime.datetime,datetime.timedelta] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *, +skipna + builtins.bool" builtins.bool * +args +Any* +kwargs +Any*] +divide pandas.core.series.Series.divide"h +)pandas.core.series.Series[builtins.float] +builtins.float"builtins.float"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30235,16 +37402,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*D +otherD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 @@ -30255,16 +37422,10 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.str" builtins.str9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30291,20 +37452,14 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta*P -__mod__!pandas.core.series.Series.__mod__" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30331,17 +37486,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30368,38 +37520,34 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*"" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex *p +divmod pandas.core.series.Series.divmod" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30426,20 +37574,15 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -__ne__ pandas.core.series.Series.__ne__"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30466,19 +37609,30 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*$" -builtins.object"builtins.object*P -__pow__!pandas.core.series.Series.__pow__" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*D +otherD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30505,17 +37659,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30542,38 +37693,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*"" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30600,18 +37727,37 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*P -__radd__"pandas.core.series.Series.__radd__" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex *= +eqpandas.core.series.Series.eq"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30638,17 +37784,34 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*# +other# +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1]] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30675,39 +37838,38 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*"" -Union[builtins.complex,builtins.str,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex - builtins.str" builtins.str -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex * +ewmpandas.core.series.Series.ewm" +Npandas.core.window.ewm.ExponentialMovingWindow[pandas.core.series.Series[Any]]D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series".pandas.core.window.ewm.ExponentialMovingWindow* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30734,18 +37896,41 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*P -__rdiv__"pandas.core.series.Series.__rdiv__" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*U +comJ +Union[builtins.float,None] +builtins.float"builtins.float +None *V +spanJ +Union[builtins.float,None] +builtins.float"builtins.float +None *Z +halflifeJ +Union[builtins.float,None] +builtins.float"builtins.float +None *W +alphaJ +Union[builtins.float,None] +builtins.float"builtins.float +None */ + min_periods + builtins.int" builtins.int *, +adjust + builtins.bool" builtins.bool */ + ignore_na + builtins.bool" builtins.bool * + expanding#pandas.core.series.Series.expanding" +Fpandas.core.window.expanding.Expanding[pandas.core.series.Series[Any]]D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series"&pandas.core.window.expanding.Expanding* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30772,17 +37957,27 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*/ + min_periods + builtins.int" builtins.int * +method +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.CalculationMethod *^ +floordiv"pandas.core.series.Series.floordiv"b +'pandas.core.series.Series[builtins.int] + builtins.int" builtins.int"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30809,18 +38004,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*"" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*D +otherD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 @@ -30831,16 +38024,10 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.str" builtins.str9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30867,18 +38054,14 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*P - __rdivmod__%pandas.core.series.Series.__rdivmod__" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30905,18 +38088,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -30943,39 +38122,39 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*" -other" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *= +gepandas.core.series.Series.ge"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31002,18 +38181,34 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*# +other# +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1]] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*P - __rfloordiv__'pandas.core.series.Series.__rfloordiv__" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31040,17 +38235,37 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex *= +gtpandas.core.series.Series.gt"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31077,38 +38292,34 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*# +other# +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1]] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*"" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31135,18 +38346,33 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*P -__rmod__"pandas.core.series.Series.__rmod__" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex *& +itempandas.core.series.Series.item" +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31173,17 +38399,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31210,38 +38434,34 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*% +kurtpandas.core.series.Series.kurt" +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*"" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31268,20 +38488,51 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *, +skipna + builtins.bool" builtins.bool * +level +None *2 + numeric_only + builtins.bool" builtins.bool * +kwargs +Any*% +kurtosis"pandas.core.series.Series.kurtosis" +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*# -__rmul__"pandas.core.series.Series.__rmul__"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31308,41 +38559,35 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*  -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[Any]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLikeD -pandas.core.series.Series[Any] -Any"pandas.core.series.Series*P - __rnatmul__%pandas.core.series.Series.__rnatmul__" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *, +skipna + builtins.bool" builtins.bool * +level +None *2 + numeric_only + builtins.bool" builtins.bool * +kwargs +Any*= +lepandas.core.series.Series.le"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31369,18 +38614,34 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*# +other# +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1]] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31407,39 +38668,37 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*" -other" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex *= +ltpandas.core.series.Series.lt"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31466,18 +38725,34 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*# +other# +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1]] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*P -__rpow__"pandas.core.series.Series.__rpow__" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31504,17 +38779,33 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex ** +maxpandas.core.series.Series.max" +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31541,38 +38832,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*"" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31599,20 +38867,34 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*: -__rsub__"pandas.core.series.Series.__rsub__"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *, +skipna + builtins.bool" builtins.bool * +level +None *2 + numeric_only + builtins.bool" builtins.bool * +kwargs +Any* +meanpandas.core.series.Series.mean" +builtins.float"builtins.float* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31639,38 +38921,34 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*"" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *, +skipna + builtins.bool" builtins.bool * +level +None *2 + numeric_only + builtins.bool" builtins.bool * +kwargs +Any* +median pandas.core.series.Series.median" +builtins.float"builtins.float* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31697,20 +38975,31 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*: - __truediv__%pandas.core.series.Series.__truediv__"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *, +skipna + builtins.bool" builtins.bool * +level +None *2 + numeric_only + builtins.bool" builtins.bool * +kwargs +Any** +minpandas.core.series.Series.min" +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31737,38 +39026,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*"" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31795,21 +39061,32 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* - -__invert__$pandas.core.series.Series.__invert__"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *, +skipna + builtins.bool" builtins.bool * +level +None *2 + numeric_only + builtins.bool" builtins.bool * +kwargs +Any*q +modpandas.core.series.Series.mod" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31836,20 +39113,15 @@ __invert__$pandas.core.series.Series.__invert__"e builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -atpandas.core.series.Series.at"B -pandas.core.indexing._AtIndexer"pandas.core.indexing._AtIndexer* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31876,20 +39148,30 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series0:builtins.property`* -catpandas.core.series.Series.cat"h -2pandas.core.arrays.categorical.CategoricalAccessor"2pandas.core.arrays.categorical.CategoricalAccessor* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*D +otherD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31916,20 +39198,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series0:builtins.property`* -iatpandas.core.series.Series.iat"D - pandas.core.indexing._iAtIndexer" pandas.core.indexing._iAtIndexer* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31956,18 +39232,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series0:builtins.property`*. -ilocpandas.core.series.Series.iloc" -8pandas.core.series._iLocIndexerSeries[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -31994,18 +39266,36 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"%pandas.core.series._iLocIndexerSeries* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *q +multiply"pandas.core.series.Series.multiply" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -32032,18 +39322,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series0:builtins.property`*. -locpandas.core.series.Series.loc" -7pandas.core.series._LocIndexerSeries[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -32070,18 +39357,30 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"$pandas.core.series._LocIndexerSeries* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*D +otherD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -32108,18 +39407,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series0:builtins.property`*X -addpandas.core.series.Series.add" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -32146,18 +39441,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -32184,19 +39475,39 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*' -other& -Union[pandas.core.series.Series[pandas._typing.S1],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]]] -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *= +nepandas.core.series.Series.ne"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -32223,14 +39534,13 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*# +other# +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1]] TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] @@ -32248,27 +39558,10 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar* -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *\ - -fill_valueJ -Union[builtins.float,None] -builtins.float"builtins.float -None *( -axis - builtins.int" builtins.int * -allpandas.core.series.Series.all" - builtins.bool" builtins.bool* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.complex"builtins.complex"pandas._typing.Scalar +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -32295,35 +39588,36 @@ fill_valueJ builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * axis =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *X - bool_onlyG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None *, -skipna - builtins.bool" builtins.bool * -kwargs -Any* -anypandas.core.series.Series.any" - builtins.bool" builtins.bool* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex * +nunique!pandas.core.series.Series.nunique" + builtins.int" builtins.int* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -32350,33 +39644,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *X - bool_onlyG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None *, -skipna - builtins.bool" builtins.bool * -kwargs -Any*1 -cummax pandas.core.series.Series.cummax" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*, +dropna + builtins.bool" builtins.bool *q +powpandas.core.series.Series.pow" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -32403,18 +39681,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -32441,33 +39716,30 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *, -skipna - builtins.bool" builtins.bool * -args -Any* -kwargs -Any*1 -cummin pandas.core.series.Series.cummin" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*D +otherD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -32494,18 +39766,14 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -32532,33 +39800,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *, -skipna - builtins.bool" builtins.bool * -args -Any* -kwargs -Any*1 -cumprod!pandas.core.series.Series.cumprod" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -32585,18 +39834,55 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *% +prodpandas.core.series.Series.prod" +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -32623,14 +39909,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* axis IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] @@ -32639,17 +39922,42 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.str" builtins.str7 Literal[builtins.int]  builtins.int" builtins.int"pandas._typing.AxisIndex -None *, -skipna - builtins.bool" builtins.bool * -args -Any* +None *U +skipnaG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None * +level +None *2 + numeric_only + builtins.bool" builtins.bool *- + min_count + builtins.int" builtins.int * kwargs -Any*1 -cumsum pandas.core.series.Series.cumsum" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any*% +product!pandas.core.series.Series.product" +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.floatT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -32676,18 +39984,36 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *U +skipnaG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None * +level +None *2 + numeric_only + builtins.bool" builtins.bool *- + min_count + builtins.int" builtins.int * +kwargs +Any*O +raddpandas.core.series.Series.radd" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -32714,36 +40040,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *, -skipna - builtins.bool" builtins.bool * -args -Any* -kwargs -Any*? -divide pandas.core.series.Series.divide"h -)pandas.core.series.Series[builtins.float] -builtins.float"builtins.float"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -32770,39 +40075,16 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*" -other" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*# +other# +Union[pandas.core.series.Series[pandas._typing.S1],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]]] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -32829,14 +40111,29 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar* level :Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] .TypeAlias[Union[typing.Hashable,builtins.int]]i @@ -32855,11 +40152,11 @@ fill_valueJ Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *U -divmod pandas.core.series.Series.divmod" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex *O +rdivmod!pandas.core.series.Series.rdivmod" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -32886,18 +40183,15 @@ fill_valueJ builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -32924,39 +40218,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*" -other" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*# +other# +Union[pandas.core.series.Series[pandas._typing.S1],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]]] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -32983,14 +40254,29 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar* level :Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] .TypeAlias[Union[typing.Hashable,builtins.int]]i @@ -33009,14 +40295,11 @@ fill_valueJ Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *D -eqpandas.core.series.Series.eq"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex *, + rfloordiv#pandas.core.series.Series.rfloordiv" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -33043,37 +40326,15 @@ fill_valueJ builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*' -other& -Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1]] -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -33100,14 +40361,13 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +other +Any* level :Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] .TypeAlias[Union[typing.Hashable,builtins.int]]i @@ -33126,86 +40386,11 @@ fill_valueJ Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex * -ewmpandas.core.series.Series.ewm" -Npandas.core.window.ewm.ExponentialMovingWindow[pandas.core.series.Series[Any]]D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series".pandas.core.window.ewm.ExponentialMovingWindow* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*U -comJ -Union[builtins.float,None] -builtins.float"builtins.float -None *V -spanJ -Union[builtins.float,None] -builtins.float"builtins.float -None *Z -halflifeJ -Union[builtins.float,None] -builtins.float"builtins.float -None *W -alphaJ -Union[builtins.float,None] -builtins.float"builtins.float -None */ - min_periods - builtins.int" builtins.int *, -adjust - builtins.bool" builtins.bool */ - ignore_na - builtins.bool" builtins.bool * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex * - expanding#pandas.core.series.Series.expanding" -Fpandas.core.window.expanding.Expanding[pandas.core.series.Series[Any]]D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series"&pandas.core.window.expanding.Expanding* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex *O +rmodpandas.core.series.Series.rmod" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -33232,37 +40417,15 @@ Fpandas.core.window.expanding.Expanding[pandas.core.series.Series[Any]]D builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*/ - min_periods - builtins.int" builtins.int * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex * -method -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.CalculationMethod *@ -floordiv"pandas.core.series.Series.floordiv"b -'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -33289,39 +40452,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*" -other" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*# +other# +Union[pandas.core.series.Series[pandas._typing.S1],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]]] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -33348,14 +40488,29 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar* level :Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] .TypeAlias[Union[typing.Hashable,builtins.int]]i @@ -33367,23 +40522,18 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand fill_valueJ Union[builtins.float,None] builtins.float"builtins.float -None * -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +None * +axis =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *D -gepandas.core.series.Series.ge"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex *O +rpowpandas.core.series.Series.rpow" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -33410,37 +40560,51 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*' -other& -Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1]] -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 + datetime.date" datetime.date + datetime.time" datetime.time builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*# +other# +Union[pandas.core.series.Series[pandas._typing.S1],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]]] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -33467,14 +40631,29 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar* level :Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] .TypeAlias[Union[typing.Hashable,builtins.int]]i @@ -33493,14 +40672,11 @@ fill_valueJ Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *D -gtpandas.core.series.Series.gt"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex *O +rsubpandas.core.series.Series.rsub" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -33527,37 +40703,51 @@ fill_valueJ builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*' -other& -Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1]] -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 + datetime.date" datetime.date + datetime.time" datetime.time builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*# +other# +Union[pandas.core.series.Series[pandas._typing.S1],TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]]] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -33584,14 +40774,29 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar* level :Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] .TypeAlias[Union[typing.Hashable,builtins.int]]i @@ -33610,10 +40815,11 @@ fill_valueJ Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *- -itempandas.core.series.Series.item" -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex *, +rtruediv"pandas.core.series.Series.rtruediv" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -33640,18 +40846,15 @@ fill_valueJ builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -33678,15 +40881,33 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*( -kurtpandas.core.series.Series.kurt" +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +other +Any* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex *% +sempandas.core.series.Series.sem" TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] @@ -33704,11 +40925,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.complex"builtins.complex"pandas._typing.Scalar* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -33735,14 +40956,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* axis IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] @@ -33751,16 +40969,20 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.str" builtins.str7 Literal[builtins.int]  builtins.int" builtins.int"pandas._typing.AxisIndex -None *, -skipna - builtins.bool" builtins.bool * +None *U +skipnaG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None * level -None *2 +None *( +ddof + builtins.int" builtins.int *2 numeric_only builtins.bool" builtins.bool * kwargs -Any*( -kurtosis"pandas.core.series.Series.kurtosis" +Any*% +skewpandas.core.series.Series.skew" TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] @@ -33778,11 +41000,11 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.complex"builtins.complex"pandas._typing.Scalar* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -33809,14 +41031,11 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* axis IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] @@ -33825,22 +41044,23 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.str" builtins.str7 Literal[builtins.int]  builtins.int" builtins.int"pandas._typing.AxisIndex -None *, -skipna - builtins.bool" builtins.bool * +None *U +skipnaG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None * level None *2 numeric_only builtins.bool" builtins.bool * kwargs -Any*D -lepandas.core.series.Series.le"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any* +stdpandas.core.series.Series.std" +builtins.float"builtins.float* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -33867,37 +41087,155 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *U +skipnaG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None * +level +None *( +ddof + builtins.int" builtins.int *2 + numeric_only + builtins.bool" builtins.bool * +kwargs +Any*q +subpandas.core.series.Series.sub" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*' -other& -Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1]] -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes - datetime.date" datetime.date& + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*D +otherD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -33924,14 +41262,45 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* level :Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] .TypeAlias[Union[typing.Hashable,builtins.int]]i @@ -33943,21 +41312,20 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand fill_valueJ Union[builtins.float,None] builtins.float"builtins.float -None * -axis +None * +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *D -ltpandas.core.series.Series.lt"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex +None *q +subtract"pandas.core.series.Series.subtract" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -33984,37 +41352,65 @@ fill_valueJ builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*' -other& -Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1]] -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 + datetime.date" datetime.date + datetime.time" datetime.time builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*D +otherD +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[pandas._typing.S1]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -34041,36 +41437,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *\ - -fill_valueJ -Union[builtins.float,None] -builtins.float"builtins.float -None * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *1 -maxpandas.core.series.Series.max" -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -34097,18 +41471,14 @@ fill_valueJ builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -34135,37 +41505,36 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * axis IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *, -skipna - builtins.bool" builtins.bool * -level -None *2 - numeric_only - builtins.bool" builtins.bool * -kwargs -Any* -meanpandas.core.series.Series.mean" -builtins.float"builtins.float* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *& +to_list!pandas.core.series.Series.to_list" + builtins.list[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -34192,37 +41561,15 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *, -skipna - builtins.bool" builtins.bool * -level -None *2 - numeric_only - builtins.bool" builtins.bool * -kwargs -Any* -median pandas.core.series.Series.median" -builtins.float"builtins.float* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset" builtins.list* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -34249,34 +41596,19 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *, -skipna - builtins.bool" builtins.bool * -level -None *2 - numeric_only - builtins.bool" builtins.bool * -kwargs -Any*1 -minpandas.core.series.Series.min" -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*. +to_numpy"pandas.core.series.Series.to_numpy"9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -34303,18 +41635,62 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +dtype +Union[TypeAlias[Union[numpy.dtype[Any],None,builtins.type,numpy._typing._dtype_like._SupportsDType[numpy.dtype[Any]],builtins.str,TypeAlias[Union[Tuple[TypeAlias[Any],builtins.int],Unknown,builtins.list[Any],TypeAlias[TypedDict],Unknown]]]],None] + +TypeAlias[Union[numpy.dtype[Any],None,builtins.type,numpy._typing._dtype_like._SupportsDType[numpy.dtype[Any]],builtins.str,TypeAlias[Union[Tuple[TypeAlias[Any],builtins.int],Unknown,builtins.list[Any],TypeAlias[TypedDict],Unknown]]]] +Union[numpy.dtype[Any],None,builtins.type,numpy._typing._dtype_like._SupportsDType[numpy.dtype[Any]],builtins.str,TypeAlias[Union[Tuple[TypeAlias[Any],builtins.int],Unknown,builtins.list[Any],TypeAlias[TypedDict],Unknown]]]( +numpy.dtype[Any] +Any" numpy.dtype +None + builtins.type" builtins.type +:numpy._typing._dtype_like._SupportsDType[numpy.dtype[Any]]( +numpy.dtype[Any] +Any" numpy.dtype"(numpy._typing._dtype_like._SupportsDType + builtins.str" builtins.str +lTypeAlias[Union[Tuple[TypeAlias[Any],builtins.int],Unknown,builtins.list[Any],TypeAlias[TypedDict],Unknown]] +aUnion[Tuple[TypeAlias[Any],builtins.int],Unknown,builtins.list[Any],TypeAlias[TypedDict],Unknown] +"Tuple[TypeAlias[Any],builtins.int]G +TypeAlias[Any] +Any"*numpy._typing._dtype_like._DTypeLikeNested + builtins.int" builtins.int, +builtins.list[Any] +Any" builtins.listM +TypeAlias[TypedDict] + TypedDict "$numpy._typing._dtype_like._DTypeDict"(numpy._typing._dtype_like._VoidDTypeLike"#numpy._typing._dtype_like.DTypeLike +None ** +copy + builtins.bool" builtins.bool * +na_value +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar * +kwargs +Any*& +tolist pandas.core.series.Series.tolist" + builtins.list[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -34341,35 +41717,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *, -skipna - builtins.bool" builtins.bool * -level -None *2 - numeric_only - builtins.bool" builtins.bool * -kwargs -Any*V -modpandas.core.series.Series.mod" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset" builtins.list* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -34396,18 +41752,18 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +truediv!pandas.core.series.Series.truediv"h +)pandas.core.series.Series[builtins.float] +builtins.float"builtins.float"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -34434,39 +41790,55 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +other +Any* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex *% +varpandas.core.series.Series.var" +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*" -other" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -34493,26 +41865,11 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *\ - -fill_valueJ -Union[builtins.float,None] -builtins.float"builtins.float -None * +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* axis IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] @@ -34521,11 +41878,24 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.str" builtins.str7 Literal[builtins.int]  builtins.int" builtins.int"pandas._typing.AxisIndex -None *V -mulpandas.core.series.Series.mul" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +None *U +skipnaG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None * +level +None *( +ddof + builtins.int" builtins.int *2 + numeric_only + builtins.bool" builtins.bool * +kwargs +Any*/ +set_axis"pandas.core.series.Series.set_axis" +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -34552,18 +41922,16 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(* +self +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -34590,39 +41958,34 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*" -other" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(* +labels +Any* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis ** +copy + builtins.bool" builtins.bool *& +__iter__"pandas.core.series.Series.__iter__" +"typing.Iterator[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -34649,39 +42012,14 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *\ - -fill_valueJ -Union[builtins.float,None] -builtins.float"builtins.float -None * -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *V -multiply"pandas.core.series.Series.multiply" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Iterator* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -34708,18 +42046,16 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*- +xspandas.core.series.Series.xs" +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -34746,39 +42082,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*" -other" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] -OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] -DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray"pandas._typing.ArrayLike -2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] - builtins.str" builtins.str9 -numpy.ndarray[Any,Any] -Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(* +self +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -34805,42 +42118,39 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(*+ +key" +typing.Hashable"typing.Hashable* +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex * level :Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] .TypeAlias[Union[typing.Hashable,builtins.int]]i #Union[typing.Hashable,builtins.int]" typing.Hashable"typing.Hashable builtins.int" builtins.int"pandas._typing.Level -None *\ +None *0 -fill_valueJ -Union[builtins.float,None] -builtins.float"builtins.float -None * -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *D -nepandas.core.series.Series.ne"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +drop_level + builtins.bool" builtins.bool 2 +__new__!pandas.core.series.Series.__new__, +__new__!pandas.core.series.Series.__new__"h +)pandas.core.series.Series[builtins.float] +builtins.float"builtins.float"pandas.core.series.Series* +cls +2Type[pandas.core.series.Series[pandas._typing.S1]] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -34867,37 +42177,70 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*' -other& -Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas.core.series.Series[pandas._typing.S1]] -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"type* +data +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray* -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +index + +Union[TypeAlias[Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]]],None] +TypeAlias[Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]]] +Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]] +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.AnyArrayLike, +builtins.list[Any] +Any" builtins.list9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +builtins.range"builtins.range. +builtins.tuple[Any] +Any"builtins.tuple"pandas._typing.Axes +None * +dtype +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype *. +name" +typing.Hashable"typing.Hashable ** +copy + builtins.bool" builtins.bool 0:typing.overloadXO +__new__!pandas.core.series.Series.__new__"H +"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries* +cls +2Type[pandas.core.series.Series[pandas._typing.S1]] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -34924,117 +42267,163 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *\ +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"type* +data +Union[pandas.core.indexes.datetimes.DatetimeIndex,typing.Sequence[Union[numpy.datetime64,datetime.datetime,datetime.date]],builtins.dict[pandas._typing.HashableT1,Union[numpy.datetime64,datetime.datetime,datetime.date]],numpy.datetime64,datetime.datetime,datetime.date]Z ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex +Htyping.Sequence[Union[numpy.datetime64,datetime.datetime,datetime.date]] +7Union[numpy.datetime64,datetime.datetime,datetime.date]$ +numpy.datetime64"numpy.datetime64& +datetime.datetime"datetime.datetime + datetime.date" datetime.date"typing.Sequence +`builtins.dict[pandas._typing.HashableT1,Union[numpy.datetime64,datetime.datetime,datetime.date]]R +pandas._typing.HashableT1" +typing.Hashable"typing.Hashable"typing.Hashable +7Union[numpy.datetime64,datetime.datetime,datetime.date]$ +numpy.datetime64"numpy.datetime64& +datetime.datetime"datetime.datetime + datetime.date" datetime.date" builtins.dict$ +numpy.datetime64"numpy.datetime64& +datetime.datetime"datetime.datetime + datetime.date" datetime.date* -fill_valueJ -Union[builtins.float,None] -builtins.float"builtins.float -None * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +index + +Union[TypeAlias[Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]]],None] +TypeAlias[Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]]] +Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]] +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.AnyArrayLike, +builtins.list[Any] +Any" builtins.list9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +builtins.range"builtins.range. +builtins.tuple[Any] +Any"builtins.tuple"pandas._typing.Axes +None *& +dtype& +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex * -nunique!pandas.core.series.Series.nunique" - builtins.int" builtins.int* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*, -dropna - builtins.bool" builtins.bool *V -powpandas.core.series.Series.pow" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date - datetime.time" datetime.time - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.float$ -builtins.complex"builtins.complex -TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] -Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimestampDtypeArg *. +name" +typing.Hashable"typing.Hashable ** +copy + builtins.bool" builtins.bool 0:typing.overloadXt +__new__!pandas.core.series.Series.__new__"H +"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries* +cls +2Type[pandas.core.series.Series[pandas._typing.S1]] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -35061,19 +42450,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*" -other" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"type*. +data. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 @@ -35084,16 +42468,10 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.str" builtins.str9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -35120,58 +42498,14 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *\ - -fill_valueJ -Union[builtins.float,None] -builtins.float"builtins.float -None * -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *) -prodpandas.core.series.Series.prod" -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -35198,58 +42532,145 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLike* + +index + +Union[TypeAlias[Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]]],None] +TypeAlias[Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]]] +Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]] +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.AnyArrayLike, +builtins.list[Any] +Any" builtins.list9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +builtins.range"builtins.range. +builtins.tuple[Any] +Any"builtins.tuple"pandas._typing.Axes +None *& +dtype& +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *U -skipnaG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None * -level -None *2 - numeric_only - builtins.bool" builtins.bool *- - min_count - builtins.int" builtins.int * -kwargs -Any*) -product!pandas.core.series.Series.product" -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimestampDtypeArg*. +name" +typing.Hashable"typing.Hashable ** +copy + builtins.bool" builtins.bool 0:typing.overloadX# +__new__!pandas.core.series.Series.__new__"B +pandas.core.series.PeriodSeries"pandas.core.series.PeriodSeries* +cls +2Type[pandas.core.series.Series[pandas._typing.S1]] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -35276,39 +42697,53 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *U -skipnaG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None * -level -None *2 - numeric_only - builtins.bool" builtins.bool *- - min_count - builtins.int" builtins.int * -kwargs -Any*Z -raddpandas.core.series.Series.radd" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"type* +data +`Union[pandas.core.indexes.period.PeriodIndex,typing.Sequence[pandas._libs.tslibs.period.Period]]P +&pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex +2typing.Sequence[pandas._libs.tslibs.period.Period]F +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period"typing.Sequence* + +index + +Union[TypeAlias[Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]]],None] +TypeAlias[Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]]] +Union[TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],builtins.list[Any],builtins.dict[Any,Any],builtins.range,builtins.tuple[Any]] +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.AnyArrayLike, +builtins.list[Any] +Any" builtins.list9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +builtins.range"builtins.range. +builtins.tuple[Any] +Any"builtins.tuple"pandas._typing.Axes +None *[ +dtypeN +%pandas.core.dtypes.dtypes.PeriodDtype"%pandas.core.dtypes.dtypes.PeriodDtype *. +name" +typing.Hashable"typing.Hashable ** +copy + builtins.bool" builtins.bool 0:typing.overloadXL +__new__!pandas.core.series.Series.__new__"H +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* +cls +2Type[pandas.core.series.Series[pandas._typing.S1]] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -35335,18 +42770,162 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"type* +data +Union[pandas.core.indexes.timedeltas.TimedeltaIndex,typing.Sequence[Union[numpy.timedelta64,datetime.timedelta]],builtins.dict[pandas._typing.HashableT1,Union[numpy.timedelta64,datetime.timedelta]],numpy.timedelta64,datetime.timedelta]^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex + - sort_values%pandas.core.series.Series.sort_values" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -42552,18 +49309,35 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +func +JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] +?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K +CallableType[builtins.function]& +builtins.function"builtins.function + builtins.str" builtins.str + numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase* +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex * +args +Any* +kwargs +Any0:typing.overloadX + transform#pandas.core.series.Series.transform": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -42590,67 +49364,45 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +func +Union[builtins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]],TypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]]] +Ybuiltins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]] +JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] +?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K +CallableType[builtins.function]& +builtins.function"builtins.function + builtins.str" builtins.str + numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase" builtins.list +YTypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]] +Ntyping.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.HashableV +%Union[Unknown,builtins.list[Unknown]]) +builtins.list[Unknown]" builtins.list"typing.Mapping"#pandas._typing.AggFuncTypeDictFrame* +axis =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * - ascending -3Union[builtins.bool,typing.Sequence[builtins.bool]] - builtins.bool" builtins.boolQ -typing.Sequence[builtins.bool] - builtins.bool" builtins.bool"typing.Sequence * -kind -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.SortKind * - na_position -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.NaPosition *2 - ignore_index - builtins.bool" builtins.bool *I -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool * -key -+Union[CallableType[builtins.function],None]K -CallableType[builtins.function]& -builtins.function"builtins.function -None 0:typing.overloadX? - sort_values%pandas.core.series.Series.sort_values" -8Union[pandas.core.series.Series[pandas._typing.S1],None] -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex * +args +Any* +kwargs +Any0:typing.overloadX2, +applypandas.core.series.Series.apply +applypandas.core.series.Series.apply"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -42677,19 +49429,27 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*U +funcK +CallableType[builtins.function]& +builtins.function"builtins.function*2 + convertDType + builtins.bool" builtins.bool *: +args. +builtins.tuple[Any] +Any"builtins.tuple * +kwds +Any0:typing.overloadX +applypandas.core.series.Series.apply": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -42716,72 +49476,28 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * - ascending -3Union[builtins.bool,typing.Sequence[builtins.bool]] - builtins.bool" builtins.boolQ -typing.Sequence[builtins.bool] - builtins.bool" builtins.bool"typing.Sequence *V -inplaceG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None * -kind -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.SortKind * - na_position -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.NaPosition *2 - ignore_index - builtins.bool" builtins.bool * -key -+Union[CallableType[builtins.function],None]K +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*U +funcK CallableType[builtins.function]& -builtins.function"builtins.function -None 0:typing.overloadX2 - -sort_index$pandas.core.series.Series.sort_index* - -sort_index$pandas.core.series.Series.sort_index" -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.function"builtins.function*2 + convertDType + builtins.bool" builtins.bool *: +args. +builtins.tuple[Any] +Any"builtins.tuple * +kwds +Any0:typing.overloadX2 +rename pandas.core.series.Series.rename' +rename pandas.core.series.Series.rename" +None* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -42808,15 +49524,27 @@ sort_index$pandas.core.series.Series.sort_index" builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +index +Union[TypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]],typing.Hashable,None] +lTypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]] +aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]] +:typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]] +Any +&TypeAlias[Union[typing.Hashable,None]]M +Union[typing.Hashable,None]" +typing.Hashable"typing.Hashable +None"pandas._typing.Label"typing.MappingK +CallableType[builtins.function]& +builtins.function"builtins.function"pandas._typing.Renamer" +typing.Hashable"typing.Hashable +None * +axis +Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] @@ -42830,57 +49558,32 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis +None ** +copy + builtins.bool" builtins.bool *G +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool* level :Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] .TypeAlias[Union[typing.Hashable,builtins.int]]i #Union[typing.Hashable,builtins.int]" typing.Hashable"typing.Hashable builtins.int" builtins.int"pandas._typing.Level -None * - ascending -3Union[builtins.bool,typing.Sequence[builtins.bool]] - builtins.bool" builtins.boolQ -typing.Sequence[builtins.bool] - builtins.bool" builtins.bool"typing.Sequence * -kind -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.SortKind * - na_position +None * +errors =TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] 2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.NaPosition *4 -sort_remaining - builtins.bool" builtins.bool *2 - ignore_index - builtins.bool" builtins.bool *G -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool* -key -+Union[CallableType[builtins.function],None]K -CallableType[builtins.function]& -builtins.function"builtins.function -None 0:typing.overloadX, - -sort_index$pandas.core.series.Series.sort_index"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX: +rename pandas.core.series.Series.rename" +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -42907,85 +49610,16 @@ sort_index$pandas.core.series.Series.sort_index"D builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -level -rUnion[TypeAlias[Union[typing.Hashable,builtins.int]],builtins.list[builtins.int],builtins.list[builtins.str],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.LevelJ -builtins.list[builtins.int] - builtins.int" builtins.int" builtins.listJ -builtins.list[builtins.str] - builtins.str" builtins.str" builtins.list -None * - ascending -3Union[builtins.bool,typing.Sequence[builtins.bool]] - builtins.bool" builtins.boolQ -typing.Sequence[builtins.bool] - builtins.bool" builtins.bool"typing.Sequence * -kind -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.SortKind * - na_position -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.NaPosition *4 -sort_remaining - builtins.bool" builtins.bool *2 - ignore_index - builtins.bool" builtins.bool *I -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool * -key -+Union[CallableType[builtins.function],None]K -CallableType[builtins.function]& -builtins.function"builtins.function -None 0:typing.overloadX- - -sort_index$pandas.core.series.Series.sort_index"~ -*Union[pandas.core.series.Series[Any],None]D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(* +self +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -43012,15 +49646,26 @@ sort_index$pandas.core.series.Series.sort_index"~ builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(* +index +xUnion[TypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]],None] +lTypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]] +aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]] +:typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]] +Any +&TypeAlias[Union[typing.Hashable,None]]M +Union[typing.Hashable,None]" +typing.Hashable"typing.Hashable +None"pandas._typing.Label"typing.MappingK +CallableType[builtins.function]& +builtins.function"builtins.function"pandas._typing.Renamer +None * +axis +Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] @@ -43034,58 +49679,68 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -level -rUnion[TypeAlias[Union[typing.Hashable,builtins.int]],builtins.list[builtins.int],builtins.list[builtins.str],None] + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis +None ** +copy + builtins.bool" builtins.bool *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool * +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] .TypeAlias[Union[typing.Hashable,builtins.int]]i #Union[typing.Hashable,builtins.int]" typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.LevelJ -builtins.list[builtins.int] - builtins.int" builtins.int" builtins.listJ -builtins.list[builtins.str] - builtins.str" builtins.str" builtins.list -None * - ascending -3Union[builtins.bool,typing.Sequence[builtins.bool]] - builtins.bool" builtins.boolQ -typing.Sequence[builtins.bool] - builtins.bool" builtins.bool"typing.Sequence *V -inplaceG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None * -kind -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.SortKind * - na_position + builtins.int" builtins.int"pandas._typing.Level +None * +errors =TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] 2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.NaPosition *4 -sort_remaining - builtins.bool" builtins.bool *2 - ignore_index - builtins.bool" builtins.bool * -key -+Union[CallableType[builtins.function],None]K -CallableType[builtins.function]& -builtins.function"builtins.function -None 0:typing.overloadX2l - aggregate#pandas.core.series.Series.aggregate2 - aggregate#pandas.core.series.Series.aggregate" -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX6 +rename pandas.core.series.Series.rename" +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(* +self +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -43112,18 +49767,60 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(*Z +indexM +Union[typing.Hashable,None]" +typing.Hashable"typing.Hashable +None * +axis +Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis +None ** +copy + builtins.bool" builtins.bool *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool * +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX' +rename pandas.core.series.Series.rename"~ +*Union[pandas.core.series.Series[Any],None]D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series +None* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -43150,36 +49847,67 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -func -JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] -?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +index +Union[TypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]],typing.Hashable,None] +lTypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]] +aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]] +:typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]] +Any +&TypeAlias[Union[typing.Hashable,None]]M +Union[typing.Hashable,None]" +typing.Hashable"typing.Hashable +None"pandas._typing.Label"typing.MappingK CallableType[builtins.function]& -builtins.function"builtins.function - builtins.str" builtins.str - numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase* -axis +builtins.function"builtins.function"pandas._typing.Renamer" +typing.Hashable"typing.Hashable +None * +axis +Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex * -args -Any* -kwargs -Any0:typing.overloadX9 - aggregate#pandas.core.series.Series.aggregate" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis +None ** +copy + builtins.bool" builtins.bool *- +inplace + builtins.bool" builtins.bool * +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX2 +fillna pandas.core.series.Series.fillna> +fillna pandas.core.series.Series.fillna" +None* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -43206,18 +49934,38 @@ JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*% +value% +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],pandas.core.frame.DataFrame,None] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar: +pandas._libs.missing.NAType"pandas._libs.missing.NAType9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -43244,44 +49992,37 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -func -TypeAlias[Union[builtins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]],TypeAlias[typing.Mapping[pandas._typing.HashableT,Unknown]]]] -Union[builtins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]],TypeAlias[typing.Mapping[pandas._typing.HashableT,Unknown]]] -Ybuiltins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]] -JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] -?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K -CallableType[builtins.function]& -builtins.function"builtins.function - builtins.str" builtins.str - numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase" builtins.list -;TypeAlias[typing.Mapping[pandas._typing.HashableT,Unknown]] -0typing.Mapping[pandas._typing.HashableT,Unknown]Q -pandas._typing.HashableT" -typing.Hashable"typing.Hashable"typing.Hashable"typing.Mapping"$pandas._typing.AggFuncTypeDictSeries"'pandas._typing.AggFuncTypeSeriesToFrame * -axis +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame +None * +axis =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex * -args -Any* -kwargs -Any0:typing.overloadX2V - transform#pandas.core.series.Series.transform3 - transform#pandas.core.series.Series.transform" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None *{ +downcastk +"Union[builtins.dict[Any,Any],None]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +None *G +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool0:typing.overloadXQ +fillna pandas.core.series.Series.fillna" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -43308,18 +50049,15 @@ JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -43346,38 +50084,38 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*% +value% +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],pandas.core.frame.DataFrame,None] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -func -JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] -?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K -CallableType[builtins.function]& -builtins.function"builtins.function - builtins.str" builtins.str - numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase* -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex * -args -Any* -kwargs -Any0:typing.overloadX" - transform#pandas.core.series.Series.transform": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar: +pandas._libs.missing.NAType"pandas._libs.missing.NAType9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -43404,48 +50142,38 @@ JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -func -Union[builtins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]],TypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]]] -Ybuiltins.list[TypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]]] -JTypeAlias[Union[CallableType[builtins.function],builtins.str,numpy.ufunc]] -?Union[CallableType[builtins.function],builtins.str,numpy.ufunc]K -CallableType[builtins.function]& -builtins.function"builtins.function - builtins.str" builtins.str - numpy.ufunc" numpy.ufunc"pandas._typing.AggFuncTypeBase" builtins.list -YTypeAlias[typing.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]] -Ntyping.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]]Q -pandas._typing.HashableT" -typing.Hashable"typing.Hashable"typing.HashableV -%Union[Unknown,builtins.list[Unknown]]) -builtins.list[Unknown]" builtins.list"typing.Mapping"#pandas._typing.AggFuncTypeDictFrame* -axis +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame +None * +axis =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex * -args -Any* -kwargs -Any0:typing.overloadX23 -applypandas.core.series.Series.apply -applypandas.core.series.Series.apply"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None *{ +downcastk +"Union[builtins.dict[Any,Any],None]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +None *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool 0:typing.overloadXQ +fillna pandas.core.series.Series.fillna" +8Union[pandas.core.series.Series[pandas._typing.S1],None] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -43472,30 +50200,16 @@ Ntyping.Mapping[pandas._typing.HashableT,Union[Unknown,builtins.list[Unknown]]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*U -funcK -CallableType[builtins.function]& -builtins.function"builtins.function*2 - convertDType - builtins.bool" builtins.bool *: -args. -builtins.tuple[Any] -Any"builtins.tuple * -kwds -Any0:typing.overloadX -applypandas.core.series.Series.apply": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series +None* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -43522,31 +50236,38 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*% +value% +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],pandas.core.frame.DataFrame,None] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*U -funcK -CallableType[builtins.function]& -builtins.function"builtins.function*2 - convertDType - builtins.bool" builtins.bool *: -args. -builtins.tuple[Any] -Any"builtins.tuple * -kwds -Any0:typing.overloadX2 -rename pandas.core.series.Series.rename* -rename pandas.core.series.Series.rename" -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar: +pandas._libs.missing.NAType"pandas._libs.missing.NAType9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -43573,71 +50294,37 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -index -Union[TypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]],typing.Hashable,None] -lTypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]] -aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]] -:typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]] -Any -&TypeAlias[Union[typing.Hashable,None]]M -Union[typing.Hashable,None]" -typing.Hashable"typing.Hashable -None"pandas._typing.Label"typing.MappingK -CallableType[builtins.function]& -builtins.function"builtins.function"pandas._typing.Renamer" -typing.Hashable"typing.Hashable -None * -axis -Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame +None * +axis =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis -None ** -copy - builtins.bool" builtins.bool *G -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool* -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX* -rename pandas.core.series.Series.rename"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex *- +inplace + builtins.bool" builtins.bool *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None *{ +downcastk +"Union[builtins.dict[Any,Any],None]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +None 0:typing.overloadX2 +replace!pandas.core.series.Series.replaceS +replace!pandas.core.series.Series.replace" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -43664,70 +50351,15 @@ aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[b builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -index -xUnion[TypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]],None] -lTypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]] -aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]] -:typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]] -Any -&TypeAlias[Union[typing.Hashable,None]]M -Union[typing.Hashable,None]" -typing.Hashable"typing.Hashable -None"pandas._typing.Label"typing.MappingK -CallableType[builtins.function]& -builtins.function"builtins.function"pandas._typing.Renamer -None * -axis -Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis -None ** -copy - builtins.bool" builtins.bool *I -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX% -rename pandas.core.series.Series.rename"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -43738,79 +50370,39 @@ aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[b builtins.complex"builtins.complex TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] -Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] - builtins.str" builtins.strI -numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtype: -Type[builtins.str] - builtins.str" builtins.str"typeF -Type[builtins.complex]$ -builtins.complex"builtins.complex"type= -Type[builtins.bool] - builtins.bool" builtins.bool"typeC -Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*Z -indexM -Union[typing.Hashable,None]" -typing.Hashable"typing.Hashable -None * -axis -Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis -None ** -copy - builtins.bool" builtins.bool *I -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX+ -rename pandas.core.series.Series.rename"~ -*Union[pandas.core.series.Series[Any],None]D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* + +to_replace +~Union[builtins.str,builtins.list[Any],builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],builtins.float,None] + builtins.str" builtins.str, +builtins.list[Any] +Any" builtins.list9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -43837,70 +50429,65 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series +builtins.float"builtins.float +None * +value +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],builtins.list[Any],builtins.str,None] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -index -Union[TypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]],typing.Hashable,None] -lTypeAlias[Union[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]]] -aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[builtins.function]] -:typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]] -Any -&TypeAlias[Union[typing.Hashable,None]]M -Union[typing.Hashable,None]" -typing.Hashable"typing.Hashable -None"pandas._typing.Label"typing.MappingK -CallableType[builtins.function]& -builtins.function"builtins.function"pandas._typing.Renamer" -typing.Hashable"typing.Hashable -None * -axis -Union[TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]],None] -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar: +pandas._libs.missing.NAType"pandas._libs.missing.NAType9 +builtins.dict[Any,Any] +Any +Any" builtins.dict, +builtins.list[Any] +Any" builtins.list + builtins.str" builtins.str +None *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None * +regex +Any * +method +STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis -None ** -copy - builtins.bool" builtins.bool *- -inplace - builtins.bool" builtins.bool * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX2 -droppandas.core.series.Series.drop+ -droppandas.core.series.Series.drop" -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.str" builtins.str"pandas._typing.ReplaceMethod 0:typing.overloadX@ +replace!pandas.core.series.Series.replace" +None* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -43927,77 +50514,23 @@ aUnion[typing.Mapping[Any,TypeAlias[Union[typing.Hashable,None]]],CallableType[b builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -labels -cUnion[typing.Hashable,builtins.list[pandas._typing.HashableT1],pandas.core.indexes.base.Index[Any]]" -typing.Hashable"typing.Hashable -(builtins.list[pandas._typing.HashableT1]R -pandas._typing.HashableT1" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.listN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index * -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -index -cUnion[typing.Hashable,builtins.list[pandas._typing.HashableT2],pandas.core.indexes.base.Index[Any]]" -typing.Hashable"typing.Hashable -(builtins.list[pandas._typing.HashableT2]R -pandas._typing.HashableT2" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.listN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index * -columns -cUnion[typing.Hashable,builtins.list[pandas._typing.HashableT3],pandas.core.indexes.base.Index[Any]]" -typing.Hashable"typing.Hashable -(builtins.list[pandas._typing.HashableT3]R -pandas._typing.HashableT3" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.listN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *G -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool* -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX, -droppandas.core.series.Series.drop"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* + +to_replace +~Union[builtins.str,builtins.list[Any],builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],builtins.float,None] + builtins.str" builtins.str, +builtins.list[Any] +Any" builtins.list9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -44024,79 +50557,64 @@ cUnion[typing.Hashable,builtins.list[pandas._typing.HashableT3],pandas.core.inde builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series +builtins.float"builtins.float +None * +value +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],builtins.list[Any],builtins.str,None] +TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] + +Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] +TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] +Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedelta$ +numpy.datetime64"numpy.datetime64& +numpy.timedelta64"numpy.timedelta64 + builtins.bool" builtins.bool builtins.int" builtins.int builtins.float"builtins.floatT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -labels -cUnion[typing.Hashable,builtins.list[pandas._typing.HashableT1],pandas.core.indexes.base.Index[Any]]" -typing.Hashable"typing.Hashable -(builtins.list[pandas._typing.HashableT1]R -pandas._typing.HashableT1" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.listN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index * -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ +builtins.complex"builtins.complex"pandas._typing.Scalar: +pandas._libs.missing.NAType"pandas._libs.missing.NAType9 +builtins.dict[Any,Any] +Any +Any" builtins.dict, +builtins.list[Any] +Any" builtins.list + builtins.str" builtins.str +None *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None * +regex +Any * +method +STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -index -cUnion[typing.Hashable,builtins.list[pandas._typing.HashableT2],pandas.core.indexes.base.Index[Any]]" -typing.Hashable"typing.Hashable -(builtins.list[pandas._typing.HashableT2]R -pandas._typing.HashableT2" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.listN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index * -columns -cUnion[typing.Hashable,builtins.list[pandas._typing.HashableT3],pandas.core.indexes.base.Index[Any]]" -typing.Hashable"typing.Hashable -(builtins.list[pandas._typing.HashableT3]R -pandas._typing.HashableT3" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.listN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *I +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ReplaceMethod *G inplace: Literal[builtins.bool]  - builtins.bool" builtins.bool * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX, -droppandas.core.series.Series.drop"~ -*Union[pandas.core.series.Series[Any],None]D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool0:typing.overloadXT +replace!pandas.core.series.Series.replace" +8Union[pandas.core.series.Series[pandas._typing.S1],None] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -44123,76 +50641,16 @@ cUnion[typing.Hashable,builtins.list[pandas._typing.HashableT3],pandas.core.inde builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -labels -cUnion[typing.Hashable,builtins.list[pandas._typing.HashableT1],pandas.core.indexes.base.Index[Any]]" -typing.Hashable"typing.Hashable -(builtins.list[pandas._typing.HashableT1]R -pandas._typing.HashableT1" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.listN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index * -axis -TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * -index -cUnion[typing.Hashable,builtins.list[pandas._typing.HashableT2],pandas.core.indexes.base.Index[Any]]" -typing.Hashable"typing.Hashable -(builtins.list[pandas._typing.HashableT2]R -pandas._typing.HashableT2" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.listN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index * -columns -cUnion[typing.Hashable,builtins.list[pandas._typing.HashableT3],pandas.core.indexes.base.Index[Any]]" -typing.Hashable"typing.Hashable -(builtins.list[pandas._typing.HashableT3]R -pandas._typing.HashableT3" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.listN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index * -level -:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] -.TypeAlias[Union[typing.Hashable,builtins.int]]i -#Union[typing.Hashable,builtins.int]" -typing.Hashable"typing.Hashable - builtins.int" builtins.int"pandas._typing.Level -None *- -inplace - builtins.bool" builtins.bool * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX2 -fillna pandas.core.series.Series.fillnaI -fillna pandas.core.series.Series.fillna" -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series +None* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -44219,16 +50677,58 @@ cUnion[typing.Hashable,builtins.list[pandas._typing.HashableT3],pandas.core.inde builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* + +to_replace +~Union[builtins.str,builtins.list[Any],builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],builtins.float,None] + builtins.str" builtins.str, +builtins.list[Any] +Any" builtins.list9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*) -value) -Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],pandas.core.frame.DataFrame,None] +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series +builtins.float"builtins.float +None * +value +Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],builtins.list[Any],builtins.str,None] TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] @@ -44250,10 +50750,35 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand pandas._libs.missing.NAType"pandas._libs.missing.NAType9 builtins.dict[Any,Any] Any -Any" builtins.dict -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" builtins.dict, +builtins.list[Any] +Any" builtins.list + builtins.str" builtins.str +None *- +inplace + builtins.bool" builtins.bool *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None * +regex +Any * +method +STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ReplaceMethod 0:typing.overloadX2o +dropna pandas.core.series.Series.dropna +dropna pandas.core.series.Series.dropna" +None* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -44280,53 +50805,32 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame -None * -method -uUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.FillnaOptions -None * +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* axis =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None *{ -downcastk -"Union[builtins.dict[Any,Any],None]9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -None *G + builtins.int" builtins.int"pandas._typing.AxisIndex *G inplace: Literal[builtins.bool]  - builtins.bool" builtins.bool0:typing.overloadX` -fillna pandas.core.series.Series.fillna" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool* +how +7Union[Literal[builtins.str],Literal[builtins.str],None]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +None 0:typing.overloadX+ +dropna pandas.core.series.Series.dropna" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -44353,18 +50857,15 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -44391,41 +50892,69 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*) -value) -Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],pandas.core.frame.DataFrame,None] -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool * +how +7Union[Literal[builtins.str],Literal[builtins.str],None]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +None 0:typing.overloadX+ +dropna pandas.core.series.Series.dropna" +8Union[pandas.core.series.Series[pandas._typing.S1],None] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 + datetime.date" datetime.date + datetime.time" datetime.time builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar: -pandas._libs.missing.NAType"pandas._libs.missing.NAType9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series +None* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -44452,54 +50981,35 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame -None * -method -uUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.FillnaOptions -None * +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* axis =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None *{ -downcastk -"Union[builtins.dict[Any,Any],None]9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -None *I -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool 0:typing.overloadXa -fillna pandas.core.series.Series.fillna" -8Union[pandas.core.series.Series[pandas._typing.S1],None] -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex *- +inplace + builtins.bool" builtins.bool * +how +7Union[Literal[builtins.str],Literal[builtins.str],None]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +None 0:typing.overloadX2 +astype pandas.core.series.Series.astype +astype pandas.core.series.Series.astype"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -44526,19 +51036,49 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +dtype +TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]= +Type[builtins.bool] + builtins.bool" builtins.bool"type7 +Literal[builtins.str]  + builtins.str" builtins.strR +'pandas.core.arrays.boolean.BooleanDtype"'pandas.core.arrays.boolean.BooleanDtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Type[numpy.bool_] + numpy.bool_" numpy.bool_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.BooleanDtypeArg** +copy + builtins.bool" builtins.bool * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadXs +astype pandas.core.series.Series.astype"b +'pandas.core.series.Series[builtins.int] + builtins.int" builtins.int"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -44565,41 +51105,187 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*) -value) -Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],pandas.core.frame.DataFrame,None] -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar: -pandas._libs.missing.NAType"pandas._libs.missing.NAType9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*[ +dtype[ +Union[TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]]]& +TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: +Type[builtins.int] + builtins.int" builtins.int"type7 +Literal[builtins.str]  + builtins.str" builtins.strL +$pandas.core.arrays.integer.Int8Dtype"$pandas.core.arrays.integer.Int8DtypeN +%pandas.core.arrays.integer.Int16Dtype"%pandas.core.arrays.integer.Int16DtypeN +%pandas.core.arrays.integer.Int32Dtype"%pandas.core.arrays.integer.Int32DtypeN +%pandas.core.arrays.integer.Int64Dtype"%pandas.core.arrays.integer.Int64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +)Type[numpy.signedinteger[TypeAlias[Any]]]v +#numpy.signedinteger[TypeAlias[Any]]: +TypeAlias[Any] +Any"numpy._typing._nbit._NBitByte"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strc +"Type[numpy.signedinteger[Unknown]]5 +numpy.signedinteger[Unknown]"numpy.signedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IntDtypeArg$ +TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]N +%pandas.core.arrays.integer.UInt8Dtype"%pandas.core.arrays.integer.UInt8DtypeP +&pandas.core.arrays.integer.UInt16Dtype"&pandas.core.arrays.integer.UInt16DtypeP +&pandas.core.arrays.integer.UInt32Dtype"&pandas.core.arrays.integer.UInt32DtypeP +&pandas.core.arrays.integer.UInt64Dtype"&pandas.core.arrays.integer.UInt64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.stri +$Type[numpy.unsignedinteger[Unknown]]9 +numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.UIntDtypeArg** +copy + builtins.bool" builtins.bool * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX +astype pandas.core.series.Series.astype"b +'pandas.core.series.Series[builtins.str] + builtins.str" builtins.str"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -44626,20 +51312,25 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame -None * -method -uUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +dtype +TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: +Type[builtins.str] + builtins.str" builtins.str"type7 +Literal[builtins.str]  + builtins.str" builtins.strP +&pandas.core.arrays.string_.StringDtype"&pandas.core.arrays.string_.StringDtype7 +Literal[builtins.str]  + builtins.str" builtins.str4 +Type[numpy.str_] + +numpy.str_" +numpy.str_"type7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -44647,32 +51338,27 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.FillnaOptions -None * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *- -inplace - builtins.bool" builtins.bool *Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None *{ -downcastk -"Union[builtins.dict[Any,Any],None]9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -None 0:typing.overloadX2 -replace!pandas.core.series.Series.replace^ -replace!pandas.core.series.Series.replace" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.StrDtypeArg** +copy + builtins.bool" builtins.bool * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX +astype pandas.core.series.Series.astype"h +)pandas.core.series.Series[builtins.bytes] +builtins.bytes"builtins.bytes"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -44699,18 +51385,46 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +dtype +TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ +Type[builtins.bytes] +builtins.bytes"builtins.bytes"type7 +Literal[builtins.str]  + builtins.str" builtins.str: +Type[numpy.bytes_] + numpy.bytes_" numpy.bytes_"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.BytesDtypeArg** +copy + builtins.bool" builtins.bool * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX5 +astype pandas.core.series.Series.astype"h +)pandas.core.series.Series[builtins.float] +builtins.float"builtins.float"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -44737,26 +51451,98 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* - -to_replace -~Union[builtins.str,builtins.list[Any],builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],builtins.float,None] - builtins.str" builtins.str, -builtins.list[Any] -Any" builtins.list9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +dtype +TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ +Type[builtins.float] +builtins.float"builtins.float"type7 +Literal[builtins.str]  + builtins.str" builtins.strT +(pandas.core.arrays.floating.Float32Dtype"(pandas.core.arrays.floating.Float32DtypeT +(pandas.core.arrays.floating.Float64Dtype"(pandas.core.arrays.floating.Float64Dtype7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str +$Type[numpy.floating[TypeAlias[Any]]]l +numpy.floating[TypeAlias[Any]]: +TypeAlias[Any] +Any"numpy._typing._nbit._NBitHalf"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.strT +Type[numpy.floating[Unknown]]+ +numpy.floating[Unknown]"numpy.floating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.FloatDtypeArg** +copy + builtins.bool" builtins.bool * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX, +astype pandas.core.series.Series.astype"n ++pandas.core.series.Series[builtins.complex]$ +builtins.complex"builtins.complex"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -44783,68 +51569,75 @@ to_replace builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series -builtins.float"builtins.float -None * -value -Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],builtins.list[Any],builtins.str,None] -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar: -pandas._libs.missing.NAType"pandas._libs.missing.NAType9 -builtins.dict[Any,Any] -Any -Any" builtins.dict, -builtins.list[Any] -Any" builtins.list - builtins.str" builtins.str -None *I -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool *Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None * -regex -Any * -method -STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +dtype +TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[TypeAlias[Any],Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[TypeAlias[Any],Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]F +Type[builtins.complex]$ +builtins.complex"builtins.complex"type7 +Literal[builtins.str]  + builtins.str" builtins.str +3Type[numpy.complexfloating[TypeAlias[Any],Unknown]] +-numpy.complexfloating[TypeAlias[Any],Unknown]< +TypeAlias[Any] +Any"numpy._typing._nbit._NBitSingle"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str{ +,Type[numpy.complexfloating[Unknown,Unknown]]C +&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ComplexDtypeArg** +copy + builtins.bool" builtins.bool * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.ReplaceMethod 0:typing.overloadXG -replace!pandas.core.series.Series.replace" -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX; +astype pandas.core.series.Series.astype"H +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -44871,26 +51664,121 @@ HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* - -to_replace -~Union[builtins.str,builtins.list[Any],builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],builtins.float,None] - builtins.str" builtins.str, -builtins.list[Any] -Any" builtins.list9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*$ +dtype$ +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimedeltaDtypeArg** +copy + builtins.bool" builtins.bool * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX= +astype pandas.core.series.Series.astype"H +"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -44917,67 +51805,126 @@ to_replace builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series -builtins.float"builtins.float -None * -value -Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],builtins.list[Any],builtins.str,None] -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar: -pandas._libs.missing.NAType"pandas._libs.missing.NAType9 -builtins.dict[Any,Any] -Any -Any" builtins.dict, -builtins.list[Any] -Any" builtins.list - builtins.str" builtins.str -None *Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None * -regex -Any * -method -STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*& +dtype& +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.ReplaceMethod *G -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool0:typing.overloadX^ -replace!pandas.core.series.Series.replace" -8Union[pandas.core.series.Series[pandas._typing.S1],None] -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.TimestampDtypeArg** +copy + builtins.bool" builtins.bool * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX +astype pandas.core.series.Series.astype" +Epandas.core.series.Series[pandas.core.dtypes.dtypes.CategoricalDtype]X +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -45004,19 +51951,33 @@ HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +dtype +RTypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]] +GUnion[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]X +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.CategoryDtypeArg** +copy + builtins.bool" builtins.bool * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX$ +astype pandas.core.series.Series.astype"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -45043,26 +52004,57 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +dtype +Union[TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]] +gTypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]] +\Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]C +Type[builtins.object]" +builtins.object"builtins.object"type7 +Literal[builtins.str]  + builtins.str" builtins.str= +Type[numpy.object_] + numpy.object_" numpy.object_"type7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ObjectDtypeArg +dTypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +YUnion[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]4 +Type[numpy.void] -to_replace -~Union[builtins.str,builtins.list[Any],builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],builtins.float,None] - builtins.str" builtins.str, -builtins.list[Any] -Any" builtins.list9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +numpy.void" +numpy.void"type7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.VoidDtypeArgP +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +STypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]] +HUnion[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]I +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtypeP +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype"pandas._typing.DtypeObj** +copy + builtins.bool" builtins.bool * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX2E +ffillpandas.core.series.Series.ffill +ffillpandas.core.series.Series.ffill" +None* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -45089,68 +52081,37 @@ to_replace builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series -builtins.float"builtins.float -None * -value -Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.missing.NAType,builtins.dict[Any,Any],builtins.list[Any],builtins.str,None] -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar: -pandas._libs.missing.NAType"pandas._libs.missing.NAType9 -builtins.dict[Any,Any] -Any -Any" builtins.dict, -builtins.list[Any] -Any" builtins.list - builtins.str" builtins.str -None *- -inplace - builtins.bool" builtins.bool *Q +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *G +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool*Q limitD Union[builtins.int,None] builtins.int" builtins.int -None * -regex -Any * -method -STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.ReplaceMethod 0:typing.overloadX2 -dropna pandas.core.series.Series.dropna -dropna pandas.core.series.Series.dropna" -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +None *{ +downcastk +"Union[builtins.dict[Any,Any],None]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +None 0:typing.overloadX, +ffillpandas.core.series.Series.ffill" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -45177,35 +52138,15 @@ HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *G -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool* -how -7Union[Literal[builtins.str],Literal[builtins.str],None]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str -None 0:typing.overloadX2 -dropna pandas.core.series.Series.dropna" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -45232,18 +52173,40 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None *{ +downcastk +"Union[builtins.dict[Any,Any],None]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +None 0:typing.overloadX2ř +bfillpandas.core.series.Series.bfill +bfillpandas.core.series.Series.bfill" +None* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -45270,36 +52233,37 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *I + builtins.int" builtins.int"pandas._typing.AxisIndex +None *G inplace: Literal[builtins.bool]  - builtins.bool" builtins.bool * -how -7Union[Literal[builtins.str],Literal[builtins.str],None]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str -None 0:typing.overloadX2 -dropna pandas.core.series.Series.dropna" -8Union[pandas.core.series.Series[pandas._typing.S1],None] -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool*Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None *{ +downcastk +"Union[builtins.dict[Any,Any],None]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +None 0:typing.overloadX, +bfillpandas.core.series.Series.bfill" +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -45323,22 +52287,18 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand Type[builtins.bool] builtins.bool" builtins.bool"typeC Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -45365,38 +52325,38 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *- -inplace - builtins.bool" builtins.bool * -how -7Union[Literal[builtins.str],Literal[builtins.str],None]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str -None 0:typing.overloadX2֔ -astype pandas.core.series.Series.astype$ -astype pandas.core.series.Series.astype"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas._typing.AxisIndex +None *I +inplace: +Literal[builtins.bool]  + builtins.bool" builtins.bool *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None *{ +downcastk +"Union[builtins.dict[Any,Any],None]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +None 0:typing.overloadXS +bfillpandas.core.series.Series.bfill" +8Union[pandas.core.series.Series[pandas._typing.S1],None] +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -45423,54 +52383,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -dtype -TypeAlias[Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Type[builtins.bool],Literal[builtins.str],pandas.core.arrays.boolean.BooleanDtype,Literal[builtins.str],Type[numpy.bool_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]= -Type[builtins.bool] - builtins.bool" builtins.bool"type7 -Literal[builtins.str]  - builtins.str" builtins.strR -'pandas.core.arrays.boolean.BooleanDtype"'pandas.core.arrays.boolean.BooleanDtype7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Type[numpy.bool_] - numpy.bool_" numpy.bool_"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.BooleanDtypeArg** -copy - builtins.bool" builtins.bool * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadXx -astype pandas.core.series.Series.astype"b -'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series +None* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -45497,194 +52419,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*] -dtype] -Union[TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]]]' -TypeAlias[Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Type[builtins.int],Literal[builtins.str],pandas.core.arrays.integer.Int8Dtype,pandas.core.arrays.integer.Int16Dtype,pandas.core.arrays.integer.Int32Dtype,pandas.core.arrays.integer.Int64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.signedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: -Type[builtins.int] - builtins.int" builtins.int"type7 -Literal[builtins.str]  - builtins.str" builtins.strL -$pandas.core.arrays.integer.Int8Dtype"$pandas.core.arrays.integer.Int8DtypeN -%pandas.core.arrays.integer.Int16Dtype"%pandas.core.arrays.integer.Int16DtypeN -%pandas.core.arrays.integer.Int32Dtype"%pandas.core.arrays.integer.Int32DtypeN -%pandas.core.arrays.integer.Int64Dtype"%pandas.core.arrays.integer.Int64Dtype7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str -)Type[numpy.signedinteger[TypeAlias[Any]]]v -#numpy.signedinteger[TypeAlias[Any]]: -TypeAlias[Any] -Any"numpy._typing._nbit._NBitByte"numpy.signedinteger"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.strc -"Type[numpy.signedinteger[Unknown]]5 -numpy.signedinteger[Unknown]"numpy.signedinteger"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.strc -"Type[numpy.signedinteger[Unknown]]5 -numpy.signedinteger[Unknown]"numpy.signedinteger"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.strc -"Type[numpy.signedinteger[Unknown]]5 -numpy.signedinteger[Unknown]"numpy.signedinteger"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.strc -"Type[numpy.signedinteger[Unknown]]5 -numpy.signedinteger[Unknown]"numpy.signedinteger"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.strc -"Type[numpy.signedinteger[Unknown]]5 -numpy.signedinteger[Unknown]"numpy.signedinteger"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IntDtypeArg% -TypeAlias[Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[pandas.core.arrays.integer.UInt8Dtype,pandas.core.arrays.integer.UInt16Dtype,pandas.core.arrays.integer.UInt32Dtype,pandas.core.arrays.integer.UInt64Dtype,Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Type[numpy.unsignedinteger[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]N -%pandas.core.arrays.integer.UInt8Dtype"%pandas.core.arrays.integer.UInt8DtypeP -&pandas.core.arrays.integer.UInt16Dtype"&pandas.core.arrays.integer.UInt16DtypeP -&pandas.core.arrays.integer.UInt32Dtype"&pandas.core.arrays.integer.UInt32DtypeP -&pandas.core.arrays.integer.UInt64Dtype"&pandas.core.arrays.integer.UInt64Dtype7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.stri -$Type[numpy.unsignedinteger[Unknown]]9 -numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.stri -$Type[numpy.unsignedinteger[Unknown]]9 -numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.stri -$Type[numpy.unsignedinteger[Unknown]]9 -numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.stri -$Type[numpy.unsignedinteger[Unknown]]9 -numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.stri -$Type[numpy.unsignedinteger[Unknown]]9 -numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.stri -$Type[numpy.unsignedinteger[Unknown]]9 -numpy.unsignedinteger[Unknown]"numpy.unsignedinteger"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.UIntDtypeArg** -copy - builtins.bool" builtins.bool * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX$ -astype pandas.core.series.Series.astype"b -'pandas.core.series.Series[builtins.str] - builtins.str" builtins.str"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*' +value' +xUnion[pandas._typing.S1,builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],pandas.core.frame.DataFrame] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -45711,56 +52454,17 @@ $Type[numpy.unsignedinteger[Unknown]]9 builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -dtype -TypeAlias[Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Type[builtins.str],Literal[builtins.str],pandas.core.arrays.string_.StringDtype,Literal[builtins.str],Type[numpy.str_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]: -Type[builtins.str] - builtins.str" builtins.str"type7 -Literal[builtins.str]  - builtins.str" builtins.strP -&pandas.core.arrays.string_.StringDtype"&pandas.core.arrays.string_.StringDtype7 -Literal[builtins.str]  - builtins.str" builtins.str4 -Type[numpy.str_] - -numpy.str_" -numpy.str_"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.StrDtypeArg** -copy - builtins.bool" builtins.bool * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX" -astype pandas.core.series.Series.astype"h -)pandas.core.series.Series[builtins.bytes] -builtins.bytes"builtins.bytes"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -45787,51 +52491,39 @@ numpy.str_"type7 builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -dtype -TypeAlias[Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Type[builtins.bytes],Literal[builtins.str],Type[numpy.bytes_],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ -Type[builtins.bytes] -builtins.bytes"builtins.bytes"type7 -Literal[builtins.str]  - builtins.str" builtins.str: -Type[numpy.bytes_] - numpy.bytes_" numpy.bytes_"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.BytesDtypeArg** -copy - builtins.bool" builtins.bool * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX9 -astype pandas.core.series.Series.astype"h -)pandas.core.series.Series[builtins.float] -builtins.float"builtins.float"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex *- +inplace + builtins.bool" builtins.bool *Q +limitD +Union[builtins.int,None] + builtins.int" builtins.int +None *{ +downcastk +"Union[builtins.dict[Any,Any],None]9 +builtins.dict[Any,Any] +Any +Any" builtins.dict +None 0:typing.overloadX2. + value_counts&pandas.core.series.Series.value_counts + value_counts&pandas.core.series.Series.value_counts"b +'pandas.core.series.Series[builtins.int] + builtins.int" builtins.int"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -45858,101 +52550,31 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -dtype -TypeAlias[Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Type[builtins.float],Literal[builtins.str],pandas.core.arrays.floating.Float32Dtype,pandas.core.arrays.floating.Float64Dtype,Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[TypeAlias[Any]]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.floating[Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]@ -Type[builtins.float] -builtins.float"builtins.float"type7 -Literal[builtins.str]  - builtins.str" builtins.strT -(pandas.core.arrays.floating.Float32Dtype"(pandas.core.arrays.floating.Float32DtypeT -(pandas.core.arrays.floating.Float64Dtype"(pandas.core.arrays.floating.Float64Dtype7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str -$Type[numpy.floating[TypeAlias[Any]]]l -numpy.floating[TypeAlias[Any]]: -TypeAlias[Any] -Any"numpy._typing._nbit._NBitHalf"numpy.floating"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.strT -Type[numpy.floating[Unknown]]+ -numpy.floating[Unknown]"numpy.floating"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.strT -Type[numpy.floating[Unknown]]+ -numpy.floating[Unknown]"numpy.floating"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.strT -Type[numpy.floating[Unknown]]+ -numpy.floating[Unknown]"numpy.floating"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.FloatDtypeArg** -copy - builtins.bool" builtins.bool * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX0 -astype pandas.core.series.Series.astype"n -+pandas.core.series.Series[builtins.complex]$ -builtins.complex"builtins.complex"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*K + normalize: +Literal[builtins.bool]  + builtins.bool" builtins.bool ** +sort + builtins.bool" builtins.bool */ + ascending + builtins.bool" builtins.bool *P +binsD +Union[builtins.int,None] + builtins.int" builtins.int +None *, +dropna + builtins.bool" builtins.bool 0:typing.overloadX + value_counts&pandas.core.series.Series.value_counts"h +)pandas.core.series.Series[builtins.float] +builtins.float"builtins.float"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -45979,78 +52601,30 @@ $Type[numpy.floating[TypeAlias[Any]]]l builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -dtype -TypeAlias[Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[TypeAlias[Any],Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Type[builtins.complex],Literal[builtins.str],Type[numpy.complexfloating[TypeAlias[Any],Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Type[numpy.complexfloating[Unknown,Unknown]],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]F -Type[builtins.complex]$ -builtins.complex"builtins.complex"type7 -Literal[builtins.str]  - builtins.str" builtins.str -3Type[numpy.complexfloating[TypeAlias[Any],Unknown]] --numpy.complexfloating[TypeAlias[Any],Unknown]< -TypeAlias[Any] -Any"numpy._typing._nbit._NBitSingle"numpy.complexfloating"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str{ -,Type[numpy.complexfloating[Unknown,Unknown]]C -&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str{ -,Type[numpy.complexfloating[Unknown,Unknown]]C -&numpy.complexfloating[Unknown,Unknown]"numpy.complexfloating"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.ComplexDtypeArg** -copy - builtins.bool" builtins.bool * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX? -astype pandas.core.series.Series.astype"H -"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*I + normalize: +Literal[builtins.bool]  + builtins.bool" builtins.bool** +sort + builtins.bool" builtins.bool */ + ascending + builtins.bool" builtins.bool *P +binsD +Union[builtins.int,None] + builtins.int" builtins.int +None *, +dropna + builtins.bool" builtins.bool 0:typing.overloadX2ϗ +__add__!pandas.core.series.Series.__add__O +__add__!pandas.core.series.Series.__add__" +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -46077,124 +52651,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*$ -dtype$ -TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.TimedeltaDtypeArg** -copy - builtins.bool" builtins.bool * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadXA -astype pandas.core.series.Series.astype"H -"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(* +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -46221,129 +52686,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*& -dtype& -TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.TimestampDtypeArg** -copy - builtins.bool" builtins.bool * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX -astype pandas.core.series.Series.astype"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(*'& +7Union[pandas._typing.S1,pandas.core.series.Series.Self] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -46370,36 +52720,52 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -dtype -RTypeAlias[Union[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]] -GUnion[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]X -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.CategoryDtypeArg** -copy - builtins.bool" builtins.bool * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX( -astype pandas.core.series.Series.astype"D +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(0:typing.overloadXH +__add__!pandas.core.series.Series.__add__"D pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -46426,60 +52792,66 @@ GUnion[pandas.core.dtypes.dtypes.CategoricalDtype,Literal[builtins.str]]X builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*33 +Union[builtins.complex,builtins.str,datetime.timedelta,pandas._libs.tslibs.timedeltas.Timedelta,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[Any],numpy.timedelta64]$ +builtins.complex"builtins.complex + builtins.str" builtins.str( +datetime.timedelta"datetime.timedeltaT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -dtype -Union[TypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]],TypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]]] -gTypeAlias[Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]] -\Union[Type[builtins.object],Literal[builtins.str],Type[numpy.object_],Literal[builtins.str]]C -Type[builtins.object]" -builtins.object"builtins.object"type7 -Literal[builtins.str]  - builtins.str" builtins.str= -Type[numpy.object_] - numpy.object_" numpy.object_"type7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.ObjectDtypeArg -dTypeAlias[Union[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -YUnion[Type[numpy.void],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]4 -Type[numpy.void] - -numpy.void" -numpy.void"type7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.VoidDtypeArgP -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype -STypeAlias[Union[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]] -HUnion[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]I +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI numpy.dtype[numpy.generic] - numpy.generic" numpy.generic" numpy.dtypeP -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype"pandas._typing.DtypeObj** -copy - builtins.bool" builtins.bool * -errors -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.IgnoreRaise 0:typing.overloadX2P -ffillpandas.core.series.Series.ffill -ffillpandas.core.series.Series.ffill" -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -46506,40 +52878,21 @@ HUnion[numpy.dtype[numpy.generic],pandas.core.dtypes.base.ExtensionDtype]I builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *G -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool*Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None *{ -downcastk -"Union[builtins.dict[Any,Any],None]9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -None 0:typing.overloadX3 -ffillpandas.core.series.Series.ffill" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLikeD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series& +numpy.timedelta64"numpy.timedelta640:typing.overloadX28 +__and__!pandas.core.series.Series.__and__ +__and__!pandas.core.series.Series.__and__"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -46566,18 +52919,32 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +Union[builtins.bool,builtins.list[builtins.bool],builtins.list[builtins.int],TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.bool]] + builtins.bool" builtins.boolM +builtins.list[builtins.bool] + builtins.bool" builtins.bool" builtins.listJ +builtins.list[builtins.int] + builtins.int" builtins.int" builtins.list +^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_boole +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series0:typing.overloadX +__and__!pandas.core.series.Series.__and__"b +'pandas.core.series.Series[builtins.int] + builtins.int" builtins.int"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -46604,43 +52971,28 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *I -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool *Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None *{ -downcastk -"Union[builtins.dict[Any,Any],None]9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -None 0:typing.overloadX2IJ -bfillpandas.core.series.Series.bfill -bfillpandas.core.series.Series.bfill" -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +Union[builtins.int,TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.int]] + builtins.int" builtins.int +^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray" pandas._typing.np_ndarray_anyintb +'pandas.core.series.Series[builtins.int] + builtins.int" builtins.int"pandas.core.series.Series0:typing.overloadX2] +__mul__!pandas.core.series.Series.__mul__ +__mul__!pandas.core.series.Series.__mul__"H +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -46667,40 +53019,22 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *G -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool*Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None *{ -downcastk -"Union[builtins.dict[Any,Any],None]9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -None 0:typing.overloadX3 -bfillpandas.core.series.Series.bfill" -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +wUnion[datetime.timedelta,pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.series.TimedeltaSeries,numpy.timedelta64]( +datetime.timedelta"datetime.timedeltaT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.TimedeltaH +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries& +numpy.timedelta64"numpy.timedelta640:typing.overloadXE +__mul__!pandas.core.series.Series.__mul__"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -46727,18 +53061,29 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*11 +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[Any]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -46765,41 +53110,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *I -inplace: -Literal[builtins.bool]  - builtins.bool" builtins.bool *Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None *{ -downcastk -"Union[builtins.dict[Any,Any],None]9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -None 0:typing.overloadXb -bfillpandas.core.series.Series.bfill" -8Union[pandas.core.series.Series[pandas._typing.S1],None] -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -46826,19 +53144,20 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLikeD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series0:typing.overloadX28 +__or__ pandas.core.series.Series.__or__ +__or__ pandas.core.series.Series.__or__"e +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -46865,18 +53184,32 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*/ -value/ -xUnion[pandas._typing.S1,builtins.dict[Any,Any],pandas.core.series.Series[pandas._typing.S1],pandas.core.frame.DataFrame] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +Union[builtins.bool,builtins.list[builtins.bool],builtins.list[builtins.int],TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.bool]] + builtins.bool" builtins.boolM +builtins.list[builtins.bool] + builtins.bool" builtins.bool" builtins.listJ +builtins.list[builtins.int] + builtins.int" builtins.int" builtins.list +^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_boole +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series0:typing.overloadX +__or__ pandas.core.series.Series.__or__"b +'pandas.core.series.Series[builtins.int] + builtins.int" builtins.int"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -46903,20 +53236,28 @@ xUnion[pandas._typing.S1,builtins.dict[Any,Any],pandas.core.series.Series[pandas builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +Union[builtins.int,TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.int]] + builtins.int" builtins.int +^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] +STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] +Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] +Any +5numpy.dtype[numpy._typing._array_like._ScalarType_co][ +(numpy._typing._array_like._ScalarType_co + numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray" pandas._typing.np_ndarray_anyintb +'pandas.core.series.Series[builtins.int] + builtins.int" builtins.int"pandas.core.series.Series0:typing.overloadX2 +__radd__"pandas.core.series.Series.__radd__N +__radd__"pandas.core.series.Series.__radd__" +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -46943,40 +53284,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex *- -inplace - builtins.bool" builtins.bool *Q -limitD -Union[builtins.int,None] - builtins.int" builtins.int -None *{ -downcastk -"Union[builtins.dict[Any,Any],None]9 -builtins.dict[Any,Any] -Any -Any" builtins.dict -None 0:typing.overloadX2φ -__add__!pandas.core.series.Series.__add__ -__add__!pandas.core.series.Series.__add__"H -"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(* +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -47003,20 +53319,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*JH -"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries0:typing.overloadX -__add__!pandas.core.series.Series.__add__"H -"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(*&& +EUnion[pandas._typing.S1,pandas.core.series.Series[pandas._typing.S1]] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -47043,20 +53353,14 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*\Z -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex0:typing.overloadX -__add__!pandas.core.series.Series.__add__"H -"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -47083,21 +53387,17 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*VT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp0:typing.overloadX< -__add__!pandas.core.series.Series.__add__"D +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series0:typing.overloadXF +__radd__"pandas.core.series.Series.__radd__"D pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -47124,20 +53424,16 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*$$ -Union[builtins.complex,builtins.str,pandas._libs.tslibs.timedeltas.Timedelta,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1],numpy.timedelta64]$ +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*11 +Union[builtins.complex,builtins.str,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[Any]]$ builtins.complex"builtins.complex - builtins.str" builtins.strT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] + builtins.str" builtins.str. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 @@ -47148,16 +53444,10 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.str" builtins.str9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -47184,22 +53474,54 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series& -numpy.timedelta64"numpy.timedelta640:typing.overloadX2? -__and__!pandas.core.series.Series.__and__ -__and__!pandas.core.series.Series.__and__"e +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLikeD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series0:typing.overloadX28 +__rand__"pandas.core.series.Series.__rand__ +__rand__"pandas.core.series.Series.__rand__"e (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -47226,14 +53548,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* Union[builtins.bool,builtins.list[builtins.bool],builtins.list[builtins.int],TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.bool]] builtins.bool" builtins.boolM builtins.list[builtins.bool] @@ -47248,13 +53567,13 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] (numpy._typing._array_like._ScalarType_co numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_boole (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series0:typing.overloadX -__and__!pandas.core.series.Series.__and__"b + builtins.bool" builtins.bool"pandas.core.series.Series0:typing.overloadX +__rand__"pandas.core.series.Series.__rand__"b 'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -47281,14 +53600,11 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* Union[builtins.int,TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.int]] builtins.int" builtins.int ^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] @@ -47299,13 +53615,13 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] (numpy._typing._array_like._ScalarType_co numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray" pandas._typing.np_ndarray_anyintb 'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series0:typing.overloadX2> -__mul__!pandas.core.series.Series.__mul__ -__mul__!pandas.core.series.Series.__mul__"H -"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas.core.series.Series0:typing.overloadX2] +__rmul__"pandas.core.series.Series.__rmul__ +__rmul__"pandas.core.series.Series.__rmul__"H +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -47332,24 +53648,22 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -dUnion[pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.series.TimedeltaSeries,numpy.timedelta64]T +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +wUnion[datetime.timedelta,pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.series.TimedeltaSeries,numpy.timedelta64]( +datetime.timedelta"datetime.timedeltaT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.TimedeltaH "pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries& -numpy.timedelta64"numpy.timedelta640:typing.overloadX$ -__mul__!pandas.core.series.Series.__mul__"D +numpy.timedelta64"numpy.timedelta640:typing.overloadXE +__rmul__"pandas.core.series.Series.__rmul__"D pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -47376,18 +53690,15 @@ dUnion[pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.series.TimedeltaSeri builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*  -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[Any]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*11 +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[Any]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 @@ -47398,22 +53709,10 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.str" builtins.str9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLikeD -pandas.core.series.Series[Any] -Any"pandas.core.series.Series0:typing.overloadX2? -__or__ pandas.core.series.Series.__or__ -__or__ pandas.core.series.Series.__or__"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -47440,35 +53739,14 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -Union[builtins.bool,builtins.list[builtins.bool],builtins.list[builtins.int],TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.bool]] - builtins.bool" builtins.boolM -builtins.list[builtins.bool] - builtins.bool" builtins.bool" builtins.listJ -builtins.list[builtins.int] - builtins.int" builtins.int" builtins.list -^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] -STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] -Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] -Any -5numpy.dtype[numpy._typing._array_like._ScalarType_co][ -(numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_boole -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series0:typing.overloadX -__or__ pandas.core.series.Series.__or__"b -'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -47492,35 +53770,23 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] Type[builtins.bool] builtins.bool" builtins.bool"typeC Type[builtins.object]" -builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -Union[builtins.int,TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.int]] - builtins.int" builtins.int -^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] -STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] -Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] -Any -5numpy.dtype[numpy._typing._array_like._ScalarType_co][ -(numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray" pandas._typing.np_ndarray_anyintb -'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series0:typing.overloadX2? -__rand__"pandas.core.series.Series.__rand__ -__rand__"pandas.core.series.Series.__rand__"e +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLikeD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series0:typing.overloadX28 +__ror__!pandas.core.series.Series.__ror__ +__ror__!pandas.core.series.Series.__ror__"e (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -47547,14 +53813,11 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* Union[builtins.bool,builtins.list[builtins.bool],builtins.list[builtins.int],TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.bool]] builtins.bool" builtins.boolM builtins.list[builtins.bool] @@ -47569,13 +53832,13 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] (numpy._typing._array_like._ScalarType_co numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_boole (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series0:typing.overloadX -__rand__"pandas.core.series.Series.__rand__"b + builtins.bool" builtins.bool"pandas.core.series.Series0:typing.overloadX +__ror__!pandas.core.series.Series.__ror__"b 'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -47602,14 +53865,11 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* Union[builtins.int,TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.int]] builtins.int" builtins.int ^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] @@ -47620,14 +53880,14 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] (numpy._typing._array_like._ScalarType_co numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray" pandas._typing.np_ndarray_anyintb 'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series0:typing.overloadX2? -__ror__!pandas.core.series.Series.__ror__ -__ror__!pandas.core.series.Series.__ror__"e + builtins.int" builtins.int"pandas.core.series.Series0:typing.overloadX28 +__rxor__"pandas.core.series.Series.__rxor__ +__rxor__"pandas.core.series.Series.__rxor__"e (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -47654,14 +53914,11 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* Union[builtins.bool,builtins.list[builtins.bool],builtins.list[builtins.int],TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.bool]] builtins.bool" builtins.boolM builtins.list[builtins.bool] @@ -47676,13 +53933,13 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] (numpy._typing._array_like._ScalarType_co numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_boole (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series0:typing.overloadX -__ror__!pandas.core.series.Series.__ror__"b + builtins.bool" builtins.bool"pandas.core.series.Series0:typing.overloadX +__rxor__"pandas.core.series.Series.__rxor__"b 'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -47709,14 +53966,11 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* Union[builtins.int,TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.int]] builtins.int" builtins.int ^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] @@ -47727,14 +53981,31 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] (numpy._typing._array_like._ScalarType_co numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray" pandas._typing.np_ndarray_anyintb 'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series0:typing.overloadX2S - __rtruediv__&pandas.core.series.Series.__rtruediv__ - __rtruediv__&pandas.core.series.Series.__rtruediv__"h -)pandas.core.series.Series[builtins.float] -builtins.float"builtins.float"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas.core.series.Series0:typing.overloadX2i +__sub__!pandas.core.series.Series.__sub__ +__sub__!pandas.core.series.Series.__sub__"H +"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries* +Cpandas.core.series.Series[pandas._libs.tslibs.timestamps.Timestamp]T +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"pandas.core.series.Series* +Union[pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.series.TimedeltaSeries,pandas.core.indexes.timedeltas.TimedeltaIndex,numpy.timedelta64]T +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.TimedeltaH +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex& +numpy.timedelta64"numpy.timedelta640:typing.overloadX +__sub__!pandas.core.series.Series.__sub__"H +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* +Cpandas.core.series.Series[pandas._libs.tslibs.timedeltas.Timedelta]T +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas.core.series.Series* +Union[pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.series.TimedeltaSeries,pandas.core.indexes.timedeltas.TimedeltaIndex,numpy.timedelta64]T +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.TimedeltaH +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex& +numpy.timedelta64"numpy.timedelta640:typing.overloadX +__sub__!pandas.core.series.Series.__sub__"H +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -47761,21 +54032,21 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*JH -"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries0:typing.overloadX: - __rtruediv__&pandas.core.series.Series.__rtruediv__"D +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +dUnion[pandas._libs.tslibs.timestamps.Timestamp,datetime.datetime,pandas.core.series.TimestampSeries]T +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp& +datetime.datetime"datetime.datetimeH +"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries0:typing.overloadXE +__sub__!pandas.core.series.Series.__sub__"D pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -47802,18 +54073,15 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*"" -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[pandas._typing.S1]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*11 +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[Any]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 @@ -47824,16 +54092,10 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.str" builtins.str9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLike -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -47860,21 +54122,54 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series0:typing.overloadX2? -__rxor__"pandas.core.series.Series.__rxor__ -__rxor__"pandas.core.series.Series.__rxor__"e +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLikeD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series0:typing.overloadX28 +__xor__!pandas.core.series.Series.__xor__ +__xor__!pandas.core.series.Series.__xor__"e (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -47901,14 +54196,11 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* Union[builtins.bool,builtins.list[builtins.bool],builtins.list[builtins.int],TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.bool]] builtins.bool" builtins.boolM builtins.list[builtins.bool] @@ -47923,13 +54215,13 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] (numpy._typing._array_like._ScalarType_co numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_boole (pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series0:typing.overloadX -__rxor__"pandas.core.series.Series.__rxor__"b + builtins.bool" builtins.bool"pandas.core.series.Series0:typing.overloadX +__xor__!pandas.core.series.Series.__xor__"b 'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas.core.series.Series* +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -47956,14 +54248,11 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* Union[builtins.int,TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.int]] builtins.int" builtins.int ^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] @@ -47974,31 +54263,14 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] (numpy._typing._array_like._ScalarType_co numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray" pandas._typing.np_ndarray_anyintb 'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series0:typing.overloadX2K -__sub__!pandas.core.series.Series.__sub__ -__sub__!pandas.core.series.Series.__sub__"H -"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries* -Cpandas.core.series.Series[pandas._libs.tslibs.timestamps.Timestamp]T -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"pandas.core.series.Series* -Union[pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.series.TimedeltaSeries,pandas.core.indexes.timedeltas.TimedeltaIndex,numpy.timedelta64]T -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.TimedeltaH -"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex& -numpy.timedelta64"numpy.timedelta640:typing.overloadX -__sub__!pandas.core.series.Series.__sub__"H -"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* -Cpandas.core.series.Series[pandas._libs.tslibs.timedeltas.Timedelta]T -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas.core.series.Series* -Union[pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.series.TimedeltaSeries,pandas.core.indexes.timedeltas.TimedeltaIndex,numpy.timedelta64]T -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.TimedeltaH -"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex& -numpy.timedelta64"numpy.timedelta640:typing.overloadX -__sub__!pandas.core.series.Series.__sub__"H -"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.int" builtins.int"pandas.core.series.Series0:typing.overloadX2i +mulpandas.core.series.Series.mul +mulpandas.core.series.Series.mul"H +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -48025,24 +54297,45 @@ Cpandas.core.series.Series[pandas._libs.tslibs.timedeltas.Timedelta]T builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -dUnion[pandas._libs.tslibs.timestamps.Timestamp,datetime.datetime,pandas.core.series.TimestampSeries]T -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp& -datetime.datetime"datetime.datetimeH -"pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries0:typing.overloadX$ -__sub__!pandas.core.series.Series.__sub__"D +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +other +wUnion[datetime.timedelta,pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.series.TimedeltaSeries,numpy.timedelta64]( +datetime.timedelta"datetime.timedeltaT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.TimedeltaH +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries& +numpy.timedelta64"numpy.timedelta64* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None 0:typing.overloadXK +mulpandas.core.series.Series.mul"D pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -48069,18 +54362,16 @@ dUnion[pandas._libs.tslibs.timestamps.Timestamp,datetime.datetime,pandas.core.se builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series*  -Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]],pandas.core.series.Series[Any]]$ -builtins.complex"builtins.complex -TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]]] -Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],builtins.list[Any],builtins.tuple[Any],pandas.core.indexes.base.Index[Any]] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*1 +other1 +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[Any]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 @@ -48091,22 +54382,10 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.str" builtins.str9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray" builtins.dict, -builtins.list[Any] -Any" builtins.list. -builtins.tuple[Any] -Any"builtins.tupleN -#pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index"#pandas.core.series.Series._ListLikeD -pandas.core.series.Series[Any] -Any"pandas.core.series.Series0:typing.overloadX2? -__xor__!pandas.core.series.Series.__xor__ -__xor__!pandas.core.series.Series.__xor__"e -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -48133,35 +54412,14 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -Union[builtins.bool,builtins.list[builtins.bool],builtins.list[builtins.int],TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.bool]] - builtins.bool" builtins.boolM -builtins.list[builtins.bool] - builtins.bool" builtins.bool" builtins.listJ -builtins.list[builtins.int] - builtins.int" builtins.int" builtins.list -^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] -STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] -Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] -Any -5numpy.dtype[numpy._typing._array_like._ScalarType_co][ -(numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray"pandas._typing.np_ndarray_boole -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series0:typing.overloadX -__xor__!pandas.core.series.Series.__xor__"b -'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series* -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -48188,34 +54446,41 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -Union[builtins.int,TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]],pandas.core.series.Series[builtins.int]] - builtins.int" builtins.int -^TypeAlias[TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]]] -STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] -Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] -Any -5numpy.dtype[numpy._typing._array_like._ScalarType_co][ -(numpy._typing._array_like._ScalarType_co - numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArray" pandas._typing.np_ndarray_anyintb -'pandas.core.series.Series[builtins.int] - builtins.int" builtins.int"pandas.core.series.Series0:typing.overloadX2P -rolling!pandas.core.series.Series.rolling' -rolling!pandas.core.series.Series.rolling" -Apandas.core.window.rolling.Window[pandas.core.series.Series[Any]]D +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLikeD pandas.core.series.Series[Any] -Any"pandas.core.series.Series"!pandas.core.window.rolling.Window* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any"pandas.core.series.Series* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None 0:typing.overloadX2g +rmulpandas.core.series.Series.rmul +rmulpandas.core.series.Series.rmul"H +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -48242,30 +54507,28 @@ Apandas.core.window.rolling.Window[pandas.core.series.Series[Any]]D builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* -window -{Union[builtins.int,builtins.str,datetime.timedelta,pandas._libs.tslibs.offsets.BaseOffset,pandas.core.indexers.BaseIndexer] - builtins.int" builtins.int - builtins.str" builtins.str( -datetime.timedelta"datetime.timedeltaP -&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffsetD - pandas.core.indexers.BaseIndexer" pandas.core.indexers.BaseIndexer*W - min_periodsD -Union[builtins.int,None] - builtins.int" builtins.int -None *, -center - builtins.bool" builtins.bool *N -onD -Union[builtins.str,None] - builtins.str" builtins.str +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +other +wUnion[datetime.timedelta,pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.series.TimedeltaSeries,numpy.timedelta64]( +datetime.timedelta"datetime.timedeltaT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.TimedeltaH +"pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries& +numpy.timedelta64"numpy.timedelta64* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float None * axis =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] @@ -48273,41 +54536,159 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex * -closed -uUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] -iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"!pandas._typing.IntervalClosedType -None *P -stepD -Union[builtins.int,None] - builtins.int" builtins.int -None * -method -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 + builtins.int" builtins.int"pandas._typing.AxisIndex 0:typing.overloadXJ +rmulpandas.core.series.Series.rmul"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series*1 +other1 +Union[builtins.complex,TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]],pandas.core.series.Series[Any]]$ +builtins.complex"builtins.complex. +TypeAlias[Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]]], +Union[TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],builtins.dict[builtins.str,numpy.ndarray[Any,Any]],typing.Sequence[pandas._typing.S1],pandas.core.base.IndexOpsMixin[pandas._typing.S1]] +OTypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]] +DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.ArrayLike +2builtins.dict[builtins.str,numpy.ndarray[Any,Any]] + builtins.str" builtins.str9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray" builtins.dict +"typing.Sequence[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"typing.Sequence +1pandas.core.base.IndexOpsMixin[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool + builtins.int" builtins.int +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.base.IndexOpsMixin"pandas.core.series._ListLikeD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series* +level +:Union[TypeAlias[Union[typing.Hashable,builtins.int]],None] +.TypeAlias[Union[typing.Hashable,builtins.int]]i +#Union[typing.Hashable,builtins.int]" +typing.Hashable"typing.Hashable + builtins.int" builtins.int"pandas._typing.Level +None *\ + +fill_valueJ +Union[builtins.float,None] +builtins.float"builtins.float +None * +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.CalculationMethod ** -win_type - builtins.str" builtins.str0:typing.overloadX' -rolling!pandas.core.series.Series.rolling" -Bpandas.core.window.rolling.Rolling[pandas.core.series.Series[Any]]D +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex 0:typing.overloadX2D +rolling!pandas.core.series.Series.rolling" +rolling!pandas.core.series.Series.rolling" +Apandas.core.window.rolling.Window[pandas.core.series.Series[Any]]D pandas.core.series.Series[Any] -Any"pandas.core.series.Series""pandas.core.window.rolling.Rolling* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +Any"pandas.core.series.Series"!pandas.core.window.rolling.Window* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -48334,14 +54715,11 @@ Bpandas.core.window.rolling.Rolling[pandas.core.series.Series[Any]]D builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* window {Union[builtins.int,builtins.str,datetime.timedelta,pandas._libs.tslibs.offsets.BaseOffset,pandas.core.indexers.BaseIndexer] builtins.int" builtins.int @@ -48358,14 +54736,7 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand onD Union[builtins.str,None] builtins.str" builtins.str -None * -axis -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex * +None * closed uUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] @@ -48389,66 +54760,17 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.CalculationMethod * -win_type -None 0:typing.overloadX2> -sumpandas.core.series.Series.sum -sumpandas.core.series.Series.sum" -Any*X -selfN -#pandas.core.series.Series[NoReturn] -NoReturn -"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *U -skipnaG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None * -level -None *2 - numeric_only - builtins.bool" builtins.bool *- - min_count - builtins.int" builtins.int * -kwargs -Any0:typing.overloadX -sumpandas.core.series.Series.sum" - builtins.int" builtins.int*o -selfe -(pandas.core.series.Series[builtins.bool] - builtins.bool" builtins.bool"pandas.core.series.Series* -axis -IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] -2Union[Literal[builtins.str],Literal[builtins.int]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex -None *U -skipnaG -Union[builtins.bool,None] - builtins.bool" builtins.bool -None * -level -None *2 - numeric_only - builtins.bool" builtins.bool *- - min_count - builtins.int" builtins.int * -kwargs -Any0:typing.overloadX2 -sumpandas.core.series.Series.sum" -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.str" builtins.str" pandas._typing.CalculationMethod ** +win_type + builtins.str" builtins.str0:typing.overloadX" +rolling!pandas.core.series.Series.rolling" +Bpandas.core.window.rolling.Rolling[pandas.core.series.Series[Any]]D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series""pandas.core.window.rolling.Rolling* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -48475,18 +54797,111 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* +window +{Union[builtins.int,builtins.str,datetime.timedelta,pandas._libs.tslibs.offsets.BaseOffset,pandas.core.indexers.BaseIndexer] + builtins.int" builtins.int + builtins.str" builtins.str( +datetime.timedelta"datetime.timedeltaP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffsetD + pandas.core.indexers.BaseIndexer" pandas.core.indexers.BaseIndexer*W + min_periodsD +Union[builtins.int,None] + builtins.int" builtins.int +None *, +center + builtins.bool" builtins.bool *N +onD +Union[builtins.str,None] + builtins.str" builtins.str +None * +closed +uUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"!pandas._typing.IntervalClosedType +None *P +stepD +Union[builtins.int,None] + builtins.int" builtins.int +None * +method +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str" pandas._typing.CalculationMethod * +win_type +None 0:typing.overloadX27 +sumpandas.core.series.Series.sum +sumpandas.core.series.Series.sum" +Any*X +selfN +#pandas.core.series.Series[NoReturn] +NoReturn +"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *U +skipnaG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None * +level +None *2 + numeric_only + builtins.bool" builtins.bool *- + min_count + builtins.int" builtins.int * +kwargs +Any0:typing.overloadX +sumpandas.core.series.Series.sum" + builtins.int" builtins.int*o +selfe +(pandas.core.series.Series[builtins.bool] + builtins.bool" builtins.bool"pandas.core.series.Series* +axis +IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +None *U +skipnaG +Union[builtins.bool,None] + builtins.bool" builtins.bool +None * +level +None *2 + numeric_only + builtins.bool" builtins.bool *- + min_count + builtins.int" builtins.int * +kwargs +Any0:typing.overloadX+ +sumpandas.core.series.Series.sum" +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -48513,14 +54928,46 @@ tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pand builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* axis IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] @@ -48541,14 +54988,14 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] min_count builtins.int" builtins.int * kwargs -Any0:typing.overloadX2΢ - rename_axis%pandas.core.series.Series.rename_axisP +Any0:typing.overloadX2 + rename_axis%pandas.core.series.Series.rename_axisM rename_axis%pandas.core.series.Series.rename_axis" -None* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] +None* +self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -48575,14 +55022,11 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series* mapper Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._typing.ListLike] TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] @@ -48674,14 +55118,12 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.bool" builtins.bool *G inplace: Literal[builtins.bool]  - builtins.bool" builtins.bool0:typing.overloadXQ - rename_axis%pandas.core.series.Series.rename_axis"D -pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -self -,pandas.core.series.Series[pandas._typing.S1] -pandas._typing.S1 -Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],pandas.core.dtypes.dtypes.CategoricalDtype] + builtins.bool" builtins.bool0:typing.overloadXa + rename_axis%pandas.core.series.Series.rename_axis" +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.str builtins.bytes"builtins.bytes datetime.date" datetime.date @@ -48708,14 +55150,47 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& datetime.datetime"datetime.datetime( datetime.timedelta"datetime.timedeltaF -!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.Period -pandas._libs.interval.Interval[Union[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -tUnion[builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(* +self +pandas.core.series.Series.Self +,pandas.core.series.Series[pandas._typing.S1] +pandas._typing.S1 +Union[builtins.str,builtins.bytes,datetime.date,datetime.time,builtins.bool,builtins.int,builtins.float,builtins.complex,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],datetime.datetime,datetime.timedelta,pandas._libs.tslibs.period.Period,pandas._libs.interval.Interval[Any],pandas.core.dtypes.dtypes.CategoricalDtype,pandas._libs.tslibs.offsets.BaseOffset] + builtins.str" builtins.str +builtins.bytes"builtins.bytes + datetime.date" datetime.date + datetime.time" datetime.time + builtins.bool" builtins.bool builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._libs.interval.IntervalX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype"pandas.core.series.Series* +builtins.float"builtins.float$ +builtins.complex"builtins.complex +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype& +datetime.datetime"datetime.datetime( +datetime.timedelta"datetime.timedeltaF +!pandas._libs.tslibs.period.Period"!pandas._libs.tslibs.period.PeriodN +#pandas._libs.interval.Interval[Any] +Any"pandas._libs.interval.IntervalX +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtypeP +&pandas._libs.tslibs.offsets.BaseOffset"&pandas._libs.tslibs.offsets.BaseOffset"pandas.core.series.Series"pandas.core.series.Series(* mapper Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._typing.ListLike] TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] @@ -48830,8 +55305,8 @@ IUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],None] na_value/pandas.core.arrays.string_.StringDtype.na_value": pandas._libs.missing.NAType"pandas._libs.missing.NAType*Z selfP -&pandas.core.arrays.string_.StringDtype"&pandas.core.arrays.string_.StringDtype0:builtins.property` - Timedelta(pandas._libs.tslibs.timedeltas.Timedelta"datetime.timedelta*5 +&pandas.core.arrays.string_.StringDtype"&pandas.core.arrays.string_.StringDtype0:builtins.property` + Timedelta(pandas._libs.tslibs.timedeltas.Timedelta"datetime.timedelta*- __new__0pandas._libs.tslibs.timedeltas.Timedelta.__new__" -pandas._libs.tslibs.timedeltas.Timedelta.SelfT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta(* @@ -48845,30 +55320,10 @@ nUnion[builtins.str,builtins.int,pandas._libs.tslibs.timedeltas.Timedelta,dateti builtins.int" builtins.intT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta( datetime.timedelta"datetime.timedelta& -numpy.timedelta64"numpy.timedelta64 *# -unit# -TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 +numpy.timedelta64"numpy.timedelta64 * +unit +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -49126,7 +55581,39 @@ aUnion[Tuple[TypeAlias[Any],builtins.int],Unknown,builtins.list[Any],TypeAlias[T builtins.list[Any] Any" builtins.listM TypeAlias[TypedDict] - TypedDict "$numpy._typing._dtype_like._DTypeDict"(numpy._typing._dtype_like._VoidDTypeLike"#numpy._typing._dtype_like.DTypeLike 2+ + TypedDict "$numpy._typing._dtype_like._DTypeDict"(numpy._typing._dtype_like._VoidDTypeLike"#numpy._typing._dtype_like.DTypeLike * +unit-pandas._libs.tslibs.timedeltas.Timedelta.unit" +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.TimeUnit*^ +selfT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta0:builtins.property`* +as_unit0pandas._libs.tslibs.timedeltas.Timedelta.as_unit" +-pandas._libs.tslibs.timedeltas.Timedelta.SelfT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta(* +self +-pandas._libs.tslibs.timedeltas.Timedelta.SelfT +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta(* +unit +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.TimeUnit*. +round_ok + builtins.bool" builtins.bool 2+ __add__0pandas._libs.tslibs.timedeltas.Timedelta.__add__ __add__0pandas._libs.tslibs.timedeltas.Timedelta.__add__"T (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta*VT @@ -49290,7 +55777,7 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] mUnion[pandas.core.series.TimedeltaSeries,pandas.core.series.Series[pandas._libs.tslibs.timedeltas.Timedelta]]H "pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries Cpandas.core.series.Series[pandas._libs.tslibs.timedeltas.Timedelta]T -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas.core.series.Series0:typing.overloadX2$ +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas.core.series.Series0:typing.overloadX2$ __rsub__1pandas._libs.tslibs.timedeltas.Timedelta.__rsub__ __rsub__1pandas._libs.tslibs.timedeltas.Timedelta.__rsub__"T (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta*VT @@ -49298,11 +55785,12 @@ Cpandas.core.series.Series[pandas._libs.tslibs.timedeltas.Timedelta]T TUnion[datetime.timedelta,pandas._libs.tslibs.timedeltas.Timedelta,numpy.timedelta64]( datetime.timedelta"datetime.timedeltaT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta& -numpy.timedelta64"numpy.timedelta640:typing.overloadX +numpy.timedelta64"numpy.timedelta640:typing.overloadX __rsub__1pandas._libs.tslibs.timedeltas.Timedelta.__rsub__"T (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp*VT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta* -@Union[pandas._libs.tslibs.timestamps.Timestamp,numpy.datetime64]T +(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta* +RUnion[datetime.datetime,pandas._libs.tslibs.timestamps.Timestamp,numpy.datetime64]& +datetime.datetime"datetime.datetimeT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp$ numpy.datetime64"numpy.datetime640:typing.overloadX __rsub__1pandas._libs.tslibs.timedeltas.Timedelta.__rsub__"J @@ -49829,8 +56317,8 @@ Cpandas.core.series.Series[pandas._libs.tslibs.timedeltas.Timedelta]T resolution3pandas._libs.tslibs.timedeltas.Timedelta.resolutionT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.TimedeltarU value.pandas._libs.tslibs.timedeltas.Timedelta.value - builtins.int" builtins.intA -TimedeltaIndex-pandas.core.indexes.timedeltas.TimedeltaIndex"7pandas.core.indexes.datetimelike.DatetimeTimedeltaMixin"6pandas.core.indexes.accessors.TimedeltaIndexProperties* + builtins.int" builtins.intT +TimedeltaIndex-pandas.core.indexes.timedeltas.TimedeltaIndex"7pandas.core.indexes.datetimelike.DatetimeTimedeltaMixin"6pandas.core.indexes.accessors.TimedeltaIndexProperties* __new__5pandas.core.indexes.timedeltas.TimedeltaIndex.__new__" 2pandas.core.indexes.timedeltas.TimedeltaIndex.Self^ -pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex(* @@ -49856,23 +56344,7 @@ cUnion[datetime.timedelta,pandas._libs.tslibs.timedeltas.Timedelta,numpy.timedel datetime.timedelta"datetime.timedeltaT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta& numpy.timedelta64"numpy.timedelta64 -builtins.float"builtins.float"typing.Sequence * -unit -Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str * +builtins.float"builtins.float"typing.Sequence * freq :Union[builtins.str,pandas._libs.tslibs.offsets.BaseOffset] builtins.str" builtins.strP @@ -49885,19 +56357,21 @@ cUnion[datetime.timedelta,pandas._libs.tslibs.timedeltas.Timedelta,numpy.timedel copy builtins.bool" builtins.bool *( name - builtins.str" builtins.str * + builtins.str" builtins.str * __radd__6pandas.core.indexes.timedeltas.TimedeltaIndex.__radd__"Z +pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex*`^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex* -[Union[pandas._libs.tslibs.timestamps.Timestamp,pandas.core.indexes.datetimes.DatetimeIndex]T +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex* +mUnion[datetime.datetime,pandas._libs.tslibs.timestamps.Timestamp,pandas.core.indexes.datetimes.DatetimeIndex]& +datetime.datetime"datetime.datetimeT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampZ -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* __sub__5pandas.core.indexes.timedeltas.TimedeltaIndex.__sub__" 2pandas.core.indexes.timedeltas.TimedeltaIndex.Self^ -pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex(* 2pandas.core.indexes.timedeltas.TimedeltaIndex.Self^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex(* -bUnion[pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.indexes.timedeltas.TimedeltaIndex.Self]T +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex(* +uUnion[datetime.timedelta,pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.indexes.timedeltas.TimedeltaIndex.Self]( +datetime.timedelta"datetime.timedeltaT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta 2pandas.core.indexes.timedeltas.TimedeltaIndex.Self^ -pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex(* @@ -49906,13 +56380,23 @@ bUnion[pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.indexes.timedeltas.T -pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex(* 2pandas.core.indexes.timedeltas.TimedeltaIndex.Self^ -pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex(*&$ -builtins.complex"builtins.complex* - __truediv__9pandas.core.indexes.timedeltas.TimedeltaIndex.__truediv__" -2pandas.core.indexes.timedeltas.TimedeltaIndex.Self^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex(* -2pandas.core.indexes.timedeltas.TimedeltaIndex.Self^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex(*&$ -builtins.complex"builtins.complex* +builtins.complex"builtins.complex* + __rtruediv__:pandas.core.indexes.timedeltas.TimedeltaIndex.__rtruediv__"r +.pandas.core.indexes.base.Index[builtins.float] +builtins.float"builtins.float"pandas.core.indexes.base.Index*`^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex* +=Union[datetime.timedelta,typing.Sequence[datetime.timedelta]]( +datetime.timedelta"datetime.timedelta` +#typing.Sequence[datetime.timedelta]( +datetime.timedelta"datetime.timedelta"typing.Sequence* + __rfloordiv__;pandas.core.indexes.timedeltas.TimedeltaIndex.__rfloordiv__"l +,pandas.core.indexes.base.Index[builtins.int] + builtins.int" builtins.int"pandas.core.indexes.base.Index*`^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex* +=Union[datetime.timedelta,typing.Sequence[datetime.timedelta]]( +datetime.timedelta"datetime.timedelta` +#typing.Sequence[datetime.timedelta]( +datetime.timedelta"datetime.timedelta"typing.Sequence* astype4pandas.core.indexes.timedeltas.TimedeltaIndex.astype" Any*h self^ @@ -49920,16 +56404,7 @@ bUnion[pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.indexes.timedeltas.T dtype Any** copy - builtins.bool" builtins.bool *c - get_value7pandas.core.indexes.timedeltas.TimedeltaIndex.get_value* -self* - -series* -key*d -get_loc5pandas.core.indexes.timedeltas.TimedeltaIndex.get_loc* -self* -key* - tolerance * + builtins.bool" builtins.bool * searchsorted:pandas.core.indexes.timedeltas.TimedeltaIndex.searchsorted" Any*h self^ @@ -49955,7 +56430,7 @@ bUnion[pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.indexes.timedeltas.T index Any * name -Any 2 +Any 2 __add__5pandas.core.indexes.timedeltas.TimedeltaIndex.__add__ __add__5pandas.core.indexes.timedeltas.TimedeltaIndex.__add__"P &pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex*`^ @@ -49964,16 +56439,55 @@ bUnion[pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.indexes.timedeltas.T __add__5pandas.core.indexes.timedeltas.TimedeltaIndex.__add__"Z +pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex*`^ -pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex*\Z -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex0:typing.overloadX ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex0:typing.overloadX __add__5pandas.core.indexes.timedeltas.TimedeltaIndex.__add__" 2pandas.core.indexes.timedeltas.TimedeltaIndex.Self^ -pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex(* 2pandas.core.indexes.timedeltas.TimedeltaIndex.Self^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex(* -bUnion[pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.indexes.timedeltas.TimedeltaIndex.Self]T +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex(* +uUnion[datetime.timedelta,pandas._libs.tslibs.timedeltas.Timedelta,pandas.core.indexes.timedeltas.TimedeltaIndex.Self]( +datetime.timedelta"datetime.timedeltaT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta 2pandas.core.indexes.timedeltas.TimedeltaIndex.Self^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex(0:typing.overloadXю +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex(0:typing.overloadX2 + + __truediv__9pandas.core.indexes.timedeltas.TimedeltaIndex.__truediv__ + __truediv__9pandas.core.indexes.timedeltas.TimedeltaIndex.__truediv__" +2pandas.core.indexes.timedeltas.TimedeltaIndex.Self^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex(* +2pandas.core.indexes.timedeltas.TimedeltaIndex.Self^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex(* +7Union[builtins.complex,typing.Sequence[builtins.float]]$ +builtins.complex"builtins.complexT +typing.Sequence[builtins.float] +builtins.float"builtins.float"typing.Sequence0:typing.overloadX + __truediv__9pandas.core.indexes.timedeltas.TimedeltaIndex.__truediv__"r +.pandas.core.indexes.base.Index[builtins.float] +builtins.float"builtins.float"pandas.core.indexes.base.Index*`^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex* +=Union[datetime.timedelta,typing.Sequence[datetime.timedelta]]( +datetime.timedelta"datetime.timedelta` +#typing.Sequence[datetime.timedelta]( +datetime.timedelta"datetime.timedelta"typing.Sequence0:typing.overloadX2 + + __floordiv__:pandas.core.indexes.timedeltas.TimedeltaIndex.__floordiv__ + __floordiv__:pandas.core.indexes.timedeltas.TimedeltaIndex.__floordiv__" +2pandas.core.indexes.timedeltas.TimedeltaIndex.Self^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex(* +2pandas.core.indexes.timedeltas.TimedeltaIndex.Self^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex(* +7Union[builtins.complex,typing.Sequence[builtins.float]]$ +builtins.complex"builtins.complexT +typing.Sequence[builtins.float] +builtins.float"builtins.float"typing.Sequence0:typing.overloadX + __floordiv__:pandas.core.indexes.timedeltas.TimedeltaIndex.__floordiv__"l +,pandas.core.indexes.base.Index[builtins.int] + builtins.int" builtins.int"pandas.core.indexes.base.Index*`^ +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex* +=Union[datetime.timedelta,typing.Sequence[datetime.timedelta]]( +datetime.timedelta"datetime.timedelta` +#typing.Sequence[datetime.timedelta]( +datetime.timedelta"datetime.timedelta"typing.Sequence0:typing.overloadX Timestamp(pandas._libs.tslibs.timestamps.Timestamp"datetime.datetime* __new__0pandas._libs.tslibs.timestamps.Timestamp.__new__" -pandas._libs.tslibs.timestamps.Timestamp.SelfT @@ -50170,12 +56684,14 @@ nanosecond3pandas._libs.tslibs.timestamps.Timestamp.nanosecond" cls 3Type[pandas._libs.tslibs.timestamps.Timestamp.Self] -pandas._libs.tslibs.timestamps.Timestamp.SelfT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp("type0:builtins.classmethodp* -combine0pandas._libs.tslibs.timestamps.Timestamp.combine"& -datetime.datetime"datetime.datetime* -cls -.Type[pandas._libs.tslibs.timestamps.Timestamp]T -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"type*( +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp("type0:builtins.classmethodp* +combine0pandas._libs.tslibs.timestamps.Timestamp.combine" +-pandas._libs.tslibs.timestamps.Timestamp.SelfT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp(* +cls +3Type[pandas._libs.tslibs.timestamps.Timestamp.Self] +-pandas._libs.tslibs.timestamps.Timestamp.SelfT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp("type*( date datetime.date" datetime.date*( time @@ -50358,13 +56874,9 @@ astimezone3pandas._libs.tslibs.timestamps.Timestamp.astimezone" isoweekday3pandas._libs.tslibs.timestamps.Timestamp.isoweekday" builtins.int" builtins.int*^ selfT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp* - isocalendar4pandas._libs.tslibs.timestamps.Timestamp.isocalendar" -8TypeAlias[Tuple[builtins.int,builtins.int,builtins.int]] --Tuple[builtins.int,builtins.int,builtins.int] - builtins.int" builtins.int - builtins.int" builtins.int - builtins.int" builtins.int"/pandas._libs.tslibs.timestamps._IsoCalendarDate*^ +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp* + isocalendar4pandas._libs.tslibs.timestamps.Timestamp.isocalendar" +Any*^ selfT (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp* is_leap_year5pandas._libs.tslibs.timestamps.Timestamp.is_leap_year" @@ -50618,7 +57130,39 @@ weekofyear3pandas._libs.tslibs.timestamps.Timestamp.weekofyear" daysinmonth4pandas._libs.tslibs.timestamps.Timestamp.daysinmonth" builtins.int" builtins.int*^ selfT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp0:builtins.property`2 +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp0:builtins.property`* +unit-pandas._libs.tslibs.timestamps.Timestamp.unit" +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.TimeUnit*^ +selfT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp0:builtins.property`* +as_unit0pandas._libs.tslibs.timestamps.Timestamp.as_unit" +-pandas._libs.tslibs.timestamps.Timestamp.SelfT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp(* +self +-pandas._libs.tslibs.timestamps.Timestamp.SelfT +(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp(* +unit +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.TimeUnit*. +round_ok + builtins.bool" builtins.bool 2 __le__/pandas._libs.tslibs.timestamps.Timestamp.__le__ __le__/pandas._libs.tslibs.timestamps.Timestamp.__le__" builtins.bool" builtins.bool*VT @@ -51037,7 +57581,7 @@ $pandas._config.config.option_context"$pandas._config.config.option_context* __exit__-pandas._config.config.option_context.__exit__" None*NL $pandas._config.config.option_context"$pandas._config.config.option_context*&" -builtins.object"builtins.object +builtins.object"builtins.object ExcelFilepandas.io.excel._base.ExcelFile"builtins.object* __init__(pandas.io.excel._base.ExcelFile.__init__" @@ -51114,8 +57658,8 @@ $pandas.io.excel._base.ExcelFile.SelfB None* __del__'pandas.io.excel._base.ExcelFile.__del__" None*DB -pandas.io.excel._base.ExcelFile"pandas.io.excel._base.ExcelFile2d -parse%pandas.io.excel._base.ExcelFile.parse3 +pandas.io.excel._base.ExcelFile"pandas.io.excel._base.ExcelFile2e +parse%pandas.io.excel._base.ExcelFile.parse3 parse%pandas.io.excel._base.ExcelFile.parse" Kbuiltins.dict[Union[builtins.int,builtins.str],pandas.core.frame.DataFrame]` Union[builtins.int,builtins.str] @@ -51158,27 +57702,24 @@ sheet_name builtins.int" builtins.intN typing.Sequence[builtins.int] builtins.int" builtins.int"typing.Sequence -None * - -usecols - -Union[builtins.str,TypeAlias[Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]]] - builtins.str" builtins.str -TypeAlias[Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]] -Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]\ -$typing.MutableSequence[builtins.str] - builtins.str" builtins.str"typing.MutableSequenceL -builtins.tuple[builtins.str] - builtins.str" builtins.str"builtins.tupleN -typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.SequenceD -pandas.core.series.Series[Any] -Any"pandas.core.series.SeriesN +None * +usecols +Union[builtins.str,TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]]] + builtins.str" builtins.str +TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]] +Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]s +.pandas._typing.SequenceNotStr[typing.Hashable]" +typing.Hashable"typing.Hashable"pandas._typing.SequenceNotStr +builtins.range"builtins.range +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index9 +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarrayK +Any" numpy.ndarray"pandas._typing.AnyArrayLikeK CallableType[builtins.function]& builtins.function"builtins.function None"pandas._typing.UsecolsArgType * @@ -51263,7 +57804,7 @@ skipfooter na_filter builtins.bool" builtins.bool * kwds -Any0:typing.overloadX0 +Any0:typing.overloadX1 parse%pandas.io.excel._base.ExcelFile.parse": pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*L selfB @@ -51299,27 +57840,24 @@ sheet_name` builtins.int" builtins.intN typing.Sequence[builtins.int] builtins.int" builtins.int"typing.Sequence -None * - -usecols - -Union[builtins.str,TypeAlias[Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]]] - builtins.str" builtins.str -TypeAlias[Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]] -Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]\ -$typing.MutableSequence[builtins.str] - builtins.str" builtins.str"typing.MutableSequenceL -builtins.tuple[builtins.str] - builtins.str" builtins.str"builtins.tupleN -typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.SequenceD -pandas.core.series.Series[Any] -Any"pandas.core.series.SeriesN +None * +usecols +Union[builtins.str,TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]]] + builtins.str" builtins.str +TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]] +Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]s +.pandas._typing.SequenceNotStr[typing.Hashable]" +typing.Hashable"typing.Hashable"pandas._typing.SequenceNotStr +builtins.range"builtins.range +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index9 +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarrayK +Any" numpy.ndarray"pandas._typing.AnyArrayLikeK CallableType[builtins.function]& builtins.function"builtins.function None"pandas._typing.UsecolsArgType * @@ -51416,8 +57954,8 @@ xUnion[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.R builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathh )pandas._typing.ReadBuffer[builtins.bytes] builtins.bytes"builtins.bytes"pandas._typing.ReadBuffer -builtins.bytes"builtins.bytes* - ExcelWriter!pandas.io.excel._base.ExcelWriter"builtins.object* +builtins.bytes"builtins.bytes- + ExcelWriter!pandas.io.excel._base.ExcelWriter"builtins.object* __init__*pandas.io.excel._base.ExcelWriter.__init__" None*P selfF @@ -51430,15 +57968,17 @@ xUnion[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.R os.PathLike[builtins.str] builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathB pandas._typing.WriteExcelBuffer"pandas._typing.WriteExcelBufferF -!pandas.io.excel._base.ExcelWriter"!pandas.io.excel._base.ExcelWriter* -engine -cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]7 +!pandas.io.excel._base.ExcelWriter"!pandas.io.excel._base.ExcelWriter* +engine +uUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],Literal[builtins.str],None] +STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str7 + builtins.str" builtins.str"pandas._typing.ExcelWriteEngine7 Literal[builtins.str]  builtins.str" builtins.str None *W @@ -51484,15 +58024,16 @@ cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal builtins.tuple[builtins.str] builtins.str" builtins.str"builtins.tuple*P selfF -!pandas.io.excel._base.ExcelWriter"!pandas.io.excel._base.ExcelWriter0:builtins.property`* -engine(pandas.io.excel._base.ExcelWriter.engine" +!pandas.io.excel._base.ExcelWriter"!pandas.io.excel._base.ExcelWriter0:builtins.property`* +engine(pandas.io.excel._base.ExcelWriter.engine" +STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str*P + builtins.str" builtins.str"pandas._typing.ExcelWriteEngine*P selfF !pandas.io.excel._base.ExcelWriter"!pandas.io.excel._base.ExcelWriter0:builtins.property`* sheets(pandas.io.excel._base.ExcelWriter.sheets"W @@ -52023,7 +58564,7 @@ PUnion[builtins.str,numpy.dtype[Any],pandas.core.dtypes.base.ExtensionDtype,None &pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype None ** copy - builtins.bool" builtins.bool  + builtins.bool" builtins.bool  date_range(pandas.core.indexes.datetimes.date_range"Z +pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* @@ -52081,9 +58622,11 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"!pandas._typing.IntervalClosedType * -unit -cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]7 + builtins.str" builtins.str"!pandas._typing.IntervalClosedType * +unit +uUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -52091,7 +58634,7 @@ cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str + builtins.str" builtins.str"pandas._typing.TimeUnit None  period_range'pandas.core.indexes.period.period_range"P @@ -52406,7 +58949,7 @@ value_name" builtins.str" builtins.str None *2 ignore_index - builtins.bool" builtins.bool / + builtins.bool" builtins.bool . mergepandas.core.reshape.merge.merge": pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* left @@ -52512,9 +59055,7 @@ left_index builtins.str" builtins.strD Tuple[builtins.str,None] builtins.str" builtins.str -None ** -copy - builtins.bool" builtins.bool *t +None *t indicatorc !Union[builtins.bool,builtins.str] builtins.bool" builtins.bool @@ -52537,7 +59078,7 @@ left_index Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.ValidationOptions  + builtins.str" builtins.str" pandas._typing.ValidationOptions  merge_asof$pandas.core.reshape.merge.merge_asof": pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* @@ -52621,10 +59162,11 @@ ZUnion[TypeAlias[Union[typing.Hashable,None]],builtins.list[pandas._typing.Hasha builtins.str" builtins.strD Tuple[builtins.str,None] builtins.str" builtins.str -None * - tolerance -AUnion[builtins.int,pandas._libs.tslibs.timedeltas.Timedelta,None] - builtins.int" builtins.intT +None * + tolerance +TUnion[builtins.int,datetime.timedelta,pandas._libs.tslibs.timedeltas.Timedelta,None] + builtins.int" builtins.int( +datetime.timedelta"datetime.timedeltaT (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta None *9 allow_exact_matches @@ -52837,7 +59379,7 @@ MUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None] builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str -None + +None 0 read_htmlpandas.io.html.read_html"w *builtins.list[pandas.core.frame.DataFrame]: pandas.core.frame.DataFrame"pandas.core.frame.DataFrame" builtins.list* @@ -52855,10 +59397,18 @@ gUnion[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.R builtins.str" builtins.str& re.Pattern[Any] Any" -re.Pattern *R -flavorD -Union[builtins.str,None] - builtins.str" builtins.str +re.Pattern * +flavor +xUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],typing.Sequence[Unknown],None] +STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.HTMLFlavors- +typing.Sequence[Unknown]"typing.Sequence None * header 6Union[builtins.int,typing.Sequence[builtins.int],None] @@ -52967,7 +59517,14 @@ tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],TypeAlias[L builtins.str" builtins.str"pandas._typing.DtypeBackend /TypeAlias[Literal[pandas._libs.lib._NoDefault]]d $Literal[pandas._libs.lib._NoDefault] : -pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault  +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault * +storage_options +6TypeAlias[Union[builtins.dict[builtins.str,Any],None]] ++Union[builtins.dict[builtins.str,Any],None]W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict +None"pandas._typing.StorageOptions  read_orcpandas.io.orc.read_orc": pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* path @@ -53483,8 +60040,8 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"!pandas._typing.IntervalClosedType 0:typing.overloadX" - factorize pandas.core.algorithms.factorize + builtins.str" builtins.str"!pandas._typing.IntervalClosedType 0:typing.overloadX" + factorize pandas.core.algorithms.factorize factorize pandas.core.algorithms.factorize" 4Tuple[numpy.ndarray[Any,Any],numpy.ndarray[Any,Any]]9 numpy.ndarray[Any,Any] @@ -53492,14 +60049,11 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Any" numpy.ndarray9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray* -values -3Union[typing.Sequence[Any],numpy.recarray[Any,Any]]0 -typing.Sequence[Any] -Any"typing.Sequence; -numpy.recarray[Any,Any] +Any" numpy.ndarray*E +values9 +numpy.ndarray[Any,Any] Any -Any"numpy.recarray** +Any" numpy.ndarray** sort builtins.bool" builtins.bool *5 use_na_sentinel @@ -53943,7 +60497,7 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str"!pandas._typing.IntervalClosedType 0:typing.overloadX" + builtins.str" builtins.str"!pandas._typing.IntervalClosedType 0:typing.overloadX" isnapandas.core.dtypes.missing.isna isnapandas.core.dtypes.missing.isna": pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*C @@ -53973,9 +60527,9 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray"pandas._typing.ArrayLike0:typing.overloadX -isnapandas.core.dtypes.missing.isna" - builtins.bool" builtins.bool* +Any" numpy.ndarray"pandas._typing.ArrayLike0:typing.overloadX +isnapandas.core.dtypes.missing.isna" +Any* obj Union[TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]],pandas._libs.tslibs.nattype.NaTType,pandas._libs.missing.NAType,None] TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] @@ -53998,7 +60552,7 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.complex"builtins.complex"pandas._typing.ScalarJ #pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType: pandas._libs.missing.NAType"pandas._libs.missing.NAType -None0:typing.overloadX" +None0:typing.overloadX" notna pandas.core.dtypes.missing.notna notna pandas.core.dtypes.missing.notna": pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*C @@ -54028,9 +60582,9 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray"pandas._typing.ArrayLike0:typing.overloadX -notna pandas.core.dtypes.missing.notna" - builtins.bool" builtins.bool* +Any" numpy.ndarray"pandas._typing.ArrayLike0:typing.overloadX +notna pandas.core.dtypes.missing.notna" +Any* obj bUnion[pandas._typing.ScalarT,pandas._libs.tslibs.nattype.NaTType,pandas._libs.missing.NAType,None] pandas._typing.ScalarT @@ -54053,7 +60607,7 @@ bUnion[pandas._typing.ScalarT,pandas._libs.tslibs.nattype.NaTType,pandas._libs.m builtins.complex"builtins.complexJ #pandas._libs.tslibs.nattype.NaTType"#pandas._libs.tslibs.nattype.NaTType: pandas._libs.missing.NAType"pandas._libs.missing.NAType -None0:typing.overloadX"\ +None0:typing.overloadX"Z to_datetime'pandas.core.tools.datetimes.to_datetime to_datetime'pandas.core.tools.datetimes.to_datetime"T (pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.Timestamp* @@ -54164,7 +60718,7 @@ eUnion[TypeAlias[Union[builtins.float,builtins.str]],datetime.datetime,numpy.dat builtins.float"builtins.float builtins.str" builtins.str"(pandas._typing.TimestampConvertibleTypes *+ cache - builtins.bool" builtins.bool 0:typing.overloadX + builtins.bool" builtins.bool 0:typing.overloadX to_datetime'pandas.core.tools.datetimes.to_datetime"H "pandas.core.series.TimestampSeries""pandas.core.series.TimestampSeries* arg @@ -54175,16 +60729,14 @@ BTypeAlias[Union[TypeAlias[TypedDict],pandas.core.frame.DataFrame]] 7Union[TypeAlias[TypedDict],pandas.core.frame.DataFrame]H TypeAlias[TypedDict] TypedDict "pandas._typing.FulldatetimeDict: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame"pandas._typing.DictConvertible* -errors -STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame"pandas._typing.DictConvertible* +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.IgnoreRaiseCoerce *. + builtins.str" builtins.str"pandas._typing.RaiseCoerce *. dayfirst builtins.bool" builtins.bool */ yearfirst @@ -54221,22 +60773,24 @@ HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 builtins.float"builtins.float builtins.str" builtins.str"(pandas._typing.TimestampConvertibleTypes *+ cache - builtins.bool" builtins.bool 0:typing.overloadX + builtins.bool" builtins.bool 0:typing.overloadX to_datetime'pandas.core.tools.datetimes.to_datetime"Z -+pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* -arg -Union[typing.Sequence[Union[builtins.float,datetime.datetime]],builtins.list[builtins.str],builtins.tuple[Union[builtins.float,builtins.str,datetime.datetime]],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],Unknown,Unknown,pandas.core.indexes.base.Index[Any],pandas.core.arrays.base.ExtensionArray] -8typing.Sequence[Union[builtins.float,datetime.datetime]]u -'Union[builtins.float,datetime.datetime] -builtins.float"builtins.float& -datetime.datetime"datetime.datetime"typing.SequenceJ ++pandas.core.indexes.datetimes.DatetimeIndex"+pandas.core.indexes.datetimes.DatetimeIndex* + +arg + +Union[typing.Sequence[Union[builtins.float,datetime.date]],builtins.list[builtins.str],builtins.tuple[Union[builtins.float,builtins.str,datetime.date]],TypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]],Unknown,Unknown,pandas.core.indexes.base.Index[Any],pandas.core.arrays.base.ExtensionArray] +4typing.Sequence[Union[builtins.float,datetime.date]]i +#Union[builtins.float,datetime.date] +builtins.float"builtins.float + datetime.date" datetime.date"typing.SequenceJ builtins.list[builtins.str] - builtins.str" builtins.str" builtins.list -Dbuiltins.tuple[Union[builtins.float,builtins.str,datetime.datetime]] -4Union[builtins.float,builtins.str,datetime.datetime] + builtins.str" builtins.str" builtins.list +@builtins.tuple[Union[builtins.float,builtins.str,datetime.date]] +0Union[builtins.float,builtins.str,datetime.date] builtins.float"builtins.float - builtins.str" builtins.str& -datetime.datetime"datetime.datetime"builtins.tuple + builtins.str" builtins.str + datetime.date" datetime.date"builtins.tuple STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] Any @@ -54245,16 +60799,14 @@ Hnumpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]] numpy.generic" numpy.generic" numpy.generic" numpy.dtype" numpy.ndarray"!numpy._typing._array_like.NDArrayN #pandas.core.indexes.base.Index[Any] Any"pandas.core.indexes.base.IndexP -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray* -errors -STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray* +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.IgnoreRaiseCoerce *. + builtins.str" builtins.str"pandas._typing.RaiseCoerce *. dayfirst builtins.bool" builtins.bool */ yearfirst @@ -54291,7 +60843,7 @@ HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 builtins.float"builtins.float builtins.str" builtins.str"(pandas._typing.TimestampConvertibleTypes *+ cache - builtins.bool" builtins.bool 0:typing.overloadX"\ + builtins.bool" builtins.bool 0:typing.overloadX"5 to_numeric$pandas.core.tools.numeric.to_numeric @@ -54344,72 +60896,7 @@ tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],TypeAlias[L builtins.str" builtins.str"pandas._typing.DtypeBackend /TypeAlias[Literal[pandas._libs.lib._NoDefault]]d $Literal[pandas._libs.lib._NoDefault] : -pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadX$ - -to_numeric$pandas.core.tools.numeric.to_numeric" -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar* -arg -TypeAlias[Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex]] - -Union[TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]],builtins.complex] -TypeAlias[Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta]] -Union[builtins.str,builtins.bytes,datetime.date,datetime.datetime,datetime.timedelta,numpy.datetime64,numpy.timedelta64,builtins.bool,builtins.int,builtins.float,pandas._libs.tslibs.timestamps.Timestamp,pandas._libs.tslibs.timedeltas.Timedelta] - builtins.str" builtins.str -builtins.bytes"builtins.bytes - datetime.date" datetime.date& -datetime.datetime"datetime.datetime( -datetime.timedelta"datetime.timedelta$ -numpy.datetime64"numpy.datetime64& -numpy.timedelta64"numpy.timedelta64 - builtins.bool" builtins.bool - builtins.int" builtins.int -builtins.float"builtins.floatT -(pandas._libs.tslibs.timestamps.Timestamp"(pandas._libs.tslibs.timestamps.TimestampT -(pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta"pandas._typing.IndexIterScalar$ -builtins.complex"builtins.complex"pandas._typing.Scalar*C -errors7 -Literal[builtins.str]  - builtins.str" builtins.str* -downcast -nTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]] -cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str -None"#pandas.core.tools.numeric._Downcast * - dtype_backend -tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Literal[pandas._libs.lib._NoDefault]]] -=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] -2Union[Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str"pandas._typing.DtypeBackend -/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d -$Literal[pandas._libs.lib._NoDefault] : -pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadX +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadX to_numeric$pandas.core.tools.numeric.to_numeric" STypeAlias[numpy.ndarray[Any,numpy.dtype[numpy._typing._array_like._ScalarType_co]]] @@ -54426,16 +60913,14 @@ DUnion[builtins.list[Any],builtins.tuple[Any],numpy.ndarray[Any,Any]], Any"builtins.tuple9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray* -errors -STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 +Any" numpy.ndarray* +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.IgnoreRaiseCoerce * + builtins.str" builtins.str"pandas._typing.RaiseCoerce * downcast nTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]] cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]7 @@ -54458,23 +60943,21 @@ tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],TypeAlias[L builtins.str" builtins.str"pandas._typing.DtypeBackend /TypeAlias[Literal[pandas._libs.lib._NoDefault]]d $Literal[pandas._libs.lib._NoDefault] : -pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadX +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadX to_numeric$pandas.core.tools.numeric.to_numeric"D pandas.core.series.Series[Any] Any"pandas.core.series.Series*M argD pandas.core.series.Series[Any] -Any"pandas.core.series.Series* -errors -STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 +Any"pandas.core.series.Series* +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.IgnoreRaiseCoerce * + builtins.str" builtins.str"pandas._typing.RaiseCoerce * downcast nTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]] cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]7 @@ -54497,39 +60980,19 @@ tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],TypeAlias[L builtins.str" builtins.str"pandas._typing.DtypeBackend /TypeAlias[Literal[pandas._libs.lib._NoDefault]]d $Literal[pandas._libs.lib._NoDefault] : -pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadX"ϝ - to_timedelta)pandas.core.tools.timedeltas.to_timedelta1 +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadX"| + to_timedelta)pandas.core.tools.timedeltas.to_timedelta& to_timedelta)pandas.core.tools.timedeltas.to_timedelta"T (pandas._libs.tslibs.timedeltas.Timedelta"(pandas._libs.tslibs.timedeltas.Timedelta* arg 5Union[builtins.str,builtins.float,datetime.timedelta] builtins.str" builtins.str builtins.float"builtins.float( -datetime.timedelta"datetime.timedelta*+ -unit+ -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None]# -TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 +datetime.timedelta"datetime.timedelta*! +unit! +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -54598,45 +61061,23 @@ $Literal[pandas._libs.lib._NoDefault] : builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str"3pandas._libs.tslibs.timedeltas.TimeDeltaUnitChoices -None * -errors -STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 +None * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.IgnoreRaiseCoerce 0:typing.overloadX0 + builtins.str" builtins.str"pandas._typing.RaiseCoerce 0:typing.overloadX% to_timedelta)pandas.core.tools.timedeltas.to_timedelta"H "pandas.core.series.TimedeltaSeries""pandas.core.series.TimedeltaSeries*M argD pandas.core.series.Series[Any] -Any"pandas.core.series.Series*+ -unit+ -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None]# -TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 +Any"pandas.core.series.Series*! +unit! +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -54705,29 +61146,26 @@ HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str"3pandas._libs.tslibs.timedeltas.TimeDeltaUnitChoices -None * -errors -STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 +None * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.IgnoreRaiseCoerce 0:typing.overloadX; + builtins.str" builtins.str"pandas._typing.RaiseCoerce 0:typing.overloadX/ to_timedelta)pandas.core.tools.timedeltas.to_timedelta"^ --pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex* -arg -Union[typing.Sequence[Union[builtins.float,datetime.timedelta]],builtins.list[Union[builtins.str,builtins.float,datetime.timedelta]],builtins.tuple[Union[builtins.str,builtins.float,datetime.timedelta]],builtins.range,TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],pandas.core.indexes.base.Index[Any]] +-pandas.core.indexes.timedeltas.TimedeltaIndex"-pandas.core.indexes.timedeltas.TimedeltaIndex* + +arg + +Union[pandas._typing.SequenceNotStr[Any],typing.Sequence[Union[builtins.float,datetime.timedelta]],builtins.tuple[Union[builtins.str,builtins.float,datetime.timedelta]],builtins.range,TypeAlias[Union[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]],pandas.core.indexes.base.Index[Any]]L +"pandas._typing.SequenceNotStr[Any] +Any"pandas._typing.SequenceNotStr 9typing.Sequence[Union[builtins.float,datetime.timedelta]]x (Union[builtins.float,datetime.timedelta] builtins.float"builtins.float( -datetime.timedelta"datetime.timedelta"typing.Sequence -Dbuiltins.list[Union[builtins.str,builtins.float,datetime.timedelta]] -5Union[builtins.str,builtins.float,datetime.timedelta] - builtins.str" builtins.str -builtins.float"builtins.float( -datetime.timedelta"datetime.timedelta" builtins.list +datetime.timedelta"datetime.timedelta"typing.Sequence Ebuiltins.tuple[Union[builtins.str,builtins.float,datetime.timedelta]] 5Union[builtins.str,builtins.float,datetime.timedelta] builtins.str" builtins.str @@ -54741,31 +61179,11 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P Any Any" numpy.ndarray"pandas._typing.ArrayLikeN #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index*+ -unit+ -Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None]# -TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 -Literal[builtins.str]  - builtins.str" builtins.str7 +Any"pandas.core.indexes.base.Index*! +unit! +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -54834,16 +61252,14 @@ DUnion[pandas.core.arrays.base.ExtensionArray,numpy.ndarray[Any,Any]]P builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str"3pandas._libs.tslibs.timedeltas.TimeDeltaUnitChoices -None * -errors -STypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] -HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 -Literal[builtins.str]  - builtins.str" builtins.str7 +None * +errors +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str" pandas._typing.IgnoreRaiseCoerce 0:typing.overloadX" + builtins.str" builtins.str"pandas._typing.RaiseCoerce 0:typing.overloadX" uniquepandas.core.algorithms.unique uniquepandas.core.algorithms.unique"P &pandas.core.indexes.period.PeriodIndex"&pandas.core.indexes.period.PeriodIndex*\ @@ -54884,23 +61300,20 @@ DUnion[numpy.ndarray[Any,Any],pandas.core.arrays.base.ExtensionArray]9 &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray*P valuesD pandas.core.series.Series[Any] -Any"pandas.core.series.Series0:typing.overloadX +Any"pandas.core.series.Series0:typing.overloadX uniquepandas.core.algorithms.unique"9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray* -values -0Union[numpy.ndarray[Any,Any],builtins.list[Any]]9 +Any" numpy.ndarray*E +values9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarray, -builtins.list[Any] -Any" builtins.list0:typing.overloadX +Any" numpy.ndarray0:typing.overloadX uniquepandas.core.algorithms.unique"P &pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray*\ valuesP -&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray0:typing.overloadX"6 -concat!pandas.core.reshape.concat.concat +&pandas.core.arrays.base.ExtensionArray"&pandas.core.arrays.base.ExtensionArray0:typing.overloadX"ԗ +concat!pandas.core.reshape.concat.concat concat!pandas.core.reshape.concat.concat": pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* objs @@ -54910,14 +61323,22 @@ yUnion[typing.Iterable[pandas.core.frame.DataFrame],typing.Mapping[pandas._typin Etyping.Mapping[pandas._typing.HashableT1,pandas.core.frame.DataFrame]R pandas._typing.HashableT1" typing.Hashable"typing.Hashable"typing.Hashable: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame"typing.Mapping* -axis +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame"typing.Mapping* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisIndex * + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * join 2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  @@ -54938,17 +61359,19 @@ YUnion[builtins.list[pandas._typing.HashableT3],builtins.tuple[pandas._typing.Ha typing.Hashable"typing.Hashable"typing.Hashable" builtins.list )builtins.tuple[pandas._typing.HashableT3]R pandas._typing.HashableT3" -typing.Hashable"typing.Hashable"typing.Hashable"builtins.tuple"typing.Sequence * -names +typing.Hashable"typing.Hashable"typing.Hashable"builtins.tuple"typing.Sequence * +names +4Union[builtins.list[pandas._typing.HashableT4],None] (builtins.list[pandas._typing.HashableT4]R pandas._typing.HashableT4" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.list *6 +typing.Hashable"typing.Hashable"typing.Hashable" builtins.list +None *6 verify_integrity builtins.bool" builtins.bool ** sort builtins.bool" builtins.bool ** copy - builtins.bool" builtins.bool 0:typing.overloadX + builtins.bool" builtins.bool 0:typing.overloadX concat!pandas.core.reshape.concat.concat"D pandas.core.series.Series[Any] Any"pandas.core.series.Series* @@ -54989,17 +61412,19 @@ YUnion[builtins.list[pandas._typing.HashableT3],builtins.tuple[pandas._typing.Ha typing.Hashable"typing.Hashable"typing.Hashable" builtins.list )builtins.tuple[pandas._typing.HashableT3]R pandas._typing.HashableT3" -typing.Hashable"typing.Hashable"typing.Hashable"builtins.tuple"typing.Sequence * -names +typing.Hashable"typing.Hashable"typing.Hashable"builtins.tuple"typing.Sequence * +names +4Union[builtins.list[pandas._typing.HashableT4],None] (builtins.list[pandas._typing.HashableT4]R pandas._typing.HashableT4" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.list *6 +typing.Hashable"typing.Hashable"typing.Hashable" builtins.list +None *6 verify_integrity builtins.bool" builtins.bool ** sort builtins.bool" builtins.bool ** copy - builtins.bool" builtins.bool 0:typing.overloadX + builtins.bool" builtins.bool 0:typing.overloadX concat!pandas.core.reshape.concat.concat": pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* objs @@ -55015,14 +61440,22 @@ ktyping.Mapping[pandas._typing.HashableT1,Union[pandas.core.series.Series[Any],p AUnion[pandas.core.series.Series[Any],pandas.core.frame.DataFrame]D pandas.core.series.Series[Any] Any"pandas.core.series.Series: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame"typing.Mapping* -axis +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame"typing.Mapping* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex =TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] 2Union[Literal[builtins.str],Literal[builtins.int]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.AxisColumn* + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * join 2Union[Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  @@ -55043,11 +61476,257 @@ YUnion[builtins.list[pandas._typing.HashableT3],builtins.tuple[pandas._typing.Ha typing.Hashable"typing.Hashable"typing.Hashable" builtins.list )builtins.tuple[pandas._typing.HashableT3]R pandas._typing.HashableT3" -typing.Hashable"typing.Hashable"typing.Hashable"builtins.tuple"typing.Sequence * -names +typing.Hashable"typing.Hashable"typing.Hashable"builtins.tuple"typing.Sequence * +names +4Union[builtins.list[pandas._typing.HashableT4],None] (builtins.list[pandas._typing.HashableT4]R pandas._typing.HashableT4" -typing.Hashable"typing.Hashable"typing.Hashable" builtins.list *6 +typing.Hashable"typing.Hashable"typing.Hashable" builtins.list +None *6 +verify_integrity + builtins.bool" builtins.bool ** +sort + builtins.bool" builtins.bool ** +copy + builtins.bool" builtins.bool 0:typing.overloadX +concat!pandas.core.reshape.concat.concat" +NoReturn +* +objs +KUnion[typing.Iterable[None],typing.Mapping[pandas._typing.HashableT1,None]]2 +typing.Iterable[None] +None"typing.Iterable +.typing.Mapping[pandas._typing.HashableT1,None]R +pandas._typing.HashableT1" +typing.Hashable"typing.Hashable"typing.Hashable +None"typing.Mapping* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * +join +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str *2 + ignore_index + builtins.bool" builtins.bool * +keys +*typing.Iterable[pandas._typing.HashableT2]R +pandas._typing.HashableT2" +typing.Hashable"typing.Hashable"typing.Hashable"typing.Iterable * +levels +jtyping.Sequence[Union[builtins.list[pandas._typing.HashableT3],builtins.tuple[pandas._typing.HashableT3]]] +YUnion[builtins.list[pandas._typing.HashableT3],builtins.tuple[pandas._typing.HashableT3]] +(builtins.list[pandas._typing.HashableT3]R +pandas._typing.HashableT3" +typing.Hashable"typing.Hashable"typing.Hashable" builtins.list +)builtins.tuple[pandas._typing.HashableT3]R +pandas._typing.HashableT3" +typing.Hashable"typing.Hashable"typing.Hashable"builtins.tuple"typing.Sequence * +names +4Union[builtins.list[pandas._typing.HashableT4],None] +(builtins.list[pandas._typing.HashableT4]R +pandas._typing.HashableT4" +typing.Hashable"typing.Hashable"typing.Hashable" builtins.list +None *6 +verify_integrity + builtins.bool" builtins.bool ** +sort + builtins.bool" builtins.bool ** +copy + builtins.bool" builtins.bool 0:typing.overloadX +concat!pandas.core.reshape.concat.concat": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +objs +Union[typing.Iterable[Union[pandas.core.frame.DataFrame,None]],typing.Mapping[pandas._typing.HashableT1,Union[pandas.core.frame.DataFrame,None]]] +8typing.Iterable[Union[pandas.core.frame.DataFrame,None]]q +'Union[pandas.core.frame.DataFrame,None]: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame +None"typing.Iterable +Qtyping.Mapping[pandas._typing.HashableT1,Union[pandas.core.frame.DataFrame,None]]R +pandas._typing.HashableT1" +typing.Hashable"typing.Hashable"typing.Hashableq +'Union[pandas.core.frame.DataFrame,None]: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame +None"typing.Mapping* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * +join +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str *2 + ignore_index + builtins.bool" builtins.bool * +keys +*typing.Iterable[pandas._typing.HashableT2]R +pandas._typing.HashableT2" +typing.Hashable"typing.Hashable"typing.Hashable"typing.Iterable * +levels +jtyping.Sequence[Union[builtins.list[pandas._typing.HashableT3],builtins.tuple[pandas._typing.HashableT3]]] +YUnion[builtins.list[pandas._typing.HashableT3],builtins.tuple[pandas._typing.HashableT3]] +(builtins.list[pandas._typing.HashableT3]R +pandas._typing.HashableT3" +typing.Hashable"typing.Hashable"typing.Hashable" builtins.list +)builtins.tuple[pandas._typing.HashableT3]R +pandas._typing.HashableT3" +typing.Hashable"typing.Hashable"typing.Hashable"builtins.tuple"typing.Sequence * +names +4Union[builtins.list[pandas._typing.HashableT4],None] +(builtins.list[pandas._typing.HashableT4]R +pandas._typing.HashableT4" +typing.Hashable"typing.Hashable"typing.Hashable" builtins.list +None *6 +verify_integrity + builtins.bool" builtins.bool ** +sort + builtins.bool" builtins.bool ** +copy + builtins.bool" builtins.bool 0:typing.overloadX +concat!pandas.core.reshape.concat.concat"D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series* +objs +Union[typing.Iterable[Union[pandas.core.series.Series[Any],None]],typing.Mapping[pandas._typing.HashableT1,Union[pandas.core.series.Series[Any],None]]] +;typing.Iterable[Union[pandas.core.series.Series[Any],None]]~ +*Union[pandas.core.series.Series[Any],None]D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series +None"typing.Iterable +Ttyping.Mapping[pandas._typing.HashableT1,Union[pandas.core.series.Series[Any],None]]R +pandas._typing.HashableT1" +typing.Hashable"typing.Hashable"typing.Hashable~ +*Union[pandas.core.series.Series[Any],None]D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series +None"typing.Mapping* +axis +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex * +join +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str *2 + ignore_index + builtins.bool" builtins.bool * +keys +*typing.Iterable[pandas._typing.HashableT2]R +pandas._typing.HashableT2" +typing.Hashable"typing.Hashable"typing.Hashable"typing.Iterable * +levels +jtyping.Sequence[Union[builtins.list[pandas._typing.HashableT3],builtins.tuple[pandas._typing.HashableT3]]] +YUnion[builtins.list[pandas._typing.HashableT3],builtins.tuple[pandas._typing.HashableT3]] +(builtins.list[pandas._typing.HashableT3]R +pandas._typing.HashableT3" +typing.Hashable"typing.Hashable"typing.Hashable" builtins.list +)builtins.tuple[pandas._typing.HashableT3]R +pandas._typing.HashableT3" +typing.Hashable"typing.Hashable"typing.Hashable"builtins.tuple"typing.Sequence * +names +4Union[builtins.list[pandas._typing.HashableT4],None] +(builtins.list[pandas._typing.HashableT4]R +pandas._typing.HashableT4" +typing.Hashable"typing.Hashable"typing.Hashable" builtins.list +None *6 +verify_integrity + builtins.bool" builtins.bool ** +sort + builtins.bool" builtins.bool ** +copy + builtins.bool" builtins.bool 0:typing.overloadX +concat!pandas.core.reshape.concat.concat": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +objs +Union[typing.Iterable[Union[pandas.core.series.Series[Any],pandas.core.frame.DataFrame,None]],typing.Mapping[pandas._typing.HashableT1,Union[pandas.core.series.Series[Any],pandas.core.frame.DataFrame,None]]] +Wtyping.Iterable[Union[pandas.core.series.Series[Any],pandas.core.frame.DataFrame,None]] +FUnion[pandas.core.series.Series[Any],pandas.core.frame.DataFrame,None]D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame +None"typing.Iterable +ptyping.Mapping[pandas._typing.HashableT1,Union[pandas.core.series.Series[Any],pandas.core.frame.DataFrame,None]]R +pandas._typing.HashableT1" +typing.Hashable"typing.Hashable"typing.Hashable +FUnion[pandas.core.series.Series[Any],pandas.core.frame.DataFrame,None]D +pandas.core.series.Series[Any] +Any"pandas.core.series.Series: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame +None"typing.Mapping* +axis +TypeAlias[Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]]] +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]],TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisIndex +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.int]]] +2Union[Literal[builtins.str],Literal[builtins.int]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.int]  + builtins.int" builtins.int"pandas._typing.AxisColumn"pandas._typing.Axis * +join +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str *2 + ignore_index + builtins.bool" builtins.bool * +keys +*typing.Iterable[pandas._typing.HashableT2]R +pandas._typing.HashableT2" +typing.Hashable"typing.Hashable"typing.Hashable"typing.Iterable * +levels +jtyping.Sequence[Union[builtins.list[pandas._typing.HashableT3],builtins.tuple[pandas._typing.HashableT3]]] +YUnion[builtins.list[pandas._typing.HashableT3],builtins.tuple[pandas._typing.HashableT3]] +(builtins.list[pandas._typing.HashableT3]R +pandas._typing.HashableT3" +typing.Hashable"typing.Hashable"typing.Hashable" builtins.list +)builtins.tuple[pandas._typing.HashableT3]R +pandas._typing.HashableT3" +typing.Hashable"typing.Hashable"typing.Hashable"builtins.tuple"typing.Sequence * +names +4Union[builtins.list[pandas._typing.HashableT4],None] +(builtins.list[pandas._typing.HashableT4]R +pandas._typing.HashableT4" +typing.Hashable"typing.Hashable"typing.Hashable" builtins.list +None *6 verify_integrity builtins.bool" builtins.bool ** sort @@ -56703,8 +63382,8 @@ duplicates builtins.str" builtins.str*M _print_desc: Literal[builtins.bool]  - builtins.bool" builtins.bool 0:typing.overloadX" -read_clipboard#pandas.io.clipboards.read_clipboardb + builtins.bool" builtins.bool 0:typing.overloadX"Ȭ +read_clipboard#pandas.io.clipboards.read_clipboardd read_clipboard#pandas.io.clipboards.read_clipboard"T (pandas.io.parsers.readers.TextFileReader"(pandas.io.parsers.readers.TextFileReader*O sepD @@ -56759,23 +63438,22 @@ nUnion[builtins.int,builtins.str,typing.Sequence[Union[builtins.str,builtins.int builtins.int" builtins.int"typing.Sequence: Literal[builtins.bool]  builtins.bool" builtins.bool -None * -usecols -TypeAlias[Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]] -Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]\ -$typing.MutableSequence[builtins.str] - builtins.str" builtins.str"typing.MutableSequenceL -builtins.tuple[builtins.str] - builtins.str" builtins.str"builtins.tupleN -typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.SequenceD -pandas.core.series.Series[Any] -Any"pandas.core.series.SeriesN +None * +usecols +TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]] +Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]s +.pandas._typing.SequenceNotStr[typing.Hashable]" +typing.Hashable"typing.Hashable"pandas._typing.SequenceNotStr +builtins.range"builtins.range +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index9 +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarrayK +Any" numpy.ndarray"pandas._typing.AnyArrayLikeK CallableType[builtins.function]& builtins.function"builtins.function None"pandas._typing.UsecolsArgType * @@ -56927,8 +63605,9 @@ skipfooter builtins.str" builtins.str None *- quotechar - builtins.str" builtins.str * -quoting + builtins.str" builtins.str * +quoting +tTypeAlias[TypeAlias[Union[Literal[builtins.int],Literal[builtins.int],Literal[builtins.int],Literal[builtins.int]]]] iTypeAlias[Union[Literal[builtins.int],Literal[builtins.int],Literal[builtins.int],Literal[builtins.int]]] ^Union[Literal[builtins.int],Literal[builtins.int],Literal[builtins.int],Literal[builtins.int]]7 Literal[builtins.int]  @@ -56938,7 +63617,7 @@ iTypeAlias[Union[Literal[builtins.int],Literal[builtins.int],Literal[builtins.in Literal[builtins.int]  builtins.int" builtins.int7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.CSVQuoting *1 + builtins.int" builtins.int"pandas._typing.CSVQuotingCompat"pandas._typing.CSVQuoting *1 doublequote builtins.bool" builtins.bool *V @@ -56997,7 +63676,7 @@ BUnion[TypeAlias[Union[builtins.dict[builtins.str,Any],None]],None] builtins.str" builtins.str Any" builtins.dict None"pandas._typing.StorageOptions -None 0:typing.overloadXa +None 0:typing.overloadXc read_clipboard#pandas.io.clipboards.read_clipboard"T (pandas.io.parsers.readers.TextFileReader"(pandas.io.parsers.readers.TextFileReader*O sepD @@ -57052,23 +63731,22 @@ nUnion[builtins.int,builtins.str,typing.Sequence[Union[builtins.str,builtins.int builtins.int" builtins.int"typing.Sequence: Literal[builtins.bool]  builtins.bool" builtins.bool -None * -usecols -TypeAlias[Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]] -Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]\ -$typing.MutableSequence[builtins.str] - builtins.str" builtins.str"typing.MutableSequenceL -builtins.tuple[builtins.str] - builtins.str" builtins.str"builtins.tupleN -typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.SequenceD -pandas.core.series.Series[Any] -Any"pandas.core.series.SeriesN +None * +usecols +TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]] +Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]s +.pandas._typing.SequenceNotStr[typing.Hashable]" +typing.Hashable"typing.Hashable"pandas._typing.SequenceNotStr +builtins.range"builtins.range +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index9 +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarrayK +Any" numpy.ndarray"pandas._typing.AnyArrayLikeK CallableType[builtins.function]& builtins.function"builtins.function None"pandas._typing.UsecolsArgType * @@ -57217,8 +63895,9 @@ skipfooter builtins.str" builtins.str None *- quotechar - builtins.str" builtins.str * -quoting + builtins.str" builtins.str * +quoting +tTypeAlias[TypeAlias[Union[Literal[builtins.int],Literal[builtins.int],Literal[builtins.int],Literal[builtins.int]]]] iTypeAlias[Union[Literal[builtins.int],Literal[builtins.int],Literal[builtins.int],Literal[builtins.int]]] ^Union[Literal[builtins.int],Literal[builtins.int],Literal[builtins.int],Literal[builtins.int]]7 Literal[builtins.int]  @@ -57228,7 +63907,7 @@ iTypeAlias[Union[Literal[builtins.int],Literal[builtins.int],Literal[builtins.in Literal[builtins.int]  builtins.int" builtins.int7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.CSVQuoting *1 + builtins.int" builtins.int"pandas._typing.CSVQuotingCompat"pandas._typing.CSVQuoting *1 doublequote builtins.bool" builtins.bool *V @@ -57287,7 +63966,7 @@ BUnion[TypeAlias[Union[builtins.dict[builtins.str,Any],None]],None] builtins.str" builtins.str Any" builtins.dict None"pandas._typing.StorageOptions -None 0:typing.overloadXa +None 0:typing.overloadXc read_clipboard#pandas.io.clipboards.read_clipboard": pandas.core.frame.DataFrame"pandas.core.frame.DataFrame*O sepD @@ -57342,23 +64021,22 @@ nUnion[builtins.int,builtins.str,typing.Sequence[Union[builtins.str,builtins.int builtins.int" builtins.int"typing.Sequence: Literal[builtins.bool]  builtins.bool" builtins.bool -None * -usecols -TypeAlias[Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]] -Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]\ -$typing.MutableSequence[builtins.str] - builtins.str" builtins.str"typing.MutableSequenceL -builtins.tuple[builtins.str] - builtins.str" builtins.str"builtins.tupleN -typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.SequenceD -pandas.core.series.Series[Any] -Any"pandas.core.series.SeriesN +None * +usecols +TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]] +Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]s +.pandas._typing.SequenceNotStr[typing.Hashable]" +typing.Hashable"typing.Hashable"pandas._typing.SequenceNotStr +builtins.range"builtins.range +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index9 +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarrayK +Any" numpy.ndarray"pandas._typing.AnyArrayLikeK CallableType[builtins.function]& builtins.function"builtins.function None"pandas._typing.UsecolsArgType * @@ -57508,8 +64186,9 @@ skipfooter builtins.str" builtins.str None *- quotechar - builtins.str" builtins.str * -quoting + builtins.str" builtins.str * +quoting +tTypeAlias[TypeAlias[Union[Literal[builtins.int],Literal[builtins.int],Literal[builtins.int],Literal[builtins.int]]]] iTypeAlias[Union[Literal[builtins.int],Literal[builtins.int],Literal[builtins.int],Literal[builtins.int]]] ^Union[Literal[builtins.int],Literal[builtins.int],Literal[builtins.int],Literal[builtins.int]]7 Literal[builtins.int]  @@ -57519,7 +64198,7 @@ iTypeAlias[Union[Literal[builtins.int],Literal[builtins.int],Literal[builtins.in Literal[builtins.int]  builtins.int" builtins.int7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.CSVQuoting *1 + builtins.int" builtins.int"pandas._typing.CSVQuotingCompat"pandas._typing.CSVQuoting *1 doublequote builtins.bool" builtins.bool *V @@ -57578,8 +64257,8 @@ BUnion[TypeAlias[Union[builtins.dict[builtins.str,Any],None]],None] builtins.str" builtins.str Any" builtins.dict None"pandas._typing.StorageOptions -None 0:typing.overloadX" -read_csv"pandas.io.parsers.readers.read_csvn +None 0:typing.overloadX" +read_csv"pandas.io.parsers.readers.read_csvp read_csv"pandas.io.parsers.readers.read_csv"T (pandas.io.parsers.readers.TextFileReader"(pandas.io.parsers.readers.TextFileReader* filepath_or_buffer @@ -57634,23 +64313,22 @@ nUnion[builtins.int,builtins.str,typing.Sequence[Union[builtins.str,builtins.int builtins.int" builtins.int"typing.Sequence: Literal[builtins.bool]  builtins.bool" builtins.bool -None * -usecols -TypeAlias[Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]] -Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]\ -$typing.MutableSequence[builtins.str] - builtins.str" builtins.str"typing.MutableSequenceL -builtins.tuple[builtins.str] - builtins.str" builtins.str"builtins.tupleN -typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.SequenceD -pandas.core.series.Series[Any] -Any"pandas.core.series.SeriesN +None * +usecols +TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]] +Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]s +.pandas._typing.SequenceNotStr[typing.Hashable]" +typing.Hashable"typing.Hashable"pandas._typing.SequenceNotStr +builtins.range"builtins.range +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index9 +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarrayK +Any" numpy.ndarray"pandas._typing.AnyArrayLikeK CallableType[builtins.function]& builtins.function"builtins.function None"pandas._typing.UsecolsArgType * @@ -57818,8 +64496,9 @@ DUnion[builtins.dict[typing.Hashable,builtins.str],builtins.str,None]~ builtins.str" builtins.str None *- quotechar - builtins.str" builtins.str * -quoting + builtins.str" builtins.str * +quoting +tTypeAlias[TypeAlias[Union[Literal[builtins.int],Literal[builtins.int],Literal[builtins.int],Literal[builtins.int]]]] iTypeAlias[Union[Literal[builtins.int],Literal[builtins.int],Literal[builtins.int],Literal[builtins.int]]] ^Union[Literal[builtins.int],Literal[builtins.int],Literal[builtins.int],Literal[builtins.int]]7 Literal[builtins.int]  @@ -57829,7 +64508,7 @@ iTypeAlias[Union[Literal[builtins.int],Literal[builtins.int],Literal[builtins.in Literal[builtins.int]  builtins.int" builtins.int7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.CSVQuoting *1 + builtins.int" builtins.int"pandas._typing.CSVQuotingCompat"pandas._typing.CSVQuoting *1 doublequote builtins.bool" builtins.bool *V @@ -57899,7 +64578,7 @@ tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],TypeAlias[L builtins.str" builtins.str"pandas._typing.DtypeBackend /TypeAlias[Literal[pandas._libs.lib._NoDefault]]d $Literal[pandas._libs.lib._NoDefault] : -pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadXm +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadXo read_csv"pandas.io.parsers.readers.read_csv"T (pandas.io.parsers.readers.TextFileReader"(pandas.io.parsers.readers.TextFileReader* filepath_or_buffer @@ -57954,23 +64633,22 @@ nUnion[builtins.int,builtins.str,typing.Sequence[Union[builtins.str,builtins.int builtins.int" builtins.int"typing.Sequence: Literal[builtins.bool]  builtins.bool" builtins.bool -None * -usecols -TypeAlias[Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]] -Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]\ -$typing.MutableSequence[builtins.str] - builtins.str" builtins.str"typing.MutableSequenceL -builtins.tuple[builtins.str] - builtins.str" builtins.str"builtins.tupleN -typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.SequenceD -pandas.core.series.Series[Any] -Any"pandas.core.series.SeriesN +None * +usecols +TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]] +Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]s +.pandas._typing.SequenceNotStr[typing.Hashable]" +typing.Hashable"typing.Hashable"pandas._typing.SequenceNotStr +builtins.range"builtins.range +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index9 +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarrayK +Any" numpy.ndarray"pandas._typing.AnyArrayLikeK CallableType[builtins.function]& builtins.function"builtins.function None"pandas._typing.UsecolsArgType * @@ -58135,8 +64813,9 @@ DUnion[builtins.dict[typing.Hashable,builtins.str],builtins.str,None]~ builtins.str" builtins.str None *- quotechar - builtins.str" builtins.str * -quoting + builtins.str" builtins.str * +quoting +tTypeAlias[TypeAlias[Union[Literal[builtins.int],Literal[builtins.int],Literal[builtins.int],Literal[builtins.int]]]] iTypeAlias[Union[Literal[builtins.int],Literal[builtins.int],Literal[builtins.int],Literal[builtins.int]]] ^Union[Literal[builtins.int],Literal[builtins.int],Literal[builtins.int],Literal[builtins.int]]7 Literal[builtins.int]  @@ -58146,7 +64825,7 @@ iTypeAlias[Union[Literal[builtins.int],Literal[builtins.int],Literal[builtins.in Literal[builtins.int]  builtins.int" builtins.int7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.CSVQuoting *1 + builtins.int" builtins.int"pandas._typing.CSVQuotingCompat"pandas._typing.CSVQuoting *1 doublequote builtins.bool" builtins.bool *V @@ -58216,7 +64895,7 @@ tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],TypeAlias[L builtins.str" builtins.str"pandas._typing.DtypeBackend /TypeAlias[Literal[pandas._libs.lib._NoDefault]]d $Literal[pandas._libs.lib._NoDefault] : -pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadXm +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadXo read_csv"pandas.io.parsers.readers.read_csv": pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* filepath_or_buffer @@ -58271,23 +64950,22 @@ nUnion[builtins.int,builtins.str,typing.Sequence[Union[builtins.str,builtins.int builtins.int" builtins.int"typing.Sequence: Literal[builtins.bool]  builtins.bool" builtins.bool -None * -usecols -TypeAlias[Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]] -Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]\ -$typing.MutableSequence[builtins.str] - builtins.str" builtins.str"typing.MutableSequenceL -builtins.tuple[builtins.str] - builtins.str" builtins.str"builtins.tupleN -typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.SequenceD -pandas.core.series.Series[Any] -Any"pandas.core.series.SeriesN +None * +usecols +TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]] +Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]s +.pandas._typing.SequenceNotStr[typing.Hashable]" +typing.Hashable"typing.Hashable"pandas._typing.SequenceNotStr +builtins.range"builtins.range +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index9 +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarrayK +Any" numpy.ndarray"pandas._typing.AnyArrayLikeK CallableType[builtins.function]& builtins.function"builtins.function None"pandas._typing.UsecolsArgType * @@ -58453,8 +65131,9 @@ DUnion[builtins.dict[typing.Hashable,builtins.str],builtins.str,None]~ builtins.str" builtins.str None *- quotechar - builtins.str" builtins.str * -quoting + builtins.str" builtins.str * +quoting +tTypeAlias[TypeAlias[Union[Literal[builtins.int],Literal[builtins.int],Literal[builtins.int],Literal[builtins.int]]]] iTypeAlias[Union[Literal[builtins.int],Literal[builtins.int],Literal[builtins.int],Literal[builtins.int]]] ^Union[Literal[builtins.int],Literal[builtins.int],Literal[builtins.int],Literal[builtins.int]]7 Literal[builtins.int]  @@ -58464,7 +65143,7 @@ iTypeAlias[Union[Literal[builtins.int],Literal[builtins.int],Literal[builtins.in Literal[builtins.int]  builtins.int" builtins.int7 Literal[builtins.int]  - builtins.int" builtins.int"pandas._typing.CSVQuoting *1 + builtins.int" builtins.int"pandas._typing.CSVQuotingCompat"pandas._typing.CSVQuoting *1 doublequote builtins.bool" builtins.bool *V @@ -58534,38 +65213,246 @@ tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],TypeAlias[L builtins.str" builtins.str"pandas._typing.DtypeBackend /TypeAlias[Literal[pandas._libs.lib._NoDefault]]d $Literal[pandas._libs.lib._NoDefault] : -pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadX" +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadX" -read_excel pandas.io.excel._base.read_excelO +read_excel pandas.io.excel._base.read_excelR -read_excel pandas.io.excel._base.read_excel" -Kbuiltins.dict[Union[builtins.int,builtins.str],pandas.core.frame.DataFrame]` +read_excel pandas.io.excel._base.read_excel" +Abuiltins.dict[pandas._typing.IntStrT,pandas.core.frame.DataFrame]O +pandas._typing.IntStrT" +builtins.object"builtins.object"builtins.object: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame" builtins.dict* +io +Union[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.ReadBuffer[builtins.bytes],pandas.io.excel._base.ExcelFile,Any,Any,Any,Any] +8TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]] +-Union[builtins.str,os.PathLike[builtins.str]] + builtins.str" builtins.strF +os.PathLike[builtins.str] + builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathh +)pandas._typing.ReadBuffer[builtins.bytes] +builtins.bytes"builtins.bytes"pandas._typing.ReadBufferB +pandas.io.excel._base.ExcelFile"pandas.io.excel._base.ExcelFile +Any +Any +Any +Any* + +sheet_name +%builtins.list[pandas._typing.IntStrT]O +pandas._typing.IntStrT" +builtins.object"builtins.object"builtins.object" builtins.list* +header +6Union[builtins.int,typing.Sequence[builtins.int],None] + builtins.int" builtins.intN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.Sequence +None * +names +Union[TypeAlias[Union[typing.MutableSequence[pandas._typing.HashableT],numpy.ndarray[Any,Any],builtins.tuple[pandas._typing.HashableT],builtins.range]],None] +TypeAlias[Union[typing.MutableSequence[pandas._typing.HashableT],numpy.ndarray[Any,Any],builtins.tuple[pandas._typing.HashableT],builtins.range]] +Union[typing.MutableSequence[pandas._typing.HashableT],numpy.ndarray[Any,Any],builtins.tuple[pandas._typing.HashableT],builtins.range] +0typing.MutableSequence[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable"typing.MutableSequence9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray +(builtins.tuple[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable"builtins.tuple +builtins.range"builtins.range"pandas._typing.ListLikeHashable +None * + index_col +CUnion[builtins.int,typing.Sequence[builtins.int],builtins.str,None] + builtins.int" builtins.intN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.Sequence + builtins.str" builtins.str +None * +usecols +Union[builtins.str,TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]]] + builtins.str" builtins.str +TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]] +Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]s +.pandas._typing.SequenceNotStr[typing.Hashable]" +typing.Hashable"typing.Hashable"pandas._typing.SequenceNotStr +builtins.range"builtins.range +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.AnyArrayLikeK +CallableType[builtins.function]& +builtins.function"builtins.function +None"pandas._typing.UsecolsArgType * +dtype +Union[builtins.str,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],typing.Mapping[builtins.str,Union[builtins.str,Unknown]],None] + builtins.str" builtins.str +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype +8typing.Mapping[builtins.str,Union[builtins.str,Unknown]] + builtins.str" builtins.str? +Union[builtins.str,Unknown] + builtins.str" builtins.str"typing.Mapping +None * +engine +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +tUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ExcelReadEngine +None * + +converters +\Union[typing.Mapping[Union[builtins.int,builtins.str],CallableType[builtins.function]],None] +Ptyping.Mapping[Union[builtins.int,builtins.str],CallableType[builtins.function]]` Union[builtins.int,builtins.str] builtins.int" builtins.int + builtins.str" builtins.strK +CallableType[builtins.function]& +builtins.function"builtins.function"typing.Mapping +None * + true_values +,Union[typing.Iterable[typing.Hashable],None]W + typing.Iterable[typing.Hashable]" +typing.Hashable"typing.Hashable"typing.Iterable +None * + false_values +,Union[typing.Iterable[typing.Hashable],None]W + typing.Iterable[typing.Hashable]" +typing.Hashable"typing.Hashable"typing.Iterable +None * +skiprows +VUnion[builtins.int,typing.Sequence[builtins.int],CallableType[builtins.function],None] + builtins.int" builtins.intN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.SequenceK +CallableType[builtins.function]& +builtins.function"builtins.function +None *Q +nrowsD +Union[builtins.int,None] + builtins.int" builtins.int +None * + na_values +rUnion[typing.Sequence[builtins.str],builtins.dict[Union[builtins.str,builtins.int],typing.Sequence[builtins.str]]]N +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.Sequence +Mbuiltins.dict[Union[builtins.str,builtins.int],typing.Sequence[builtins.str]]` + Union[builtins.str,builtins.int] + builtins.str" builtins.str + builtins.int" builtins.intN +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.Sequence" builtins.dict *5 +keep_default_na + builtins.bool" builtins.bool */ + na_filter + builtins.bool" builtins.bool *- +verbose + builtins.bool" builtins.bool * + parse_dates +Union[builtins.bool,typing.Sequence[builtins.int],typing.Sequence[Union[typing.Sequence[builtins.str],typing.Sequence[builtins.int]]],builtins.dict[builtins.str,Union[typing.Sequence[builtins.int],builtins.list[builtins.str]]]] + builtins.bool" builtins.boolN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.Sequence +Styping.Sequence[Union[typing.Sequence[builtins.str],typing.Sequence[builtins.int]]] +BUnion[typing.Sequence[builtins.str],typing.Sequence[builtins.int]]N +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.SequenceN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.Sequence"typing.Sequence +\builtins.dict[builtins.str,Union[typing.Sequence[builtins.int],builtins.list[builtins.str]]] + builtins.str" builtins.str +@Union[typing.Sequence[builtins.int],builtins.list[builtins.str]]N +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.SequenceJ +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list" builtins.dict * + date_format +DUnion[builtins.dict[typing.Hashable,builtins.str],builtins.str,None]~ ++builtins.dict[typing.Hashable,builtins.str]" +typing.Hashable"typing.Hashable + builtins.str" builtins.str" builtins.dict + builtins.str" builtins.str +None *U + thousandsD +Union[builtins.str,None] + builtins.str" builtins.str +None *+ +decimal + builtins.str" builtins.str *S +commentD +Union[builtins.str,None] + builtins.str" builtins.str +None *. + +skipfooter + builtins.int" builtins.int * +storage_options +6TypeAlias[Union[builtins.dict[builtins.str,Any],None]] ++Union[builtins.dict[builtins.str,Any],None]W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict +None"pandas._typing.StorageOptions * + dtype_backend +tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Literal[pandas._libs.lib._NoDefault]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.DtypeBackend +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadXQ + +read_excel pandas.io.excel._base.read_excel" +7builtins.dict[builtins.str,pandas.core.frame.DataFrame] builtins.str" builtins.str: -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame" builtins.dict* -io -Union[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.ReadBuffer[builtins.bytes],builtins.bytes,pandas.io.excel._base.ExcelFile,Any,Any,Any,Any] +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame" builtins.dict* +io +Union[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.ReadBuffer[builtins.bytes],pandas.io.excel._base.ExcelFile,Any,Any,Any,Any] 8TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]] -Union[builtins.str,os.PathLike[builtins.str]] builtins.str" builtins.strF os.PathLike[builtins.str] builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathh )pandas._typing.ReadBuffer[builtins.bytes] -builtins.bytes"builtins.bytes"pandas._typing.ReadBuffer -builtins.bytes"builtins.bytesB +builtins.bytes"builtins.bytes"pandas._typing.ReadBufferB pandas.io.excel._base.ExcelFile"pandas.io.excel._base.ExcelFile Any Any Any -Any* +Any* -sheet_name -;Union[builtins.list[Union[builtins.int,builtins.str]],None] -/builtins.list[Union[builtins.int,builtins.str]]` - Union[builtins.int,builtins.str] - builtins.int" builtins.int - builtins.str" builtins.str" builtins.list +sheet_name None* header 6Union[builtins.int,typing.Sequence[builtins.int],None] @@ -58587,33 +65474,31 @@ sheet_name pandas._typing.HashableT" typing.Hashable"typing.Hashable"typing.Hashable"builtins.tuple builtins.range"builtins.range"pandas._typing.ListLikeHashable -None * - index_col -6Union[builtins.int,typing.Sequence[builtins.int],None] +None * + index_col +CUnion[builtins.int,typing.Sequence[builtins.int],builtins.str,None] builtins.int" builtins.intN typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.Sequence -None * - -usecols - -Union[builtins.str,TypeAlias[Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]]] - builtins.str" builtins.str -TypeAlias[Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]] -Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]\ -$typing.MutableSequence[builtins.str] - builtins.str" builtins.str"typing.MutableSequenceL -builtins.tuple[builtins.str] - builtins.str" builtins.str"builtins.tupleN -typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.SequenceD -pandas.core.series.Series[Any] -Any"pandas.core.series.SeriesN + builtins.int" builtins.int"typing.Sequence + builtins.str" builtins.str +None * +usecols +Union[builtins.str,TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]]] + builtins.str" builtins.str +TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]] +Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]s +.pandas._typing.SequenceNotStr[typing.Hashable]" +typing.Hashable"typing.Hashable"pandas._typing.SequenceNotStr +builtins.range"builtins.range +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index9 +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarrayK +Any" numpy.ndarray"pandas._typing.AnyArrayLikeK CallableType[builtins.function]& builtins.function"builtins.function None"pandas._typing.UsecolsArgType * @@ -58640,9 +65525,11 @@ $typing.MutableSequence[builtins.str] builtins.str" builtins.str? Union[builtins.str,Unknown] builtins.str" builtins.str"typing.Mapping -None * -engine -cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]7 +None * +engine +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +tUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -58650,7 +65537,9 @@ cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ExcelReadEngine None * converters @@ -58755,30 +65644,34 @@ tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],TypeAlias[L builtins.str" builtins.str"pandas._typing.DtypeBackend /TypeAlias[Literal[pandas._libs.lib._NoDefault]]d $Literal[pandas._libs.lib._NoDefault] : -pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadXM +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadXS -read_excel pandas.io.excel._base.read_excel": -pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* -io -Union[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.ReadBuffer[builtins.bytes],builtins.bytes,pandas.io.excel._base.ExcelFile,Any,Any,Any,Any] +read_excel pandas.io.excel._base.read_excel" +Kbuiltins.dict[Union[builtins.int,builtins.str],pandas.core.frame.DataFrame]` + Union[builtins.int,builtins.str] + builtins.int" builtins.int + builtins.str" builtins.str: +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame" builtins.dict* +io +Union[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.ReadBuffer[builtins.bytes],pandas.io.excel._base.ExcelFile,Any,Any,Any,Any] 8TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]] -Union[builtins.str,os.PathLike[builtins.str]] builtins.str" builtins.strF os.PathLike[builtins.str] builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathh )pandas._typing.ReadBuffer[builtins.bytes] -builtins.bytes"builtins.bytes"pandas._typing.ReadBuffer -builtins.bytes"builtins.bytesB +builtins.bytes"builtins.bytes"pandas._typing.ReadBufferB pandas.io.excel._base.ExcelFile"pandas.io.excel._base.ExcelFile Any Any Any -Any*r +Any* -sheet_name` +sheet_name +/builtins.list[Union[builtins.int,builtins.str]]` Union[builtins.int,builtins.str] builtins.int" builtins.int - builtins.str" builtins.str * + builtins.str" builtins.str" builtins.list* header 6Union[builtins.int,typing.Sequence[builtins.int],None] builtins.int" builtins.intN @@ -58799,33 +65692,31 @@ sheet_name` pandas._typing.HashableT" typing.Hashable"typing.Hashable"typing.Hashable"builtins.tuple builtins.range"builtins.range"pandas._typing.ListLikeHashable -None * - index_col -6Union[builtins.int,typing.Sequence[builtins.int],None] +None * + index_col +CUnion[builtins.int,typing.Sequence[builtins.int],builtins.str,None] builtins.int" builtins.intN typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.Sequence -None * - -usecols - -Union[builtins.str,TypeAlias[Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]]] - builtins.str" builtins.str -TypeAlias[Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]] -Union[typing.MutableSequence[builtins.str],builtins.tuple[builtins.str],typing.Sequence[builtins.int],pandas.core.series.Series[Any],pandas.core.indexes.base.Index[Any],numpy.ndarray[Any,Any],CallableType[builtins.function],None]\ -$typing.MutableSequence[builtins.str] - builtins.str" builtins.str"typing.MutableSequenceL -builtins.tuple[builtins.str] - builtins.str" builtins.str"builtins.tupleN -typing.Sequence[builtins.int] - builtins.int" builtins.int"typing.SequenceD -pandas.core.series.Series[Any] -Any"pandas.core.series.SeriesN + builtins.int" builtins.int"typing.Sequence + builtins.str" builtins.str +None * +usecols +Union[builtins.str,TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]]] + builtins.str" builtins.str +TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]] +Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]s +.pandas._typing.SequenceNotStr[typing.Hashable]" +typing.Hashable"typing.Hashable"pandas._typing.SequenceNotStr +builtins.range"builtins.range +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N #pandas.core.indexes.base.Index[Any] -Any"pandas.core.indexes.base.Index9 +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 numpy.ndarray[Any,Any] Any -Any" numpy.ndarrayK +Any" numpy.ndarray"pandas._typing.AnyArrayLikeK CallableType[builtins.function]& builtins.function"builtins.function None"pandas._typing.UsecolsArgType * @@ -58852,9 +65743,13 @@ $typing.MutableSequence[builtins.str] builtins.str" builtins.str? Union[builtins.str,Unknown] builtins.str" builtins.str"typing.Mapping -None * -engine -cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]7 +None * +engine +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +tUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -58862,7 +65757,220 @@ cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ExcelReadEngine +None * + +converters +\Union[typing.Mapping[Union[builtins.int,builtins.str],CallableType[builtins.function]],None] +Ptyping.Mapping[Union[builtins.int,builtins.str],CallableType[builtins.function]]` + Union[builtins.int,builtins.str] + builtins.int" builtins.int + builtins.str" builtins.strK +CallableType[builtins.function]& +builtins.function"builtins.function"typing.Mapping +None * + true_values +,Union[typing.Iterable[typing.Hashable],None]W + typing.Iterable[typing.Hashable]" +typing.Hashable"typing.Hashable"typing.Iterable +None * + false_values +,Union[typing.Iterable[typing.Hashable],None]W + typing.Iterable[typing.Hashable]" +typing.Hashable"typing.Hashable"typing.Iterable +None * +skiprows +VUnion[builtins.int,typing.Sequence[builtins.int],CallableType[builtins.function],None] + builtins.int" builtins.intN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.SequenceK +CallableType[builtins.function]& +builtins.function"builtins.function +None *Q +nrowsD +Union[builtins.int,None] + builtins.int" builtins.int +None * + na_values +rUnion[typing.Sequence[builtins.str],builtins.dict[Union[builtins.str,builtins.int],typing.Sequence[builtins.str]]]N +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.Sequence +Mbuiltins.dict[Union[builtins.str,builtins.int],typing.Sequence[builtins.str]]` + Union[builtins.str,builtins.int] + builtins.str" builtins.str + builtins.int" builtins.intN +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.Sequence" builtins.dict *5 +keep_default_na + builtins.bool" builtins.bool */ + na_filter + builtins.bool" builtins.bool *- +verbose + builtins.bool" builtins.bool * + parse_dates +Union[builtins.bool,typing.Sequence[builtins.int],typing.Sequence[Union[typing.Sequence[builtins.str],typing.Sequence[builtins.int]]],builtins.dict[builtins.str,Union[typing.Sequence[builtins.int],builtins.list[builtins.str]]]] + builtins.bool" builtins.boolN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.Sequence +Styping.Sequence[Union[typing.Sequence[builtins.str],typing.Sequence[builtins.int]]] +BUnion[typing.Sequence[builtins.str],typing.Sequence[builtins.int]]N +typing.Sequence[builtins.str] + builtins.str" builtins.str"typing.SequenceN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.Sequence"typing.Sequence +\builtins.dict[builtins.str,Union[typing.Sequence[builtins.int],builtins.list[builtins.str]]] + builtins.str" builtins.str +@Union[typing.Sequence[builtins.int],builtins.list[builtins.str]]N +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.SequenceJ +builtins.list[builtins.str] + builtins.str" builtins.str" builtins.list" builtins.dict * + date_format +DUnion[builtins.dict[typing.Hashable,builtins.str],builtins.str,None]~ ++builtins.dict[typing.Hashable,builtins.str]" +typing.Hashable"typing.Hashable + builtins.str" builtins.str" builtins.dict + builtins.str" builtins.str +None *U + thousandsD +Union[builtins.str,None] + builtins.str" builtins.str +None *+ +decimal + builtins.str" builtins.str *S +commentD +Union[builtins.str,None] + builtins.str" builtins.str +None *. + +skipfooter + builtins.int" builtins.int * +storage_options +6TypeAlias[Union[builtins.dict[builtins.str,Any],None]] ++Union[builtins.dict[builtins.str,Any],None]W +builtins.dict[builtins.str,Any] + builtins.str" builtins.str +Any" builtins.dict +None"pandas._typing.StorageOptions * + dtype_backend +tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],TypeAlias[Literal[pandas._libs.lib._NoDefault]]] +=TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]] +2Union[Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.DtypeBackend +/TypeAlias[Literal[pandas._libs.lib._NoDefault]]d +$Literal[pandas._libs.lib._NoDefault] : +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadXQ + +read_excel pandas.io.excel._base.read_excel": +pandas.core.frame.DataFrame"pandas.core.frame.DataFrame* +io +Union[TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]],pandas._typing.ReadBuffer[builtins.bytes],pandas.io.excel._base.ExcelFile,Any,Any,Any,Any] +8TypeAlias[Union[builtins.str,os.PathLike[builtins.str]]] +-Union[builtins.str,os.PathLike[builtins.str]] + builtins.str" builtins.strF +os.PathLike[builtins.str] + builtins.str" builtins.str" os.PathLike"pandas._typing.FilePathh +)pandas._typing.ReadBuffer[builtins.bytes] +builtins.bytes"builtins.bytes"pandas._typing.ReadBufferB +pandas.io.excel._base.ExcelFile"pandas.io.excel._base.ExcelFile +Any +Any +Any +Any*r + +sheet_name` + Union[builtins.int,builtins.str] + builtins.int" builtins.int + builtins.str" builtins.str * +header +6Union[builtins.int,typing.Sequence[builtins.int],None] + builtins.int" builtins.intN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.Sequence +None * +names +Union[TypeAlias[Union[typing.MutableSequence[pandas._typing.HashableT],numpy.ndarray[Any,Any],builtins.tuple[pandas._typing.HashableT],builtins.range]],None] +TypeAlias[Union[typing.MutableSequence[pandas._typing.HashableT],numpy.ndarray[Any,Any],builtins.tuple[pandas._typing.HashableT],builtins.range]] +Union[typing.MutableSequence[pandas._typing.HashableT],numpy.ndarray[Any,Any],builtins.tuple[pandas._typing.HashableT],builtins.range] +0typing.MutableSequence[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable"typing.MutableSequence9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray +(builtins.tuple[pandas._typing.HashableT]Q +pandas._typing.HashableT" +typing.Hashable"typing.Hashable"typing.Hashable"builtins.tuple +builtins.range"builtins.range"pandas._typing.ListLikeHashable +None * + index_col +CUnion[builtins.int,typing.Sequence[builtins.int],builtins.str,None] + builtins.int" builtins.intN +typing.Sequence[builtins.int] + builtins.int" builtins.int"typing.Sequence builtins.str" builtins.str +None * +usecols +Union[builtins.str,TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]]] + builtins.str" builtins.str +TypeAlias[Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]] +Union[pandas._typing.SequenceNotStr[typing.Hashable],builtins.range,TypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]],CallableType[builtins.function],None]s +.pandas._typing.SequenceNotStr[typing.Hashable]" +typing.Hashable"typing.Hashable"pandas._typing.SequenceNotStr +builtins.range"builtins.range +kTypeAlias[Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]] +`Union[pandas.core.indexes.base.Index[Any],pandas.core.series.Series[Any],numpy.ndarray[Any,Any]]N +#pandas.core.indexes.base.Index[Any] +Any"pandas.core.indexes.base.IndexD +pandas.core.series.Series[Any] +Any"pandas.core.series.Series9 +numpy.ndarray[Any,Any] +Any +Any" numpy.ndarray"pandas._typing.AnyArrayLikeK +CallableType[builtins.function]& +builtins.function"builtins.function +None"pandas._typing.UsecolsArgType * +dtype +Union[builtins.str,TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]],typing.Mapping[builtins.str,Union[builtins.str,Unknown]],None] + builtins.str" builtins.str +TypeAlias[Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]] +Union[pandas.core.dtypes.base.ExtensionDtype,TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]]]P +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype +TypeAlias[Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]]] +Union[builtins.str,numpy.dtype[numpy.generic],Type[builtins.str],Type[builtins.complex],Type[builtins.bool],Type[builtins.object]] + builtins.str" builtins.strI +numpy.dtype[numpy.generic] + numpy.generic" numpy.generic" numpy.dtype: +Type[builtins.str] + builtins.str" builtins.str"typeF +Type[builtins.complex]$ +builtins.complex"builtins.complex"type= +Type[builtins.bool] + builtins.bool" builtins.bool"typeC +Type[builtins.object]" +builtins.object"builtins.object"type"pandas._typing.NpDtype"pandas._typing.Dtype +8typing.Mapping[builtins.str,Union[builtins.str,Unknown]] + builtins.str" builtins.str? +Union[builtins.str,Unknown] + builtins.str" builtins.str"typing.Mapping +None * +engine +Union[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +tUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str7 +Literal[builtins.str]  + builtins.str" builtins.str"pandas._typing.ExcelReadEngine None * converters @@ -59334,8 +66442,8 @@ HUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 chunksize None * kwargs -Any0:typing.overloadX" - read_jsonpandas.io.json._json.read_json9 +Any0:typing.overloadX" + read_jsonpandas.io.json._json.read_json; read_jsonpandas.io.json._json.read_json" ?pandas.io.json._json.JsonReader[pandas.core.series.Series[Any]]D pandas.core.series.Series[Any] @@ -59406,9 +66514,11 @@ iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.st keep_default_dates builtins.bool" builtins.bool *3 precise_float - builtins.bool" builtins.bool * - date_unit -cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],None]7 + builtins.bool" builtins.bool * + date_unit +uUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]],None] +iTypeAlias[Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]] +^Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -59416,7 +66526,7 @@ cUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  - builtins.str" builtins.str + builtins.str" builtins.str"pandas._typing.TimeUnit None *T encodingD Union[builtins.str,None] @@ -59481,7 +66591,7 @@ tUnion[TypeAlias[Union[Literal[builtins.str],Literal[builtins.str]]],TypeAlias[L builtins.str" builtins.str"pandas._typing.DtypeBackend /TypeAlias[Literal[pandas._libs.lib._NoDefault]]d $Literal[pandas._libs.lib._NoDefault] : -pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadX; +pandas._libs.lib._NoDefault"pandas._libs.lib._NoDefault"pandas._libs.lib.NoDefault 0:typing.overloadX= read_jsonpandas.io.json._json.read_json" $YPU%>zyo7RS5tn?kkx9 delta 13 Vcmdn^jd9{v#to8HlXq5C001zT2C)DD diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pyspark.pandas.namespace.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pyspark.pandas.namespace.protobuf index 075cb93c7..518de1873 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pyspark.pandas.namespace.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pyspark.pandas.namespace.protobuf @@ -2442,7 +2442,9 @@ uTuple[Union[builtins.list[pyspark.sql.column.Column],None],Union[builtins.list[ builtins.str" builtins.str Any" builtins.dict* npnumpy * -pdpandas ** +pdpandas *P +is_datetime64tz_dtype.pyspark.pandas.namespace.is_datetime64tz_dtype +Any** papyspark.pandas.namespace.pa Any** pqpyspark.pandas.namespace.pq diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pyspark.pandas.typedef.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pyspark.pandas.typedef.protobuf index e02de2704..cc30f9e31 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pyspark.pandas.typedef.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pyspark.pandas.typedef.protobuf @@ -81,14 +81,16 @@ $TypeAlias[Union[builtins.bool,None]]G builtins.bool" builtins.bool None"pandas._typing.Ordered*b selfX -*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype0:builtins.property` +*pandas.core.dtypes.dtypes.CategoricalDtype"*pandas.core.dtypes.dtypes.CategoricalDtype0:builtins.property` ExtensionDtype&pandas.core.dtypes.base.ExtensionDtype"builtins.object* na_value/pandas.core.dtypes.base.ExtensionDtype.na_value"" builtins.object"builtins.object*Z selfP -&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype0:builtins.property`* -kind+pandas.core.dtypes.base.ExtensionDtype.kind" -Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +&pandas.core.dtypes.base.ExtensionDtype"&pandas.core.dtypes.base.ExtensionDtype0:builtins.property`* +kind+pandas.core.dtypes.base.ExtensionDtype.kind" +Union[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal[builtins.str]]7 +Literal[builtins.str]  + builtins.str" builtins.str7 Literal[builtins.str]  builtins.str" builtins.str7 Literal[builtins.str]  @@ -160,16 +162,18 @@ Int16Dtype%pandas.core.arrays.integer.Int16Dtype"(pandas.core.arrays.integer._I Int32Dtype%pandas.core.arrays.integer.Int32Dtype"(pandas.core.arrays.integer._IntegerDtype] -Int64Dtype%pandas.core.arrays.integer.Int64Dtype"(pandas.core.arrays.integer._IntegerDtype - BooleanDtype'pandas.core.arrays.boolean.BooleanDtype"&pandas.core.dtypes.base.ExtensionDtype* +Int64Dtype%pandas.core.arrays.integer.Int64Dtype"(pandas.core.arrays.integer._IntegerDtype + BooleanDtype'pandas.core.arrays.boolean.BooleanDtype"&pandas.core.dtypes.base.ExtensionDtype* +na_value0pandas.core.arrays.boolean.BooleanDtype.na_value": +pandas._libs.missing.NAType"pandas._libs.missing.NAType*\ +selfR +'pandas.core.arrays.boolean.BooleanDtype"'pandas.core.arrays.boolean.BooleanDtype0:builtins.property`* construct_array_typeL^CCQi@K~aR5Recx0uo}UlUzuXPP*yt0C7~n z0ka(N4Dl-Epz;)DBFqGPv|OA3k#%8I5L|X;$KyI2d@#$)z`z26Y~Aj>Ba+}8Iqc~l zeY);<>-*}fy5Fn5`s(>sd$iEDoOp->#eF^Q-)OFQXJ-Tt2(Z!ptHU7 z<9`ZihbyvV!{r2DbttE-+j90(0Kq z0%QbjGlEEJ{+%FG`xYTt{pY)1AcHHpnDzxLqcYd zI9I*hQad-pGe4Kjq3$>^j{UY66b**|wT_;w2hE|!)*>QQ@_yQKAK?#w9HGu%ldNu7 zi0Pg`079od4Mn>8WAN{+jDi%*3`>9?riN!hJS$oTngHX?bc4u_LgF5#w!RlPFx1Q- zKZ7J6+YHIpVSHe@|AS@(Nu1@gI&zr~xr)MjA*#)Ff^bkIX8mQmxEV5I4cG6Ry*e&n8v_C0S2>suYvagU7dr2*?rf+D>HN}!w9ahTI`yv z(96?dL+~nr2v*xd#le^72TYy?wC!aWPB*;_qUmB8%%n|zD8XI6ipxn$4A6V}*V*m; z?av7nP6uq0B1QlfGDeC6;2V17 zb=Vxy2#8>DDK(mc{2Gu%ui>Ff5xPt2FgJ^zKqeNt6*i95T@NC-#_X*2Ozy+4VFUZ& zIC@lK-=BhyWx;EZPLDxf8KQ{)9E;Uzs!?23wn_s~qZXFYT}G73QsdFLDQwXUv|toV zeGxSdh6i=5WhctP^gx~%#+vq`EwNxJD>{ylj{W*1Y7*gTk!7Ak|H*! z>>-K%nV>Mbf-0wb>k%mId5gr+CaYaIn&I$nbLpi|aGk5`p-eOfE;A;u(tWnJpOg-2e$R_aa(C zPn<)`rT3w{8xqAMB0c69tKzT1)nn_DY0Tfz82aTYl&9LNhZ>#{2&d)fqTW0T7`3@| zLVgDMY?QtG0Xpjf%3w1tpy%UZo1o_FhC%tNI#D+wR0U*Mcav6bRn(=QhlZPq%(azf zXQ8=9sVuIuTa{9IGEswfhlccdlc0fv`+(Kc(oEINPSA){7I>GtvwV&yQ=NhR407{iu+@{uY4)FlyN*s?$g|mOo#M+|x)hpjV7I zFZ8A7y4l-izS~J^UvM-nO2!#M;l19RjKZ4|*F!DtcG(P2egTrnUWeMV z6o`l1L3y8624|;uskeJ?!{#3JFiyq~Al2pv&!`|$c4aQ+Npwx#`dkl`G z$tn0zxE(XT8fFk&)5*4(L~HcvVOfYor3OfM1mn@V1k71f;sA|K!6x`8$+L(9Sspe% z4!;KOwDoyL9QZ`{Bx3Onndtd@aS_}#@Q+FP$1G&g>3HTHGSM!HUpDYB>X|K_o{D$g z8RF~ts^5F<937O2w|c+S0Cl_-dqkgc0_FX;4{Or!{V4nO82Z#mJPgUJ3|eEjnh;gQ z&Wyu<0jzo`UJ4@KMZ~|tR%3T4PAAWG@a@NIh}6>|ZvvN=S8%hU(fBMx@?Z5#BLw?} z&@crakEDU?@dzaUAw+Au2fr||9jkDuj_&v)j(|&$2EC6KG~g#5dKbuV^Q1rz6Wx(| z=&-Jn%+4y!8Vr(H;CCkN&iMVmy+s-asY8pV3sUODBD*=2JCa#`8M3xvFLKQMInLeyZl^y8PFT z9G%y9UnJaXj=q7n>@Sh+urCqHQ_2O4yD9ew64~kPJv+k=_gpIX@YM+cJ-Ven(0wuk zB%;#}dbGhjlSP|0`*B8F!av|{w;N|ZFWk=~kd9Es=Y?4-+qrE82%JLvYHf}hv(@s1R?YI=5NRA;4aIczvEM(wCW{wz zT~eLfa!?gXp@$oAqNm=8>MtN!HEhohEa-zhMxDO>bz1Sgkk(Ei9B1#^3usiV$PdRq zNYxsd?7~rDY*5g@VS>$zELw5czhL5`$I?Mz;)A?i%we{c*gZ8q878ZxTuWS(XP63Y z6O=jTI;)F;c_0WZ=7%ep+DUS*)nay*^aIaxBv46``qS0mC+Co;pI{jZbR04M_M21@lVHi(aXrTxtqv z*+O2;`|1T@s84=;R!8$8H#PTjaTl5Q9$=BNiQ4;QLyZ3}DN z-(8si@O3~&s|PO+3-rJ|xf=>d7HumOQ@#CYydo5DKUa(pc88E_NNtQ9#TLvEYXHivt*7<}_zljoaquqs=};+|zLmjmrx{)n?q}aV zCLR;$QbC+XPngA7SS}*TYOWkc*AA0%=-~rmIbFXA~WPHdIi1{rP z{}uwD{UxVqe_4D5uz#iEsF`AO06}vVdTbDmC36**ybpFhOZ++EX_89IzJY`3!3IgE zzO_G(mQBKhMy(X`Y4vH8u8$;Ar8mLoz19~m$w&BQ?RJ_vjmAgXC2vk7O>g2=pW0pP zVqU4O?$|#O$TTz-HF_uo@VoGxlsxdso~kSHWEV@EtcxxQkaiB5O;EK`&$ZzZV(d}x z#jkIVpv@&h(2sF;sTXIv02xXjN(L$F)oL9mrj5y9yoaNH(El-hJ;~^6XT|*c{nsTD z$ziiv`E=F8Ta0vFwj}B0mf#*x#-XLC{SNT7QBo52-`=x_hNok%jg@9}cAFrDV7RV~ z+Gk5VIlMnYYh<#$lcX&u;20u)m1dV>s;jl|jBk_hG0+uTY7|~h?_ztVN-qd-L#T$( z%*0~pNzfmJra_D&6beB-h#LU=u0{B;i#+AzBUyTdqzLfS=ys;6qE8ssRT-hK)!U@Bsa3M*EoT>sevHcm{Cz>2WGwFgLqe;=jRBAEuENr= z8g$oq)vAg}z^lTEH>KN?s;lik!StIw8d9wgXgMMs);==KKo5bhn_REWomu|GgTin! zg$f{di{;Ty6G8Y@kp&FGAVim7YVZd=sxJ)t`=f5tP%74OPW1^Z%1fF_jkSJnq`?T~}GMQ;RR+^>SFm7rqL(Ci-#dFa>Rggd! zD5z$m29GbK2E$PNspyDKo^@>!ZQ~o|_50^WxT9QYjLW%N+oLx@{Zw?jls}%*pnrkO z>#k9~A!zx#bZtz>9qFx$Hq{@#3GWuQs+P{wG-?P%YC>wbm#5J`Z+H(w>wLLC46l{V zns-AXyeXl{u)J1Ijy6BF0-;|+r(3>>HM`_;1pDWpVsN_U??(ImWT_K9tgZj;cGI`0 zVZPfNQ6XoDH62>hkXhTeBR`tC`y$1gMd*G}&S#Y`$xS$FI|O-2s|Yo@0|9SigF65v zTd)HjyC{pe!3|AixH&rWynLJKy(B8k@r1(sP#tXfSaboID=EDv=C1a$jB-dRK{Iq! z<7E{)SAuRa<8>HDm!aa+XAm9LJD$V-U=^SVC=CLW_yQfb8c03O?a`1>IH+~58U!5^ zQ5H-okj-p+8Jcnp{>zUcX&!3r_sKev2v@#;XZT?04Q%B+Lo$LXgN31NN}iA|FfL{b zam9G6@QcK^05N6CU|fp24IdxF^n2IAyh_7B7_kh!-AAywS~1#x_cW#tLd&w`%)Ub% zvT)E$AA=mDlnot~!W%kahKXBSW2DU(raBF$b(M{sc{8~hgE9);1YPMSr?6o#-O11v z%ix$l8AcB2aL_0#-fGE;scfv{{p9^L0XZWo(EkmTB<#P2u4N@VEyg%br&^vxH4`gN z7A}%FSI5QVadF_!jnYX$IAEj)prul9!oJ&uAH|la^BocCZ^7*`Z%eFjg6Va{0+r(4 z+gQnHY)dh%vrwVd>j~�uPkoM@)B8(d%EJ2I1@?JXIe>0)fPcIc7`U1P(5iik`e% zNoDGEd@dEYI9S!)c&C(JL;Kaa!)n;mpt?LEJj(weT(~dctaho(yJD$8?{^@2jebc)VeLw+p>IlB;+csxFx9 z_o>wi(prWU!QMKQ#FnkaE63o25;%|HE%HXp{qg(ixRq6y&VZ)J@p#BQj&0h$I|Z13 z96!(YyooDBOCisMJU7+4Lt$tdC11mw@8Fpu@Ja&rrIL4~B5JAk@C4PMhUfU}^z^FT zvT7RaO(XfHc7X~3Pe9f8Ow@&3c%WJNhIR*@C?Dng^$}k!=ii6vEI4bh4nh_1;6Up@ zXnk8wM%6HNnmkq9z%N%Xb*vV+Pb!mP&v7{m&Ss#Y?0gz|Z)nmx8PpV1L+%E>kmz@P z*rieKDnxG%xP5i*P+_e!4gKrGevl?g&H;#FDB z?PNAF^ORKU=e3$3*I>e8OEiXnV5q*J|k+~jy>p^)- z*&$A**zb$YXKObT8D(q~V#Vt&kB{%p69Qd>;-{>&l@EoHbCZ0SpX=F^ce0u+JOJ5w z!FdgFM16fcl#PqkCuOFqLz@?Q>(f{ zb3FB7IBPLDXpcf$`9gDa)Tt&yFPf+^G%up6_i8zZve}|WGUpo8Q)ViJ-E(87%aYfT zbb(g#5)|UKD$p1UW^LGoH2Q*x8p3h=yuf4&x~N;$Mx7cS-MiXD*o{9X8?#XxJHCq$ z(`VzYYd6_!z<(3j(*0yCGBRR+me9qp|249hz56;TLP;arZ=pt)%cm}IxwN+R4tVuA zF|v)v$>TXJ9}CF>J~9kuZxai#eH*y9iX()l5giF_>v#l>@8a2{b(<)N)%F^i2gO}t zwmu#Sdp61rxNp6JP)75mR7um1Kc}EutCb?U2S8>u6R5 ze`G*Qm6Qsn*NP@x{dG9Eg>!Vxmd8PtBB$enL|;r1JG4$5i5#i=n<8f0Lr!8N|ThRJj}mA+=%|eOXU?=->xs91Wq{_7Ct5Z;@_sV zZRI<36bX58SG&K|)fg`u-73!L0MsW zT(!_Ot=8>z2lbo7b4NA*E70Yb9YE{kf$-`p#E_GiRvwIX1{Ku>2~!hQA8#V~qf1ZX z{jQ!CtAp`k$g81Ur9(99E_=)aSfeWAL0KV>; zpbS)UVEv6ab5U;c6)Vrp`8+dmE0b?6(IY1}D^ZRwQTYO{L{Pc-GunP5P3hU$>Atx> z{{o->fc;wTr8?dVXuX8gL)ZS2m5zY@n`C<|yi%_YFZ)AQs-gA$(y#iU2=*fieHpBK zu#I)q$tj4LBtwyLU~cjiuQ2-uRyrmeZ*#8^2Hk;vTY&trI3Uxt$>{Xns3-)C^OI^~$1jxxSOjUlRx0$gHl3&7~VhU{ohz<6c zkrVIE(X7tZH#PjlY~2wORUpCBxJ zQYmFA4@-r}Z13#l0pYI1dd2^D2eLLPWpKwhY++dsOL^RjW4*kHpF_(YY5V`X8+yld z*^PmS<=-jUitxK0nEixQK7XLGw@EJ5R!mda zxO?Rhs4vJ@<4DGl%lZV^k^rQ9N4~o+0Q4hh+aZr&kF1cZa9>vR?x2`2?DP-hP08&1 z4T!h4e>#L^^yOP{Atw%7^HX`Wg$;R2?h_0xW_)!)+*iN^GV*XHI1b2zi2Xd(g~5P_ zpr!Ps%Z(~Kdr%&W*n}c7oxsAA{HLY?2juHb_(CRp=cqiA*dMm&Li-m$7>C?#B3*!> z<2(oV`%rGdcweSI8ir4$LsOPgl(jycTCXa3(~5b`c{H8=M$nLTG#l`V+<;)`b8-Yy zsF(`t?=ae6r4QAy$Ii$nM7H`l*@>b3uktLI+Ky|W+oDvkS1!nF5ZifP-i+}xIsau! z#wq!$)kBr{Q}EvZjf3rjl|wVx#7C8h6Y%N+=-jRFoAz-U<3ck@1Y6c&HiDaiet)CL_UnES^v4l74dn(3T8Ps%cTew{avxK z!jsDVB8HUMba>#b@(`>3qp}cvHKrvaPQfuw@v7-4PQf_ELJ_~5d3iDU__^uUwZa!q NzfWZ4N!IJ~{{hkF03-ka diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pyspark.sql.connect.session.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pyspark.sql.connect.session.protobuf index a49ae5859..51d2a6b93 100644 --- a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pyspark.sql.connect.session.protobuf +++ b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pyspark.sql.connect.session.protobuf @@ -862,4 +862,6 @@ BUnion[builtins.bool,builtins.float,builtins.int,builtins.str,None] npnumpy * pdpandas *- papyspark.sql.connect.session.pa +Any*S +is_datetime64tz_dtype1pyspark.sql.connect.session.is_datetime64tz_dtype Any \ No newline at end of file diff --git a/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pyspark.sql.pandas._typing.protobuf b/python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf_mypy/pyspark.sql.pandas._typing.protobuf index 36c38333dbb66e65d618c11907fc14743ae87d23..1633f8824ee39ad54a2d9cb77e80f82a67be4250 100644 GIT binary patch delta 88771 zcmeG_d3+Pq*1x$klbPJ4ZMLTEWNDLhp`p8MvR5|Q7eP>{CA0x5X;ZqesP91m<*DqE z9%Nr!ScS^dL4ANAxT1g?&nFDcXAHjYS{ke8n0OH8atV;rgYFV}Csvh@md4<%EU75>zjgEK zo@tuR+Pj9SH?J6Tpf#Go`R;jQhmT*Iq3B-WE_0259o3B9*LQ8pi@q;go30D|?r{q| zX8L$b+#1E^zE6IRF1qgu&vCWSZGLC%QfjmK)WZppr(?0Iv}l~SBEP~l!UMK{)A7En zH&|cA-Usmx3MT8rhm4dbxn(8~dd$70=QCm9mZ$w~bbWwQ)%q^y^;)HJ0PZXX`VLZX( z8sYZ9$-dNNh(PKg{)-bET--`7!eC0BBQiay=XmrA1>0|{@DU@hoEHGw~UH}(rW4hao@dE zDg)%N9*%6}^pNm1r55)sq7Kl~MVr`n8nu=RG_xL{)Eb5OZ-h5DgZ-FI_|vb6j8bYi z;pi%aS2vS7B*4i{)F;>2mxw5ijOtq+pY@Fuqy2AytX3?`zNNt5P~dujiiXlW1zTN1 zy#vELB1XLLP3lerQTr$xyEPfF=A}Uxo_(6qF@Xn9S@05Gde9(F28w5@@3lpXvwGXM zVmPwiri0f%p;YXNMEnn4T(O8!)IPP{jDO)k+eZ`E5P5!p#uHRq44FxGt+@C{>TQPk zMuE3p=&cI!?xz+9AV19Fr~O^73G{UD4BI;t%x=wS;lwOkgxKjkHG44kumLj#o+8k0 zXX4?^?PxkI`6MC+x^<kzLG*rN~>-KKsLa#Jsne^R$>X z47H3#TP-Xm25rJ$J23F#58__kj5Kqnu)@js84U z96y*Ice9u}pPrk9-r~i7Jx{l0U{4o?L0t0^{dhc8CHDPdtzqL}LK#X;jH>0b+a!Tn zQs8!etH2TY`DG(LUT;}p(KsTKQzem1lWXFz?`X}n!$`Oc#$*<&^7AXoD&2kvzW#fy ziokc#^&PFExSdGYjzu-3HR)vi zTdUSvx!MbV`n7b<_D*oeX*xr^{WLw#hEB1*u6#2j{Os$(x6u12+^nIL8sTw6_I$=* z=;taabd~pU6}t-uR+f6)c|s5D+yA&;mw)LmcImSAvdg{`+z_9)S31`OGbQ9TzWt^I zm^hk?rCyLA>qg^29*?fONL%@nV3dCd3loj=#H(IJh7uM z>lkneyxK>Fi8yf}F$FIHa@mVXhpznI%f{igFfovn$_zpq7zsz2qT0&jP}<_Uk-4y0 z0tx-s*kkBC4T7T#(}uS*q}T2Q3QVa?KKd8ufA(51D0WC-9;0q76i!iGI~uk-7)2@ zDno20vpO*C*C>8=)QT?hf)Rfxx)ik}I(I0SDUoP2o%4hR?rX&~qlFn7snJ~Qn9Z!C zjaz7}D)1JUmbuHziDW0j`Y{?$gcY-?3gRHS2VPX8bTOQ&ix$OfPXS)Ouuy2Zq1kfr0HsNp?8Blrf^y)Wv|QMBk1#6G4$- zF^WGu$;?Icn`aYz?+EsO}9^pxuTK+Pi3Lx ztJtZ;GvMgQvC+>?w5?~Nr=4Ih=bmuk*YCe#@Y;YU!`IKCkv@Og6%iE$gO=DzAgg_1 zXGkPkU7MGecELV>_8A5*ZQ=KI1Rs!!sBq#0`IW}L`mqFW9H6;H!LSQorSWOVt)`NE zbG+(cyuFj;y7_J{jgL2PoG+;X=5JAwIS(&}{;I{0sB;j%BC+W&EgRKk zLWOV6FKLkdDQ(tdG`!ras2r$U7zg_KH`qCPio~(?{2b=k%YCU0=szHN!Wi0~XlD4harwz63ItCCnN7KTOm}u-azoDuB;Moo6%Fj;f)KDn2 zz%g}(hllKq4833y5e}YTZGVGpBVCp3NV!aQIKw9RA8w8|V4JW)5AW?>!`|*yG3Av_aC&*IG7DSW zVFtab7>;o81qn8}#^8&qV$kf%v}OZ~+iz>uo2_A6Gi+<#@F7cA#WmW?xCZvK#HqYc zB%b1Jfi+r~Z!U|(YhY}K*J%GA*JxMZn;pv(MzQEMCMFZD911mOm^51W$|91+=gL5c zAIuim)zD`%b1U?|hc%*QR_V5Mu@z=d)ZQYJTX+h6Qv1uxCf0##A8yi*9U`tzV~?#v zYq76Wr^!eQTI9 z$9A_*v!ScH`z80c_YK%us2iD70rzb5Y6eY*$1gG(S(V{Q(^xd{t6Jy`~cAaA)4;K<^4(E_G$K}F!h8* z4pAU~Og-O421JhUXZG$e(S(WSYKVp$e3?rt9!6me71mH!BV#tCh{P6tHzG_gVS2e5 zdf8zQ=%nuPiknqoq6rhtRS*sJIuMYxaPBCGiVg*9eW2J9R(JDQhn$KmT z13It`Rv6jsI{XVQ=4!N0P&7H21K9_;G+%aXG|Ws%)WO?ToLyW#Rq0T`cT3EDA?rKM zP?*w;>klh?I!wNf2fK;;1}aWb;vFZh44Zi}yiVP7&`;qI^LbR2`Z!hoMnI+U5ny-Uv1 zUw8pe8umA&p!KTNLIP|$L#vhfBuZ5}{yq@MIo2Mai>K%MUlc)77}UOqP>*!IhkrwX z`|8pTOp4&1R}aJV823bS=WW<3o$8AAJ-8G zM}J>_=fzj*q2G1;^S6p_x2TpnFjwaFc*x)&`!sEZB{>|Y7Pe|HzATcI!#Z z=@cO+%t*tBp{j}Tp)1@1+dFAl@%@#W&nYxp4?S!+sj-63XutHlyRbozv*C{UoYmiX zCQoRrY#ltGvw`i9%An3CvFa7QipIEuIq@d3quN+PQX&jB8Y#59FZA8Pr36(mL^|am zSwcfQ9rZNytOLIfxjW-X;K;ifehkTxKXc4X`PizgJ#_Z8yL+8(%0B5ECp)=hKwm>oG|= z;c=Hh?qGESoJ{8v*(dZtWlg2imx7sbMegx1w}Z;eNiBO2g}zBP)&%Is$Dozbu&E#4 zRknHX4&yhVrww4u<2|wg@sDJ&0nA1GAen#!_?-Vd6*CpCF=W?Snrx{R8j~&RXYjX^ zJ=>*pG&+zB|DMS=Z>(ZfID^beu;MY^#{Hs~lF^jITZ@Eb`1Ud05NwWxicN&>mod%TJm zOKXYtevj|pSn`Rlv&$|V@s-O4p`G^|;OGh2M1x7~{Lz5<3UB_%GFLHB@ljUz;0)hc zu6crLMmdasgs7cjZ(*$@l3Jl5iGVgMV^OsMEN10Mxllwq&&R;|6y-v>0Ki8c3l`1I zlHtzFzdH(8k+dLw~%KsgPqHNb+6%Kmb7A4a^O zT#O#+S^Y0%Itu1I$fm<(B%L{jmBV?oqcwc@neyiU@7SQ7r~1HLC2lSk>1mx0wyBo^ zzqH2pL)8=HFp%WZfN9ZqP*7)p7Uc7TZPDWlSo&6CENoB1jb0Dv?UA)U^4c6<&Nl@} zZH4E`H4&0xjG@FHUGR^T`j8XzB_3DVD3XR4G`$>V)rD`Np}xf4}P4I;hEsFu~B_7zdT6WRr1$L2#SNAj-$Pprci7hrSa-ruVsX@CFLKo&qQ5;x?gy zanP^9tugaj_G}KSrf$D1wN=W1;2h6XN@>nzttowph(#a-?xma zT{OSNiP`eeMI#|$P^5*IS`{H8xR+R>?x5h;9F+?lHh}9Um0T`J6J&N!-HCRk!owX@ zv*e;)opWmRg>>{}+mCoQ@}=Bu&0+HH1T(115+Yz`7pg^YNqKo3#gHW8s#f^rT+EGd zSB!VN;Z&8$0?HvOuUtbFPZg-98u@J`J981)!j*iwR#TbCJ(oV9sGWh}3Jox~; zXnTE{euV;{Pjkmlb&nYt1&x zE|q-SDhKzfCZTCDkhf2j#LlPj0~Czfud>0D`&4aU(h1rG8Zj~wbR8qR!SW=w9cYKB zMuL04Dp9713+#`uUl=edggM=#EztIms!CR1Xo~^*eW@BND-eFR`9diTvf~5ePOBni zf@hlli+amdRp}5(l@2vRA2x+I7F4I{OAOibT6peLLa~C1bkO zTk4O&H^)Tr#vCtPbv?B+UoMXYjS>?$P1mMTY%EP~0Ctrl=jSF1u~43?#242mt?Nr0gns5caP zm_5uG2_G#}2X}!a8yksxpH;We;@5^^1*sfE4uZp}4SKShgb&ti86yaX0-&08RZBLf5?wd~J2 z#3LIG+E6h!X1o+}o=1C|!OT4oArkj3F8(Cq9R)hy4#pl26#*?yqar7%@T{hobCEKg zMa3|An9+g*?GTBs5{1M_;u<*C6q+PQhKdiZTf4|R5PBp9gh7$1p&?tKsVCCN&m+2r z)NmtZR;6fQsTCr+$KU&f7R;2nO2$C{hhr?X)To+c8zY-npx^AsI~nvxrgzl;&hoefZ7C zNqDnJ6{?&RlxDJ=xaUA*8!o7G<9DBnPalu$L`S~U0xJt#78w30&ouVf2SmNfnsvL98x~dhXEJUtRrI#O!%+$Y93ir) zkzfYM(d)=hn_yg8P?29S+Ep^j4ONq^X1HftREYT9q4>S1gXjsH*z^6UA7$J8p`DM} z#I0XM{U93z5=fmwcH4>NT3+fccL&t4y6$^u$Ojk`uSwzLioH_)p&+X`xXB)iRT9eBtM&xT-ie*Q?0*INch!Qp`NF&b~MLGjMzox|BPekU`L+(e{wiXN=U&nGI| zmaj>Gt^d$?f<4Jf=TC!${|?3NIZzAJ3yNQqLipu^{yBtx2%0*5#m-5F9t zDzDzSsF4BTJt5ihufVUHGy{A!#}n#EsUkp16Klex6i(%Hwc1ij!B$5~G?7XW^`GFY zwy-GrtsHnaLMo_>>E{ik4Z3L*rl0>8^rLhx^{>y0z0m(zyA7UdstxY)Ea4 zQhds9NFOmshIC1-A^q!Z+MpZKAT7+40n#k>j`zC`c+$wv52|A)Oq>mq!`=vrQRQ4d z2J`v(Ws<`wvX_G-mn#||nfFr6)NU{Q_snjIh87TfV>L$MV+#p`9-dfs_B#RR()2EbONFi`_J|^VK1c`mmz~ zL@sc23r}x@DmXWSql0$7JOqTdb@zs6_J*5Tk{+nXx4MPFo>_(SDUz4P70Amn;havc zF!kCBHSZfp5?fbAph8VKrm3AmyQ;O6V~J!A^PuPp(vo*eoq@^}lRLq8Ut zH0&?vaVy^nlE+|Eygs>+k*obFJLDGXNC}R3y-uzOw_3!lPQkP^5Gl0UKal72xTSv} z-?q>Z@*M~@s04a6O zE0omdFE@l%pOvpUF;`GoTv`TM$BkC(Z+b%{7e)Z>_!TEskbaj}7E1|T;uWM3)J;dZ zq@bymY<|dtNoVx)Wm13PdT>`=Yg6vchl}dLZ7PMlSVM>ixbOzn)%xZ z9+FFPL|sw^P=@Rq4OxPl7l�_~L-IF~MzkQ?7xD+r}DBQ|PN0c%#B_TrMb(QDw*x zwQacs3hlWI7ECqxRQyUF@3R*Ubvjus815Q-9fbrU4mq|0QW)irvJ4 zN?d;Mk7>~P|?C}me`nz1FF@l#L}t6TRQXS(kUAHJ6D@U`UGIgEIc>5VBZBYIy-jwinCGs?Sw8B4*& zl-QNk&FIefizLiRpeqX?yA`&G<5wHE%DSRy0G!|5SIW{@Sm@8vs348d*pm1Qb~$fW zqBr_N>TzRmYfi|h)OR}SMa;7f{66IFj0+SJ6_>4yNv49jp)G2r#N4cmT$+ZJW&V^W z&hY?55YzU0CR7%&Y+EgAp! zwTKNH{}4XSa5g_*c&wi}~`(5hTfDL2Y&K3*SOR^o0F4S3Bv~BkbWY!e5aD zw4`7sNv7>z(y0UO3VU#q-CFDs7p3TSK2=|>Ihe7k5zc)Xm?vW>Apv+3LDS1&2H~+- z`D$t(*cjU~0)3ebnys--gPd#kdLfN=9*%>^cVj^|Md)9qC?tDhoC{q0R2K1rk7J*^ zzUBs6nhE*;jm^AKDsGOCjGIqOlozRs%S5yF&_Ng1=zXggdsM~5(xQ@48Qn=WKUamf z%=v^~2quSe&Z=~bCX~b6?$Ks;Livr6>({Diis>=#iN4%J$>M++d<-S-yE`h1f}c*& z*-Xv@PblD2zqmA7IG83i(qYOR+uiCDdU8C(Bb7hML~Y}7G6&{=|!|L}OG~eP z&%rQ7-jbnpzbXR1!dK1X9Mav=@ZF$k5jUKfj_|Eeb1P%4yIC8!Sy)5imV-(zdQSif zsoyZSH|vB=E#nfU#Ftk%ICl!+;aBbo>wh~eo5&4PT|J1X2FkLqh}d}-bwJE{JuZa> zb-Oq${(EFxYyBTh;PHy$V62iiz~9UiFWuLg6=qU6 z2lfnMVlTb%*w1Va(f)c|OBROBh*Ppi=!27>DvK9j-HbRD%$^bF{9P<;?ZV8IvPijyxFo>kl*;#LdrQ59kuFntaC97{2h&30 zpw3ztSHQeO;kE&xBK=N^$y8CeX{{_FSDMU6Y!i5Yk%Ymm2oJniQurYSk^{!mJ zn-R5aWGV&Qy{g|VtI9}4jROc5PcBP*NfF+|RT(1ldy)E5y^6-Tg@qLMqle8-%OxlG zByNTD1O~&0?U>jA^+itC*Kwh6P6uyj1ao6!U^TTf`a9}_-towdOv^h4*U|E`gYnki z&nRC<#V9)sPVUed8;SpL8u>#Palu(VZY>E33BCOv<@Hc;FLN8+$XxyXuPn^3X@T+{ zIix5pscs)7biE$xOtY?Y9a%2zj5o7aD`MePM@5RlFGTWuRr>|~h>01ukV1Cd%Dk1O zw@e&LgiD?;J2pCsWWJJQc}5@Cz=7mH?9(P##2){S+!~h57t`co3a9(AdWmR`qlMvE zLa`!%Vkpj1#84?P_62jC?qaM9J+Q-Vl3&1hkA5Awgc ztk#W{{X#FuS`>;uY7-9I@V5vw_cA2s#J?0u-`-&?WZq*_!)#JX(x`5;*XeikkL zZvuS}38!Te&$Wu+6@wpAtX+0ehx<e`Mo7Sjp}&6IG|91dDdvMFf^-ZF&Vk#{yoNV0|!f4W(kjTb^`HUb^r zbDK09Q?J8p1mLwCVY;6}pEZM11*R-oIAM|+ZDiw>$Gs-Rpk1*Nlx+AihIk`t?HA2cl^*8+8$~2>ZI0v#&Qm zmsqpSbRUZrIc3F^NHDdF{=>eIsUv-PWB?pKCDGN-DN-XHEzrYP|1o7X(#O-kVTgs~ zT$jrl)H#buuDp^8uLcP&Z1%6}`>(Ob(0LjJM;WFK>v#6SsclRg`YhEyM%`YLO^^5i zq}}-5l@+cLWCc)aVq$$!EC=V`<5ke{J5!@~{FCg_7sKf7DwROWg$a#w8QF%aMa3fs z_W+yHtd9tcuNF4AGz$Hoi!Mpd5y|_SCz*p2aiWC5p;zp9gFBJX9a}HH33l{l9T`_1 za=_pE8_z^t@(i3)nl1G62N@{2$xI0IXm6>J&MtP~kBFo4Cvz%vSZUTv^)C}P4>ur+ z$!nyqY=Ag|WB#dt%@%W-Y+`&!s`))G;z1g-9``u6hameLoOF>Lrw#(;5Z@B06bc3+ z#X@}z!n}7xxw~wfyO7+q9O2He|L=?;LzW+Tco z$e)b-KHkoO)leRkzRD&|dWOQ8*Y;eVh7$^L;?;oAD23M8^gErfxBA^*h07kT>ptww zRCGlfa{N=z>@;9f52|kF$?}EwwT?|_{KUgM6R1J(w+=GSyS=CRUMf8A4M@}ehx1xrSiD9Ap?&JLUJ{=FE#`TqV5 zK?1x}7a#%g#a#vmrL3Fv%{$((Q3?{`&AZCMwu5a7bC80Eop-T`aPkBj2~!J94ukWe z^&ATA^<3_sUC)tF_%y62Eb~Ige=AY~@$ZMa)Y z6h&D3UyJrfpVyjt`}9!rjk!}}rx{{?GB=ZL#kPyJJQ+6cu0_*#p>rN-3+u5Z6|FKz z|HAg^h5(F~bo5e+9}*oJM|0sox}^)+vV|##A9*a# zl1!_^*nC=eDAwQe>#+9}fSQoT-G$z(Mb`;Z{3h6FgW1m|sN^D533WeF=*x0Ydo3BX zuqaMy^p_3X`}bHDA++#L2}+109gJ|U%D~iEVqS+2H5o+3qn3$?-;_XtV2ehMgdI=D zThyc>d?Ot%x^RUj4f{L_XOYTB0z7TAN0Wmy`@5sA@W3m)342NA54UF|!6;~ls7Aq3 zOH>*ZJj5FLw;R5NmR{F!gKaFHQ2#*g23u)^2aZz>z*;4+YRvcX4scggmX&C*v#jpP z(HOEbECTeKWb4!51)n#3f%)>ovgcYOK>@9@-h0$jr!$#8Em<$&P_ zSRVQm+w=`yG&Q=xX#B&knqwOy7c;^VOH?}C_8MbE^Or!?B1;Kgu(W zw7L8Ha{rM4pG{9P(nnvV;HjgQ7PN4^E@33jwpfo*c=9D67sXp;%YOp|vnO;Fl#mqWEplV>|4dIL%Uk~;fIC^AYMF>WCks4C3U|AIb1&VNHK0$dm&(|HuUbc91SCE*Wq92KOtwO+;_6MjWo{t+mJ%AWuu6ha;`O= zPC?BSE?GKJXoZLe%sO;i4)mX(Nkchg@j9I8&zw!dH`V{FxXnLcunkri**`bH0hS;m zOmC085b+oYC=&Remv#FbAH5|Z>e;MyD44(=Vz8M)12D)AFhm`Vr>M>yje zQVBT(=b&?{`@u&$tz^yqJ|i`<;Z#nN9bfD#Ddb2(i;3RRq_f>73QyX;A6o+sTHf9oG1K7QL7Ty%Xb`(84UE)bPp$4(1$I4uP3j@e9y2 zKcrOXmmS|$UT}Hs;up{_yhy>3(eY#vIWt9SG=+ZccB*ji{nV#NF2r0zrz zwU0^=Et$4q6q;Wi=1Ze0?CYFohSqob#8A9N1Gz(x@a)r+j)8sm5>hy_ zk<&xM*OXe^w}?7GtH^dD(G^>h@oFCSW7ZJ3)jz^h7QBR)MraTx1I07d_u8VxS-ovr zF&tTM)4}VXP%8FBBK`+2u2@7Vm;he3oAECkX!~g58h{C4#(08iiy9{lGj2Er*e98rP3KG6g!4stPY&PgP$9`uceai#jW0LzM zs8cC z%Q(%ZfO}(>zXvV-bwA|mM)ym)(H>mq8gwI?$=M4OPoNv%zV5?y@KL(JF;rs{uE>fT3w)eJ;%*S)eGb}hgI+0#PAGFJ2C?D5cM{ro zv_RJvK0aY@kLI<4{$EQ>bl5C49trmBi4j8_4hBszNpDYw)xX#agAQWyen$@)ZOelU z!9hmyWQ^2EholHck6^=!be=@Q*9ecVt%^~zDnN*>pmiLf#;4CS0WyPx1CE~XZJeVW zI@U$%jtp$^bhfZD8!!L88unJ`n6JwS7eTl{@*fFAPR(cqt~3X6RU9-+jd{VQky?_U zY?9vI6#m)PArr~tb@M6A=jW4B@(|I>;fO3O%+D8&^=WtwCjCRp$}0Wk&uGoOkWV=cB|8f#ftnAi0(yhG<@OxIwO7w>q`TY8i zn0z&3Btwaqe54_x$w%Iv4*Y#`=|4o6x8F0h%u52sRA28o4)m*7w>!p8htvn_T`c zt@DNK`aXwOdDo)l`ia9|G89wdx2=p`3brmJC-L7Mg_$ym2Kzr8V^Nca@Qk^^mH%-f z+&{uF6$MfXeBYx%x5HF;^@kjOY#-7KBb=768E delta 56408 zcmeHwd0^8;_W18JpIn``xtbH?yRD5tC!sQu0-DW#zD+nP^zBkLb&=X1Sz^XAQ) zH*em1v;O);X2Hw*m<3_%+?Ng2#=T6<4b)G7771Lv#mRyfSe))+L~3}bSZag?Z$*hg za$0H#NKePizEYA*SW>nQn_!Gi3( zF;0jGVGORRy@yO!WAQ{sVWzXlA!l@A%y!Kyl?#nboD#E{C1dWqr@@k3`{WE-Ev>Wh z%b_?R*OBWiEX^n>vX8wBk`DXlmE`2m&r0%&@A`0A&5b_sa%L+$-9B)q|8@q8v-3vh zlw>(zS5IcM`-Wrk?Hkyo!J_QEB1d5{r1fVEHGdi2G5}XoGUYg(6H4;kH^rW^3Chp2 z?OaK?cVHKc3!RfPa_pIooFZUCWG$s}^d4z~g z)X22C5kpW-mjfp-dRYiRza@(!L-xzcQH}aIL?pJsI}1lZ^0O!yHg;hGM08Ay!KT|c zU{4pOJEXp#_9I*RF{x4Ln^oXnz-$cqX$9-yY>soT(u=3skUhr*feh4sgWHg@AH)&? zSG16_^~|@d=k5ZF=w*h`yS-!}d5ZZ-c=Ka~=RtA@|0t*o_dEA*ecMy!Cl~7utwp%3 z6%=$3{Pb^q)k7wxh`#TKpMgDPf^g_kDE^T9P%ELpmWlD>2+H>`m$+LRvS64X9WDMw z-WR%@5y=HBWAIK=a5gZ;-6E}+ezDttYe?1Sfnn}j8Zv6M;0T6MZwT9gai_mta3l&Z zC)NK76nj45Dw!XKT@s?0#Qf-{2K{EDpfd*f(YT>x!2scYf#8@JAA<^|#0a~QWT_iF zuC7x;{5C{fV>Wq^>k=S7!EjaeCEKnuOCOf3@W+DDIobIf$ArVQerUGjVJysXPI45w zs-92dE=uzAJr^Wwl(de8z`2@4k~#!Qf>D)$3?GknO4XS-D9c{#D9+AxWMmg{Qpi!5 zJsQsJ77ifVQdDI`@A#8#&!eGCO~%E+ELoUoGcwFJcyJloC>=`&L9rv36BWa;VeyJc zl}lDG6c2FbInw2ftH7M-S`ZpQo?4D7I->Wb5dJY*CtHmu;?BG*`qA?U4}-FWs0-*m zK^mw%A`n2yCuloZhiG~cQyQvciToUrG5$6xBdO3DZKp$|;uC2U3I7Z|l7uQ)n4)4o zgL&Px8zj2~SdgEc?{JSHAy+cNa;dqmt3T>3`-s*$rX+7Pt+f{6;ZQJA7R?NX>1Kr) z795fVGU<>yNR}pCNk>Yf+ibd=bzR##05%?q4TFeL$U?pkX3tv!KGR}Jp`*y2OQ#WT zOvm54Fg?%U_WAa_EPIh{w6oA*yY;~KQ2pzLP~}3y4TgKZ1O-0}9~3LFps*yzL5#iF zQLG;oMx%46{LcdBSnvR$d;EiapQ@kq63Yq6yoq!I%68_Fr<0ja8Oc66g-oDA3KZj* zT`)bvmP(er%*q(WYJq#U8k?O*sqw4;FN2G7tl_S!Dg~hFeg&>>$A;Eqw$U>xI=dWY z=(}Uac;xGw4DJe-=2#P9VOJ&?X3Vt?bscSOfZctW02s7SmO@T3mZ}C#L*TH*3Ox&2p80+&&2w6?>}SCK;i-%t3dhT(s64UXsm{Hmlgx z;Y>C8crVLJe#u6s53nzb(04*I?+Dw85ffIonZ+}q_9#1(e13vWWCBulb;sh2j6BDr zj0{)AaRVIsgcXxjpRfxfhy@7(1?W^f*k2XekZu!aSn{ z6pP+4b&c>1o-qOStF+%vF@i`iMwry7?l%eHMuC*QBplX=8i^1^HVQvdmm;c;b@NjO-A{`&0HS)34_xU>Q$%Sjy#X<_7Q_&V zRAdvIO@Wyu**V2jBe&&HHBLH?{n6Kqk7)aasu>)LJNC2}3e@s``|lGej{&|Wmoo|#iqacHZ^)oo2A zl#Y#7lfP?36-e??M=Z!Hbh=d}Lm*euJx$rO;g+XVu!>ESZ{t=b?o|hs!|M@-)JyG0)iHu~=FEDk{)q<}ex}jL!56Zg6`;)^HERl?#?&Dve3zhFmxB3dcoa)L54o=UFP1)XE+Rp{6n>00=C zku(F%i{!qwlBb@PUi>$|Gpv@{(R-1ke6=(c|Np8YwVR|J*R!*CF;KljW@B|fTew0Z zS(YX1C?lJOvZDo%I$t*5&w5LTf(p4h8dFu-N!P=L6X~M03lj~G*=60C190|9SrU|% z%lc3~Pfj{bktH!r1#;L8gis()H~HIjgd(t{$)7ESjXPvXWcC8t2-HM$(LbX-1iSd0 z>~DeO`!)<+zLfQ$3h=*8HgqGx17hiVSzCV+b6VD95X?+MTTqC8&&S=^l#`)w_Mj{V z{eZdu(UA16>}k?>XKWvabW3ChvoQ5jYHJ8RCTlH0H$vgbk7OyVZk9h+*wy$wLf;!N zVb1^qY5wv!qWnr$g-~rMcNLE=s-d7xk%%hQP#q>$3!hZuzY9o}L%D{5${JY-q&%RA zcg^_8^m?5vQbeYQL>m#EJr%>DcV@hvB;Am;L1f1dvX>Fs5WxpXpdgo!u?qPjmW;#l z3rh4JFQ|Ip?u?Nie}wdUQr^28T9N>}56J28x*1Gp;c>Q}QQph2onxWnF?mAT8W5A^AMja>2dc z%@UFU0gCqw?7AJrV2oFcMW1M3PQ2nTf#0dIpvaNK*$}uiT^8Z@f$0@8_s)llLu3LX+827Bfu96%Hds|1mB`KgR4v)_ zVr*zYMt`b5_0OK*@Qzk`Vw@N@6QRoCP?4pG@p1_AM{DW4nA^0jizZ={6^}CBVHZja zGZk(9{GQX*+YX_;PqZH11BH;3KcyJO@P>Uo11`~#b)cBbJKUK%Qnyl3#5>%1TIjGr zF_mvJJgJ59HxyaCfz`v}y^46h?HbM=lH&MZ0F;_BqC5!YtHoMIkg&KXOg@I=jy?6xM>r2J@z?&NEmyuyFEVP$qWWeqhWA*UZ z8HEHQzfyGMu`aF&lFv0*V4v(La?=?4eWPf>TMeF(CpnT_Z@P2$B4@<&nO-FOmC7N^ zuNo4iaTl!EKO&f6d~O=%JA)!?>t_ty%~?FbGK>aMGC ztVtDl%{uUxJg!TZgB6OW#%~I_|lp5lEZXVPH>dgkIG<&lD|=@N4vCeGfz2z zKMI4UR5?PjhDz&PC*AyYk8`f%Gvge-eoCo9r#0aJv~mo8?M82hf*F)c_=8BCRm#^G z@z*-KQJys!jx5uML*G@(Y#wWnZ&BtjxW0zm>^!hbbb9!91OJt918>?^rNuiPo*?-`149(^UxiRN0O}I}@SPIc0C3L=nFDRyh-G zw?Y38qoY~h8SNvxYpv+I26DesrtwEOa56zJpesWl00minhNpStxMz1*9wyI+2T3Go zX-`-c6VY$bj+9g9lxIjf9E^!fJ;Qt-zm^3QtSmH;Pv;#p8WLDLdu2B{;V<-nj6 z??@WT>Q1V`{;n>n=?aUgL17u>pxf(tqaC_(4OC_Z4Qx8BAk(eAmcLLZCh9^Ix7Yw9 za)K)OBP5{{m6{UAN1qLligxx)3&Au~#E99897mlTN-CG{5t_?pthEB9t`^v>2{tRt;GV;5i z^gy(^HS7?m+5qc}=h2eGYiOh*DTx;69m0fIsDZidskcU*UPys(lv5Y zs%o)!5-JqR&a(n=4p%*Zp6LlM4OcDV4_|UQOEp6+c|yyPB+u?4$)c%zk_6AAB%#2m z|F=g~`e2qSkG~f9&Cz0Ep0k)D?>7FATA~s__yQG=t6lW87TPc2lkD<$Qg8ru&F7qB zsbtR0hdqTcdRV_&73dwa@Ti>-`5US@gg&EN2wPRT{B;-%-=~@;-X4Nk>Z}A+8G5~h z7EF&LoDL=XRS^*Nma09I?&>Faq3@f`3$1Ikh^;Xduy}se%}GTmJFSS1-I}WLHYKC;3W))R#vVrp>?^8 zL+d~)%$?zNxADkL(#6586nJAtEE+@oMjeH2rNGZq_8C=FKFj}h1j=_9e+9{DCY_WHI%MhT9@ku|?lpr`2+S^w35I#g(HgSiSTG%huiHRzJlJ=2K&x7C7hM1PbeP`z~V`c?6KqAF_HiB$IrNG4d!3*Jfbl~ zN5-18t^ptUxwf4QfXX~Z*&IGdL~BuN#Aurhl9SXv#AL5_S0|t<8+_7T?K|e=pyer8 z>W+;nEY9G9aveoVNPbhRQ_}D(8Zp&y*Js9ptOX9Fp}&s83}@ze$LM0H?h+L(ZF##D zoJL;VN)xMSg=M$eK;wBFV;u|i(aJ_QGo8*Hhds~5=%a#HAROp!enuv>F*)4vcXQzE z6VaEUvP>X{+7=37KsV1L>bG9k6PypLTlvoPeRI6}Q-4&M3a2Mho~NE^yAOmZB))@R z{zCQ75_Gmbq4(FZwNj(gSzKP=kQh~9vDwuvjC%qkzx`x4> z?ip)Z2zw$-)PS{8)*t%DD*}zb3|ZxG{iCdpX>DZkB~@o4G>li_t>H8~LQX@R>MdI` zm1D73kZCWXnI2~ABbz-27Ok;8+fm~~P7phSG{NH4RPD>5@ok(*LQD(AJ~N_#!%woy zNTZzXc@x}fsi#zs!0_k>QNO*oCq>hp_4{@J7EYqBocC7+aNIx@sIM6(b5BK%oW=b(OE_974I#azi}NFh5$!w0E$!{rHhTY_JQ zJq3y|xH=$6>Iv$Urz(W7Yei%!saO~J46BISLX)oC3KCdnp@|wQoT@kmjPq<_IFuY7 zMam{?)M78m3AJyjI+DqAC@1}bnzA!VcZR(u+s%6E?XY(r8h6|l4(V}Nu4eF8Newad zoOhU?C!XGC*x-)cCN&eVpe2_Hf+lj{d^!p)==A=#u6zb%^87Z<4+#B~0*iKPe8>Q1 zII77+vI8x!fAN%z94C!&&Yt1`j!9wN`>Ov|5u5-p?Kt>6IsF zWNCd;CklGM6?cL?YeKZ}%Bgri*s0eVn+$gZFNobMX$|@|5#CSK`p&T91lULDikYJE{SLG2~- zq!1&-y{XOdeoqWKAJRsnL+xPfA?*v^gA?yG-8a#&XiFN@{-9mR1669;>Nd8;2VnP_ zko9-&0(l~XM@`m5z}2-OW)aQPqHF5RIHEZW`g{cyhr)Y~kcZefN=%#-@+UF95|JKa z`cYzXl7J=)bxVTrV?ub41mZuLlw;CqOaEk2?*gZ9G3jBqhLGz7g(M*YP9F^sd8xwi zAc*gy>8V~F$g39u(TWfUQ zx})$Q3GO4##kHwel95qJS2sbU+6uVgx_f}vP0cJ!f3{$5IujcG@ktk;R-EgM}yp^H^A{oJ%3?>^$}k; zH4tdi^Ov;916Hz=`axyWeQ&p)ksntwJ+8qI0Mkt$1)ciqRZZT`98Qx$G8-dRQ1*ac z$zP06JsGyz;95U@lwgJiw}B%^gM%TlzdrJJA(;$H73?0OSMs*2SC8YSVX!nq?>n3H z&6U0~QUZNv>*K`NbTnR_hRD)TvM_j#`V{g;P`$@X4Xn%bf$&U)egV3sgNTLtp8VAS zG|h$|F)r1=%%BgG;oW6=-wCxK?(j9ZJRA+hA12d-PD*kc5>{PZrWerDmV9Q%vk|W7 zqhuKMw%%Lw9e;h?7&qF->p$_)KK`gP7SVm|Y??#Pos>*>UC&=E?tPsx_{q{qy#e=#11 zQFI^-+RY04l0WEh{F$(14{#E*l%BDHYPvvdMVO1fD(+hz&1J}Gb9g=@TGRuhv5v*3 zsmA}@?l2zHYBV3mB09Q${Kp?-bfGt`Q2tX`Ow+Y*{+0!L@i7|BGNGi<9mzpHkQ=u0 z==XP9aj?M|lVMcAN3mE!D=T&uWf!?Ut;x7Z!_H=`(apou&tlYILl}JD%J7F_;ztJ? z{t#0H+La7v3k|;`pCFG+d^ew=-Jzg(($I%LVgHL7_JxA~A_ITtTLMgs&OOd%<`FK)O|lGqs>FX{-M=(tRwe7#di*c-IomB zIx6rdi|&7lQzb4fI{XhY|M`DSV`cK_@k}%&t|!Un%^u;={B<@Q9T0AFi(78Ltv=h7 z@0??D-}9n`hJ6b13+YtH<%}fjo(Sh#K^}tGxM~Z@TN2K9>aHQkFRpSp7YLo@L0`<3 zd}gk`dlksvu~2BuaELe_?mHILW^C%l7I5XqaNmh}BA1sL!F>jqJjm!fiG-T52k3EY zM!oHSp{WwLG~p&9_ZcmPwDi9qO=t&KX8v#R@`e^LZm!XHbX|`$5wEt;oUsm%9h$sY zY23oI$><*pT-{_WlKe=GVMP<_PmFVy$k_wvb)IWeBA0x4u&6@MCBlVDZriuRej|@c zBWFvfZ<1Se1jb%$FxfU(){lix-iS!xc)))PMU|fM(_u@*@36^h8qWA} zA4*v4EcE*D$xuPc*PDe<;W8z#x=jPQf)yUiHPK8|5vHVo*EH1aFNZraVVwpJpNsG^ z2VN-r>@bOC-wUvSp3r2cU@r-%k9x%wMG({mG7{J|G)e=}&m}6LOlT6p^*L58J-l84 z9}7$-Ha$HZWK(4$>EVtDkA{4qNqy%V;`DUg4F*31m*!XvjlPpJuCB)(hNDuM1&kt- zne-lOdO!%%0!^5l?H}JR2-CE2k6=NbJ=XzO56K5Zr+xBxFh-cvXvd)c3{7VFHPECP z(iM{(-ApA~zxp=H5$u^J9SGaPEH+OoS4DYRd31!SNAq-g0JU_~_jxLYsxhV*s2pR8 zC0(yX#0X(}j>%8R=my{@IFf>Na5%^051VpKapK?Tmhb=4&@FwN2VvQh!Ul|g65u6` zxb*ZSQxeB{78goWLVl?!h~@!)b+Rc-a1&ui17qHPEK1jvAv~Dl%fwsXsA0xj>rmMH zv@{m3PBF#7$x@S?3>#~T5i&Q(DO-H0@*ZsYMH@ngYAkA=w#$E(HMIS@49`I>=C3+f zw~7w9^eR(#h_5s~OX90cUx+*ii+gy^`G)F`&7CB_F_c)>D#qPuXoCihtg%HRFN5{Z z{A@BvFEmJ~(;94s+H(;GNUbvoX{raL&AD7FhjJ*42WS3%JsgQ4l5p~7DjqKd1f zr*yjW9@F_{pBifhm*zu7kXj|A9MR-$T9K#UJ#y+dq!D{$?jM-5)%Bdcs8<7LKhX<6 z<2l*z-fUaBBiP&YioVQGio00V$Z%|sEMypR#3-*4+(SN}c)&A14euP;tC?i<8~zRb zway>kWbP@6Pt1P(uaUatkpmg{`kR72QY=TLK&a@$kQJ|(7YWfjv0R;2X!!}B?E?0^IgAY0 zVSbFcXYDhS_-?VK);wJp(745<>qa4+4OhNmR*}jN%nl*?D4{vpOlX_mWbajVmM|b? zZUz?96C$~#i`%0psQyB?!gl8aT>rpyRt+=1HYYWGwrgzX=IZ0k&K*k4V1nQP-Ik;~ zQRa@mEhq==5i(|yUQ_~GRN6r|kM0mCK*N0qYXk>3* zv6DhN$KVb_^0J+IBj`ep=J-#SsvzlgsQ}vRqA-*#lZj#D2ztrg^XC#kX5p~A-n_b8 zD1iJO(hfrRS_qO)NIQW!G)m3RFBd>+w7O(Xr{^CIf5+QE8Q%D z0BckNj}qcS>!|m|DY{L>~W|5m(-YqH>lJXUSg7hXEEk?km>x$m+`7~a;XYZ3y`Au%q zt_M7fwpk0O1ET)|d8gzO;o#rXq$3Mt&p>5pG@sq1SQ!KP7)le=9BlBm&nF#Q7;CNu7~ARVQ->fSk||`zi3LyfaqaOZxN|b zN4FF5IFufXiY^y5wHa&c+3tA_>`IL8-t=a`qiv&G^4N-nJ7o))`cr9|)Fs{6lqPVpjD4R#R@7nb)V_ELK=^w%k@(95`^Y;;Nbd> zLr=gAKg<+Rg|j&}bdQ{fE=B0-JbLn5bTm5G9?C96o5{fo(R{kYNx!FCDYs5o@=9a( ztT|wt>Gcjj^KIQ0{*MoLm~iUk))nsa+HE8H3)b2ma}c zF??F4Yd6K5XV?vE7`V1MhVIE+iQx*JdF-+^r($}DfzG!Ng8V_*I&`8Foc%PWHKT@t zIz?iWwaekqJ2Rd~U5QZq+Dg#+&Rn}&A)nL)$m`$6^pdcfA7`La8Jj|#&EmL13r#a9 zNgO=}vryKD#iT4C)*wQ=6WotdNNzeO@)?ERcW3NUgjTlopyHLfz~|tQAB>$N zM6V8o!?hf#UTeV>d?+HzL$-Y;H(IVQuJEXU5aqSlkwSE|1#Dm}bOHH62v@Mc6LL9^ z!{FH+mMiFx8?=Kz&Zkf>3sPV$-D&S=iDPvq;cS7l%=2!|VZlGJP)>K>kigO80 zt3ct9@Rc+Sv@%8X;t-j@bz;By*@r|6;9HquAWbwyss~dUD*pl16OX!t-T5VxLJw4t zMZ1pekD=eiL96S+G479psgE#q?-Y-A=9J{-75(zV7I%E;3hm_ij#Q7gC>fZ#Sl)+p z3%4XPlC24isKauE`~`WEl4HyH8}ffF@&wM+ zBsP%8%=oW+igNv!?3|oDyE~1d!c*4O^||9V^vbm;_@kM0IX!Cm*79$Gg;c$5`B>tu zsfjyS88SYy1V}FkuqfA2JkFU#ht(;NA2m-USL=e#F|f0HxF5MN$I>3*e~!ANg?^rf zn|wvj`0tWv&L&GogkAPuC6P}q2>!eDqAV52kY!imRSa7(3qh4QjthVp$rXGjF+ng1 z!JHdGp(8)XKAJPVtPa7`fH{ct@YprWMK4Dnp)P?7{n5eRT&sEXTKNy4{h%NGqewl7 z4E#X4n1RP);xf?b`p)x7ZvW4agqti#r7-SiMv(GPx^<#>D2{5*U(j@G55=|OZ#Hme zm45xvxMYOhqw3N_alVt9wjtp)9o+{D!1uBdZL0uGgN|175kpRxl zp=5o>4AtG@)#mxL%LF+aLt({CmUI%6U~8n=l- zo9p|7HaLsFwi3ZV;u1vYpvgnc^v~jW3_zBj7T+f1F)=;{6-tQ_b|cABH|;nwof6`= zA>tad$md6j!J!D+jS<8j5*46_V%_O^!|FCPxQ!hKgDg3qv|9N@FHn^K97W5 zq>T>?K>Ip#zfq!U=KM{oHcjbVW@Cf&V{_&M6v_8y35q_-(M3oc27ojI& zn+5od$?;(l;Y+EQu9vSfKOjcplALjcRmTAlw8()h)QX z;(TTMq7jlDSrQpm_gto%8os%eA+JchwHQXaS&4XZLy*kqCL7>Kz>H7X_Fn4oKv&Wo z$n4AU@l+w34Oo(3L+@z8Uy_hOkE=P8VD&`vdw}C0Nl~Bjjc# zSfTCUgt6X}j_ew4H3`r`0|&H%2Y6SGTl=u+i%t-cpFmglHS~0y{Deu~1BR>5S)*LL zGvzQsYirBJ@mIpg5L*nqG|#F=GtFEzR``Bu0v{oPK6Q}e&h1tQTHYDXEKi^d%fA`9 z!b0x}THo{U7&v(GF#eTqL+-^e;d>at>btA?%~x#1`p5{DyxGB zpl*!)R(Hl?de*A55GsC%Fv@5lBSW{=*!U*Alxof8p+a{n{0V(<9UGXA^-J3 z@bc@Sty$f5Emvp*5!dxRK=;fg9m}Pc9*fY)8ZJUqUehZc9xn6Kgz9l$lp+Rumx(QQv@GdwSV1Im&N5S!ADt!EqjZWLwW4MA9zV2#!mA|DU znUHSFLWJ%wsTra_DL=7i3N&&ji35?@yW+KkAX+&s!3U~E8;_LYI z-JuKV2?!lt2|K3STBEO0Vdr#POSrIE&Z9Fp`FxJ8Mvq=f^8n{})0+c6ME?YJ#izeS l`b(m}Wco{?zZUe@lKxuJUu*hnLw^s@Ut3alqTMT*{|BpBAGrVk diff --git a/python-frontend/typeshed_serializer/checksums/importer.checksum b/python-frontend/typeshed_serializer/checksums/importer.checksum index 4d680d8f5..baf0df5e4 100644 --- a/python-frontend/typeshed_serializer/checksums/importer.checksum +++ b/python-frontend/typeshed_serializer/checksums/importer.checksum @@ -1,2 +1,2 @@ fd77cbe2295d8908b6b4fa54a1ae7d257084790de28f164bd67e4c22e8cd5149 -9c0741d2e7af56b666d4505c0f64a8c25888d84e62a98f508f9147db79f306b3 \ No newline at end of file +0bb14b48f2d4349448edf18d406fbc4d5ff4c0c3fcdf6095cae8e5f7729cf5ab \ No newline at end of file diff --git a/python-frontend/typeshed_serializer/requirements.txt b/python-frontend/typeshed_serializer/requirements.txt index c13551d19..0acb0c9d1 100644 --- a/python-frontend/typeshed_serializer/requirements.txt +++ b/python-frontend/typeshed_serializer/requirements.txt @@ -33,8 +33,8 @@ kazoo==2.9.0 MarkupSafe==2.1.2 maxminddb==2.3.0 orjson==3.8.12 -pandas==2.1.1 -pandas-stubs==2.0.3.230814 +pandas==2.2.3 +pandas-stubs==2.2.2.240807 pathlib==1.0.1 PyJWT==2.7.0 PyYAML==6.0.1 diff --git a/python-frontend/typeshed_serializer/serializer_sources.checksum b/python-frontend/typeshed_serializer/serializer_sources.checksum index d3f9d5703..ed233a903 100644 --- a/python-frontend/typeshed_serializer/serializer_sources.checksum +++ b/python-frontend/typeshed_serializer/serializer_sources.checksum @@ -1 +1 @@ -161bca1cd08946d58465c4232c7d43adec538b6fde516fef8f1c08de7b8ccc9b \ No newline at end of file +d6efb772028a4dbf9e8c5fd2ef498d286a56750dee3c84231fefd0789a7c50bd \ No newline at end of file diff --git a/python-frontend/typeshed_serializer/tox.ini b/python-frontend/typeshed_serializer/tox.ini index 0550d9818..1bfc1823a 100644 --- a/python-frontend/typeshed_serializer/tox.ini +++ b/python-frontend/typeshed_serializer/tox.ini @@ -7,12 +7,17 @@ deps = -rrequirements.txt commands = python -m pytest --cov=serializer --cov=runners --cov-report xml:cov.xml --ignore=resources --cov-branch {posargs:tests/} [testenv:serialize] +# pandas-stubs 2.2.3+ requires Python 3.10; the serializer env is 3.9. +commands_pre = + python -m pip install pandas-stubs==2.2.3.241009 --ignore-requires-python commands = python -m utils.folder_manager python -m serializer.typeshed_serializer commands_post = python -c "from runners import tox_runner; tox_runner.update_all_checksums()" [testenv:selective-serialize] +commands_pre = + python -m pip install pandas-stubs==2.2.3.241009 --ignore-requires-python commands = python -m utils.folder_manager {posargs} python -m serializer.typeshed_serializer {posargs} From bc7197219001ec84b7ed59d8ea44ceede9c3b1e0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 21 Aug 2026 15:13:21 +0200 Subject: [PATCH 322/322] Update SonarSource/sonar-python monorepo to v5.30.0.36259 Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> GitOrigin-RevId: 498ac2a87b028a8de8a4bb985fda8fc0e253361d --- docs/python-custom-rules-example/pom.xml | 2 +- its/commons/pom.xml | 2 +- its/plugin/it-python-plugin-test/pom.xml | 2 +- its/plugin/pom.xml | 2 +- its/plugin/python-custom-rules-plugin/pom.xml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/python-custom-rules-example/pom.xml b/docs/python-custom-rules-example/pom.xml index 6ddb49d5c..ecf69487f 100644 --- a/docs/python-custom-rules-example/pom.xml +++ b/docs/python-custom-rules-example/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python docs - 5.30-SNAPSHOT + 5.30.0.36259 python-custom-rules-example diff --git a/its/commons/pom.xml b/its/commons/pom.xml index 41a6cff00..997218743 100644 --- a/its/commons/pom.xml +++ b/its/commons/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python python-its - 5.30-SNAPSHOT + 5.30.0.36259 Python :: ITs :: Commons diff --git a/its/plugin/it-python-plugin-test/pom.xml b/its/plugin/it-python-plugin-test/pom.xml index 885888d19..87da778e3 100644 --- a/its/plugin/it-python-plugin-test/pom.xml +++ b/its/plugin/it-python-plugin-test/pom.xml @@ -7,7 +7,7 @@ it-python-plugin org.sonarsource.python - 5.30-SNAPSHOT + 5.30.0.36259 it-python-plugin-test diff --git a/its/plugin/pom.xml b/its/plugin/pom.xml index 09e4e911d..44090d706 100644 --- a/its/plugin/pom.xml +++ b/its/plugin/pom.xml @@ -5,7 +5,7 @@ org.sonarsource.python python-its - 5.30-SNAPSHOT + 5.30.0.36259 diff --git a/its/plugin/python-custom-rules-plugin/pom.xml b/its/plugin/python-custom-rules-plugin/pom.xml index 08d7ee5fd..e9b8d223c 100644 --- a/its/plugin/python-custom-rules-plugin/pom.xml +++ b/its/plugin/python-custom-rules-plugin/pom.xml @@ -6,7 +6,7 @@ org.sonarsource.python it-python-plugin - 5.30-SNAPSHOT + 5.30.0.36259 python-custom-rules-plugin